Устройство представляет собой коробочку с дисплеем от 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 | |||