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

В статье описывается 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

[Применение]

Запрограммируйте 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

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

Эти схемы рассчитаны на 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 Ftame) порта 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-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, и т. п.

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

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

ATtiny45/85 использует внутренний RC-генератор и PLL. Он откалиброван на частоту 16.5 МГц по частоте сигнала SOF (Start Of Ftame) порта 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 Osamu Tamura @ Recursion Co.
4. USB консоль для управления радиолюбительскими приборами.

Последнее обновление ( 13.03.2011 )