Дополнительный дисплей для компьютера на 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-AU1
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
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

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

Ваш адрес email не будет опубликован.