Преамбула

Давным-давно, в далекой-далекой... я начал работать с микроконтроллерами AVR и шил их при помощи самого простого программатора, который можно было вообще придумать: "пять проводков" (ссылка). При этом основным инструментом был PonyProg.


Времена сменились, все реже и реже в компьютерах стали появляться LPT разъемы, а в ноутбуках они были совсем редки. Тогда-то у меня и появилась необходимость изготовления USB-программатора. Чего я только не пробовал: самым запомнившимся был AVR910, с которым было так много мороки, а толку мало (или я так и не разобрался, как с ним работать, или сам по себе программатор ущербный, о чем периодически всплывают разговоры в интернетах). Так или иначе, я решился сделать свой собственный USB-программатор. Оказалось что дело совсем плевое. Сейчас мне уже кажется, что проект доведен до ума настолько, что им можно начать делится с людьми, показывать его и обсуждать его достоинства и недостатки.

Schematic

Схема программатора представлена ниже. Программатор собран на основе ATmega48 (не смотрите, что на схеме нарисован 8, микросхемы полностью заменяемы по ногам). В качестве преобразователя UART-USB используется микросхема FTDI FT232R. Также FT232 используется для генерации тактовой частоты микроконтроллера. Рабочая тактовая частота 12МГц. Для работы необходимо соответственно настроить эту микросхему. Более подробную информацию можно найти на сайте FTDI.



Небольшие пояснения по схеме:

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

CON3 - джампер для переключения Reset. Включенный в положение ResetR позволяет через выходной разъем программировать микроконтроллер программатора. В рабочем режиме должен быть включен в положение ResetP.

Светодиоды предназначены для индикации состояния работы программатора. D1 настраивается на передачу-прием данных FT232, D2 сигнализирует процесс записи, D3 - процесс чтения. Диоды D2 и D3 зажигаются с PC.

Firmware

Здесь я не буду подробно расписывать алгоритм работы микроконтроллера, желающий может разобрать исходник сам. (В исходнике отключен тактовый генератор, предназначенный для тактирования программируемого микроконтролера). Тактовая частота UART - 250кГц, тактовую частоту SPI не помню )).

Software

Для работы программатора написано приложение на Delphi. Его можно забрать отсюда. Само приложение состоит из 2-х файлов: самого исполняемого файла Programer.exe и инициализационного файла System.ini, в котором хранится база данных устройств. На момент написания сего опуса программатор поддерживал всего 6 микроконтроллеров, которые я вообще когда-либо использовал (сейчас ситуация могла и поменяться): ATmega48, ATmega88, ATmega168, ATmega64, ATmega16A, ATmega48P. Вы можете сами дополнить базу устройств. Для этого нужно увеличить параметр N_Devices на единицу в секции [Global], и добавить свою секцию [Device X], где X - порядковый номер устройства, в которой перечислить все необходимые параметры: сигнатуру (для автоопределения типа устройства), количество страниц памяти, размер страницы памяти, количество страниц памяти EEPROM, размер страницы памяти EEPROM, сдвиги адреса должны совпадать с размером страницы. Также необходимо прописать все фьюзы. Я думаю, что изучение приложенного ini-файла позволит вам легко разобраться с правилами описания новых устройств. Добавлю, что у меня самого добавление нового устройства занимает не более 5 минут.

Интерфейс

Интерфейс программы очень простой и представлен ниже.


Кнопка Browse позволяет открыть прошивку контроллера с расширением .hex или .bin.
Секция Flash предназначена для записи, чтения и проверки памяти микроконтроллера. По нажатию на кнопку Program происходит запись открытого файла прошивки, с последующей верификацией записи. Кнопка Verify производит проверку записи. А по нажатию на кнопку Read производится чтение памяти микроконтроллера и запись ее в файл в HEX или BIN.

Тоже самое касается и секции EEPROM, при этом аналогичные операции производятся для энергонезависимой памяти.
Справа отображается процесс работы программы.

При нажатии на кнопку Read в секции Fuses происходит считывание фьюз-битов и отображение их на экране. Экран редактирования фьюз-битов на примере ATmega48P представлен ниже.


Вот примерно и все особенности программы.

Работа с командной строкой

Программу программатора (:)) можно использовать не только как оконное приложение, но и для потоковой прошивки из командной строки. Это удобно при прошивке большого количества одинаковых устройств (можно в BAT файле прописать все установки: указать прошивку программы, прошивку eeprom, установки фьюзов). Я использую программатор и совместно с компилятором. Я использую IAR для AVR и в Post-build command line вызываю свою программу, чтобы тут же положить только что сгенерированную прошивку в микроконтроллер.

Для работы в коммандной строке используются слфедующие директивы:

/IF - начало условия, /ENDIF - конец условия, /FLASH - файл прошивки микроконтроллера, /EEPROM - файл прошивки энергонезависимой памяти, /FUSE - фьюзы устройства.

Например: Programer.exe /if ATmega48p /flash biasbox.hex /eeprom eeprom.bin /FUSE $E2FFFFD0 /endif

Важно: последовательно может идти несколько условий. После начало условия должен идти тип устройства. Программатор при включении получает сигнатуру программируемого контроллера и если она совпадает с сигнатурой устройства записанного после начала условия, то выбирается соответствующее строка. Если директивы /IF нет, то параметры выполняются в любом случае, независимо от типа устройства.

Важно: после директивы /FUSE идет строка с описанием битов. Они могут быть записаны и в десятичной записи и в шестнадцатиричной, в последнем случае перед началом должен стоять символ $. Биты расположены в следующей последовательности: Low Fuse byte (в нашем примере 0xE2), Extended Fuse byte (0xFF), Lock Fuse byte (0xFF), High Fuse byte (0xD0).

Напоследок укажу используемые мной настройки для IAR AVR. Post-build command line: Programer.exe $TARGET_PATH$