Показать сообщение отдельно
Непрочитано 03.07.2011, 10:40  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,508 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию Re: FAQ (ЧаВО) по PROTEUS для начинающих и не только

8.14. LCDALFA.DLL – основа построения знакосинтезирующих дисплеев, базирующихся на контроллерах HD44780 и его клонах.

Пожалуй, дисплеи на базе HD44780 – это наиболее востребованная и популярная у начинающих пользователей Протеуса линейка моделей ЖК индикации. На данный момент индикаторы этого типа выпускаются очень многими фирмами-производителями, как в «ближнем» зарубежье – КНР, так и в Европе, Америке и даже в России – МЭЛТ, а цены на наиболее простые, например, 8х2 без подсветки сопоставимы с ценами на сами микроконтроллеры, к которым они подключаются. Поэтому я решил уделить особенностям моделей на основе LCDALFA.DLL немного внимания, чтобы разобрать наиболее часто возникающие проблемы с симуляцией этих моделей, особенно у начинающих.
Итак, все модели, базирующиеся на LCDALFA.DLL, расположены в двух библиотеках ISIS, а именно: Optoelectronics\AlphanumericLCDs – типовые модели на базе HD44780 и Optoelectronics\SerialLCDs – модели с последовательным вводом данных по одному проводу. Ну, что касается последних, то в России они не продаются, хотя любители экзотики могут заказать их через зарубежные Интернет-магазины. Достаточно набрать в любом поисковике фразу Serial LCD Character Display и вы получите массу ссылок на описание и предложения этих дисплеев, поскольку они достаточно популярны у западных разработчиков. Я же приведу здесь только одну ссылку: www.milinst.co.uk – сайт фирмы Milford, модели дисплеев которой и представлены в библиотеке SerialLCDs. А вот здесь: http://www.seetron.com/bpk000.html любители «экзотического секса» могут найти описание той самой дополнительно устанавливаемой платы BPK (от английского Backpack), которая вешается сзади на стандартный дисплей, чтобы он превратился в сериальный. И как это многочисленные наши «братья наши по разуму» до сих пор не содрали сей девайс, и не заполонили им наш рынок, особенно в свете развития проекта Arduino, где эти дисплеи очень популярны у западных разработчиков, ума не приложу. Но хватит о грустном, вернемся к стандартным дисплеям на контроллере HD44780, которыми они нас снабжают в изрядном количестве. Наиболее популярная модель LM016L (2 строки по 16 символов) и окно ее свойств приведены на рисунке 140.
Для начала немного о самой модели. Сразу же слегка «охолоним» начинающих, ножки VSS, VDD и VEE в данной модели приделаны просто, как недостающая часть табуретки. Модель прекрасно работает, даже если они просто висят в воздухе. Нет смысла, если конечно вы просто моделируете, а не разрабатываете печатную плату, в навешивании на них терминалов питания, каких либо батареек, выключателей и уж тем более регулирующих контрастность потенциометров. Кроме лишних «тормозов» при симуляции вы такими действиями ничего не получите, тем более, что регулировка контрастности в модели ISISпросто не реализована, ведь это чисто цифровая программная модель. Выводы RS (RegisterSelection), RW (Read/Write) и E (Enable), а также выводы 8-ми разрядной шины D0…D7 в модели реализованы в полном объеме и используются при симуляции по прямому назначению в соответствии с даташитом.
Теперь заглянем в окно свойств модели на рисунке 140 справа. Здесь я хотел бы остановиться на двух моментах. В Advanced Properties по умолчанию фигурирует тактовая частота контроллера HD44780 Clock Frequency=250kHz. Это стандартная частота для конкретного контроллера от Hitachi, под которую и заданы все временные задержки модели в ISIS. В данном случае речь идет о внешней тактовой частоте обмена с контроллером, обозначенной в даташите как External clock frequency. Однако не стоит забывать о том, какой именно контроллер стоит в том индикаторе, который вы собираетесь использовать. Так, в частности, не менее популярный клон KS066U от Samsung имеет стандартную ExternalClock=270kHz. Соответственно и выдержки времени при инициализации у него можно сделать несколько меньшими, хотя он и работает со стандартными для HD44780. Даташиты на наиболее распространенные HD44780, KS066U и KБ1013ВГ6 есть во вложении. Последний, выпускаемый Зеленоградским НПО «Ангстрем», используется в российских знакосинтезирующих ЖКИ МЭЛТ. Теперь поясню, почему я остановился подробно на этом моменте. Дело в том, что в моделях на основе LCDALFA.DLL заложен внутренний дебаггер (Рис. 141). В случае значительного отклонения во времени управляющих сигналов или отсутствия требуемой команды в программе инициализации дисплея в логе может появиться «горчичник», предупреждающий об этом, но далеко не всегда. Если с компиляторами с языков высокого уровня, где обычно присутствуют стандартные библиотеки для HD44780, такое случается очень редко, то использование в собственных разработках чужих ассемблерных программ инициализации ЖКИ, а уж тем более готовых HEXпрошивок может надолго загнать вас в тупиковое положение. Причем, это совсем не значит, что прошивки не рабочие. Реальные дисплеи на основе данных контроллеров допускают некоторую вольность в обращении к ним. В результате программа, которая многократно повторялась в железе, работает в симуляторе криво, а иногда и вообще не работает. Но, сами понимаете, что написать такую математическую модель, которая будет автоматически предусматривать, что некто Вася или Петя решил подсократить выдержку при инициализации со стандартных для HD44780 более чем 40ms до 12ms, потому что у него под рукой был русский МЭЛТ-овский дисплей практически невозможно, а уж тем более, если часть команд инициализации вообще отсутствует. К счастью, такие опусы легко распознаются в ISIS, даже при отсутствии исходника программы. До сих пор я скромно умалчивал о возможностях встроенного дебагера ISIS, но настала пора напомнить о нем, тем более, что именно в случае с ЖКИ может оказать существенную помощь.
Итак, сегодня в качестве «подопытного кролика» выступает разработка моего земляка А. Шарыпова почти десятилетней давности, которая, судя по многочисленным обсуждениям на различных форумах, до сей поры не потеряла своей актуальности. Это опять частотомер и опять на PIC16F84A. Статья «Экономичный многофункциональный частотомер» была опубликована в октябрьском номере журнала «Радио» за 2002 год. Чтобы не искать, во вложении имеется DJVU вариант этой статьи. Прошивки с исходниками имеются на FTP сервере журнала ftp://ftp.radio.ru/pub/2002/10/sharyp/ , да и так их по сайтам разложено в изрядном количестве. Я буду рассматривать англоязычный вариант прошивки, но и в русском те же «грабли». Собираем упрощенный вариант схемы и запускаем симуляцию с англоязычной прошивкой counter.hex (Рис. 142). Для сравнения в левом верхнем углу приведен вид дисплея из статьи. Как видим, вроде и работает, но нижняя строка полностью отсутствует. Причем, это наблюдается только в Протеусе, в железе вторая строка выводится. Попробуем разобраться – в чем же тут дело?
Конечно, можно загнать наши сигналы обмена с контроллером дисплея в цифровой график и попытаться проанализировать по нему. Но есть более простой и наглядный метод. Переводим тот TRACE, что изображен на рисунке 141 из режима Warning Only (это те самые «горчичники»-предупреждения) в режим в режим Debug (отладка). Самый быстрый способ сделать это – щелкнуть правой кнопкой мышки по дисплею, выбрать Configure Diagnostics (фиолетовый паук) и перевести флажок для дисплея в нужное положение (Рис. 143).
После этого снова запускаем симуляцию и открываем окно Simulation Log щелчком левой кнопки мышки справа от кнопок управления симуляцией. Результат приведен на рисунке 144. Те команды, которые относятся непосредственно к инициализации дисплея, обведены рамкой. Не правда ли, скромный список по сравнению с тем, что приведен в даташитах на контроллеры для четырехбитного интерфейса. И как у нас может вывестись вторая строка, если двухстрочный режим даже не задан (lines=1). Самое интересное, что в железе это работает!!! Исправно выводится текст во вторую строку. Вот такой «запас прочности» у контроллера HD44780. Только вот вопрос – стоит ли всегда надеяться на этот запас по любимому русскому принципу – «авось пронесет»? Вот и получается, что у автора работает, еще у 11 человек тоже, а тот пресловутый тринадцатый, у которого дисплей из «темного китайского подвала» остается в дураках.
Ну и законный вопрос – а можно ли в Протеусе увидеть нижнюю строку этого девайса? Конечно можно, но без кардинального вмешательства в программу – никак. На этот раз имеется исходник, будем надеяться, что я еще не совсем обленился и забыл ассемблер PIC. Мы не будем затрагивать основную часть программы, достаточно подкорректировать начальную инициализацию, а она выполняется единожды при подаче питания на девайс. Для начала заглянем в даташит. Я использовал русский от Ангстремовского контроллера, а красным цветом указал задержки из фирменного HD44780 (Рис. 145).
Для нас значимыми в этой блок-схеме инициализации являются три задержки в 15 и 5 мс и в 100мкс. При подаче команд в 8-ми разрядном режиме. Напомню также, что команда передается при нулевом состоянии RS(RW у нас и так «заземлен») и фиксируется положительным стробом на линии Eконтроллера ЖКИ. Программы инициализации для различных контроллеров несколько отличаются, но, поскольку модель в Протеусе сделана именно под HD44780, я буду руководствоваться его особенностями. Итак, покопавшись в ассемблерном листинге программы, и покрутив исходный вариант частотомера в ISIS, я обнаружил, что интервалы между стробами передачи команд и так достаточно большие около 90 мкс, что почти втрое превышает требуемые по даташиту. Начальную задержку в 15 мс я не стал делать, но желающие могут сформировать ее по аналогии с 5 мс из пачки следующих друг за другом Pausem. Для задержки в 5 мс используется существующая в программе Pausem. В авторском варианте она используется для формирования дополнительной задержки, необходимой, например, при подаче команды Cursor Home контроллеру ЖКИ. По даташиту она должна составлять 1,52 мс (в программе реально чуть больше – около 1,8 мс). Таким образом, три подряд вызова подпрограммы этой задержки дали мне требуемую около 5,4 мс. Несколько сложнее увеличить время между второй и третьей командой 8-ми разрядного интерфейса. В авторской программе имеется подпрограмма посылки строб-импульса по линии E - Enbl. Саму подпрограмму я использовал для передачи старшего нибла команд 8-ми разрядного интерфейса, а часть ее, поставив дополнительную метку Pause25, как подпрограмму задержки. В результате перед авторской инициализацией дисплея добавлен следующий ассемблерный код:
Код:
; **************** ДОБАВЛЕННЫЙ КОД ИНИЦИАЛИЗАЦИИ ЖКИ            ****************
    movlw   0x30         ; Первая команда установки 8-ми битного интерфейса
    movwf           PortB        ; загружаем команду в порт B
    call  Enbl         ; Отсылаем старший нибл в ЖКИ
    call  Pausem       ; Три задержки Pausem в сумме ~5,5 мсек
    call  Pausem
    call  Pausem
