Работа с индикаторами WEG005016 (контроллер WS0010)

Купил для своих поделок индикатор здесь. Красивый, зелененький :).

Включил сначала в текстовом режиме (как описано в этой заметке). Контроллеры-то одинаковые. Получился текстовый индикатор размерами 10х2.

Конечно, это корявый режим, из-за того что нет межсимвольных интервалов. Но, может, на какой-нибудь крайний случай и сойдет.

Потом переключил в графический режим. Простенькую тестовую картинку см. вверху топика.

Конечно, сразу полезли особенности работы.
1. Переключение в графический режим происходило нормально, а из графического в «текстовый» — очень коряво. В результате долгих боданий нашел правильную последовательность!!! Когда-то, давным-давно, когда ДШ еще печатали на бумаге, в каком-то из ДШ на HD44780 я читал, что переключение режимов надо делать только при выключенном экране. Попробовал — получилось.
Переключение в графический режим

    WS0010_Command(0x08);//выключили экран
    WS0010_Command(0x1F);//переключение в графику
    WS0010_Command(0x01);//очистили от мусора ОЗУ
    WS0010_Command(0x08|0x04);//включили экран

Переключение в текстовый режим

    WS0010_Command(0x08);//выключили экран
    WS0010_Command(0x17);//переключение в текстовый режим
    WS0010_Command(0x01);//очистили от мусора ОЗУ
    WS0010_Command(0x04 | 0x08);//включили экран

Так можно переключаться туда-сюда сколько угодно.
Эта особенность, почему-то не упоминается в DS WS0010 совсем. :(

2. Адресация строк сделана необычно. (Эта особенность в ДШ есть, но кто-же читает ДШ!!!)


    WS0010_Command(0x40 + 0);//установка первой строки
    WS0010_Command(0x80 + 0);//установка в начало строки

    WS0010_Command(0x40 + 1);//установка второй строки
    WS0010_Command(0x80 + 0);//установка в начало строки


WS0010_Command это просто функция записи команды с ожиданием готовности.

UpDate 10.07.2012

А вот картинки ради чего все затевалось. :)
Циферки двумя различными шрифтами. В верхней строке шрифт 5х8 в нижней 5х7 точек. Шрифты будут потом допилены для пущей красивости. :)

Циферки шрифтом 9х16 (узкий, но зато влезает больше символов).

Циферки шрифтом 11х16 (широкий, влезает меньше символов, но, ИМХО, видно лучше).


Т.о. при работе с графическим индикатором можно получить разные символьные «разрешения». Пока мне требуется 8символов в 2 строках и 4 символа в одной строке крупно.
Теоретически можно попробовать сделать 3 строки по 10 символов (матрица знакогенератора 3х5 точек). Но, думаю, что будет мелковато и слабочитаемо при такой матрице символа.

UpDate 28.03.2013

Прицепил тестовый проект к статье (ИАР 6.х + STM32F103R).
Предупреждаю сразу — это был только тест возможностей индикатора по выводу текста в графическом режиме. ПисАл только под себя, «вылизывание» кода работы с индикатором происходило позже, в составе всего прибора. Поэтому и не хотел выкладывать сюда. Код ПОЛНОСТЬЮ работоспособен.

UpDate 18.04.2013

Камрад Gudd-Head обнаружил особенность работы контроллера WS0010 в четырехбитном режиме. Читать здесь
  • +4
  • 09 июля 2012, 12:09
  • SeregaB
  • 1
Файлы в топике: WS0010.ZIP

Комментарии (44)

RSS свернуть / развернуть
Когда-то, давным-давно, когда ДШ еще печатали на бумаге
я до сих пор печатаю выборочно и подшиваю ;) как то с бумаги читать приятнее и заметки делать удобно
+3
  • avatar
  • xar
  • 09 июля 2012, 17:00
