Собираем USB-программатор для AVR из ATmega328P и FT232

1 февраля 2017

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

Покупать готовый программатор, например, USBASP, как-то не спортивно. Да и используемые в нем 10-и пиновые IDC-разъемы я нахожу не особо удобными. В Arduino используется 6 пинов, значит нужен переходник. На макетке в два ряда пины вставить не получится, значит нужен еще один переходник. Да и ждать готовый USBASP из Китая долго. Можно было бы спаять свой. Но покупать используемую в нем ATmega8 специально для программатора не хотелось. Использовать же прошивку USBASP на ATmega328P у меня, увы, не получилось. Не исключаю, что просто руки кривые.

Так или иначе, решил попробовать сделать свой программатор. Долгой историей его разработки утомлять вас не буду, приведу лишь краткую версию. Так, в частности, выглядел первый работающий прототип:

Прототип AVR-программатора

В нижней части вы видите сам программатор, в верхней — микроконтроллер, который он программирует. Приведенный программатор представляет собой обыкновенную Arduino Uno, собранную из SMD компонентов. В нее заливается уже знакомый нам скетч ArduinoISP, превращающий Arduino в программатор. Новым для нас здесь является только чип FT232. Ранее мы уже использовали готовые USB-UART преобразователи на его базе, но в собственной цепи FT232 мы еще не использовали.

Что к чему у этой микросхемы подключается подробнейшим образом описано в даташите [PDF]. Притом, понадобились не все пины, только 1 (TX), 4 (VCCIO, к плюсу), 5 (RX), 7 (GND), 15 (USB D+), 16 (USB D-), 18 (GND), 20 (VCC), 21 (GND), 25 (AGND, к земле), 26 (TEST, к земле). Вжух, и с микроконтроллером можно общаться по USB через виртуальный последовательный порт!

Рассыпуха, используемая мной в программаторе:

Окончательный вариант программатора, вид сверху:

AVR-программатор, вид сверху

Вид снизу:

AVR-программатор, вид снизу

То, что текст на обратной стороне слегка сполз — это косяк Резонита. Думаю, проект просто криво импортнулся из EAGLE в используемый ими какой-то другой софт, и этого никто не заметил.

Прошить микроконтроллер, используемый в программаторе, можно двумя вариантами.

Первый способ — сделать это до впаивания, через переходник из TQFP32 в DIP. Такой переходник вы можете заметить на фотографии прототипа. Он легко изготовляется при помощи ЛУТ или пленочного фоторезиста и довольно часто пригождается. Так что, если у вас данного переходника еще нет, самое время им обзавестись. Затем прошивка с (опционально) бутлоадером Arduino заливаются, как обычно.

Второй способ — использовать в качестве такого переходника саму плату программатора. Припаиваем на нее все компоненты, а также один дополнительный провод к reset-пину микроконтроллера. Теперь можно прошить микроконтроллер так же, как и в первом случае, поскольку доступ ко всем необходимым пинам есть через гребенку и провод к reset-пину.

Как вы, вероятно, уже знаете, существует утилита avrdude, предназначенная специально для общения с программатором. К сожалению, использовать ее напрямую не очень удобно. Поэтому в дополнение к программатору я также написал небольшую обвязку для avrdude на Python. На момент написания эти строк скрипт умел следующее:

$ avrisp
Usage: /home/eax/bin/avrisp <dump|upload|info|set-fuses> [fuses-name]
Possible [fuses-name] values: arduino, atmega328p-1mhz, atmega328p-8mhz

Другими словами, он умеет заливать и дампить прошивку, отображать информацию о микроконтроллере, в частности, текущие fuse bits, а также выставлять предопределенные fuse bits — дэфолты для Arduino, заводские дэфолты для ATmega328P, при которых используются внутренние часы на 8 МГц и стоит флаг Divide clock by 8, и те же fuse bits, только без названного флага. Подробнее о fuse bits вы можете прочитать в полном даташите по ATmega328P [PDF] на странице 348, в секции 31.2. Но будьте осторожны! Выставив не те fuse bits, можно перевести микроконтроллер в такое состояние, в котором вы потом не сможете до него достучаться обычными средствами.

Если в своих проектах вместо кварцевого резонатора вы решите использовать часы микроконтроллера, учтите, что для этого в ранее использованном нами файле arduino.mk понадобится закомментировать строку:

# BOARD_BUILD_FCPU := $(call readboardsparam,build.f_cpu)

… а в Makefile дописать частоту микроконтроллера, например:

# для фьюзов с именем atmega328p-1mhz
BOARD_BUILD_FCPU := 1000000

Все исходники к этой заметке, включающие в себя принципиальную схему и плату в форматах EAGLE, код скетча ArduinoISP, который я одолжил из Arduino IDE, а также скрипт avrisp.py, вы найдете в этом репозитории на GitHub. Как обычно, буду рад вашим дополнениям и вопросам!

Метки: , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.