Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Проблемы и решения работы разнообразных дисплеев и индикаторов в программе Flowcode PIC

Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Сообщение admin (Alex Braun) » 03 авг 2012, 01:10

Изображение
Сегментные индикаторы предназначены для отображения информации состоящей из сегментов (7-сегментные - для отображения цифр, 14/16-сегментные - для отображения текста, шкальные - для отображения шкалы). Данные дисплеи нашли широкое распространение в различной измерительной аппаратуре, кассовых аппаратах, калькуляторах, часах, простых счетчиках электроэнергии, на заправочных станциях.

Основными техническими характеристиками дисплеев данного типа являются:
    • тип ЖК (TN, STN) - определяет качество изображения (STN - лучше, но и дороже);
    режим управления (статический, мультиплексированный) - в случае использования мультиплексированного режима уменьшается количество выводов. Как правило, в случае необходимости отображать более 40 сегментов используют мультиплексирование (несколько общих выводов - до 4);
    • напряжение питания (в основном 3.0 в);
    • угол зрения - это угол падения взгляда на панель ЖКИ, при котором контрастность изображения максимальна (3, 6, 9 и 12 часов, чаще встречаются 6);
    • геометрические размеры, расположение крепежных отверстий (элементов);
    • тип и цвет подсветки (отражение, просвет, отражение + просвет);
    • диапазон рабочих температур;

Большинство индикаторов имеют статический тип подключения, это означает, что к каждому сегменту индикатора идет отдельный соответствующий электрический вывод. Без объединения в группы и без общих контактов. Общим у них является только подложка.

Именно эти индикаторы наиболее дешевы в производстве, так как не имеют внутреннего контроллера и по подключению напоминают LED индикаторы, очень распространенные в любительских конструкциях. Но есть несколько существенных отличий, как положительных, так и создающих определенные трудности.

Начнем с положительных:

1. Ток потребления. В LED семисегментниках, каждый сегмент, это отдельный светодиод с потреблением около 15-20 миллиампер. Соответственно что бы зажечь все 7 сегментов + точку, потребуется приблизительно 150 мА. Подключив индикатор напрямую к контроллеру, мы имеем все шансы сжечь порт. Многие контроллеры ограничены током 100-150 мА на порт.

ЖКИ индикаторы потребляют в разы меньший ток, исчисляемый единицами микроампер. Для примера, у меня в хламе валяется системный блок компа с ЖКИ индикатором (температура, часы, работа винта и т. д.) Так он питается от одной батарейки типа CR2320, часы исправно идут уже 4 года.

2. Читабельность. В отличии от LED, LCD (жки) индикаторы, не "слепнут" на солнце. Они отлично и четко видны даже при прямом солнечном свете. Это делает их незаменимыми в устройствах используемых вне помещения. А мягкая подсветка, позволяет вполне комфортно использовать их при недостаточном освещении.

3. Цена. Новые ЖКИ индикаторы по стоимости на 20-80% дешевле аналогичных LED индикаторов и составляет около 2-2,5$ за 4-х циферный индикатор. Более того, их можно часто найти в каких нибудь игрушках или китайских часах-будильниках. Да и на барахолке они часто в хламе валяются, вообще за копейки.

Теперь немного о минусах:

1. Специфика ЖКИ индикаторов такова, что питать их можно только переменным напряжением (меандр).
2. Хрупкость. Индикаторы собраны на стеклянной основе, и требую бережного монтажа и обращения.
3. Температурный режим. Стандартной температурой считается -10~+60 градусов. Есть и варианты расширенной, до минус 40 градусов, но они попадаются реже. Так как используется технология жидких кристаллов, то при понижении температуры начинается некоторая заметная "заторможенность" при смене информации. Если же оставить прибор с таким дисплеем под солнцем, например на торпеде автомобиля, то от чрезмерного нагрева кристаллы могут вообще потечь и индикатор будет испорчен. То же может произойти и от удара.

Чуток теории:
Подробнее что такое сегментный ЖКИ и что такое поляризация света, а так же теорию корпускулярного дуализма можно найти в интернете, заострять на это внимание не будем.

