Здесь решил выложить переписку по вопросам программирования макеток, так там есть тоже немало интересного - в плане использования библиотеки V-USB (старое название AVR USB) и библиотеки libusb. Рассматриваются часто задаваемые вопросы (Frequently Asked Questions, FAQ) по макетной плате AVR-USB-MEGA16 (чип ATmega32 с программной реализацией интерфейса USB).
[090707 - 7 июля 2009]
А не подскажете что за прошивка залита по умолчанию в AVR-USB-MEGA16?
Туда залита демонстрационная прошивка 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. Чтобы запрограммировать макетку, программатор не нужен - достаточно подключения к компьютеру по USB.
[090709 - 9 июля 2009]
... что посоветуете в плане IDE для хоста. В плане процессора больше понравилась AVR Studio т. к. бесплатная. А остальные пока не смог оценить т. к. платные.
На все платные IDE есть таблетки, так что у Вас большой выбор. А по поводу посоветовать... У меня глаза уже замылены IAR Embedded Workbench - привык, и работаю в ней как с ARM, так и с AVR. AVR Studio тоже иногда приходится пользоваться по необходимости (если надо разобраться в чужом проекте в таком формате). Поэтому объективного советчика из меня не получится. Вот мое сравнение IAR и AVR Studio - см. [4]. Хоть я Вам и советую IAR, но Вы особо к моему совету не прислушивайтесь, и почитайте на всякий случай форумы.
А вот в плане написания программ для ПК. А по поводу IAR и 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 уже скачал. Буду пробовать.
[090904 - 4 сентября 2009]
Имеется необходимость собрать датчик температур (до 1000 oС). Хотелось бы уточнить на счет платы AVR-USB-MEGA16, представленной на Вашем сайте:
- подходит ли она для измерения температур до 1000 oС (какой диапазон измеряемых напряжений)
- сколько термопар можно подключить к данной плате (имеется ли возможность использовать 2 и более термопар)
Макетная плата AVR-USB-MEGA16 не предназначена СПЕЦИАЛЬНО для измерения температур или подключения термопар - это просто УНИВЕРСАЛЬНАЯ макетная плата. Конечно же, для измерения температур и подключения термопар её МОЖНО использовать (см., например, статью Сергея Кухтецкого [8]), однако ответ на вопрос "подходит ли она для измерения температур до 1000С" зависит исключительно от метода подключения и типа термопар. Если выбрать самый простой путь подключения термопар - к встроенному АЦП микроконтроллера ATmega16 или ATmega32A (используя внешний усилитель сигнала термопары), то термопар можно подключить 8 штук(поскольку АЦП 8-канальный). Диапазон измеряемого напряжения каждого канала зависит от выбора опорного напряжения АЦП. Если использовать внутренний источник опорного напряжения 2.56 вольта, то диапазон измеряемых напряжений составит от 0 до 2.55 вольт с шагом 2.5 миливольта (1024 градации). Таким образом, схема усилителей сигнала с термопар должна быть рассчитана так, чтобы подогнать диапазон входного напряжения АЦП 0..2.55 вольт к диапазону измеряемых температур. Если дополнительно использовать встроенный в микроконтроллер ATmega16 или ATmega32A усилитель АЦП, то диапазон входного напряжения каждого канала изменится (за подробностями обращайтесь к даташиту на микроконтроллер). Если же Вы будете подключать термопары другим способом (например, спользуя внешние многоканальные АЦП), то количество термопар будет зависеть только от Вашей фантазии.
[090910 - 10 сентября 2009]
... вопрос по 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 Emdebbed 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 Emdebbed Workbench. Для платы AVR-USB-MEGA16 иногда firmware можно даже не разработывать, а взять готовую универсальную прошивку Сергея Кухтецкого для класса-обертки на C# (я про это уже упоминал).
Короче, если Вы профи в USB, не боитесь документации на английском, то лучше использовать макетку AVR-USB162. Если же хотите быстро добиться результата, не нужна большая скорость от USB - лучше использовать макетку AVR-USB-MEGA16.
[090912 - 12 сентября 2009]
При подключении к компьютеру макетки AVR-USB-MEGA16 с записанной в неё "универсальной прошивкой" для класса-обертки (см. [3]) система Windows XP обнаружила устройство LEDControl и затребовала для него драйвер. Что это за драйвер и где его брать?
Драйвер находится в папке, куда Вы установили библиотеку libusb (предполагается, что Вы уже установили у себя библиотеку libusb, см. [10]). По умолчанию драйвер находится в папке c:\Program Files\LibUSB-Win32\src\ - там расположены необходимые файлы libusb0.sys и libusb0.dll. При инсталляции драйвера укажите путь в эту папку, и устройство нормально установится.
[090926 - 26 сентября 2009]
Мне понравилась идея использования библиотеки V-USB с чипом без кварца, как в макетной плате AVR-USB-TINY45 [5]. На каких чипах можно использовать библиотеку V-USB без кварца?
Это возможно только на тех чипах, которые снабжены системой PLL (Phase Locked Loop), или ФАПЧ - это серии микроконтроллеров ATtiny25/45/85 и ATtiny26/46/86. Применение PLL в чипах AVR началось в новых моделях микроконтроллеров примерно с 2006 года.
[091009 - 9 октября 2009]
Хорошая идея и хорошая реализация ;-) (тут имеется в виду статья Сергея Кухтецкого "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.
[091113 - 12 ноября 2009]
... как мне прошивать плату AVR-USB-MEGA16? Могу я это сделать через USB? Или мне нужен внешний програматор?
С июля 2010 года в плату прошит загрузчик кода по USB - usbasploader. Чтобы запрограммировать макетку, программатор не нужен - достаточно подключения к компьютеру по USB.
Другой способ прошивки - через JTAG или ISP коннектор, с помощью внешнего программатора (про программаторы почитайте здесь - [12]). Обычно я высылаю платы AVR-USB-MEGA16, прошитые тестовой прошивкой (см. [2]), или - если захочет клиент - прошивкой Сергея Кухтецкого (см. [3]).
[091115 - 15 ноября 2009]
В примерах, первое устройство "custom-class" при подключении к компьютеру, требует драйвер, который должен быть с расширением .inf. А его то нет. И устройство не устанавливается. Hid - устройство работает без проблем.
Почитайте файл libusb\readme.txt (в архиве библиотеки V-USB [1]) - там подробно написано, где .inf файл взять и что с ним делать. Файл .inf для CDC-устройства (его еще называют "драйвером") поставляется вместе с библиотекой libusb, его можно свободно скачать в Интернете. Для генерации inf-файла используйте утилиту inf-wizard.exe, входящую в пакет libusb (например, у меня на компьютере она лежит в папке c:\WinAVR-20080610\utils\libusb\bin\). См. документацию по библиотеке libusb.
[091217 - 17 декабря 2009]
Возникла небольшая проблема при компиляции прошивки от Сергея Кухтецкого для моей платы. Та скомпилированная прошивка, что идет в архиве (имеется в виду ссылка на закачку исходников в статье [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).
Если у Вас возникнут трудности с установкой 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-й перепрошивке мне прошились не те фьюзы. Ну хоть теперь исправил все =).
[100124 - 24 января 2010]
Можно ли организовать с помощью данной технологии следующую задачу: 8 - 16 каналов ШИМ для управления яркостью светодиодов с приложения?
Поскольку такого количества аппаратных каналов ШИМ у ATmega16 или ATmega32A нет, то реализовывать ШИМ придется программно. Придется дорабатывать код класса-обертки и firmware, чтобы обеспечить интерфейс к соответствующим функциям ШИМ firmware. А удастся это или нет вместе с библиотекой V-USB - тут все зависит от конкретных условий задачи (например, частота ШИМ, количество градаций). Но качественный программный ШИМ (чтобы, например, не было заметно мигания светодиода) наверное с использованием библиотеки V-USB невозможен, поскольку прерывания от сигнала USB (INT0) будут влиять на длительности интервалов ШИМ. Вот если бы Вы ограничились только одним или двумя каналами, тогда никаких проблем, поскольку можно было бы использовать аппаратный ШИМ ATmega16.
[100129 - 29 января 2010]
Интересует програмка - просто расширитель линий. Я так понял, что 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.
[100130 - 30 января 2010]
Сергей Кухтецкий: С прерываниями в работе с библиотекой V-USB все не так страшно, если НЕ требуется НЕМЕДЛЕННАЯ обработка своих прерываний. Часто именно так и бывает. Например, те же данные от АЦП можно "забрать" и чуть позже, чем пришло прерывание от АЦП. В таких случаях работает простое "лекарство" - разрешить обработку прерываний в СВОИХ процедурах обработки прерываний путем вставки sei() в начале своего обработчика.
Вот пример обработки прерываний от таймера для "шагания" шагового двигателя.
//-----------------------------------------------------------------------------
// Обработчик прерывания от таймера 1 (COMPA)
//-----------------------------------------------------------------------------
ISR(TIMER1_COMPA_vect){
sei(); // Пусть прерывания от USB поимеют приоритет повыше, чтобы USB не "завис"...
if(lcFlag && (lc >= lcm)) // Если уже выдали конкретное количество шагов (дозу) -
TIMSK &= (byte)(~(1 << OCIE1A)); // запрещаем прерывания по таймеру TIMER1
else
SMDoStep(); // Делаем шаг двигателя
}
Если двигателю пора сделать шаг, а в этот момент "прилетает" прерывания от USB - пусть "вклинится" и спокойно отработает. Небольшая задержка шаговику совсем не помешает, но USB не зависнет.
В самом начале работы с V-USB - эта проблема меня очень сильно "достала". Пока не додумался так "закостылить" проблему приоритетов прерываний в AVR. После этого - БОЛЬШИНСТВО проблем с прерываниями в V-USB совсем ИСЧЕЗЛО.
[100202 - 2 февраля 2010]
Вопросы (простой пример управления портами 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-порт). Выбирайте, что Вам по вкусу - можно взять все готовенькое, а можно на основе этих примеров сделать что-то свое.
[100302 - 2 марта 2010]
Необходимо сделать устройство для измерения усилия на тензодатчике. Процесс довольно быстрый и необходимо делать 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).
Спасибо. Теперь все понятно.
[100322 - 22 марта 2010]
Есть несколько вопросов по 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-программатор, выбирайте любой на вкус (см. [12]).
[100329 - 29 марта 2010]
Пытаюсь общаться с девайсом 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, а там ни одна из рекомендованых библиотек работать не будет.
[100412 - 12 апреля 2010]
Совершенно не понял - как дебажить Flip-ом. Появляется окошко, а там непонятные цифирки :oops:... Сколько ни думал, так и не понял с чем они связаны. В хелпе флипа не нашёл (может проглядел?).
FLIP для отладки НЕ ПРЕДНАЗНАЧЕН. Только для СТИРАНИЯ чипа, ЗАПИСИ и ЧТЕНИЯ его памяти. ВСЕ. Т. е. "дебажить" (это называют еще отладкой "на коленках") можно с помощью FLIP только так: прошил -> не заработало -> поправил код -> скомпилировал -> стер -> прошил -> снова не заработало и т. д. по кругу, пока не заработает. Полноценной отладкой тут не пахнет. По-настоящему (с точками останова, просмотром переменных) можно отлаживать только с помощью JTAG или debugWIRE (AVR JTAGICE mkII, AVR Dragon), а эта технология с FLIP не имеет ничего общего.
Settings-> Enter Debug Mode совсем не то, что Вы хотели. Вот что пишут про этот режим Atmel: "The debug mode helps the user to visualize and check the traffic between FLIP and the target hardware.". Короче, этот режим позволяет видеть обмен данными между программируемым устройством и компьютером - нужно только для поиска проблем в работе программатора FLIP.
[100414 - 14 апреля 2010]
Скачал 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, без изменения прошивки?
Возможность управления портом PB0, как и любым другим (в том числе и портами PC2..PC5, задействованными под JTAG) зависит только от программы firmware, прошитой в микроконтроллер. Смотрите в исходниках той программы, которую прошиваете - как настраиваются интересующие Вас порты, и управляйте состоянием портов соответственно Вашим нуждам.
Если Вы оставите фьюз JTAGEN незапрограммированным, то ножки PC2..PC5 микроконтроллера ATmega16 или ATmega32A можете использовать как обычные порты ввода-вывода.
[100422 - 22 апреля 2010]
... не подскажешь как прошивку залить - там написано программатор нужен. Его наверное через ISP подключать надо.
С июля 2010 года в плату прошит загрузчик кода по USB - usbasploader. Чтобы запрограммировать макетку, программатор не нужен - достаточно подключения к компьютеру по USB.
Если у Вас макетка без загрузчика, то нужен программатор ISP или JTAG-отладчик. Если программатора у тебя нету, то выбери любой подходящий - см. [12], или спаяй сам. Если будешь делать сам, то советую взять STK200+/300 - совместимый программатор (см. [12]), а еще лучше - STK500 наподобие AVR Doper (см. [12]). Он может быть собран по простейшей схеме, поддерживается многими оболочками для программирования: IC-Prog, PonyProg, UniProf, CodeVisionAVR C Compiler.
... к разъему ISP подлючу программатор, а питание подать через USB?
Да, через USB-коннектор подать питание проще всего. Я подаю иногда питание через ISP-коннектор, когда надо много плат запрограммировать. Если Ваш программатор может подавать питание через ISP, то Вы можете так же поступить.
[100426 - 26 апреля 2010]
... не могли бы Вы мне помочь? Собрал схему (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), достаточно проверить осциллографом, что кварцевый генератор работает, и на нужной частоте, или на всякий случай попробовать поменять кварц.
Заработало! За основу взял схему и прошивку из [21]. Разобравшись, выяснил, что проблема была с подключением выводов, и не зашивались fuse-биты. Спасибо за помощь!
Да, через USB-коннектор подать питание проще всего. Я подаю иногда питание через ISP-коннектор, когда надо много плат запрограммировать. Если Ваш программатор может подавать питание через ISP, то Вы можете так же поступить.
[100517 - 17 мая 2010]
... как мне одновременно подсоединить несколько плат и программно работать с ними?
Самый простой способ - сделать у каждой из плат разные значения 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).
[100518 - 18 мая 2010]
Необходимо опрашивать состояние 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 кнопок.
[101215 - 15 декабря 2010]
Я пытался из командной строки перекомпилировать 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.
[110217 - 17 февраля 2011]
Приобрёл 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-порта.
ОК, все заработало.
[110911 - 11 сентября 2011]
Макетка AVR-USB-MEGA32 перестала работать с компьютером по USB со следующими симптомами (операционная система Windows 7): в Диспетчере Устройств макетка отображается со знаком восклицания, и говорит что есть проблемы с драйвером устройства (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.
Проблема решилась переустановкой билиотеки lib-usb.
[111015 - 15 октября 2011]
(вопрос про код на языке C# класса обертки ATmega16.cs Сергея Кухтецкого) при общении с макеткой используются команды, которые обрамлены в 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.
[120113 - 13 января 2012]
Какая максимальная сила тока допустима на выходах моей макетки?
Сила тока, которую Вы може получить от порта, зависит от параметров применяемого микроконтроллера. Например, для ATmega32A в корпусе TQFP44 (макетная плата AVR-USB-MEGA16) допустим максимальный ток на порт ввода/вывода 40 мА, при этом общий ток потребления кристалла не должен превышать 400 мА. Для чипа AT90USB162 и AT90USB162MU (макетные платы AVR-USB162 и AVR-USB162MU) также допустим максимальный ток на порт ввода/вывода 40 мА, но общий допустимый ток потребления кристалла в 2 раза меньше - не более 200 мА.
[Ссылки]
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. Как пользоваться фирменным бутлоадером Atmel (Flip DFU) на примере макетной платы AVR-USB162.
10. Разработка устройства USB - как начать работу с библиотеками AVR USB (V-USB) и libusb.
12. Программаторы для AVR.
16. Engbedded Atmel AVR® Fuse Calculator.
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).
|
Комментарии
2014-03-0421:26:06 Все заработало, но признаюсь не с первого раза.
Скажите пожалуйста, как можно поменять назначения контактов для шины 1-Wire? В ваших проектах сигнальный вход PB1, а проштудировав класс-обертку, так и не понял как его поменять. А чтобы реализовать SPI интерфейс, получается надо сделать в файле на C# метод работы с SPI интерфейсом и добавить регистры интерфейса?
microsin: вообще скрещивать V-USB и 1-Wire я Вам не рекомендую, поскольку протокол 1-Wire подразумевает формирование жестко заданных интервалов времени в сигнале, а этого практически нереально добиться с приоритетами в программной обработке USB. А насчет того, что Вы не нашли в классе назначение ножек для 1-Wire, то это неудивительно - какую ножку использовать задано не в классе C#, а в прошивке микроконтроллер а. Так что если захотите поменять, то правьте исходный код прошивки, перекомпилируйт е, и перепрошейте микроконтроллер (можно прямо через USB, с помощью встроенного загрузчика).
Насчет SPI - все должно работать нормально, если корректно реализуете доступ к соответствующим регистрам в обертке на C#. Дело в том, что SPI реализован аппаратно в отличие от 1-Wire, и поэтому программная обработка протокола USB будет мешать работе SPI гораздо меньше, чем в реализации 1-Wire.
2013-08-1918:22:49 Все заработало с первого раза. Ничего не глючит. Использовал готовый atmega32-16mhz.hex. Вместо стабилитронов поставил светодиоды NSSW020BT с напряжением 3.2 вольт и резисторы, которые 68 - на 80 Ом. Можно ли так делать?
Превышения тока светодиодов нет (выход с порта 4.75 вольт, падение напряжения 3.2 вольт, резистор 80 ом и 1.5К протеус выдал 19.7 мА).
Если можно, сделайте пожалуйста для Atmega1284p, 16mhz, назначение выводов и светодиод так же. Очень нужно. С winavr не дружу, а на CVAVR еще не портировали.
microsin: так делать можно, тем более что схема у Вас работает. Светодиоды немного хуже стабилитронов только тем, что у светодиодов может быть более пологая вольт-амперная характеристика, чем у стабилитронов. Сейчас я в отпуске до 26 августа, поэтому пока не могу скомпилировать для Вас нужную прошивку. Напишите мне пожалуйста на email (см. Контакты). Переписку с читателями я веду только по email, не в комментариях.
2011-11-1901:35:59 Собрал свой девайсик сделал его хидом так что все работает без внешнего драйвера, когда кидаю по запросу компа с железа все прекрасно работает, когда начинаю кидать с компа данные прога ПК-шная зависает на 3 секунды, кто-нибудь с этим сталкивался?
2011-06-1522:13:25 Подскажите пожалуйста! У меня программатор AVR-JTAG-USB, настроен, все фьюзы выставлены в AVR Studio, но когда хочу проект в IAR-е прошить, выдает следующее - Failed to initialize USB driver: error 0×20000007 ("internal system error")! Может как-то IAR надо настроить?
2010-12-1912:55:22 Объясните структуру работы программы. В примере hid-data объявляются 3 функции usbFunction (..) для передачи данных, но ни одна из них не вызывается.
microsin: весь функционал (обмен данных с хостом) в примере hid-data сосредоточен в двух функциях - usbFunctionRead и usbFunctionWrit e. Вам не нужно Вам разбираться, что откуда вызывается, иначе все напортите (на самом деле эти функции вызываются из модуля библиотеки V-USB usbdrv\usbdrv.c). Вызов этих функций - не Ваша проблема, все уже давно придумано и сделано за нас - разработчиками Objective Development. Вам только надо подправить код функций usbFunctionRead и usbFunctionWrit e под свои нужды, а про остальное - просто забудьте.
2010-07-0706:01:50 Пробую скомпилировать, avrdoper выдат ошибку:
main.o: In function `usbFunctionDes criptor':
D:My SundukProjectel ectronicsATMELA VRstudiodoperde fault/../main.c:300: undefined reference to `usbMsgPtr'
D:My SundukProjectel ectronicsATMELA VRstudiodoperde fault/../main.c:300: undefined reference to `usbMsgPtr'
main.o: In function `main':
main.c:662: undefined reference to `usbInit'
main.c:667: undefined reference to `usbPol1'
main.c:670: undefined reference to `usbTxStatus1'
main.c:680: undefined reference to `usbSetInterrup t'
make: *** [doper.elf] Error l
Build failed with 6 errors and 2 warnings
Никто не отвечает, в чем дело. Буду счастлив если прольте свет. Исходники не трогал, задал тип проца и частоту в AVRsutio.
microsin: на поставленный таким образом вопрос даже профессиональны й телепат не ответит. Если хотите, пишите на email, но только задавайте конкретные вопросы, и пришлите Ваш проект.
2010-06-0810:03:19
Но зато теперь все работает! Спасибо за ответ.
2010-06-0710:17:34 Доброго времени суток.
Опишу свою ситуацию:
1. имеется ATMEGA8-16PU. В ней зашит загрузчик, который позволяет программировать ее через HIDBootFlash.
2. Имеется макетка для связи по USB. На макетке имеется одно отличие от "стандартной" "распиновки" - сигнал "D-" прикручена не на 4-ю, а на 0-ю ногу (т. е. на PD0). Сделано так по просьбе одного человека другим человеком.
3. Для варианта "залить программку через USB" ВСЕ РАБОТАЕТ. Т. е. программа через USB заливается и успешно функционирует.
4. А вот программа для обмена по USB, скомпилированна я и залитая мною туда, НЕ РАБОТАЕТ :( - вылезает "Устройство USB не опознано".
Компилирую я стандартные примеры - hid-data и hid-custom-rq. При этом изменяю только две строчки - "#define USB_CFG_DMINUS_ BIT 0" и "#define USB_CFG_CLOCK_K HZ 12000" ( у меня на кристалле написано "12.000").
В чем может быть дело? Вроде бы все должно работать
microsin:
1. Проверьте, не конфликтует ли инициализация портов USB (ножек D+ и D-) с другой инициализацией портов (в пользовательско й программе, в загрузчике).
2. Проверьте, не пересекаются ли области памяти загрузчика и загружаемой в кристалл программы (т. е., влезают ли они вместе во flash, и не затирают ли друг друга).
3. Проверьте настройки makefile - например, прошиты ли у Вас фьюзы FUSE_L (Fuse low byte) 0×9f и FUSE_H (Fuse high byte) 0xc9, соответствует ли тип микроконтроллер а (макрос DEVICE) Вашему ATmega8.
Это все, что я могу предположить по присланной Вами информации.
2010-04-1409:00:08 Тогда что из этого я нетак делаю:
Качаю отсюда 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 везде одно и тоже.
microsin: обратите внимание на строчку 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".
2010-04-1406:34:48 Скачал Libusb-win32, поставил все вроде установилось, только програмка testlibusb-win.exe не находит ни одного устройства, так и должно быть? Подскажите может libusb работает только с AVR? Если AVR-USB-MEGA16 не подключена должна быть какая то реакция со стороны testlibusb-win.exe?
microsin: программа testlibusb-win.exe должна показывать абсолютно все USB-устройства, корректно установленные в системе и имеющие подключенные драйвера. См. скриншот к статье http://microsin.ru/content/view/613/44/, шаг 8. Библиотека libusb предназначена для программного обмена данными с ЛЮБЫМИ устройствами, а не только с устройствами USB на микроконтроллер ах AVR. Если AVR-USB-MEGA16 не подключена, или в ней нет firmware, предназначенног о для поддержки протокола USB, то никакой реакции со стороны testlibusb-win.exe не будет (в показываемом списке USB-устройств не будет устройства, соответствующег о макетной плате AVR-USB-MEGA16).