; Порт B уже содержит команду 0x30 и не менялся
    call  Enbl         ; Вторая установка 8-ми битного интерфейса
    call  Pause25      ; В дополнительную задержку, чтобы  было ›100 мксек
; Порт B по прежнему содержит команду 0x30 и не менялся
    call  Enbl         ; Третья установка 8-ми битного интерфейса
    movlw   0x20         ; Первая команда установки 4-ми битного интерфейса
    movwf           PortB        ; загружаем команду в порт B
    call  Enbl         ; Отсылаем старший нибл в ЖКИ
; Теперь мы уже в четырехбитном режиме и посылаем следующие команды
; через подпрограмму LEDcom двумя ниблами
    movlw   0x28       ; Установки 4 битн. интерфейс 2 строки 5х7 точек
    call  LEDcom

Надеюсь, тем, кто занимается программированием PIC-контроллеров на ассемблере, все в нем будет понятно из комментариев. Я постарался внести минимальные изменения в авторский вариант, только с целью добиться полной работоспособности частотомера в ISIS. Конечно, если посидеть подольше над программой можно было сделать и поопрятней и покороче, но я не стал с этим заморачиваться, конечный результат достигнут (Рис. 146).
Как видим, теперь начальная инициализация в логе стала выглядеть более похожей на даташит, а на индикаторе стала отображаться «утерянная» строка. Примеры данного частотомера лежат в папке вложения Sharypov соответственно исходный вариант – папка Eng_var и откорректированный – Eng_var_correct. О том как использовать русскоязычный вариант в Протеусе чуть ниже.
В ходе поисков в интернете примеров для данной темы я натолкнулся на сайте Радиокота еще на один частотомер с ЖКИ на контроллере PIC16F628A. Поскольку там проблема индикации в Протеусе несколько другого плана, давайте рассмотрим и этот вариант.
Вот ссылка на саму тему у Кота: http://www.radiokot.ru/circuit/digital/measure/19/ , а здесь: http://www.radiokot.ru/forum/viewtopic.php?t=12555 страницы форума, посвященные обсуждению этой темы. Естественно, это все первоисточники, но данная схема уже благополучно расползлась по всемирной паутине, и вы можете натолкнуться на нее и в других местах. Автор данного девайса тоже не особенно заморачивался, а просто переделал импортную программу, сделанную под более крутой контроллер на дешевый PIC16F628A. И, конечно же он, и многие другие «коты», самостоятельно попробовали симуляцию программы в Протеусе и тоже поймались на простейшей ошибке. Программа сделана изначально под однострочный LCD 16 символов. Если попытаться воспроизвести ее на однострочной модели LCD в ISIS, то половина информации будет отсутствовать, а на модели 16x2 эта информация появиться во второй строке. Тут все дело в некоторой путанице с адресацией для модели 16x1. Этот вариант дисплея нечто вроде «Оки» в линейке АвтоВАЗа, которую «любовно» именовали выкидышем. Дело в том, что это единственный производимый ЖКИ, у которого адресация в строке сделана не подряд, т.е. с первой по восьмую позицию используются адреса DD RAM 00-07, а с девятой по шестнадцатую – 40-47. Если посмотреть на адресацию двухстрочных ЖКИ, то последние совпадают с первыми восьмью второй строки. Отсюда и появляется информация на двухстрочном дисплее. Но здесь уже промашка допущена непосредственно в модели Протеуса и правится она в течение нескольких секунд. Кстати, на адресации в моделях ЖКИ на основе LCDALFA.DLL следует остановиться несколько подробнее, чтобы в дальнейшем она вас не смущала. Так, например, в даташитах популярных двухстрочных дисплеев 16x2 указаны адреса для первой строки – 00-0F, для второй – 40-4F. Для соответствующей модели LM016L в свойствах прописаны адреса 80-8F и С0-CF соответственно (Рис. 147). В чем тут дело? Если внимательно посмотреть в даташит контроллера HD44780, то можно заметить, что установка старшего бита в единицу является признаком обращения к DDRAM, т.е. области памяти знакомест контроллера. Отнимите его из указанных для модели LM016Lадресов и получится стандартная адресация. Теперь вернемся к однострочному ЖКИ на 16 символов, т.е. модели LM020L. В его свойствах для строки Row 1 прописаны адреса 80-8F, ну или в переводе на обычные – 00-0F (подряд!!!). Это уже явный ляпсус Лабцентра, но помочь этому несложно, если заглянуть в Help модели. А там аглицким языком написано, что если адреса в строке идут не подряд, то они записываются диапазонами через пробел. Берем на вооружение данный факт и исправляем в свойствах LM020Lследующим образом: 80-87 С0-С7. Будьте внимательны! Если указанные диапазоны не совпадут с общим количеством символов в строке, ISIS при запуске симуляции пошлет вас в «эротическое путешествие» фразой красного цвета. В папке RadioKot вложения пример частотомера с однострочным ЖКИ 16х1 и реальной индикацией частоты.
Теперь нам осталось разобраться только с модификацией LCDALFA под кириллицу. Изначально в библиотеке заложена таблица с европейским вариантом знакогенератора, а там, как видно из рисунка 147, русский алфавит отсутствует (эта часть таблицы выделена желтым).
Таблица знакогенератора хранится в файле LCDALFA.DLL в виде точечного BMPрисунка размером 104x176 точек и извлечь ее оттуда и заменить на другую соответствующего размера можно любым редактором ресурсов (Restorator, PEExplorer, ResHacker и т.п.), а отредактировать даже в родном виндозном Paint. Но удобнее это сделать с помощью специализированной утилиты charset.exe, написанной нашим соотечественником, который присутствует на форуме под ником Тень и в данное время является штатным сотрудником Labcenter Electronics. Утилита довольно компактная и находится во вложении, а ее окошко приведено на рисунке 148. Пользоваться ей очень просто, с помощью кнопки Open LCDALFA.DLL (1) открываете исходную DLL, если есть необходимость – сохраняете исходный рисунок BMPcпомощью кнопки Save .BMP (4). Затем подгружаете картинку с русским шрифтом с помощью кнопки Open .BMP (3) и сохраняете русифицированную DLL с помощью кнопки Save LCDALFA.DLL (2).
На рисунке в окне программы уже загруженная таблица с русскими символами. Кроме того, можно модифицировать любой символ по своему усмотрению, выбрав его с помощью курсора (показан в левом верхнем углу таблицы). Курсор перемещается с помощью кнопок со стрелками, а выбранный символ отображается в поле модификации. Закрашенные пиксели в нем выглядят утопленными. На днях я проверил успешную работу утилиты на версии Протеуса 7.8. Единственный нюанс, под Windows 7 мне пришлось запустить ее от имени администратора. Ну и еще одна рекомендация – лучше проделать эту операцию в отдельной папке, а модифицированную DLLсохранить в папке MODELS под измененным именем, например, LCDALFARUS.DLL. Тогда можно использовать и тот и другой варианты, либо просто изменив MODDLLв свойствах модели LCDтекущего проекта в режиме Editas text, либо продублировав все имеющиеся модели на базе HD44780 с добавкой RUSна конце и заменив для этих вариантов значение MODDLL на LCDALFARUS.DLL. В последнем случае, уже добавляя модель LCDв проект, выбираем нужный, например, LM016 – западный, LM016RUS - с кириллицей. Готовый вариант LCDALFARUS.DLL для версии 7.8 во вложении в примере Sharypov\Rus_var_correct.
На чем еще хотелось бы заострить ваше внимание. Некоторых смущает, что отсутствуют «хвосты» у символов русского шрифта. Например, если вы будете выводить на дисплей слово «Щука», то увидите «Шука». Тут просто уместно вспомнить, что стандартный вывод для дисплея по умолчанию 5х8 точек (при инициализации в 4-х битном режиме это команда 0x28). Переведите дисплей при инициализации в режим 5х10 (заменив командой 0x2C) и «хвост отрастет».
Из замеченных «глюков» для моделей на основе LCDALFA – это неадекватный по сравнению с даташитом сдвиг экрана аппаратной командой. Так что если планируете использовать дисплей для организации бегущей строки, то лучше это сделать программно или отлаживать сразу в железе, чтоб не напрягать себе мозги неожиданными «заморочками».
Ну, и напоследок немного о модификации. Нет, например, в библиотеках самой дешевой модели 2х8, а хочется иметь. Все просто, разбиваем исходную LM016. Для графики есть одна особенность – маркер ORIGIN находится в центре, поэтому сдвигать (подрезать) экран и «базу» надо будет с двух сторон (Рис. 149).
Как ставить «фальшивку» маркера, вы уже знаете из предыдущего материала, и нетрудно определить, что ширина внутреннего зеленого экрана составляет 1800 пикселей (16 символов плюс два зазора по краям шириною как символ). Дальнейшее – арифметика для первоклассника. Изменить ширину придется как для основного изображения модели, так и символов потушенного и светящегося экрана, задав им соответствующие имена. Ну а при последующем Make Device необходимо на первой вкладке сделать ссылку на эти имена символов в строке Symbol Name Stem, а на третьей подкорректировать значение NUMCOLS (количество колонок) с 16 на 8 и задать новые конечные адреса для первой ROW1 и второй ROW2 строк. Кстати, можно и вообще не править графику, а поправить только адреса и количество колонок, ну и, конечно же, имя модели, но при этом пустые зазоры по краям экрана у вас будут широкими. Мы уже так часто проделывали подобные операции, что я, пожалуй, предоставлю вам самостоятельно поэкспериментировать с данными моделями, чтобы не надоедать лишними нудными подробностями.
Последний комментарий касается четырехстрочных моделей 4х40, которые содержат два контроллера HD44780. В данном случае создается дополнительно Schematic модель.. На дочернем листе модели, с которого компилируется MDF, формируется схема из двух контроллеров, у которых в свойствах присваиваются разные Controller ID (Рис. 150). Все выводы, кроме E объединяются, а их терминалам присваиваются имена E1 и E2. Модели контроллеров находятся в библиотеке LCD Controllers. Соответственно и модель получается смешанная. Хотя она и показывается в библиотеке как Schematic, потому что имеет MDF и в свойствах ссылку на него, но на деле все равно это программная VSM модель, потому что симуляция основана на LCDALFA.DLL.
Дальше пойдет более интересный материал по моделям графических дисплеев, вот там и остановимся на тонкостях, тем более, что приемы редактирования будут похожими, а материал более актуален. Символьные же модели постепенно сдают позиции более популярным графическим ЖК индикаторам.
Рисунки 140,141,142.
Рисункки 143, 144,145.
Рисунки 146,147,148.
Рисунки 149, 150.


