Есть матрица 8х8, одноцветная. Выглядит так:
Всего, соответственно, 16 выходов: 8 на столбцы и 8 на строки.
Проблема номер один – понять какой контакт чем управляет. Хотелось бы, что бы один ряд из 8 контактов был столбцами, а другой – строками. Но это не так. Контакты, мягко говоря, стоят, как попало.
После того, как определили, какой контакт за что отвечает, через резюки в минимум 20 Ом (а лучше больше и посчитать так, чтобы ток не было более 100 мА) подключаем на входы двух шифтиков 74HC595. (я резюки не ставил, так как шифты реально боле 80мА выдать не могут, но это НЕПРАВИЛЬНО и годится только чтобы на коленках демку собрать).
595-е шифты – особенно приятные, так как у них есть отдельно регистр загрузки и отдельно буфер выдачи. Поэтому, когда идет загрузка нового байта, предыдущий продолжает выводиться, а после загрузки, одним импульсом, новый байт перегружается из шифта в буфер вывода. И скорость у него до 50МГц, что ни с одной AVR и не светит.
Как подключать (нулевой бит шифта к самой левой колонке или к самой правой или к самому верхнему ряду или к самому нижнему) – дело хозяйское. Потов в программе просто придется порядок загрузки в шифт поменять.
Итак, по схеме.
Выводы шифтов одного шифта – на колонки. Выводы другого – на строки.
Перепутаете полюсность – будет все в инверсии.
OE (он же G) с шифта для СТРОК кидаем на PD6
OE (он же G) с шифта для КОЛОНОК кидаем на GND (всегда активно)
SCRL (clear) обоих – кидаем на Vcc
SI (serial input) обоих – кидаем на PD1
RCK (latch output, storage register clock input) СРОК – на PD2
RCK (latch output, storage register clock input) КОЛОНОК– на PD4
SCK (shift register clock input) обоих - PD3
Т.е. все у всех шифтов висит на одних и тех же ногах МК, кроме G (он же OE).
Подключаем Vcc и GND для шифтов.
В собранном состоянии так выходит:
[открывается по нажатию в полном размере]
Компилим и заливаем прошивку. 74h595.c
Должно получиться что-то вроде такого:
Данная прошивка позволяет задавать 16 уровней (4 бита) на 1 пиксель. В ней есть несколько хитростей, чтобы все было быстрее на С. Но если ее переписать на ассемблере, то можно цикл вывода сделать еще раза в 2 быстрее (из-за того, что в C нет команды roll для байта, а есть только shift, а тут был бы очень нужен именно roll).
В замедленных кадрах прорисовка идет так:
Замер быстродействия на 12Мгц показал, что отрисовка идет со скоростью 600 кадров в секунду. Соответственно, если ускорить еще в 2 раза (или ассемблером или разгоном чипа на 24Мгц), то будет около 1200 кадров в сек. В практическом смысле это означает, что если в матрице будут RGB светодиоды, то скорость будет в 3 раза меньше (400 кадров в сек), и далее если кубиков 8х8 будет 4, то будет 100 кадров в сек., и меньше этого делать уже не стоит, так как будет видно моргание при определенных обстоятельствах. Если сделать на ассемблере и разогнать на 24Мгц, то можно сделать до 8 RGB кубиков 8х8 (т.е. экран 64х16).
www.airex.biz
Заранее благодарен .
retukov@yandex.ru
Компилятор бесплатный, качайте на www.ateml.com: AVR Studio 4 + gcc копилятор к нему по имени WinAVR