AVR-USB-MEGA16, V-USB, FAQ: переписка по вопросам программирования Печать
Добавил(а) microsin   

Здесь решил выложить переписку по вопросам программирования макетных плат, так там есть тоже немало интересного - в плане использования библиотеки V-USB (старое название AVR USB) и библиотеки libusb. Рассматриваются часто задаваемые вопросы (Frequently Asked Questions, FAQ) по макетной плате AVR-USB-MEGA16 (чип ATmega32 с программной реализацией интерфейса USB на основе библиотеки V-USB), AVR-USB-TINY45 (чип ATtiny85, для USB также используется V-USB, но без кварца) и metaboard (используется микроконтроллера ATmega328P с библиотекой V-USB).

avr-usb-mega16-IMG_8082.JPG hntd-tiny45-8173.jpg metaboard-IMG_1402.JPG
AVR-USB-MEGA16 AVR-USB-TINY45 metaboard

Туда залита демонстрационная прошивка HID-устройства, которая позволяет управлять светодиодом на макетной плате, и считывать его текущее состояние (горит светодиод или погашен). Ничего другого прошивка не умеет - управлять состоянием контактов платы P1..P22 этой прошивкой нельзя. Такое поведение прошивки сделано сознательно, чтобы упростить понимание принципа обмена данными с устройством USB HID. Исходный код и скомпилированная прошивка (main.hex) находится в архиве [1], папка examples\hid-custom-rq\firmware. Исходный код консольной программы и скомпилированный exe-файл (set-led.exe - программа для управления светодиодом этого HID-устройства), находится в том же архиве, папка examples\hid-custom-rq\commandline. Есть также другая программа с GUI-интерфейсом, написанная мною в демонстрационных целях на Visual Studio C++ - см. [2]. Она тоже может управлять светодиодом залитой по умолчанию прошивки. Я использую эту программу для проверки работоспособности плат.

Как вариант, можно туда залить очень полезное firmware Сергея Кухтецкого, которое позволяет очень просто написать программу для USB-устройства с помощью специального класса C#, см. [3].

С июля 2010 года в плату прошит загрузчик кода по USB - usbasploader. Чтобы запрограммировать макетную плату AVR-USB-MEGA16, программатор не нужен - достаточно подключения к компьютеру по USB.

Из письма пользователя: в плане написания программы для микроконтроллера больше понравилась AVR Studio т. к. она бесплатная. А остальные пока не смог оценить т. к. платные. Что лучше выбрать?

На все платные IDE есть таблетки, так что у Вас большой выбор. А по поводу посоветовать... У меня глаза уже замылены IAR Embedded Workbench - привык, и работаю в ней как с ARM, так и с AVR. AVR Studio тоже иногда приходится пользоваться по необходимости (если надо разобраться в чужом проекте в таком формате). Поэтому объективного советчика из меня не получится. Вот мое сравнение IAR и AVR Studio - см. [4]. Хоть я Вам и советую IAR, но Вы особо к моему совету не прислушивайтесь, и почитайте на всякий случай форумы.

А вот в плане написания программ для ПК. А по поводу IAR и AVR Studio я уже начитался до посинения :) просто понял что и то, и другое хорошо. С AVR Studio разобрался, теперь хочу пробовать IAR ( просто есть много исходников интересных и они написаны в IAR) И качнул IAR для ARM и только потом понял что не то скачал. Вот теперь ищу для AVR.

По поводу написания программ для ПК (ПО хоста USB) в контексте макетной платы AVR-USB-MEGA16 у Вас 3 варианта, с каждым из которых придется иметь дело при копании в чужих исходниках:

1. Notepad2 + makefile, язык C - для написания/редактирования программ под компилятор GCC.
2. Visual Studio .NET 2003, языки C и C++.
3. Visual Studio 2008 Express Edition, язык C# (бесплатная версия, которую
можно свободно скачать с сайта Microsoft).

Если будете писать программы "с нуля", но хотите пользоваться примерами программирования для USB, то большого значения не имеет, какую IDE используете. Можно использовать и не только вышеперечисленные 3 варианта, но и Delphi, и CBuilder, и даже Visual Basic. Самое главное - это разобраться, как в используемой IDE пользоваться библиотекой libusb (для непрофессионала в программировании это может оказаться не совсем просто). Для вариантов 1, 2, 3 есть готовые рабочие примеры программ хоста USB c хорошими комментариями и руководством, как что делать.

Спасибо за ответ. Express Edition уже скачал. Буду пробовать.

Из письма пользователя: имеется необходимость собрать датчик температур (до 1000 oС). Хотелось бы уточнить на счет платы AVR-USB-MEGA16, представленной на Вашем сайте:
- подходит ли она для измерения температур до 1000 oС (какой диапазон измеряемых напряжений).
- сколько термопар можно подключить к данной плате (имеется ли возможность использовать 2 и более термопар).

Макетная плата AVR-USB-MEGA16 не предназначена СПЕЦИАЛЬНО для измерения температур или подключения термопар - это просто УНИВЕРСАЛЬНАЯ макетная плата. Конечно же, для измерения температур и подключения термопар её МОЖНО использовать (см., например, статью Сергея Кухтецкого [8]), однако ответ на вопрос "подходит ли она для измерения температур до 1000 oС" зависит исключительно от метода подключения и типа термопар. Если выбрать самый простой путь подключения термопар - к встроенному АЦП микроконтроллера ATmega16 или ATmega32A (используя внешний усилитель сигнала термопары), то термопар можно подключить 8 штук(поскольку АЦП 8-канальный). Диапазон измеряемого напряжения каждого канала зависит от выбора опорного напряжения АЦП. Если использовать внутренний источник опорного напряжения 2.56 вольта, то диапазон измеряемых напряжений составит от 0 до 2.55 вольт с шагом 2.5 милливольта (1024 градации). Таким образом, схема усилителей сигнала с термопар должна быть рассчитана так, чтобы подогнать диапазон входного напряжения АЦП 0..2.55 вольт к диапазону измеряемых температур. Если дополнительно использовать встроенный в микроконтроллер ATmega16 или ATmega32A усилитель АЦП, то диапазон входного напряжения каждого канала изменится (за подробностями обращайтесь к даташиту на микроконтроллер). Если же Вы будете подключать термопары другим способом (например, используя внешние многоканальные АЦП), то количество термопар будет зависеть только от Вашей фантазии.

Из письма пользователя: ... вопрос по AVR-USB162 - чем она в основном отличается от AVR-USB-MEGA16? Скорость usb2.0 наверно не принципиальна, но если оно есть то хорошо, больше свободных контактов - тоже в моем варианте хорошо (программировать и отлаживать внешне пока не собираюсь, соответственно разъемы для ISP и JTAG наверно мне не нужны). Я понял к ней сложнее API и она меньше распространена?

Как Вы уже знаете наверное, макетная плата AVR-USB-MEGA16 отличается от макетной платы AVR-USB162 чипом (в первой стоит ATmega32, во второй AT90USB162), и поэтому техника работы с ними сильно отличается. Отличия в их использовании следующие (более подробно можете прочитать в статьях, описывающих эти макетные платы, см. ссылки из [5]:

1. С помощью макетной платы AVR-USB-MEGA16 могут быть реализованы только низкоскоростные USB-устройства. Она лучше всего подходит для USB HID устройств, предназначенных для управления от компьютера, либо считывания показаний с датчиков. Поддерживается спецификация только USB 1.1 (ограничение библиотеки V-USB от obdev.at). С помощью макетной платы AVR-USB162 можно делать полноценные устройства Full Speed USB 2.0.

2. Для новичка в интерфейсе USB программировать проще для макетной платы AVR-USB-MEGA16, поскольку как для firmware, так и для ПО хоста есть отличные рабочие примеры из библиотеки V-USB, на основе которых можно быстро создать свою программу. Для AVR-USB162 нужно пользоваться библиотекой LUFA и примерами от Atmel, которые все-таки несколько сложнее, чем примеры их библиотеки V-USB. Для ПО хоста есть атмеловская dll-ка, а также функции hid.dll или hid.lib, есть пример в DDK от Microsoft, а также есть пример от Atmel. Для ПО хоста, работающего с чипом AT90USB162, при известном умении можно использовать библиотечку libusb. Кое-что обо всем этом написано в статьях [2, 6, 7, 10, 24, 25]. В библиотеке LUFA для AVR-USB162 есть много примеров USB-устройств стандартных классов. Резюме - для макетной платы AVR-USB-MEGA16 нужно использовать библиотеку V-USB, а для макетной платы AVR-USB162 - библиотеку LUFA.

3. Портов ввода/вывода в AVR-USB-MEGA16 больше, чем у AVR-USB162. Кроме того, у чипа макетной платы AVR-USB-MEGA16 имеется встроенный 8-канальный 10-битный АЦП, а у чипа макетной платы AVR-USB162 встроенного АЦП нет. Кроме того, у чипа ATmega32 больше памяти программ и данных (FLASH/RAM/EEPROM), чем у чипа AT90USB162. Более подробно можете сравнить аппаратные ресурсы, если изучите содержимое даташитов на чип ATmega32 (макетная плата AVR-USB-MEGA16) и на чип AT90USB162 (макетная плата AVR-USB162).

4. Для обеих плат firmware можно разрабатывать в IDE AVR Studio + WinAVR (GNU GCC) и IDE IAR Embedded Workbench (есть примеры для обеих IDE), но для AVR Studio в режиме GNU GCC примеров намного больше и для AVR-USB-MEGA16, и для AVR-USB162.

5. ПО хоста для AVR-USB-MEGA16 можно разрабатывать в среде библиотеки libusb (т. е. Ваш любимый текстовый редактор + makefile), либо с помощью Visual Studio C, либо C#. В принципе, среда разработки некритична, поскольку самая простая (для меня) техника программирования - загрузить в память готовую dll с функциями libusb, и вызывать их точно так же, как в примерах GNU GCC. А это, сами понимаете, можно делать не только в Visual Studio, но и в Borland CBuilder и при известной сноровке в Delphi и даже в Visual Basic. Пример, как это делается, есть для Visual Studio - см. [2]. Платка AVR-USB-MEGA16 имеет в отношении разработки ПО хоста дополнительный плюс - можно взять готовую прошивку Сергея Кухтецкого, и перенести разработку кода исключительно в ПО хоста на C#, см. [3].

6. ПО хоста для AVR-USB162 лучше всего разрабатывать в Visual Studio (есть примеры от Microsoft и Atmel), но повторюсь - примеров ПО хоста немного, и иногда потребуются дополнительные изыскания для их поиска, поэтому среду для разработки можно выбрать исходя из того, какие примеры собираетесь использовать, а также из Ваших предпочтений. Для платы AVR-USB162 писать ПО хоста сложнее в том плане, что меньше готовых примеров, но библиотеки для ПО хоста нужно использовать те же самые, что и для AVR-USB-MEGA16.

7. Платка AVR-USB-MEGA16 программируется через JTAG, через ISP-программатор и с помощью USB-загрузчика кода usbasploader (при его использовании внешний программатор не нужен). Платка AVR-USB162 может программироваться с помощью ISP-программатора, а также с помощью фирменного USB-загрузчика Atmel (Flip DFU), см. описание процесса прошивки в статье про макетную плату AVR-USB162 [9], и она также позволяет прошивать плату без специального программатора. Для протокола Flip DFU есть альтернативный bootloader с открытым исходным кодом - в библиотеке LUFA.

8. Отладка firmware. Для обоих плат подходит техника написал код -> стер чип -> прошил чип -> проверил, не заработало -> написал код заново -> стер чип -> ... и так далее. Но лучше использовать аппаратный отладчик JTAGICE mkII или AVR Dragon (они работают с обеими платами) - тогда получите комфортную отладку (выполнение в realtime, точки останова, пошаговое выполнение по исходному коду на C и дизассемблированному, watch для переменных, просмотр/изменение регистров) в AVR Studio и IAR Embedded Workbench. Для платы AVR-USB-MEGA16 иногда firmware можно даже не разрабатывать, а взять готовую универсальную прошивку Сергея Кухтецкого для класса-обертки на C# (я про это уже упоминал).

Короче, если Вы профи в USB, не боитесь документации на английском, то лучше использовать макетную плату AVR-USB162. Если же хотите быстро добиться результата, не нужна большая скорость от USB - лучше использовать макетную плату AVR-USB-MEGA16.

Из письма пользователя: при подключении к компьютеру макетной платы AVR-USB-MEGA16 с записанной в неё "универсальной прошивкой" для класса-обертки (см. [3]) система Windows XP обнаружила устройство LEDControl и затребовала для него драйвер. Что это за драйвер и где его брать?

Драйвер находится в папке, куда Вы установили библиотеку libusb (предполагается, что Вы уже установили у себя библиотеку libusb, см. [10]). По умолчанию драйвер находится в папке c:\Program Files\LibUSB-Win32\src\ - там расположены необходимые файлы libusb0.sys и libusb0.dll. При инсталляции драйвера укажите путь в эту папку, и устройство нормально установится.

Драйвер можете скачать по ссылке [32]. Похожая проблема драйвера также обсуждается в вопросе 140807 при установке на операционной системе Windows 7 домашняя базовая 64 бит (см. далее).

Из письма пользователя: мне понравилась идея использования библиотеки V-USB с чипом без кварца, как в макетной плате AVR-USB-TINY45 [5]. На каких чипах можно использовать библиотеку V-USB без кварца?

Это возможно только на тех чипах, которые снабжены системой PLL (Phase Locked Loop), или ФАПЧ - это серии микроконтроллеров ATtiny25/45/85 и ATtiny26/46/86. Применение PLL в чипах AVR началось в новых моделях микроконтроллеров примерно с 2006 года.

Из письма пользователя: хорошая идея и хорошая реализация ;-) (тут имеется в виду статья Сергея Кухтецкого "AVR-USB-MEGA16: быстрая разработка USB приложений на C# при помощи класса-обертки ATMega16" [3]), но есть вопрос относительно использования прерываний внутри МК совместно с драйвером USB. В частности при использовании прерывания по завершению преобразования АЦП происходит зависание USB - устройство не определено. Похоже дело в регистре SREG. Приходится SREG запоминать до и восстанавливать сразу после в цикле запуска АЦП (изменения в регистре ADCSRA битов ADEN и ADIE), т.к. вместе с ним изменяется и сам SREG, а от него зависит драйвер USB. Возможно, я делаю что-то не так или есть другой способ?

Интересует - используете ли вы прерывания МК совместно с USB, если да то как?

Думаю, что USB зависает не из-за SREG (если Вы его корректно в прерывании сохраняете и на выходе из прерывания восстанавливаете). Зависание USB наверное происходит потому, что во время обработки прерывания от ADC у Вас не может сработать прерывание INT0 (порт PD2, ножка 11 микроконтроллера ATmega16 или ATmega32A), используемое для обработки протокола USB. При выходе из прерывания ADC прерывание INT0 конечно срабатывает, но слишком поздно - поезд уже ушел, и хост не получил вовремя ответа от устройства.