Дисплей управляется магнитным полем, которое ориентирует кристаллы, которые в свою очередь поляризуют проходящий через них свет.
ИзображениеПроходя через поляризаторы (в нашем случае плёнка на дисплее – два одинаковых поляризатора) свет беспрепятственно проходит, мы видим прозрачный дисплей. Чтобы «зажечь» сегмент, свет нужно повернуть на 90 градусов, и мы увидим чёрное пятно сегмента. Тут как раз и применяют кристаллы, между двумя поляризаторами. Подаём ток, кристаллы ориентируются так, что поляризованный свет проходя через них, меняет угол, и задерживается вторым поляризатором.

Теперь как этим добром управлять. Сегмент – это по сути конденсатор, на него нужно подать ток, ток создаст электромагнитное поле ориентирующее кристаллы. Но просто к ноге контроллера его подключить нельзя, так как это конденсатор, то зарядившись сопротивление станет бесконечным и ток перестанет течь, а значит электромагнитное поле исчезнет и сегмент потухнет. Значит ток нужен переменный.

Более того, ток нужно подавать в противофазье. А именно, для свечения сегментов общая подложка (СОМ) должна быть под положительным потенциалом, а сегмент, который мы хотим зажечь, под отрицательным. И с частотой по даташиту (обычно 30-300Гц).
ИзображениеНа данном рисунке видно, что в момент (зеленая линия), когда на выводе (meandr, общий СОМ вывод индикатора), высокий уровень, на двух других (Q2 и Q1) низкий. На остальных тоже высокий. Именно те два, с низким потенциалом, и будут "светиться", так как обеспечивается обязательное условие для "свечения" - "единица" на общем и "ноль" на сегменте.

В следующую смену потенциала, на СОМ выводе низкий уровень, (красная линия). Ни один из сегментов "светиться" не будет, так как при низком потенциале на общем выводе, уже не важно, какой потенциал на сегментах. Тем не менее концепция работы, индикатора поддерживается, питается он переменкой.

Теперь от теории к практике.

Естественно никому в голову не придет питать такой индикатор с 40 ногами, прямо от контроллера. Для этого мы будем использовать SPI интерфейс контроллера и сдвиговые регистры на копеечной логике 74HC595 (аналог 74HC164, но с защелкой). По одной микросхеме на цифру.
Выбор именно на 74HC595 пал из-за их низкой стоимости (цена корпуса в SO16 всего 18-20 центов), размера (10х8мм), доступности, а так же наличие той самой "защелки", которая позволяет выводить на дисплей все данные одновременно, а не конвейерно побитно. Но об этом позже.

