Вложений: 2
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);
}
схема
Вложение 10521
Распределение зон
Вложение 10520
Re: Фоновая подсветка телевизора Ambilight
[QUOTE=Chip;74534]Огромное спасибо за помощь 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);
}
В моем повторении данного кода не загораются 3 светодиода, которые висят на Q2 каждого 74hc595. В чем может быть проблема?
Re: Фоновая подсветка телевизора Ambilight
Re: Фоновая подсветка телевизора Ambilight
Tarko, проверь плз, остальные по отдельности загораются и гаснут корректно?
Re: Фоновая подсветка телевизора Ambilight
SBorovkov, еще одну штуку заметил, делаю что бы все загорелись красные, ну тупо заливаю экран в паинте красным цветом, и все зоны располагаются на красном, то сначала светодиоды горят как и положено красным, но через некоторое время загораются синие, во как, а так в остальном вроде нормально, но по крайней мере еще не заметил
Re: Фоновая подсветка телевизора Ambilight
попробуй в начале обработчика прерывания поставить
sei();
и сообщи о результате.
Re: Фоновая подсветка телевизора Ambilight
Tarko, уточни, синие вместо красных или вместе с красными?
Re: Фоновая подсветка телевизора Ambilight
Нужно ли ставить на выходах ключи?
Re: Фоновая подсветка телевизора Ambilight
Цитата:
Сообщение от
SBorovkov
Tarko, уточни, синие вместо красных или вместе с красными?
именно синие вместо красных.
попробывал дописать sei(); в обработчик, ни чего хорошего не вышло, стало мерцание и загорались не те светодиоды что надо.
Re: Фоновая подсветка телевизора Ambilight
мерцаниепри добавлении - вполне нормально. Но не те светодиоды загораться по идее не должны бы. Подумаю вечерком.