24.04.2024, Среда, 10:23
17.12.2013 в 00:48
Proteus и два с половиной hello world для UART и USB на микроконтроллере

Proteus и два с половиной hello world для UART и USB на микроконтроллере tutorial

Недавно разгребал папки на Dropbox и наткнулся на свои первые поделки. Когда делал первые шаги с микроконтроллерами, почти сразу меня стали посещать мысли и идеи об управлении моими поделками с ПК, либо каким-либо образом с этим самым ПК общаться. Это казалось увлекательным и «серьезным». Сейчас я стараюсь все сразу тестировать в железе, но в начале наступать на грабли и стрелять себе в ногу хотелось безболезненно и быстро. В этом мне неизменно помогал Proteus. Десятки раз пересобирая проекты было важно, чтобы можно было экспериментировать с комфортом, если так можно сказать. Это потом я уже купил фирменную отладку и что в Proteus, что в железе — все стало одинаково быстро.
В первую очередь мне хотелось попробовать UART и USB, а потом уже и Ethernet. Каждому желанию я придумывал свой «проект». Многие идеи так и остались в виде проекта для Proteus — идея надоедала сразу после реализации программной части.
Надеюсь, данный пост поможет всем, кто хотел попробовать сделать свое USB устройство или просто увидеть, что это все не так сложно; более того, мне хотелось, чтобы можно было попробовать сразу в симуляторе. Рассказать как новичок для новичка — чтобы захотелось открыть гугл и начать читать, чтобы сделать больше, узнать лучше.
Я не буду рассказывать о регистрах, режимах. Я сомневаюсь, что это поможет зажечь огонь в глазах. Возможно, кто-то захочет сделать что-то полезное для себя и у простых примеров больше шансов затянуть в это крайне увлекательное творчество (а для меня уже практически наркотик). А прежде чем бежать на ebay или начинать считать дни с момента отправки отладочной платы из Китая, можно попробовать свои силы в виртуальном микроконтроллере.
Я хотел бы попробовать сделать два своеобразных hello world проекта, которые, тем ни менее, не сильно сложнее стандартного LED blinking. Под катом много изображений.

Описание и примеры кода в тексте будут для микроконтроллера PIC18F4550, уж прошу простить меня, с atmel я не работал. А STM8/32 отсутствуют даже в 8-й версии.
Код для микроконтроллеров написан для компилятора mikroC от Mikroelektronika и писался для удобства понимания, надеюсь, у меня это вышло хотя бы частично. 
 

Протеус и обвязка MCU



Протеус, как мне кажется, создан для макетирования и тестирования работы софта в первую очередь. Возможно именно поэтому он допускает множественные упрощения в создании схем. Ниже приведен абсолютно достаточный набор для тестирования общения с ПК по UART/USB. Хочу снова обратить внимание, что такая схема работать будет только в Proteus'е. 
Все проекты приложены к статье, так что установив программу, можно сразу все попробовать.


 

U(S)ART



Тема избита, но все же позволю себе описать ее еще раз. 
Чтобы подключить к нашему виртуальному микроконтроллеру putty или любую другю произвольную программу, нам нужно сделать несколько действий. 
Модуль COMPIM использует виртуальный порт, чтобы к нему подключиться, нужно создать ещё один и соединить их как нуль модем
Хорошим помощником тут будет бесплатная утилита com0com.
Там создаем два виртуальных порта, в моем случае это COM 3 и 4. Один подключаем к Proteus'овскому COMPIM, второй уже используем «снаружи»

Окно программы


А вот так это будет выглядеть в devmgmt.msc (Диспетчере устройств)


Теперь все готово к тесту. 
 
Создадим программу для теста


Настроим COMPIM устройство (правый клик — Edit properties). 
Напомню, что у меня com0com эмулирует порты COM3/COM4


На всякий случай, приложу картинку с настройками микроконтроллера


Включаем Putty, переводим его в режим Serial и подключаем к COM4. Теперь… нажми на кнопку — получишь результат
Печатаем текст в окне терминала и микроконтроллер делает echo нам назад. По нажатию enter переводим каретку + новая строка.
Backspace так же работает. Сразу вспомнилось как чатился с друзьями по Hyper Terminal, часами занимая телефонную линию…


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

USB HID



Сделать свое USB устройство оказалось делом непростым для меня тогда. Тестировать мы будем HIDустройства, то есть, в большинстве случаев — устройства ввода.
Очень хотелось мне сделать автоматический ввод пароля, а так же блокировку компьютера, когда я отошел, и разблокировку, когда я подошел. Ну и кучу чего еще, что можно было реализовать посредством виртуальной клавиатуры.
Кучу полезной информации по HID можно найти тут. Читать — не перечитать.
Вкратце: каждое USB HID устройство имеет специальное описание, дескриптор. Которое описывает что это за устройство, как им можно управлять, сколько оно потребляет от шины или же имеет самостоятельное питание и кучу другой информации. Поэтому нам нужно сделать правильное описание, чтобы ОС могла понять, что это клавиатура и могла с ней работать.

Но сначала, чтобы Proteus мог пробросить свой виртуальный USB хост в наш реальный ПК, необходимо поставить виртуальный драйвер, он идет в комплекте


Чтобы устройство работало как полноценное FullSpeed USB 2.0, необходимо включить PLL и настроить его соответствующим образом. 
В Proteus'е так же надо выставить частоту процессора как 96МГц.
 