Прерывания совместно с библиотекой AVR USB (новое её название V-USB) я не использую и Вам не советую, так как это самый простой способ избежать глюков в работе USB. В Вашем случае - чтение данных с ADC - прерывания вообще не нужны - читайте данные с ADC в основном цикле main, а прерывания от ADC запретите. Софтверная реализация протокола USB подразумевает, что все ресурсы процессора отданы с исключительным приоритетом для быстрого ответа USB-устройства на запросы хоста. Использование других прерываний мешает обработке протокола USB. По поводу проблем с прерываниями и блокировок кода V-USB см. также [30].

Из письма пользователя: ... как мне прошивать плату AVR-USB-MEGA16? Могу я это сделать через USB? Или мне нужен внешний программатор?

С июля 2010 года в плату прошит загрузчик кода по USB - usbasploader (эмулирует популярный программатор USBasp). Чтобы запрограммировать макетную плату, программатор не нужен - достаточно подключения к компьютеру по USB. Подробнее прочитайте на страничке, посвященной плате AVR-USB-MEGA16 (статья "Макетная плата AVR-USB-MEGA16" см. раздел статьи [Чем программировать?]).

Другой способ прошивки - через JTAG или ISP коннектор, с помощью внешнего программатора (про программаторы почитайте здесь - [12]). Обычно я высылаю платы AVR-USB-MEGA16, прошитые тестовой прошивкой (см. [2]), или - если захочет клиент - прошивкой Сергея Кухтецкого (см. [3]).

См. также ответы на вопросы 091113, 100422, 130113, 131220, 140812, 141208, 150219.

Из письма пользователя: в примерах библиотеки V-USB первое устройство "custom-class" при подключении к компьютеру требует драйвер, который должен быть с расширением .inf. А его то нет. И устройство не устанавливается. Пример устройства USB HID работает без проблем.

Почитайте файл libusb\readme.txt (в архиве библиотеки V-USB [1]) - там подробно написано, где .inf файл взять и что с ним делать. Файл .inf для CDC-устройства (его еще называют "драйвером") поставляется вместе с библиотекой libusb, его можно свободно скачать в Интернете. Для генерации inf-файла используйте утилиту inf-wizard.exe, входящую в пакет libusb (например, у меня на компьютере она лежит в папке c:\WinAVR-20080610\utils\libusb\bin\). См. документацию по библиотеке libusb.

Из письма пользователя: ... проблема при компиляции прошивки от Сергея Кухтецкого для моей платы. Та скомпилированная прошивка, что идет в архиве (имеется в виду ссылка на закачку исходников в статье [3]) дает в результате Неопознанное устройство USB. При самостоятельной компиляции из под CodevisionAVR возникает много ошибок и файл прошивки не удается создать, не отредактировав его исходный текст по правилам. А при компиляции по инструкции написанной в статье [10], получаем прошивку, прошив которую опять же получаем Неопознанное устройство USB. В том же самом CodevisionAVR, создав тестовую прошивку мигания светодиода при включении устройства (без использования библиотеки V-USB), все отлично компилируется и работает...

Прошивка Сергея Кухтецкого (как и все примеры [1]) была проверена многими людьми, поэтому скорее всего проблема не в ней. Конечно, чего только не бывает, и ошибки встречаются, мы же люди/человеки, и не ошибаться не можем. Проверьте на всякий случай, что Вы прошиваете именно тот файл, который соответствует Вашему типу микроконтроллера (ATmega16 или ATmega32) и Вашей частоте кварца (либо 12, либо 16 МГц), а не какой-нибудь другой, и у Вас в программаторе правильно выставлен формат файла (Intel HEX), а также проверьте правильность установки перемычек кристалла: FUSE_L = ffh, FUSE_H = 09h (это важно!). После того, как прошьете макетную плату и воткнете её в компьютер, должно обнаружиться новое устройство, и компьютер запросит драйвер. Этот драйвер лежит в папке c:\WinAVR-20080610\utils\libusb\bin (если мне не изменяет память, давно дело было). Новый драйвер (точнее, inf-файл для него), кстати, можно сгенерировать утилитой c:\WinAVR-20080610\utils\libusb\bin\inf-wizard.exe.

После того, как на запрос драйвера укажете папку c:\WinAVR-20080610\utils\libusb\bin\, Windows установит драйвер и увидит USB устройство, и Вы сможете воспользоваться классом Сергея Кухтецкого для написания программ на Visual Studio C#. Если Вы все эти шаги не проделали, то получите то, что имеете - неопознанное устройство USB. Кроме того, необходимо установить библиотеку libusb. Подозреваю, что Вы этого не делали =).

Таким образом, еще раз, что Вам надо сделать:

1. Убедитесь, что файл прошивки соответствует именно Вашему микроконтроллеру AVR (могут быть варианты ATmega16 или ATmega32) именно той частоте кварцевого резонатора, который используется у Вас (макетные платы AVR-USB-MEGA16 могут быть с кварцами на 12 и 16 МГц.).
2. Проверьте формат файла в программаторе (Intel HEX).
3. Правильно прошейте перемычки (фьюзы) микроконтроллера LOW FUSE BYTE: 0xCF, HIGH FUSE BYTE: 0x98, LOCKOPT BYTE: 0xEF.
4. Обязательно установите пакет WinAVR, иначе Вы не сможете получить драйвер для USB-устройства и установить USB-устройство в систему Windows.
5. Обязательно установите библиотеку libusb, иначе не будет работать не только класс Сергея Кухтецкого, но и вообще ничего не будет работать (ни одна из программ примеров ПО хоста, так как все они используют библиотеку libusb).
6. Не забывайте по make clean (см. [30]).

Если у Вас возникнут трудности с установкой libusb и WinAVR, почитайте статью [10] - там все расписано по шагам. Кроме того, перечитайте весь этот FAQ - возможно, люди сталкивались с похожими проблемами, как и у Вас.

Насчет компиляции исходных кодов - то, что лежит у меня на сайте (см. [1]), а также на сайте компании Objective Development (это компания, которая разработала библиотеку V-USB и все примеры для USB, которые мы используем), НЕ ПРЕДНАЗНАЧЕНО для компиляции из-под CodeVision AVR. Я компилировал все это хозяйство инструментами GNU gcc, входящими в комплект WinAVR, и особых проблем не было. Поэтому не удивляйтесь, что CodeVision AVR ругается, и генерируемый им код для USB не работает - с портированием библиотеки V-USB (и примеров firmware под эту библиотеку, конечно) на CodeVision нужно разбираться отдельно. Наверное, это несложно (имеем исходный код на C и на ассемблере), но все-таки.

Прошивал и не раз, и снова неудача. Пакеты libusb и WinAVR установлены и работали до 1-го перепрошивания купленной платы через ChipProg в Uprog. Я подозреваю, что у меня изменились значения fuse при прошивке через программаторы ChipProg, ChipProg+, и поэтому хочу сравнить с правильными значениями fuse в программе UniProf, их значения я прочитал и прикрепил к письму.

Если не трудно, пожалуйста пришлите скриншоты считанных фьюзов в UniProf макетной платы AVR-USB-MEGA16, т. к. в Codevision AVR мой "5-проводковый com программатор" не определяется, и я не могу ни прочесть ни записать там значения фьюзов, поэтому есть только UniProf (http://avr.nikolaew.org/data/uniprof20jan6.zip).

Рад бы помочь, но у меня нет программатора UniProf (этих самых "5 проводков"), поэтому не смогу запустить ту программу, что Вы прислали, прочитать перемычки и выслать скриншот. Зато у меня есть шестнадцатеричное значение байтов перемычек: микроконтроллера LOW FUSE BYTE: 0xCF, HIGH FUSE BYTE: 0x98, LOCKOPT BYTE: 0xEF, а также есть замечательный ресурс, который может перевести эти шестнадцатеричные значения в имена и состояния перемычек - AVR Fuse Calculator (см. [16]). Выберите там чип ATmega16 или ATmega32A, и вперед, сможете сами расставить галочки уже в программе UniProF.

Сходил я домой на обед, попробовал прошить файл "firmware simple.zip/firmware simple/main.hex", и все застреляло с первого раза (как и ожидалось). Высылаю на всякий случай прошивку main.hex (из файла архива исходников проекта статьи [3]), а также скриншоты перемычек и Диспетчера Устройств (так должно отображаться Ваше устройство в Windows после установки драйвера). Так что похоже что-то Вы делали не так, как я объяснил в прошлом письме. Для прошивки макетной платы AVR-USB-MEGA16 я пользовался самодельным программатором AVR Doper (см. [12]) из AVR Studio (AVR Prog).

УРААА!! Заработало!!
Огромное спасибо, все таки при 1-й перепрошивке мне прошились не те фьюзы. Ну хоть теперь исправил все =).

Из письма пользователя: можно ли организовать с помощью данной технологии (имеется в виду передача данных через USB) следующую задачу: 8 - 16 каналов ШИМ для управления яркостью светодиодов с приложения?

Такого количества аппаратных каналов ШИМ у ATmega16 или ATmega32A нет, то реализовывать ШИМ придется программно. Придется дорабатывать код класса-обертки и firmware, чтобы обеспечить интерфейс к соответствующим функциям ШИМ firmware. А удастся это или нет вместе с библиотекой V-USB - тут все зависит от конкретных условий задачи (например, частота ШИМ, количество градаций). Но качественный программный ШИМ (чтобы, например, не было заметно мигания светодиода) наверное с использованием библиотеки V-USB невозможен, потому что прерывания от сигнала USB (INT0) будут влиять на длительности интервалов ШИМ. Вот если бы Вы ограничились только одним или двумя каналами, тогда никаких проблем, поскольку можно было бы использовать аппаратный ШИМ ATmega16.

Из письма пользователя: интересует программа - просто расширитель линий. Я так понял, что ATmega16 или ATmega32A видится в системе как некий виртуальный ком порт. Требуется байт, который пишу в COM-порт, выводить на порт С (PC0..PC7) и наоборот, при чтении байта из COM-порта в компьютер поступает состояние порта А (PA0..PA7).

ATmega16 или ATmega32A видится как COM-порт только в том случае, если в неё зашита firmware, реализующая класс CDC. Из проектов, которые есть у меня на сайте, по такому принципу работают:
- программатор AVR910 (см. [12]).
- программатор AVR-Doper (см. [12]).
- CDC-232 и CDC-IO (см. [18]).
- hardctrl - управляемый сторожевой таймер (см. [19]).

Если хотите управлять через виртуальный COM-порт, то присмотритесь к проекту CDC-IO, он с лихвой перекрывает Ваши требования. Возможно также управление ресурсами микроконтроллера (чтение/запись портов A, B, C и других регистров) с помощью прошивки Сергея Кухтецкого, взаимодействующей в ПО хоста (программе на компьютере) с классом-оберткой на C#. Советую также посетить страничку проектов библиотеки V-USB - там наверняка найдете много интересного. Большинство этих проектов удобно собирать на макетной плате AVR-USB-MEGA16.

Сергей Кухтецкий: С прерываниями в работе с библиотекой V-USB все не так страшно, если НЕ требуется НЕМЕДЛЕННАЯ обработка своих прерываний. Часто именно так и бывает. Например, те же данные от АЦП можно "забрать" и чуть позже, чем пришло прерывание от АЦП. В таких случаях работает простое "лекарство" - разрешить обработку прерываний в СВОИХ процедурах обработки прерываний путем вставки sei() в начале своего обработчика.

Вот пример обработки прерываний от таймера для "шагания" шагового двигателя.

//-----------------------------------------------------------------------------
// Обработчик прерывания от таймера 1 (COMPA)
//-----------------------------------------------------------------------------
ISR(TIMER1_COMPA_vect)
{
   sei(); // Пусть прерывания от USB поимеют приоритет повыше,
          // чтобы USB не "завис"...
 
   if(lcFlag && (lc >= lcm))
   {
      // Если уже выдали конкретное количество шагов (дозу) -
      // запрещаем прерывания по таймеру TIMER1.
      TIMSK &= (byte)(~(1 << OCIE1A));
   }
   else
   {
      // Делаем шаг двигателя
      SMDoStep();
   }
}

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

В самом начале работы с V-USB - эта проблема меня очень сильно "достала". Пока не додумался так "закостылить" проблему приоритетов прерываний в AVR. После этого - БОЛЬШИНСТВО проблем с прерываниями в V-USB совсем ИСЧЕЗЛО.

Из письма пользователя: есть вопросы по статье Простой пример управления портами P1..P22 платы AVR-USB-MEGA16 (portctrl):

1. Беру я, к примеру, тот же ATmega640, в файле pins.h я должен определить дополнительные переменные LED* которые будут соответствовать определенным битам порта контроллера, а также задать маску для других регистров. В файле portctrl.c также прописываем дополнительные регистры и в строке 233 изменяем переменную ledstate до требуемого количество битов (выходных светодиодов).
—> Поэтому если я задействую, к примеру, 10 полноценных регистров контроллера то посылать я должен уже не 4 байт, а 10 + 1 байт который бы определял режим работы светодиода? Поэтому не могли бы Вы сказать в каком месте кода, нужно сделать так чтобы теперь 11-й байт, посылаемый на контроллер, определял режим работы светодиодов (вкл или выкл)?
2. Возможно ли так сделать, чтобы ДИНАМИЧЕСКИ можно было назначать определённые порты как на выход так и на вход (например, пересылкой управляющей команды hidtool setget), а затем уже считывать состояние портов (hidtool read)?

