Мультиплексный режим управления символьным ЖКИ

Вопрос , по моему мнению, недостаточно освещён в сети. Вернее публикации по нему есть, но не столько, сколько по, допустим, HD44780. Толчком для изучения мною данного вопроса явилась покупка на evodbg  универсального ЖКИ SR5624 по хорошей цене — 2 USD. Первые опыты  показали, что так сразу подобный ЖКИ не возьмёшь. Почитав литературу я разобрался как управлять мультиплексным индикатором и решил реализовать этот метод на МК общего назначения, т.е. не специализированном под эту задачу. Для формирования двухуровневого напряжения на общие выводы COM0 … COM3 использовал простейший ЦАП на двух резисторах. Контроллер выбрал ATmega8515, т.к. у него удачное расположение портов. Получилась такая штука.
Сразу скажу — решение вышло половинчатым. В общем-то управлять отображением можно, но, т.к. Bias ЖКИ 1/3 (т.е. необходимо три уровня напряжений и на каждой ноге индикатора, а не только на общих) то , даже при напряжении питания 3 В немного подсвечиваются элементы одного вывода индикатора для всех COM.
От этого недостатка можно избавится, подбирая опытным путём напряжение питания микроконтроллера, но и контрастность выводимого сегмента тоже будет ухудшаться. Такие вот дела… Но, если специализированного контроллера не достать — этот метод вполне себе сойдёт.
Теперь перейдём ко второй части марлезонского балета 🙂 Здесь и будет основной материал. Сначала немного теории…

Статический режим
Если для всех сегментов ЖКИ имеется один общий электрод, то для каждого сегмента должен быть отдельный вывод. Принцип управления таким дисплеем показан на рисунке ниже . SEG0 — COM0 это напряжение на сегменте, который отображается, и SEG1 — COM0 это напряжение на сегменте, который не отображается. Т.е. сегмент  SEG0 становится видимым при подаче на его вывод меандра противофазного меандру на общем выводе COM0. Такой способ применён в управлении индикатором от мультиметра M830.

Мультиплексный режим 1/2 Duty и 1/2 Bias
Для ЖКИ с двумя общими выводами (1/2 Duty) необходимо использовать уже три уровня напряжения на общих выводах.  Тогда суммарное напряжение на сегментах будет более сложной формы (см. рисунок). Отображаться будет сегмент с результирующим переменным напряжением между ним и общим SEG0-COM0, в том случае, когда максимум будет достигать Vlcd. Если результирующее переменное напряжение в максимуме будет 1/2 Vlcd, как для SEG0-COM1, то этот сегмент отображаться не будет. Для этого примера Bias равен 1/2 — т.е. имеются два уровня напряжения Vlcd, при котором сегмент становится видимым, и 1/2Vlcd при котором сегмент невидим. Такой режим я и организовал в примере с управляющим микроконтроллером ATmega8515, описанным в начале статьи.

Мультиплексный режим 1/3 Duty и  1/3 Bias
Bias 1/3, как правило, рекомендуется для ЖКИ с тремя общими выводами (1/3 Duty). Здесь уже напряжение должно быть четырёхуровневое и для общих выводов и для выводов сегментов. Суммируя эти напряжения на сегменте относительно нужного общего, получим три уровня (Bias 1/3) напряжения.  Реализовать этот режим на контроллере общего применения в принципе возможно, но возникает необходимость в слишком большом количестве выводов, т.к. управляющий сигнал на сегмент и общий вывод нужно будет формировать двумя выводами контроллера.

Мультиплексный режим 1/4 Duty и 1/3 Bias
Bias 1/3 является оптимальным для ЖК-дисплеев с четырьмя общими выводами  (1/4 Duty).  Принцип то же, что и рассмотренный выше, за исключением того, что кадр (frame) состоит из 8-ми, а не 6-ти, как вверху, тактов. Именно такой режим указан в документации для управления SR5624.