Итак регистр сдвига 74HC595.
Изображение
Начну с описания ног и их назначения. (по порядку выводов на картинке)
11. Clock (тактовый импульс) - череда импульсов одинаковой скважности и периода отправляются контроллером вместе с данными для разметки (нарезки) данных на биты.
14. Data In (вход данных) - непосредственно сами данные размеченные по байтам. Один байт на один корпус микросхемы. Нам понадобится 4 микросхемы на 4 цифры индикатора, значит и данных у нас будет 4 байта (4 символа)
12. Latch (защелка) - в этой микросхеме есть выходной регистр. Это регистр память. До тех пор, пока вывод Latch не поднимется от низкого потенциала к высокому, содержимое его не изменится. То есть на всех 8 выходах микросхемы будут те сигналы, которые были после последнего подъема Latch. Чем это удобно. В то время, пока контроллер "проталкивает" по шине данные, защелка Latch притянута к нулю. На индикаторе стабильно отображается информация, а не вырисовываются те, наполняемые данные. Когда же данные залиты полностью, все что нам нужно, это поднять Latch к единице и все загруженные данные перейдут в выходной регистр, сменив тем самым отображаемую информацию на новую. Это очень удобно, так как нет необходимости аппаратно гасить индикатор на время ввода данных, во избежании мерцания символов и появления "мусора" шума на дисплее.
10. Reset (сброс) - тут я думаю все и так понятно, очищаем все регистры и переводим микросхему в начальное состояние. Происходит это при переходе от единицы к нулю. Для продолжения работы микросхемы, на этой ноге должна быть единица. В нашем примере сброс нам не нужен, так как данные просто будут сменять друг друга. По этому эта нога просто подключена к шине питания.
13. Enable (включение) - вход по которому происходит включение и отключение выходных регистров. Для включения выходов, должен быть притянут к нулю. Если на этом выходе единица или он вообще не подключен, то на всех выходах будет неопределенное состояние. Не единица, не ноль. Это состояние называется третьим или Z-state (зет-состояние). Мы его использовать тоже не будем, но для себя возьмите на заметку, если подать на этот вход выход ШИМ-а от контроллера, то можно программно, без дополнительных навесных элементов, регулировать яркость свечения LED индикаторов.
15, 1, 2, 3, 4, 5, 6, 7 - это непосредственно выходы регистров сдвига. Те самые, от которых мы и будем снабжать наш индикатор информацией, что ему засветить, а что погасить. На картинке, я специально подписал эти выводы теми битами, при появлении которых эти ноги будут выдавать единицу.
Например:
Данные состоят пока лишь из одного байта, например число - 1. В таблице символов ASCII его DEC номер 49
Изображение
Таблица символов еще здесь
Значит, когда аппаратный SPI отправит ваше число "1" по шине, на 74HC595 придет децимальное число 49 в таком вот, бинарном виде - 00110001. Причем данные пропихиваются в обратном порядке, это значит что по конвейеру сначала пойдет старший бит 128, потом 64, 32 и т.д. до единицы, все 8 бит. На картинке сверху-вниз. И расположатся они на выходах вот так.
Изображение
Конечно в таком виде выводить символы еще рано, но для понимания процесса думаю максимально упростил. В дальнейшем я покажу как декодировать эти данные в тот вид, который потребуется для корректного отображения информации.
9. Data Out (выход данных) - замечательная фишка сдвиговых регистров, это возможность их каскадного подключения. Число их может быть ооочень большим. Для примера, 74HC595, работает на частоте до 30МГц. То есть тактовый импульс может пропихивать данные со скоростью 30 миллионов бит в секунду. Разделите это число на 8 :idea: и вы получите число микросхем, которые при максимальной частоте успеют получить все данные по цепочке... :?
Нам столько пока не нужно, ограничимся 4-мя. :stop: Этот выход подключают к входу Data In следующей микросхемы, и когда отправляют по шине два байта, первый проходит первую микросхему "насквозь" и опускается во вторую, а в первую приходит второй байт. Данные идут в прямом порядке по шине: 1-2-3-4 (при отправке 4-х байт). Соответственно 1-й байт с каждым тактом Clock, побитно проходит сквозь первую, вторую, третью микросхему и останавливается заполнив четвертую. Второй проходит первую, вторую и заполняет третью. Третий - вторую, а четвертый - первую.

Вот так выглядит отправка цифры "1" из примера выше.
Изображение
Желтая линия на осциллографе - тактовые импульсы, синяя - данные, малиновая - защелка.
LCD to SPI v1.0.rar

Экспериментируйте и если что, спрашивайте.

Продолжение следует...
У вас нет доступа для просмотра вложений в этом сообщении.
Flowcode v5, Proteus 7.8 SP2, PicKit2(full)
Аватар пользователя
Ник: admin
Имя: Alex Braun
(Киев)
Администратор
Администратор
Информация о пользователе

Re: Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Сообщение LEV-PRAV (LEV-PRAV) » 03 авг 2012, 22:01

Управлял индикатором без всякой магии и импульсов. Просто подавал потенциал на электроды от народной PIC16F84A.
Говорят, что жизнь индикатора от этого капитально укорачивается.

Видео пример
Давай на "ТЫ"
Аватар пользователя
Ник: LEV-PRAV
Имя: LEV-PRAV
(Санктум-Петербургум)
Модератор
Модератор
Информация о пользователе

Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Сообщение admin (Alex Braun) » 03 авг 2012, 22:28

LEV-PRAV писал(а):Говорят, что жизнь индикатора от этого капитально укорачивается.

В том то и дело. Постепенно кристаллы намагничиваются и перестают реагировать на магнитные поля. Индикатор сначала бледнеет, а потом вообще слепнет.
А при переменке они в постоянном перемагничивании.

**************************************************************************************************************************************************************************
Итак, продолжим совершенствовать схему...
В этой версии я добавил несколько микросхем регистров в каскад и в программе добавил количество символов до 4-х.
Теперь программа выводит строку "1234" через SPI на 4 регистра сдвига включенных последовательно.
В программе цикл отправки проходит 4 раза, т. е. пока переменная dlina, в которую попадает числовое значение длины строки, не станет равна переменной count, которая в свою очередь, инкрементируется при каждом проходе цикла отправки символа.