И я тоже. Особенно помогает, когда нужно разобраться с чем-то совсем новым.
Но речь шла про то время, когда программу для КР1816ВЕ31 я писАл на ДВК, пользуясь самописным кросс ассеблером. :) РС была одна на отдел, закрывалась на замок и опечатывалась в конце рабочего дня. Да и та с EGA. А в HD44780 в принципе не было русской кодировке и японо-корейцы, похоже, даже не подозревали, что есть на карте «Большая Раша».
0
Добавил картинки с выводом текста в графическом режиме.
0
а по SPI не пробовали запустить, больно вкусно выглядит затея
я похожий мучаю просто, в ДШ инициализация по SPI не описана, а надо(
0
Еще не пробовал включать по SPI. Но у моего индикатора (внешним осмотром) не разведен 16 пин. Там должен оказаться CSB. Чуть позже попробую связаться с Винстаром, может чего присоветуют.
0
> я похожий мучаю просто
Его мучать не надо. :) Он нормально сам работает.
> в ДШ инициализация по SPI не описана,
Дык в чем проблема-то. Если доработаешь напильником как здесь рассказано, просто подавай команды, какие тебе нужны и все. Если сосем непонятно — делай в точности как инициализация в 8-ми битном режиме, только передачу делай по SPI. Там основные «пляски с бубном» вокруг включения в 4-битном режиме. Остальное — все одинаково.
0
он с самого начала, даже при допилке,
ногу SDO поднимает и на запрос бизи флага не реагирует
0
А индикатор то какой? Если WEG005016 или WEH000802 может поделишься, как его в SPI переключить?
0
у меня WEG010016EG)
0
посмотри куда ведет перемычка JCS на разъеме одним концом на Е(№6) в стандартной конфигурации а другим — в CS
0
насколько я понимаю, вот по такой блок-схеме должно все работать.

