Программирование AVR: работа с USB AVR-CDC: виртуальный COM-порт через Low-Speed USB (используется библиотека V-USB) Fri, December 13 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


AVR-CDC: виртуальный COM-порт через Low-Speed USB (используется библиотека V-USB) Печать
Добавил(а) microsin   

В статье описывается 2 проекта, основанные на библиотеке V-USB - CDC-232 и CDC-IO. Автор - Osamu Tamura @ Recursion Co., Ltd.

Оба проекта представляют из себя простую схему на микроконтроллере AVR (ATtiny45/85, ATtiny461, ATtiny2313, ATmega8/48/88), которая при подключении к порту USB компьютера (далее просто PC) создает виртуальный COM-порт. В обоих проектах используется бесплатная библиотека V-USB, которая позволяет средствами firmware, прошитого в микроконтроллер AVR, поддержать работу интерфейса USB. Первый проект (CDC-232) создает на компьютере виртуальный COM-порт, через который можно обмениваться данными с каким-нибудь другим устройством, имеющим низковольтный RS-232C (например, с микроконтроллером AT89C51 Atmel). Второй проект (CDC-IO) тоже создает виртуальный COM-порт, но он предназначен для управления ресурсами микроконтроллера (регистрами внутреннего назначения). То есть посылкой простых текстовых команд в консольной программе Вы можете менять состояние ножек микроконтроллера AVR, читать их состояние, управлять таймерами - счетчиками, PWM, читать ADC и т. д. 