Для управления указанным индикатором я решил попробовать специализированный микроконтроллер семейства ATmegaxx9. Конечно, для этого опыта проще было бы использовать ATmega169, но их к сожалению на Космодроме не было. Поэтому пришлось покупать ATmega3290 — 100-ногий  32-х килобайтный микроконтроллер. Забегая вперёд скажу, что работа с вышеозначенным камнем принесла мне немало опыта в плане изготовления печатных плат, ведь с корпусами TQFP100 (0,2 мм нога, 0,2 мм между ногами) я ещё не работал. Плата получилась со второго раза — в первый раз когда паял, косо выставил МК, потом, вместо того, чтобы отпаять и выставить заново, старался натянуть ноги, пододвинуть дорожки и в итоге перегрел и поотрывал их. Также, раз уж заговорил по поводу платы, разработал удобный макрос для SL5, т.к. при использовании готового, скачанного с интернета обнаружилось несоответствие размеров оного с реальным корпусом. Плата получилась такая.
Я вывел почти все незадействованные для ЖКИ ноги контроллера на разъёмы (т.е. отверстия) , и этот блок универсального индикатора послужит мне в дальнейшем основой какой-нибудь конструкции. Настраивается работа LCD-контроллера ATmega3290 всего четырьмя регистрами (смотрим раздел даташита — там всё просто!). После настройки необходимый сегмент подсвечивается на экране обычной записью лог.1 в разряд соответствующего сегмента SEGxxx   регистра LCDDRxx; гаситься записью туда же лог.0. LCD контроллер в составе самого микроконтроллера работает полностью аппаратно и не нужно программно отвлекаться ни на что, кроме изменения отображаемой информации, если возникнет необходимость. Программу я написал самую простую, чтобы не забивать головы пользователей ненужной информацией. В заголовочном файле не поленился и написал макросы для вывода всех цифр на семисегментные знакоместа. Макросы set_a_b выводят символ b на знакоместо a; макросы cli_a очищают знакоместо a. Так выглядят все возможные символы (функция LCD_update(0xFF) раскомментирована).
А так выглядят цифры на семисегментных знакоместах.
Вывод остальных символов можно сделать аналогично. Не скажу, что это лучший способ — скорее простейший. Можно оформить вывод всех символов функцией, создав предварительно массив с адресами регистров LCDDRxx . Напоследок добавлю, что индикатор прекрасно работает от маленькой солнечной батареи (см. фото выше) даже при рассеянном солнечном свете или под лампой накаливания, что делает его в связке с ионистором независимым от источника питания.
Архив с программой на Си,  печатной платой SL5.
UPDATE 07.03.2012 — случайно подал напряжение питания в обратной полярности на эту плату… Пошёл сизоватый дымок ((( Был уверен, что контроллер сжёг, тем более, что он в таком «нежном» корпусе. Каково же было моё удивление, когда после остывания корпуса (а до него невозможно было дотронутся) я подключил программатор и обнаружил, что ATmega3290 читается/пишется в полном порядке: и память , и фьюзы, и локбиты.

Запись опубликована в рубрике Микроконтроллерный конструктор с метками . Добавьте в закладки постоянную ссылку.

8 комментариев: Мультиплексный режим управления символьным ЖКИ

  1. shurikss123 говорит:

    красота, спасибо за статью, подчерпнул много нового, для себя

  2. s_black говорит:

    Всегда рад)))

  3. lpa говорит:

    Здравтвуйте!
    Не подкажите, как определить рапиновку мультиплексного ЖКИ? А то валяются пара мультиплекных ЖКИ от муз. центров, хочется их заюзать где-нибудь. Документации и маркировки на них, етественно, нет.

  4. s_black говорит:

    В этой статье я расписал методику определения выводов, хотя в мультиплексном ЖКИ процесс будет чуть подольше.

  5. Андрей говорит:

    Отличная статья — очень помогла разобраться в принципах работы такого индикатора. Как раз такого барахла сейчас завались и устройства получаются достаточно дешево и сердито (точнее почти бесплатно). До этого я с ЖКИ без контроллеров не работал. Сейчас реализую обратную идею — с помощью МК считать данные с такого ЖКИ, организовать управление через МК по полученным данным, а также запихать их ПК через USB/Com порт. Китайцы много чего делают с такими индикаторами и получить автоматические измерители влажности, веса, Ph и прочее, считав данные с индикатора гораздо дешевле чем купить датчики и городить устройства (и их налаживать!) самому…

  6. s_black говорит:

    Идея интересная, но не совсем понятно, как Вы будете считывать данные именно с ЖКИ? Ведь ЖКИ отображает то, что ему «даёт» управляющий контроллер!

  7. Андрей говорит:

    Именно считывать с контактов ЖКИ (ведь управляющий контроллер «работает» под его алгоритм) с программной дешифрацией на простеньком микроконтроллере. Просто подпаяюсь в разрыв между МК прибора и ЖКИ (уже так сделал) и определю ножки ЖКИ (тоже определил как Вы описали в статье и посмотрел на осциллографе) и загоню сигнал в МК. Со статическим режимом проблем вообще нет — завел прерывание по фронту с общего электрода на МК и читай 0 или 1. С динамическими сложнее — 4 уровня сигнала нужно измерить. На том ЖКИ что у меня сейчас в процессе экспериментов — питание 3,3В, уровни — 0, 1, 2, 3В, 4 общих электрода и 12 выводов сегментов. Есть несколько вариантов решения на мой взгляд. Первый, решение «в лоб» — компаратор на каждый вход и 2х битный ЦАП на резисторах в качестве его опоры с управлением от МК (как вариант 2 компаратора на вход) — 4 измерения (1 измерение) и все состояния ножек ЖКИ уже в МК. Ножек МК только много потребуется. Второй вариант — мультиплексоры 4-1 или 8-1 + набор из 2х компараторов на каждый выход мультиплексора — на выходе 2 бита состояния (такого типа схемка http://www.bourabai.kz/toe/adc03.htm). Третий вариант — тупо поставить мультиплексор и внешний параллельный АЦП(дорого и бессмысленно если есть МК). Второй вариант больше всего нравится — ЖКИ медленный, сгенерить прерывание в МК по сигналу с 1го общего электрода и получить все 64 значения уровней сигналов управления не проблема. Компараторы и мультиплексоры по 0,2бакса за штуку, контроллер 3-4 + немного внешней мелочевки — дешево и сердито. Думаю можно еще проще сделать, но пока не допер как…

  8. Дрюня говорит:

    Здравствуйте!
    Не подскажите как сделать смену цифр? В Мультиплексном режиме управление
    ATmega3290 .

Добавить комментарий

Ваш e-mail не будет опубликован.