AVR340: прямое управление сегментами ЖКИ с помощью портов GPIO |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Приведен перевод даташита Atmel [1], рассказывающий о принципах прямого управления LCD с помощью портов GPIO микроконтроллера AVR (семейств ATtiny и ATmega). Т. е. специальный контроллер LCD не используется, в качестве контроллера LCD выступает сам микроконтроллер AVR со специальным программным драйвером. Прим. переводчика: даташит AVR340 [1] довольно небрежный, пестрит опечатками и ошибками. Что заметил, исправил, но возможно не все. Несмотря на эти огрехи, основной принцип прямого управления индикатором даташит раскрывает достаточно понятно. [Введение] Многие радиоэлектронные устройства требуют подключения ЖКИ (Liquid Crystal Display, LCD) к микроконтроллеру (MCU). В этом апноуте описана работа с мультиплексированным LCD. Также обсуждается форма электрических сигналов и соединения, которые требуются для LCD, и программа на языке C, которая нужна для работы LCD. В результате получается отличное, недорогое решение, которое можно использовать как стартовую позицию для разработки многих продуктов. Хотя мультиплексированные LCD сложнее для применения, они наиболее дешевы, и требуют наименьшего количества портов I/O по сравнению со всеми стеклянными LCD (под "стеклянными" имеются в виду LCD, которые не имеют на борту встроенного контроллера для управления сегментами). [Как устроен мультиплексированный стеклянный LCD] Рис. 2-1. LCD индикатор PD332. На рисунке показан пример LCD без встроенного контроллера, у которого есть 4 общих входа (COM) и 8 входов сегментов. Такой LCD потребует 4+8=12 портов GPIO микроконтроллера ATmega48. При этом останутся свободными от 11 до 16 GPIO, в зависимости от выбранного корпуса микроконтроллера. LCD для своей работы требует подачи на сегменты переменных сигналов прямоугольной формы. Если не устранить постоянную составляющую из сигналов управления сегментами, то LCD будет поврежден, потому что произойдет необратимая металлизация сегментов. Сегменты LCD становятся видимыми, если разность напряжения между входом COM (общие входы) и входом сегмента составит обычно 3.5 VAC. В этом примере 4 входа COM получают каждый смещение, равное 1/2 напряжения питания микроконтроллера VCC. Это сделано для того, чтобы выбранные сегменты стали видимыми. На рис. 2-2 показаны формы сигнала на 3 из 4 входах COM. Все 4 COM-а разрешаются последовательно, чтобы было сгенерировано по 1 циклу переменного напряжения для каждого COM. Общее время для формирования циклов всех 4 COM составляет приблизительно 16 миллисекунд, так что скорость обновления изображения на LCD получается около 60 Гц. Это достаточно быстро, чтобы не было заметно мерцания, и достаточно медленно для того, чтобы не было двоения выключенных сегментов (чтобы они успели выключиться). На осциллограммах показано, как каждый сигнал COM переходит от 1/2 VCC до VCC на 2 мс, и затем к GND на 2 мс, и затем обратно к 1/2 VCC. Этот уровень называется "половина возбуждающего напряжения VCC". Более сложные LCD часто используют "возбуждение по одной трети", однако этот метод в этом апноуте не рассматривается. Дополнительную информацию по возбуждению LCD см. [2]. Каждый COM-цикл активен 4 мс, затем возвращается к 1/2 VCC, в неактивное состояние. Общее время для всех 4 COM составит 16 мс. Рис. 2-2. Осциллограммы сигналов возбуждения LCD. Чтобы активировать (отобразить) сегмент, его фаза должна быть на 180 градусов отличаться от фазы его сигнала COM. Таким образом, разница напряжения между сигналами сегмента и COM составит 5V AC, что приводит к тому, что сегмент станет видимым после 300..400 мс циклов обновления. Чтобы деактивировать (выключить) сегмент, сигналы COM и сегмента должны быть в фазе друг с другом в тот момент, когда COM этого сегмента является активным, т. е. на равен 2.5V. Таким образом, все сегменты LCD будут выключены, когда входы сегментов всегда будут В ФАЗЕ с каждым из его входом COM (на рис. 2-2 сигнал COM3 опущен, так как были доступны только 4 канала). [Описание схемы] На рисунке 3-1 показан простой интерфейс между ATmega48 и PD-332 LCD. Обратите внимание на pullup резисторы на сигналах COM: эти резисторы предоставляют напряжение 1/2 VCC, которое нужно, когда сигналы COM переходят в неактивное состояние. Для неактивного состояния ATmega48 просто устанавливает нужный вывод в режим входа, после чего резисторы переводят уровень COM к 1/2 VCC. У LCD 8 соединений сегментов переименованы как 1A, 1B, 2A, 2B, и так далее, чтобы соответствовать данным в таблице сегментов программы на языке C. Рис. 3-1. Схема подключения LCD к микроконтроллеру. [Как работает табличный алгоритм] Таблица для генерации сигналов (Look Up Table, LUT) является 10-байтовым списком (см. для примера таблицу 4-1), который описывает, какие сегменты нужно активировать, чтобы отобразить цифры от 0 до 9. Дополнительные символы можно определить, добавляя в таблицу дополнительные байты - по 1 байту на 1 новый символ. Таблица 4-1. Look up table (LUT).
Работа алгоритма заключается в следующем: • В основной программе 4 ячейки RAM содержат 4 символа для отображения. Эти ячейки RAM содержат двоичные числа от 0 до 9 (диапазон кодов может быть увеличен позже, если нужно добавить еще другие символы ASCII). 1. Каждые 2 мс происходит прерывание, которое переключает ветвление кода по оператору switch. • После истечения следующих 2 мс вышеуказанная последовательность повторится, но для активного COM2. Оператор switch передаст управление на ветвь case 2. В этот момент данные для каждого отображаемого символа будут выбираться из LUT, и собираться в переменной segs_out, затем будут отправляться в регистр PORTB, в то время как активность сигнала COM2 будет управляться данными регистра PORTD. [Осциллограммы сигналов COM1-COM4] На рис. 5-1 показано, как формы переменных формируемых сигналов генерируются для двух сегментов LCD. Сигналы COM генерируются программой на языке C, показанной в следующей секции. Чтобы активировать сегмент LCD, к нему должен быть приложен импульс двухполярного напряжения к нужным входам A и B индикатора LCD. Для каждой позиции символа есть входы A и B. Рис. 5-1. Пример формирования сигнала. // Файл: LCX_App_Note_5_3_05.c демонстрационного C-кода для запуска LCD индикатора // PPD-332 фирмы Pacific Display. Код компилировался компилятором CodeVision AVR // версии 1.24.4a Evaluation, доступным на сайте http://www.hpinfotech.ro. // Эта программа отображает 4 инкрементируемые десятичные цифры на LCD. У LCD есть // 4 входа COM и 8 входов сегмента (всего 12 подключений). // COM1-COM4 выводятся на PORTD. // Сегменты выводятся на PORTB, и называются 1A, 1B, 2A, 2B, 3A, 3B - чтобы // соответствовать значениям A & B из массива segment_table. // PD-332 имеет идентичную разводку LCD для каждой из 3 цифр; 2 вывода сегмента // на цифру, помеченные как A и B. #include < mega48.h > [Ссылки] 1. AVR340: Direct Driving of LCD Using General Purpose IO using tinyAVR and megaAVR devices site:atmel.com. |