08.05.2009

Arduino-программатор

Как сделать из Arduino программатор?

Наверное, у многих подобная мысль связана с желанием найти как-нибудь время, чтобы реализовать, например, скетч с набором команд AVR-910. Расслабьтесь, все гораздо проще, если в вашем распоряжении Arduino Diecimila, Duemilanove или Mega. Подойдет и любой другой USB-аналог, если у него рядом с USB-чипом FT232RL есть посадочное место для 4-х контактного разьема X3:


Японец Mr.Suz Обратил внимание, что чипы FT245R/FT232R (последний является мостом USB-TTL и установлен на Arduino), имеют помимо всего прочего прямое управление выводами, или т.н. BitBang режим. Появилась идея добавить его в avrdude в качестве дополнительного программатора, и таким образом появился на свет avrdude-serjtag.

А другой японец - Kimio Kosaka - создал подробное руководство о том, как получить из Arduino простой программатор. Итак...

1. Добавим гребенку X3 (PLS4) на ваш Arduino

Как правило, посадочные дырочки залиты припоем, который придется удалить. Если под рукой не оказалось оловоотсоса, подойдет деревянная зубочистка или заостренная спичка.


Устанавливаем PLS4, аккуратно паяем.



2. Делаем кабель X3-ICSP

В минимальном варианте необходимо одно гнездо PLS4 и одно PBS6. Наглядная диаграмма соединений:


Я использовал то, что нашел под рукой (плоский кабель):


Как видите, ничего сложного. Вместо PLS/PLD можно использовать также обжимные гнезда BLS4 и BLD6, получается более симпатично, да и паять не надо.

3. Скачиваем и конфигурируем serjtag

Архив оригинальной программы для Windows можно скачать у меня или у автора, затем распаковать. Также скачайте avrdude.conf, в него добавлены чипы ATmega328P и ATmega88, а плюс новый программатор "diecimila". Перепишите его поверх avrdude-serjtag\binary\avrdude.conf.

4. Меняем родной МК на свежий

Отключите Arduino от USB и источника питания, аккуратно извлеките родной МК из панельки (тут спешить не надо, потихоньку - поддевать тонкой отверткой то с одного края, то с другого):


Установите новый МК на место старого, подключите кабель, изготовленный на шаге 2, и только после этого подключите USB и запитайте Arduino.

5. Зашиваем свежий МК

Зашивание состоит из трех основных этапов: фьюз-биты, микропрограмма (он же бутлоадер), лок-биты. Разберем последовательность на примере ATmega8-16PU:

5.1 Фьюз-биты

Если ATmega только-только с завода, то он будет использовать свой внутренний RC-резонатор, откалиброванный на частоту 1МГц. Поэтому, чтобы не шить бутлоадер на черепашьей скорости, сначала зашьем правильные фьюзы - "внешний кварц > 8МГц". Вот так будет выглядеть командная строка:

avrdude -c diecimila -P ft0 -p m8 -B 4800 -U hfuse:w:0xca:m -U lfuse:w:0xdf:m

Назначение ключей:

-с diecimila

Выбор типа программатора из конфигурации. "diecimila" будет соответствовать такой секции в avrdude.conf:



programmer
id = "diecimila";
desc = "FT232R Synchronous BitBang";
type = ft245r;
miso = 3; # CTS X3(1)
sck = 5; # DSR X3(2)
mosi = 6; # DCD X3(3)
reset = 7; # RI X3(4)
;


-P ft0

выбор порта операционной системы - в данном случае имя устройства USB

-p m8

тип микроконтроллера, соответствует ATmega8

-B 4800

скорость передачи данных, специально понижена до 4800

-U hfuse:w:0xca:m

команда программирования: записать в HIGH fuse байт со значением 0xca

5.2 Микропрограмма

Зашиваем микропрограмму на нормальной скорости:

avrdude -c diecimila -P ft0 -p m8 -U flash:w:ATmegaBOOT.hex

5.3 Lock-биты

Защищаем bootloader от записи со стороны микропрограммы (sketch-а). Мало ли чего может произойти по причине ее ошибочного поведения ;)

avrdude -c diecimila -P ft0 -p m8 -U lock:w:0x0f:m

Чтобы прошить остальные типы процессоров, используйте параметры из файла arduino-00XX\hardware\boards.txt:



diecimila.bootloader.low_fuses=0xff
diecimila.bootloader.high_fuses=0xdd
diecimila.bootloader.extended_fuses=0x00
diecimila.bootloader.path=atmega
diecimila.bootloader.file=ATmegaBOOT_168_diecimila.hex
diecimila.bootloader.unlock_bits=0x3F
diecimila.bootloader.lock_bits=0x0F

atmega328.bootloader.low_fuses=0xFF
atmega328.bootloader.high_fuses=0xDA
atmega328.bootloader.extended_fuses=0x05
atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex
atmega328.bootloader.unlock_bits=0x3F
atmega328.bootloader.lock_bits=0x0F


Надо только не забыть несколько моментов:
  • взять нужный файл прошивки из hardware\bootloaders;
  • выставить значение ключа -p в соответствующее МК: Atmega168 - m168 или ATmega328P - m328p;
  • прошить расширенные фьюз-биты - добавить еще один параметр -U efuse:w:0xNN:m, где NN - 00 для ATmega168 и 05 для ATmega328

6. Проверка

Отключаем кабель программирования, рисуем тестовый скетч (например помигать digital13) и убеждаемся, что все нормально заливается и запускается на МК.

Усовершенствования

Первым делом, спешу заметить, что простая модификация кабеля дает возможность программировать уже не только то, что находится в панельке PDIP-28 Arduino, но вообще любую схему методом ICSP:


Добавляется шестиконтактная вилка, с которой берется питание (два провода). Она теперь подключается к ICSP Arduino, а колодка, которая подключалась туда раньше, становится выходом нашего программатора:


К ней можно подключать и питать от +5В схему, у которой есть шестиконтактный ICSP-разъем, например другой Arduino:


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

Итог: благодаря торжеству японской инженерной мысли, мы получили простейший программатор ICSP на USB. Вот так выглядит комплект, который понадобится для апгрейда:


6 комментариев:

  1. Спасибо за интересные публикации.
    У меня такой вопрос, можно ли подобный Arduino-программатор сделать на Seeeduino?

    ОтветитьУдалить
  2. Разумеется. Там все сигналы гребенки X3 присутствуют. И еще масса дополнительных возможностей, насколько мне известно.

    ОтветитьУдалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
  4. Если речь про программатор, в который превращается Arduino после напаивания вилки X3 - да, имея в руках такой девайс, можно программировать практически любой МК ATMEL. Если же речь только о программе avrdude-serjtag (или просто о последней avrdude, в которую этот патч вроде бы добавили), то ей для работы потребуется чип FTDI FT232RL с минимальной обвязкой и выведенными наружу сигналами CTS, DSR, RI и DCD.

    ОтветитьУдалить
  5. прикрепил схему
    http://gigapeta.com/dl/1224566ac80ef0

    ОтветитьУдалить
  6. О, так понятнее. А в чем проблема?

    Кстати, плодить бессмысленные комментарии к статье - не очень удачная идея, лучше пишите письма через профиль.

    ОтветитьУдалить