Главная arrow Программирование arrow AVR arrow AVR-CDC: виртуальный COM-порт через Low-Speed USB (используется библиотека V-USB) Thursday, March 30 2017  
ГлавнаяКонтактыАдминистрированиеПрограммированиеСсылки
UK-flag-ico.png English Version
GERMAN-flag-ico.png Die deutsche Version
map.gif карта сайта
нашли опечатку?

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

Поделиться:

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 )
 

Комментарии  

  1. #8 Andry
    2013-03-2707:28:46 Собрал CDC-IO устройство на ATtiny45. Для общения с устройством использовал AutoIt3 с библиотекой CommG для работы с СОМ портами. Нужно мне было АЦП + управление(on/off). Не с первого раза, конечно, но получилось. Команды такие:
    "87 26 = " ; ADCSRA
    "8F 27 = " ; ADMUX
    "00 23 = " ; ADCSRB
    ; в цикле
    "C7 26 = " ; ADCSRA старт АЦП
    "24 ? " ; ADCL
    "25 ? " ; ADCH
    Это измерение внутреннего термодатчика. Полезный совет тем, кто будет работать с CDC-IO. Для обращения к регистрам указывать их адрес, когда я использовал названия регистров у меня нестабильно работало. При чтении шестнадцатиразр ядных (двухбайтных) регистров обязательно нужно читать оба регистра, даже если нужен только один. Сначала читаем младший ADCL потом старший ADCH. С таймерами/счетчиками так же.
  2. #7 Max
    2012-12-1820:32:49 Имена COM10, COM11, … можно использовать, — нужно открывать их как \.COM10
  3. #6 Вадим
    2012-10-1108:19:34 Ломаю голову уже неделю над CDC-IO. С считыванием состояний и записью портов понятно,но никак не могу заставить работать АЦП. Посылаю:
    00 PORTB =
    00 PORTC =
    0F DDRC =
    10 TCCR1A =
    04 ADMUX =
    87 ADCSRA =
    (взято из родного промера).

    А в ответ на

    ADCH ?
    ADCL ?
    Всегда приходят 00.

    (все лапы порта С посажены на переменные резисторы). Что не так?
  4. #5 foxit
    2011-03-1309:44:21 Если я правильно понимаю, на основе CDC-IO можно создать программу для ПК, которая будет конфигурировать периферию МК на выполнение конкретных задач?

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

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

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

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

    microsin: ничего перекомпилирова ть не нужно, драйвер можете взять готовый - тот, что предлагает автор проекта (см. ссылки). Сам я перекомпилирова ть драйвер не пробовал (не было необходимости). Под Windows компиляцию проектов с Makefile обычно поддерживает система MinGW.
  8. #1 lynch
    2010-01-3017:52:58 как и чем скомпилить под винду драйвер, если частота контроллера 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 МГц.

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

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:

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

< Пред.   След. >

Top of Page
 
microsin © 2017