Подключение avr микроконтроллера к компьютеру

Обновлено: 07.07.2024

Используемое железо

Благодаря библиотеке V-USB для создания устройства USB HID подойдет любой микроконтроллер AVR. Если Вы дружите с паяльником, то даже можете собрать подключение к USB самостоятельно по одной из опубликованных схем. Такая схема (взята из пакета V-USB [1]) в качестве примера приведена на картинке.


Чтобы экономить время и усилия, лучше использовать готовую макетную плату. Особенно удобно, если в плату будет записан USB-загрузчик (bootloader), тогда не понадобится покупать программатор для перепрошивки платы. Я использовал макетную плату AVR-USB-MEGA16 с микроконтроллером ATmega32A, в ней загрузчик есть (USBasploader, эмулирующий поведение программатора USBasp). Вот так платка выглядит в натуральную величину:

image

Создание firmware микроконтроллера с помощью Atmel Studio 6 и библиотеки V-USB

Сделайте новый проект в Atmel Studio 6 (далее просто AS6). Когда AS6 предложит выбрать микроконтроллер, выберите Atmega32 без буквы A, не Atmega32A (хотя на плате стоит Atmega32A) — это важно, так как тулчейн WinAVR не видит разницы, он знает только Atmega32. Эти микроконтроллеры по внутреннему устройству идентичны, так что для нас разницы нет, а для AS6 есть.

Теперь нужно правильно настроить компилятор. В верхнем меню AS6 нажите Tools, далее Options.. и появится вот такое окно:

image

Слева в списке выберите Toolchain. Справа появится список Flavours. Этим словечком Atmel закодировала возможные варианты используемого инструментария (тулчейны).


Для добавления в список Flavours тулчейна WinAVR нажмите кнопку Add Flavour, появится следующее окно:

image

В верхней строчке этого окна введите имя компилятора WinAVR (произвольное), а в нижней строке введите полный путь, куда установлен сам компилятор тулчейна (с указанием папки \bin) и нажмите кнопку Add. В списке Flavours появится добавленный компилятор, как показано на скриншоте.


Выделите мышкой наш новый добавленный компилятор WinAVR и нажмите кнопку Set As Default (сделать его тулченом по умолчанию), и нажмите OK. После этой процедуры наша AS6 будет использовать компилятор WinAVR.

Пора настроить свойства нашего проекта, для этого курсором в Solution Explorer левым щелчком выберите имя проекта и нажмите Alt+F7 (меню Project -> Properties), появится окно с настройками:

image

  • В разделе AVR/GNU C Compiler -> Symbols добавляем в поле -D строчку F_CPU=12000000UL — это соответствует частоте микроконтроллера 12 МГц (такой кварц установлен на моей макетной плате AVR-USB-MEGA16).
  • В разделе AVR/GNU Assemler -> General в поле Assembler flag надо добавить -DF_CPU=12000000UL.
  • В разделе AVR/GNU C Compiler -> Optimization в поле Optimization Level должно стоять Optimize for size (-Os).

image

В выпадающем списке Toolchain Flavour выберите добавленный компилятор WinAVR, чтобы при компилировании проекта AS6 использовала его. На этом настрока AS6 закончена.

Далее необходимо в созданный проект добавить файлы исходного кода проекта [6] — см. папку firmware\VUSB, файлы VUSB.c, usbdrv.c, usbdrvasm.S и oddebug.c. Проект ASS6 создан на основе одного из примеров библиотеки V-USB: hid-custom-rq, который изначально компилировался с помощью утилиты make из командной строки. На основе библиотеки V-USB можно найти много других примеров кода — в основном это устройства USB HID (мыши, клавиатуры, устройства ввода и вывода), но есть также и устройства USB CDC (виртуальный COM-порт). Если Вам лень самому создавать проект, просто откройте в AS6 файл проекта VUSB.atsln, в нем уже сделаны все необходимые настройки и добавлены все нужные файлы.

