Arduino — In System Programmer (ISP).
Скетч-программатор.
Тема, на мой взгляд, интересная и позволяет мотивировать покупку нескольких Ардуино ;-) Жаль что обобщенной информации по ней не много. Есть разные заметки, в том числе на официальном сайте и форуме. Попытка обобщить их предпринята мной. И представлено это будет в основном в виде комментариев к линкам на оригинальные статьи (знакомство с которыми в любом случае имхо не лишнее) .
http://arduino.cc/en/Tutorial/ArduinoISP — Использование Arduino как программатора AVR ISP (Using an Arduino as an AVR ISP) — далее мой вольный перевод этой статьи ( желтой подсветкой ), курсивом мои дополнения .
»
Это руководство рассказывает как использовать ардуину в качестве программатора AVR ISP (in-system programmer). Что дает возможность прошивки загрузчика (bootloader) в контроллер AVR (например ATmega168 or ATmega328 для дальнейшего их использования как Ардуино). Код прошивки ардуины, используемой в качестве программатора базируется на исходниках от Randall Bohn.
Замечание: На текущий момент невозможно использовать Arduino Uno в качестве программатора ISP потому что прошитый в ее контроллер загрузчик (optiboot bootloader) не поддерживает скетч, превращающий ардуину в программатор. Но это пока . работы в направлении фикса ведутся .
Для использования Ардуино-платы для прошивки загрузчика (bootloader) в чистый AVR контроллер нужно выполнить следующие шаги.
- Загрузить в рабочую ардуину скетч (идет в комплекте с Arduino IDE), превращающий ее в программатор. Называется он «ArduinoISP» и находится в корне раздела «Examples».
- Подключить «Ардуино-программатор» к целевому контроллеру по схемам приведенным ниже (со схемами можно ознакомиться в оригинальной статье по ссылке выше). Правда, к сожалению, наглядными и понятными их не назовешь и «кто-кому-чего дает» там с первого, да и со второго взгляда не совсем ясно. Идея тех рисунков в общем такая: нижняя по картинке ардуина выполняет роль программатора, верхняя — роль «панельки» для чистого (прошиваемого) контроллера (и не более). Также не понятно почему бы не использовать для подключения разъем ISP на плате ардуины — да электрически разницы никакой (на него выведены часть ног с торцов платы) — но с точки зрения организационной так вроде как правильнее ;-) К подключению вернемся еще чуть позже .
- Выберите через меню Tools > Board модель платы, в которой будет работать прошиваемый контроллер — т.е. фактически тип зашиваемого загрузчика (т.е. выбрать нужно не тип ардуины, используемой в качестве программатора!). См. описание плат Ардуино (так рекомендовано в оригинале).
- Выберите Burn Bootloader > Arduino as ISP command.
Чуть подробнее о подключении контроллера к «Ардуино-программатору».
Разъем ISP на плате ардуины имеет следующую распиновку (рисунок слева).
Контакты MOSI, MISO и SCK вы ведены на пины «DIGITAL» 11,12 и 13 соответственно. Контакт RESET прикручен к соответствующей ноге контроллера на плате ардуины, поэтому чтобы его «подергать» с платы «Ардуино-программатора» используется «цифровой пин» 10 на плате программатора (согласно скетчу ArduinoISP). Также скетчем предусмотрена установка информирующих светодиодов (не является обязательной) на ноги 7, 8 и 9 (Programming, Error и HeartBeat).
Еще раз о распиновке классического кабеля ISP от целевого MCU -> «Arduino ISP»:
1 -> 12 (MISO)
2 -> VCC
3 -> 13 (MOSI)
4 -> 11 (SCK)
5 -> 10 (RESET)
6 -> GND
Номера контактов кабеля (слева) к целевому MCU соответствуют номерам ног разъема ISP ардуины.
http://www.arduino.cc/playground/Code/Programmer2 — Описание и скетч, превращающий ардуину в программатор AVR совместимый с stk500v1 (скетч старинный, но вроде как с него началась идея Ардуино-программатора). Для работы с avrdude используется команда вида: avrdude -v -cstk500v1 -PCOMxx -b19200 . — причем указание скорости связи является обязательным и ключевым моментом!
http://arduino.cc/playground/Code/MegaISP — До сих пор развивающийся скетч Ардуино-программатора от Randall Bohn.
Пока немного и сумбурно . со временем откорректирую и дополню .
MiGeRA (январь 2012)
«ArduinoISP-Turbo» – патч скетча ISP-программатора из Arduino UNO.
В очередной раз проводя оптимизации и ревизию материалов на сайте, перечитав эту статью подумал, что совсем не использую описанное выше – программаторов и так тьма разнообразных … Но решил еще раз проверить описанное. К удивлению пришлось немного повозиться. Но все же все заработало, и причем даже лучше чем ожидалось ;-)) Об этом и пойдет речь далее – 8 лет спустя после написания первой части.
RoboCraft
Думаю, ни для кого не секрет, что первоначально программу в микроконтроллер заливают при помощи специального устройства — программатора. Конечно, ардуинщикам обычно не нужно об этом беспокоиться — у них есть bootloader (загрузчик), заранее прошитый в микроконтроллер, и прошивку он забирает по UART через COM-порт или через USB. Но чтобы прошить этот загрузчик или другую прошивку в «чистый» МК, нужен программатор.
Но в этой статье мы не будем рассматривать сборку и пайку программатора с нуля, а воспользуемся возможностями Arduino. Дело в том, что на большинстве плат Arduino до версии Uno есть микросхема FT232RL компании FTDI.
Эта микросхема представляет собой конвертор UART->USB, предоставляя операционной системе виртуальный COM-порт, работающий через USB. Но в данном случае нам нужна другая её возможность — управление отдельными выводам микросхемы, именуемое режимом bit-bang, которое позволяет «завернуть» произвольный протокол в USB. Задача состоит в том, завернуть в USB протокол прошивки МК.
Микроконтроллеры AVR, используемые в Arduino, прошиваются по уже знакомому нам протоколу SPI через разъём для внутрисхемного программирования — ISP (In-System Programming). Он так называется потому, что позволяет прошивать МК прямо в конечном устройстве. Вот как выглядит этот разъём на плате CraftDuino:
MISO, MOSI, SCK, RESET — это всё линии шины SPI, только вместо SS — RESET.
Но нам ещё нужен доступ выводам FT232RL, через которые будет осуществляться прошивка, и разработчики Arduino позаботились об этом, сделав разъём X3 (икс-три):
Если на вашей плате только контактные площадки для X3, нужно будет припаять кусок PLS-гребёнки самим.
Пины этого разъёма имеют следующее назначение для ISP-программатора:
- 1 (CTS) — MISO
- 2 (DSR) — SCK
- 3 (DCD) — MOSI
- 4 (RI) — RESET
А у CraftDuino вместо X3 есть стандартный разъём RS232, тоже соединённый с FT232RL, из которого нам нужны те же 4 вывода:
- 1 (CD) — MOSI
- 6 (DSR) — SCK
- 8 (CTS) — MISO
- 9 (RI) — RESET
Пораскинув мозгами, сделаем кабель для нашего импровизированного ISP-программатора:
С одного конца кабеля — разъёмы для Arduino X3/CraftDuino UART, и для питания:
А с другого конца — стандартный разъём ISP:
Обычно для прошивки AVR используется популярная утилита avrdude, которая поддерживает множество различных программаторов и моделей МК, её использует даже среда Arduino IDE для заливки скетча. Для этой утилиты есть патч, позволяющий прошивать МК через микросхему FT232RL, используя режим bit-bang. Нашлись добрые люди, которые уже пропатчили Windows-версию avrdude для работы с bit-bang-программатором на базе этой микросхемы, а я сделал то же и для Linux:
- Патченая версия 5.3.1 для Windows.
- Версия 5.10, deb-пакет для Linux i386 и amd64 (x86_64).
- Архив с исходными кодами версии 5.10, библиотекой libftd2xx-1.0.4 с официального сайта FTDI и правлеными Makefile.in и avrdude.conf, чтобы всё это собиралось, корректно устанавливалось и работало. Проверял только на Ubuntu 11.04 (i386 и amd64).
Собственно, deb-пакеты собраны из выложенного тут патченого дистрибутива, но для параноиков есть другой вариант — пропатчить и собрать avrdude самолично, про это читайте тут. Только в avrdude.conf нужно добавить следующие строчки, а не то, что написано в статье по ссылке:
Если вы работаете в Linux, придётся сделать ещё несколько действий (FTDI нас любит):
- Убить драйвер ftdi_sio, который мешает avrdude открыть COM-порт FTDI:
Если хотите, можете занести этот модуль ядра в чёрный список, внеся в /etc/modprobe.d/blacklist.conf строчку:
Только имейте ввиду, что для работы с виртуальным портом /dev/ttyUSB0 и т.п. (нужно Arduino IDE) этот модуль должен быть запущен. Это можно делать командой
По умолчанию, система при попытке avrdude открыть виртуальный COM-порт FTDI покажет ему кукиш, а он вам — не слишком информативное сообщение об ошибке. Нужно дать себе права на полный доступ к виртуальным COM-портам, создав в /etc/udev/rules.d/ файлик с именем 80-ftdi.rules следующего содержания:
USB Vendor ID и Product ID можно для верности уточнить командой lsusb, если Arduino подключена к компу:
Потом нужно создать группу ftdi-user и добавить себя в неё:
после чего нужно перелогиниться.
Ну и, чтобы служба udev узнала про изменения, нужно либо перезагрузить комп, либо вызвать
В статье про программирование AVR на C товарищ noonv уже описал, как пользоваться avrdude, а я опишу лишь заливку загрузчика на Arduino Diecimila с ATmega168:
- Устанавливаем необходимые для быстрой прошивки загрузчика fuse-биты: кварц > 8 МГц, встроенный делитель на 8 выключен:
- Заливаем загрузчик:
Но консоль не всегда лучше гуя, особенно для задания fuse-битов, и есть гораздо более удобный и надёжный способ — воспользоваться программой SinaProg, разработанной иранскими программистами. Их сайт давно сдох, зато программа живёт и здравствует и по сей день. О её настройке подробно написано у Di Halt’а, ну а мы не будем терять времени и возьмём готовую настроенную сборку с пропатченным avrdude (в сборке Di Halt’а ошибка в одном из конфигов). Версии под Linux, увы, не существует.
В секции Hex file выбирается hex-файл, который нужно залить или считать. Записывать и считывать можно как память программ (Flash), так и энергонезависимую (EEPROM). В секции Device нужно указать конкретный МК, в секции Programmer — программатор (у нас это ftbb), порт (FTDI0) и скорость порта (9600).
Ну и то, ради чего стоит пользоваться этой программой — секция Fuses. В раскрывающемся списке можно выбрать предопределённые конфигурации fuse-битов, которые задаются в Fuse.txt. Но самое главное открывается нашему взору по нажатию кнопки Advanced:
Здесь можно набивать fuse-байты вручную, а можно нажимать на кнопки «C» рядом со значением байтов и выставлять фьюзы тыканием галочек с описаниями. Для заливки загрузчика сначала нажмём кнопку Read, чтобы считать текущие значения fuse, а затем настроим Low fuse: частота кварца — более 8 МГц, время старта МК — 65 мс, делитель на 8 выключен:
После настройки жмём кнопку Write и ждём появления надписи «Writing Fuses… OK».
Теперь можно в главном окне в секции Hex file выбирать файл загрузчика ATmegaBOOT_168_diecimila.hex и в секции Flash жать кнопку Program. Если в процессе будут возникать ошибки, то над индикатором прогресса есть кнопка «>», открывающая сбоку в окне лог работы avrdude.
А давайте-ка прошьём какой-нибудь другой МК — например, ATtiny13.
Поставим МК на макетку, подсоединим к ней все линии разъёма ISP от нашего bit-bang-программатора, прицепим светодиод через резистор на 500 Ом к 3-й ножке (DB4) и подтянем RESET к питанию резистором на 10 кОм:
Пишем в любимом текстовом редакторе простой код простой мигалки светодиодом в файл blink.c:
Делаем hex-файл прошивки:
Перевтыкаем Arduino в USB и наблюдаем мигание светодиода при условии, что нет ошибок подключения (:
Вот так, путём нехитрых манипуляций руками и мозгами, можно сделать себе USB ISP-программатор, так что не нужно париться с отсутствием LPT на современных компах и COM-порта почти на любом ноутбуке — уж USB-то есть везде.
Использование Arduino UNO в качестве программатора
80р, а ставить для этого Arduino ценой в
1000р. мне жаба не дает) + несколько резисторов, кнопок и 7-ми сегментный индикатор. Но остановился перед проблемой — в отличии от Arduino здесь нужен программатор. Поскольку я не сильно увлекаюсь МК, то программаторов у меня как-то не водится. Arduino теоретически можно использовать в этом качестве, но реально я этого никогда не делал.
В интернетах на эту тему есть много статей. Но, на текущий момент, они способны запутать неподготовленного человека. Проблема в следующем — на предыдущих версиях Arduino (Duemilanove, Diecimila) стоял чип FT232RL, который является преобразователем USB -> UART. На Uno этот чип убрали, заменив на Atmega8U2(МК запрограммированный на преобразование USB -> Serial). Соответственно большинство инструкций нам не подходят. Я уже думал что эта идея неосуществима, но неожиданно встретил подходящий вариант. С ним я вас и ознакомлю. Приступим:
1. Открываем Arduino IDE( у меня это v1.0) и заливаем на нашу Arduino Uno sketch называющийся ArduinoISP (File -> Examples -> Arduino ISP). Прошу обратить внимание на первые строчки файла — там содержится важная подсказка как подключать наш программатор к МК:
Собственно, после этого этапа мы уже имеем программатор типа avrisp, но нужно еще подключить к нему наш МК.
2. Смотрим в datasheet к нужному МК(у меня это ATTiny2313A) и ищем pinout. На следующей картинке я отметил интересующие нас ноги.
3. Теперь пришел самый интересный этап — подключаем наш программатор к МК. Собственно схема подключения не представляет из себя ничего сложного, но есть одна хитрость — нужно подключить конденсатор в 10мкФ(uF) между выходами RESET и GND у Arduino. Причем выход «-» (отмечен белой полосой) должен быть подключен к GND. Данный трюк предотвратит перезагрузку Arduino при заливке прошивки в МК.
Соединяем ноги МК и пины Arduino в соответствии с функционалом из pinout и sketch (Pin10 с ногой PA2, Pin11 с ногой PB5 и тд). Помним что VCC это питание, а в нашем случае — +5V. Для индикации я выбрал следующие светодиоды:
9: Heartbeat — Зеленый. Показывает что программатор работает. В процессе простоя постоянно мигает.
8: Error — Красный. Теоретически загорается при ошибках, но еще ни разу не видел.
7: Programming — Синий. Мигает аналогично Arduino’вским RX/TX при заливке прошивки в МК.
Повесил их через резисторы 220 Ом.
Собранная схема будет выглядеть примерно вот так:
4. Подготавливаем прошивку для нашего МК. Для тестирования я решил использовать обычное мигание светодиодом:
Компилируем в hex (выдрал команды из какого-то Makefile от WinAVR):
И заливаем на MK:
Хочу обратить внимание на ограничение скорости заливки в 19200. Без этого параметра я долго пытался что-то залить, но avrdude мне упорно возвращал ошибки типа «programmer is not responding» или «not in sync».
После этого можно подключить светодиод к ноге PB0 МК(через резистор конечно) и посмотреть как он мигает.