Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пример кода для atmega328 + LCD
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
POLL
Добрый день!

Подскажите, пожалуйста, простой пример кода на Си по работе с текстовым экраном 16*2, в 4bit режиме.

Соединения:
DB4 -> PORTB0
DB5 -> PORTB1
DB6 -> PORTB2
DB7 -> PORTB3

RS -> PORTB4
R/W -> PORTB5

Enable -> PORTD7


Перерыл в сети кучу примеров - ну все с ошибками в коде, у кого #define F_CPU не прописан, у кого синтаксические ошибки...
Делаю все в AVR Studio. Собственно, для OLED индикатора WEH001602 пишу инициализацию, пока ни в какую, то вроде зафурычит, а потом хоп и погаснет или выведет не на той строке или ни в том месте или закарючки пойдут...

hd44780
В CvAVR есть встроенная библиотека. Работает. Пользовался лично.
Genadi Zawidowski
Вот тут http://www.cqham.ru/forum/showthread.php?t=9688 лежит проект, в котором я победил проблемы WEH02002. Файл HD44780.C
НА мой взгляд, проблема вот в чём:
При подключени по 4-м битам надо обеспечить корректное переключение в 4 бита и после включения питания (легко) и после ресета процессора (делается трюком из трёх команд, которые переводят в 8 бит, потом обратно в 4).
Так вот - этот трюк с WEH* (с его контроллером) не проходит, так как в ранее игнорировавшихся битах младшего байта команды теперь другая информация. Как я с этим разобрался - смотрите в исходник. Коротко - по 4-х битному интерфейсу устанавливаю позицию курсора, а потом считываю её (ненулевая и с разными старшим/младшим нибблами). Если считалось - индикатор в 4-х битном режиме и ничего делать не надо. Если не считалось - инициализируем.
Правда, есть ещё состояния, когда процессор сбросили в момент чтения первого из двух нибблов статуса - но это я не проверял (да и иделаьнее решить ключём в питании индикатора).
Или перейти на SPI интерфейс - с WEH это можно сделать.
http://www.cqham.ru/forum/showthread.php?t=18954
POLL
Цитата(Genadi Zawidowski @ Dec 15 2011, 21:22) *
Вот тут http://www.cqham.ru/forum/showthread.php?t=9688 лежит проект, в котором я победил проблемы WEH02002. Файл HD44780.C
НА мой взгляд, проблема вот в чём...



У этих дисплеев на контроллере WS0010 немного другая инициализация в 4битном режиме.
Цитата
Repeated procedures for an 4-bit bus interface
Noise causing transfer mismatch between the four upper and lower bits can be corrected by a reset triggered by consecutively writing a ”0000” instruction five times. The next transfer starts from the lower four bits and then first instruction ”Function set” can be executed normally.
Please insert the synchronization function in the head of procedures. The repeated procedures are show as follows


Т.е. после включения питания нужно выждать 500ms и затем послать 5 раз ”0000” и уже затем делать ”Function Set” ...
Об этом написано в самом конце даташита на WS0010
Genadi Zawidowski
А даташит я не дочитал до конца... не подумал, что после уже одного приведённого примера инициализации дисплея (тоже, начинающегося с pwer-on) будет ещё один... альтернативный.
Что делать, если дисплей уже включался, а процессор пересбросился?
команда 0x00... интересно, что будет, если дисплей, находящийся в 4 битном режиме получает команду всю из нулей? Вроде недокументировано...
POOL, Вам помог этот последний пункт даташита?
POLL
Цитата(Genadi Zawidowski @ Dec 16 2011, 00:30) *
POOL, Вам помог этот последний пункт даташита?