[CDC-232

CDC-232 создает виртуальный COM-порт на PC, даже если он не имеет реального порта RS-232C. Это позволяет производить обмен данными RS-232C (без сигналов управления) после подсоединения устройства и установки драйвера.

cdc232-fig.gif
Виртуальный COM-порт, работающий через программную реализацию USB

[Применение CDC-232]

Запрограммируйте AVR, спаяйте схему и подключите устройство в порт USB компьютера. Установите драйвер (если у Вас операционная система Windows). Получите доступ к устройству через сгенерированный виртуальный COM-порт из программы терминала или написанную Вами программу (которая работает с COM-портом). Сигналы управления (DTR, DTS, RTS, CTS) не используются, поэтому настройте программу терминала в режим "no flow-control" (без контроля потока).

Windows запросит установку драйвера заново всякий раз, когда Вы подключите устройство в другой порт USB. Ранее установленный драйвер детектируется автоматически. Будет назначен другой номер COM-порта. Если Вы установите серийный номер в AVR (пересоберите исходный код с новым usbconfig.h), Вы можете получить тот же самый номер COM-порта на любом порте USB. Но в этом случае Вы не можете подключить сразу несколько устройств CDC с одним и тем же серийным номером.

Перед тем, как отсоединить устройство, закройте COM-порт в терминальной программе или в Вашем самописном приложении. В противном случае Вы не сможете подключить устройство снова из-за неверного дескриптора файла (broken file handle). В этом случае перезапустите программу терминала или Ваше приложение. Переключиться в режим быстрой передачи можно использованием "lowcdc.vbs", при этом можно получить скорость выше 9600 bps.

cdc232-photo1.gif
Loop-back тест на версии ATtiny45

[Принципиальные схемы CDC-232]

Эти схемы рассчитаны на ATtiny45/85, ATtiny2313/AT90S2313 и ATmega8/48/88/168. У всех этих микроконтроллеров firmware программируется через ISP. Красный LED понижает напряжение USB от 5V до 3.3V, и предоставляет его для AVR. Ток потребления около 10mA, и его мало для питания других узлов. Когда подключаетесь к другому MCU (микроконтроллеру), соедините Gnd и соедините TxD и RxD крест-накрест. R4 ограничивает обратный ток, когда внешний MCU питается от Vcc 5V (Вы можете R4 не ставить, если напряжение питания внешнего MCU равно 3.3V). R5 защищает ножку TxD, когда она замкнута на Gnd. Вы можете опустить и R4 и R5, если Вы соединяетесь через RS-232C драйвер наподобие MAX232. Используйте кварцевый резонатор. Несмотря на то, что керамический резонатор в большинстве случаев работает хорошо, но для данного применения он не подходит, поскольку уход частоты слишком большой, и поэтому устройство может работать нестабильно.

ATtiny45/85 использует внутренний RC-генератор и PLL. Он откалиброван на частоту 16.5 МГц по частоте сигнала SOF (Start Of Frame) порта USB, когда устройство подключено к PC. UART в этом случае реализован программно. Он не может поддерживать высокую скорость передачи данных. Если TxD и RxD проинвертированы (пересоберите проект с опцией -DINVERT), Вы можете напрямую подключиться к сигналам RS-232C. Формат настройки порта 300-4800bps, 8N1.

cdc232-45.gif
CDC-232 для ATtiny45-20

cdc232-photo2.gif cdc232-photo3.gif

Пример на ATtiny45 с использованием коннектора mini-B

У микроконтроллера ATtiny2313/AT90S2313 всего лишь 2 KB памяти программ. Механизм установки терминала опущен (т. е. автодетекта скорости нет). Установите переключатель DIP для смены скорости.

cdc232-2313.gifCDC-232 для ATtiny2313-20

У микроконтроллеров ATmega8/48/88's внутренний UART конфигурируется от PC автоматически. Формат настройки 1200-57600bps, данные 7/8, четность N/E/O, количество стоп-бит 1/2

cdc232-48.gifCDC-232 для ATmega8/48/88-20

Подключение к физическим линиям RS-232C требует инверсии полярности TxD и RxD, а также соответствие уровней сигнала. Используйте специальную IC наподобие MAX232. Вы можете её заменить простыми схемами (см. далее).

cdc232-if1.gif

Когда целевой MCU имеет другое питание Vcc (отличное от 3.3V), образуются обратные токи утечки через сигнальные линии. Это искажает сигнал, либо подпитывает MCU без источника питания. Эта схема не очень хороша, но достаточна для большинства случаев.

cdc232-if2.gif

[CDC-IO

CDC-IO управляет регистрами специального назначения (Special Function Registers, SFR) микроконтроллера AVR через виртуальный COM-порт на PC. Это позволяет свободно читать/записывать параллельные порты MCU (ножки микроконтроллера). Работают также операции с таймерами/счетчиками, PWM, ADC, EEPROM, что позволяет приложению на PC достичь очень глубокого управления микроконтроллером и разрабатываемым на нем устройством.

cdcio-fig.gif
Внешний интерфейс с использованием программной реализации протокола USB

[Применение CDC-IO]

Инсталляция такая же, как и у CDC-232. Скорость COM-порта произвольна. Отправка текстовых команд происходит через программу терминала или из вашей программы на PC. Если Вы хотите получить более высокую скорость передачи, используйте "lowcdc.vbs" для переключения в bulk transfer mode.

Набор команд CDC-IO (Instruction Set)

Функция Команда Формат Ответ
Who @ @ "cdc-io", CR-LF
Get ? address ? data, CR-LF
Set = data address = CR-LF
AND & Set & data address & CR-LF
OR & Set | data address | CR-LF
EX-OR & Set ^ data address ^ CR-LF
Set Double $ data2 data1 address $ CR-LF

Версия с ATtiny2313 имеет только команды "Set", "Get", "Xor".

В таблице команд использованы следующие обозначения:

address: адрес регистра SFR, отображенный на память (memory mapped) в hex-формате
data: 8 бит данные в hex
разделитель:    Tab, Space, CR, LF
predefined addr (предопределенные символические адреса, case-insensitive, НЕ поддерживаются ATtiny2313): PINB, DDRB, PORTB PINC, DDRC, PORTC PIND, DDRD, PORTD

Примеры ('_' означает разделитель):

            DDRB_?_                  Возвращает значение DDRB вместе с CR-LF.
            12_34_=_                 Запись 0x12 по адресу 0x34, в ответ возвращает CR-LF.
            FB_PORTC_&_     Запись (PORTC & 0xFB) в PORTC, возвращает CR-LF.

(примеры для ATtiny2313)
            36_?_                        Возвращает величину PINB(0x36) вместе с CR-LF.
            12_37_=_                  Запись 0x12 по адресу DDRB(0x37), возвращает CR-LF.
            FB_38_^_                 Запись (PORTB ^ 0xFB) в PORTB(0x38), возвращает CR-LF.

Предыдущие данные и адрес могут быть использованы повторно. Просто введите символ команды для повтора.

Команда "Set Double" используется для записи в EEPROM.

Избегайте изменения бит порта, на котором присутствуют сигналы USB. Используйте '&', '|' или '^' для модифицирования направления порта (вход или выход). Используйте PIN* для переключения бит в противоположное состояние (toggle), если порт назначен как выход (output).

Когда разрешены прерывания, сообщается номер вектора прерывания, когда оно вызывается.

Все регистры SFR доступны. См. даташит AVR для использования таймеров, ADC, EEPROM, и т. п.

[Принципиальные схемы CDC-IO]

Если напряжение питания Vcc целевой схемы равно 5V, и порты AVR сконфигурированы как входы, поставьте резисторы (3K3…10Kом) для предотвращения обратного тока. Используйте только кварцевый резонатор. Несмотря на то, что керамический резонатор в большинстве случаев работает хорошо, но для данного применения он не подходит, поскольку уход частоты слишком большой, и поэтому устройство может работать нестабильно.

ATtiny45/85 использует внутренний RC-генератор и PLL. Он откалиброван на частоту 16.5 МГц по частоте сигнала SOF (Start Of Frame) порта USB, когда устройство подключено к PC.

cdcio-45.gif
CDC-IO для ATtiny45-20

cdcio-48.gif

CDC-IO для ATtiny461-20

Для ATtiny2313 реализованы только команды "Set", "Get" и "Xor" из-за ограниченной памяти программ этого микроконтроллера. Эта версия также не имеет механизма interrupt-report.

cdcio-2313.gif
CDC-IO для ATtiny2313-20

cdcio-48.gif

CDC-IO для ATmega8/48/88-20

[Пример программы]

Это экспериментальная схема и пример программы для ATmega8/48. Программа написана на C, VB, VC, VC++ и C#. Вы можете использовать другие языки (или макросы), если они могут работать с портом RS-232C.

cdcio-photo.gif
На фото показан внешний вид экспериментальной схемы

cdcio-demo.gif
Регулятор изменяет тон пищалки и маску мигания светодиодов.

cdcio-dos.gif

[Пример управления без программы]

Операционные системы позволяют работать с COM-портами, как с обычными файлами. Вот так, например, под Windows Вы можете послать команду устройству, которое создает виртуальный COM-порт COM3 (в текстовом файле comands.txt записана последовательность команд):

c:\temp>copy comands.txt COM3
        1 file(s) copied.

Что интересно - под Windows XP можно использовать только имена COM1..COM9. Имена COM10, COM11, COM12, COM13 и далее Windows не воспринимает как системные, и думает, что это не порт, а файл (даже если такой порт реально имеется в Диспетчере Устройств).

[Ссылки]

1. Исходные тексты программ и firmware, описанные в статье, документация, драйвер для w2k, XP, Vista.
2. Проект CDC-232, портированный на AVR-USB-MEGA16 (ATmega16 с кварцем на 16 МГц).
3. AVR-CDC - Virtual COM Port over Low-Speed USB site:recursion.jp - сайт AVR-CDC Osamu Tamura @ Recursion Co.
4. USB консоль для управления радиолюбительскими приборами.

 

Комментарии  

 
+1 #7 Сергей 02.08.2012 21:47
На CDC-IO совместно с дрыганием ножек портов AVR мне нужно организовать обмен данными через RS232. Если я правильно понял, то сконфигурироват ь и запустить ком порт AVR с компьютера вполне реально, а чтобы забирать данные в ПС надо постоянно проверять флаг буфера приема AVR и забирать данные до окончания следуещего принимаемого байта?

microsin: запустить UART AVR командами с компьютера вполне реально, если Вы такое предусмотрите. По поводу того, как работать с портом UART AVR, как принимать и передавать данные см. соответствующие апноуты, даташит на микроконтроллер , и многочисленные примеры кода в Интернете. Причем далеко за примерами ходить не надо - в том же CDC-232 используется UART.
Цитировать
 
 
0 #6 Victor 12.05.2012 21:25
Не подскажите ли решение такой задачи: хочу подключить к машине под linux платку с 4 реле, чтобы периодически включать-выключать их. Желательно управлять реле утилитой командной строки, просто направляя командочки в порт (типа "echo что-то > /dev/ttyUSB0"). Возможно ли это сделать, используя Вашу мекетку с usb и программы с этой странички? Или есть какие-то готовые устройства уже заточенные под такое управление?

microsin: возможно лучшее, что Вам может подойти - это проект USBrelay (http://microsin.net/programming/AVR/usb-relay.html). Программное обеспечение там правда не консольное, а GUI, но зато кроссплатформен ное, и есть исходный код. Так что при наличии прямых рук сделать консольное приложение особого труда не составит. Для управления 4-мя реле лучше применить не ATtiny, а микроконтроллер ATmega8 или ATmega16/32, firmware на них придется портировать. Готовый порт firmware имеется на макетную плату AVR-USB-MEGA16, им можно управлять 23 различными реле.
Цитировать
 
 
0 #5 foxit 13.03.2011 12:44
Если я правильно понимаю, на основе CDC-IO можно создать программу для ПК, которая будет конфигурировать периферию МК на выполнение конкретных задач?

microsin: да, Вы правильно поняли, причем не только конфигурировать , а вообще делать все что угодно. Программа сможет управлять абсолютно всеми ресурсами микроконтроллер а - читать память, читать состояние каждого порта, управлять ножками (зажигать светодиоды, включать реле и т. д.). На таком же принципе работает класс-обертка C# Сергея Кухтецкого, см. пример использования такого класса тут - http://microsin.ru/content/view/803/44/. Разница между этим классом-оберткой и CDC-IO в том, что для CDC-IO программу для компьютера можно даже не писать, а воспользоваться обычным терминальным клиентом.
Цитировать
 
 
0 #4 AIL 23.04.2010 14:16
Чтоб не мучиться, будет дрыгать ногами программатора, не будет дрыгать, можно просто зайти вот сюда:

http://www.obdev.at/products/vusb/projects.html
Цитировать
 
 
-1 #3 Sergey 07.04.2010 16:44
Правильно ли я понял, что это "чудо" позволяет подключать к USB порту COM-программаторы AVR и PIC, которые "дрыгают ногами"? Например, ExtraPIC или UNIPROF?

microsin: CDC-IO в чистом виде подойдет только для "дрыгания ногами" и чтения регистров микроконтроллер а по текстовым командам, подаваемым через виртуальный COM-порт. Никакой программатор он не позволит подключить к USB-порту. CDC-232 в чистом виде подойдет как переходник между USB и TTL COM-портом программатора.

При наличии исходников программатора с COM-портом (и рук, растущих из нужного места), этот программатор можно переделать на USB-интерфейс, если взять за основу проект CDC-232 или CDC-IO.
Цитировать
 
 
0 #2 lynch 31.01.2010 21:21
с настройкой и компиляцией firmware проблем нет, интересует необходимо ли перекомпилирова ть драйвер устройства для windows

microsin: ничего перекомпилирова ть не нужно, драйвер можете взять готовый - тот, что предлагает автор проекта (см. ссылки). Сам я перекомпилирова ть драйвер не пробовал (не было необходимости). Под Windows компиляцию проектов с Makefile обычно поддерживает система MinGW.
Цитировать
 
 
0 #1 lynch 30.01.2010 20:52
Как и чем скомпилировать под Windows драйвер, если рабочая частота микроконтроллер а 16 мегагерц?

microsin: Ваш вопрос звучит несколько противоречиво, но я кажется, догадался, что имеется в виду - хотите в среде Windows скомпилировать firmware CDC-232 или CDC-IO на другую частоту кварца. Это можно сделать, если заменить старую версию библиотеки V-USB, которая используется в проектах Osamu Tamura CDC-232 и CDC-IO, на версию посвежее (можете взять последнюю версию на сайте obdev.at, а можете взять русифицированны й вариант у меня на сайте - http://microsin.ru/Download.cnt/avr/avr-usb-russian.rar). В свежей версии библиотеки есть возможность выбрать частоту кварца из ряда 12, 15, 16, 16.5 и 20 МГц (задается в Makefile). Скомпилировать с использованием Makefile в среде Windows можно, если у Вас установлен пакет WinAVR (там есть все что нужно - make, gcc и проч.). Делается это как с командной строки cmd.exe, так и с помощью AVR Studio. См. ссылку №2 - там выложил проект CDC-232 для AVR Studio, где применяется ATmega16 и кварц на 16 МГц.
Цитировать
 

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


Защитный код
Обновить

Top of Page