AVR USB-Программатор
Здесь я приведу описание своего программатора для микороконтроллеров AVR. Собран он по этой схеме.
Программатор довольно таки простой, основой является микросхема преобразователь интерфейсов FT232RL. Описание работы схемы неоднократно приводились в Интернете. Данная схема просто направляет сигналы MOSI, MISO, SCK и RESET, которые формируются на выводах DCD, DTR, RTS и DSR микросхемы DD1 (FT232RL) соответственно, на нужные выводы прошиваемого микроконтроллера. Причем, делает это только в момент программирования микроконтроллера, в остальные моменты времени программатор отключен от прошиваемой платы за счет 4-х буферных элементов микросхемы DD2 (74HC125).
Состояние линий MOSI, MISO, SCK и RESET устанавливается/считывается прошивающим софтом на компьютере. Передача данных между компьютером и микросхемой FT232RL идет по шине USB (от которой питается и программатор). Светодиод HL4 («POWER») сигнализирует о подаче на программатор напряжения питания с шины USB. Светодиод HL3 («PROG») индицирует процесс прошивки микроконтроллера (горит только во время прошивки). Светодиоды HL1 («RX») и HL2 («TX») индицируют приём и передачу данных по UART. Также на плате установлена кнопка сброса для FT232RL, на всякий случай, чтобы не переподключать программатор. Схема и фото программатора приведена ниже.
Схема программатора
Фото программатора


Для прошивки используется консольная программа AVRdude (если прикрутить SinaProg, то можно работать с оконным приложением, но меня и так устраивает). Для прошивки нам потребуется командная строка такого вида:
avrdude.exe -p m16 -F -c apu_2 -P ft0 -U flash:w:Test.hex:a
-p
тип контроллера. m16 означает что у нас мега16
-c
тип программатора. В avrdude.conf он описан как apu_2
-P
порт на котором сидит программатор. В данном случае подключена только одна микросхема FT232RL, так что ft0 (если воткнуто несколько таких конвертеров то этот параметр может быть ft1, ft2 и так далее). Определить номер программатора можно простым перебором.
-U
указываем что что то пишем. Формат следующий memtype:r|w|v:filename[:format]. Вначале указываем куда (flash, eeprom или fuse), потом что делаем читаем, пишем, проверяем, затем путь к прошивке. Прошивка у меня лежит в той же папке что и avrdude.exe, поэтому и путь только лишь имя файла. Если же прошивка лежит где то далеко, то полный путь можно указать в кавычках, например, так: «c:\FTBB\m16boot.hex». А последняя «а» означает, что тип файла с прошивкой определить автоматом.
-F
игнорирование сигнатуры. Для avrdude ATmeg16 и ATmega16A имеют разные сигнатуры (если в avrdude.conf не определены отдельные сигнатуры для каждого МК). Однако надо быть осторожным, поскольку использование этого ключа может привести к тому, что вы, например, запишете прошивку для ATtiny2313 в ATmega16.
Однако при попытке в первый раз прошить контроллер, программа выдаст ошибку. Это связано с тем, что изначально (при изготовлении) МК настроен на тактовую частоту 1 МГц, а программа пытается прошить МК на максимальной скорости. Для этого используется ключ снижения скорости -B
. Тогда AVRdude начнёт прошивать МК и мы получим следующую картину

Однако уменьшение скорости приведёт к увеличению времени прошивки МК. Поэтому сначала проще изменить фьюзы МК. Для этого используется следующая строка:
avrdude.exe -p m16 -F -B 4800 -c apu_2 -P ft0 -U hfuse:w:217:m -U lfuse:w:239:m
Данная строка используется для изменения фьюзов ATmega16 (для которой написаны все мои примеры на этом сайте) на внешнее тактирование (на плате установлен кварц на 8 МГц). Тут старший, младший и биты защиты задаются просто числом. Если перевести его в двоичное, то получим конкретные биты. Не очень удобный способ, зато ошибиться с нотацией сложней. Скорость нужно устанавливать маленькую, т.к. они все равно прошиваются мгновенно на любой скорости.
А вообще для исключения ошибок желательно сделать bat-файл и использовать его для прошивки. Ниже привожу пример своего bat-файла
::avrdude.exe -p m16 -F -c apu_2 -P ft0 -U flash:w:Test.hex:a
avrdude.exe -p m16 -F -B 4800 -c apu_2 -P ft0 -U hfuse:w:217:m -U lfuse:w:239:m
Два двоеточия в первой строке означают, что данная строка закомментирована. Сделано это для того, чтобы не прошивать фьюзы каждый раз. Один раз разкомментировали, прошили и закомментировали, чтобы случайно не попортить фьюзы. После прошивки необходимо проверить лог AVRdude, чтобы убедиться в правильной прошивке МК. Обратите внимание на следующие строки, если всё так, значит всё нормально.

