Чтобы понять, что такое динамическая индикация, и для чего она нужна, нужно рассмотреть для примера промышленный индикатор GNM-7881AUE.
В матрице GNM-7881AUE 64 красных светодиода. Если выводить из матрицы контакты всех светодиодов для управления каждым по отдельности, то понадобится как минимум 65 внешних контактов на корпусе матрицы, а также микроконтроллер с 64 портами вывода. Несомненно, это технологически реализовать очень трудно (и нецелесообразно). Поэтому на заводе светодиоды объединили в 8 групп по строкам и столбцам, и соединили их в матрицу следующим образом:
При такой схеме подключения внешних контактов матрицы и портов микроконтроллера потребуется существенно меньше - только 16. Чтобы зажечь, например, сетодиод в левом верхнем углу, нужно на контакт 13 матрицы подать плюс, а на контакт 9 минус. Для этого можно использовать, например, порты вывода микроконтроллера ATmega16 или ATmega32 и резистор:
Светодиод слева вверху зажжется, если микроконтроллер на порт PA0 выставит лог. 1 (+5 вольт), а на PB3 лог. 0 (0 вольт). Такое управление светодиодами, когда логические сигналы во время отображения какого-то изображения не меняются, называется статическим. Как Вы уже наверное догадались, чтобы иметь возможность управлять всеми светодиодами, то нужно подключить остальные выводы строк и столбцов матрицы к микроконтроллеру:
ОК, все очень красиво, но как, например, зажечь один светодиод в центре матрицы, оставив остальные при этом выключенными? Или, как, наоборот, зажечь все светодиоды, кроме одного-двух в центре? Понятно, что при такой схеме включения невозможно этого добиться простой подачей на выходные порты ноликов и единичек (с помощью статической индикации). Тут на помощь как раз и приходит динамическая индикация.
[Динамическая индикация]
Название "динамическая" происходит от того, что формирование изображения происходит не статически, а в динамике, т. е. сначала, например, показывают только первый столбец изображения (все остальные столбцы погашены), на втором шаге показывают только второй столбец, и так далее до 8-столбца. Если это делать быстро (с периодом прокрутки всех шагов не меньше 20 мс), то человеческий глаз не воспримет переключения между столбцами, и ему будет казаться, что отображается сразу вся картинка. Такое последовательное отображение элементов изображения называется разверткой. Для того, чтобы изображение не мерцало и яркость всех точек была одинакова, необходимо выполнение следующих условий:
1. Длительность отображения каждого столбца постоянна, одинакова для всех столбцов.
2. Частота смены столбцов не меняется.
Почему необходимо отображать картинку по столбцам, а не по строкам? Потому что в данной схеме мы подключили токоограничительные резисторы к линиям строк. Чтобы обеспечить одинаковую яркость свечения каждой точки, нам нужно обеспечить одинаковый средний ток через каждый светодиод, что возможно при такой схеме только при развертке по столбцам (когда по столбцам-анодам пробегает лог. 1). Если бы у нас резисторы были подключены не к катодам (не к строкам), а к анодам (к столбцам), то тогда развертку изображения надо было делать не по столбцам, по строкам (у нас бежал бы по строкам лог. 0).
Для примера приведу алгоритм отображения цифры 2 (на рисунке светодиоды, которые надо зажигать, я закрасил красным цветом), столбцы и строки нумеруются от 1 до 8:
1. Отображение столбца 1. Для этого на PA0 подаем лог. 1, на PA1..PA7 подаем лог. 0. На порты PB3, PB4, PD0, PD1, PD3, PD5..PD7 также лог. 1. Держим матрицу с таком состоянии 2.5 мс.
2. Отображение столбца 2. Для этого на PA1 подаем лог. 1, на PA0, PA2..PA7 подаем лог. 0. Подаем лог. 1 на PB3, PB4, PD1, PD3, PD7, подаем лог. 0 на PD0, PD5, PD6. Держим матрицу с таком состоянии 2.5 мс.
3. Отображение столбца 3. Для этого на PA2 подаем лог. 1, на PA0, PA1, PA3..PA7 подаем лог. 0. Подаем лог. 1 на PB3, PD0, PD1, PD5, PD7, подаем лог. 0 на PB4, PD3, PD6. Держим матрицу с таком состоянии 2.5 мс.
4. Отображение столбца 4. Все то же самое, что и на шаге 3, только подаем лог. 1 не на PA2, а на PA3. Держим матрицу с таком состоянии 2.5 мс.
5. Отображение столбца 5. Все то же самое, что и на шаге 4, только подаем лог. 1 не на PA3, а на PA4. Держим матрицу с таком состоянии 2.5 мс.
6. Отображение столбца 6. Все то же самое, что и на шаге 5, только подаем лог. 1 не на PA4, а на PA5. Держим матрицу с таком состоянии 2.5 мс.
7. Отображение столбца 7. Для этого на PA6 подаем лог. 1, на PA0..PA5, PA7 подаем лог. 0. Подаем лог. 1 на PB3, PB4, PD0, PD3, PD5, PD7, подаем лог. 0 на PD0, PD1, PD6. Держим матрицу с таком состоянии 2.5 мс.
8. Отображение столбца 8. Все то же самое, что и на шаге 1, только подаем лог. 1 не на PA0, а на PA7. Держим матрицу с таком состоянии 2.5 мс.
Цикл шагов 1..8 занял ровно 20 мс (2.5+2.5+2.5+2.5+2.5+2.5+2.5+2.5). При непрерывном чередовании шагов 12345678123... получится отображение символа 2 без видимого мерцания. По похожему принципу работают все "взрослые" системы индикации в автобусах, электричках, турникетах, рекламных табло.
[Пример управления матрицей LED8X8]
Для экспериментирования со знакогенераторами 8x8 я сделал небольшой проект для отображения символов на индикаторе GNM-7881AUE. Схема подключения индикатора - точно такая же, как используемая при обсуждении динамической индикации. Красными метками я указал номера выходных контактов макетки AVR-USB-MEGA16.
Проект управляется через виртуальный COM-порт - в консоли можно было ввести шестнадцатиричный код символа, и он тут же высвечивается на индикаторе. На фото видна макетка AVR-USB-MEGA16, на которую припаян индикатор GNM-7881AUE (весь монтаж и резисторы SMD 0805 номинала 150 Ом выполнен с обратной строны макетки).
Потом проект оброс возможностью отображения бегущей строки и вывода картинок BMP, что позволяет делать забавную анимацию. В качестве знакогенератора используется набор символов от ZX-Spectrum, дополненный русскими символами.
[Что внутри проекта LED8x8]
Проект собран на основе статьи [1]. Скачанный пример дополнен командами, и в главный цикл main добавлена процедура динамической индикации, отображающая символы, бегущую строку или анимацию из картинок BMP. Питается и конфигурируется устройство от USB. Когда активен интерфейс USB, то возможно мерцание отображаемой картинки, так как на программную поддержку протокола (библиотека V-USB) тратится большая доля процессорного времени.
В память можно занести любое количество текстов и картинок (пока хватит места в EEPROM), они сохраняются в памяти после выключения питания. Управление и конфигурирование осуществляется через текстовую консоль, подключенную к виртуальному COM-порту (через любую консоль типа Hyperterminal, Terraterm или putty), интерфейс управления имеет систему подсказок. Вот пример сеанса работы с управляющей консолью проекта:
Тексты можно вводить командой TXT, а BMP-картинки в черно-белом формате 8x8 пикселов можно загрузить по протоколу XMODEM (моя любимая консоль SecureCRT умеет это делать). И тексты, и картинки добавляются в общий пул, и проигрываются по команде RUN в том порядке, в каком Вы их занесли в память — поэтому при желании можно сочинить очень сложную поздравительную комбинацию. Скорость бегущей строки и смены картинок меняется командой SPEED (от 1 до 10). Доступны также некоторые отладочные команды.
[Ссылки]
1. USB консоль для управления радиолюбительскими приборами.
2. Проект LED8x8 для AVRStudio.
3. Видеоролик на depositfiles и на YouTube.
|
Комментарии
2011-10-0612:04:20 Спасибо автору, разобрался с матрицами благодаря этой статье. Помогла схема матрицы и отличный пример, какие ячейки включать.