AVR-USB-MEGA16: как сделать AVR910-совместимый программатор (STK200) |
![]() |
Добавил(а) microsin | |||||
Давно точил зубы на программатор AVR910, поскольку он довольно популярный, и поддерживается многими программами. Я знаю как минимум 3 программы, работающие с ним - avrdude, AVR Studio, CodeVision AVR. Этот программатор давно разработала сама компания Atmel (кажется аж в 2000 году), и полностью опубликовала всю документацию по нему, включая схему, код firmware программатора и протокол работы. Именно по этой причине AVR910 стал стандартом де-факто и до сих пор популярен. Изначально программатор AVR910 был рассчитан на подключение к компьютеру через последовательный COM-порт, и это со временем стало его серьезным недостатком - COM-порты трудно найти в современных компьютерах. Поэтому стали появляться клоны AVR910 (см. Ссылки), которые можно было подключить через USB. Эти AVR910-программаторы использовали для подключения к USB удачную микросхему FT232 (преобразователь USB <-> COM-порт), либо библиотеку V-USB компании Objective Development. На основе библиотеки V-USB делалось firmware, поддерживающее CDC-класс, к которому не нужен драйвер - нужен только информационный inf-файл. Этот класс организует в компьютере виртуальный COM-порт, через который и ведется обмен данными с AVR910. Мне попались в руки исходники программатора PROTTOSS на чипе ATmega8 (выражаю большую признательность автору). Этот программатор основан на старой версии библиотеки V-USB (см. ссылки). Я портировал его код на чип ATmega16, что позволило без особого труда сделать из макетной платы AVR-USB-MEGA16 программатор, совместимый AVR910 и подключаемый по USB. Схема программатора видна на рисунке (красным цветом показаны дополнительные детали и соединения, которые надо установить на макетное поле платы). В результате получается программатор, полностью аналогичный функционально программатору PROTTOSS-а.
На фото представлен внешний вид получившегося программатора. Цифрами в кружках показано назначение отдельных деталей на плате.
1 - разъем miniUSB J1, через который программатор подключается к компьютеру. 1. Я применил на всякий случай 2 ISP-коннектора - один 6-выводный (мама), другой 10-выводный (папа). Оба коннектора имеют ставшие стандартными цоколевки, которые широко используются. Больше принципиальных отличий нет. Если необходимо программировать микроконтроллеры не от 5 вольт, а от 3.3 вольт, то я советую Вам установить на макетную плату интегральный стабилизатор на 3.3 вольт (например, дешевый LM1117), и запитать все схему от него. Можно даже предусмотреть переключение напряжения питания перемычкой - либо 5 вольт (прямое питание от USB), либо 3.3 вольт (питание от выхода стабилизатора LM1117). Никаких изменений в схему программатора при этом вносить не нужно. При первом подключении программатора Windows XP запросит драйвер - скормите ей inf-файл AVR910.Driver\2k_xp_32\avr910.usb.2000.xp.inf (находится в архиве пакета с документацией и исходниками, см. ссылки). [Проблемы прошивки, которые нужно исправить] 1. Программа работает только с кварцем на 12 МГц, хотя библиотека V-USB позволяет также использовать кварцы на 15, 16, 16.5 и 20 МГц. 2. Программа не работает с программатором avrdude. По словам автора, причина в некорректной обработке команд LED_ON и LED_OFF протокола - avrdude посылает команду LED_XX и не посылает состояние светодиодов, а firmware программатора эту ситуацию некорректно обрабатывает. Если кто-нибудь из читателей поправит код и решит эти проблемы, буду очень рад. [Работа программатором через консольную программу avrdude] Программатор avrdude доступен в исходниках и скомпилированном виде для систем Windows и *nix, его легко скачать в Интернет. Эта программа несомненно порадует Линуксоидов, поскольку с помощью неё можно работать с программатором AVR910 из *nix-систем. Но, к сожалению, у меня программатор AVR910 работал с avrdude некорректно - то, что записывалось в чип ATmega16, не проходило верификацию. Кроме того, работает avrdude на запись чипов с описываемым в статье программатором очень медленно - например, микроконтроллер ATmega16 записывается бинарным файлом из 5862 байт 727 секунд (12 минут). Чтение происходит быстро - за 18 секунд. Наверное, это связано с некорректной работой avrdude с AVR910 от PROTTOSS. Пример комплексной операции - стирание чипа ATmega16, записи в него файла avr910protoss.hex (формат Intel Hex) и сверки содержимого flash с файлом avr910protoss.hex: avrdude.exe -p m16 -c avr910 -P com4 -U flash:w:"C:\asm\AVR910-protoss\Debug\Exe\avr910protoss.hex":i -U flash:v:"C:\asm\AVR910-protoss\Debug\Exe\avr910protoss.hex":i -e -F Пример записи перемычек 0xBF (low) и 0x09 (high): avrdude.exe -p m16 -c avr910 -P com4 -U lfuse:w:0xBF:m -U hfuse:w:0x09:m -F Пример чтения flash в файл progmemory.hex: avrdude.exe -p m16 -c avr910 -P com4 -U flash:r:"C:\asm\AVR910-protoss\Debug\Exe\progmemory.hex":i -F [Работа с программатором из CodeVision] В среде CodeVisionAVR работать с программатором AVR910 довольно просто (я экспериментировал с версией CodeVisionAVR 2.04.4a Advanced). Сначала настраиваете тип программатора - выбираете в меню Settings -> Programmer, выбираете тип программатора Atmel AVRProg (AVR910) и порт Communication Port. Тут надо указать тот COM-порт, который появляется в системе при подсоединении программатора к компьютеру (можно посмотреть через Диспетчер Устройств). Скорость выбираете 115200. Микроконтроллер ATmega16 записывается бинарным файлом из 5862 байт примерно за 42 секунды, проверка записи занимала 23 секунды.
[Работа с программатором из AVR Studio] Тут тоже все просто. Выбираете в меню Tools -> AVR Prog..., и программа автоматически находит программатор AVR910 (порт указывать не нужно). Выбираете файл для программирования (в формате Intel HEX), выбираете тип программируемого чипа и жмете кнопку Program. Есть также кнопка Advanced..., которая позволяет стереть чип и настроить его перемычки. Микроконтроллер ATmega16 записывается бинарным файлом из 5862 байт примерно за 15 секунд (вместе с проверкой!). Отдельно проверка занимает примерно 3 секунды. Это наилучший результат! Такая высокая скорость, по словам PROTTOSS, получается за счет того, что программа от Atmel использует команды блочного обмена данными. [Проблемы, которые у меня были с программатором AVR910 (PROTTOSS)] 1. Известная проблема несовместимости с avrdude. 2. "AVRProg error entering programming mode". Симптомы такие - светодиоды при попытке программировать/прочитать чип моргают (т. е. программатор система видит, и обмен данными с программатором есть). Проблема была в том, что не контачил сигнал SCK в коннекторе ISP (он не доходил до программируемого чипа). 3. При перетыкании программатора из одного порта USB в другой меняется номер COM-порта, привязанного к программатору. Например, в одном порте он может быть COM3, а в другом COM4. В программаторе CodeVision AVR приходится менять настройку порта программатора, а в программаторе AVR Studio приходится перезапускать программу (AVRprog от AVR Studio находит порт автоматически, если он в пределах COM1..COM4). К сожалению AVR Studio, в отличие от CodeVision, не видит порты COM5..COM8 (при перетыкании они вполне могут привязаться к программатору). В принципе, это не проблема, а так - фича. Такое поведение легко поправить, если в файле usbconfig.h ввести макроопределение USB_CFG_SERIAL_NUMBER_LENGTH не равное нулю, и usbCfgSerialNumberStringDescriptor со строкой серийного номера. Я попробовал - работает, COM-порт получается всегда один и тот же при включении в разные порты USB. Внимание - если Вы задали серийный номер устройства в usbconfig.h, то в компьютере нельзя одновременно использовать несколько программаторов с одинаковыми серийными номерами (хотя, собственно, зачем это надо?). Вот так выглядят в реестре настройки программатора с назначенным серийным номером AVR910-AVR-USB-MEGA16. Теперь номер COM-порта при перетыкании по портам USB остается неизменным (COM3). Старые ненужные настройки виртуальных USB COM-портов можно удалить. После удаления их настроек при подключении устройства Windows снова запросит драйвер. Удалять надо подпапки внутри папки HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_16c0&Pid_05e1. Обычно эти подпапки именуются загадочно типа 5&160f4e1&0&2 - это и есть серийный номер, который назначается Windows автоматически, если в устройстве серийный номер не задан. Если же серийный номер задан, то подпапка будет иметь имя, совпадающее с серийным номером (например, подпапка AVR910-AVR-USB-MEGA16). Чтобы удалить подпапку, нужно поставить разрешения (Permissions) на её удаление. Это делается просто. В редакторе реестра (в Windows XP это regedit.exe, в W2K это regedt32) кликните правой кнопкой на подпапке с именем, совпадающим с серийным номером, и выберите в контекстном меню "Permissions...". В открывшемся окне для пользователя Everyone (Все по-русски) поставьте галочку на Full Control (полный доступ), нажмите OK. Теперь подпапка даст себя удалить. Номер назначенного виртуального USB COM-порта программатора можно поменять вручную через Диспетчер Устройств. Это делается просто. Запускаете диспетчер устройств, идете в раздел "Ports (COM & LPT)". Находите там порт, соответствующий Вашему программатору. Например, это "Communications Port (COM15)". Мы хотим поменять COM15 на что-то более удобное, например COM3 (этот номер порта физически должен быть свободен, то есть сейчас в Диспетчере Устройств он должен отсутствовать или быть запрещен). Для этого кликните правой кнопкой на "Communications Port (COM15)", выберите Свойства (Properties). На закладке Port Settings нажмите кнопку "Advanced...", в выпадающем списке "COM Port Number:" выберите COM3. В этом списке может быть написано, что этот порт используется "COM3 (in use)", но не обращайте на это внимания - Windows просто читает данные из реестра, где может быть указано, что такой порт когда-то использовался. После смены номера COM-порта в выпадающем списке жмем OK, еще раз OK. Если теперь обновить список оборудования в Диспетчере Устройств (меню Action -> Scan for hardware changes), то порт программатора теперь поменяется с COM15 на COM3. 4. При подключенном по USB программаторе не получается перетыкать программируемые платки в коннекторе ISP, если эти платки питаются через этот коннектор. Из-за броска напряжения по питанию программатор перестает функционировать, и приходится перетыкать интерфейс USB. Побороть эту беду можно несколькими способами - отключить у чипа ATmega16 Brown-Out детектор напряжения питания (соответствующими фьюзами), поставить фильтр по питанию коннектора ISP, запитать программируемую плату отдельно, либо подать дополнительное мощное питание +5 вольт на программатор (или применить все эти меры в комплексе). [Настроечные биты микроконтроллера] Для обеспечения работы микроконтроллера важно правильно выбрать значение его внутренних настроек (фьюзы, fuses). Самое главное, что необходимо обеспечить - правильную работу тактового генератора, за его работу отвечают фьюзы SUT1, SUT0 (start-up time, время запуска) и CKSEL3..0 (выбор источника для тактирования). По умолчанию выбран внутренний тактовый генератор 1 МГц, что не подойдет, так как для библиотеки V-USB надо обеспечить работу кварцевого резонатора. Вполне работоспособны следующие настройки для этих бит: SUT1SUT0 = 11, CKSEL3..0 = 1111 (высокочастотный резонатор, время запуска 16 тыс. тактов CK + 64 мс) SUT1SUT0 = 01, CKSEL3..0 = 1111 (высокочастотный резонатор, время запуска 16 тыс. тактов CK) Остальные фьюзы не так важны, их можно оставить в значениях по умолчанию. Они выбирают включение/выключение различного функционала микроконтроллера (например, разрешение отладки, разрешение работы JTAG, разрешение программирования через SPI, разрешение работы узла детектора пропадания напряжения питания и т. д.). Советую обратить особое внимание только на фьюзы JTAGEN и SPIEN, так как от них зависит работоспособность программирования кристалла. Для проверки правильности установки фьюзов используйте даташит на микроконтроллер, а также замечательный сайт, посвященный выбору фьюзов для микроконтроллеров AVR - Engbedded Atmel AVR® Fuse Calculator site:engbedded.com (строка для поиска Google). В заключение приведу несколько примеров рабочих настроек фьюзов для различных микроконтроллеров. 0xBF LOW BYTE, 0x09 HIGH BYTE Основное отличие этих двух вариантов в том, что у первого разрешена отладка и JTAG, а у второго запрещены. 0xBF LOW BYTE, 0x09 HIGH BYTE Основное отличие этих двух вариантов в том, что у первого разрешена отладка и JTAG, а у второго запрещены. Обратите внимание, что здесь рекомендуемые значения фьзов совпадают с предыдущей врезкой для микроконтроллера ATmega16. Ничего удивительного, набор фьюзов у микроконтроллеров ATmega16, ATmega32, ATmega32A одинаковый. Если Вы используете загрузчик (к примеру USBasp для ATmega32 или BootloadHID для ATmega16) обратите внимание на фьюзы, которые управляют размером секции загрузки: BOOTSZ1 и BOOTSZ0. [Ссылки] 1. Проект, описанный в статье, с исходниками - 091106AVR910-protoss.rar (для IAR EWB AVR 5.20), с документацией и драйвером для компьютера. Готовая скомпилированная прошивка для ATmega16 лежит в папке Debug\Exe архива (в форматах bin и hex). Только прошивку и драйвер (без исходников) можно скачать здесь - 091106AVR910-protoss-binaries.zip. |