принцип динамической индикации
- Войдите на сайт для отправки комментариев
Втр, 24/01/2012 - 12:35
Сел писать программу под атмегу + 8 штук 74hc595 и не могу вдуплить алгоритм.
Вот что накидал, но это неправильно:
//переменные состояния сдвиговых регистров
byte anode_1 = B00000000; //переменная для регистра 1
byte anode_2 = B00000000; //переменная для регистра 2
byte cathode_3 = B00000000; //переменная для регистра 3
byte cathode_4 = B00000000; //переменная для регистра 4
byte cathode_5 = B00000000; //переменная для регистра 5
byte cathode_6 = B00000000; //переменная для регистра 6
byte cathode_7 = B00000000; //переменная для регистра 7
byte cathode_8 = B00000000; //переменная для регистра 8
for (byte x=0; x < _ROWS; x++) { //цикл по строкам
for (byte y=0; y < _COLUMNS; y++) { //цикл по столбцам
if (data[x][y] != 0) {//если элемент массива "включен"
//задаем аноды
if (x < 8) //определяем какой регистр анодов использовать
anode_1 |= (1<<x);
else
anode_2 |= (1<<x-8);
//задаем катоды
if (y < 8)
cathode_3 |= (1<<x);
else if (y >= 8 && y < 16)
cathode_4 |= (1<<x-8);
else if (y >= 16 && y < 24)
cathode_5 |= (1<<x-16);
else if (y >= 24 && y < 32)
cathode_6 |= (1<<x-24);
else if (y >= 32 && y < 40)
cathode_7 |= (1<<x-32);
else if (y >= 40 && y < 48)
cathode_8 |= (1<<x-40);
}
}
}
PORTB=|= (1<<0); //ставим LATCH pin_8 HIGH
//shiftOut
shiftOut2(cathode_8);
shiftOut2(cathode_7);
shiftOut2(cathode_6);
shiftOut2(cathode_5);
shiftOut2(cathode_4);
shiftOut2(cathode_3);
shiftOut2(anode_2);
shiftOut2(anode_1);
PORTB=|= (1<<0); //ставим LATCH pin_8 LOW
}
void shiftOut2(byte _byte) {
for (byte i=0; i<8; i++) { //цикл по байту
if (_byte & (1<<i)) { //если бит 1
PORTB |= (1<<3); } //ставим DATA pin_11 HIGH
else { //если бит 0
PORTB &= ~(1<<3); } //ставим DATA pin_11 LOW
PORTB |= (1<<4); //ставим CLOCK pin_12 HIGH
PORTB &= ~(1<<4); //ставим CLOCK pin_12 LOW
}
}
Когда говорят "частота развертки 500гц", имеют ввиду что ОДИН из множества светодиодов горит (в порядке очереди) 500 раз в секунду, то есть все светодиоды выстраиваются в очередь и зажигаются по одному в каждом цикле таймера, или за один вызов таймера должен протететь цикл по всем светодиодам и потрогать их?
Если последнее - то почему в примераз задержку не рисуют?
Дайте в опщем простой примерчик, разберем вместе подетально?
В коде указанном выше проблема в том что процедуры shiftOut нужно вызывать внутри циклов, зажигая конкретный светодиод, а не формируя полную карту в 6 байтах. Так они все сцкнх будут гореть.
Так будет правильно? Внутри всех циклов:
1) обнуляем все биты регистров
2) если в текущей позиции светодиод горит, составляем содержимое этих битов для отсылки в регистры, при этом "горит" только этот элемент (определяем катод и анод)
//процедура динамической индикации void timer2() { for (byte x=0; x < _ROWS; x++) { //цикл по строкам for (byte y=0; y < _COLUMNS; y++) { //цикл по столбцам //переменные состояния сдвиговых регистров byte anode_1 = B00000000; //переменная для регистра 1 byte anode_2 = B00000000; //переменная для регистра 2 byte cathode_3 = B00000000; //переменная для регистра 3 byte cathode_4 = B00000000; //переменная для регистра 4 byte cathode_5 = B00000000; //переменная для регистра 5 byte cathode_6 = B00000000; //переменная для регистра 6 byte cathode_7 = B00000000; //переменная для регистра 7 byte cathode_8 = B00000000; //переменная для регистра 8 if (data[x][y] != 0) {//если элемент массива "включен" //задаем аноды if (x < 8) //определяем какой регистр анодов использовать anode_1 |= (1<<x); else anode_2 |= (1<<x-8); //задаем катоды if (y < 8) cathode_3 |= (1<<x); else if (y >= 8 && y < 16) cathode_4 |= (1<<x-8); else if (y >= 16 && y < 24) cathode_5 |= (1<<x-16); else if (y >= 24 && y < 32) cathode_6 |= (1<<x-24); else if (y >= 32 && y < 40) cathode_7 |= (1<<x-32); else if (y >= 40 && y < 48) cathode_8 |= (1<<x-40); } PORTB=|= (1<<0); //ставим LATCH pin_8 HIGH //зажигаем shiftOut2(cathode_8); shiftOut2(cathode_7); shiftOut2(cathode_6); shiftOut2(cathode_5); shiftOut2(cathode_4); shiftOut2(cathode_3); shiftOut2(anode_2); shiftOut2(anode_1); PORTB=|= (1<<0); //ставим LATCH pin_8 LOW } } }вопрос: нужна ли задержка горения? умпеет ли МК обработать эти два цикла и вывод в регистры 500 раз в секунду?
Может, нужно пойти другим путем - завести глобальные переменные, текущая позиция в массиве, увеличивать их по мере нужды и обнулять, то есть добиться того что при вызове таймера обработается только один цикл (и один светодиод) - короче загорится следующий в очереди?
В общем то, натаскался я прилично. Вопрос решил, но.. низка яркость. У меня 16 строк, скважность 16 к одному - низкая. Хреново, через пару недель выставка в марселе.. блеать..
Немного помогает ликвидация резисторов с ленты. Как еще можно увеличить ток на светодиоды? Напряжение же тут как я понимаю не при чем..
Пока без таймера, ибо нах он нужен
Код впечатляющий. Я только не пойму это подключается 500 поштучных светодиодов или какая-то светодиодная панель? или это продолжение темы про подсветку макета, кстати, очень интересная тема. Зачитываюсь. :)
да, в продолжение.. или в окончание..
Светодиоды - липкие ленты, по три RGB диода в каждой (секции). Логически выглядит как один светодиод.. Секций может быть несколько объединено в одну, но суть не меняется - на схеме один светодиод..
Таких секций больше 250.
Впечатляющего в коде мало. Слабо горят сцуко, что же делать... повесится чтоли.. что ж я раньше то не почитал про скважность?
Немного помогает ликвидация резисторов с ленты. Как еще можно увеличить ток на светодиоды? Напряжение же тут как я понимаю не при чем..
Думаю придётся на каждый выход микросхемы ставить по транзисторному ключу и в зависимости от мощьности транзистора управлять нагрузкой более чем может позволить себе микросхема 74hc595. Да, на каждую микросхему нужно 8 транзисторов. 5 микросхем. Ну думаю как-то так возможно...
Да ключи то стоят, хоть 100 вольт 5 ампер гони. Мосфеты.
Вольтаж поднял до 18в, резисторы десантировал. Поприятнее но думаю еще придется.
Косяк в том что пока софт без таймера. А без таймера в момент например Serial.read может чутка программый шим подзависнуть, и попрут все вольты через мосфет на светодиод, а ему и резистора то даже не дали, прикрыться то..
8 микросхем кстати. Думаете отчего я шифтаут и латч так жестко дергаю?)
24 вольта ей в задницу, резисторы нелльзя снимать - можно парралелить уменьшим до 50-60 ом, но и все..
В поисках БП в общем.
Электролиты на мосфетах решили проблему с яркостью. Одну ногу на выход мосфета, вторую на питание (плюс или минус - зависит от мосфета, P или N)
Электролиты в задницу - из за них горят другие светодиоды )))
24 вольта и не снимая резисторов с лент - работает вполне.
интересная ветка, мне тоже предстоит подобный проект.