На рисунке хорошо видно, что в отправке присутствует не один, а 4 байта информации. Так же видно, что число "1" прошло по всей цепочке и остановилось в 4-й микросхеме, на выводах которой децимальное число 49. На третье микросхеме число "2", децимальное 50, на второй "3", децимальное 51, и наконец на первой "четверка" с децимальным числом 52.
Изображение
LCD to SPI v1.1.rar


Продолжение будет...
У вас нет доступа для просмотра вложений в этом сообщении.
Flowcode v5, Proteus 7.8 SP2, PicKit2(full)
Аватар пользователя
Ник: admin
Имя: Alex Braun
(Киев)
Администратор
Администратор
Информация о пользователе
Вернуться наверх

Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Сообщение admin (Alex Braun) » 08 авг 2012, 13:22

В следующей версии, пора выводить строку на LCD дисплей. (пока что без динамической разнополюсности, описанной в первом топике темы)
Но в том виде, в котором данные приходят со сдвиговых регистров, на дисплее будут совсем не символы цифр, а кракозябры.
Значит нам нужно их перед отправкой перекодировать в код, который будет "зажигать" те сегменты, которые будут соответствовать нужной цифре.
Добавим макрос перекодировщика, который в цикле, перед отправкой символа будет его переводить в нужный нам вид.
Определим, какой сегмент индикатора будет подключен к каждому выводу регистра сдвига.
Подключаем по такому алгоритму:
Изображение
Теперь знаем, что если мы отправляем по SPI символ "1", то отправляется децимальное 49. На дисплее нам нужно будет засветить сегмент 2 и 4, что будет соответствовать числу "1". Значит нужно отправить децимальное число 6 (2+4). При отправке символа "2", нужно засветить сегменты 1, 2, 64, 16 и 8. Складываем эти числа, получаем 91. Значит при отправке символа "2", нам нужно отправить не децимальное число 50, а 91.
Индикатор подключаем согласно даты:
Изображение
Ну и есть небольшой технический аспект. Индикатор засвечивает сегменты при условии, что на подложке (общем выводе) должна быть единица, а на сегменте ноль. А значит нам нужно разворачивать отправляемые символы, что бы на нужные нам сегменты шли нули, а на ненужные - единицы.
Для этого существует понятие инвертирования. Работает это так. Все биты байта меняют свое значение на противоположное. Например число 6 в битовом представлении имеет вид - 0b00000110, а после инверсии - 0b11111001. Вот его то мы и будем отправлять в индикатор и тогда получим нули на тех сегментах, что хотим засветить, а единицы на остальные. Знак инверсии обозначается так - "~"
Еще пример:
a = 91 // присвоение переменной "а" значения "91"
b=~a //присвоение переменной "b" инвертированного значения переменной "а"
теперь в переменной "b" находится число - 164
После всех этих манипуляций на индикаторе мы увидим наши заветные "1234". (но пока без динамики, по этому не рекомендую применять этот пример в железе, дабы сохранить в рабочем состоянии индикатор.)
Изображение
LCD to SPI v1.2.rar

В следующем топике я опишу, как все таки сделать разнополюсную динамику.
У вас нет доступа для просмотра вложений в этом сообщении.
Flowcode v5, Proteus 7.8 SP2, PicKit2(full)
Аватар пользователя
Ник: admin
Имя: Alex Braun
(Киев)
Администратор
Администратор
Информация о пользователе
Вернуться наверх

Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Сообщение admin (Alex Braun) » 23 авг 2012, 10:51