Пока не могу сказать, я еще не написал программку.
Но могу сказать, что по быстрому в либе LiquidCrystal правил начало инициализации c 0x03 на 0x00 - дисплей включился и заработал.
Другое дело что со временем проявлялись различные глюки. Вот и пробую с нуля написать примитивный пример без наворотов и посмотреть что выйдет.
Genadi Zawidowski
Мне хотелось универсальный код получить, чтобы и классические HD44780 работали и на OLED контроллере. Как мне кажется, получилось.
Как будете тестировать, проверьте пожалуйста работоспособность при сбросе процессора без выключения питания индикатора.
Вы просто так уверенно посоветовли, я подумал что уже проверили. И конечно, не сильно надеюсь, но если проверите - с перезапуском после незавершённых циклов обмена (один полубайт считан и один полубайт передан).
ILYAUL
Он у Вас случаем не из этих партий

http://electronix.ru/forum/index.php?showt...592&hl=OLED
bolden
Взято отсюда : http://www.gaw.ru/html.cgi/txt/lcd/chips/hd44780/start.htm

"Несколько слов о процессе инициализации ЖКИ-модуля. Производитель контроллера рекомендует выполнять следующую последовательность действий для инициализации. Выдержать паузу не менее 15 мс между установлением рабочего напряжения питания (> 4,5 В) и выполнением каких-либо операций с контроллером. Первой операцией выполнить команду, выбирающую разрядность шины (это должна быть команда $30 независимо от того, какой разрядности интерфейс вы собираетесь использовать в дальнейшем), причем перед выполнением этой операции не проверять значение флага BF. Далее опять выдержать паузу не менее 4,1 мс и повторить команду выбора разрядности шины, причем перед подачей команды вновь не производить проверку флага BF. Следующим шагом необходимо вновь выдержать паузу, на этот раз 100 мкс, и в третий раз повторить команду установления разрядности шины, вновь без проверки BF. Эти три операции являются инициализирующими и призваны вывести контроллер в исходный режим работы (то есть перевести в режим работы с 8-ми разрядной шиной) из любого состояния. Следом за ними нормальным порядком (без выдерживания пауз, но с проверкой флага BF) выполняется инициализация режимов работы с выдачей инициализирующей последовательности, аналогичной указанной в таблице 7 (содержащей в том числе команду выбора необходимой разрядности шины).

Необходимо помнить, что когда Вы объявляете режим работы с 4-х разрядной шиной, то есть выдаете команду $20, то делаете это обычно из 8-ми разрядного режима, который устанавливается автоматически после подачи напряжения питания, а значит вы не сможете адекватно объявить необходимое значение флагов N и F, располагающихся в младшей тетраде команды установки разрядности шины. Поэтому команду необходимо повторить в уже установившемся 4-х разрядном режиме путем последовательной передачи двух тетрад, то есть для 4-х разрядного режима образом"

Алгоритм спользовал как для 16x4 так и для 20x4, проблем не было


Чуть не забыл иногда были глюки, но помогла установка небольших задержек между переключением RW, и E сигнала и DATA сигналов.
POLL
Цитата(bolden @ Dec 18 2011, 18:59) *


Ок, спасибо за ссылку, почитаю, глядишь чего не упускаю из виду.
SeregaB
Цитата(Genadi Zawidowski @ Dec 16 2011, 18:10) *
Как будете тестировать, проверьте пожалуйста работоспособность при сбросе процессора без выключения питания индикатора.
Вы просто так уверенно посоветовли, я подумал что уже проверили. И конечно, не сильно надеюсь, но если проверите - с перезапуском после незавершённых циклов обмена (один полубайт считан и один полубайт передан).

Проверил инициализацию пятью нулевыми командами впереди (индикатор WEH000802, 4-х бит режим).
При сбросе без выключения питания - работает нормально.
Перезапуск после незавершенных циклов обмена - работает нормально.
Небольшой отчетик - здесь.

Цитата(bolden @ Dec 18 2011, 18:59) *
Взято отсюда : http://www.gaw.ru/html.cgi/txt/lcd/chips/hd44780/start.htm

Алгоритм спользовал как для 16x4 так и для 20x4, проблем не было


Абсолютно бесполезная ссылка для контроллера WS0010 в 4-х битном режиме (индикаторы WEH00xxxx).
Правильно делать как написал POLL здесь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.