Заметка-отчет о проверке работоспособности «ArduinoISP» не имеющего на борту чипа FT232RL от FTDI. Я не открою ничего нового, лишь поделюсь своим личным опытом использования.
В качестве предисловия хочется сказать что с AVR8 знаком уже давно еще с техникума (в 2004 году AT90S8535 помните? :)), но при этом работал с ними не много, учеба в институте не позволяла уделять достаточное кол-во времени. Ну и естественно много того что знал благополучно забыл. Жизнь внесла свои коррективы и увела в web-разработку, разобравшись с принципами работы которого захотелось большего. И пару лет назад, пришла 3я волна увлечения МК и я собрал себе новую макетку на ATmega32 … и ведь западло, если раньше легко можно было шиться через LPT «пятью проводками», то теперь дома уже не нашлось такого интерфейса 🙁 зато завелся Arduino Uno, точнее кЫтайская поделка.
После покупки Uno первым делом стал прикидывать как же заставить его прошивать хотя-бы Arduino-совместивые камешки (ATmega8, ATmega168, ATmega328 …) и прочие АВРки ну не совать же в финальное устройство целый Arduino, расточительно однако! Да и не всегда же барахтаться в «Wiring» хочется вспомнить Си, а теперь еще и понять C++ на котором пишут и написаны библиотеки для Arduino.
Конечно я планирую взять себе адаптер на FT232RL и шиться по рецепту DI Halt’a, но позже. И тут счастье то какое! нахожу этот замечательный сайт (низкий поклон администрации и авторам за ваш Труд) и статью Делаем ISP-программатор из Arduino. И ураааа! Но позже фак … на Uno ведь вместо FT232RL стоит мега8U!
Немного позже, скачав arduino-1.0.1 нахожу скетч ArduinoISP, и собираю:
Комментировать схему нет смысла, т.к. она повторяет все что написано в комментарии к скетчу ArduinoISP. Но все же следует упамянуть что желтый светодиод это т.н. «Heartbeat» — который пульсируя, говорит что программатор готов к работе. А белый — это на самом деле два светодиода (красный и зеленый) в одном корпусе с общим катодом, которые сигнализируют «Error» и «Programming» об ошибке и процессе загрузки прошивки в целевой контроллер. Сверху справа, вы можете видеть мою самодельную макетку с ATmega32, ST232BN (аналог MAX232) и обвязкой. Несмотря на то, что на целевой макетке есть свой стабилизатор питания я запитал ее от Uno.
А вот теперь давайте попробуем настроить софт-программатора и собственно прошить/прочесть. Естественно, для прошивки будем использовать avrdude, но мне впадлу использовать консоль 🙂 «…хочется открывать окна мищькой…» и я по совету DI Halt’a решил использовать SinaProg. Итак скачал запустил в комбо Device выбрал целевой камень, в Programmer — AVRISP (потому что данный программатор работает по протоколу AVRISP MkI), выбираю пустой файл для сохранения прошивки, жму Flash -> Read и первые грабли:
Т.к. у меня виндоуз (Win 7 x64) стоит уже довольно долго, и при установке дров, Arduino стал аж на COM23, но в SinaProg в комбо боксе с выбором порта программатора максимум СOM9:
Лечится очень легко, добавлением соответствующего порта в файл Port.txt в папке с SinaProg:
Default. [COM1 com1 COM2 com2 COM3 com3 ... COM9 com9 COM23 com23 LPT1 lpt1 LPT2 lpt2 LPT3 lpt3] STK500 v2. [USB avrdoper] ....
В принципе структура этого файла интуитивно понятна, но хочется обратить внимание что COM23 заглавными это название порта, а сам «адрес» указывается через табуляцию строчными.
Ок! Пробуем снова ииии вторые грабли:
Получаю ошибку Can’t open port и ответ
avrdude -C avrdude.conf -c avrisp -P com23 -b 9600 -p m32 -U flash:r:"D:\Dropbox\AVR\dnl.hex":i -q avrdude: ser_open(): can't open device "com23":
Так, как это! Порт доступен, другие приложения открывают, а ты не можешь! И вспоминаю об сообщениях о разных версиях avrdude и о странностях в их работе. Ну ладно, копирую avrdude.exe из arduino-1.0.1\hardware\tools\avr\bin\ в каталог с SinaProg, заменяя тот что был внутри, пробую прочесть и снова ошибка, но уже другая:
avrdude -C avrdude.conf -c avrisp -P com23 -b 9600 -p m32 -U flash:r:"D:\Dropbox\AVR\dnl.hex":i -q error at avrdude.conf:364 unrecognized character: "s"
Что-то в структуре в конфига avrdude. Далее я пытался править, подменять, очищать avrdude.conf и ничего не получалось! Или порт не может быть открыт или не нравятся символы в конфиге…
НО проблему я все же решил, скопировав файлы avrdude.exe и avrdude.conf из папки bin\ свежей версии WinAvr (WinAVR-20100110). Подобрав рабочую связку «дудки» и его конфига, пробую читать очередной раз получаю грабли три:
avrdude -C avrdude.conf -c avrisp -P com23 -b 9600 -p m32 -U flash:r:"D:\Dropbox\AVR\dnl.hex":i -q avrdude: stk500_getsync(): not in sync: resp=0xff avrdude done. Thank you.
И ошибку на светодиоде «Error»
На видео запечатлен процесс прошивки (точнее чтения) завершившийся не удачно.
Также на целевой макетной плате вы можете видеть ряд зеленых светящихся и красных не светящихся светодиодов. Эти диоды стоят на старшей тетраде (биты 4-7) порта A и при выводе «0» на соответствующем выводе загорается зеленый, а при «1» — красный. При высоком импедансе — светятся оба но тускло. И еще немного левее, желтый светодиод это «Сеть».
Возвращаясь к предмету заметки, пробуем понять что же все таки значит not in sync: в ошибке дудки. А значит это то, что мы по сути работаем через USART — асинхронный UART и у нас на лицо рассинхронизация. Тьфу ты! Подумал я и вспомнил про баудрейт (скорость передачи через порт) и выставил 19200 в комбобоксе скорости. И в итоге настроенная SinaProg стала выглядеть так:
На группу Fuses не обращайте внимание, это значение там было сразу же после первого запуска SinaProg и пока вы не нажмете Programm фьюзы не прошьются, так что просто игнорируем.
Жму Flash Read и смотрю на железо:
Урааа! Заработало! Теперь было бы не плохо прошить. Для этого в Atmel Studio 6 (бывшая AVRStudio) набросал такую программку
/* * Arduino_ISP.cpp * * Created: 20.08.2012 12:44:57 * Author: TRAHOMOTO */ #define F_CPU 16000000L #include <avr/io.h> #include <util/delay.h> int main(void) { DDRA = 0xff; while(1) { PORTA = 0xff; _delay_ms(1000); PORTA = 0x00; _delay_ms(5000); } }
Мигаем всем портом. А если точнее, то выставляем пины порта A в «1» ждем 1с сбрасываем пины в «0» ждем 5с и повторяем снова.
Компилирую и загружаю полученный hex в целевой контроллер:
Вот, собственно, теперь я получи вполне себе удобный USB программатор для AVR’ок. Нужно будет купить комплект ATmega8/168/328 прошить фьюзы, бутлоадер и спрятать в пенале с прочей мелочью, на всякий случай как резервную копию 🙂
Для скачивания:
SinaProg с которой я работал в заметке
У меня всё, спасибо за внимание. Если что не точно/не понятно укажите в комментариях, исправлю/дополню.
С ув.
0 комментариев на «“Дополнение к статье «Делаем ISP-программатор из Arduino»”»
Вот еслиб ссылку поправить. Цены бы не было этим дополнениям к статье.
Если про ссылку на программу, то судя по скринам автор работал с той же версией SinaProg что ханится унас .
Здравствуйте Владимир!
К сожалению все файлы сейчас остались на сервере в ЛНР. И вся информация была удалена с них. Поэтому ссылки поправить не чем :(. Однако вы с легкостью можете повторить пути описанные в заметке и получить прошивалку.
С версией SinaProg 1.5.5.10 сразу всё заработало, без бубна.
Понадобилось перепрошить китайский USBISP.