Попробуй записать адрес типа 0х00 а потом читать. Может тогда чего видно будет.
0
именно она и не работает, на 4 бита тоже инициализация не работает
адрес не читает, бизи не выставляет
0
> на 4 бита тоже инициализация не работает
Здесь ты погорячился. :) 4-х битная инициализация работает. Если посмотришь — на фотке видно, что индикатор подключен в 4-х битном режиме (D3..D0 не присоединены). Подробно писАл здесь, см.особенность N1. Контроллеры у WEH и WEG абсолютно одинаковые. По этой ссылке
www.cqham.ru/forum/attachment.php?attachmentid=95587&d=1320837463 есть ДШ на сам контроллер. Должно помочь.
0
я имел в виду алгоритм от 4х битной не подходит для SPI
чат устроили)
0
c ST7920 имелась проблема подобная. хочу сказать что на некоторых этапах начальной инициализации бизи не работала в принципе.
0
В описании написано «8-BIT mode(Not available for serial mode)»
как переделку на SPI/контрастность делать — ищи по интернетам, инициализация описана не вся
совсем не понимаю, зачем делать такие описания((
0
Во, нашел чего у китайцев на форуме. WEH001602BLPP5N00001 SPI Mode (hardware settings?) Может поможет!
0
так и не раскурил, как его запустить в режиме spi, на сколько понял, в нем он управляется 10 битными словами, так что первые 2 бита посылки приходиться формировать программно, что геморно
0
Здесь (см. «Особенность N6») я писАл, что есть разные модификации плат. На некоторых можно достаточно легко включить SPI. На некоторых — нет. Так вот, ко мне до сих пор приезжают графические индикаторы со старой платой. Включить и попробовать SPI не могу.
Да, в общем-то, и не очень хочется. В целевом устройстве используются ЖКИ 8х2, или символьный OLED 8х2, или графический OLED 50х16. На выбор заказчика. Поэтому в SPI потребности пока не возникало (из-за желаемой обратной совместимости платы с обычным ЖКИ).
0
еще и нога резет? а почему в коде ею не дергают
0
А код можно увидеть целиком?
0
  • avatar
  • sherr
  • 30 октября 2012, 21:50
Код чего интересует?
0
Инициализации(графический режим) и постановки точки в нужной позиции, дальше как-нибудь
сам.
0
Инициализации(графический режим) и постановки точки в нужной позиции, дальше как-нибудь
сам.
Я бы рекомендовал сначала воскурить DS на индикатор. Поскольку позиционируется не точка, а столбик из восьми пикселей.
Еще почитать как работает контроллер HD44780.
Почитать можно здесь, здесь и здесь. В сети так просто завались примеров и примерчиков.
Я, лично, пользуюсь драйвером от Author: Stanimir Bonev. Идут в примерах в комплекте к IAR. У меня лежат в (директория установки ИАР)\arm\examples\ST\STM32F10x\IAR-STM32-SK\LCD_Demo\modules.

06.10.2012 01:50 22 963 drv_hd44780.c
06.10.2012 01:50 3 541 drv_hd44780.h
06.10.2012 01:50 1 781 drv_hd44780_cnfg.h
06.10.2012 01:50 4 826 drv_hd44780_l.c
06.10.2012 01:50 1 592 drv_hd44780_l.h

Немного рихтуешь как я писАл здесь и в этой заметочке.

Если не лень копаться в чужих исходниках — мой тестовый проект для ИАР. Камень — STM32F103R, интерфейс индикатора 4-х битный.
0
Блин, у меня какой-то глюк вылезает в графическом режиме по 4-битной шине WEG005016.
Если 5 раз заслать в дисплей «0000» (в режиме печати данных, не команд!), пятая посылка исчезает и всё сбивается.
Подробнее: radiokot.ru/forum/viewtopic.php?p=1622546#p1622546
0
Больше всего похоже на пропадание одного из нибблов. На картинке «Циферки шрифтом 11х16» хорошо видно, что между цифрами 1 и 2 больше чем пять нулевых полубайт. Я тоже использую 4-х битный режим.
СтОит поискать глюк в программе.
0
Понятное дело, что пропадает один из нибблов. Но! Его пропадание зависит от выдаваемой информации!
Специально выводил подряд 5 байт, игрался комбинацией нулевых и ненулевых нибблов. Результаты интересные и незакономерные — получалось пропустить целый байт!
0
Дисплей Rev.0
0
Понятное дело, что пропадает один из нибблов. Но! Его пропадание зависит от выдаваемой информации!
См. комментарий выше.
На картинке «Циферки шрифтом 11х16» хорошо видно, что между цифрами 1 и 2 больше чем пять нулевых полубайт. Я тоже использую 4-х битный режим.
СтОит поискать глюк в программе.
Я выводил, в том числе, символ пробел. В котором все нибблы нулевые. Проблем не замечено.
Проверь времянку осцилом. И сопельки между выводами и дорожками. Больше ничего умного посоветовать не могу. :(
Кстати, ноги могут расти отсюда, рассинхронизация старшего-младшего полубайта.

Специально выводил подряд 5 байт,
Если 5 раз заслать в дисплей «0000» (в режиме печати данных, не команд!), пятая посылка исчезает и всё сбивается.
Так байт или нибблов?
Если полубайт, то совсем непонятно, как тебе это удается. Четыре — понимаю, шесть — тоже, пять — не понимаю.
Дисплей Rev.0
Тоже вроде «0». Точно не скажу, все устройства разъехались по заказчикам. Но точно помню, что та ревизия, в которой нельзя переключить в SPI режим.
0
Смысл смотреть времянку и искать сопли, если без идущих подряд пробелов всё выводится нормально? Задержки ставил, не помогло.
Я в пяти подаваемых байтах игрался с нибблами — комбинацией нулевых и ненулевых. Т.е. просто менял нолики на единички, и в зависимости от этого изображение либо сбивалось, либо не сбивалось, либо не сбивалось, но попадал один нулевой байт (8 погашенных точек).
0
Смысл смотреть времянку и искать сопли, если без идущих подряд пробелов всё выводится нормально?
Смысл в том, что индикатор работает в строгом соответствии с ДШ. А в твоей проге или железе явно присутствуют проблемы. Ты их преподносишь как косяки контроллера индикатора. А их (косяков) там нет.
Сколько нулевых полубайт (четное число) не передавай в режиме посылки данных все выводится на экран нормально. Проверено на трех желтых и одном зеленом индикаторе. Сейчас активно трудятся в разных местах и нареканий на сбои — нет. Покупались в разное время, хотя и в одном месте.
Если тебя не убедила картинка «Циферки шрифтом 11х16», то на этой картинке явно видны пробелы между символами. Т.е. количество подряд идущих нулевых нибблов достигает 12 и даже 14. :)
0
Проблема даже в текстовом режиме =( Причём количество нулевых нибблов зависит от того, каким был первый нулевой — старшим или младшим.
Большие цифры вы печатаете сначала верхнюю половину, потом нижнюю?
0
Проблема даже в текстовом режиме =(
Вот теперь можно с вероятностью 101% :) утверждать, что проблемы либо в Вашем софте либо в подключении железки.

Большие цифры вы печатаете сначала верхнюю половину, потом нижнюю?
Я уже не помню. НаписАл и забыл. Скорее всего — да. Если очень интересно —
в этом посте я давал ссылку на исходники.
0
Вообще бред какой-то.
Подключил другой дисплей (зелёный, до этого был оранжевый) — та же фигня.
Тогда подключил вообще к другой плате. До этого была самодельная с AVR8, сейчас подключил к заводской отладочной С8051F, благо там отладчик есть.
Соответственно, пришлось заново написать код.
В ходе отладки обнаружилось, что в какой-то момент дисплей начинает тактироваться по (восходящему) фронту «Е», а не по (нисходящему) спаду.
0
Команда очистки дисплея выполняется по спаду, печать «символов» — по фронту Е.
0
Большие цифры вы печатаете сначала верхнюю половину, потом нижнюю?
Прицепил исходники прямо к топику.
0
В общем, разобрался я в чём дело после внимательного изучения ДШ на WS0010.
Изначально я решил сэкономить ногу МК и посадил вывод RW дисплея на землю, т.к. не собирался читать Busy Flag (сделать через задержки), адрес или данные.
Так прокатывало в 8-битном режиме. Так прокатывало и в 4-битном текстовом режиме. Так прокатывало в 4-битном режиме когда я выводил (рисовал) символы без пробелов, или рисовал сплошную линию (змейку). Но как только у меня появилось много нулевых идущих подряд нибблов, начались косяки.
В ДШ про 4-битный режим обратил внимание, что The Busy Flag must be checked после передачи каждого байта.
Интересно было бы проверить на ваших дисплеях.
Не знаю, обязательно ли это для 44780. Если необязательно, то можно отметить это в статье.
0
В общем, разобрался я в чём дело после внимательного изучения ДШ на WS0010.
В ДШ про 4-битный режим обратил внимание, что The Busy Flag must be checked после передачи каждого байта.
Да-а-а. Прикольно получается. Посмотрел родной мануал на HD44780U — там слово «должно» относится к двум циклам передачи в четырехбитном режиме.
Т.е. не обязательно проверять Busy Flag, но при чтении BF обязательно вычитывать оба полубайта.

Интересно было бы проверить на ваших дисплеях.
Когда совсем нечем будет заняться — обязательно проверю. :) Просто сейчас активно ищется замена этим ОЛЕДам, поскольку маленькие (50х16) экранчики стремительно исчезли из продаж и где брать в следующую партию — непонятно.
0
Вот и я про то же — во многих конструкциях на 44780 в 4-х битном режиме вывод R/W просто посажен на землю. Но опять же, они работают в текстовом режиме и вряд ли кто-то часто выводит текст с идущими подряд буквами с кодом «0b00000000».

А с дисплеями да, беда. Надо заказывать, срок поставки 7-9 недель =(
0
А мне так вовсе отказываются штучные количества продавать (спрашивал про поставку 10 штук). :(
СООБЩЕНИЕ ИЗ ТЕРРЫ
Добрый день!
К сожалению, предложений на поставку WEG005016AGPP5N00000 нет
С уважением, Нуждина Елена,
менеджер по продажам ООО«Терраэлектроника»


А с дисплеями да, беда. Надо заказывать, срок поставки 7-9 недель =(
А где можно заказать 10 штучек?
0
Насчёт 10 штук не знаю, по попробуйте в ЭФО: www.efo.ru/ они официальный (?) поставщик Winstar
Всё дело в том, что это сам Винстар может отказываться запускать производство ради нескольких штук.
0
Добрый день!
У меня сложилось впечатление, что в исходниках неточность.
В архиве, прикрепленном в конце статьи, в файле: ../Modules/drv_hd44780_l.c, функция HD44780RdIO, строка 175:

****HD44780RdIO****
171 HD44780SetRW(1);
172 // Read Data
173 HD44780SetE(1);
174 HD44780_BUS_DLY();
175 Data = (GPIO_ReadInputData(LCD_DATA_PORT)>>LCD_DATA_SHIFT) & 0xF;
176 HD44780SetE(0);
177 // Clock E
178 return Data;


Функция HD44780RdIO возвращает в переменной Data значащие только младшие четыре бита, остальные биты «скрываются» маской 0xF.
Функция HD44780RdIO, в частноси, вызывается из функции HD44780RdStatus: ../Modules/drv_hd44780.c, строки 177-180:

****HD44780RdStatus****
172 Int8U HD44780RdStatus (void)
173 {
174 Int8U Data;
175 HD44780SetRS(0);
176 #if HD44780_BUS_WIDTH == 8
177 Data = HD44780RdIO();
178 #else
179 Data = (HD44780RdIO() << 4) & 0xF0;
180 Data |= HD44780RdIO() & 0x0F;
181 #endif
182 return Data;
183 }

И в конце концов функция HD44780RdStatus вызывается из функции HD44780_BusyCheck: ../Modules/drv_hd44780.c, строка 268 — проверка флага занятости. Проверяется только старший бит, т.е. номер 7: (277 if ((AddHold & HD44780_STATUS_BUSY_MASK) == 0), где HD44780_STATUS_BUSY_MASK = 0x80).
Если я правильно понимаю, то проверка старшего бита возможна только в четырехбитном режиме подключения, т.к. в функции HD44780RdStatus сначала считываются старшие четыре бита шины, сдвигают их влево на четыре позиции (Data = (179 HD44780RdIO() << 4) & 0xF0;), потом идет вторичное считывание младших четырех бит шины и окончательное формирование байта (180 Data |= HD44780RdIO() & 0x0F;).
В восьмибитном режиме произойдет однократное считывание байта шины (177 Data = HD44780RdIO();), и в нем старшие четыре бита всегда будут нулями (175 Data = (GPIO_ReadInputData(LCD_DATA_PORT)>>LCD_DATA_SHIFT) & 0xF;). Т.е. такая проверка всегда будет давать флаг готовности устройства (т.е. седьмой бит всегда будет равен нулю).

На мой взгляд, в функции HD44780RdIO необходимо проверять в каком режиме подключен дисплей, и для восьмибитного подключения не обнулять старшие четыре бита, типа того:

175 #if HD44780_BUS_WIDTH == 8
176 Data = (GPIO_ReadInputData(LCD_DATA_PORT)>>LCD_DATA_SHIFT);
177 #else
178 Data = (GPIO_ReadInputData(LCD_DATA_PORT)>>LCD_DATA_SHIFT) & 0xF;
179 #endif
0
Похоже на правду (хотя весь код я не курил). Только я бы сделал иначе.
Data = (GPIO_ReadInputData(LCD_DATA_PORT)>>LCD_DATA_SHIFT) & LCD_DATA_MASK;

LCD_DATA_MASK определяется как 0x0F или 0xFF в зависимости от дефайна HD44780_BUS_WIDTH.
0
И еще такой момент: в файле ../Modules/drv_hd44780.c, функция HD44780_StrShow, строка:
821 else if ((Y == 2) && DDRamAdd < HD44780_MIN_LINE2_ADD)
Скорее всего должна выглядеть так:
821 else if ((Y == 2) && DDRamAdd > HD44780_MAX_LINE2_ADD)

Иначе посредством функции HD44780_StrShow во второй строке экрана отображается только один символ (последний из вводимой символьной строки) в первой позиции строки.

После некоторой доработки исходников стало возможным проводить инициализацию дисплея на базе контроллера HD44780 в CVAVR (без подключения закрытой библиотеки alcd.lib) с симуляцией в Proteus, а после отладки в железо шить код с инициализацией контроллера WS0010 (достаточно раскомментировать один дефайн: #define HD44780_WEH0802).
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.