MrПоделкинЦ Blog
Мой блог официально переехал http://www.techn0man1ac.info
вторник, 9 декабря 2014 г.
Прошивка hex файлов при помощи Arduino и SinaProg
Данное видео дублирует представленную ниже информацию представленную в текстовом формате:
Привет. Меня уже давно спрашивают можно ли прошивать hex файлы при помощи Arduino, изменять фьюзы, считывать прошивку и всякое такое.
Ответ — да можно, я бы сказал даже нужно. Arduino это отличный старт для новичка но нужно расти дальше, мир микроконтроллеров прекрасен и дарит огромные возможности, но увы arduino это довольно таки узкопрофильное направление.
Одного прекрасного дня я наткнулся на отличный проект на ATtiny13, но увы автор выгрузил в сеть только hex файл и схему и конечно я так и не смог его поюзать. Меня этот вопрос мучал всё больше и больше и тут я случайно наткнулся на одно видео в сети, где автор при помощи ардуино прошил другой микроконтроллер имея только hex файл, ну и схему разумеется, именно он мне подсказал что мол юзаю SinaProg но с Arduino’вскими файлами.
Загуглив на тему SinaProg я скачал SinaProg 2.1.1.RUS но он работать отказывался с ардуино, потому я закинул парочку тройку файлов из Arduino IDE в папку SinaProg 2.1.1\data\ и всё заработало.
Итак пройдёмся коротко по софту, вот скрин:
А той части где кнопка «>» мы можем видеть всякие сообщения, типа OK, прошилось, или ERROR, сама же кнопка «>»открывает лог.
В блоке Flash есть кнопки:
Program — программирование hex-файла( возможно когда выбран Hex-file);
Read — считать hex-файл.
С блоком EEPROM всё аналогично.
Далее блок Device, тут можно выбрать нужный микроконтроллер, вот весь список поддерживаемых( не обращайте внимания цифры и буквы после названий микроконтроллеров, список выдрал из файла Device.txt который лежит в папке SinaProg 2.1.1\data\):
- AT90CAN128
- AT90CAN32
- AT90CAN64
- AT90PWM2
- AT90PWM2B
- AT90PWM3
- AT90PWM3B
- AT90USB1286
- AT90USB1287
- AT90USB162
- AT90USB646
- AT90USB647
- AT90USB82
- AT90s1200
- AT90s2313
- AT90s2323
- AT90s2333
- AT90s2343
- AT90s4414
- AT90s4433
- AT90s4434
- AT90s8515
- AT90s8535
- ATmega103
- ATmega128
- ATmega1280
- ATmega1281
- ATmega1284P
- ATmega128RFA1
- ATmega16
- ATmega161
- ATmega162
- ATmega163
- ATmega164P
- ATmega168
- ATmega169
- ATmega2560
- ATmega2561
- ATmega32
- ATmega324P
- ATmega325
- ATmega3250
- ATmega328P
- ATmega329
- ATmega3290
- ATmega3290P
- ATmega329P
- ATmega48
- ATmega64
- ATmega640
- ATmega644
- ATmega644P
- ATmega645
- ATmega6450
- ATmega649
- ATmega6490
- ATmega8
- ATmega8515
- ATmega8535
- ATmega88
- ATtiny11
- ATtiny12
- ATtiny13
- ATtiny15
- ATtiny22 2343
- ATtiny2313
- ATtiny24
- ATtiny25
- ATtiny26
- ATtiny261
- ATtiny44
- ATtiny45
- ATtiny461
- ATtiny84
- ATtiny85
- ATtiny861
- ATtiny88
- ATxmega64A1
- ATxmega128A1
- ATxmega128A1D
- ATxmega192A1
- ATxmega256A1
- ATxmega64A3
- ATxmega128A3
- ATxmega192A3
- ATxmega256A3
- ATxmega256A3B
- ATxmega16A4
- ATxmega32A4
- ATxmega64A4
- ATxmega128A4
Есть кнопка Program — записать предустановки, смотри на абзац выше.
А так же Advanced. лихая кнопка, после её нажатия можно увидеть вот такое окно:
Информационная часть, всё как выше.
Чуть ниже идут фьюзы, если не понимаешь тут ничего то не советую что-то изменять, а если уж зачешется то не забывай их сначала считать кнопкой Read, к стати записать фьюзы можно кнопкой Write, ну ты понял, кнопка Chip Erase стирает микроконтроллер, как ты форматируешь флешку к примеру, но фьюзы не устанавливает в стандартные, так что не забывай об этом.
Пару слов о фьюзах, фьюзы это такие как бы тонкие подстройки микроконтроллера, то частоту поднять то убавить, то вкл/выкл nактивирование от внутренней RC цепочки то ещё что-то, вообщем туда лезть только в крайнем случае иначе можно залочить(нашаманить так что перестанет работать) микроконтроллер, и без Atmega fusebit doctor уже никак, решай сам.
На ещё в прибавок калькулятор фьюзов http://homes-smart.ru/fusecalc/ но если залочишь микроконтроллер я не виноват, если что-то не ясно пиши на русскоязычный форум ардуино, ссылка будет в конце статьи.
Далее ещё какой-то информационный блок, не вникал особо, ну и кнопка выход, но я думаю ты уже об этом догадался даже если не знаешь английский.
Продублирую третий раз главный скрин, чтобы тебе не крутить постоянно страницу вверх вниз:
Итак, последний блок — Programmer, тут выбирается тип программатора, если юзаешь Arduino в качестве программатора то ставь всё как у меня на скрине, только не COM19, эт у меня такой, у тебя будет другой, в любом случае точно не COM1, первый это системный, на ноуте может не быть а на компах как правило есть, особенно тех что постарше. Можешь юзать и другой программатор, к примеру USBASP, только выбери его в списке и больше ничего не изменяй. Полный список поддерживаемых программаторов:
- Gromov
- USBtiny
- ALF
- Arduino
- AT ISP
- AVR109
- AVR910
- AVR911
- AVRISP
- AVRISP 2
- AVRISP mkII
- AVRISP v2
- Bascom
- Blaster
- BSD
- Butterfly
- C2N232I
- DAPA
- DASA
- DASA 3
- Dragon_DW
- Dragon_HVSP
- Dragon_ISP
- Dragon_JTAG
- Dragon_PP
- DT006
- ERE-ISP-AVR
- Frank-STK200
- Futurlec
- JTAG 1
- JTAG 1Slow
- JTAG 2Slow
- JTAG 2
- JTAG 2Fast
- JTAG 2ISP
- JTAG 2dW
- JTAG mkI
- JTAG mkII
- MIB510
- pAVR
- Picoweb
- Pony-STK200
- ponyser
- SI Prog
- SP12
- STK200
- STK500
- STK500 HVSP
- STK500 PP
- STK500 v1
- STK500 v2
- STK600
- STK600 HVSP
- STK600 PP
- USBasp
- Xil
Есть твой? USBasp радует глаз.
Чтобы можно было шить/читать/изменять фьюзы/убить микроконтроллер при помощи Arduino предварительно нужно зашить в ардуинку ArduinoISP подключив всё как я говорил на видео, писал тут и тут.
Тааак что там ещё, у меня было такое что тиня13-я перестала шиться и реагировать на попытки её программирования после того как я попробовал запустить её на частоте 128 kHz, откопал где-то вот такой, слегка модифицированный код http://pastebin.com/Aw5BD0zy ArduinoISP который заставляет прошивку/изменение фьюзов происходить медленнее в несколько раз и может ещё какая-то магия, не разбирался, честно.
Ладно, не буду больше томить, вот ссылка на прогу:
Ссылка на ветку на русскоязычном форуме ардуино:
Калькулятор фьюзов, почётное упоминание:
Маленько изменён скетч ArduinoISP иногда может помочь при ЧП, а иногда нет:
Как зашить загрузчик Arduino в ATmega8/ATmega8A:
Как прошивать и кодить ATtiny13/ATtiny13A при помощи Arduino:
Ну что, вроде как всё, как говорил один известный персонаж из шедеврального советского мультика «Ты. это, заходи, если что» (с) Жил был пёс, заходи ко мне в группу или паблик, как кому нравиться, кароче вот страничка ВКонтакте:
Sinaprog
Вот уже много лет я пользуюсь мощнейшей программой для прошивки — avrdude. Программа эта поддерживает почти все виды программаторов, а те что не поддерживает изначально легко в нее добавляются.
Но есть у ней особенность которая сильно отпугивает многих — она консольная. И все шаманства с ней заключаются в формировании командной строки.
С одной стороны это хорошо — консольная утилита позволяет очень сильно ускорить и автоматизировать процесс прошивки. Один раз написал батничек и для перешивки только вызывать его и все.
Остается проблема прошивки разных устройств, ведь под каждую придется делать свой батник. И ладно бы ключи прописать, да файл с прошивкой указать. Самая засада начинается с fuse битами (впрочем, как и везде в мире AVR ;) ) Тут их надо вначале внимательно проштудировать в даташите, выписать в виде байтов, вписать правильно в командную строку и молиться на то, чтобы нигде не ошибиться.
Да, для avrdude написано много оболочек, но все что мне встречались раньше решали лишь малозначительную проблему выбора нужного ключа файла и/или программатора, а фузы также было надо указывать числом.
Проблема решилась с появлением новой версии оболочки SinaProg от команды программистов-террористов из Аль-каиды иранских AVR программеров.
Содержание
Фреймворк необходимый для работы
Запускаем… Если не запустилась, то возможно потребуется установить фреймворк от NI — LabView RunTime Library
Интерфейс
Морда выглядит простенько и со вкусом. Ничего лишнего. Выбираем в первой строке хекс файла и зашиваем его в нужную память — flash или eeprom.
Следом идет прогресс бар и кнопка открытия консольного лога — ошибки смотреть.
Ниже выбираем тип микроконтроллера, также есть кнопочка поиска — полезно для проверки работы программатора.
Преднастройки FUSE, работа с FUSE
Отдельно стоит сказать про секцию Fuses.
Осторожней с выпадающим списком. С виду там все просто, но это на самом деле предустановки, описываются они файле Fuse.txt вот его дефолтное содержание:
Видишь, формат очень прост. Строка контроллера (обязательно с точкой!) и в квадратных скобаках возможные варианты (отделенные табуляцией) с байтами тех самых фузов. Обратите внимание, что тут меняется СРАЗУ ОБА БАЙТА Fuse битов. Т.е. касаются далеко не только тактовой частоты. А еще всего остального что конфигурируется в FUSE. Так что я бы сразу переназвал их иначе. Скажем как
All Default,but 1MHZ
All Default,but 2MHZ
All Default,but 4MHZ
Чтобы было понятней. Но это как бы быстрые шаблоны и не претендуют на глобальность. Лучше сразу нажать Advanced и узреть … тот самый цифровой ввод.
Но не стоит напрягаться, достаточно нажать кнопочку «С» (видимо авторы имели ввиду Calculator) и увидеть удобнейшие выпадающие списки с человеческим описанием. Прям как в STK500.
Конфигурирование SinaProg
Впрочем, все же главным достоинством этой оболочки является ее легкая заточка под любой программатор поддерживаемый через AVRDUDE.
Покажу на примере программатора встроенного в Pinboard (На базе FTDI, но распиновка выводов немного отличная от FTBB описанного ранее).
Закрываем программу, чтобы не мешалась и не держала файлы.
Прописывание конфигурации FTBB в файле avrdude.conf я описывать не буду, подробней я об этом уже писал ранее.
Считаем, что это уже сделано и в файле конфигов avrdude у нас есть нужная секция. Я назвал ее pinb, впрочем, название может быть и произвольным.
Прописывание программатора
Первым делом открываем файл Programmer.txt и видим там список:
и еще полторы страницы все известных и не очень типов программаторов. Вписываем там первой строкой наш pinb
Все, теперь он в списке, но ему еще надо сопоставить порт.
Прописывание нужных портов
Поэтому открывай файл Port.txt
Вот его дефолтное содержимое:
Как видишь, формат тут сходный. Название программатора (с точкой в конце!), а в скобках варианты. Причем первым делом пишем произвольное название порта, а потом то в каком виде он должен подставиться в командную строку avrdude. Между ними табуляция.
Порт FTDI bitbang в консоли называется ft# и номер от нуля до бесконечности. В зависимости от того сколько чипов FTDI навешано на твой компьютер в данный момент. Причем учитываются именно подключенные, активные, чипы. И не стоит путать этот номер с номером виртуального COM порта который этот чип организует. Так что если у тебя в системе всего один адаптер USB-COM на базе FTDI, то какой бы там COM порт ни был, для bitbang программатора он зовется ft0 и никак иначе. На всякий случай добавляем несколько вариантов.
Добавляем туда нашу секцию
RoboCraft
Заметка-отчет о проверке работоспособности «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:
В принципе структура этого файла интуитивно понятна, но хочется обратить внимание что COM23 заглавными это название порта, а сам «адрес» указывается через табуляцию строчными.
Ок! Пробуем снова ииии вторые грабли:
Получаю ошибку Can’t open port и ответ
Так, как это! Порт доступен, другие приложения открывают, а ты не можешь! И вспоминаю об сообщениях о разных версиях avrdude и о странностях в их работе. Ну ладно, копирую avrdude.exe из arduino-1.0.1\hardware\tools\avr\bin\ в каталог с SinaProg, заменяя тот что был внутри, пробую прочесть и снова ошибка, но уже другая:
Что-то в структуре в конфига avrdude. Далее я пытался править, подменять, очищать avrdude.conf и ничего не получалось! Или порт не может быть открыт или не нравятся символы в конфиге…
НО проблему я все же решил, скопировав файлы avrdude.exe и avrdude.conf из папки bin\ свежей версии WinAvr (WinAVR-20100110). Подобрав рабочую связку «дудки» и его конфига, пробую читать очередной раз получаю грабли три:
И ошибку на светодиоде «Error»
На видео запечатлен процесс прошивки (точнее чтения) завершившийся не удачно.
Также на целевой макетной плате вы можете видеть ряд зеленых светящихся и красных не светящихся светодиодов. Эти диоды стоят на старшей тетраде (биты 4-7) порта A и при выводе «0» на соответствующем выводе загорается зеленый, а при «1» — красный. При высоком импедансе — светятся оба но тускло. И еще немного левее, желтый светодиод это «Сеть».
Возвращаясь к предмету заметки, пробуем понять что же все таки значит not in sync: в ошибке дудки. А значит это то, что мы по сути работаем через USART — асинхронный UART и у нас на лицо рассинхронизация. Тьфу ты! Подумал я и вспомнил про баудрейт (скорость передачи через порт) и выставил 19200 в комбобоксе скорости. И в итоге настроенная SinaProg стала выглядеть так:
На группу Fuses не обращайте внимание, это значение там было сразу же после первого запуска SinaProg и пока вы не нажмете Programm фьюзы не прошьются, так что просто игнорируем.
Жму Flash Read и смотрю на железо:
Урааа! Заработало! Теперь было бы не плохо прошить. Для этого в Atmel Studio 6 (бывшая AVRStudio) набросал такую программку
Мигаем всем портом. А если точнее, то выставляем пины порта A в «1» ждем 1с сбрасываем пины в «0» ждем 5с и повторяем снова.
Компилирую и загружаю полученный hex в целевой контроллер:
Вот, собственно, теперь я получи вполне себе удобный USB программатор для AVR’ок. Нужно будет купить комплект ATmega8/168/328 прошить фьюзы, бутлоадер и спрятать в пенале с прочей мелочью, на всякий случай как резервную копию 🙂
У меня всё, спасибо за внимание. Если что не точно/не понятно укажите в комментариях, исправлю/дополню.
С ув.