В приложенном архиве лежат схема, чертеж печатной платы, avrdude со всеми файлами и bat-файл для ATmega16. Драйвера для микросхемы FT-232 вы найдете здесь. Официальный сайт программы AVRdude download.savannah.gnu.org/releases/avrdude/
Дополнительная информация, доделано, переделано
При работе с микроконтроллерами одним из первых встает вопрос наличия программатора для загрузки программа в микроконтроллер. Большинство программаторов либо имеют в составе микроконтроллер, который тоже надо чем-то прошить, либо требуют компьютера наличия COM или LPT интерфейсов на компьютере. Также многие простые в сборке программаторы работают только со старыми операционными системами (WinXP или Win2K).
Здесь я приведу описание программатора используемого мной для микороконтроллеров Atmel AVR. Собран он по этой статье. Программатор довольно-таки простой, имеет интерфейс USB, для его сборки нет необходимости в предварительной прошивке управляющего контроллера, также не требуется наличие COM и LPT интерфейсов.
Основой программатора является микросхема преобразователь интерфейсов USB-UART FT232RL. В интернете можно найти много реализаций программаторов на данной микросхеме, например, здесь.
Программатор просто направляет сигналы MOSI, MISO, SCK и RESET, которые формируются на выводах DCD, DTR, RTS и DSR микросхемы DD1 (FT232RL) соответственно, на нужные выводы прошиваемого микроконтроллера. Причем, делает он это только в момент программирования микроконтроллера, в остальные моменты времени программатор отключен от прошиваемой платы за счет 4-х буферных элементов микросхемы DD2 (74HC125). Состояние линий MOSI, MISO, SCK и RESET устанавливается/считывается прошивающим софтом на компьютере. Передача данных между компьютером и микросхемой FT232RL идет по шине USB (от которой питается и программатор).
На плате программатора установлено 4 светодиода. Светодиод HL4 («POWER») сигнализирует о подаче на программатор напряжения питания с шины USB. Светодиод HL3 («PROG») индицирует процесс прошивки микроконтроллера (горит только во время прошивки). Светодиоды HL1 («RX») и HL2 («TX») индицируют приём и передачу данных по UART. Также на плате установлена кнопка сброса для FT232, на всякий случай, чтобы не переподключать программатор. Схема и фото программатора приведена ниже.
Схема программатора
Фото программатора
Прошивка микроконтроллеров
Для прошивки микроконтроллеров я использую консольную программу AVRdude (если прикрутить SinaProg, то можно работать с оконным приложением). Загрузка hex-файла осуществляется командой вида:
avrdude.exe -p m16 -F -c apu_2 -P ft0 -U flash:w:Test.hex:a
Используются следующие ключи:
- -p тип контроллера. m16 означает что у нас мега16, а вообще мнемонику модели микроконтроллера можно подсмотреть в файле avrdude.conf
- -c тип программатора. В avrdude.conf он описан как apu_2
- -P порт на котором сидит программатор. В данном случае подключена только одна микросхема FT232RL, так что ft0 (если подключено несколько устройств на базе FT232RL, то этот параметр может быть ft1, ft2 и так далее). Определить номер программатора можно путем перебора.
- -U указываем что что то пишем. Формат следующий memtype:r|w|v:filename[:format]. Вначале указываем куда (flash, eeprom или fuse), потом что делаем читаем, пишем, проверяем, затем путь к прошивке. Прошивка у меня лежит в той же папке что и avrdude.exe, поэтому и путь только лишь имя файла. Если же прошивка лежит где то далеко, то полный путь можно указать в кавычках, например, так: «C:\AVR\Test.hex». А последняя «а» означает, что тип файла с прошивкой определить автоматом.
- -F игнорирование сигнатуры. Для avrdude ATmeg16 и ATmega16A имеют разные сигнатуры (если в avrdude.conf не определены отдельные сигнатуры для каждого МК). Однако надо быть осторожным, поскольку использование этого ключа может привести к тому, что вы, например, запишете прошивку для ATtiny2313 в ATmega16.
При попытке в первый раз прошить контроллер, программа выдаст ошибку. Это связано с тем, что изначально (от производителя) МК настроен на тактовую частоту 1 МГц, а программа пытается прошить МК на максимальной скорости. Для этого используется ключ снижения скорости -B. Тогда AVRdude начнёт прошивать МК и мы получим следующую картину
Уменьшение скорости приведёт к увеличению времени прошивки МК. Поэтому сначала проще изменить фьюзы МК. Для этого используется следующая строка:
avrdude.exe -p m16 -F -B 4800 -c apu_2 -P ft0 -U hfuse:w:201:m -U lfuse:w:239:m
Данная строка используется только для изменения фьюзов ATmega16 (для которой написаны все мои примеры на этом сайте) на внешнее тактирование, JTAG при этом отключен. Старший и младший байты фьюзов задаются просто числом. Если перевести его в двоичный вид, то получим конкретные биты. Не очень удобный способ представления, зато ошибиться с нотацией сложней. Скорость нужно устанавливать маленькую, так как они все равно прошиваются мгновенно на любой скорости. Ниже приведен список вариантов для разной конфигурации фьюзов для ATmega16 и ATmega32:
:: Внутренний генератор, частота 1 МГц, JTAG отключен
avrdude.exe -p m16 -F -B 4800 -c apu_2 -P ft0 -U hfuse:w:217:m -U lfuse:w:225:m
:: Внутренний генератор, частота 2 МГц, JTAG отключен
avrdude.exe -p m16 -F -B 4800 -c apu_2 -P ft0 -U hfuse:w:217:m -U lfuse:w:226:m
:: Внутренний генератор, частота 4 МГц, JTAG отключен
avrdude.exe -p m16 -F -B 4800 -c apu_2 -P ft0 -U hfuse:w:217:m -U lfuse:w:227:m
:: Внутренний генератор, частота 8 МГц, JTAG отключен
avrdude.exe -p m16 -F -B 4800 -c apu_2 -P ft0 -U hfuse:w:217:m -U lfuse:w:228:m
:: Внешний кварц, частота от 1 МГц, JTAG отключен
avrdude.exe -p m16 -F -B 4800 -c apu_2 -P ft0 -U hfuse:w:201:m -U lfuse:w:239:m
ВНИМАНИЕ. Для остальных МК необходимо свериться с документацией!!! Далее необходимо загрузить уже саму прошивку в МК. Делается это следующей строкой:
avrdude.exe -p m16 -F -c apu_2 -P ft0 -U flash:w:Test.hex:a
А вообще для упрощения работы и минимизации ошибок желательно написать один раз bat-файл и использовать его для прошивки. Ниже привожу пример используемого мной файла
::avrdude.exe -p m16 -F -B 4800 -c apu_2 -P ft0 -U hfuse:w:201:m -U lfuse:w:228:m
avrdude.exe -p m16 -F -c apu_2 -P ft0 -U flash:w:Test.hex:a
Pause=null
Два двоеточия в первой строке означают, что данная строка закомментирована. Сделано это для того, чтобы не прошивать фьюзы каждый раз. Один раз раскомментировали, прошили и закомментировали, чтобы случайно не попортить фьюзы. Во второй строке указывается путь к hex-файлу. Третья строка необходима, чтобы окно после прошивки не закрывалось сразу, так как нужно проверить лог avrdude, чтобы убедиться в правильной прошивке МК. Обратите внимание на следующие строки, если всё так, значит всё нормально.
avrdude.exe: verifying ...
avrdude.exe: 244 bytes of flash verified
avrdude.exe: safemode: Fuses OK
RESET ... OK
avrdude.exe done. Thank you.
В приложенном архиве лежат avrdude c командным файлом для ATmega16, SinaProg, схема и чертеж печатной платы программатора в Diptrace. Программа готова к использованию, никакие конфиги править не нужно. Данным программатором я пользуюсь уже несколько лет, работает шустро и стабильно. До этого использовал программатор, собранный по этой статье. Однако из-за необходимости нажатия кнопок перед и после прошивки собрал приведенный здесь вариант.
Драйвера для микросхемы FT-232 вы найдете здесь. Официальный сайт программы AVRdude расположен здесь. Следует заметить, что новые версии avrdude (с 6-ой версии) собраны без поддержки pthread и libusb, что ограничивает нас в использовании программаторов на ftdi под Windows. С версией из приложенного архива все работает.