1. Наверное, Вы все правильно поняли. Конечно, нужно задать макроопределения для всех используемых в программе портов микроконтроллера (LEDxx) и маски для управления ими. Кроме того, нужно переписать процедуру LedControl в том виде, чтобы она была удобна для управления всеми Вашими портами. Сколько конкретно передавать байт данных - зависит только от метода кодирования в них информации о состояниях портов, это не имеет принципиально никакого значения. Делайте так, как Вам удобно. Можно даже выделить под один светодиод целый байт - кто нам мешает, если память это позволяет?
2. Очень даже запросто. Все давно украдено до нас =). Почитайте статью Сергея Кухтецкого [3] (если коротко - прошивка позволяет напрямую управлять ресурсами - портами, регистрами - из программы на Visual C#), а также еще [18] (см. CDC-IO - это примерно тоже самое, что и делает прошивка Сергея Кухтецкого, только управление ресурсами осуществляется через виртуальный COM-порт). Выбирайте, что Вам по вкусу - можно взять все готовенькое, а можно на основе этих примеров сделать что-то свое.

Из письма пользователя: необходимо сделать устройство для измерения усилия на тензодатчике. Процесс довольно быстрый и необходимо делать 500..1000 измерений в секунду. Встроенный в ATmega16 или ATmega32A АЦП (ADC) позволяет работать на такой скорости. Но как я понял интерфейс не сможет передавать на такой скорости информацию в ПК?

Все зависит от того, какой объем данных Вам нужно передавать. Библиотека V-USB может предоставить скорость low speed, что составляет 1.5 мегабит/сек. Если Вы забуферизируете данные с АЦП, или, что еще лучше - сделаете над ними статистическую обработку (свертку, чтобы уменьшить объем данных), то сможете уложиться в полосу. Простой расчет показывает - даже без свертки 1000 выборок/сек = 10 бит АЦП * 1000 = 0.01 мегабит/сек. С такой скоростью справится обычный low speed USB HID, т. е. V-USB подойдет. Проблема может возникнуть, если Вам нужно сделать ТОЧНУЮ привязку выборок к абсолютному времени - тут уже обработка протокола USB будет мешать (она работает по прерываниям с максимальным приоритетом). В этом случае присмотритесь к чипам с аппаратной поддержкой интерфейса USB, см. макетную плату AVR-USB162.

Спасибо за ответ. Точная привязка по времени не нужна, главное - чтобы данные шли на порт. Получается надо организовать прием потока байтов, заранее записанных в RAM микроконтроллера из АЦП (например 10-20 раз в секунду). Или средствами микроконтроллера усреднять данные с АЦП, передавая потом только результат усреднения в ПК в таком же интервале. Последний вопрос - есть ли команды которые позволяют передавать данные сразу массивами или непрерывным потоком?

Тогда Вы точно уложитесь. А команд никаких нет. Есть библиотека V-USB (для firmware), и есть библиотека libusb (для ПО хоста). В библиотеке V-USB есть примеры firmware, которые могут передавать данные в двух направлениях, и есть примеры ПО хоста, которые используют функции библиотеки libusb. Все просто - берете готовый пример, и организуете "поток данных" из буфера АЦП (можно кольцевого, например) путем передачи блоков фиксированного размера. В примерах есть передача за раз по 4 байта (см. пример avr-usb-russian\examples\hid-custom-rq) и по 128 байт (см. пример avr-usb-russian\examples\hid-data).

Спасибо. Теперь все понятно.

Из письма пользователя: есть несколько вопросов по AVR-USB-MEGA16. Устройство необходимо для работы в качестве банального набора портов, которые будут изредка дёргаться программой. Причем часть портов должна быть выходами (управление), часть - входами (датчиками).

Вопросы такие:

1. Есть ли драйвера под Windows CE 6.0? Точнее - что нужно для работы под управлением этой операционной системы?
2. "стандартная программа" (один из примеров) для микроконтроллера это как раз то, что мне нужно, или там все порты- выводы и придётся её переписать???
3. Как заливать программу в микроконтроллер: нужен отдельный программатор или достаточно макетной платы?

1. Насчет драйверов. Честно говоря, я никогда не писал драйвера для USB устройств под Windows, и мне еще не попадались толковые примеры таких драйверов с исходниками. Все устройства USB, которые мне удавалось сделать, основывались на стандартных классах USB, для которых драйвера не нужны - класс HID (драйвер не нужен), класс CDC (драйвер не нужен, либо нужен только информационный *.inf - файл), класс MSD (Mass Storage Device, драйвер не нужен). Все эти классы имеют драйвера, УЖЕ ВСТРОЕННЫЕ В ОПЕРАЦИОННУЮ СИСТЕМУ, поэтому никакие драйвера не нужны. Под Вашу задачу подойдет с запасом низкоскоростной USB HID. Под обычной Windows для USB HID драйвера не нужны, и наверное не нужны они и под Windows CE (я не пробовал, поэтому говорю "наверное"). Но! Управляющая программа - ПО хоста, не драйвер! - которая должна работать с устройством, все равно нужна, и писать её придется и для Windows, и для Windows CE, как, впрочем, и для любой другой операционной системы (Mac OS, Linux, FreeBSD). Если для простой Windows XP тут может помочь библиотека libusb, для которой есть куча примеров рабочего кода (простого!), то для Windows CE придется писать код на Windows API и пользоваться примерами из Windows CE SDK/DDK, что для человека неопытного может вызвать определенные трудности. Резюме: для программирования ввода-вывода через USB для Windows CE однозначно выбирайте USB HID (драйвера не нужны), и ищите примеры кода ПО хоста, написанного на Windows API.

2. Что вы подразумеваете под "стандартной программой"? Примеров программ очень много, которые можно взять за основу для чтения ножек микроконтроллера и управления ими. Главное понять общий принцип - как передавать и принимать данные через канал USB. После этого осталось только наложить на передаваемые данные информацию о состоянии ножек - вот и все, управление портами и их чтение готово. Можете взять за основу examples\hid-custom-rq\ (чтение состояния светодиода и управление им) - это самый простой для понимания пример (передача да один раз до 4 байт). Можно также взять examples\hid-data\ - пример записи/чтения блока данных (передача да один раз до 128 байт).

Посмотрите также статью [18], проект CDC-IO - там даже программировать ничего не надо, просто берете готовый код, и все. То же самое с классом-оберткой на C# Сергея Кухтецкого - берете готовый код прошивки ATmega16 или ATmega32A (ничего для микроконтроллера писать не надо), а все остальное берет на себя Ваша программа ПО хоста на С# - управляйте на здоровье через регистры любыми ножками, читайте их, записывайте - как того душа пожелает (можете также управлять таймерами/читать их, АЦП и т. д.).

3. Для макетной платы AVR-USB-MEGA16 для заливки кода не нужен внешний ISP-программатор, можно пользоваться USB-загрузчиком. Хотя конечно ISP программатор Вы тоже можете использовать, выбирайте любой на вкус (см. [12]).

Пытаюсь общаться с девайсом AVR-USB-MEGA16 посредством стандартной hid.dll (из Delphi). Видит, читает параметры, название, производителя и т. п. Вопрос - как зажечь светодиод и управлять портами?

FileWrite(HidHandle, buf, bufsize) и HidD_SetFeature(HidHandle, buf, bufsize) не приводят ни к чему толковому, хотя стандартная утилитка светодиод таки зажигает.

Конкретно вопросы такие:
Какой должен быть размер буфера buf?
Capabilities.FeatureReportByteLength + 1 ??? Функция Capabilities.FeatureReportByteLength возвращает всего 2 байта, т.е. к отправке- три, из них первый - ноль. Отправляю все FF, т.е. вид: 00 FF FF - ничего не зажигается.

В примере из командной строки отправляется 5 байт. Пытался отправить 6 байт вида 00 FF FF 3F 00 01, результата - никакого.

Ни С, ни Visual Studio у меня нету, но судя по примерам - оно передаёт в макетную плату просто 0 или 1. Пробовал и 00 01 и 00 00 - не зажигает светодиод!

Что нужно туда отправить, чтобы зажечь, и каким способом: FileWrite или HidD_SetFeature??? Либо каким-то другим способом???

У меня нет примеров, как управлять устройствами, основанными на V-USB, с помощью стандартной библиотеки HID.dll - не только на Delphi, но и на любом другом языке. Зато есть куча примеров, как делать то же самое, но с помощью другой библиотеки - libusb. Все примеры, правда, не для Delphi, но это не важно - алгоритм работы с функциями библиотеки libusb не зависит от языка и среды программирования. Вам только нужно научиться загружать в своей программе на Delphi библиотеку libusb (почти так же, как Вы должны загрузить HID.dll - я говорю почти, т. к. формат вызова функций в библиотеке libusb другой) и вызывать из неё функции - тупо в соответствии с имеющимися примерами.

По поводу использования HID.dll - если Вы все же решите продолжить эксперименты с ней. Прошивка examples\hid-custom-rq\firmware\main.hex (она прошита в вашей макетной плате, если Вы её не перепрошивали) управляет светодиодом и получает его статус с помощью управляющих сообщений USB (USB control messages). Об этом написано в статье [20]. Если Вы с помощью библиотеки HID.dll научитесь посылать управляющие сообщения USB нужного формата (повторяю, что с помощью HID.dll я сам этого делать не умею и соответствующих примеров у меня нет, есть только примеры для libusb), то Вы сможете управлять состоянием светодиода и считывать информацию - включен он или выключен. Попробуйте воспользоваться снифером протокола USB, и посмотрите, что передает нормально работающая программа (которая основана на libusb), и что передает Ваша программа - возможно, это сможет помочь найти ошибку. Если разберетесь, напишите мне, пожалуйста.

К сожалению, я не могу прокомментировать Ваши исходники - что там правильно или нет, поскольку примеров работы с библиотекой HID.dll в контексте управления устройством HID V-USB (examples\hid-custom-rq) у меня нет.

Ага, я понял, буду копать дальше. Библиотечку hid.dll и только её хочу использовать, т. к. потом софт будет мигрировать на платформу Windows CE 6.0, а там ни одна из рекомендованных библиотек работать не будет.

Скачал Libusb-win32, поставил, все вроде установилось, только программа testlibusb-win.exe не находит ни одного устройства, так и должно быть? Подскажите может libusb работает только с AVR? Если AVR-USB-MEGA16 не подключена должна быть какая то реакция со стороны testlibusb-win.exe?

Программа testlibusb-win.exe должна показывать абсолютно все USB-устройства, корректно установленные в системе и имеющие подключенные драйвера, и которые имеют (это важно, поскольку это особенность работы libusb!) привязку к драйверу фильтра. Драйвер фильтра устанавливается на устройство USB с помощью специальной программы Filter Wizard. Подробнее см. статью [10]. Библиотека libusb предназначена для программного обмена данными с ЛЮБЫМИ устройствами, а не только с устройствами USB на микроконтроллерах AVR. Если AVR-USB-MEGA16 не подключена, или в ней нет firmware, предназначенного для поддержки протокола USB, то никакой реакции со стороны testlibusb-win.exe не будет (в показываемом списке USB-устройств не будет устройства, соответствующего макетной плате AVR-USB-MEGA16). Выполните все действия по установке библиотеки libusb и драйвера для неё, см. статью [10].

Тогда что из этого я не так делаю:
Качаю отсюда http://cdnetworks-kr-2.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/0.1.12.2/libusb-win32-filter-bin-0.1.12.2.exe
Устанавливаю, во время установки ничего не меняю, она там что то делает. Запускаю тест: вот результат:
DLL version: 0.1.12.2
Driver version: -1.-1.-1.-1
bus/device idVendor/idProduct
и на этом все заканчивается. Пробовал на Win7, winXP(SP2,SP3), Win2003Server везде одно и тоже.

Обратите внимание на строчку Driver version: -1.-1.-1.-1 (а должно быть Driver version: 0.1.12.1). У Вас наверное не установлен драйвер libusb-win32-filter-bin-0.1.12.1.exe. Почитайте внимательнее пункт 8 статьи "Разработка устройства USB - как начать работу с библиотеками AVR USB (V-USB) и libusb".

Здравствуйте! Наконец то решил собрать данную схему, и при проверке наткнулся на такую проблему: выход порта РВ0 (там где светодиод) никак не управляется, хотя остальные работают отлично. Возможно ли это связано с прошивкой контроллера, которая не дает возможность управлять ногой РВ0, или здесь другая проблема? И ещё, если в fuse дезактивировать JTAG возможно ли к управляемым портам подсоединить к управлению порты РС2-РС5 (которые раньше были задействованы под JTAG) без изменения прошивки?

Возможность управления портом PB0, как и любым другим (в том числе и портами PC2..PC5, задействованными под JTAG) зависит только от программы firmware, прошитой в микроконтроллер. Смотрите в исходниках той программы, которую прошиваете - как настраиваются интересующие Вас порты, и управляйте состоянием портов соответственно Вашим нуждам.

Если Вы оставите фьюз JTAGEN незапрограммированным, то ножки PC2..PC5 микроконтроллера ATmega16 или ATmega32A можете использовать как обычные порты ввода-вывода.

Из письма пользователя: ... не подскажешь как прошивку залить - там написано программатор нужен. Его наверное через ISP подключать надо.

С июля 2010 года в плату прошит загрузчик кода по USB - usbasploader. Чтобы запрограммировать макетную плату AVR-USB-MEGA16, программатор не нужен - достаточно подключения к компьютеру по USB.

Если у Вас макетная плата без загрузчика, то нужен программатор ISP или JTAG-отладчик. Если программатора у тебя нету, то выбери любой подходящий - см. [12], или спаяй сам. Если будешь делать сам, то советую взять STK200+/300 - совместимый программатор (см. [12]), а еще лучше - STK500 наподобие AVR Doper (см. [12]). Он может быть собран по простейшей схеме, поддерживается многими оболочками для программирования: IC-Prog, PonyProg, UniProf, CodeVisionAVR C Compiler.

... к разъему ISP подключу программатор, а питание подать через USB?

Да, через USB-коннектор подать питание проще всего. Я подаю иногда питание через ISP-коннектор, когда надо много плат запрограммировать. Если Ваш программатор может подавать питание через ISP, то Вы можете так же поступить.

См. также ответы на вопросы 091113, 100422, 130113, 131220, 140812, 141208, 150219.

Из письма пользователя: ... не могли бы Вы мне помочь? Собрал схему (http://www.obdev.at/products/vusb/hidkeys.html), залил прошивку, но после подключения комп выдает Windows что устройство не опознано, а в Linux пытается определить, но после задержек в 100 мсек хаб отключается. Уже вторую неделю бьюсь, безрезультатно.

Не расстраивайтесь, у меня с первыми устройствами было точно так же, пока не появилась надежная макетная плата, где хотя бы подсистема USB разведена правильно. К тому же, когда приходит очередная партия с завода, некоторый процент макетных плат не работает (примерно 1 плата из 20) по самым банальным причинам - битое переходное отверстие или непропай miniUSB коннектора (он паяется труднее всего). У Вас может быть нечто подобное.

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

1. Не прошит или неисправен микроконтроллер. Как ни банально звучит, Вы должны быть на 100% уверены, что причина не в этом. Проверьте осциллографом напряжение и качество питания микроконтроллера. Перекомпилируйте проект, чтобы убедиться, что его настройки совпадают с настройками Makefile и файла usbconfig.h. Перепрошейте перекомпилированной прошивкой микроконтроллер. Убедитесь в том, что тип микроконтроллера соответствует настройкам Makefile (-mmcu=atmega8).
2. Собранная схема не соответствует той, что должна быть - это была одна из причин, по которой не работали мои первые схемы на V-USB. Тщательно проверьте монтаж, не замыкает ли клавиатурная матрица или другие ножки (из-за этого программа может зациклиться). Особенно тщательно проверьте схему подключения выводов D+ и D- сигналов USB - все резисторы должны быть правильно подключены, порты микроконтроллера соответствуют схеме и файлу usbconfig.h (ножки соответствуют схеме и макросам USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT и USB_CFG_DPLUS_BIT). Проверьте осциллографом логические уровни на портах PD0 и PD2.
3. Без правильно прошитых перемычек (fuses, фьюзы) схема работать не будет. Прошейте перемычки именно в те значения, что указаны в Makefile - fuse HIGH = 0xc9, fuse LOW = 0x9f.
4. Поскольку Ваш проект имеет только одну возможную частоту кварца - 12 МГц (т. е. частота кварца не задается в Makefile), достаточно проверить осциллографом, что кварцевый генератор работает, и на нужной частоте, или на всякий случай попробовать поменять кварц.
5. При компиляции проекта не забывайте выполнять предварительно команду make clean (см. [30]).

Заработало! За основу взял схему и прошивку из [21]. Разобравшись, выяснил, что проблема была с подключением выводов, и не зашивались fuse-биты. Спасибо за помощь!

Да, через USB-коннектор подать питание проще всего. Я подаю иногда питание через ISP-коннектор, когда надо много плат запрограммировать. Если Ваш программатор может подавать питание через ISP, то Вы можете так же поступить.

... как мне одновременно подсоединить несколько плат и программно работать с ними?

Самый простой способ - сделать у каждой из плат разные значения VID и PID, и в программе ПО хоста различать макетные платы по этим разным VID и PID. Идентификаторы VID и PID являются составной частью протокола USB (см. например статью [22]). Для библиотеки V-USB (она используется для проектирования USB-устройств с помощью микроконтроллера ATmega16 или ATmega32A) значения VID и PID задаются в файле usbconfig.h, макросы USB_CFG_VENDOR_ID и USB_CFG_DEVICE_ID (см. примеры программ, поставляемые с библиотекой V-USB).

Необходимо опрашивать состояние 50 контактных датчиков - как это сделать с помощью макетной платы AVR-USB-MEGA16 (просто припаяв провода)?

Просто припаяв провода, можно этой платой опрашивать только 22 датчика. Чтобы можно было опрашивать бОльшее количество датчиков (50 и более), есть следующие варианты:
1. Подключить датчики с помощью мультиплексора или дешифратора.
2. Соединить датчики в матрицу, и порты микроконтроллер а подключить к строкам и столбцам матрицы. Если необходимо определять любое количество
замкнутых контактов одновременно, то матрица из контактов не подходит.
3. Соединить датчики с цепочками резисторов и читать состояние датчиков с помощью 8-канального АЦП, встроенного в ATmega16.

Из перечисленных выше 3 способов я понимаю только 2, но он как раз пока под вопросом. Почему матрица не подходит? Есть же какая-то верхняя граница (так как можно же одновременно замкнуть 2, 3, 4, 5... значит и максимум должен быть). Мне бы хотелось узнать точный максимум так число одновременно замкнутых контактов это как раз основная проблема в моей задаче. А первый и третий для меня непонятны.

Требование по определению необходимого максимального числа одновременно замкнутых контактов в матрице выдвигается только из постановки задачи, макетная плата и микроконтроллер ATmega16 или ATmega32A тут ни при чем. Максимум детектируемых одновременно нажатий зависит от алгоритма опроса матрицы и скорости опроса, т. е. от соотношения длительности одновременного нажатия и длительности цикла опроса матрицы, а также от расположения одновременно нажатых клавиш на матрице. В любой клавиатурной матрице максимальное количество определяемых нажатых одновременно клавиш определяется ТЕХЗАДАНИЕМ - т. е. изначально допускается, что НЕВОЗМОЖНО узнать в ЛЮБОЙ момент времени ЛЮБОЕ количество одновременно нажатых клавиш, просто в техзадании указывается, как компромисс, максимальное определяемое количество одновременно нажатых кнопок и интервал опроса, или время реакции матрицы. ОТНОСИТЕЛЬНО ЭТОГО УПРОЩЕННОГО ТЕХЗАДАНИЯ проектируется конфигурация матрицы, подбирается требуемый по мощности микроконтроллер. Более подробно я не могу объяснить, так как для этого придется объяснять, КАК работает алгоритм сканирования матрицы замыкаемых контактов (а таких алгоритмов придумано множество), и ПОЧЕМУ он не может отловить некоторые одновременно нажатые комбинации кнопок в ЛЮБОЙ интервал времени. Если вам интересно, сами ищите и изучайте соответствующую техническую литературу.

Теперь про метод 1, который Вы не поняли. Применение мультиплексоров позволяет увеличить количество входов у схемы с микроконтроллером. Поясню на примере мультиплексора 74HC151. Он имеет 8 входов и 1 выход. Если Вы примените 5 таких мультиплексоров, то получите 5*8 = 40 входов, при этом на микроконтроллере ATmega16 или ATmega32A будет задействовано всего лишь 5+3=8 портов (5 - для подключения выходов мультиплексоров, а 3 - для формирования адреса для мультиплексоров), т. е. Вы сможете опрашивать 40+(22-8) = 54 датчика. Аналог 74HC151 мультиплексора - 74151, 74HC151, 74LS151, 74F151, или можно даже взять его отечественный аналог К155КП7. Они ничем не отличаются функционально, различны только токи потребления, быстродействие, нагрузочная способность (для Вас это без разницы). Можно приспособить 155КП15, или 155КП5, нужно только правильно все подключить. Причем не обязательно брать мультиплексор 8-в-1, можно поставить 16-в-1 (например 155КП1 или его аналог), если сможете найти.

Можно также применить специализированные расширители портов. Например, одна микросхема max7301 даст Вам дополнительные 28 портов, при этом на ATmega16 или ATmega32A будет задействовано только 4 порта, т. е. Вы сможете только с одной микросхемой MAX7301 опрашивать 28+(22-4)=46 датчиков.

Теперь про метод 3, который Вы не поняли. В микроконтроллере ATmega16 (или ATmega32A) есть 10-битный АЦП (8-канальный). На 1 канал АЦП можно подключить, к примеру, 7 кнопок (на 8 каналов, соответственно 8*7=56 кнопок). Кнопки должны быть включены вместе с резисторами таким образом, чтобы получился ЦАП на резисторах. Резисторный ЦАП может быть, например, выполнен по Covox (см. в Википедии). То есть в зависимости от комбинации нажатых 7-ми кнопок мы получаем на выходе ЦАП аналоговое напряжение, которое будет измерять АЦП микроконтроллера ATmega16, и по этому напряжению будет определять, какие кнопки нажаты. Так как каналов АЦП у ATmega16 (или ATmega32A) восемь, то таким образом можно опрашивать 7*8 = 56 кнопок.

Я пытался из командной строки перекомпилировать makefile (прошивка С. Кухтецкого для управления шаговым двигателем (01 простой вариант)) на кристалл ATmega32. После прошивки через бутлоадер USBasp с помощью Khazama AVR Programmer обнаружилось неизвестное устройство с кодом USB\VID_0000&PID_0000\5&30F4D41&0&1. Так бы не должно быть. Все что знал - все перепробовал, у меня не получается, а очень нужно. Помогите, пожалуйста, мне скомпилировать файл hex для ATmega32 (12 МГц), заранее спасибо.

Проблема заключается в том, что makefile из проекта Сергея Кухтецкого рассчитан на определенную структуру каталогов, где он находится (среди папок примеров библиотеки V-USB), а Вы его используете совсем в другом месте системы каталогов Вашего диска. Вот что происходит, когда Вы запускаете make clean (а это обязательная процедура) - команда из makefile удаляет папку usbdrv из папки проекта. Далее Вы пытаетесь скомпилировать проект командой make hex, и он не компилируется, так как makefile не может разместить новую (чистую, без объектных файлов) копию папки usbdrv в папку проекта, и компиляция завершается с ошибкой. Далее Вы берете копию папки usbdrv из архива "простого примера" (вместе с битыми объектными файлами, которые должны были быть вычищены, так как не подходят к новым установкам в makefile), компилируете - все компилируется без ошибок (при этом линкуются ошибочные объектные файлы библиотеки V-USB) - прошиваете - и о ужас - ничего не работает (что и следовало ожидать).

Варианты решения проблемы:
1. Поместить папку проекта firmware прошивки С. Кухтецкого для управления шаговым двигателем (01 простой вариант) в структуру каталогов примеров из библиотеки V-USB (архив по ссылке [1]). Далее как обычно выполнить make clean и make hex.
2. Не выполнять команду make clean, а просто вручную удалить объектные файлы (файлы с расширением *.o) из папки проекта и подпапки usbdrv. Далее выполните только make hex.
3. (Самый правильный метод) подправить makefile, чтобы он делал очистку без удаления папки usbdrv. Далее как обычно выполнить make clean и make hex. По поводу команды make clean также см. [30].

Приобрёл OLIMEX AVR-JTAG-USB. Проблема - AVR Studio не коннектится с этим программатором, что не так? Пробовал на 2-х компах. Может пробовать из-под другой программы?

Ваш OLIMEX AVR-JTAG должен без проблем работать с AVR Studio. Выполните все инструкции по установке, описанные в файле OLIMEX_AVR-JTAG(AVR-JTAG-USB).pdf, убедитесь, что Ваш OLIMEX AVR-JTAG виден в системе как COM-порт с номерами от 1 до 4 (COM1, COM2, COM3, COM4, другие варианты не работают с AVR Studio). Потом настройте в AVR Studio подключение к Вашему OLIMEX AVR-JTAG. Это делается через меню Tools -> Program AVR -> Connect... -> Select AVR Programmer -> JTAG ICE -> выберите верный номер COM-порта -> Connect. После этого AVR Studio должен увидеть Ваш программатор. Номер COM-порта (если у Вас он определился с недопустимым номером, например как COM5 или COM8) меняется через Панель управления -> Система -> Оборудование -> Диспетчер Устройств -> Порты COM и LPT -> Свойства порта COM10 -> Настройки порта -> Дополнительно -> Номер COM-порта.

Вот и я думаю - Windows он опознаётся как СОМ10, на ноуте СОМ8, но в АВТО всё равно не видит, и как быть - не знаю.

С такими номерами COM-портов AVR Studio не увидит OLIMEX AVR-JTAG ни в режиме Auto, ни в каком-то другом. Номер COM-порта (если у Вас он определился с недопустимым номером, не как COM1..COM4) меняется через Панель управления -> Система -> Оборудование -> Диспетчер Устройств -> Порты COM и LPT -> Свойства порта COM10 -> Настройки порта -> Дополнительно -> Номер COM-порта.

ОК, все заработало.

Макетная плата AVR-USB-MEGA16 перестала работать с компьютером по USB со следующими симптомами (операционная система Windows 7): в Диспетчере Устройств плата AVR-USB-MEGA16 отображается со знаком восклицания, и говорит что есть проблемы с драйвером устройства (Error Code: 52). Удаление и генерация нового драйвера с помощью inf-wizard.exe не помогает (все остается так же), inf-wizard.exe устройство видит при подключении, а testlibusb-win.exe не видит. Такое происходит как в обычном режиме, так и в режиме прошивки через бутлоадер USBasp (с джампером). Кабель проверен, повреждений нет (пробовал несколько кабелей).

С такой ситуацией, как у Вас, не сталкивался, у меня всегда была только Windows XP. Попробуйте сделать следующее:

1. Отключите макетную плату от компьютера.
2. С помощью редактора реестра удалите из реестра все записи, связанные с устройством USB макетной платы. Эти записи ищите в ветке реестра папки HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR, HKLM\SYSTEM\CurrentControlSet\Enum\USB.
3. Скачайте драйвер для бутлоадера USBasp, см. [23], раздел [Ссылки].
4. Положите драйвер в известную Вам папку, например C:\TEMP. Поставьте на макетной плате перемычку для старта бутлоадера и подключите плату к USB. После того, как операционная система запросит драйвер, укажите ей папку C:\TEMP. Внимание! В системе должна быть разрешена установка неподписанных драйверов.

Попробуйте макетную плату на другом компьютере, где установлена Windows XP. Возможно также, что перегорел резистор R6 номиналом 1 Ом.

Также см. статью [36], где подробно описана установка драйвера под операционными системами Windows 8 и Windows 10.

Проблема решилась переустановкой библиотеки lib-usb.

Из письма пользователя: ... (вопрос про код на языке C# класса обертки ATmega16.cs Сергея Кухтецкого) при общении с макетной платой AVR-USB-MEGA16 используются команды, которые обрамлены в aPORTX и aPINX. Но есть ещё aDDRX, который непонятно для чего нужен...

У микроконтроллеров AVR есть 3 регистра, с помощью которых происходит полное управление ножками и чтение их состояния. Эти регистры называются DDRx, PORTx, PINx. Вместо x подставляется буква A, B, C или D, и после этого получается полное допустимое имя нужного регистра.

Так, например, при работе с ножками портов PB0..PB7 используют регистры с именами DDRB, PORTB, PINB. Регистр DDRB нужен, чтобы настроить ножки порта на вход или выход. По умолчанию все ножки настроены как входы, состояние которых можно читать через регистр PINB. Чтобы настроить любую ножку PB0..PB7 как выход, нужно записать в лог. 1 в соответствующий бит регистра DDRB. После того, как ножка PB0..PB7 настроена как выход, можно менять её выходной логический уровень, записывая соответствующие значения бит регистра PORTB. Теперь наверное Вам понятно, для чего нужны aPORTX, aPINX и aDDRX.

Более подробно про регистры DDRx, PORTx, PINx Вы можете прочитать в даташите на микроконтроллер ATmega32.

Очень интересна тема разработки устройств для COM/USB (вообще USB мне больше импонирует в силу своей новизны, скорости - относительно COM). Сам я программист самоучка, пишу на C# (по десятибалльной шкале оцениваю свои навыки на 7,5). Обращаюсь к вам вот с каким вопросом - с чего мне начать? Какая литература, железяки, что мне надо знать, приобрести, чтобы оборудовать дома мини-лабораторию для начала моих экспериментов?

У меня есть: комп (без COM порта) - 2 шт., среда разработки C# - VS2010 - 1 шт., жирный безлимит - 1 шт., желание когда нибудь создать нечто подобное LED Cube 8x8x8 - 1 шт.

С чего начать программировать USB-устройства, зная C#? И вообще что-то делать мигающее и красивое?

Имхо, протокол USB настолько сложен, что у нас нет другого выхода, как найти готовые решения, и начать их использовать. Т. е. нужно просто выбрать программную библиотеку C# (чтобы написать ПО хоста, т. е. программу на компьютере, которая управляет USB-устройством). Сам я не шибко крутой специалист, поэтому знаю ответ на этот вопрос только с одной стороны. Другими словами, я знаю только один вариант ответа, хотя наверняка есть и другие. Для C# есть бесплатная обертка над Windows API для устройств USB HID, "USB HID Component for Windows C#". Если вобьете с гугле эту фразу, то без труда найдете ссылки на закачку этой библиотеки, а также примеры кода. См. также статью http://microsin.net/programming/PC/usb-hid-libraries.html , там есть ссылки. Эта обертка на C# позволяет управлять только USB HID. Остальные классы USB устройств управляются по-другому. Для Вашей цели и для Вашей квалификации удобен именно USB HID, так как для него не нужно писать драйвер для операционной системы, и для него есть вышеуказанная обертка. Кроме того, Вы можете использовать класс USB CDC (виртуальный COM-порт), для этого класса вообще никакие библиотеки не нужны, весь обмен делается так же, как с обычным файлом.

Кроме того, для ПО хоста есть еще класс-обертка C# Сергея Кухтецкого, у которой есть свои преимущества и недостатки. Описывать подробности я здесь не буду, потому что ответ и так получается слишком обширным - сами нагуглите нужную инфу при желании. Работает эта обертка только с микроконтроллерами ATmega16 и ATmega32. Скажу только коротко - для обертки есть сопряженные примеры ПО хоста и firmware (т. е. то, что работает на компьютере и в микроконтроллере совместно, обмениваясь данными по USB), и весь алгоритм можно переложить на ПО хоста (т. е. писать firmware для микроконтроллера не надо, оно уже готовое). Это большой плюс. Большой минус в том, что из-за большой загрузки микроконтроллера протоколом USB нельзя делать быстродействующие устройства, т. е., другими словами, Вы не сможете например сделать очень плавное и быстрое управление светодиодами LED cube - так как слишком много накладных расходов по передаче данных по USB.

Это только касаемо ПО хоста. Теперь осталось определиться, на чем же программировать сами USB-устройства. К сожалению, на C# никаких готовых решений я не знаю. Т. е. мне неизвестны проекты для микроконтроллеров, написанные на C#, которые реализуют какие-либо USB устройства. Все известные мне решения для микроконтроллеров используют исключительно ANSI C. Поэтому либо Вам нужно брать уже готовые прошивки firmware, либо все-таки разбираться с программированием на C. Предупреждаю сразу - устройство типа LED cube на микроконтроллере, если Вы не научитесь программировать на C, Вы скорее всего никогда не сделаете. Поэтому другого выхода нет, нужно осваивать язык C. Не все так страшно, как может показаться на первый взгляд, так как язык C во многом похож на C#, и при желании Вы разберетесь. Поэтому Вам остается выбрать только аппаратную платформу (микроконтроллер), на котором Вы будете ваять свои USB-устройства, которые будут делать что-то типа LED cube.

Итак, какой же взять микроконтроллер? Решений для реализаций USB-устройств сейчас очень много. Но так как Вы новичок, и четко поставленной задачи у Вас нет, то нужно выбирать именно ту платформу, по которой легче всего найти подсказку и нужную инфу в Интернете - готовые примеры кода, уже реализованные проекты, справочная информация на русском языке, не очень дорогие и понятные средства написания программ и отладки и т. п. По этой позиции микроконтроллеры от компании Atmel занимают лидирующее положение на рынке, и самая дружелюбная для новичка платформа - это Atmel AVR USB. Так что выбор ограничивается теперь только выбором микроконтроллера AVR. Чтобы сделать что-то похожее на LED cube, Вам нужен микроконтроллер с аппаратной поддержкой USB, и подключенные к этому микроконтроллеру через SPI расширители портов (потому что ножек портов у самого микроконтроллера может не хватить). Пример схемы такого устройства можете найти тут - http://code.google.com/p/lightpack/wiki/LightpackMaking . В данном примере подключено только 2 расширителя потов, но их можно подключить в принципе любое количество. В схеме применен также микроконтроллер AT90USB162, однако можно выбрать любой микроконтроллер, если Вам это надо. В данном примере используется USB HID, однако Вы можете прошить в кристалл AT90USB162 firmware, реализующее класс USB CDC (это виртуальный COM-порт). С этим классом работа в C# довольно тривиальна - тупо как с файлом, т. е. никаких библиотек и оберток не надо.

Ссылку http://code.google.com/p/lightpack/wiki/LightpackMaking я привел только как совет - с какой аппаратной платформы нужно начать изучение программирования устройств USB, т. е. на этом примере у Вас есть уже почти все - и схема, и микроконтроллер, и пример программы для микроконтроллера, а саму плату LightPack или любую другую, на которой стоит микроконтроллер AT90USB162, Вы при желании можете заказать или купить. Для микроконтроллера AT90USB162 по минимуму никакой программатор не нужен - программа для микроконтроллера просто перезаливается через интерфейс USB (практически неограниченное количество раз). Если войдете во вкус программирования для микроконтроллеров, то потом Вам лучше всего купить аппаратный отладчик (для полноценной отладки программы по-взрослому) - AVR Dragon. Он тоже довольно недорогой, и его можно заказать и купить.

Есть еще платформа AVR Arduino, тоже хорошая для новичка, но я про неё знаю совсем мало, и поэтому ничего советовать не буду. Лично мне эта платформа не нравится, потому что она, хоть и проста для новичка, но построена по принципу "ешь, что дают" - т. е. серьезные самостоятельные разработки на ней делать довольно трудно.

Вот список железа (это чистое мое ИМХО), который я бы купил для начала.

1. Или Лайтпак http://code.google.com/p/lightpack/wiki/LightpackMaking , или вот эту платку - http://microsin.net/programming/AVR/avr-usb162.html, 500 рублей.
Это все. Еще раз повторюсь - для начала никаких программаторов не нужно, нужна просто отладочная плата с микроконтроллером AVR USB. Эта плата уже позволяет записывать и перезаписывать в себя любые программы прямо через интерфейс USB.

Вот список утилит, программ и библиотек, которые надо скачать, установить и научиться пользоваться:
1. AVR Studio последней версии. Это среда разработки для микроконтроллеров AVR, см. http://www.atmel.com/microsite/avr_studio_5/default.asp?source=redirect
2. Flip, это программулина, которая прошивает AT90USB162 (и другие AVR USB микроконтроллеры) через USB, см. http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3886& ;category_id=163&family_id=607&subfamily_id=760, как пользоваться по-русски описано тут - http://microsin.net/programming/AVR/avr-usb162.html и еще тут - http://microsin.net/programming/AVR/userial.html (само собой, можете скачать оригинальную доку с сайта Atmel).
3. WinAVR - это пакет GNU библиотек и программ (AVR GCC, make), которые понадобятся для компиляции многих готовых проектов firmware для микроконтроллеров AVR. См. http://winavr.sourceforge.net/.
4. LUFA - библиотека для USB-устройств на микроконтроллеров USB AVR. Множество готового кода для большого количества различных устройств USB. См. краткое описание тут - http://microsin.net/programming/AVR/lufa-usb-overview.html , там же найдете нужные ссылки.
5. LibUSB - желательно, но необязательно. Это библиотека для написания ПО хоста. Можно как DLL использовать с любыми языками, в том числе и с языком C#.

1, 2, 3, 4, 5 - это все бесплатно для использования.

Вот список литературы:
http://microsin.net/programming/AVR/avr-books.html . Из этого списка начать можно с цикла статей "Микроконтроллеры AVR" С. М. Рюмик, журнал "Радиоаматор" 2005 год.

У меня Windows 7 x64, бывают проблемы с совместимостью ПО (это я про библиотеку LibUSB)?

По поводу совместимости с Win7 x64 - к сожалению, сам я лично не имел дела с этой системой, однако у народа тоже возникали похожие вопросы, которые успешно решались. В частности касательно LibUSB, то для неё есть 64-битная версия, см. результат поиска в Google по ключевым словам install-libusb-windows-7-vista-64-bit - найдете много информации, вплоть до видеоинструкций по установке. Просмотрите также статью, посвященную работе с макетной платой под Windows 8 [29].

Сила тока, которую Вы можете получить от порта, зависит от параметров применяемого микроконтроллера. Например, для ATmega32A в корпусе TQFP44 (макетная плата AVR-USB-MEGA16) допустим максимальный ток на порт ввода/вывода 40 мА, при этом общий ток потребления кристалла не должен превышать 400 мА. Для чипа AT90USB162 и AT90USB162MU (макетные платы AVR-USB162 и AVR-USB162MU) также допустим максимальный ток на порт ввода/вывода 40 мА, но общий допустимый ток потребления кристалла в 2 раза меньше - не более 200 мА.

Пробовал пример со светодиодом (hid-custom-rq, тот, что для примера зашит в контроллер ATmega32A макетной платы AVR-USB-MEGA16) под линуксом. Программа работает только под рутом. Не в курсе, как запустить её под обычным пользователем? Программа пишет в консоли следующее:

cool-user@linux-laptop$ ./set-led on
Could not find USB device "LEDCtlHID" with vid=0x16c0 pid=0x5df

Наверное Вам нужно дать пользователю cool-user, который запускает программу, права на доступ к устройствам USB HID (папка /dev/input, /dev/usb или что-то наподобие). Когда втыкаете USB-устройство, то увидите в этой папке новый файл типа hiddev0, это и есть наше устройство USB. Рядовому пользователю должны быть даны права на него. Лучше дайте полные права сразу на папку, чтобы не морочиться. Как назначать права в Linux наверное знаете =).

Получилось! :) Написал правило udev

/etc/udev/rules.d/10-ledctlhid.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df", GROUP="adm", MODE="0666"

и добавил себя (cool-user) в группу adm.

Помогите советом с чего начать, с какой стороны подступиться, какие программы установить, как разобраться со встроенным bootloader'ом, чтобы приступить к разработке ПО хоста и прошивки контроллера. Проще говоря, нужен вводный курс типа "AVR для самых маленьких". Какое ПО ставить для разработки? Где взять и как прошить простенький пример в МК?

Какое ПО ставить для разработки? Тут все зависит в основном от Вашей задачи. Принцип простой - в любом случае (даже если Вы новичок, и не знаете, с чего начать и что делать) сначала нужно поставить перед собой задачу - что за устройство на микроконтроллере мне нужно получить, и какие функции оно должно выполнять. После этого, как задача будет поставлена и четко сформулирована (простым человеческим языком, понятным и домохозяйке), то считайте, что на 50% Вы задачу уже выполнили. Теперь останется только найти готовый пример кода программы (как для микроконтроллера, так и для компьютера), который можно взять за основу Вашей разработки. Как только Вы такой пример найдете, то сразу станет понятно, какое ПО для разработки поставить и использовать. Я к сожалению не телепат, поэтому пока не могу ответить на таким образом поставленный вопрос - "Какое ПО ставить для разработки". Пока вопрос поставлен слишком широко...

Где взять и как прошить простенький пример в МК? Этот вопрос напрямую пересекается с предыдущим вопросом. ПОВТОРЯЮ ЕЩЕ РАЗ - ЧЕТКО ПОСТАВЬТЕ ПЕРЕД СОБОЙ ЗАДАЧУ. Как только это сделаете, то уже можно пользоваться поисковиком Google, и с легкостью найти готовые проекты и примеры кода. На моем сайте тоже есть страничка, где даны ссылки на проекты с открытым исходным кодом, см. [26]. Все эти примеры рабочие, осталось только выбрать из них самый подходящий. Далее можно установить нужный инструментарий для написания программ и погрузиться в изучение как инструментария, так и кода примеров и документации на микроконтроллер ATmega32A.

Научиться пользоваться бутлоадером USBasp (он прошит в память микроконтроллера Вашей макетной платы) довольно просто. Запускаете Google и вводите запрос: AVR-USB-MEGA16 bootloader, или запрос: AVR-USB-MEGA16 бутлоадер

Первая ссылка в ответе на поиск - именно то, что Вам надо - документация, как пользоваться бутлоадером USBasp. Тупо повторите по шагам все действия, что там указаны, и научитесь прошивать программу firmware в память микроконтроллера ATmega32A, который установлен на Вашей макетной плате AVR-USB-MEGA16. Еще есть неплохая статья по этой теме на Хабрахабр, в поиске легко её найдете.

Не стесняйтесь задавать вопросы, только пожалуйста - задавайте вопросы конкретные, на которые можно дать четкий ответ. На Ваши вопросы невозможно ответить, не написав книгу по программированию микроконтроллеров. Кстати, чтение умных книжек, даташитов и FAQ тоже никто не отменял, см. [27]. В случае возникающих вопросов прочитайте пожалуйста этот FAQ - возможно, люди уже сталкивались с Вашей проблемой, и это поможет найти решение. И теперь, короткое резюме, рекомендуемая примерная последовательность Ваших действий:

1. ЗАДАЧА, ЗАДАЧА, ЗАДАЧА.
2. Нахождение ПРИМЕРА под ЗАДАЧУ.
3. Установка инструментария под ПРИМЕР (обычно это AVR Studio и Visual Studio, но необязательно).
4. Разбираетесь, как пользоваться бутлоадером, инструментарием, изучаете код примера.
5. На основе ПРИМЕРА делаете свою программу.

Из письма пользователя: в статье, описывающей плату AVR-USB-MEGA16, даны значения фьюзов ATmega32A. Какой кварц для этих фьюзов учитывался - 12 или 16 МГц, или данные фьюзы возможно использовать с обоими резонаторами? Этот вопрос возник, т.к. в схеме указан кварц на 16 МГц, а в статье написано: "микроконтроллер ATmega16 в корпусе TQFP44, тактовая частота 12 МГц (или 16 МГц, в зависимости от того, какой кварц используется)".

Все макетные платы поставляются с уже запрограммированными корректными значениями фьюзов. Частота кварцев для указанного значения фьюзов некритична. Дополнительную информацию по фьюзам см. в даташите Atmel на Ваш микроконтроллер. Вычислить значения фьюзов поможет также популярный ресурс Engbedded Atmel AVR® Fuse Calculator [16].

Теперь по поводу кварцев: обычно устанавливается кварц на 12 МГц, но иногда используется кварц 16 МГц (для библиотеки V-USB допустимо использовать кварцы на 12, 15, 16, 16.5, 20 МГц). Для каждой частоты кварца нужно использовать специально скомпилированную прошивку.

Мое устройство USB, собранное на микроконтроллере AVR с использованием библиотеки V-USB, не работает (USB устройство не опознано в Windows)... Почему?

Если у Вас платка самодельная, и Вы сами написали (или модифицировали на основе готового примера) firmware для своего USB-устройства, то возможностей "накосячить" более чем предостаточно. Итак, возможные причины неисправностей.

1. Ошибка в схеме. Схему проверяйте тщательно, начиная с проверки номиналов деталей, питания на соответствующих ножках микроконтроллера (см. даташит или проверенный пример подключения микроконтроллера), заканчивая прохождением сигналов по цепям интерфейса USB D+ и D-. Не забудьте проверить наличие и правильную полярность подключения стабилитронов на сигналы D+ и D-, если микроконтроллер питается от 5 вольт. Если микроконтроллер питается от 3.3 вольт, то стабилитроны не нужны.

2. Неправильно выбраны ножки микроконтроллера для USB сигналов D+ и D-. Они могут не соответствовать файлу usbconfig.h (этим файлом конфигурируются настройки библиотеки V-USB в проекте), либо на нужном сигнале нет наличия аппаратного прерывания по уровня INT0. Подробности см. в комментариях файла usbconfig.h.

3. Вы неправильно скомпилировали firmware (прошивку) для микроконтроллера. Обычная последовательность команд компиляции make clean и затем make или make hex. Очень распространенная ошибка - забывают сделать make clean, и при этом линкуются старые объектные файлы, которые не соответствуют коду (который и не компилируется).

4. Вы неправильно прошили фьюзы (fuses) для микроконтроллера AVR. Это очень важный момент, который влияет на работу программы, и в конечном итоге от этого зависит - заработает Ваше устройство или нет. Основной принцип установки фьюзов - должна быть разрешена работа кварцевого генератора (обычно для ATmegaXXX) или внутреннего генератора (для ATtinyX5), делитель тактовой частоты должен быть выключен. См. примеры установки фьюзов в makefile, и пользуйтесь онлайн-ресурсом Engbedded AVR Fuse Calculator.

5. Неправильно выбрана частота кварца, либо она не соответствует установленной частоте кварца в makefile. Для библиотеки V-USB допускается только строго определенный ряд частот кварцевых резонаторов - для ATmegaXXX это частоты 12, 15, 16.5 и 20 МГц, а для ATtinyX5 это обычно 16.5 МГц (при этом используется внутренний генератор, подстраиваемый по частоте следования сигналов конца фрейма USB SOF). В makefile частота кварца обычно передается макросом F_CPU в командной строке компилятора через настраиваемые опции, например так: "CFLAGS += -Wall -gdwarf-2 -DF_CPU=16000000UL -Os -fsigned-char".

6. Неправильно задан тип микроконтроллера в makefile. Обычно тип микроконтроллера задается в макросе MCU.

7. Устройство USB в системе Windows определилось, но программа компьютера, рассчитанная на работу с ним (ПО хоста), не может управлять Вашим USB-устройством. Тут может быть три основные причины. В ПО хоста и firmware не соответствуют заданные значения VID и PID для устройства USB (см. файл usbconfig.h и исходный код ПО хоста). Может быть также не установлена библиотека libusb, через которую многие программы ПО хоста работают с устройствами USB. И, наконец, если используется библиотека libusb и устройство USB HID, то может быть не установлен так называемый драйвер фильтра (filter driver) для устройства USB. Подробности ищите с помощью поисковых систем и в документации V-USB и libusb, а также на этом сайте.

8. Оригинальный проект примера работает нормально как устройство USB, но мой код почему-то не работает, либо сбоит и зависает. Чаще всего причина в том, что Вы слишком мало процессорного времени отдаете на обработку протокола шины USB. Любой дополнительный код, который Вы пишете, должен быть вставлен в основной цикл main как неблокирующие процедуры, которые работают с самым низким приоритетом, и быстро возвращают управление в основной код. Особенно важно обеспечить беспрепятственное, приоритетное выполнение аппаратных прерываний INT0, которые происходят от сигнала шины USB.

9. Моя программа ведет себя не так, как ожидалось, когда я подключаю интерфейс USB. Например, если формируемая динамическая индикация при отключенном USB работает нормально, то при подключенном USB она начинает мерцать. Почему? Причина все та же - обработка протокола USB программно занимает слишком много процессорного времени. Это обязательно нужно учитывать в программах firmware USB-устройств, сделанных на основе библиотеки V-USB.

10. По поводу проблем "устройство USB не работает", "устройство USB не определяется" очень хорошо написано в [30].

Из письма пользователя: у меня возникла проблема с перепрошивкой платы. В соответствии с инструкцией я установил перемычку 4-6, включил, установил Usbasp и libusb. Устройство появилось в системе как USBasp. Далее я запустил Khazama, убрал Erase chip, выбрал MEGA32 и в качестве прошивки указал main.hex из архива с классом оберткой. После прошивки устройство перестало видеться в системе.

Если вернуть перемычку, то устройство снова видится как USBasp, но когда Khazama пытается что-либо с него прочесть, то диод гаснет и выскакивает сообщение Khazama об ошибке Error while operating... could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc.

Usbasp и libusb установлены. При включенной перемычке примеры из класса обертки компилируются без ошибок, при выключенной то же сообщение Khazama Error while operating...

В чем может быть проблема?

Проблема у Вас в следующем:

1. Пользуетесь Khazama для прошивки правильно. Но прошиваете туда непонятно что. То есть прошивка не подходит либо для Вашей платы, либо для кварца, который установлен на плате (скорее всего прошивка на кварц 16 МГц, а у Вас стоит на 12 МГц). Проверьте пожалуйста еще раз, что именно Вы прошиваете, и для какой частоты кварца скомпилирована прошивка.

2. Не пытайтесь пользоваться Khazama и бутлоадером для каких-либо других целей, кроме перепрошивки. Бутлоадер умеет только прошивать память новой программой. Ни читать фьюзы, ни читать память, ни управлять светодиодом - ничего такого он не умеет. Только перепрошивка и все. Поэтому не удивляйтесь ошибке "Error while operating...", которую выдает Khazama, когда пытается заставить бутлоадер делать что-то чего он не умеет и на что не рассчитан. Пользуйтесь Khazama версии 1.6.2, более свежие могут выдавать ошибку при перепрошивке (хотя все равно в результате ATmega32 перепрошивается нормально).

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

См. также ответы на вопросы 091113, 100422, 130113, 131220, 140812, 141208, 150219.

Да, работают, причем не только под Windows 7, но даже и под Windows 8, и под Linux, и под FreeBSD, и вообще под чем угодно, что понимает обычные устройства USB. Сама плата - это просто микроконтроллер, которому по барабану, какая операционная система. Вопрос скорее надо поставить по-другому - работает ли ПО, работающее с AVR-USB-MEGA16 и написанное для Windows XP, под Windows 7? Вообще-то этот вопрос не ко мне, а к компании Microsoft. Поскольку Microsoft не позаботилась о полной бинарной совместимости программ и драйверов, то проблема несомненно есть. Однако основной софт есть, который нужен для работы и программирования платы, и он нормально работает даже под Windows 8 [29].

Для работы с платами на стороне ПО хоста используются библиотеки libusb, и Майкрософтовские, от Atmel или другие. Если Вы умеете с ними работать, и есть исходный код программ, то Вы сможете перекомпилировать бинарник и для Windows 7, и для Windows 8. Если испытываете проблему с софтом для программирования - то ищите ему замену на нужной Вам операционной системе.

Вопрос возник по вашей статье "Пример подключения АЦП MCP3202 к микроконтроллеру AVR". В статье сказано, что "Рассматривается код программного SPI микроконтроллера AVR и подключение через него внешнего 12-битного ADC" и подключается АЦП к портам MOSI, MISO и SCK (для управления АЦП). Меня смущает, что я займу выводы через которые шью микроконтроллер (шью внешним программатором USBasp). Могу ли я использовать другие порты для подключения АЦП, к примеру не РВ5, РВ6, РВ7, а РС1, РС2, РС3?

Да, конечно, Вы можете использовать для программного формирования протокола SPI любые свободные ножки микроконтроллера. Однако если Вы решите использовать встроенный в ATmega32A аппаратный контроллер SPI - для работы с АЦП MCP3202, то Вам придется задействовать ножки ISP. Причем это не должно Вас смущать - достаточно поставить последовательно с выходом MISO микросхемы АЦП MCP3202 резистор номиналом от 1 до 3 кОм. После этого АЦП не будет мешать программированию через ISP - независимо от того, как будете формировать протокол SPI, программно или аппаратно.

Кроме того, Вы можете положить свой программатор ISP на полку, и использовать бутлоадер USPasp. Он прошивается во все платы AVR-USB-MEGA16, и очень удобен в работе. Просто скачайте и прошейте бинарник бутлоадера USBasp [23], и после этого Вы сможете пользоваться бутлоадером почти так же, как раньше пользовались внешним программатором. Причем подойдет даже программа прошивки Khazama 1.6.2, которая работала с Вашим внешним ISP программатором USBasp.

Я понял, что питание для платки AVR-USB-MEGA16 идет через USB, но меня интересует автономное питание: это можно реализовать с помощью контактов "+" и "-" на плате?

Можете использовать контакты + и -, никаких проблем. Однако помните, что если подключите внешнее питание и одновременно подключите USB, то одно из двух может перегореть - или компьютер, или внешний блок питания. Сами понимаете почему - фактически Вы параллельно подключите друг к другу 2 блока питания. Если хотите использовать и USB, и внешний блок питания, то нужна развязка на диодах Шоттки, что-то типа того, как сделано в заметке "AVR-USB-MEGA16: цветомузыка на светодиодной RGB-ленте WS2811" [28] (см. в этой статье раздел [Питание]).

Зайдите на сайт любой поисковой системы (например google.com) и введите поисковый запрос USBasp driver. Среди полученных результатов поиска первая ссылка в списке - именно та, что Вам нужна. Она ведет на сайт разработчика программатора USBasp. Там легко найдете драйвер для программатора USBasp.

Также см. статью [36], где подробно описана установка драйвера под операционными системами Windows 8 и Windows 10.

Из письма пользователя: я не очень хорошо разбираюсь в схемотехнике и программировании микроконтроллеров, но хочу с чего-то начать. Макетная плата AVR-USB-TINY45 маленькая, простая и дешевая, у неё есть 6 портов ввода-вывода и 8 килобайт памяти программ, и мне этого достаточно. Я смогу подключить к AVR-USB-TINY45 несколько шаговых двигателей, чтобы управлять ими через USB и начать её программировать?

< irony >Как я люблю такие вопросы...< /irony > Если Вы пока плохо разбираетесь в схемотехнике и программировании микроконтроллеров - то плата AVR-USB-TINY45 точно не для Вас. Дело в том, что у микроконтроллеров ATtiny85 очень мало ножек (6 ножек это предельный случай), совсем немного памяти программ, и в нем нет USB-бутлоадера (в отличие от других плат, для прошивки AVR-USB-TINY45 обязательно нужен внешний программатор), так что написание программ для этого чипа - удел профи. Теперь подробнее, почему Вам лучше не брать для начала плату AVR-USB-TINY45.

1. Как я уже писал выше, в AVR-USB-TINY45 не встроен USB-бутлоадер, который значительно упрощает перепрограммирование платы. Таким образом, Вам для прошивки памяти программ придется докупать ISP-программатор [12]. Если выбрать другую плату (например AVR-USB-MEGA16, AVR-USB162, AVR-USB32U4), то программатор не нужен, для перепрошивки достаточно подключения платы к компьютеру через USB.

2. AVR-USB-TINY45 обрабатывает протокол USB чисто программно (используется библиотека V-USB), и для этого задействовано не только 2 порта ввода/вывода (так что количество свободных ножек микроконтроллера уменьшается), но еще Интерфейс USB требует для себя приоритетной обработки, чем съедает большую часть ресурсов (рабочего времени) процессора. Это означает, что если Вы захотите управлять через USB шаговыми двигателями, то это можно сделать, но управление получится неточным, фазы двигателя будут "дрожать". У макетной платы AVR-USB-MEGA16 портов ввода/вывода гораздо больше, но у неё тот же недостаток. Для задачи управления шаговыми двигателями через USB лучше всего подойдут платы, на которых микроконтроллер имеет аппаратный интерфейс USB, это платы AVR-USB162, AVR-USB162MU, AVR-USB32U4. Кроме того, в эти платы встроен USB-загрузчик (bootloader Atmel FLIP DFU), так что программирование этих плат упрощается, не нужно покупать отдельный программатор.

3. Теперь по поводу портов ввода вывода. Да, действительно, у ATtiny45 / ATtiny85 максимально можно использовать 6 портов вывода/вывода. Но имейте в виду, что: (A) Одну ножку из этих шести (на которую выведен RESET) можно использовать только тогда, когда Вы перепрограммируете фьюзы. Это можно сделать только с помощью внешнего программатора. Таким образом, по умолчанию доступны под порты ввода/вывода только 5 портов. Кроме того, если Вы сделаете ножку RESET портом ввода/вывода, то лишитесь возможности пошаговой отладки (хотя как начинающему Вам это пока не нужно, поскольку у Вас наверняка нет аппаратного отладчика типа AVR Dragon). (B) Если будете использовать внешний кварцевый резонатор, то количество ножек уменьшится до 3. (C) Порты ввода вывода совмещены с ножками для перепрошивки: используется целых 3 порта, плюс ножка RESET, итого 4 занятых ножки! Это означает, что если Вы не знакомы со схемотехникой, то не сможете нормально эти ножки использовать. То есть, Вы либо лишитесь возможности перепрограммирования чипа, либо не сможете использовать порты, задействованные под интерфейс ISP! Итого у Вас остается только 2 свободных ножки под порты ввода/вывода. (D) При использовании интерфейса USB у Вас остается свободными только 4 ножки, включая ножку RESET.

С учетом всего вышесказанного трудно себе представить, как Вы будете подключать к ATtinyXX "несколько шаговых двигателей"... Это даже для профессионала нетривиальная задача. Лучше выберите что-то из этого - AVR-USB162 (стоит 500) рублей, AVR-USB162MU (500 рублей), AVR-USB32U4 (600 рублей).

Из письма пользователя: попытался скомпилировать проект V-USB для микроконтроллера ATmega328P (плата metaboard). Исправил и проверил опции DEVICE и F_CPU в Makefile, перекомпилировал (make clean, make hex), прошил через загрузчик... Но мое устройство USB не заработало: постоянно в Windows с периодом 2 секунды звучит оповещение о подключении нового устройства, и выдается сообщение "Устройство USB не обнаружено". Что это может быть, в чем проблема?

Самая вероятная причина проблемы - Вы использовали для компиляции опцию Makefile либо DEVICE=atmega328, либо DEVICE=atmega328p. Со старыми версиями библиотеки V-USB в этом случае может получиться неработоспособное устройство USB. Чтобы устройство USB заработало, нужно скомпилировать проект с опцией DEVICE=atmega168, либо Вам нужно скачать свежую версию библиотеки V-USB. Более подробно эта проблема (а также другие возможные проблемы с библиотекой V-USB) рассматривается в статье [30].

Из письма пользователя: у меня Windows 7 домашняя базовая 64 бит (Home Basic, её обычно устанавливают на все продаваемые ноутбуки и компьютеры). Хотел использовать прошивку Сергея Кухтецкого, как это описано в статье на сайте vanoid.ru [31]. Прошивку для платки взял там же, прошил с помощью USB-загрузчика и программы Khazama. Далее при подключении платки к компьютеру через USB операционная система запросила драйвер. Драйвер я нашел там же, на сайте vanoid.ru, но почему-то система его не установила с сообщением "не удается найти указанный файл". Какой файл, система не сообщила. Что мне делать, какого файла не хватает? Что это за драйвер, и для чего он нужен?

Одна из причин, из-за которой я ненавижу все урезанные версии Windows - в них обязательно что-то каверзно урезано в самом неожиданном месте, о чем трудно догадаться. Как и в этом случае - урезанная версия Windows 7 Home Basic при установке драйвера не сообщает о подробностях проблемы, а нормальная, не урезанная версия Ultimate сообщит, что не хватает файлов libusb0_x64.dll и libusb0_x64.sys. Если найти эти файлы, скачать и положить в папку с драйвером, то система Windows 7 нормально установит драйвер, если отключить проверку цифровой подписи (при старте системы нажимайте клавишу F8, и выберите соответствующий пункт загрузочного меню). Эти файлы можно найти в старых версиях библиотеки LUFA (например, в релизе LUFA-120730), или можно скачать по ссылке [32]. Таким образом, еще раз: чтобы установить драйвер LibUSB, нужно отключить проверку цифровой подписи в момент загрузки системы, и предоставить полную версию драйвера (скачайте его в архиве [32]).

Теперь по поводу второй части вопроса - что это за драйвер, для чего он нужен. Всем устройствам USB так или иначе нужен драйвер. Драйвер может быть как уже встроенным в операционную систему (как для классов устройств USB HID, USB CDC, USB MSD), так и устанавливаемым отдельно. В нашем случае это драйвер библиотеки LibUSB. Насколько я понял, это так называемый драйвер фильтра, который почему-то требует библиотека LibUSB для работы ПО хоста с устройствами USB HID. Т. е. любая программа ПО хоста, которая использует для управления USB устройствами библиотеку LibUSB, требует установки этого драйвера. Почему - вопрос к разработчикам библиотеки LibUSB.

При запуске под Windows скомпилированного ПО хоста, написанного на Visual Studio C# (это ПО хоста предназначено для управлением прошивкой Сергея Кухтецкого, как это описано в статьях [3, 8]), появляется ошибка "The application failed to initialize properly 0xc0000135", программа не запускается. В чем проблема, как исправить?

У Вас не установлена библиотека Microsoft .NET Framework 3.5 с пакетом обновления 1, скачайте и установите (строка для поиска Microsoft .NET Framework 3.5 site:microsoft.com).

Из письма пользователя: у меня не устанавливается драйвер программатора USBasp, операционная система Windows 7 домашняя 64 бита. Что делать?

Имейте в виду, что на Windows 7 есть несколько тонкостей в установке драйвера:

1. Драйвер, не подписанный сертификатом, надо устанавливать с отключенной проверкой сертификатов (отключается в загрузочном меню по клавише F8, пункт меню Disable Driver Signature Enforcement). Именно такой драйвер у USBasp - он не подписан сертификатом.

2. Прочитайте readme.txt, который в пакете с драйвером на сайте USBasp (архив usbasp-windriver.2011-05-28.zip), цитата: "With WinAVR version 20100110 or older, please use libusb_0.1.12.1." Таким образом, в архиве с драйвером от автора USBasp два варианта драйвера, следует попробовать оба из них, один из вариантов должен у Вас заработать. У меня заработал вариант драйвера libusb_0.1.12.1.

Теперь по поводу программы Khazama 1.6.2. Она прекрасно работает на всех операционных системах даже без установки, достаточно просто скопировать папку Khazama в каталог "c:\Program Files (x86)". Если у Вас возникала проблема с файлом MSCOMCTL.OCX, то скачайте и зарегистрируйте его, как это описано в статье "Проблема с файлом MSCOMCTL.OCX". Файл MSCOMCTL.OCX и программу Khazama 1.6.2 можно скачать по ссылке 2 этой статьи (архив 140812MSCOMCTL-OCX-missing-or-invalid.zip).

Также см. статью [36], где подробно описана установка драйвера под операционными системами Windows 8 и Windows 10.

См. также ответы на вопросы 091113, 100422, 130113, 131220, 140812, 141208, 150219.

Из письма пользователя: мне надо подать напряжение на 5-вольтовое реле, оно кушает 30 мА. Можно это сделать по следующей схеме: ножка микроконтроллера платы AVR-USB-MEGA16 (на ней "+") -> реле -> "-"? Транзистор для этого не нужен?

На макетной плате AVR-USB-MEGA6 установлен микроконтроллер ATmega32A в корпусе TQFP44. Если заглянуть в даташит, то можно узнать, что на одну ножку допускается максимум 40 мА (общий суммарный ток на все ножки не должен превышать 400 мА). Следовательно, Вы можете подключить реле напрямую к ножке микроконтроллера.

Однако не забывайте, что если у Вас реле электромеханическое (т. е. имеет обмотку), то обязательно нужно ставить параллельно обмотке реле защитный диод (если не знаете, что это такое и для чего надо, то прогуглите реле защитный диод). Если же у Вас реле твердотельное, то диод не нужен, транзисторный ключ не нужен, нужно только поставить токоограничительный резистор последовательно с ножкой порта (если не знаете, что такое твердотельное реле, для чего нужен токоограничительный резистор, то прогуглите твердотельное реле).

Я на Вашем месте транзисторный ключ все-таки поставил бы, это не помешает. См. также Реле и транзисторы: как они работают в качестве электронных переключателей.

Под "стандартным" Ардуино обычно подразумевают Arduino Uno. Даже быстрый взгляд на внешний вид и принципиальную схему плат metaboard и Arduino Uno покажет, что metaboard значительно проще, и гораздо лучше подходит для домашнего, самостоятельного изготовления или прототипирования.

metaboard IMG 1402 ArduinoUno R3
Metaboard-circuit.gif Arduino Uno sch Rev3
metaboard Arduino Uno

Если внимательно прочитать описание платы metaboard [33] и изучить её принципиальную схему, то различия становятся понятны. Если кратко, то основные различия следующие:

1. Главное отличие, из которого вытекают все остальные отличия: на плате metaboard по-другому подключен к микроконтроллеру интерфейс USB. Если на Arduino USB подключен к порту UART микроконтроллера через микросхему FT232RL (или выполняющая аналогичные функции микросхема Atmel Atmega8U2/Atmega16U2), то на плате mataboard такой микросхемы нет, и порт USB подключен к портам GPIO микроконтроллера. Чтобы главное отличие было понятнее, давайте рассмотрим диаграмму разводки платы Arduino Uno, где показаны различия в организации интерфейса USB от платы metaboard.

metaboard-Arduino-difference

Голубым цветом показана организация USB у Arduino Uno, зеленым цветом у metaboard. Как видно на схеме, у Arduino Uno имеется отдельный аппаратный узел для USB (аппаратный преобразователь USB-COM порт, класс устройств USB CDC), и под него задействованы порты PD0 и PD1. У платы metaboard для организации интерфейса USB нет такой аппаратуры, сигналы порта USB напрямую подключены к портам микроконтроллера PD2 и PD4.

Благодаря этому отличию схема metaboard гораздо проще, плата metaboard дешевле, и её проще спаять самому в домашних условиях, чем Arduino.

2. USB-загрузчики у Arduino и metaboard разные. У Arduino используется загрузчик через порт UART, а в metaboard используется загрузчик, эмулирующий программатор USBasp. Поэтому для загрузки кода скетча через среду Arduino IDE для платы metaboard нужно сделать специальные настройки, учитывающие загрузчик USBasp. Подробнее см. [34].

3. Чтобы в среде Arduino IDE при работе с платой metaboard можно было увидеть через монитор отладочный вывод объекта Serial, нужно подключить к порту UART микроконтроллера отдельный переходник USB-UART TTL. Что это за переходник, где его найти и как использовать, см. [35]. Для Arduino такой отдельный переходник не нужен, потому что используется встроенный, распаянный прямо на плате Arduino переходник USB-UART TTL.

4. Порты PD2 и PD4 микроконтроллера metaboard задействованы под сигналы D+ и D- интерфейса USB. Поэтому, немотря на то, что эти порты выведены на те же внешние цифровые порты 4 и 6, как и у Arduino, в скетчах их использование ограничено. Например, эти порты не могут полноценно работать как входы, и не могут также работать как выходы, если metaboard подключена к компьютеру через USB.

5. Порты PD0 и PD1 у Arduino не только выведены на внешние цифровые порты 0 и 1, но они еще и подключены параллельно к узлу USB-UART TTL. Поэтому у Arduino эти порты обычно всегда заняты, использовать их под другие функции, кроме как для объекта Serial, нельзя. У metaboard эти выводы совершенно свободны, и доступны для любого применения - и как порты ввода/вывода GPIO, и как порт UART.

6. У платы metaboard интерфейс USB потенциально имеет гораздо больше возможностей, чем у Arduino. Дело в том, что у Arduino интерфейс USB для связи с компьютером может работать только в режиме последовательного виртуального порта (USB CDC), а у metaboard можно реализовать как минимум 2 класса устройств USB на выбор: USB HID или USB CDC (благодаря использованию библиотеки V-USB). Но этот функционал metaboard не поддерживается стандартной средой разработки Arduino IDE, он доступен только при использовании AVR Studio/Atmel Studio и/или тулчейна GCC (avr-libc, WinAVR).

7. У платы metaboard имеется макетное поле с отверстиями (шаг 2.54 мм). Собирается metaboard из легкодоступных деталей со штыревыми выводами (нет SMD-деталей, которые сложнее паять). Благодаря этому metaboard гораздо проще изготовить самому, и удобнее собирать на ней радиолюбительские конструкции.

8. У платы metaboard последней версии устранена досадная ошибка размещения верхних коннекторов - шаг 2.54 мм у верхних разъемов портов Arduino нарушен. Из-за этой ошибки Arduino нельзя установить в стандартные платы макетирования типа breadboard ProsKit. В последней версии metaboard этот недостаток устранен благодаря наличию второго ряда верхних коннекторов, где шаг 2.54 мм восстановлен.

metaboard-v1.1-fix-connectors

Напомню, что макетная плата AVR-USB-MEGA16 это по сути просто микроконтроллер AVR, и ничего более (то же самое относится и к другим макетным платам - metaboard, AVR-USB-TINY45 и проч.). Так что вопрос можно перефразировать так - насколько сложно программировать микроконтроллер AVR, и можно ли микроконтроллер AVR убить перепрошивкой? Для полной ясности разделю вопрос на 2 части, и отвечу на каждый по отдельности.

Насколько сложно программировать микроконтроллер AVR? Ответ будет такой - сложно, если не прочитать документацию к имеющемуся у Вас железу (макетная плата, программатор и т. д.). И элементарно просто, если хотя бы поверхностно прочитаете документацию на Вашу макетную плату или программатор. Если Вы работаете под Windows, то обычно найти нужную информацию и программное обеспечение не составляет никакой проблемы. Немного сложнее это сделать под MAC, Linux или FreeBSD, но все равно это дело техники - нужно только правильно поставить вопрос поисковой системе Google.

Для программирования макетных плат AVR-USB-MEGA16 и metaboard я Вам советую использовать встроенный в них USB загрузчик, внешний программатор для этого не нужен. Для платы AVR-USB-TINY45 нужен внешний программатор ISP.

Для USB-загрузчика в качестве утилиты программирования под Windows удобнее использовать Khazama 1.6.2, под MAC, Linux, FreeBSD подойдет утилита командной строки AVRDUDE. Ничего сложного в процедуре программирования нет, только прочитайте документацию!

Можно ли микроконтроллер AVR убить перепрошивкой? Если пользоваться не загрузчиком, а программатором, и неосторожно перепрограммировать фьюзы, то можно "убить". Чтобы этого не случилось, пользуйтесь встроенным в платы USB-загрузчиком! Если Вы новичок, то советую совсем забыть про фьюзы, оставьте их значение таким, которое уже прошито в микроконтроллеры плат.

"Убиение" микроконтролера AVR обычно бывает двух видов:

1. По ошибке запретили программирование через ISP. Восстановить можно либо через JTAG (если он есть), либо специальным высоковольтным программатором. Для этого придется выпаивать чип из платы, если он не установлен на сокет.

2. Нечаянно испортили настройку тактирования микроконтроллера. Например, включили делитель, или переключили тактирование на внутренний RC-генератор. Восстановить можно, если запишете правильное значение фьюзов с помощью внешнего программатора.

Если Вы новичок, не перепрограммируйте фьюзы! Пользуйтесь записанным в платы USB-загрузчиком, тогда фьюзы точно не испортите.

См. также ответы на вопросы 091113, 100422, 130113, 131220, 140812, 141208, 150219.

DEVICE и F_CPU - это опции проекта makefile, которые передаются компилятору GCC при компиляции проекта firmware AVR.

DEVICE. Эта опция задает тип используемого микроконтроллера. Например, если у Вас плата AVR-USB-MEGA16, то микроконтроллер ATmega32a, тогда опцию DEVICE нужно установить так:

DEVICE=atmega32

Внимание: значение опции нужно обязательно указывать маленькими буквами. Значения опции для других микроконтроллеров можно узнать, если изучить документацию на библиотеку avr libc.

F_CPU. Эта опция задает тактовую частоту микроконтроллера, её нужно указывать в Герцах. Например, если Ваш микроконтроллер должен работать на частоте 12 МГц (если установлен кварцевый резонатор на 12 МГц и отключен внутренний предделитель тактовой частоты, именно так используется микроконтроллер ATmega32A вместе с библиотекой V_USB), то F_CPU нужно задать так:

F_CPU=12000000

Khazama 1.6.2 отображает ошибку: "error: usbasp_transmit: libusb0-dll:err [control_msg] sending control message failed, win error: Присоединенное к системе устройство не работает.".

USBasp bootloader Khazama error usbasp transmit

В данном случае ошибка связана с тем, что к загрузчику со стороны программы Khazama был выдан запрос, который загрузчик USBasp не поддерживает. Напомню еще раз - загрузчик USBasp предназначен для одной-единственной операции - только для перепрошивки области памяти программ пользователя, и ни для чего другого более. Т. е. не следует даже пытаться использовать загрузчик для чтения состояния фьюзов, их изменения - иначе будете получать сообщения об ошибке наподобие этого. Вам следует запретить все операции наподобие чтения/проверки FLASH, чтения/записи/проверки EEPROM, Erase Chip, записи фьюзов и битов защиты. Проверьте, правильно ли у Вас установлены опции Khazama (меню Command -> Program Options):

Khazama162 program options

Еще один возможный источник ошибок - у Вас не установлен драйвер программатора USBasp (USB-загрузчик эмулирует поведение этого программатора в плане прошивки памяти FLASH), или установлен некорректно. Откройте Диспетчер Устройств, поставьте перемычку на плате AVR-USB-MEGA16 для активизации загрузчика, и подключите плату к USB. В Диспетчере Устройств должно появиться устройство USB, которое должно выглядеть примерно так:

USBasp bootloader device Windows XP screenshots

Если Вы не нашли корректно установленного устройства USBasp, то пожалуйста установите (или переустановите) для него драйвер, который скачайте с сайта разработчика программатора USBasp (http://www.fischl.de/usbasp/). Можно также воспользоваться поисковой системой, ключевые слова для поиска USBasp driver. Ссылка на архив с драйвером будет примерно такая: http://www.fischl.de/usbasp/usbasp-windriver.2011-05-28.zip 

Обратите внимание, что в архиве (на момент написания этого текста) есть 2 версии драйвера, libusb_1.2.4.0 и libusb_0.1.12.1. У меня стоит версия libusb_1.2.4.0, и замечательно работает вместе с Khazama 1.6.2. Установите сначала более свежую версию, и попробуйте как она работает. Если не будет работать, то установите другую версию драйвера.

На сайте разработчика есть также руководство по установке драйвера на системах Windows 8 (см. также [29]):

How to install USBasp drivers on Windows 8
Installing Usbasp Driver Software in Windows 8.1

Еще одно похожее письмо, после переписки человек разобрался и у него все заработало:

"Q. Почему-то не получается загрузить программу в память микроконтроллера. Установил перемычку, поставил драйвер USBasp. Использую Khazama - ID чипа успешно определяется, но при попытке загрузить программу или стереть чип - USBasp "отваливается", светодиод гаснет. Khazama сообщает что не может найти USBasp. Аналогичная ситуация и c BASCOM AVR. С чем это может быть связано?

A. Привет, Роман. Загрузчик умеет делать одну и только одну операцию - программирование памяти FLASH, и ничего более. Поэтому даже не пытайтесь делать какие-то другие операции: стереть чип, прочитать/записать фьюзы и т.д. это бессмысленно, будет только приводить к недоразумениям и ошибкам. Постарайтесь действовать точно по инструкции, убедитесь, что у Вас версия Khazama 1.6.2, уберите в настройках все галочки и попробуйте еще раз. Если что-то не получается, то пожалуйста подробно опишите Ваши действия (со скриншотами) и проблему (что именно пошло не так, как ожидалось).

Q. Спасибо, разобрался. Во FLASH грузит, простейшая мигалка работает.

A. Я рад. Где косяк поначалу был?

Q. Не сообразил, что загрузчик делает только одну операцию. Если сразу грузить во FLASH, то все получается."

Это самая частая проблема с загрузчиком - пользователь не сразу понимает, что загрузчик работает не совсем так же, как и программатор USBasp, который он эмулирует, и имеются определенные ограничения. Итак, теперь список основных причин проблем с загрузчиком:

Не установлен драйвер USBasp. В этом случае подключенная с перемычкой плата будет отображаться в Диспетчере Устройств со знаком вопроса. Проблема решается установкой драйвера, который следует искать на сайте автора программатора USBasp (найти легко, прогуглите). Иногда драйвер не получается установить на Windows 7 или 8 из-за проблем с безопасностью - не подписанный серитификат. Обойти это можно отключением проверки сертификатов при установке драйвера (как это делается, можно найти в Интернете).

Неправильно используете утилиту программирования. Это как раз тот случай, который был у Романа. Либо у Вас Khazama не той версии (не 1.6.2), либо пытаетесь делать какие-то посторонние операции, кроме прошивки FLASH (снимите в настройках Khazama все ненужные галочки).

См. также ответы на вопросы 091113, 100422, 130113, 131220, 140812, 141208, 150219.

Сразу скажу, что драйвер фильтра нужен только для библиотеки LibUSB, и только для платформы Windows. Это никак не связано с устройствами USB на микроконтроллерах AVR. Т. е. драйвер фильтра нужен только для ПО хоста (хост это обычно компьютер PC, который управляет устройствами USB), которое использует библиотеку LibUSB на платформе Windows. Для всех других USB-библиотек ПО хоста (см. [24]) и всех других операционных систем драйвер фильтра не нужен. Таким образом, если ПО хоста Windows написано не на основе LibUSB (например, это справедливо для программы Khazama, работающей с программатором USBasp и загрузчиком USBaspLoader), то драйвер фильтра не нужен.

Библиотека LibUSB появилась давно, и стала популярна потому, что сильно упрощает написание программ ПО хоста и их переносимость, однако из-за особенностей архитектуры LibUSB за удобство приходится платить проблемой, связанной с наличием драйвера фильтра на платформе Windows и проблем с сертификатами для этого драйвера.

Как известно, библиотека LibUSB кросплатформенная, т. е. позволяет писать одинаковый код ПО хоста на языке C (а также и на других языках) для работы с устройствами USB на всех поддерживаемых платформах - Linux, FreeBSD, MacOS, Windows. Однако между платформами Linux и Windows имеются существенные отличия в работе LibUSB, связанные с портированием кода на Windows. Из-за этого и появилось понятие драйвера фильтра. Оно относится только к операционным системам Windows. Драйвер фильтра это специальная программная прослойка, через которую библиотека LibUSB может общаться с устройствами USB. На Linux, FreeBSD, MacOS драйвер фильтра для работы LibUSB не нужен.

LibUSB Windows filter driver architecture

На рисунке выше упрощенно показан принцип работы LibUSB с устройствами USB HID на операционной системе Windows. Без установленного драйвера фильтра программа, написанная на основе LibUSB, работать на Windows не будет. ПО хоста будет выдавать сообщение, что нужное устройство USB не найдено.

LibUSB filter driver not installed

[Как установить драйвер фильтра LibUSB]

1. Скачайте дистрибутив библиотеки LibUSB (строка для поиска в Google: LibUSB download site:sourceforge.net). Пакет библиотеки LibUSB это архив вида libusb-win32-bin-1.2.6.0.zip (цифры означают номер версии, они могут отличаться). Несмотря на то, что в названии присутствует "win32", библиотека работает и на 64-битных платформах (по крайней мере, у меня не было проблем на 64-разрядных Windows 7 и Windows 8.1 для одного языка).

Распакуйте содержимое скачанного архива в любую временную папку. В подкаталоге bin находятся утилиты, предназначенные для создания или установки драйвера фильтра. В файле bin\libusb-win32-bin-README.txt имеются пояснения по файлам и папкам каталога bin.

Примечания: для всех архитектур файл x86\libusb0_x86.dll является 32-битной библиотекой, предназначенной для Windows архитектур x86. На этих архитектурах файл должен быть переименован в libusb0.dll. На 64-битных платформах файл устанавливается в каталог и файл Windows\syswow64\libusb0.dll. На 32-битных платформах файл устанавливается в каталог и файл Windows\system32\libusb0.dll.

x86\inf-wizard.exe: программа inf-визарда, которая генерит inf-файл, который работает на основе встроенных двоичных файлов библиотеки libusb-win32 v1.2.6.0.

x86\libusb0.sys: 32-битный драйвер, предназначенный только для архитектур x86. Устанавливается в Windows\system32\drivers\libusb0.sys.

amd64\libusb0.sys: x64 64-битный драйвер, предназначенный только для архитектур AMD64-INTEL64. Устанавливается в Windows\system32\drivers\libusb0.sys.

amd64\libusb0.dll: 64-битная библиотека x64. Устанавливается в Windows\system32\libusb0.dll.

ia64\libusb0.sys: 64-битный драйвер только для архитектур IA64. Устанавливается в Windows\system32\drivers\libusb0.sys.

ia64\libusb0.dll: 64-битная библиотека IA64. Устанавливается в Windows\system32\libusb0.dll.

2. Обычно установка драйвера фильтра заключается в запуске оболочки мастера-помощника bin\inf-wizard.exe, и в ответах на вопросы мастера. На скриншотах приведены шаги по установке драйвера фильтра (на примере 64-битной операционной системы Windows 7 и тестового устройства USB HID на основе AVR и библиотеки V-USB).

• Подключите устройство USB к компьютеру. Запустите утилиту bin\inf-wizard.exe. На первом экране просто нажмите кнопку Next.

LibUSB filter driver wizard01

• На следующем экране увидите список всех устройств USB, для которых визард может предложить установку драйвера. По идентификаторам Vindor ID (VID) и Product ID (PID) найдите в списке нужное устройство. В нашем примере это устройство USB HID на макетной плате AVR-USB-MEGA16 с идентификаторами VID=0x16C0 и PID=0x05DF (идентификаторы для свободного использования в тестовых целях, предоставленные компанией-разработчиком библиотеки V-USB). Выберите устройство с идентификаторами 0x16C0 и 0x05DF и нажмите кнопку Next.

LibUSB filter driver wizard02

• На этом экране можно ничего не менять, просто нажмите Next.

LibUSB filter driver wizard03

• Вам предложат выбрать каталог для сохранения драйвера. Имя inf-файла для драйвера автоматически будет составлено из имени устройства USB. Выберите любой пустой каталог для сохранения драйвера (в данном примере выбрана папка C:\TEMP). Нажмите кнопку Сохранить.

LibUSB filter driver wizard04

• Появится окно с информацией о сохраненном драйвере и кнопкой Install Now.., которая позволит немедленно установить драйвер для этого устройства USB.

LibUSB filter driver wizard05

Нажмите кнопку Install Now.., система контроля действий пользователя запросит подтверждение действия, ответьте утвердительно. Затем система безопасности, проверяющая сертификаты драйверов, выдаст окно предупреждения ("Не удалось проверить издателя этих драйверов") с выбором: "Не устанавливать этот драйвер" или "Все равно установить этот драйвер". Выберите вариант принудительной установки - кликните "Все равно установить этот драйвер".

LibUSB filter driver wizard06

Через несколько секунд, необходимых для копирования файлов драйвера, появится окно, сообщающее об успешной установке драйвера.

LibUSB filter driver wizard07

Теперь устройство USB HID будет успешно управляться, и ПО хоста не будет выдавать ошибку, что устройство с идентификаторами VID=0x16C0 и PID=0x05DF не найдено.

AVR-USB-MEGA16-switching.gif

Здесь была рассмотрена процедура установки драйвера фильтра на операционной системе Windows 7 64 бита, где обычно у пользователей бывают самые большие сложности. Как видите, ничего сложного нет. На операционных системах Windows 8 процедура выглядит примерно так же. На операционных 32-битных системах Windows XP обычно установка проходит еще проще, несколько отличается по внешнему виду процедура запроса на установку не подписанного драйвера, и иногда этот шаг вообще пропускается (установка драйвера фильтра на Windows XP 32 бита подробно описана в статье [10]). Визард сразу устанавливает драйвер фильтра, т. е. не нужно нажимать кнопку Install Now.

[Как удалить драйвер фильтра]

Для удаления драйвера фильтра на 32-битных системах нужно тоже использовать тот же визард, только выбрать операцию не установки, а операцию удаления драйвера.

LibUSB filter driver delete WindowsXP 32bit

Для удаления драйвера фильтра на Windows 7 и Windows 8 нужно воспользоваться Диспетчером Устройств. Найдите устройство, для которого нужно удалить драйвер, откройте его свойства, выберите закладку Драйвер, и нажмите кнопку Удалить.

LibUSB filter driver delete Windows7

К счастью, ПО хоста утилит для этих загрузчиков написано без использования LibUSB, поэтому установка драйвера фильтра для них не требуется.

Никакой проблемы в этом нет. Причина такого поведения в том, что и программатор USBasp, и Ваше устройство USB используют одни и те же идентификаторы VID и PID (бесплатно предоставленные разработчиками библиотеки V-USB).

Это никак не мешает ни работе загрузчика USBasploader [23], ни ПО хоста, которое будет управлять Вашим устройством USB (если ПО хоста использует библиотеку LibUSB, то скорее всего также должен быть установлен драйвер фильтра).

[Еще раз по поводу драйверов]

Этот вопрос уже обсуждался не один раз в других врезках, но на всякий случай здесь сделаю еще одно уточнение. Это необходимо, потому что возникает путаница с вопросом - какой нужен все-таки драйвер, когда устройство USB отображается в Диспетчере Устройств как программатор USBasp.

Ответ прост до безобразия - ничего не поменялось, независимо от того, как что-то там отображается в Диспетчере Устройств. Для загрузчика USBasploader и программатора USBasp нужен драйвер USBasp, а для ПО хоста, использующего библиотеку LibUSB, нужен также еще и драйвер фильтра. Они не мешают друг другу.

Для работы загрузчика USBasp нужен один драйвер, а для устройства USB, которое управляется через ПО хоста на основе LibUSB - совершено другой драйвер (причем если это устройство USB HID, и для ПО хоста не используется LibUSB, то вообще никакой драйвер не нужен). Не путайте эти драйвера пожалуйста:

Драйвер программатора USBasp. Для загрузчика USBasp нужен драйвер для программатора USBasp, и никакой другой. Этот драйвер есть на сайте автора программатора USBasp. Прогуглите USBasp driver, смотрите также врезки в этом FAQ.

Драйвер фильтра LibUSB. Для устройства USB HID, которое управляется с помощью ПО хоста на основе библиотеки LibUSB (библиотека V-USB тут ни при чем) нужен драйвер фильтра LibUSB. Именно он делается с помощью inf-wizard, о котором Вы пишете. Если нужна дополнительная информация, для чего нужен драйвер фильтра и что это такое, то прогуглите LibUSB filter driver, см. также врезки в этом FAQ.

У меня на сайте нельзя скачать AVR Studio. Однако Вы можете скачать её с официального сайта Atmel. См. ссылки: avr studio 4.19 скачать. Также см. avr studio 4.19 site:microsin.net.

Книжек по AVR Studio у меня к сожалению нет. Однако Вы можете найти в Интернете информацию по её использованию, на Youtube даже есть обучающие видеоролики (см. https://www.youtube.com/results?search_query=AVR+Studio).

Также см. литература site:microsin.net.

[Ссылки]

1. Переведенная на русский язык библиотека V-USB (с примерами устройств USB и ПО хоста).
2. Как использовать библиотеку libusb в Visual Studio (управление макетной платой AVR-USB-MEGA16).
3. AVR-USB-MEGA16: быстрая разработка USB приложений на C# при помощи класса-обертки ATMega16.
4. AVR Studio против IAR Embedded Workbench - что выбрать?
5. Макетные платы с интерфейсом USB.
6. AVR276: USB Software Library for AT90USBxxx Microcontrollers.
7. AVR-USB162: где найти рабочие примеры кода firmware и ПО хоста.
8. AVR-USB-MEGA16: измеряем и контролируем температуру.
9. Макетная плата AVR-USB162 - как пользоваться фирменным бутлоадером Atmel (Flip DFU) на примере макетной платы AVR-USB162.
10. Разработка устройства USB - как начать работу с библиотеками AVR USB (V-USB) и libusb.
12. Программаторы для AVR.
16. Engbedded Atmel AVR® Fuse Calculator site:engbedded.com.
18. AVR-CDC: виртуальный COM-порт через Low-Speed USB (используется библиотека V-USB).
19. AVR-USB-MEGA16: hardctrl - управляемый сторожевой таймер (watchdog) для компьютера.
20. V-USB и libusb: обмен с устройством USB HID с помощью управляющих сообщений (USB control messages).
21. V-USB: LCD2USB - подключение LCD индикатора к компьютеру через USB.
22. USB in a NutShell - путеводитель по стандарту USB (начало).
23. AVR-USB-MEGA16: USB bootloader USBasp для микроконтроллера ATmega32.
24. Библиотеки для управления устройствами USB HID.
25. Библиотека HID USB Library для Visual Studio .Net (C#, Visual Basic).
26. AVR-USB-MEGA16: примеры применения, проекты с открытым исходным кодом и принципиальной схемой.
27. Литература по применению и программированию AVR.
28. AVR-USB-MEGA16: цветомузыка на светодиодной RGB-ленте WS2811.
29. AVR-USB-MEGA16: работа под Windows 8.
30. Почему не работает библиотека V-USB с микроконтроллером AVR?
31. Работа с USB для чайников на примере AVR-USB-MEGA16 site:vanoid.ru.
32. 140808LibUSB-driver.zip - архив с драйвером библиотеки LibUSB, он нужен для корректной работы прошивки Сергея Кухтецкого совместно с операционными системами Windows. Драйвер подходит для всех версий операционных систем Windows XP (32 bit и 64 bit), Windows 7 (32 bit и 64 bit), Windows 8 (32 bit и 64 bit). В этом же архиве найдете инсталлятор для библиотеки .NET 3.5 (требуется для приложений ПО хоста, написанных на Visual Studio C# 2010).
33. Макетная плата metaboard.
34. Работа с макетной платой metaboard в среде программирования Arduino.
35. AVR: отладочный вывод через UART (RS232 debug).
36Как установить драйвер для программатора USBasp в Windows 8 и Windows 10.