Давно точил зубы на программатор 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-а.  На схеме фиолетовым цветом показана доработка макетки AVR-USB-MEGA16, чтобы получился программатор AVR910. Кварц необходимо поменять на 12 МГц (на макетке установлен на 16 МГц. У меня в плане доработать исходники, чтобы можно было использовать все кварцы, которые на сегодняшний день поддерживает библиотека V-USB - 12, 15, 16, 16.5 и 20 МГц). На макетное поле установлено 2 ISP-коннектора (6 pin мама и 10 pin папа) для подключения программируемых устройств, а также установлены 2 светодиода - зеленый RD и синий PWR, перемычка LOW SCK и необходимые резисторы. Красный светодиод D1 (он уже был установлен на макетке) показывает режим записи программируемого устройства. Зеленый светодиод RD показывает режим чтения. Синий светодиод PWR показывает, что наличие питания на программаторе и показывает активность программатора (его включает и выключает процедура FlashTstLed, вызываемая из главного цикла main). Перемычка LOW SCK переключает скорость чтения и записи программируемого устройства. Когда перемычка снята, то скорость максимальная (используется аппаратный SPI), а когда установлена, то скорость искуственно снижается (при этом протокол SPI реализован программно). Более подробно про алгоритм работы перемычки LOW SCK и всего программатора можно почитать на сайте PROTTOSS (см. ссылки) - он остался без изменений.
На фото представлен внешний вид получившегося программатора. Цифрами в кружках показано назначение отдельных деталей на плате.  |  | 1 - разъем miniUSB J1, через который программатор подключается к компьютеру. 2 - ISP коннектор U1, который используется для записи firmware в макетку AVR-USB-MEGA16. Через него нужно записать в микроконтроллер U2 программу для работы программатора (двоичный файл Debug\Exe\avr910protoss.bin или avr910protoss.hex из архива проекта, см. ссылку 1). 3 - кварц U4, который надо поменять на 12 МГц (на макетке AVR-USB-MEGA16 установлен кварц на 16 МГц). 4 - разъем U3 JTAG, который может использоваться для программирования и отладки firmware (если Вы счастливый обладатель JTAGICE mkII). 5 - красный светодиод WR - когда программатор что-то пишет в программируемое устройство, светодиод мигает. 6 - зеленый светодиод RD - когда программатор что-то читает из программируемого устройства, светодиод мигает. 7 - коннектор для подключения внешнего напряжения питания 5 В - этот коннектор устанавливать необязательно. Я его припаял и использовал при отладке. Можно использовать для умощнения питания при программировании устройств, потребляющих более 70 ма. Внимание! Будьте осторожны с полярностью и напряжением (оно должно быть точно 5 В +/- 0.2 вольта) дополнительного источника питания - чтобы не спалить USB-порты и плату программатора. 8 - штырек, на который я отдельно вывел сигнал 1 МГц (нужен для приведения в чуство микроконтроллеров, у которых ошибочно зашиты фьюзы для использования внешнего кварца), который у PROTTOSS почему-то называется LED. Этот сигнал также выведен на 10-pin коннектор, и я его вывел на отдельный штырек для удобства. Устанавливать необязательно. 9 - перемычка LOW SCK. 10 - синий светодиод PWR. 11 - атавизм - перемычка, которую хотел использовать для сигнала RESET. Устанавливать не нужно. 12 - ISP коннектор 6 pin мама, предназначенный для программирования внешних устройств (рабочий коннектор программатора AVR910). 13 - ISP коннектор 10 pin папа, предназначенный для программирования внешних устройств (рабочий коннектор программатора AVR910). [Отличия описываемого здесь программатора от программатора PROTTOSS] 1. Я применил на всякий случай 2 ISP-коннектора - один 6-пиновый (мама), другой 10-пиновый (папа). Оба коннектора имеют ставшие стандартными цоколевки, которые широко используются. 2. Перемычка J1J2, которая использовалась у PROTTOSS для прошивки firmware в сам программатор, убрана из схемы за ненадобностью, так как макетка AVR-USB-MEGA16 имеет для целей программирования firmware AVR910 отдельный ISP-коннектор U1 (помимо JTAG-коннектора U3). 3. Схема программатора питается не от 3.3 вольт, а от 5 вольт, и на коннекторы ISP выведено напряжение питания 5 вольт, которое можно использовать для питания программируемой платы (если, конечно, она не потребляет ток больше 70 мА). Для подключения дополнительного источника питания можно использовать коннектор 7 (например, если программируемая плата потребляет ток больше 70 ма). 4. Предохранитель по питанию F1 на 0.1 А отсутствует. В нем нет особой нужды, поскольку в протоколе USB оговорено ограничение тока, потребляемое устройством по шине USB (100 мА по умолчанию, и 500 мА для устройств повышенной мощности), и все современные материнские платы и ноутбуки аппаратно поддерживают ограничение тока. 5. Светодиод "PWR" подключен не к шине питания, а к порту микроконтроллера, что позволяет его использовать также и для отладки. Больше принципиальных отличий нет. Если необходимо программировать микроконтроллеры не от 5 вольт, а от 3.3 вольт, то я советую Вам установить на макетку интегральный стабилизатор на 3.3 вольт (например, дешевый LM1117), и запитать все схему от него. Можно даже предусмотреть переключение напряжения питания перемычкой - либо 5 вольт (прямое питание от USB), либо 3.3 вольт (питание от выхода стабилизатора LM1117). Никаких изменений в схему программатора при этом вносить не нужно. Внимание! Fuses для ATmega16 (ATmega32) должны быть 0xBF (low) и 0x09 (high). Эти перемычки отличаются от тех, что я обычно зашиваю в ATmega16 (0xFF (low) и 0x09 (high)) только одним битом BODEN. Здесь в AVR910 бит BODEN записан, т. е. равен 0, что означает - разрешить Brown out detector. Разобраться с перемычками (какая для чего нужна, соответствие между битами перемычек и шестнадцатеричным значением байт перемычек) Вам поможет ресурс http://www.engbedded.com/fusecalc/. При первом подключении программатора 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 секунды. [Работа с программатором из AVRStudio] Тут тоже все просто. Выбираете в меню 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 приходится менять настройку порта программатора, а в программаторе AVRStudio приходится перезапускать программу (AVRprog от AVRStudio находит порт автоматически, если он в пределах COM1..COM4). К сожалению AVRStudio, в отличие от 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] Перемычки (фьюзы, fuses) у микроконтроллера ATmega16 и ATmega32 должны быть в состоянии 0x9F LOW BYTE, 0XC9 HIGH BYTE. [Ссылки] 1. Проект, описанный в статье, с исходниками - 091106AVR910-protoss.rar (для IAR EWB AVR 5.20), с документацией и драйвером для компьютера. Готовая скомпилированная прошивка для ATmega16 лежит в папке Debug\Exe архива (в форматах bin и hex). Только прошивку и драйвер (без исходников) можно скачать здесь - 091106AVR910-protoss-binaries.zip. Напоминаю, что байты перемычек (fuses) микроконтроллера должны быть 0xBF (low) и 0x09 (high). 2. AVR910 - pdf. 3. AVR910-совместимый программатор PROTTOSS. 4. Программаторы для AVR. 5. Библиотека V-USB компании Objective Development, её версия с русскими коментариями, пошаговое руководство, как начать использовать. 6. Описание макетной платы AVR-USB-MEGA16, как заказать и купить. 7. Программы для AVR. Там есть ссылка на закачку CodeVisioAVR, с которы работает программатор AVR910. Где скачать AVRStudio никому объяснять не надо - на сайте Atmel - http://www.atmel.com/dyn/Products/tools_card.asp?tool_id=2725. 8. AVR-USB-MEGA16: как сделать STK500-совместимый ISP и HVSP программатор (AVR-Doper). |
Комментарии
2012-03-2922:57:51 Собрал программатор по этой схеме, печатку развёл свою (проверил несколько раз, всё по схеме). Если стоит перемычка LOW-SCK, то программатор работает, если перемычку убираю - программатор не работает, в программе для программировани я без перемычки вылетает ошибка. Но в обоих случаях не горит светодиод PWR LED_TST.
microsin: мне эти симптомы почти ни о чем не говорят. Попробуйте работу программатора из разных программ-оболочек (avrdude, AVR Studio разных версий) - часто бывают различные несовместимости из-за недоработки firmware программатора. Эта версия программатора довольно старая, и исправить ошибку Вы сможете, только самостоятельно исправляя исходный код. Гораздо лучше работает более современная версия программатора - STK500 (AVR Doper).
2010-12-2022:14:00 А Вы не пробовали сделать на AVR-USB-MEGA16 STK-500 совместимый программатор? Я просто никак не могу решить проблему с драйверами на своей x64 W7. Не получается подписать драйвер, не запустить тестовый режим. А каждый раз перезагружаться и жать F8 - не очень комфортно.
microsin: я не пробовал портировать STK500 на макетку AVR-USB-MEGA16, но думаю с этим не должно возникнуть никаких проблем. Есть уже готовая разработка AVR-Doper http://www.obdev.at/products/vusb/avrdoper.html, как раз основанная на библиотеке V-USB, просто перекомпилируйт е проект на микроконтроллер ATmega16 (или ATmega32), на нужную частоту кварца, и проверьте установки перед этим настройки файла usbconfig.h (чтобы ножки D+ и D- были настроены на нужные порты). Мне пока некогда этим заниматься.
2010-11-1513:12:37 Я посмотрел вроде всё как в ATmega16, только напряжение питания разное и частота у 16А 16 МГц. Я новенький в контроллерах, поэтому может что-то и не понял (разницу). Буду очень благодарен если вы сами посмотрите даташит на 16А.
2010-11-1410:33:09 Добрый день. Я хотел узнать подойдёт ли вместо ATmega16 - ATmega16A? Смотрел - по сути это тот же ATmega16, только модернизированн ый.
microsin: я не пробовал, но думаю что подойдет. В последнее время чаще использую ATmega32 (он тоже подойдет, но нужно перекомпилирова ть проект). Обычно Atmel в новых ревизиях чипов исправляют баги чипов (баги и соответствующие им ревизии Atmel публикует в даташите на чип).
2010-06-2501:23:33 Не хватает ещё такой информации в описании. Во-первых: скорость порта надо выставить (в CodeVision в частности) 115200, а во-вторых, без подключения программируемог о устройтсва CodeVision упорно пишет "error entering programming mode" даже на команду чтения версии программатора.
microsin: благодарю за Ваш комментарий.
2010-04-2101:38:25 Был бы у меня осциллограф, я бы посмотрел какие сигналы выходят из ISP коннектора и их уровень, а его у меня нет. Замкнул все резисторы 330 ом - заработало нормально. Может мне их совсем убрать или поменьше поставить?
microsin: Вы по сути не разобрались с проблемой, а просто загнали её вглубь (на время!). У Вас что-то с той схемой, которую программируете, или с программатором - либо схема слишком нагружает сигналы, либо у Вас нет соответствия между напряжением питания программируемой схемы и уровнями сигналов программировани я. Что конкретно происходит, можно выяснить только с помощью осциллографа. Можете резисторы замкнуть и вообще делать все что угодно, только потом не удивляйтесь, если снова появятся глюки или, что еще хуже - попалите программатор или программируемую схему.
2010-04-2019:41:14 Всё очень внимательно проверил, прозвонил все соединения ISP - всё правильно. Может уменьшить сопротивления резисторов 330 ом?
microsin: то, что Вы прозвонили все соединения - недостаточно. Нужно осциллографом убедиться в наличии сигналов MOSI, MISO, SCK и в их качестве - нормальный ли у них уровень (как на плате программатора, так и на программируемой плате). А резисторы уменьшать не стоит - у них и так номинал такой, что в нормальном режиме протекающие через них токи не создают каких-нибудь ощутимых падений напряжения. Если сигналов где-то нет (или испорченные), то нужно искать причину их отсутствия (или порчи).
2010-04-2018:19:30 собрал данный программатор, при подключении к компьютеру виндовс видит его и определяет . драйвер тоже установил но при подключении устройства которое нужно запрограммирова ть , программировани е не происходит и вообще ни каких функций не выполняет. порт выбрал правильно, программа CodeVisionAVR подскажите пожалуйста в чём может быть неисправность?
mocrosin: скорее всего ISP-сигналы не доходят до программируемой платы.
2009-11-2018:55:26 а смысл делать на MEGA16 если можно сделать на MEGA8?
microsin: Эх, Сёма Ну нету в Вашей душе поэзии Неужели не поняли, в чем цимус всей затеи? Просто было интересно, получится или нет. Ну а если серьезно - хотелось придумать еще одно применение макетке AVR-USB-MEGA16 - теперь можно дешево и сердито (всего за 500 руб.) собрать собственный USB-программатор.
2009-11-0917:52:49 А стабилитроны 3,6 в обязательно ставить? Я пока их не поставил, ничего страшного не будет?
microsin: страшного ничего - в том смысле, что ничего не сгорит. Но схема в таком виде без стабилитронов работать не будет, или будет глючить (я пробовал). Дело в том, что по стандарту сигналы USB должны быть ограничены уровнем 3.6 вольта максимум. Без стабилитронов уровни будут доходить до 5 вольт, что ненормально. Как вариант, можно применить пониженное напряжение питания схемы программатора. См. варианты схем согласования сигналов USB в архиве по ссылке 5 (папка circuits внутри архива). Какую схему согласования выбрать - решайте сами (каждая имеет свои плюсы и минусы в плане удобства использования).