Под спойлером объяснение, как работает задающий генератор (в случае с PIC)
 
Дескриптор


Мне было очень полезно просто пробежаться по нему глазами и поэкспериментировать. Сразу стало ясно, куда копать в бесконечных PDF с usb.org

В нашем случае от «стандартного» декриптора изменений немного:
Мы изменили VID/PID, указали, что у нас буфер ввода/вывода на 8 байт каждый и, собственно, указали, что у нас устройство класса «клавиатура» и использовать его нужно именно так. 
Все названия переменных говорят сами за себя.
 
Сам код дескриптора, много кода


Этот дескриптор добавляется в проект, и будет автоматически использован при сборке.
Простейшая программа, которая будет набирать текст


По сути вся работа заключается в заполнении соответствующего буфера и в отравке его в ПК. Не сложнее, чем с UART. Вся работа выполняется в подпрограмме прерывания. В комплекте с IDE уже идут готовые библиотеки работы с HID.
Тут следует пояснить, что scan коды клавиатуры отличаются от ASCII, но чтобы не перегружать код (у нас же hello world), я обошел сие неудобство примитивным образом. Работать будет только для букв в нижнем регистре. Желающие могут сами сделать преобразование. Подобный девайс я использую для KVM На работе, беспроводной удлинитель клавиатуры — наши D-Linkовские KVM не хотят понимать USB донглы беспроводные.

Теперь открываем Notepad, запускаем Proteus (предварительно кликаем по виртуальному штекеру — USB разъем «вставится»), сразу переводим фокус мышкой на Notepad и наблюдаем, как наше творение печатает слово habrahabr.

А в диспетчере появилось наше устройство


Теперь можно на основе этого добавлять что-то свое.

Пару слов про то, как это работает.
Для ввода-вывода с клавиатуры зарезервировано 8 байт:

0 Модификатор
1 Не используется
2 Клавиша 1
3 Клавиша 2
4 Клавиша 3
5 Клавиша 4
6 Клавиша 5
7 Клавиша 6

Модификаторы, это спец клавиши Ctrl, Shift, Alt. Их можно объединять. Например, для комбинации Ctrl Alt Del:

Modifier: 0b00000101 Ctrl, Shift, Alt
Key code: 0x4c (клавиша Delete)

Следует помнить, что сразу после передачи данных, необходимо стирать буфер USB, иначе получится эффект залипшей клавиши. То есть отправлять на ПК восемь нуль байт. В примере это делает подпрограмма clearUSB
Подробнее про сканкоды описано в appnote от microchip
Точно так же можно создать обычное HID устройство и передавать/принимать байты с ПК и по логике работы это почти ничем не отличается от того же UART. Но это уже требует отдельной работы, например, с libusb со стороны ПК.
 

Ethernet



Не отражено в заголовке, но про это тоже стоит сказать.
К сожалению, данный пример не будет завершенным, поскольку это тема отдельного разговора.
Но, по крайней мере, я опишу как настроить сам симулятор, и кое-что попробовать все же получится.
Тут как раз пример того, что работает в железе, но не всегда работает в симуляторе. В Proteus реализованы VSM модели для микросхем ENC28J60 и RTL8019. Да-да, тот самый чип, который всем нам был знаком по бюджетным сетевым картам. Использование ENC описано достаточно широко и проблем тут быть не должно. Например, уважаемый Lifelover aka Redsh все давно и преподробнейшеописал. Поэтому, чтобы не было скучно, возьмем 8019, тем более я пишу под неё софт для использования совместно с Z80.

Как и в случае с USB, нам надо установить драйверы, но теперь WinPCAP. Они лежат в папке Virtual Network, рядом с драйверами USB. Или скачать с сайта самую свежую версию 
После этого у нас появится новая виртуальный сетевой интерфейс с адресом 192.168.95.1, который, разумеется, можно поменять.

Cделаем на UART отладочный интерфейс по уже известной нам схеме.
HINT: Если вас раздражают надписи TEXT — в Description компонента поставьте пробел


В свойствах микросхемы пропишем номер или IP нашей виртуальной сетевухи и можно поменять кое-какие настройки. 
В моем случае это 192.168.50.1 (я изменил)



Далее дело за софтом. Полноценный драйвер для 8019 у меня пока не готов, да и это тема отдельной большой статьи, хотя вряд ли такой анахронизм кому-то интересен. Но даже без настройки протоколов (IP адрес у нас сейчас 0.0.0.0), так как я разрешил ICMP/Broadcast в регистрах, мы можем попинговать какой-нибудь левый адрес в нашей подсети, и сетевая картамикросхема радостно помигает нам светодиодом при получении пакета. После каждой попытки, используйте новый адрес, а то ARP таблица же кэшируется.


Вместе с проектами приложены готовые HEX, так что компилятор можно даже не качать, если нужно просто проверить, что все работает.
Чтобы симуляция работала — не забывайте указать микроконтроллеру где лежит ваш HEX файл.

Скачать все файлы можно по этой ссылке

Надеюсь, у кого-то загорится желание попробовать и реализовать в железе.
Количество просмотров: 2986.
dth="100%" cellspacing="0" cellpadding="0" class="commTable">
Имя *: Email:
Подписка:1 Код *: