Сопроцессор ввода — вывода

В известном русском руководстве по экранчикам на базе HD44780 всю последнюю страницу занимает назойливая реклама чудо-микросхемы CE110, которая призвана решить все проблемы начинающих, или чрезмерно занятых экрановодов.

Реклама есть, да вот саму микросхему найти не удалось. А ведь до чего хорошая идея — иметь внешнее устройство, которое показывает само по себе — налицо экономия ножек основного процессора, упрощение разводки платы, экономия места во флешке, в памяти, экономия вычислительной мощности. Да и проще и лаконичнее выглядит такое решение. Уговорили, будем делать.

Из тини 2313. Кроме самого экранчика и тиньки нужны будут диоды, по количеству строк в матричной клавиатуре, чтобы поддерживать множественные нажатия, транзистор, чтобы управлять подсветкой экрана, несколько резисторов и конденсаторов. Кварц, конечно же кварц! Если общение с основным процессором будет идти через последовательный порт с высокими скоростями, нужен кварц, потому что изменения частоты встроенного генератора на 5-10% в зависимости от температуры, я видел своими глазами.

Вот и вся схема. Лаконично вышло, и здесь особо нечего даже комментировать. Разве что вот такое уточнение: изображенная схема позволяет подключать сопроцессор, используя UART и I2C. Если отказаться от управления подсветкой экрана, и пересадить линию RS дисплея, и первую строку клавиатуры на 16 ножку процессора, то для коммуникации с сопроцессором можно будет использовать также и SPI. Это на случай, если у кого нет UART и I2C.
Если пожертвовать кварцем, то может заглючить (а может и не заглючить) UART, но при этом освободятся две ножки, на которые можно будет повесить более широкую клавиатуру, или бибикалку, или ещё какую радость.

Вся разводка на один слой не влезла, а второй слой делать было неохота, пришлось сделать три перемычки проводком (фууу какой колхоз, неужто постараться по одному все раскидать низя было? ;) Прим DI HALT), вот они, на монтажке синим нарисованы. Слева — восьмиконтактный соединитель, которым сопроцессор подключается к материнскому устройству. Первые шесть контактов — стандартный ISP соединитель, разводку которого можно подглядеть в хелпе от Студии, «AVR Tools User Guide», а нижние две ножки — выводы UART. Через этот соединитель подаётся питание на сопроцессор, и происходит обмен данными, через него же сопроцессор программируется после сборки.

Вид сопроцессора, приклеенного позади экранчика 16×4.

Программа сопроцессора также проста и незатейлива. Инициализируем экранчик, и ждём данные. В настоящий момент в наличии имеется только UART (38400,8n1) версия прошивки, если кому-нибудь нужна USRT, I2C или SPI версии — вы можете изготовить их самостоятельно, доработав напильником прилагающийся исходный текст программы.

Данные от хоста принимаются, используя прерывание, и укладываются в 64-х байтный кольцевой буфер, откуда их извлекает основной цикл прораммы, и отправляет в экранчик по мере готовности. Работать с получившимся сопроцессором просто: всё, что пришло — печатается, за исключением некоторых управляющих символов и последовательностей.

  • 0x10 — Очистка экрана
  • 0x11 — Установка позиции, вторым байтом идёт адрес в DDRAM экранчика, на который нужно переставить курсор
  • 0x12 — Установка яркости, второй байт — значение. 00 — минимальная яркость, 0xFF — максимальная яркость.
  • 0x13 — Загрузка символа, следом идут 9 байт — первый: адрес CGRAM, остальные — образ символа.
  • 0x14 — Зажечь курсор (по умолчанию — включён)
  • 0x15 — Погасить курсор

Каких — либо ограничений по расположению управляющих последовательностей в выводимом потоке нет.

Вид на окошко терминала, и выведенную строку. Треугольнички — самозалитые символы.

Клавиатура опрашивается приблизительно 120 раз в секунду, и имеет программный антидребезг. По обнаружению нажатия, работа клавиатуры запрещается на 0.2 секунды, в течении которых переходные процессы заканчиваются. Каждое нажатие клавиши отправляет хосту скан-код, отпускание — ноль. Сканирование осуществляется до первой обнаруженной клавиши, затем прекращается. Поэтому, если на клавиатуре есть клавиша — модификатор, нужно позаботится, чтобы она опрашивалась в последнюю очередь. Здесь есть маленькая хитрость — выдача сканирующих импульсов в строки клавиатуры реализована записью шаблонов, которые находятся в специальной табличке. Меняя шаблоны местами, можно изменить очерёдность опроса строк клавиатуры. При подготовке шаблонов, нужно не забывать записывать единицы в разряды, соответствующие линиям ввода столбцов, чтобы активировать их подтяжку, иначе клавиатура будет работать со сбоями.