Если у Вас используется другая макетная плата, то нужно правильно настроить файл usbconfig.h. Это конфигурационный файл библиотеки V-USB, в нем задаются многие настройки и параметры (VID, PID, ножки микроконтроллера, значения для дескрипторов и другие настройки). Подробное описание всех настроек дано в комментриях этого файла. Основное внимание следует уделить назначению выводов микроконтроллера, которые используются под сигналы USD D+ и D- (макроопределения USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT, USB_CFG_DPLUS_BIT), к этим ножкам предъявляются особые требования. Конфигурационный файл usbconfig.h из архива [6] предназначен под разводку ножек макетной платы AVR-USB-MEGA16, и он гарантированно работает. Моргать программа будет светодиодом, который уже имеется на макетной плате и подключен к ножке 0 порта B.

Создание программы для компьютера (ПО хоста)

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

image

появится ещё одно окно

image

здесь нужно найти путь на диске, где находится библиотека LinUsbDotNet.dll (по умолчанию она устанавливается папку C:\Program Files\LibUsbDotNet, но лучше сделать копию файла DLL в рабочий каталог проекта. После подключения библиотеки её нужно объявить в проекте, для этого добавьте в главный модуль программы (файл Form1.cs) строки:


Перейдите к визуальному редактору формы, и приведите её приблизительно к такому виду (добавьте 3 кнопки Button и 3 текстовых метки Label):

Внешний вид главной формы ПО хоста

Сделайте обработчик события загрузки формы. Он нужен для того, чтобы при старте программы происходила инициализации экземпляра класса LibUsbDotNet, через который осуществляется обмен с устройством USB. Перед началом обмена необходимо открыть доступ именно к нашему устройству, потому что к компьютеру может быть подключено несклько устройств USB HID, и необходимо уметь обращаться к каждому по отдельности. Для целей идентификации USB-устройств служат специальные идентификаторы, которые имеют абсолютно все устройства USB, это VID и PID.


VID это идентификатор производителя (Vendor ID), а PID — идентификатор устройства (Product ID). Наше USB-устройство имеет VID: 0x16C0, PID: 0x05DF, эти значение указаны в конфигурационном файле usbconfig.h (об этом файле мы уже упоминали) проекта микроконтроллера AS6. Чтобы ПО хоста обратилась к именно к нашему USB-устройству, нужно инициализировать объект MyUsbFinder такими же параметрами VID: 0x16c0, PID: 0x05df, как указаны в файле usbconfig.h. Для этого в область определения глобальных переменных класса Form1 добавьте следующий код:


После того как мы определились с каким USB-устройством будем работать, можно к нему подключаться, и это удобно сделать в момент старта программы (открытия окна формы). Для этого выберите основную форму программы, и в редакторе свойств создайте обработчик события загрузки Form1_Load. В теле обработчика введите следующий код:


Сделайте обработчик события клика на кнопке button1 («Вкл»), для этого сделайте в визуальном редакторе на кнопке двойной щелчок, и добавьте в тело обработчика события код:


Для обработчика кнопки «Выкл» добавьте код:


Код для обработки кнопки «Чтение»:


Обработчик события закрытия формы (завершение работы программы) гасит светодиод, если он горит:

Как пакеты USB декодируются в firmware микроконтроллера

Прием и обработка данных на стороне микроконтроллера осуществляется в функции usbFunctionSetup (находится в главном модуле VUSB.c проекта firmware AS6). Вот эта функция:


Наше устройство USB HID простейшее, и реагирует оно только на управляющие передачи (control transfer), которые проходят через конечную точку 0 (default control endpoint). По типу запроса (поле bRequest) декодируется направление передачи данных. Если CUSTOM_RQ_SET_STATUS, то это данные, предназначаемые для микроконтроллера. Данные декодируются и микроконтроллер выполняет заложенную там команду. В этом случае в самом первом по порядку принятом байте данных закодировано состояние светодиода — если там в младшем бите единичка, то светодиод включается, а если нолик, то гаснет. Если же в поле bRequest принято значение CUSTOM_RQ_GET_STATUS, то в ответ заполняется буфер текущим состоянием светодиода, и данные буфера отправляются обратно хосту. Все очень просто, и при желании поведение кода можно легко переделать под свои нужды.

Видео, как это работает:

Буду рад ответить в комментариях на вопросы и конструктивные замечания.

Ссылки

В дальнейшем по возможности планирую сделать тоже самое, но на микроконтроллере с аппаратным интерфейсом USB.

Также USART называют UART (Universal Asynchronous Receiver-Transmitter (универсальный асинхронный приемопередатчик)), как он до какой-то поры и назывался. Просто во второй аббривиатуре отсутствует синхронизация. До появления синхронного UARTа шел обмен только по двум проводам, а потом в данный интерфейс добавили ещё шину синхронизации. Но до сих пор большинство программистов её не исползуют, Данные и так нормально доходят. Достигается это равенством скоростей на приёмном и передающим устройстве а также некотроыми определёнными битами в протоколе.

Вот таким образом данный интерфейс организован в микроконтроллере Atmega8

image01

Как мы видим из данной структурной схемы, в USART используются три основных выхода RxD, TxD и XCK.

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

Также здесь существует несколько модулей, соответствующий каждый своему выходу, а также ряд регистров, которые мы рассмотрим в процессе изучения возможности программирования USART.

Также для использования интерфейса мы обязаны знать, какие собственно ножки контроллера Atmega8 отвечают за каждый выход USART. Таких ножек всего две (ножку синхронизации не используем)

image02

Это ножки 2 и 3. Мы, конечно, можем использовать и другие ножки, но это уже будет программный USART, никак не связанный с тем, который мы рассматриваем. Аппаратный. как известно, всегда лучше по всем показателям.

Как же мы можем связать между собой по интерфейсу USART два устройства? Два устройства связываются посредством прямого подключения ножки TxD одного устройства к ножке RxD другого и, наоборот, Ножку RxD одного устройства мы подключаем к ножке TxD другого. То есть данные с выхода одного устройства попадают во вход другого и наоборот. Всё это можно наглядно представить в виде вот такой схемы

image03

Также, следующая таблица из технической документации на контроллер гласит о том, что при работе с шиной USART мы можем использовать прерывания. В данной таблице представлены векторы и условные обозначения данных прерываний

image04

Данные прерывания происходят в случае когда закончен приём или передача данных, либо когда опустеет регистр данных.

Тепрь давайте рассмотрим, как именно передаются данные по шине USART. Обычно это называют протоколом интерфейса

image05

В принципе, протокол USART не такой и сложный, но учитывая то, что мы с вами вообще пока не рассматривали ни один последовательный интерфейс, всё равно разобраться будет стоить некоторого напряжения по сравнению с параллельным, который мы рассматривали с вами в уроке 12, когда подключали модуль символьного дисплея.

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

Затем идут стоповые биты, гласящие о том, что передача посылки закончена. Данных битов может быть один или два также в зависимости от режима. Данные биты передаются с помощью организации высокого логического состояния на ножке. И затем процесс повторяется сначала, то есть передаём следующую посылку.

Следующая таблица нам расскажет уже о том, каким образом мы можем задавать скорость нашей шины. Скорость задаётся числом, которое мы заносим в регистр UBRR

image06

Теперь различие в таблице первой и второй строки. Существует ещё бит U2X в определённом регистре, который при нулевом значении никак не влияет на скорость обмена, а при значении 1 он скорость удваивает. За счёт этого в формуле в знаменателе будет уже не 16, а 8.

Несмотря на поправку за счет стоповых и стартовых битов, следует стараться выбирать величину значения регистра UBRR и бита U2X так, чтобы процент был меньшим. Поможет нав в этом ещё одна таблица из технической документации на контроллер (нажимайте на картинки для увеличения изображения)

image07_0500

image08_0500

image09_0500

image10_0500

Ну вот мы потихоньку немного разобрались с шиной USART, с её протоколами и немного уже коснулись её организации в контроллере и некоторых регистров, за эту шину отвечающих.

В следующей части мы продолжим знакомство с регистрами контроллера, отвечающими за USART, а также с переходником, который и будет нам данный интерфейс организовывать между компьютером и микроконтроллером, так как у ПК данного интерфейса нет, использовать мы будем шину USB. Она-то точно есть у каждого современного ПК.

В Микроконтроллерах Atmel есть интерфейс UART. Фактически это тот же RS-232, но с другими логическими уровнями. Используя его подключим наш микроконтроллер к компьютеру.

Подключение микроконтроллера к последовательному порту (RS-232) используя MAX232

Напрямую контроллер включать конечно же нельзя. Для сопряжения используют микросхему MAX232.

Код программы микроконтроллера для тестирования связи с компьютером:

На компьютере открываем Hyper Terminal, подключаемся с Com порту. Теперь можно передавать информацию с компьютера в микроконтроллер и, наоборот, с микроконтроллера в компьютер.

Программа работает просто - Вы нажимаете клавишу от 0 до 9, микроконтроллер возвращает соответствующую строку. Файлы примера можно скачать здесь. Обратите внимание, что микроконтроллер должен работать на частоте как минимум 2Мгц.

Подключение микроконтроллера к USB порту используя FT232


Используя FT232 можно обеспечить питание Вашей схемы напряжениями +5 и +3.3В. На этапе разработок Вам будет очень полезен модуль для подключения микроконтроллера к компьютеру на базе FT232. Его можно приобрести или сделать самостоятельно. Я поступил проще, купил отдельно плату, необходимые детали и собрал сам и сейчас плотно эксплуатирую. Где купить смотрите здесь.

Есть еще более простой и не дорогой способ, который я нашел - использование шнуров для подключения мобильных телефонов к компьютеру. Некоторые шнуры для подключения мобильных телефонов к компьютеру построены по такому же принципу. Т.е. имеют встроенную микросхему и после подключения и установки драйверов эмулируют последовательный COM-порт. У меня оставался такой разрезанный шнур (CA-42). Отрезаем разъем к мобильному телефону, находим нужные провода и подключаем напрямую к ногам микроконтроллера. При не правильном подключении ничего не сгорит. По крайней мере, у меня не сгорело :)