Миниатюры:
Нажмите на изображение для увеличения
Название: Pic_140.gif
Просмотров: 675
Размер:	47.4 Кб
ID:	24805   Нажмите на изображение для увеличения
Название: Pic_141.gif
Просмотров: 632
Размер:	28.8 Кб
ID:	24806   Нажмите на изображение для увеличения
Название: Pic_142.gif
Просмотров: 672
Размер:	32.1 Кб
ID:	24807  

Нажмите на изображение для увеличения
Название: Pic_143.gif
Просмотров: 409
Размер:	16.8 Кб
ID:	24808   Нажмите на изображение для увеличения
Название: Pic_144.gif
Просмотров: 483
Размер:	28.3 Кб
ID:	24809   Нажмите на изображение для увеличения
Название: Pic_145.gif
Просмотров: 562
Размер:	53.2 Кб
ID:	24810  

Нажмите на изображение для увеличения
Название: Pic_146.gif
Просмотров: 500
Размер:	19.2 Кб
ID:	24811   Нажмите на изображение для увеличения
Название: Pic_147.gif
Просмотров: 475
Размер:	88.9 Кб
ID:	24812   Нажмите на изображение для увеличения
Название: Pic_148.gif
Просмотров: 393
Размер:	12.3 Кб
ID:	24813  

Нажмите на изображение для увеличения
Название: Pic_149.gif
Просмотров: 497
Размер:	14.7 Кб
ID:	24814   Нажмите на изображение для увеличения
Название: Pic_150.gif
Просмотров: 344
Размер:	12.6 Кб
ID:	24815  
Вложения:
Тип файла: rar 8_14.rar (3.09 Мб, 1309 просмотров)

Последний раз редактировалось Halex07; 10.08.2011 в 22:56.
Halex07 вне форума  
Эти 12 пользователя(ей) сказали Спасибо Halex07 за это сообщение:
aleksa-yar (17.08.2011), danilych2 (11.06.2014), Hostvind (29.01.2012), KawaBaz (04.01.2017), kuksin (19.10.2011), malyshevsergey (11.08.2011), parcshin (05.01.2012), ReLe1 (14.08.2011), skver (27.09.2011), Traan (16.09.2013), ДимаК (18.08.2011)