В моём случае — клавиатура имеет размерность 6*3, и последним шаблоном указана строка, содержащая клавишу SHIFT, которой соответствует скан-код 04. Одиночное нажатие — отпускание клавиши SHIFT выдаёт хосту последовательность 04 00, сначала код клавиши, а потом, при отпускании — ноль. Клавиша «1» имеет код 09, и при нажатии «SHIFT-1» хост получит последовательность 04 09 , а при отпускании — 04 00. То есть: «нажат SHIFT», затем «Нажата 1», затем единицу отпустили, но SHIFT остаётся нажатым, о чём сопроцессор тут же и докладывает. И только при отпускании всех клавиш — передаёт ноль. Напоминаю, что передача кодов происходит только при изменении состояния клавиатуры, автоповтора у неё нет.

В завершение — картинка, иллюстрация к тому, что получается, когда четырёхстрочный экранчик инициализируется в двустрочном режиме.

Дополнения

Пост-процессор клавиатуры
В прилагаемом архиве файл vvsopr-postp.asm. Как он работает? В конце программы есть таблица перекодировки, по которой скан-код клавиши преобразуется в любой другой, например в стандартные коды символов — необычайно удобное дополнение, если подключать сопроцессор к компьютеру. С зажатым шифтом уже выдаются коды из другой
половины таблицы. Код отпускания и код Shift тоже продолжают отдаваться, но лёгким движением скальпеля их можно вырезать, и получится занятный гаджет из цифровой клавиатуры и экранчика, подключаемый к COM-порту.

Микро-редактор
Да, да, девочки и мальчики, аппаратный редактор, чтобы было легко вводить всякие параметры для настройки микропроцессорных систем. Обращаться с микроредактором не просто, а очень просто — в поток вывода надо поместить три байтика:

  • 0x16 — это команда активации микроредактора, а после неё — два байта параметров.
  • Первый байт — это позиция вывода, такая же как и в команде установки позиции — адрес в DDRAMе экранчика, с которого начнётся область строки ввода/редактирования.
  • Второй байт — ограничение области ввода по ширине. В программе этот параметр дополнительно обрезается по младшим четырём битам, поэтому может принимать значения от 0 до 15. Нулевое значение, как вы сами понимаете, лишено смысла.

После того, как эти три байта будут переданы сопроцессору, он переходит в особое состояние — нажатия клавиатуры передаются редактору. Можно вводить циферки, двигать курсором — ничего не передаётся хосту до нажатия клавиши Enter (код определён в начале программы, а местоположение в матрице в таблице перекодировки) — в этот момент хост получит готовую отредактированную строку. Или до нажатия
клавиши ESC — хост получает только символ ESC, как извещение о том, что пользователь отказался от редактирования значения. После этого сопроцессор выходит из режима редактирования, и работает как обычно. У режима микроредактора есть интересная особенность — для него нет разницы, поступил ли символ с клавиатуры, или же из входящего потока — и символы, и коды управления обрабатываются одинаково, вне зависимости, как они попали в редактор. Это означает возможность после создания области редактирования, заполнить её неким начальным значением, которое можно исправить, и вернуть обратно хосту. Эта полезная модификация живёт в файле vvsopr-Me.asm. Правда, вы такого ещё не видели?

Файлы к статье

