Дополнительный дисплей для компьютера на Nokia 2650 и AVR

Устройство представляет собой коробочку с дисплеем от Nokia 2650 и 8 кнопками, соединенную с компьютером по программному USB на ATmega8, и отображающую какую-то важную информацию. Программно устройство состоит из нескольких блоков: связь с дисплеем по SPI, связь по USB, обработка кнопок и связь с чем-нибудь по UART. Работа с дисплеем весьма понятно описана в этой статье. Я пробовал использовать аппаратный SPI контроллера, но особого преимущества не получил, в основном, потому что в контроллер встроен 8-битный модуль, а в дисплей — 9-битный. Для связи по USB используется известная библиотека vusb, точнее ее доработка для реализации USB-HID-устройства. После такого, обработка кнопок и UART не кажется чем-то сложным. Применения UART’у не нашел, поэтому толком и не тестировал, так, задел на будущее.

Схема устройства предельно проста — к каждому интерфейсу идет столько выводов, сколько ему нужно.

Платку пришлось делать двусторонней, вот как получилось: вид сверху (на некоторые кнопки надеты пластиковые колпачки для красоты)

Снизу

Сбоку

И в сборе

На плату даже уместился ISP-6 для программирования. Поскольку у большинства программаторов стандартом является ISP-10, воспользовался шлейфом-переходником

Общение с дисплеем и рисование примитивов можно найти в статье по ссылке, интереснее было разобраться с выводом текста. Для простоты и компактности каждый символ хранится в виде битовой маски из 5 байт, что дает теоретический размер 5х8 пикселей, но на самом деле старший бит обрезается, и получается 5х7, чего вполне достаточно почти для всех символов ASCII-кода (правда, например, буква «Щ» выглядит не слишком красиво). Посмотрев на такой шрифт на дисплее 3х3 см я сделал вывод что стоит шрифт увеличить. Для вывода символа обычного размера служит процедура nlcd_Char(), для увеличенного — nlcd_Char2(). Суть хранения символов в том, что одному биту соответствует один пиксель: если 1, то цвета пера, если 0 — фона. Эти два цвета (color_fg и color_bg) явным образом задаются по USB. Сама процедура вывода символа достаточно проста, похожа на вывод закрашенного прямоугольника и требует только точного расчета координат. Ну или танцев с бубном, если рассчитывать лень. Символы были нарисованы в самописной утилите и сохранены в удобном для использования формате. Хранятся, разумеется, во flash-памяти.

С точки зрения компьютера устройство считает себя HID’ом, то есть довольно медленным, но универсальным и не требующим специальных драйверов устройством. Это сделано для простоты программирования и какой-никакой кроссплатформенности. Обмен действительно медленный — заполнение всей доступной области картинкой, передаваемой по USB, занимает не меньше минуты, заполнение, не связанное с обменом, — меньше секунды. Устройство общается структурками по 2 байта: байт команды и байт данных. Всего реализовано 20 простых команд и 3 команды, связанные с цветом (установка цвета фона, цвета пера и вывод точки). Команды разделены на 8-битные, 7-битные и 4-битные. В 8-битных вся информация, если она нужна, хранится в байте данных. Это команды установки яркости (CMD_LED) и контрастности (CMD_CONT), сохранение их в EEPROM (CMD_SAVE), вывод примитивов (CMD_LINE, CMD_RECT, CMD_CIRCLE), очистка экрана (CMD_CLEAR) и обмен данными по UART. В 7-битных командах младших бит отвечает либо за направление (0 — X, 1 — Y), либо, для символа, за размер (0 — обычный, 1 — увеличенный), либо за дополнительный флаг (CMD_CTRL — передача байта данных прямо на контроллер дисплея, без дополнительной обработки, если возникнет желание поиграться с недокументированными режимами, тогда 0 — команда, 1 — данные). В 4-битных командах младшая половина байта команды вместе с байтом данных образуют 12-битный цвет, удобный для дисплея.

Также с устройства можно прочитать такую же структуру. В зависимости от байта команды (DAT_KEY или DAT_UART), в байте данных содержится либо состояние клавиатуры (0 в соответствующем разряде означает, что кнопка нажата, 1 — отпущена), либо принятый по UART байт.

Как видно по фотографиям, устройство вполне работоспособно, осталось только подключить его к компьютеру. Тестовые программы взаимодействия написаны (под windows на CBuilder, под Linux на обычном gcc) и позволяют продемонстрировать все команды. Но полноценной программы взаимодействия пока нет. Еще заметил странный баг — при общении с дисплеем, он начинает мерцать. Это не связано с питанием, скорее баг самого дисплея, или я не нашел нужной команды.

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

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
DD1 МК AVR 8-бит ATmega8A-AU 1
T1 Биполярный транзистор КТ315А 1
X1 Кварцевый резонатор 12 МГц 1
C1, C2 Керамический конденсатор 30 пФ 2
С3 Электролитический конденсатор 47 мкФ 1
С4, С5 Керамический конденсатор 0.1 мкФ 2
R1 Резистор 1.5 кОм 1
R2, R3 Резистор 56 Ом 2
R4 Резистор 10 Ом 1
R5 Резистор 10 кОм 1
R7-R9 Резистор 3 кОм 4
R10 Резистор 820 Ом 1