Нет.
Да.
Нужна , только руки кривые, самому не осилить
Интересно, а можно как-нито скомпенсировать индивидуальный цветовой фон в каждом отдельном случае?
Например в моем убавить красного и добавить синего с зеленым, чтобы итоговая цветопередача была правильной.
попробуешь напиши, очень хочу посмотреть, а динамические сцены без опозданий?
Доброго времени суток! Решил сделать подсветку на 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 раньше было а щаст нету
Последний раз редактировалось Tarko; 05.04.2012 в 23:32.
Эту тему просматривают: 13 (пользователей: 0 , гостей: 13)