Модель ЖК индикатора TIC8148 (TIC55) на основе схематичной модели двойного драйвера ML1001 со встроенным генератором

В качестве «подопытного» кролика для реализации модели с количеством сегментов более 64 я выбрал тоже достаточно распространенный индикатор TIC8148. У него есть брат-близнец – TIC55, так что модель можно смело использовать и для того и для другого индикатора. Данный индикатор представляет из себя 8 восьмерок с точками и спецсимволами в виде 8 галок в нижней строке. Таким образом, мы имеем в сумме 72 светящихся сегмента, что явно превышает возможности LCDMPX.DLLдля одного общего входа COM. Даташит, как обычно, находится во вложении, а на рисунке 134 из этого даташита я выделил цветом значимые для нас места. Итак, нумерация цифр самого индикатора справа-налево, т.е. самая левая - цифра 8. Буквенное обозначение сегментов совпадает с общепринятым, но вот десятичная точка обозначена как P (по-видимому, от Point), а символом Hобозначен дополнительный символ - галочка в нижней строке.
Вы, конечно, догадались, что 72 сегмента превышают не только возможности LCDMPX, но и возможности одного драйвера ML1001 (40 сегментов), поэтому в реальном индикаторе их 2, включенных последовательно, как рассматривалось выше. А вот если глянуть на таблицу распределения сегментов из того же даташита (Рис. 135), то тут опять начинается «китайская грамота». Немудрено, ведь на Тайване те же лица, только в профиль. Итак, согласно таблице, первому выходу S1 первого драйвера соответствует сегмент 8D – нижний горизонтальный самой левой цифры.
Соответственно по первому тактовому импульсу на входе DCLKмы заносим данные для него, далее согласно строкам таблицы, вплоть до 72-го тактового импульса, который соответствует десятичной точке самой правой цифры, т.е. №1. Об этом следует помнить при написании программ для управления данными индикаторами. Еще хочу обратить ваше внимание на то, что дополнительный символ галочки в этой последовательности предшествует символу десятичной точки данного знакоместа, т.е. перебираются все сегменты, затем галка и уже последней – десятичная точка. Это тоже накладывает некоторые особенности на написание программ. В частности, если даже мы не используем в своем девайсе символы нижних галок. Допустим, для хранения информации о знакоместе используется байтовая переменная: семь бит – сегменты и один бит – информация о точке. При последовательном выводе на индикатор нам придется перед выводом информации о десятичной точке вставлять «пустышку» для сегмента нижней галочки данного знакоместа. Так, что-то я отклонился от темы, это уже особенности программирования, а мы вернемся к нашей модели и начнем с графики.
В качестве символов сегментов я использовал все те же символы от «разобранного» VI-402-DP, но пришлось добавить символ нижней галочки. Кроме того, у нас в индикаторе теперь 8 цифр и для двух правых знакомест появились новые координаты – 4600,200 и 5300,200(Рис. 136). Шаг по осиХ по-прежнему 700. Ну и еще небольшой «финт» с выводами. Сегменты я сразу же загнал в шину на 24 разряда S[1..24], а общих выводов сделал три COM1, COM2 и COM3, т.е. мы получим индикатор на 72 сегмента, но выводами COMнадо управлять попеременно, а сегменты мультиплексировать. Собственно, для этого и существует LCDMPX.DLL.
Теперь небольшое лирическое отступление на тему – почему именно 3 вывода COM, ведь для 72 сегментов по логике достаточно было бы и двух. Я тоже первоначально надеялся, что хватит двух, но в ходе разработки модели выявился один неприятный момент LCDMPX.DLL. Если количество сегментов для одного вывода COMпревышает 32, а этих выводов два или более, то при мультиплексировании начинает наблюдаться моргание всех сегментов, относящихся к выводам COM2, COM3 и т.д. И избавиться от этого эффекта всеми известными мне приемами так и не удалось. Так что на будущее примите совет, при моделировании ЖК индикаторов с одним общим выводом можно использовать до 64 сегментов, при моделировании с двумя и более общими выводами количество сегментов для одного общего вывода не должно превышать 32. Чтобы не быть голословным, я оставил во вложении первоначальный вариант с двумя COMв папке BAD_Model_Test. Просто запустите симуляцию и вы увидите, что правая часть сегментов индикатора (с 41-го по 72-й) вместо постоянного свечения мерцает. Поэтому в окончательном варианте я поставил 3 вывода COM, при этом количество сегментов для одного общего вывода получилось 72/3=24, отсюда и соответствующая шина S[1..24].
Теперь нам осталось Make Deviceнашу модель, как и ранее с основными свойствами, т.е. PRIMITIVE, MODDLLиTTRIGMINи начинаем добавлять сегменты. Поскольку их тут достаточно много, лучше это делать через заранее подготовленный текстовый файл. В папке вложения 8148_graphic это файл segments_8148.txt. Поскольку у нас 72 светящихся элемента, получились 24 строки SEG, каждая из которых содержит записи для трех сегментов с разными координатами. Например, для SEG1, соответствующего в таблице сегментам S1 и S25и S49, параметры будут выглядеть так:
{SEG1=(3,400,200),(2,1800,200),(5,3900,200)}
Добавив все сегменты, проверяем себя с помощью теста. Во вложении 8148_graphic\Full_Test_Graphic.DSNс помощью вспомогательной схемы этот процесс слегка «автоматизирован», чтобы можно было отследить последовательность зажигания сегментов в соответствии с таблицей. На этом этап подготовки графической модели индикатора окончен.
Теперь нам надо заняться моделью драйвера, имитирующего 2 последовательно соединенные ML1001. Для компоновки внутренней схемы двух-драйверного управления (назовем модель заранее 2xML1001) я воспользуюсь модифицированными примитивами сдвиговых регистров и защелок. Мы уже ранее проводили такие вариации при моделировании АЦП (п.6.16-6.18). Здесь, существует еще более жесткое ограничение в 32 разряда. Но нам это не помеха, мне требуются примитивы на 24 разряда. Для большей компактности схемы дочернего листа я решил «ужать» входы/выходы разрядов в шины. В результате появились на свет следующие два примитива (Рис. 137).
Выглядят они более компактно, и схема дочернего листа будет иметь более опрятный вид. Надеюсь, что и полная картинка с дочернего листа в результате поместится непосредственно здесь. Теперь создаем графику самого сдвоенного драйвера. Тут тоже все просто. К изображению ML1001 из предыдущего варианта у нас добавились только три управляющих выхода для выводов COM1 и COM2 дисплея (Рис. 138 ).
Как обычно, присоединяем к нашей модели дочерний лист и с помощью вновь созданных примитивов формируем схему двух, соединенных последовательно драйверов (Рис 139).Эта структура отдельно приведена в папке вложения 2xML1001\Structure проект Int_Structure.DSN.
Пожалуй, некоторые нюансы этой схемы заслуживают дополнительных пояснений. На регистрах сдвига U1, U3, U5 организован последовательный сдвиговый регистр на 72 разряда. Чтобы не городить огород с завешиванием управляющих входов на шины с разными логическими уровнями, в свойствах входы UPи OEинвертированы – INVERT=UP,OE. Такой прием позволяет завешиванием всех управляющих входов примитива на землю сделать при этом инвертированные входы вечно активными. Аналогично в буферных регистрах защелках U2, U4, U6 я поступил с входом EN. Так как выходные шины регистров сдвига соединены с входными защелок непосредственно, навешивание меток (лейблов) на них не требуется. Протеус и так поймет и соединит их «один в один», т.е. Q0-D0, Q1-D1, Q3-D3 и т.д. Аналогично для выходов защелок и шинного терминала S[1..24] образуются пары Q0-S1, Q1-S2, но здесь есть одна хитрость, вернее две. Выходы защелок и шинный терминал должны иметь одинаковую разрядность, тогда образуются такие «сдвинутые» по нумерации пары. А еще выходы U2, U4, U6могут иметь третье (высокоимпедансное) состояние. Этим я воспользовался для коммутации выходов от трех регистров в общую шину. Напомню, что перевод в третье состояние осуществляется по входу OE (OutputEnable). Вот его я и задействовал, чтобы на 24 выхода S1…S24 подавать различные сигналы в зависимости от того, какой из выходов COMактивен в данный момент. Еще нам потребуется какой-нибудь встроенный управляющий генератор. С этим тоже не проблема. Вспомните, как мы поступили при моделировании К176ИЕ12. Применяем тот же прием, ставим внутренний цифровой генератор CLOCK, а его параметры пропишем так, чтобы можно было задавать в свойствах модели. По умолчанию они прописаны в скрипте *DEFINEи равны 60 Герц. Этот генератор управляет трехразрядным кольцевым сдвиговым регистром на D-триггерах (U7, U8, U9), первый из них предустановлен в 1 (INIT=1). Этот регистр формирует выходные сигналы COM, а попутно и коммутирует буферные защелки. Тут я не стал мудрить и поставил обычные примитивы триггеров. Ну и еще пару слов о свойствах регистров защелок. Так как нам необходимо иметь активные нули для зажигания сегментов на выходах модели, инвертированы целиком входные шины защелок, т.е. в их свойствах стоит INVERT=EN,D[0..23] (про ENсм. выше). В этом варианте можно было инвертировать только входы, т.к. у выходов используется третье состояние и если им задать INVERT, мы его потеряем. Чтобы исключить ложное «подмаргивание» сегментов в момент старта симуляции для защелок применена стартовая предустановка всех разрядов в единицы INIT=0xFFFFFF. Вот и все особенности внутренней структуры сдвоенного драйвера.
После тестирования (во вложении папка With_Child_Sheet) с дочернего листа того проекта компилируем файл 2xML1001.MDF. Тест окончательного варианта драйвера и готовый MDF лежат в папке With_MDF_File. Напомню, что в завершение работы над моделью драйвера необходимо прогнать Make Deviceдля него еще раз и в свойствах на третьей вкладке прописать следующие:
MODFILE=2xML1001.MDF
СLOCK=60
Во вложении это уже сделано. Свойство СLOCK необходимо для того, чтобы можно было в EditPropertiesсменить частоту внутреннего генератора, поэтому на третьей вкладке Make Device везде задаем ему Normal, ставим ограничение Positive, None-Zero, ну а в Descriptionописываем его как-нибудь попонятнее, я, например, назвал Internal Clock Generator.
На этом я хочу завершить «показательные выступления» с LCDMPX.DLL. Охватить весь мировой ассортимент всевозможных LCD цифровых индикаторов, как вы понимаете, невозможно. Надеюсь, что приведенные примеры позволят вам при необходимости самостоятельно разработать требуемые для конкретного случая модели сегментных или мнемонических ЖК дисплеев. Первоначально я планировал сделать еще материал по HoltekHT1611, но, учитывая, что этот «раритет» практически исчез с рынка и если завалялся у кого, то только потому, что очень неудобен для использования в качестве индикатора – отсутствуют десятичные точки, я решил эту модель не делать. Если уж кому невмоготу, то по этой ссылке:
http://kazus.ru/forums/showpost.php?p=182152&postcount=518
лежит его модель от Soir. В свете новых знаний можете усовершенствовать этот вариант самостоятельно. Мы же переходим к моделям LCD дисплеев на основе контроллера HD44780 в Протеусе.
Рисунки 134. 135, 136.
Рисунки 137, 138, 139.





Миниатюры:

Вложения:

8_13.rar (679.5 Кб, 329 просмотров)

Последний раз редактировалось Halex07; 10.08.2011 в 22:38.


3919228111960152.html
3919291810990158.html
    PR.RU™