51 thoughts on “Сопроцессор ввода — вывода”

  1. Тоже в свое время пытался найти СЕ110, довольно редкий зверь, на работе пульт управления на одном девайсе был сделан из набора 16х2 LCD+CE110 и отладки от olimex. А вообще мне нравится альтернатива символьным ЖКИ на HD, к примеру TIC*** (контроллер PCF8535). Интерфейс I2C, стоит почти столько же (хотя на ebay 16×2 на hd или аналоге как-то видел за 4$ :P)

  2. Блин…)) Я когда-то морочился с поисками CE110. Она стоит примерно 500 р.
    В итоге у меня получилось вот чего:
    3 линии на LCD РВ44780
    3 линии на клавиатуру (недавно статья была)
    3-4 линии на весь вывод (т.е. релюшки, светодиоды и прочее)
    При этом в меге8 остаются свободными все интерфейсы. Меня это чего-то зарадовало и о CE110 я забыл ^_^

  3. А соединения на схеме влом было разрисовать? Не такая уж она и большая. Один человек поленился, а всем просматривающим теперь — морока. Ищи теперь, что куда идет. Чтобы, например, хотя бы количество линий в шине клавиатуры прикинуть. (Можно, конечно, и в тексте поискать, но одним взглядом на схему — лучше). Ох уж эта лень…

    1. Не брюзжите, SWG! Возьмите толстый фломастер, проведите жирную линию, и представьте себе, что это шина. Везде схемы так рисуют, и не думаю, что путаница проводов привнесла бы ясность (особенно тому, кому текст смотреть неохота)

  4. «Если общение с основным процессором будет идти через последовательный порт с высокими скоростями, нужен кварц, потому что изменения частоты встроенного генератора на 5-10% в зависимости от температуры, я видел своими глазами.»

    Вообще-то для асинхронного интерфейса колебания частоты в пределах 10% не проблема аж никак.
    Просто нужно делать полноценный приемник с ФАПЧ и все будет работать как часы.
    Конечно, я не спорю, что программный ФАПЧ гиморно и отъедает ресурсы, но совсем без кварца и просто прикольнее, и заметно снижается потребление, и кварц и место под него на плате и лишние ноги МК стОят каких-то ненулевых денег.

  5. Мда… Недаром похожие задачи выливаются в похожие решения. :)
    Почти аналогичный модуль делал ещё летом на меге 8, только под I2C. Такое же сочетание индикатор + клавиатура (4*20 + клавиатура 3*4). Только у меня была реализована ещё и работа с меню. Как одно-, так и многоуровневыми, всё зависело только от памяти. Ну и ещё три светодиода для индикации режимов работы + комповая пищалка и реализация RTC с будильниками-таймерами. Планировал использовать в составе других устройств, да свалил с AVR’ок.
    Поэтому скоро планирую переделать на MSP430 (можно и использовать сочетание AVR+MSP430, но не хочу возиться с преобразованием уровней и есть ещё пара идей, что стоит добавить, например внешнее маложрущее ОЗУ или вообще какой флеш или FRAM, или вообще по выбору) и потом по надобности сделать похожий процессор для графических индикаторов.

    1. Я подумал было о меню, но потом решил, что при таком функционале сопроцессора меню элементарно решается на уровне вывода строк из хоста. Нюансы заключаются в том, что у меню может быть большое число пунктов, и хранить их в ОЗУ сопроцессора просто негде. А хост может хранить меню любого размера в памяти программ. Можно, конечно, сделать механизм событий, чтобы сопроцессор при движении курсора запрашивал у хоста новую строку, но так недолго и до вендов дописаться, а оно мне не хочется. Поэтому реализация меню в хосте выходит проще и красивее.

      1. Ага. Я сам упёрся в объём ОЗУ, поэтому во второй версии и хочу поставить внешнее. А в основном устройстве реализовывать ещё и меню — тоже как-то не хочется тратить на это драгоценные ресурсы. Да и может случиться ситуация, когда устройство пустяковое, а вот меню приличное. Или вводить/передавать много надо.
        Ещё хочу потом туда засунуть ключи для возможности отключения, чтобы снизить энергопотребление, да ещё крутится в голове мысль взять и поставить разъём для microSD, как раз для больших текстов/меню, да, 99% карточки может и не будет использоваться, зато очень легко редактировать и мелкие стоят достаточно дёшево. Или флеш какой запихну. Скорее всего просто разведу оба варианта, чтобы выбирать и запаивать более дешёвый в каждом конкретном случае. Ещё только обдумываю, что же мне надо.

  6. Так, а где фотка то клавиатуры? Сопроцессор — прикольно не думал об этом ни разу. Этож получается можно управлять LCD по двум проводкам? Почему в сами дисплеи не встраивают такую штуку на предприятиях? Два проводка кинул и управление готово. Отсылай байтики по очереди и радуйся.

    1. А зачем фото клавиатуры, какой в нём прок? Если кому-то станет от этого легче, то это клавиатура Николь «Консул», то-ли снятая с производства, то-ли заказная. Её видно в статейке про термометры: http://roboeye.boom.ru/ds18/ds1820.htm
      Напоминает производимую сейчас серию CK, только с дополнительной кнопкой «ВКЛ»
      http://www.testa.ru/ru/ck_teko.htm
      Фишка-то в том, что можно любые клавиатуры цеплять, лишь бы ножек хватило, специально для этого там механизм масок сканирования предусмотрен.

  7. Горнист, спасибо за отличную и нужную идею! Наконец-то решил, что же замутить с тинькой и дисплеем, начавших уже покрываться пылью:). Добить все интерфейсы, навести лоск — и готов универсальный отладочный девайс. Спасибо!

  8. Я вот давно думаю над тем, чтобы сделать подобную вещь для своего дисплея Motorola T190. Он же сам по себе графический, так что микроконтроллеру нужно хранить коды всех символов для вывода текста, что занимает немало памяти. Можно сильно облегчить жизнь микроконтроллеру — пускай сопроцессор принимает по байту на символ да рисует его сам. Красота!

      1. Да меня и этот как-то устраивает. На нем можно весьма много текста вывести(аж 6 строк, вроде бы). Да и стоить какая-нибудь 13-я «тинька» будет подешевле нового дисплея. Если ее памяти хватит, конечно. Прийдется сильно оптимизировать код, чтобы все уместить туда.

  9. Реально полезная и очень удобная вещь.
    Использую несколько лет в такой конфигурации: тини2313 + 10-разрядный символьный дисплей + 3 кнопки + 6 светодиодов + зуммер. В зависимости от назначения можно перераспределять выходы между кнопками и светодиодами.
    Связь с основным устройством по одному проводу.
    Такая штука позволяет намного удобнее работать с устройствами, в состав которых штатно не входит дисплей.

    1. Правильное замечание насчёт диодов, мною двигала инерция мышления, когда я городил эту штуковину. Можно обойтись и без диодов, тогда маски придётся модифицировать, и выводить не в PortX, а в ddrX.

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

            1. Если на все ноги повесить резисторы по 100-200 Ом, то ничего страшного не случится, даже при включении на двух соединенных ногах 0 и 1 одновременно.
              А пользователю просто объяснить, что одновременное нажатие двух и более кнопок обработается как угодно.

  10. Работал в 2004-2006гг с СЕ110.Это версия пика (PIC16F5X, по-моему) с прошивкой. На одной линии сканирования клавиатуры была глючность, но мне меньшее количество кнопок сканировать надо было.Использовал штук 35…40.

  11. А можно немного подправить код и выводить PAL/NTSC сигнал на стандартныеТВ? Помоему очень удобно, ТВ экраны бывают и в виде миниатюрных, экономичных автомобильных вариантов в несколько дюймов, и огромные плазменные экраны на пол стены.
    Аналоговая часть формируется 1+1 пином на выходе контроллера, или несколькими пинами (4-8) и R-2R делителями напряжения для градаций серого или цветного видео.
    Есть готовые проекты с некоторыми ограничениями:
    http://www.vga-avr.narod.ru/main_rus.html

    Технические характеристики Video-адаптера:
    Количество символов: 20 строк по 38 символов
    Разрешение матрицы знакогенератора: 8×12 точек
    Формируемый сигнал: Composite Video(PAL/SECAM)
    Разрешение: 625 строк (чересстрочная)
    Mega8535 (512 байт)

    посмотрите картинки, с 7-сегментными индикаторами или LCD ни в какое сравнение не идет. Можно улучшить картинку, ввести цвет (хотя цвет всё резко усложнит)
    Может можно для вывода видеосигнала использовать сдвиговый регистр с паралельной загрузкой и последовательной выгрузкой? Тогда нагрузка на контроллер снизится в 8-16 раз, и можно будет прорисовывать более мелкие символы, а то и графику выводить (линии, круги, спрайты, графики).
    Получим не просто сопроцессор, а целую видеокарту, по цене одного контроллера. Выглядеть устройства будут весьма эффектно, что для домашней автоматизации, что для промышленной, я готовых решений такого уровня не видел на практике.
    Пример еще готовых решений от спектрума, генератор цветной картинки, адаптер и примеры PAL картинки
    http://www.nedopc.com/PALCODER/palcoder.php
    еще проекты
    http://tinyvga.com/ вроде готовый проект просят 30$
    In addition to VGA output, the interface also provides NTSC/PAL signal output for television viewing and PS/2 keyboard input. This makes MicroVGA the ideal solution for user interface in embedded applications.

    1. Резисторы служат для ограничения тока подсветки экранчика, они подбираются так, чтобы их суммарное сопротивление было 5-30 Ом, по желаемой яркости свечения и потребляемому току. Подсветка сделана из светодиодов, а светодиоды нельзя включать без ограничителя тока.
      Транзистор — bc817.

      1. Я просто удивился почему резисторов несколько а не один?
        Не понятно с конденсаторами (паралельно соединены).Там их три штуки.Один стоит возле индикатора другой возле микроконтроллера.А третий куда?

        1. Батенька, выше есть монтажка и фото. Вам так трудно на них посмотреть? Общие принципы применения блокировочных конденсаторов на шинах питания описаны в любой литературе по пионерскому радиоконструированию. Почитайте Хоровица-Хилла, он есть на сайте.

          1. Не трудно.Я устал разглядывать обе но тем не менее не нашел 5 кондеров.Только 4.Ткните слепого a?
            Что блокировочные ставятся на каждую линию питания это я вкурсе.

  12. В инете широко «Русификация ЖКИ-панелей серии LCD фирмы Octagon Systems. Ларисы Капитановой».
    Понимаю так, что сопроцессор может русифицировать ЖКИ-панели. Добавив в свою схему с МК АВР сопроцессор можно не беспокоиться о русском LCD. И возможно еще и упростить сопроцессор, вводя коды через МК.
    Может быть подскажите ссылку для скачивания кодов русификации ЖКИ-панели на базе сопроцессора.

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

Добавить комментарий