По отношению к вышеописанному модулю недостаток один - невозможно использовать питание, которое предоставляет USB порт. Такой метод подключения я использовал в метеостанции.

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

Существует способ подключения микроконтроллера к локальной сети посредством Ethernet модуля, и превращение его в отдельное сетевое устройство. Но о нем поговорим позже.

В рамках данной статьи мы не станем сильно погружаться в многообразие внутренних процессов и дебри архитектуры микроконтроллера. А основной нашей задачей будет являться – освоение азов практической работы с микроконтроллером и получение навыков для самостоятельной разработки и изготовления какого-либо интересующего нас электронного устройства.

Итак, что нам нужно для полного счастья?

2. Отладочная плата для микроконтроллера, желательно с DIP28 панелькой для микросхемы.

Отладочная плата для микроконтроллера

Удачным вариантом такой платы я бы посчитал изделие под названием "плата разработки ATmega8 – сделай сам", предлагаемое нашими китайскими друзьями за символические 150 отечественных рублей.

В комплект поставки входят:
– собственно, сама плата;
– Панелька DIP28;
– Кварцевый резонатор на 8 МГц;
– Разъём для подключения программатора;
– Разные деталюшки в виде: конденсаторов, резисторов, кнопок, светодиодов, т. е. всего того, что позволит легко запрограммировать и проверить микропроцессор в работе.

