просто по видео сделал выводы
Вид для печати
Интересно, а можно как-нито скомпенсировать индивидуальный цветовой фон в каждом отдельном случае?
Например в моем убавить красного и добавить синего с зеленым, чтобы итоговая цветопередача была правильной.
попробуешь напиши, очень хочу посмотреть, а динамические сцены без опозданий?
Доброго времени суток! Решил сделать подсветку на 42 канала, используя 74HC595 и ULN2004. Развел платку, запаял, прошил, вроде как работает, светодиоды загораются, но не так как надо. не загорается красный из 3 зоны, зелёный из 5 зоны, красный из 10 зоны, зелёный из 12 зоны, а синего из 7 зоны и синего из 14 зоны вообще нету. То есть походу не правильная отправка потока в SPI. Код который заливаю в мегу написанный в ArduinoIDE:
Помогите пожалуйста разобраться с этой ситуацией.Код:#define TCNT2_Const 247
#define BrightnessSize 42//число каналов
unsigned long blank=0; //таймер простоя
unsigned long Max_Blank=65000;
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())
{
if (Serial.read() == 255) //проверка прификса
{
for (int i = 0; i < BrightnessSize; i++)
{
for (;(Serial.available()==0)&&(blank<=Max_Blank);blank++);
if (Serial.available())
{
Brightness[i] = Serial.read(); // прочитать данные о цветах из порта в массив
blank=0;
}
}
}
} else
{
if(blank>Max_Blank)
{
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, обращение к ней - всегда обращение в память. Поэтому создаем локальную копию, она бeдет храниться в регистре.
TCNT2 = TCNT2_Const;
uint8_t byte_shift;
uint8_t * CBright;
CBright = (uint8_t *)&Brightness[0];
uint8_t j=0;
for (j=6;j>0;j--)
{
byte_shift = 0;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
SPDR = byte_shift; //отправляем в шину SPI
}
PORTB |= (1<<PIN2); //формируем положительный импульс защелки
PWM_Counter++;
while(!(SPSR & (1<<SPIF))); // Ожидание завершения передачи данных
PORTB &= ~(1<<PIN2);
}
P.S. софт использую Ambilight - 2011 - Eraser Soft c.1.1.11 и Лайтпак 5.8.6-1
Ну я бы стал проверять так:
1. Сделал так, чтобы все светодиоды горели -
после блоков
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
прописать
SPDR=255;
вместо
SPDR = byte_shift;
Затем взять вольтметр и посмотреть что творится на выводах 595-х. Что-то мне подсказывает, что у тебя проблема скорее в разводке (которую, возможно, получится программно исправить).
У тебя не работает по светодиоду в 3-5-7-10-12-14 зонах.
Если считать, что не работает каждый 7-й вывод, то так и будет.
Когда поменял SPDR = byte_shift на SPDR=255 на всех выходах 595-х по 4,82 вольта. А когда проге выставляю в настройках подсветка и цвет белый, перед этим естественно прошивку вернул как было, то на выводах 595-х с 1 по 6 и 15-ый есть напряжение 4,67 а на 7-ом выводе каждой 595-ой напряжение 0,7. То есть ты прав не работает каждый 7-й вывод.
А вследствии чего так происходит??? данные не смещаются на один бит влево???
попробуй в последнем блоке
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
убрать последнюю строку
ps. я правильно понял, что при byte_shift = 255 все светится?
да правильно понял, при SPDR = 255 под напряжением все выводы, при удалении строчки byte_shift = byte_shift<<1 в последнем блоке, происходит то что отсутствие напряжение с 7 переходит на 6 вывод, то есть на 7 выводе раньше не было теперь появилось напряжение, а на 6 раньше было а щаст нету