Итак, до сих пор проект быт чисто теоретическим, так как для реализации его в "железе" не было соблюдено одно важное условие. Динамической смены полярности подложки (общего вывода индикатора) и сегментов.
В следующей версии (1.3) добавлен вывод меандра с частотой около 65 герц, что вполне достаточно для комфортного считывания информации с ЖКИ и лежит в пределах даташита. (30-300Гц) Этот сигнал выводится на RC1, который в свою очередь подключен к подложке индикатора.
Основой программный блок, раз в 2500 циклов идет в макрос Send_SPI для переключения потенциала меандра и отправки данных в регистр.
Данные из строки декодируются один раз при их получении, и в дальнейшем декодер (макрос decoder) в программе не используется.
При реализации и экспериментах на макетной плате, нужно учесть, что большинство сегментных ЖКИ запитываются от напряжения 3-3.3 вольта, нужно посмотреть в его даташит. Хотя я читал, что есть примеры работы 3-х вольтовых индикаторов и от 5-ти вольт. Но я таких экспериментов не проводил. По этому нужно либо запитать всю схему от 3-х вольт, либо разделить питание регистров сдвига и контроллера, и подать на регистры 3 вольта, а с контроллером соединить через резисторные делители.
Изображение
LCD to SPI v1.3.rar


В дальнейшем я расскажу, почему в заголовке темы присутствует - RS232
У вас нет доступа для просмотра вложений в этом сообщении.
Flowcode v5, Proteus 7.8 SP2, PicKit2(full)
Аватар пользователя
Ник: admin
Имя: Alex Braun
(Киев)
Администратор
Администратор
Информация о пользователе
Вернуться наверх

Re: Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Сообщение JonyBest (JonyBest) » 19 дек 2012, 14:49

Отличная тема! Почитал, многое стало понятнее. Несколько не про СЕГМЕНТНЫЕ ЖКИ, но близко к теме.
В попытке разгрузить ноги у МК решил применить 74HC595 для управления 7seg индикатором. Пожалуйста, посмотрите, имеет данный код право на жизнь? Все ж первый опыт
lodka.rar
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
Ник: JonyBest
Имя: JonyBest
Практикант
Практикант
Информация о пользователе
Вернуться наверх

Re: Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Сообщение mim (mim) » 19 дек 2012, 15:16

JonyBest писал(а): решил применить 74HC595 для управления 7seg индикатором. Пожалуйста, посмотрите, имеет данный код право на жизнь?

Чтобы жизнь была медом...
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

Re: Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Сообщение carworker (carworker) » 12 окт 2013, 13:15

Спасибо Braun тема ну прямо в масть. Пытаюсь оживить LED панель 16Х16 20 модулей. Отсутствует плата с управляющим МК и пару драйверов. Платы прийдется изготавливать поэтому мне необходимо понять процес на модели. Исходя из того живого что осталось в LED панели набросал схемку в Протеусе и тестовую програмку.Пока что 8х8 для осознания. Идея такова-дешифратор 74LS138 управляет столбами матрицы (макрос switch 74LS138)а сдвиговый регистр (реально должны быть MBI5030)зажигает строки. Движение текста справа на лево. Например на матрицу надо вывести букву А Исходя из таблицы 192 или а 224.Обьясните пожалуйста какие "движения" нужно сделать чтобы эта буква "заплыла" в матрицу.
У вас нет доступа для просмотра вложений в этом сообщении.
Ник: carworker
Имя: carworker
(Одесса)
Ученик
Ученик
Информация о пользователе
Вернуться наверх

Re: Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Сообщение carworker (carworker) » 28 окт 2013, 01:24

Кувалдой и зубилом я вырубил букву А из камня PIC16F690.По сравнению с примерами со старого форума которые практически написаны на СИ мой тест изяществом не отличается но зато наглядно видно как возникает буква на матрице. Сделано Flowcde V5 & Proteus без шрифтов, таблиц, перекодировщиков. Просто тест. Сделаю макетки проверю в железе. Возможно кому то будет полезно.
У вас нет доступа для просмотра вложений в этом сообщении.
Ник: carworker
Имя: carworker
(Одесса)
Ученик
Ученик
Информация о пользователе
Вернуться наверх

Re: Сегментные ЖКИ, SPI, RS232 и другие официальные лица.

Сообщение geliosss (geliosss) » 01 сен 2016, 04:41

8-разрядный Дисплей от кассового аппарата"Миника" на 2-х микросхемах "кр1820вг1(cop472-3)
У вас нет доступа для просмотра вложений в этом сообщении.
Программатор MiniPro TL866CS
FC5 avr v5.5.2.1
Proteus 7.7 SP2
Аватар пользователя
Ник: geliosss
Имя: geliosss
(Новокузнецк)
Ученик
Ученик
Информация о пользователе
Вернуться наверх


Вернуться в Flowcode и дисплеи, индикация

Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей

cron