AVR-USB-MEGA16, V-USB, FAQ: переписка по вопросам программирования |
Написал microsin | |||
10.07.2009 | |||
Здесь решил выложить переписку по вопросам программирования макеток, так там есть тоже немало интересного - в плане использования библиотеки 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. Если будете писать программы "с нуля", но хотите пользоваться примерами программирования для USB, то большого значения не имеет, какую IDE используете. Можно использовать и не только вышеперечисленные 3 варианта, но и Delphi, и CBuilder, и даже Visual Basic. Самое главное - это разобраться, как в используемой IDE пользоваться библиотекой libusb (для непрофессионала в программировании это может оказаться не совсем просто). Для вариантов 1, 2, 3 есть готовые рабочие примеры программ хоста USB c хорошими комментариями и руководством, как что делать. Спасибо за ответ. Express Edition уже скачал. Буду пробовать. [090904 - 4 сентября 2009]
Имеется необходимость собрать датчик температур (до 1000 oС). Хотелось бы уточнить на счет платы AVR-USB-MEGA16, представленной на Вашем сайте: Макетная плата AVR-USB-MEGA16 не предназначена СПЕЦИАЛЬНО для измерения температур или подключения термопар - это просто УНИВЕРСАЛЬНАЯ макетная плата. Конечно же, для измерения температур и подключения термопар её МОЖНО использовать (см., например, статью Сергея Кухтецкого [8]), однако ответ на вопрос "подходит ли она для измерения температур до 1000С" зависит исключительно от метода подключения и типа термопар. Если выбрать самый простой путь подключения термопар - к встроенному АЦП микроконтроллера 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 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 зависает не из-за 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. Подозреваю, что Вы этого не делали =).
Таким образом, еще раз, что Вам надо сделать: Если у Вас возникнут трудности с установкой 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).
УРААА!! Заработало!! [100124 - 24 января 2010]
Можно ли организовать с помощью данной технологии следующую задачу: 8 - 16 каналов ШИМ для управления яркостью светодиодов с приложения? [100129 - 29 января 2010] Интересует програмка - просто расширитель линий. Я так понял, что ATmega16 или ATmega32A видится в системе как некий виртуальный ком порт. Требуется байт, который пишу в COM-порт, выводить на порт С (PC0..PC7) и наоборот, при чтении байта из COM-порта в компьютер поступает состояние порта А (PA0..PA7).
ATmega16 или ATmega32A видится как COM-порт только в том случае, если в неё зашита firmware, реализующая класс CDC. Из проектов, которые есть у меня на сайте, по такому принципу работают:
Если хотите управлять через виртуальный COM-порт, то присмотритесь к проекту CDC-IO, он с лихвой перекрывает Ваши требования. Возможно также управление ресурсами микроконтроллера (чтение/запись портов A, B, C и других регистров) с помощью прошивки Сергея Кухтецкого, взаимодействующей в ПО хоста (программе на компьютере) с классом-оберткой на C#. Советую также посетить страничку проектов библиотеки V-USB - там наверняка найдете много интересного. Большинство этих проектов удобно собирать на макетной плате AVR-USB-MEGA16. [100130 - 30 января 2010] Сергей Кухтецкий: С прерываниями в работе с библиотекой V-USB все не так страшно, если НЕ требуется НЕМЕДЛЕННАЯ обработка своих прерываний. Часто именно так и бывает. Например, те же данные от АЦП можно "забрать" и чуть позже, чем пришло прерывание от АЦП. В таких случаях работает простое "лекарство" - разрешить обработку прерываний в СВОИХ процедурах обработки прерываний путем вставки sei() в начале своего обработчика. Вот пример обработки прерываний от таймера для "шагания" шагового двигателя.
//----------------------------------------------------------------------------- В самом начале работы с V-USB - эта проблема меня очень сильно "достала". Пока не додумался так "закостылить" проблему приоритетов прерываний в AVR. После этого - БОЛЬШИНСТВО проблем с прерываниями в V-USB совсем ИСЧЕЗЛО. [100202 - 2 февраля 2010]
Вопросы (простой пример управления портами P1..P22 макетки AVR-USB-MEGA16 portctrl):
1. Наверное, Вы все правильно поняли. Конечно, нужно задать макроопределения для всех используемых в программе портов микроконтроллера (LEDxx) и маски для управления ими. Кроме того, нужно переписать процедуру LedControl в том виде, чтобы она была удобна для управления всеми Вашими портами. Сколько конкретно передавать байт данных - зависит только от метода кодирования в них информации о состояниях портов, это не имеет принципиально никакого значения. Делайте так, как Вам удобно. Можно даже выделить под один светодиод целый байт - кто нам мешает, если память это позволяет? [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. Насчет драйверов. Честно говоря, я никогда не писал драйвера для 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. [100329 - 29 марта 2010] Пытаюсь общаться с девайсом AVR-USB-MEGA16 посредством стандартной hid.dll (из Delphi). Видит, читает параметры, название, производителя и т.п. Вопрос - как зажечь светодиод и управлять портами? FileWrite(HidHandle, buf, bufsize) и HidD_SetFeature(HidHandle, buf, bufsize) не приводят ни к чему толковому, хотя стандартная утилитка светодиод таки зажигает.
Конкретно вопросы такие: В примере из командной строки отправляется 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].
Тогда что из этого я не так делаю: Здравствуйте! Наконец то решил собрать данную схему, и при проверке наткнулся на такую проблему: выход порта РВ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). Заработало! За основу взял схему и прошивку из [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 и более), есть следуюшие варианты: Из перечисленных выше 3 способов я понимаю только 2, но он как раз пока под вопросом. Почему матрица не подходит? Есть же какая-то верхняя граница (так как можно же одновременно замкнуть 2, 3, 4, 5... значит и максимум должен быть). Мне бы хотелось узнать точный максимум так число одновременно замкнутых контактов это как раз основная проблема в моей задаче. А первый и третий для меня непонятны.
Требование по определению необходимого максимального числа одновременно замкнутых контактов в матрице выдвигается только из постановки задачи, макетная плата и микроконтроллер ATmega16 или ATmega32A тут ни при чем. Максимум детектируемых одновременно нажатий зависит от алгоритма опроса матрицы и скорости опроса, т. е. от соотношения длительности одновременного нажатия и длительности цикла опроса матрицы, а также от расположения одновременно нажатых клавиш на матрице. В любой клавиатурной матрице максимальное количество определяемых нажатых одновременно клавиш определяется ТЕХЗАДАНИЕМ - т. е. изначально допускается, что НЕВОЗМОЖНО узнать в ЛЮБОЙ момент времени ЛЮБОЕ количество одновременно нажатых клавиш, просто в техзадании указывается, как компромисс, максимальное определяемое количество одновременно нажатых кнопок и интервал опроса, или время реакции матрицы. ОТНОСИТЕЛЬНО ЭТОГО УПРОЩЕННОГО ТЕХЗАДАНИЯ проектируется конфигурация матрицы, подбирается требуемый по мощности микроконтроллер. Более подробно я не могу объяснить, так как для этого придется объяснять, КАК работает алгоритм сканирования матрицы замыкаемых контактов (а таких алгоритмов напридумано не один), и ПОЧЕМУ он не может отловить некоторые одновременно нажатые комбинации кнопок в ЛЮБОЙ интервал времени. Если вам интересно, сами ищите и изучайте соответствующую техническую литературу.
Можно также применить специализированные расширители портов. Например, одна микросхема max7301 даст Вам дополнительные 28 портов, при этом на ATmega16 или ATmega32A будет задействовано только 4 порта, т. е. Вы сможете только с одной микросхемой MAX7301 опрашивать 28+(22-4)=46 датчиков. [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) - прошиваете - и о ужас - ничего не работает (что и следовало ожидать).
Варианты решения проблемы: [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. Попробуйте сделать следующее: Проблема решилась переустановкой билиотеки 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 и ПО хоста). |
|||
Последнее обновление ( 24.06.2012 ) |