Внешний USB-дисплей

от автора

Приветствую всех хабраюзеров. В этой статье будет написано, как сделать дисплей, который общается с компьютером по USB. Для реализации этой затеи я выбрал AVR-контроллер ATMega16. Что бы не заморачиваться с обвязкой, я выбрал эту макетную плату.

Для чего этот дисплей может использоваться — решать вам. Кроме того — никто не заставляет это делать в форм-факторе дисплея — это может быть пучок светодиодов, светодиодная лента, несколько релюшек — все, что угодно.

Железяки

«Железо» тут очень простое. Поскольку обвязка USB уже имеется, нужно просто подключить индикатор к контроллеру. Выводы сегментов, ровно как и выводы разрядов, желательно сажать целиком на один порт (чтобы вывод символа был не сложнее записи в этот самый порт).

Программатор

Для программирования сей чудной макетной платы есть два способа. Первый — классический — SPI/JTAG. Второй — бутлоадер, который работает через HID интерфейс, и активируется при замыкании MOSI и земли.

Софт

В качестве шаблона я взял проект по ссылкам из статьи на microsin.

Теория

Сейчас практически все устройства подключаются к компьютеру через USB-интерфейс. Более того, во многих новых ПК COM и LPT порты отсутствуют (хотя под них есть контакты на мат. плате). Многие считают, что HID предназначен исключительно для мышек, клавиатур и прочих устройств ввода. Это не так. HID устройством может быть все, что угодно. Хотя HID и обеспечивает низкоскоростной обмен данными (<64 кб/с), но он может значительно сократить время разработки устройства за счет отсутствия необходимости написания драйверов. На выходе получится простое устройство, которое опознается в большинстве современных ОС.

Для организации USB-обмена со стороны контроллера используется библиотека V-USB, которая и берет на себя всю грязную работу. Следует заметить, что сигнал D+ обязательно должен приходить пин, который имеет прерывание (в данном случае — INT0). Кроме того, контроллер должен иметь строго определенную тактовую частоту (на плате виден 16-мегагерцовый кварц), иначе ничего не заработает.

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

Практика

Сперва объявим дескриптор, отличие тут в этой строчке:
0x95, 0x05, // REPORT_COUNT (5)
В этой строке указывается длина FEATURE-репорта — пять байт, исключая ReportID. Первый байт — статус (состояние встроенного светодиода), еще четыре — информация, выводимая на диспей

Для работы дисплея нужно направить порты на выход (A и C, я направлял все пины — другой периферии все равно нету).

Для сохранения информации о текущем состоянии дисплея нужны две переменные (еще одна — для упрощения кода). Дабы не перегружать статью, весь код вынесен на pastebin.

Большой брат

Для компьютера была написана программа на Дельфи с использованием компонента JvHidDevice.
Исходники все там же — на pastebin.

Все эти исходники делают очень простую вещь — на стороне хоста — преобразование символов в их картинки и отправка по USB, на контроллере — прием и отображение. Следует отметить, что знакогенератор реализован на хосте, дабы исключить ненужные перепрошивки контроллера.

Фотографии почти готового изделия (кликабельны)


ссылка на оригинал статьи http://habrahabr.ru/post/169585/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *