Результаты опроса: Нужна ли вам такая функция на телевизоре?

Голосовавшие
191. Вы ещё не голосовали в этом опросе
  • Нет.

    28 14.66%
  • Да.

    129 67.54%
  • Нужна , только руки кривые, самому не осилить

    34 17.80%
Показано с 1 по 10 из 921

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    56
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: Фоновая подсветка телевизора Ambilight

    Огромное спасибо за помощь SBorovkov
    PHP код:
    #define TCNT2_Const 250 //256-9
    #define BrightnessSize 24 //число каналов

    unsigned long blank=0; //таймер простоя 

    uint8_t volatile PWM_Counter=0;
    uint8_t Brightness[BrightnessSize];

    void setup()  
    { 
              
    pinMode(10, OUTPUT);   //SS SPI вывод для управления защелкой
            
    pinMode(11, OUTPUT);    // SPI DATA
            
    pinMode(13, OUTPUT);   // SPI Clock
            
    digitalWrite(10,LOW);
            
    digitalWrite(11,LOW);
            
    digitalWrite(13,LOW);
            
    SPSR = (1<<SPI2X);       // SPI set clock rate fck/2
            
    SPCR = (1<<SPE)|(1<<MSTR); // Enable SPI, Master
            
        
    for (int i=0;i<BrightnessSize;i++) //обнулить массив
        
    {
            
    Brightness[i]=0;
        }

            
    Serial.begin(115200);

        
    TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2  
        
    TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика 
        
    TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика 
        
    TCCR2B |= (1<<CS22); //установка предделителя 64
        
    ASSR &= ~(1<<AS2);  //Выбор источника синхронизации таймера если AS2=0 от системного генератора 
        
    TCNT2 = TCNT2_Const; //  16000000/256/100/64=8 tcnt2=256-8=248.     
        
    TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
        
    sei(); 
    } 

    void loop()  
    { 
      if (
    Serial.available() > BrightnessSize)  
      {  
          if (
    Serial.read() == 255)  //проверка прификса       
            
    {
                for (
    int i = 0; i < BrightnessSize; i++)  
                 {                 
                   
    Brightness[i] = Serial.read();  // прочитать данные о цветах из порта в массив 
                 
    }         
                 
    blank=0; 
            } 
      } else {  
               if(
    blank>100000) { blank=0; for (byte i = 0; i < BrightnessSize; i++)  Brightness[i] = 15;}  
              
    blank++;  
             }   
    }

    SIGNAL(TIMER2_OVF_vect)
    { 
    uint8_t PWM_Counter_v=PWM_Counter; // поскольку PWM_Counter объявлена как valotile, обращение к ней - всегда обращение в память. Поэтому создаем локальную копию, она будет храниться в регистре.
    TCNT2 = TCNT2_Const; 
    uint8_t i = 0; 

    uint8_t byte_shift;
    uint8_t nbit; // делаем переменную для хранения сдвинутого бита, чтобы у компилятора не возникало желания каждый раз в цикле сдвигать 1 на bt бит влево

    byte_shift = 0;
    for (
    uint8_t bt=0; bt<8; bt++) 
      { 
        if(
    Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
         
    i++; 
         
    byte_shift = byte_shift<<1;
      }
    SPDR = byte_shift; //отправляем в шину SPI 
    //**************************************
    byte_shift = 0;
    for (
    uint8_t bt=0; bt<8; bt++) 
      { 
        if(
    Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
         
    i++; 
         
    byte_shift = byte_shift<<1;
      }
    SPDR = byte_shift; //отправляем в шину SPI 
    //**************************************
    byte_shift = 0;
    for (
    uint8_t bt=0; bt<8; bt++) 
      { 
        if(
    Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
         
    i++; 
         
    byte_shift = byte_shift<<1;
      }
    SPDR = byte_shift; //отправляем в шину SPI 

        
    PORTB |= (1<<PIN2); //формируем положительный импульс защелки
            
    PWM_Counter++;
            while(!(
    SPSR & (1<<SPIF)));   // Ожидание завершения передачи данных
        
    PORTB &= ~(1<<PIN2);
    } 
    схема
    Нажмите на изображение для увеличения. 

Название:	24.jpg 
Просмотров:	2081 
Размер:	74.1 Кб 
ID:	10521

    Распределение зон
    Нажмите на изображение для увеличения. 

Название:	ardulight_14.png 
Просмотров:	1332 
Размер:	6.5 Кб 
ID:	10520
    Последний раз редактировалось Chip; 17.12.2010 в 02:18.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 4 (пользователей: 0 , гостей: 4)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •