Программирование AVR: решение проблем, FAQ FAQ по макетной плате AVR-USB162 (чип AT90USB162), LUFA Sun, March 26 2017  

Поделиться

нашли опечатку?

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

FAQ по макетной плате AVR-USB162 (чип AT90USB162), LUFA Печать
Добавил(а) microsin   

Здесь рассматриваются часто задаваемые вопросы (Frequently Asked Questions, FAQ) по макетным платам AVR-USB162, AVR-USB162MU (чип AT90USB162 с аппаратным интерфейсом USB) и AVR-USB32U4 (чип ATmega32U4).

at90usb162-04IMG_8330.jpg AVR-USB162MU_IMG_1139.JPG AVR-USB32U4-top-IMG 2310
AVR-USB162 AVR-USB162MU AVR-USB32U4

Поскольку вариант, что плата не работает - исключается (я каждую перед отправкой проверяю), то остается только следующее - Вы не установили драйвер для устройства AT90USB162 DFU. Процедура установки драйвера подробно описана в файле подсказки Flip "C:\Program Files\Atmel\Flip 3.3.2\info\Updating the USB Driver - Windows XP.html", и на моей страничке тоже, но не так подробно - см. [4], начиная со слов "При подключении макетной платы AVR-USB162 по USB система запросит драйвера, ...".

Вы наверное, забыли установить перемычку J3 "5V/3.3V", которая задает напряжение питания периферии чипа AT90USB162. Перемычку можно и нужно поставить в любое из двух положений. Без перемычки плата не работает. Как поставите перемычку, Windows увидит подключенную по USB плату и запросит для неё драйвера. После установки драйверов можете прошивать плату с помощью USB Flip-технологии Atmel.

Поведение платы, которое Вы описали, совершенно нормальное - при включении платы управление передается в код пользователя, а не в загрузчик. Ваш тестовый код, мигающий светодиодом, наверняка мал по объему, поэтому загрузчик (bootloader) с большой вероятностью не стерт. Чтобы вернуться снова в загрузчик (чтобы снова заработал программатор Flip), существует стандартная процедура (описана в документации на чип AT90USB162 [3], см. секцию Entering the Boot Loader Program, а также краткая инструкция на русском есть в [4], см. начиная со слов "... bootloader можно запустить стандартной процедурой, описанной в документации"):

- подключаем плату через USB
- нажимаем кнопку SW1 RESET
- удерживая кнопку SW1 RESET, нажимаем кнопку SW2 HWB
- удерживая кнопку SW2 HWB, отпускаем кнопку SW1 RESET
- отпускаем SW2 HWB
После этой процедуры у нас в системе должно появиться устройство LibUSB-Win32 Devices\AT90USB162 (см. в Диспетчере Устройств), и теперь снова будет работать программирование через USB с помощью программы DFU Flip. Если устройство LibUSB-Win32 Devices\AT90USB162 в Диспетчере Устройств не появилось, значит надо перепрошить bootloader (Вы его каким-то образом стерли).

Как перепрошить bootloader:
- скачайте бинарник bootloader-а с сайта atmel.com. Последний раз я его скачивал по ссылке [5].

- распакуйте из архива файл bl_usb_162v105.a90 (прошивка bootloader-а в HEX-формате).
- подключите ISP-программатор к коннектору J4 ISP макетной платы AVR-USB162, сотрите чип AT90USB162 и прошейте в память FLASH файл bl_usb_162v105.a90.

После вышеуказанных действий Вы снова сможете прошивать макетную плату AVR-USB162 через USB с помощью программатора DFU Flip (см. руководство по бутлоадеру USB DFU Flip [7], а также краткое описание работы с бутлоадером в статье [4]).

Плата AVR-USB162 позволяет себя загружать (программировать) без debugWire и даже без ISP-программатора - через USB bootloader Flip. Удобств в отладке правда нет, но зато дешево и сердито. Ссылки на примеры firmware и ПО хоста действительно найти на сайте Atmel непросто. Эти ссылки у меня есть в статье [1], но наверное даже в них ориентироваться трудно, поэтому я выложил примеры еще и в отдельном файле (там все вместе - и firmware, и ПО хоста), см. ссылку [8]. Как с этими примерами обращаться, см. в той же статье [1]. Другие примеры кода см. в популярной библиотеке LUFA.

1. Перемычки (фьюзы) можно изменить только с помощью обычного ISP-программатора, а программа Flip, которой Вы прошиваете макетную плату AVR-USB162 через USB, этого делать не позволяет. Будьте внимательны с изменением фьюзов через программатор ISP - это может повлиять на работоспособность bootloader-а.

2. Это потому, что код бутлоадера в Вашем чипе AT90USB162 не имеет автодетекта частоты кварца, который Вы установили, и рассчитан строго на частоту 8 МГц. Если верить документации Atmel [7], секция 7 "Using the USB bootloader for In System Programming", то версия бутлоадера начиная с 1.0.1 должна поддерживать кварц 16 МГц с установленной по умолчанию перемычкой CKDIV8. Может быть, у Вас старая версия bootloader, попробуйте перепрошить его (архив с bootloader bl_usb_162v105.zip можете скачать по ссылке [5]). Наверное, перепрошить bootloader с помощью Flip (через USB) не получится и придется использовать стандартный программатор ISP.

Сменил я бутлоадер на новый. Прошил фьюзы как мне нужно. Поставил кварц на 16 МГц. Завел девайс и все заработало.

[UPD140624]

Нурисламов Руслан: на некоторых чипах AT90USB162-MU (они стоят на макетных платах AVR-USB162MU) после завершения работы бутлоадера (после перепрошивки) рабочая тактовая частота микроконтроллера устанавливается на значении 2 МГц, несмотря на то, что кварц установлен на 16 МГц. Это происходит потому, что работает предделитель на 8 - возможно, делитель включен фьюзами, и на это значение тактовой частоты рассчитан бутлоадер Atmel.

Если нужно, чтобы в такой ситуации Ваша программа работала на полной скорости (на тактовой частоте 16 МГц), и Вы не хотите менять фьюзы и перешивать бутлоадер, то нужно в программе пользователя, до входа в главный цикл main перепрограммировать делитель. На языке C это делается так:

CLKPR = (1 << CLKPCE); //разрешение перепрограммирования делителя
CLKPR = 0x00;          //отключение делителя

После выполнения этого кода делитель отключается, и микроконтроллер AT90USB162 начинает работать на частоте 16 МГц.

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.

На сайте Atmel описан рецепт решения проблемы:

"Возможно, что путь до Вашего файла неприемлем для программы Flip. Попробуйте скопировать открываемый файл в корень диска, и попробуйте поле этого открыть его программой Flip. Например, скопируйте ваш файл в C:\myhexfile.hex.

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

Иногда бывает проблема с форматом Вашего hex-файла. Проверьте его формат - в конце hex-файла должна быть строка :00000001FF."

Реализация ClassDriver (Device Mode Class Drivers, драйвера класса режима устройства USB) вошла в библиотеку LUFA позже, чем реализация LowLevel. Если коротко, то реализация ClassDriver снимает с разработчика приложения бремя реализации некоторых стандартных классов USB, так как их код перенесен в основном в модули библиотеки. Таким образом, Вы как разработчик можете больше сосредоточиться на написании приложения USB-устройства, а не на самом интерфейсе USB.

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

WinAVR никаким боком к отладке не относится. Это всего лишь компилятор GCC и примеры программ, с ним совместно работает среда программирования AVR Studio. Теперь по поводу отладки.

Полноценно (т. е. realtime, с точками останова, с просмотром значений переменных, дизассемблированного кода) отлаживать программы для чипов AVR (в том числе и для AT90USB162) можно только через аппаратные отладчики Atmel, других вариантов не существует. Это отладчик AVR Dragon (он недорогой, и доступен для покупки) или JTAGICE mkII (он довольно дорог). Подключаются они через USB к компьютеру, а к макетной плате AVR-USB162 через коннектор ISP/dW. К сожалению, мне еще не попадались описания самодельных клонов этих отладчиков.

Есть также какой-то старый отладчик Atmel, подключающийся через COM-порт, и для него есть клоны. Сам я его не пробовал, но читал на форумах, что с ним есть проблемы, работает плохо. Поэтому советую Вам не изобретать велосипед, а купить на ebay нормальный AVR Dragon.

Можно еще отлаживать программы без аппаратного отладчика, по методу написал - залил_через_Flip - попробовал - не_заработало - исправил - залил_через_Flip ... и так далее. В этом случае для отладочного вывода используют светодиод и осциллограф, а так же ножку TX последовательного порта UART и консоль терминала. См. также [6].

По прошивке по ISP микроконтроллер AT90USB162 ничем не отличается от других микроконтроллеров AVR, поэтому см. документацию на Ваш ISP-программатор, и даташит на AT90USB162.

На какой плате собрать Ваше устройство - это не принципиально. Главное - определиться с параметрами Вашего будущего контроллера, и найти в сети Интернет проект с открытым исходным кодом, который максимально удовлетворяет Вашим потребностям. Если Вы найдете такой проект (а Вы его найдете обязательно, их очень много, нужно только выбрать), то можете либо взять его либо готовый, как есть, либо просто модифицировать код проекта и схему, чтобы он полностью соответствовал Вашим целям и ожиданиям. USB MIDI устройство может быть основано на одной из популярных библиотек для AVR - это V-USB и LUFA. И для той, и для другой библиотеки есть уже готовые примеры устройств USB MIDI. Вот некоторые примеры на библиотеке V-USB (я просто прогугил запрос MIDI V-USB):

1. AVR-MIDI - a Class Compliant MIDI Device http://cryptomys.de/horo/V-USB-MIDI/index.html
2. Pepper-MIDI - Control SX-150 Synth via MIDI http://morecatlab.akiba.coocan.jp/morecat_lab/Pepper-midi-e.html
3. Monaka http://morecatlab.akiba.coocan.jp/morecat_lab/Monaka-e.html
4. phi-T Control http://philaudio.wordpress.com/projects/phi-t/phi-t-control/

Есть большой список USB-устройств на библиотеке LUFA (я просто прогугил запрос MIDI USB LUFA), в этом списке есть примеры USB MIDI устройств.

Если Вы решите делать MIDI устройство на библиотеке V-USB, то я Вам советую плату AVR-USB-MEGA16 или Metaboard. Если решите делать MIDI устройство на библиотеке LUFA, то я Вам советую плату AVR-USB162 [4] или плату AVR-USB162MU. Все эти платки недорогие, стоят каждая 500 рублей. Надеюсь, я ответил на первый Ваш вопрос, как сделать MIDI-устройство и какую плату выбрать. По поводу второго вопроса - как сделать HID устройство на плате с AVR - ответить на него невозможно, не написав книгу, так как вопрос очень широк. Если коротко - тупо ищете в Интернете готовый проект - для USB HID устройств на AVR их навалом, не разгребешь (и они тоже основаны на библиотеках V-USB и LUFA), и переделываете под свои нужды. Все точно так же, как и для USB MIDI контроллера.

Чтобы все получилось, нужно двигаться последовательно, маленькими шагами. Советую Вам начать в таком порядке:

1. Найдите в сети готовый пример программы firmware USB HID для AT90USB162, и программы компьютера, которая с ним работает. Например, это может быть код со ссылки [2].
2. Научитесь компилировать firmware USB HID, научитесь его перепрошивать с помощью USB бутлоадера FLIP. Добейтесь того, что Ваше USB-устройство, прошитое скомпилированной Вами прошивкой, определяется в компьютере как устройство USB HID.
3. Научитесь компилировать ПО хоста (программу для компьютера), которая управляет устройством USB HID. Попробуйте поуправлять Вашим устройством.

Если есть проблемы, прочитайте также пожалуйста FAQ по макетной плате (эта статья). Только после того, как успешно завершите шаги 1..3, можете думать о том, чтобы написать что-то свое. Для этого изучите исходный код firmware и ПО хоста. Когда Вы поймете, как он работает, то легко сможете написать свою программу или исправить код, чтобы он выполнял нужные Вам функции. Основной принцип - брать готовое, понять как работает, и на основе этого написать свое.

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

Эти штыревые контакты так и называются - линейки контактов с шагом 2.54 папа (здесь и далее жирным шрифтом указан запрос к поисковой системе Google). Для поиска введите эти ключевые слова, а еще лучше - 2.54 mm male header. Отличный каталог таких разъемов найдете на сайте digikey: 2.54 mm male header site:digikey.com, а также на сайте molex найдете полный PDF-каталог по таким разъемам: 2.54 mm male header site:molex.com.

На самом деле все очень просто. Процесс по шагам.

1. Скачайте последнюю версию библиотеки LUFA отсюда (LUFA site:fourwalledcubicle.com). Это ZIP-архив, распакуйте его в любую папку.
2. Скачайте с сайта atmel.com и установите себе Atmel Studio. Для скачки понадобится бесплатная регистрация на сайте Atmel, которая ни к чему не обязывает. Собственно все. Далее можете компилировать проекты LUFA не с помощью тулчейна WinAVR, а с помощью тулчейна Atmel Studio.

Если пока не очень понятно, то объясню подробнее. Есть тулчейн WinAVR, он обычно находится в папке C:\WinAVR-20100110 (циферки зависят от версии). Есть тулчейн от Atmel, он обычно находится в папке C:\Program Files\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.3.2.31\AVRToolchain (циферки зависят от версии). Принципиальной разницы между этими тулчейнами нет - тупо и там и там компилятор gcc и сопутствующие утилиты.

Все проекты в LUFA (они находятся в папке LUFA-130901\Projects из архива, циферки могут меняться в зависимости от версии LUFA) основаны на makefile, который можно скормить любому тулчейну, которому захотите - или WinAVR, или Atmel Studio. Каждый проект LUFA имеет такой makefile (он находится в папке проекта). Компиляция проекта (получение hex-файла прошивки) заключается в запуске команд make clean и make. При этом какой тулчейн будет использоваться - зависит от путей, настроенных в переменной окружения PATH. Для компиляции через тулчейн WinAVR в переменной PATH должен быть настроен путь до каталога C:\WinAVR-20100110\bin, а для компиляции через тулчейн Atmel Studio в переменной PATH должен быть настроен путь до каталога C:\Program Files\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.3.2.31\AVRToolchain\bin\. Пути компиляции можно менять из командного файла, чтобы постоянно не трахаться с их редактированием (если Вы хотите иметь легкую возможность компилировать из обеих тулчейнов).

Если Вы хотите иметь проект LUFA, красиво выглядящий уже в IDE Atmel Studio, то просто создайте новый проект (New Project..., или Файл -> Создать -> Проект...), и настройте его на основе makefile того проекта LUFA, который Вам нужен. Можно так не делать, а задать опции проекта Atmel Studio вручную, подсмотрев имена опций и их значения в makefile проекта. Это сложнее, но возможно будет для Вас интереснее =). Теперь уже можете запускать компиляцию из GUI Atmel Studio. Если у Вас есть отладчик, то можете пользоваться отладчиком. Если отладчика нет, то кое-что можно отладить в симуляторе. Если симулятора нет, то можно отлаживать по принципу скомпилировал-прошил-попробовал и с помощью отладочных сообщений [6].

См. также Exporting the LUFA Library for IDE Use site:fourwalledcubicle.com.

Для работы как устройства USB отсутствие упомянутых конденсаторов никак не сказывается. C4 и C5 устанавливать конечно желательно, потому что это улучшает условия запуска тактового генератора, но на практике обычно это не требуется. Конденсаторы по питанию С6, С8, С9, С10 стоит устанавливать в том случае, когда к питанию предъявляются особые требования - например, нужно снизить уровень помех при работе с АЦП, при генерации аналоговых сигналов и т. п.

Вопрос от пользователя макетной платы AVR-USB32U4: загружаю в микроконтроллер ATmega32U4 простейшую программу (с помощью утилиты USB DFU Flip). Программа мигает светодиодом, 1 секунда не горит, 1 секунда горит, но почему-то программа работает в 8 раз медленнее. Задержка _delay_ms(1000) дает 8 секунд вместо одной, на контактах резонатора осциллографом вижу частоту 16 МГц, макроопределение F_CPU установлено правильно. Вот код программы (среда разработки AVR Studio 5):

#include < avr/io.h>
#include < avr/interrupt.h>
#define F_CPU 16000000 
#include < util/delay.h>
#include < stdint.h>
  
#define PIN_LED 6
  
int main(void)  
{
   DDRD|=_BV(PIN_LED); // pin D6 выход
   while(1)
   {
      PORTD&=~_BV(PIN_LED);  
      _delay_ms(1000);
      PORTD|=_BV(PIN_LED); 
      _delay_ms(1000); 
   }
}

При включении платы получаю чередующиеся задержки горящего светодиода примерно 8 секунд, и не горящего светодиода примерно 8 секунд. Подскажите, что не так?

Когда программа работает не с ожидаемой скоростью, например функция _delay_ms дает неправильную задержку, то возможны 4 причины:

1. Включен внутренний делитель тактовой частоты, но Вы про это не знаете и это не учитываете. Это самая вероятная причина.
2. Неправильно установлены фьюзы (опять-таки включен делитель, либо работает внутренний RC генератор). Это не Ваш случай, так как USB-загрузчик не позволяет менять фьюзы, и Вы видите осциллографом работу генератора тактовой частоты на 16 МГц.
3. Неправильно выставлено значение F_CPU, это не Ваш случай.
4. В проекте отключена оптимизация по скорости. Это тоже не Ваш случай, потому что отключение оптимизации не может давать погрешность вычисления задержки в 8 раз.

Следовательно, у Вас по умолчанию работает внутренний делитель тактовой частоты (clock divider), который делит тактовую частоту генератора на 8. В результате микроконтроллер работает на частоте 2 МГц вместо 16. Вы можете исправить ситуацию двумя способами: либо перезадать F_CPU на корректное значение 2000000, либо в программе до входа в бесконечный цикл перепрограммировать делитель (Вам нужно отключить его). Вот как это делается на языке C (фрагмент кода Вашей программы, который нужно доработать):

...
int main(void)  
{
   DDRD|=_BV(PIN_LED);
   CLKPR = (1 << CLKPCE); //разрешение перепрограммирования делителя
   CLKPR = 0x00;          //отключение делителя
   while(1)
   {
...

Похожая ситуация описана в вопросе Q005-091006, там делитель перепрограммировался у макетной платы AVR-USB162MU (микроконтроллер AT90USB162MU).

Примеров для других классов, не USB HID, действительно мало. Причина проста - обычно всегда за глаза хватает скорости USB HID, а для поддержки скоростей порядка FullSpeed требуются большие вычислительные ресурсы, которых у простенького микроконтроллера AVR явно недостаточно.

Максимальная теоретическая скорость FullSpeed может быть достигнута для таких классов USB-устройств, как например USB MSD, Bulk Vendor Device, USB CDC (примеры этих устройств есть в библиотеке LUFA). Реальная скорость будет конечно меньше, и будет зависеть от объема дополнительной обработки и качества кода, а также от кода, работающего на стороне хоста USB (т. е. от драйвера устройства USB, и от ПО хоста). За дополнительной информацией пожалуйста обращайтесь к документации LUFA и к документации на классы устройств USB, см. Википедию, usb.org и т. п. ресурсы.

Номер конечной точки находится, вместе с флагами направления (конечная точка IN или OUT), в поле EndpointAddress, т. е. задается константами GENERIC_IN_EPNUM и GENERIC_OUT_EPNUM. Ищите в хедерах определение этих констант.

Описание констант GENERIC_IN_EPNUM и GENERIC_OUT_EPNUM (файл Descriptors.h):

/** Адрес конечной точки стандартного HID, сообщающий,
 что это конечная точка типа IN. */
#define GENERIC_IN_EPADDR (ENDPOINT_DIR_IN | 1)
 
/** Адрес конечной точки стандартного HID, сообщающий,
 что это конечная точка типа OUT. */
#define GENERIC_OUT_EPADDR (ENDPOINT_DIR_OUT | 2)

Пример кода описания дескрипторов конечных точек, номера конечных точек выделены жирным шрифтом (это фрагмент определения дескрипторов из файла Descriptors.c):

.HID_ReportINEndpoint =
{
   .Header            = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
   .EndpointAddress   = GENERIC_IN_EPADDR,
   .Attributes        = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
   .EndpointSize      = GENERIC_EPSIZE,
   .PollingIntervalMS = 0x05
        },
 
.HID_ReportOUTEndpoint =
{
   .Header            = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
   .EndpointAddress   = GENERIC_OUT_EPADDR,
   .Attributes        = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
   .EndpointSize      = GENERIC_EPSIZE,
   .PollingIntervalMS = 0x05
}

Can't load jvm.dll

jvm dll-not-found

Причина может быть в том, что при установке утилиты Flip Вы отдельно устанавливали рабочее окружение Java (JRE, Java Runtime Environment). Либо как вариант, JRE вообще не установлен. Исправить ошибку можно, если удалить текущую установку Java (JRE), удалить утилиту Flip, и заново установить утилиту Flip, выбрав дистистрибутив, включающий в себя пакет Java Runtime Environment (выбрать нужный вариант дистрибутива можно на сайте Atmel).

[Ссылки]

1. AVR-USB162: где найти рабочие примеры кода firmware и ПО хоста.
2. AVR328: стандартная (generic) реализация устройства USB HID.
3. AT90USB162 site:atmel.com - оригинальный даташит Atmel на микроконтроллер AT90USB162.
4. Макетная плата AVR-USB162.
5. bl_usb_162v105.zip - бинарный файл в формате HEX прошивки бутлоадера Atmel DFU Flip для микроконтроллера AT90USB162.
6. AVR: отладочный вывод через UART (RS232 debug).
7. USB DFU Bootloader Datasheet site:atmel.com.
8. AVR-USB162-atmel-examples.zip - примеры кода firmware USB HID и ПО хоста для него, упомянутые в даташите AVR328.

 

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


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

Top of Page