Можно, конечно, обойтись и без отладочной платы и произвести прошивку ATmega8 непосредственно в готовом устройстве, тем более что микропроцессор это сделать позволяет. Однако на практике произвести эти манипуляции заранее, а уже потом устанавливать микросхему по месту прописки оказывается значительно удобнее.

3. Программатор AVR USB, для того чтобы запрограммировать микроконтроллер, то есть перенести в него информацию с компьютера.

Программатор AVR USB

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

Программатор подсоединяется к USB порту компьютера, а другим своим концом к плате микроконтроллера.
Данное соединение осуществляется через ISP разъём кабеля, который также входит в комплект поставки.

Питание берётся от USB разъёма компьютера.
Работать программатор может под разными операционными системами, в том числе – под Windows.

Если тип приобретённого программатора не будет поддерживаться Atmel Studio, то придётся скачать и бесплатную программу прошивки микроконтроллеров, например, AVRDude.

4. Контактная макетная плата для монтажа без пайки.

Контактная макетная плата для монтажа без пайки

Такая макетная плата совместно с набором соединительных проводов (джамперов) будет весьма полезна на начальном этапе освоения микроконтроллера.

Она без какого-либо напряга и паяльника позволит соединить любые электронные элементы обвеса микроконтроллера в единую конструкцию, превращая весь процесс создания схемы в увлекательную игру с конструктором LEGO.

Подобный набор, состоящий из беспаечной макетной платы и комплекта проводов, обойдётся не дороже 200 рублей.


5. Для того чтобы в процессе отладки не перепрошивать ATmega8 бесчисленное количество раз, жизненно необходима программа, позволяющая отладить прошивку без участия микроконтроллера.
Для этой цели как нельзя лучше подходит программа для автоматизированного проектирования электронных схем (в том числе и микроконтроллеров) – Proteus. Она значительно упрощает процесс отладки программы без участия микроконтроллера, ведь любой накопитель имеет конечное число перезаписей, хотя это число и достаточно большое.

6. Если написать и отладить программу для микроконтроллера можно и без его непосредственного участия, то, по-любому, рано или поздно встанет конкретный вопрос: "А на фига мы всё это делали?".
Поэтому хочешь, не хочешь, а приобрести ATmega8 нам также всё ж таки придётся. Стоит она на Али, как и всё остальное, довольно-таки гуманных денег – около 100 рублей за единицу продукции, поэтому кошелёк опорожнит не сильно, но уважительного к себе отношения потребует.

Внешний вид и назначение выводов Atmega8

А теперь давайте-ка посмотрим: А что это за штука ATMEGA8 попала к нам в руки?

Рис.1 Внешний вид и назначение выводов Atmega8

У данного типа МК есть два типа питания – цифровое VCC (выв.7) и аналоговое AVCC (выв.20). В стандартном включении, когда на входы/выходы контроллера подаются логические 1 и 0, оба вывода питания соединяют (физически соединяются VCC и AVCC, поскольку GND выводы 8 и 22 уже замкнуты внутри ИМС через сопротивление 0,7 Ом). Однако при подключении нагрузки, эти земляные выводы необходимо замкнуть на плате, т. к. внутри они соединены тонким проводником, который при существенном токе не следует рассматривать как «перемычку».
Если используется встроенный АЦП, или входы/выходы задействованы для работы с аналоговыми сигналами, то для уменьшения помех производитель рекомендует использовать последовательный LC-фильтр по AVCC.
Между выводами питания и землёй (в непосредственной близости от выводов питания микросхемы) всегда следует устанавливать керамические конденсаторы ёмкостью 0,1 Мкф, которые обычно называют блокировочными конденсаторами.

Ещё один непомеченный цветом вывод (Рис.1) – 21 вывод (AREF).
AREF означает Analog Reference и является входом для подачи (при необходимости) опорного напряжения от внешнего источника питания.

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

1. Порты PB0. РВ7. Два вывода (РВ6 и PB7) используются для подключения кварцевого резонатора. Выводы РВ2. РВ5 зарезервированы для программирования МК. Таким образом, для общего применения остаются порты PB0 и PB1.
2. Порты PC0. РС6. Порты PC0. РС5 есть возможность использовать в качестве аналоговых входов. РС6 обычно используется для общего внешнего сброса настроек, т. е. перезагрузки прошивки МК.
3. Порты PD0. РD7. Эти порты можно использовать для общего применения.

Atmega8 выпускается с уже настроенным для использования встроенным RC-генератором с частотой 1МГц, который позволяет запустить МК без внешних элементов. Посредством конфигурационных манипуляций, значения этой частоты могут принимать также значения: 2, 4 и 8 MHz. Однако для решения многих задач стабильности RC-генератора оказывается явно недостаточно, в связи с чем для тактирования микроконтроллера используется внешний кварцевый резонатор.

Следует запомнить, что МК не является устройством, которое управляет большими мощностями, для этого есть транзисторы, тиристоры и прочие силовые элементы. Максимальный ток линии ввода/вывода составляет 40мА, максимальный суммарный ток по цепям питания и GND – 200мА.
И под занавес:

Основные технические параметры ATmega8:

Ну, на этом, пожалуй, и всё.
Для желающих посерьёзней углубиться в знания, могу порекомендовать datasheet производителя и русскоязычное описание ATmega8, с которым можно познакомиться по ссылке - ATMEGA8.

А на следующих страницах будем осваивать язык программирования, а также запускать несложные устройства, выполненные на микроконтроллерах.

Читайте также: