Каталог расширений

Популярные теги

3gp       avi       fb2       jpg       mp3       pdf      

Как загрузить hex файл в ардуино


104-Прошивка любого Hex-файла в Arduino при помощи штатного загрузчика (Bootloader). — GetChip.net

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

Нас, прежде всего, интересуют три платы Arduino:
Arduino Uno – как самый распространенный вариант
Arduino Nano – компактный вариант, удобный для применения в небольших конструкциях
Arduino Pro Mini – дешевый компактный вариант без встроенного USB-UART преобразователя (для работы с ним понадобится внешний USB-UART преобразователь), но удобный в случае применения сети устройств.

Во всех вышеописанных платах используется микроконтроллер ATmega328 (в более старых версиях ATmega168).

Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet.pdf (Одна Загрузка)

Одной из главных причин выбора платы Arduino для проекта робота была возможность записывать прошивку устройства в МК не применяя программатора и каких либо дополнительных устройств. Все что нужно для прошивки микроконтроллера Arduino – это стандартный USB шнур (который входит в комплект Arduino).

Это значит, если Вы имеете Ардуину – Вы имеете любое устройство ZiChip!

Запись программы в МК через USB происходит через специальный загрузчик (Bootloader), который записан в МК при изготовлении платы. Вообще, загрузчик предназначен для работы со своим специальным программным обеспечением Arduino IDE, но в случае, когда необходимо прошить в Ардуину что-то постороннее (свой Hex-файл), есть программки позволяющее это реализовать.

Начнем, конечно, с моей программы загрузчика
GC-Uploader

gcUploader.zip (13226 Загрузок)

Программа интересна тем, что выбранный HEX-файл будет заливаться в Ардуину автоматически после каждого его изменения. Это удобно, так как при разработке проекта каждая компиляция (обновление хекса) будет инициировать прошивку Ардуины — Вам ничего не придется делать самому! Кроме того в программе есть и ручной режим прошивки.

 

Следующая — маленькая и удобная
XLoader (Arduino HEX uploader)

XLoader.zip (22267 Загрузок)

Программка имеет аскетичный интерфейс и работать с ней предельно просто:
— подключаем Arduino в USB-порт (отдельного питания не нужно)
— выбираем Hex файл
— выбираем тип Вашего Arduino
— выбираем COM порт, который создался при подключении Arduino к USB (скорость порта автоматически подставится при выборе типа Arduino)
— жмем Upload

Это все! Ничего сложного. Прошивка через несколько секунд будет записана в МК и автоматически запустится. Один минус – программа никак не сообщает о том, что прошивка уже записана, но это можно увидеть по прекращению мерцания светодиодов RXD и TXD на Ардуине.

XLoader использует для записи прошивки AVR Dude и в качестве протокола программирования используется STK500. Но, похоже, в настройках AVR Dude, произведена коррекция, так как использование стандартного AVR Dude с такими же настройками не дает результатов.

Автоматизация XLoader.

При разработке ПО для микроконтроллера производится очень много прошивок и всегда нужно стремиться автоматизировать этот процесс после сборки проекта — это экономит время и нервы. В данном случае автоматизация усложнена, так как программа не показывает командную строку для AVR Dude (разве что подбирать опытным путем), но некоторое упрощение процесса возможно. Делается это следующим способом – после первой прошивки не закрываем окно программы (COM порт после прошивки программа отпускает) и после следующей сборки проекта просто жмем кнопку «Upload». Конечно, сборка должна осуществляться в один и тот же Hex-файл.

 

Еще одна программка
ARP Uploader (Arduino Hex Uploader and Programmer)

ArduinoUploader.zip (19486 Загрузок)

Как и предыдущая, программка имеет простой интерфейс.
Процесс прошивки тот же:
— подключаем Arduino в USB-порт (отдельного питания не нужно)
— выбираем Hex файл
— выбираем тип Вашего Arduino
— выбираем COM порт
— жмем Upload

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

При попытке прошить Arduino Nano программа отказывалась видеть МК. Причиной стала неправильная установка скорости COM порта. По умолчанию скорость стоит 19200, а нужно 57600. Скорость порта в программе не задается явно, она прописывается в строчке «AVR Dude Params» — поменяйте в ней значение 19200 на 57600.

Автоматизация ARP Uploader.
ARP Uploader как и XLoader работает через AVR Dude, но, в отличие от XLoader, показывает командную строку. Это дает возможность использовать AVR Dude напрямую в Make или Bat файле.

 

Дополнительные материалы.
Драйвера Arduino.

Считаю не лишним напомнить, что для связи Arduino с компьютером в последнем должны присутствовать драйвера. Оставляю здесь архив с драйверами для Arduino (включая и старые драйвера в Old_Arduino_Drivers.zip и драйвера для FTDI-чипа в папке «FTDI USB Drivers»

Arduino_drivers.zip (10852 Загрузки)

Стали появляться недорогие китайские Ардуины с драйвером Ch440G
Driver-Ch440G.zip (Одна Загрузка)

 

Загрузчики Arduino

Если Вы решите собрать свою плату Arduino (а сложного там ничего нет, фактически, это голый ATmega328 или ATmega168), Вам понадобится загрузчик Bootloader который должен содержать МК для работы со средой (или программками для заливки Hex-файлов). Конечно, Вам для записи Hex-файлов в чистый МК понадобится программатор и придется выставить фьюзы.

ATmegaBOOT_168_atmega328.zip (11489 Загрузок)
Для правильной работы нужно установить фьюзы следующим образом Low: FF   High: DA   Ext: 05

ATmegaBOOT_168_diecimila.zip (5742 Загрузки)
Фьюзы Low: FF   High: DD   Ext: 00

 

Схемы Arduino

Cхемы вышеописанных Ардуин.
Arduino_Uno_Rev3-schematic.pdf (10214 Загрузок)
ArduinoNano30Schematic.pdf (9202 Загрузки)
Arduino-Pro-Mini-schematic.pdf (8166 Загрузок)

 

Фьюзы установленные по умолчанию в Arduino (только с ATmega328)
Arduino Uno
Low Fuse 0xFF
High Fuse 0xDE
Extended Fuse 0x05

Arduino Duemilanove or Nano w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05

Arduino BT w/ ATmega328
Low Fuse 0xFF
High Fuse 0xD8
Extended Fuse 0x05

LilyPad Arduino w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05

Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05

(Visited 159 044 times, 51 visits today)

Про Arduino IDE, загрузчики (bootloader), программаторы (avrdude.exe), фьюзы, HEX-файлы. В одном флаконе. Не претендуя на оригинальность.

РадиоКот >Статьи >

Про Arduino IDE, загрузчики (bootloader), программаторы (avrdude.exe), фьюзы, HEX-файлы. В одном флаконе. Не претендуя на оригинальность.

Про Arduino IDE, загрузчики (bootloader), программаторы (avrdude.exe), фьюзы, HEX-файлы. В одном флаконе. Не претендуя на оригинальность.

Для предметности разговора начну с картинки

Нет худа без добра (с).
Пока использовал заводские платы «Arduino UNO» и «Arduino MiniPRO», я не задумывался о том, как работает система в целом. Я просто писал код, нажимал кнопку «Вгрузить» и всё заливалось в микроконтроллер, далее МК, установленный на плате (ATmega328). В этом и заключается прелесть экосистемы «Arduino».
Сподвигла написать данный опус проблема. Никак мне удавалось залить исходную программу, далее СКЕТЧ, из Arduino IDE в нестандартный для неё МК «ATmega8L» с кварцем 8МГц стандартным способом, т.е. через USB-порт (на самом деле через преобразователь USB- UART). Это кратко. Теперь начну рассказывать, какую важную информацию я «наковырял» и как решил свою проблему.

Немного общей теории.
Для того, что бы залить (прошить, загрузить, UPLOAD) скетч в ATmega8L из Arduino IDE через USB-порт, нужен преобразователь, который преобразует информацию, передаваемую по USB-интерфейсу(каналу, дороге, линиям) в сигналы последовательного канала UART. Т.е. должны получиться определенные уровни сигналов – интерфейс (RS232, RS485) и определенные длительности сигналов (протокол).
Что бы принять информацию, поступающую в ATmega8L по UART (физически через выводы Rx, Tx) в МК должна быть ПРЕДВАРИТЕЛЬНО загружена программа, которая настраивает определенные выводы МК как Rx и Tx, и умеет обрабатывать полученную через них информацию. Эта программа называется ЗАГРУЗЧИК или по англицки BOOTLOADER.

(Отступление. ЗАГРУЗЧИКи бывают для разных интерфейсов и, соответственно, протоколов. Программа-программатор, заливающая информацию, должна соответствовать имеющемуся ЗАГРУЗЧИКу. И наоборот - прошитый ЗАГРУЗЧИК должен соответствовать управляющей программе-программатору. Грубо говоря - это «папа» и «мама» одного разъема. Очень часто для МК фирмы ATMEL «папой» является программа avrdude.exe).
Итак, посредством USBasp-платы и avrdude.exe я залил ЗАГРУЗЧИК в ATmega8L. Залитый ЗАГРУЗЧИК должен учитывать определенные физические характеристики МК. В моем случае это то, что МК работает с внешним кварцем на частоте 8МГц (в рамках данной статьи этой характеристики достаточно). Заливка ЗАГРУЗЧИКа происходит просто и жестко – как указал разработчик МК. Не залить HEX-файл (FIRMWARE) ЗАГРУЗЧИКа при минимальном количестве извилин, прямых руках, исправных деталях и правильном соединении просто невозможно.

А почему же тогда возникает проблема залить скетч? Ответ есть выше. Предварительно прошитый ЗАГРУЗЧИК должен соответствовать настройкам «программы-заливатору» (от слова «программатор») и, конечно же, преобразователю интерфейса (плате-программатору). Если идиот подключит два проводка от Rx и Tx ATmega8 к двум выводам разъема USB, то ничего не прошьется. Поэтому на платах-преобразователях останавливаться не буду. Единственно напомню, что ISP-программаторы - это программаторы «железа», которые работают на самом низком уровне и позволяют настраивать МК почти как угодно в пределах возможного.

Вот и нарисовался главный вопрос: Как определить, что имеющийся в МК ЗАГРУЗЧИК соответствует программе-программатору (в рамках данной статьи – Arduino IDE)? Если кратко – то никак!!! И не поможет вам ни осциллограф, ни анализатор. С помощью анализатора можно увидеть длительности каких-то сигналов и максимум, что можно определить – используемую ЗАГРУЗЧИКом скорость, если он будет что-нибудь выдавать по линии Tx. Но даже если скорость будет согласованная, а считанная информация читабельна, это не скажет нам ровным счетом ничего. Единственный способ подружить ЗАГРУЗЧИК в МК и «программу-заливатор» – это читать и следовать информации разработчика ЗАГРУЗЧИКа.
И вот здесь мы подходим к главному плюсу и недостатку одновременно Arduino IDE – дружелюбному интерфейсу для начинающего пользователя. Читай: скрытие всех системных настроек программы от пользователя.
Продолжаю. Итак, мы прочитали информацию от разработчика ЗАГРУЗЧИКа как прошивать его ЗАГРУЗЧИК и как потом загружать HEX-файлы в МК. НО СТОП! В Arduino IDE нет понятия «ЗАГРУЗЧИК», «HEX-файл». Здесь я вынужден прервать рассказ, вернуться к первой картинке и рассказать «с высоты птичьего полета» как устроена Arduino IDE.

1) Грубо говоря, программная платформа «Arduino IDE» предоставляет нам только убогий (для профи) и замечательный для экосистемы «Arduino» интерфейс для написания скетчев и легкой настройки (плата, порт, программатор). При нажатии кнопки «Проверить»(скетч) в дело вступает «наемный профессионал» - компилятор avr-gcc.exe, который преобразует нашу гениальную программу в вид, принимаемый программой-программатором – HEX-файл. Если скетч преобразовался (скомпилировался) и получился HEX-файл, то можно приступить ко второму шагу(смотри картинку1).
2) Запустить программу-программатор с определенными параметрами, что бы HEX-файл «скормить», например, через преобразователь USB-UART, ЗАГРУЗЧИКу МК. Из данной схемы видно, что если автор ЗАГРУЗЧИКа использует в качестве программы-программатора, например, классическую «дудку» (avrdude.exe), то нам вовсе необязательно мучится с настройками платформы «Arduino IDE», спрятанными в фиг знает каких файлах и фиг знает в каком формате. Мы можем просто написать свой bat(cmd, скрипт)-файл и запускать его как для компиляции проекта (avr-gcc.exe), так и для заливки HEX-файла в МК (avrdude.exe). А дальше процесс происходит практически на уровне железа.
3) Драйверы операционной системы преобразуют информацию так, что бы она была понятной подключенным USB-устройствам. В представленной схеме я показал два варианта:
4) 1-й вариант с USB-UART -преобразователем и МК с обязательным (5.1) ЗАГРУЗЧИКом. 2-й вариант с аппаратным USBasp-программатором и (5.2)МК (ЗАГРУЗЧИК не нужен, хотя может иметься).

Какие можно сделать выводы, глядя на представленную картинку?
1. НЕ НАДО устраивать танцы с бубном, если не происходит в Arduino IDE компиляция проекта. Заходим на сайт разработчика компилятора для требуемого МК (ATmega, ESP8266 и т.п.) и читаем, какая среда требуется для компиляции проекта, и с какими опциями надо запустить компиляцию. Часто это будет быстрее и проще, чем пытаться подружить Arduino IDE с нужным МК. Да, для этого надо обладать определенным уровнем знаний не на уровне электрика.
2. Тоже самое можно сказать и о случае, если не происходит заливка HEX-файла в МК через ЗАГРУЗЧИК. Вводим в командной строке рекомендуемую для данного ЗАГРУЗЧИКа команду и получаем результат. Если результат отрицательный, то почти сразу знаем куда «копать». Либо проблема с драйверами ОС, либо дохлая ножка Rx, либо косяк разработчика и на худой конец – проблема в ДНК пользователя.
Вроде всё, о чем я рассказал, есть в интернете, но часто для начинающего ардуинщика непонятно, нужна ли ему некая информация и как ею воспользоваться. Это как на первом курсе универа нас пичкают производными, интегралами, матрицами и у студента растет естественное чувство «А нафига нам это надо?». А потом какой-нибудь практик возьмет и покажет, как использовать для решения реальных задач эту «вышку». И наступает «дзен». Вдруг резко всё, что валялось в голове в виде ненужного хлама, раскладывается по полочкам и ты понимаешь, что стал ИНЖЕНЕРОМ.

К сожалению это не всё, что надо бы знать начинающему ардуинщику. Кое-что расскажу о ЗАГРУЗЧИКЕ (bootloader) подробней.
Что же надо знать о ЗАГРУЗЧИКе, что бы осознанно им пользоваться?
1)Размер загрузчика.
2)Область памяти, в которую он загружается.
3)Фьюзы, которые должны быть использованы с загрузчиком.
4)Скорость для UART.
5)Частоту МК, под которую рассчитан ЗАГРУЗЧИК.
6)Ну и конечно же, под какой МК рассчитан ЗАГРУЗЧИК.
7)Внешнее проявление работающего ЗАГРУЗЧИКа.
8)Критерий для запуска ЗАГРУЗЧИКА.

1) Загрузчик имеет некий размер. Есть МК, у которых мало памяти, и разместить ЗАГРУЗЧИК просто нет места. Или место есть, но не останется места для программы пользователя. Загрузчик – это все таки только программа-посредник для нашего удобства.
2) В МК ATmega Загрузчик может заливаться (условно говоря) в одну из 4х верхних областей Flash-памяти.
3) Соответственно фьюзами задаем область памяти МК, в которой находится ЗАГРУЗЧИК, что бы МК знал, с какого адреса запускать программу в МК после «Reset» или другого события.
4) В экосистеме «Arduino» используется ЗАГРУЗЧИК по UART. А для этого протокола важна скорость. Если Загрузчик настроен на одну скорость обмена информацией, а программа-программатор(avrdude.exe) на другую, то загрузки HEX-файла в память МК не произойдет.
5) МК может работать с разными тактовыми частотами. Чем ниже частота – тем меньше потребляемая мощность. Если залить ЗАГРУЗЧИК, не рассчитанный на используемую МК тактовую частоту, то как минимум будет проблема в несогласованной скорости UART. Т.е. скетч вряд ли загрузится в МК, а если ЗАГРУЗЧИК без контроля ошибок, то может загрузиться черт знает что.
6) Типов МК очень много. ЗАГРУЗЧИК для МК AVR не подходит для МК PIC. Проблемы могут возникнуть даже для одинаковых МК, но в разных корпусах.
7) Очень не мешает знать, как ведет себя загрузчик в МК без пользовательской программы. Вот получили вы посылку из Китая с Arduino ProMini и как узнать есть в ней загрузчик или нет? А если есть описание, то можно прочитать, что при подаче питания или сбросе должен 5 раз мигнуть желтый светодиод. Не мигает? Значит нет загрузчика или у вас проблемы с платой.
8) Вообще-то ЗАГРУЗЧИК может активизироваться (начать свою работу, прервав работу основной программы) не только по сигналу сброса, но любым другим способом, который реализовал разработчик, например, замыканием выв. 5 МК на землю.

А теперь переведем полученную информацию в практическую плоскость.

1) Как узнать размер ЗАГРУЗЧИКА, находящегося в МК?
Если речь о загрузчике, залитом в плату ардуино (читай в МК ATmega8/168/328), то можно прочитать с помощью программы-программатора, например, AVRDUDESS и платы-программатора USBasp, Flash-память и фьюзы BOOTSZ0 и BOOTSZ1. Открыв сохраненный HEX-файл текстовым редактором, можно увидеть в младших адресах код пользовательской программы, потом незанятую память (FF) и в самых верхних адресах памяти (см строку 225) код загрузчика с адреса 1C00 и до признака конца 01FF. Таким образом можно узнать длину загрузчика в байтах, а потом перевести в длину в словах.

 

2)Как узнать размер ЗАГРУЗЧИКА, который мы хотим разместить в МК?
Открываем в текстовом редакторе HEX-файл, в котором хранится интересующий нас загрузчик. Видим приблизительно такую куртинку

Здесь пояснения как понимать полученные цифры

3)Что будет, если залить загрузчик и неправильно выставить фьюзы BOOTSZ0 и BOOTSZ1?
Надо иметь ввиду, что не любой загрузчик способен перезаписать сам себя. Почему так? Этот вопрос выходит за рамки данной статьи. Более того, вопрос поставлен не «как перезаписать загрузчик в МК средствами платформы Arduino IDE?», а о первичной записи в новый МК загрузчика и установке конкретных фьюзов BOOTSZ0 и BOOTSZ1, предполагая, что остальные фьюзы установлены гарантированно правильно.
Итак, первый раз загрузчик всегда прошивается аппаратным программатором (ISP), поэтому выставим ли сначала фьюзы BOOTSZ0 и BOOTSZ1, а потом зальем ЗАГРУЗЧИК или наоборот, значения не имеет, так как ISP-программатор будет загружать данные по адресам, указанным в HEX-файле. Но вот потом, после Reset, ATmega8 начнет выполнение программы с адреса 000, если фьюз BOOTRST=1, независимо от BOOTSZ0 и BOOTSZ1


Из таблицы видно, что если Загрузчик разместим не с нужного адреса или неправильно установим фьюзы, то Загрузчик не запустится должным образом. Под должным образом я подразумеваю запуск нештатным способом за счет других ошибок, которые «исправляют» начальные ошибки. Например, залили в ATmega8 ЗАГРУЗЧИК длиной 510 слов с адреса E02, т.е. как фьюзы BOOTSZ1 и BOOTSZ0 не выставляй, а при сбросе ЗАГРУЗЧИК не запустится (не получит управление МК). Или прошили ЗАГРУЗЧИК размером в 1000 слов с адреса C00, но фьюзы BOOTSZ1 и BOOTSZ0 выставили в 0 и 1. Тогда при сбросе счетчик команд будет установлен в E00 и какой-то участок кода ЗАГРУЗЧИКа запустится, но такой запуск может привести к непредсказуемым результатам.
4)Что будет, если ЗАГРУЗЧИК от ATmega8 залить в ATmega328?
С одной стороны ATmega8 и ATmega328 выводно совместимы, с другой – у них разный объем памяти, а ЗАГРУЗЧИК всегда размещается в конце памяти (в старших адресах). Поэтому, если мы перекомпилируем исходник загрузчика для ATmega8 под ATmega328, то нельзя говорить о том, что мы пытаемся залить ЗАГРУЗЧИК от ATmega8 в ATmega328. Другое дело, если мы попытаемся HEX-файл с ЗАГРУЗЧИКом от ATmega8 залить в ATmega328. Здесь ответ однозначный – данные зальются вовсе не в конец памяти ATmega328, где должен располагаться ЗАГРУЗЧИК, а в область пользовательской программы и никогда штатным образом ЗАГРУЗЧИК не получит управление (не запустится).

И о результате осознания и конечном итоге.
Теперь я знаю, что ЗАГРУЗЧИК optiboot_flash_atmega8_UART0_57600_8000000L.hex из проекта MiniCore, который я хочу залить в свою ATmega8L зальется с адреса 1E00, т.е. займет сектор памяти 1FFF-1E00=1FF (512байт или 256 слов). Соответственно я должен установить (в ноль) три фьюза следующим образом: BOOTRST=0, BOOTSZ1=0 и BOOTSZ0=1 (см таблицу выше)

Залил с помощью программы AVRDUDESS и USBasp-программатора
Как я говорил выше, ЗАГРУЗЧИК и Программа-программатор – это мама и папа одного разъема. И коль я прошил ЗАГРУЗЧИК (маму), то теперь надо настроить «папу»-ArduinoIDE, которой я должен «рассказать» 1) скорость UART, 2)марку МК, 3)Частоту тактирования процессора МК (требуется для правильной компиляции, а не для загрузки), 4)Место, где лежит HEX-файл прошитого ЗАГРУЗЧИКА. Зачем? Не знаю.
Отредактируем файл boards.txt. В разных версиях ArduinoIDE он имеет разный формат!!!
1)Название платы для меню в ArduinoIDE задаётся в строке с «.name=», например: 328.name=ATmega328 или atmegang.name=Arduino NG or older

2)За выбор названия МК для меню отвечает строка вида «.menu.cpu.atmega8=», например: atmegang.menu.cpu.atmega8=ATmega8 или 8.build.mcu=atmega8
К сожалению, все параметры для всех версий ArduinoIDE описать невозможно. Поэтому я показал соответствующие разделы файла boards.txt двух версий. Думаю по образцу и подобию Вы сможете доработать свою версию ArduinoIDE под свои ЗАГРУЗЧИКИ.

Проверим теорию на практике, для чего:
1)Зальем посредством USBasp в ATmega8 (на беспаечной плате) с кварцем 16МГц штатный загрузчик из состава ArduinoIDE «ATmegaBOOT-prod-firmware-2009-11-07.hex» (размер файла 2,8кБ), загрузка с адреса 1C00. Разъемы от плат-программаторов USBasp и USB-UART от беспаечной платы отключать не буду, что бы не перепутать при подключении. Проще отсоединить/присоединить к программаторам, которые надо обязательно отсоединять. Устанавливаю фьюзы L=FF, H=C0. Отключаю USBasp, смотрю на светодиод, подаю питание. Несколько раз быстро мигнул и более не светится. Значит загрузчик работает. Теперь зальем скетч BLINK штатным способом. Подключаюсь USB-UART и светодиод начинает вести себя совсем по другому- раз в 8 сек светится. Запускаю ArduinoIDE 1.6.6.0, устанавливаю Arduino NG…, ATmega8, порт, программатор AVRISP mkII. AVRDUDE 6.0.1 выдает кучу всякой информации (у меня так настроено), скорость 19200. Скетч прошивается и сразу начинает выполняться. Т.е. провода, фьюзы, настройки выполнены правильно.
2)По такой же методике выполним заливку загрузчика optiboot_flash_atmega8_UART0_115200_16000000L.hex, переименовав в «01.hex» и положив в каталог optiboot (размер файла 1,34кБ), загрузка с адреса 1E00. Поэтому фьюзы L=FF, H=C2. После заливки загрузчика светодиод начинает мигать несколько раз в секунду. Без программаторов (только питание) не светится, т.е. загрузчик не выдает своего присутствия. Добавляю секцию в файл boards.txt
##############################################################
#поместите HEX-файл в каталог optiboot

a8_16MHz_E.name=atmega8 (16 MHz_ExtOsc_115k)
a8_16MHz_E.upload.tool=avrdude
a8_16MHz_E.upload.protocol=arduino
a8_16MHz_E.menu.cpu.atmega8.upload.maximum_size=7680
a8_16MHz_E.menu.cpu.atmega8.upload.maximum_data_size=512
a8_16MHz_E.upload.speed=115200
a8_16MHz_E.bootloader.unlock_bits=0x3F
a8_16MHz_E.bootloader.lock_bits=0x0F
a8_16MHz_E.menu.cpu.atmega8.bootloader.low_fuses=0xff
a8_16MHz_E.menu.cpu.atmega8.bootloader.high_fuses=0xc2
a8_16MHz_E.bootloader.tool=avrdude
a8_16MHz_E.bootloader.path=optiboot
a8_16MHz_E.bootloader.file=01.hex
a8_16MHz_E.build.mcu=atmega8
a8_16MHz_E.build.f_cpu=16000000L
a8_16MHz_E.build.core=arduino
a8_16MHz_E.build.variant=standard
a8_16MHz_E.build.board=AVR_NG

Прошиваю штатным способом. Светодиод при наличии USB-UART не светится. При отключении преобразователя и подаче питания начинает мигать, т.е. скетч запустился.

3)Когда попытался повторить вышеописанное для загрузчика optiboot_flash_atmega8_UART0_115200_8000000L.hex потерпел неудачу. Штатным способом скетч не заливался. После долгих танцев с бубном, на основании которых и появился данный трактат, пришел к выводу, что косяк разработчика, так как те же действия для optiboot_flash_atmega8_UART0_38400_8000000L.hex привели к загрузке скетча штатным способом. Кроме того, посмотрев файл boards.txt, нашел в нем ошибки, например:
###################
#### ATmega8/A ####
###################

8.name=ATmega8
8.upload.tool=avrdude
8.upload.protocol=arduino
8.upload.maximum_size=7680
8.upload.maximum_data_size=1024!!!!!!!!!!!!!!!! Ошибка
8.menu.clock.16MHz_external.bootloader.high_fuses=0xc4!!!!!!!!!!!!ошибка
И нет для 8МГц скорости 115200, а нерабочий HEX-файл есть. Вот и верь разработчикам.

Извините, что не могу привести отличия форматов файла boards.txt в разных версиях ArduinoIDE, так как этим вопросом не занимался. Попробовал сделать под имеющуюся версию по образцу и подобию – получилось. Глубже не «копал».

Спасибо за внимание. Буду рад, если кому-то мои исследования оказались полезными.

P.S. В последних версиях в конфигурацию (boards.txt) начали прописывать vid и pid. Видимо жаба душит итальянцев. Берегите старые версии ArduinoIDE. А то будет как с хромом – негде скачать старую версию.

P.S.2 При прошивке скетча в МК в сообщениях об ошибках ArduinoIDE, а правильнее сказать AVRDUDE, может упоминаться протокол STK500. В штатном режиме работы мы выбираем программатор AVRISP mkII. А в меню еще есть AVR ISP, Arduino ISP, Arduino as ISP. В русскоговорящем интернете я не встречал объяснения «на пальцах» зачем такое обилие типов программаторов в ArduinoIDE и главное, чем они отличаются и когда какой использовать. Поэтому чувствую себя как лох в хорошем ресторане, перед которым положили 5 ложек и 5 вилок…. И все смотрят только на меня. Кое-что я нашел на сайте microsin, но у автора есть проблема с обозначением объекта. Это как безобъектный праздник «день независимости». Независимости кого, от чего? Каждый волен понимать как хочет. И многие этим пользуются. Но в технике нужна однозначность. Попробую объяснить «на пальцах» как понял я. Если не прав, то прошу поправить.
Итак, AVRISP mkII это плата-программатор от AVR для своих микроконтроллеров серий ATtinyXX, ATmegaXX и других с последовательным (не UART ) интерфейсом ISP (4 сигнальных провода MOSI, MISO, SCK, GND) (режим последовательного программирования на основе интерфейса SPI). Интересно, зачем нужны эти два интерфейса ISP и SPI в одном программаторе? Так как обмен данными между AVRISP mkII и компьютером PC происходит через интерфейс USB, а плата-программатор AVRISP mkII построена на основе AVR-USB162, AVR-USB162MU, AVR-USB32U4 и других, то требуется прошивка для используемого МК. Firmware для программатора AVRISP mkII, распространяется свободно. Понятно, что количество типов МК растет и хотелось бы, что бы плата-программатор AVRISP mkII умел с ними работать. Соответственно надо дорабатывать прошивку AVRISP mkII. Но AVRISP mkII должен общаться не только с программируемым (целевым) МК, но и компьютером. Так вот этот набор «слов для общения» называют протоколом. И эти протоколы тоже развиваются (STK500, STK600. AVRISP mkII во многом совпадает с протоколом STK600). До сих пор вроде понятно, если вспомнить, что на плате Arduino UNO использовался преобразователь-программатор на основе ATmega8U2. Но всякое понимание улетучивается, когда вспоминаем, что платы Arduino продаются с прошитым в основной МК загрузчиком. И нет никакого ISP (MOSI, MISO, SCK, GND). Всё общение происходит по интерфейсу UART, и даже нет необходимости эмулировать сигналы ISP. Тогда при чем AVRISP mkII?
А вот если мы обратим свой взор на стартеркит STK500 (что это такое?), то увидим, что обмен между STK500 и PC происходит через интерфейс RS232 (PC COM-порт)(тот же UART, только уровни сигналов +/- 12в, а не 0-5в). При этом STK500 использует следующие настройки порта: 115.2kbps, 8 data bits, 1 stop bit, no parity. Интерфейс на выходе программатора STK500 – ISP и PP. STK500 и AVRISP поддерживают тактовые частоты ISP от 4 кГц до 1.8 МГц.
Про UART и загрузчик – ни слова. Так почему AVRISP mkII?

Файлы:
ATmega8 Addressing the Flash
распределение памяти в атмега8
ATmega8 фьюзы Заводские и как должно стать
ATmega8 зависимость частоты от напряжения питания
AVRDUDESS фьюзы
Последовательное программирование
преобразователь usb-uart
Штатный загрузчик от Ардуино
03.hex
01.hex
04.hex
FLASH память-RWW-NRWW
USBasp-atmega8A-pin
Эта статья в ворд-формате
Работа с представленными загрузчиками
проверенная Blink РАБОЧАЯ секция
проверенная Blink РАБОЧАЯ секция3
проверенная Blink РАБОЧАЯ секция1
сообщения при удачной заливке скетча новым загрузчиком на 16МГц
сообщения при удачной заливке скетча штатным загрузчиком

Все вопросы в Форум.


Как вам эта статья?

Заработало ли это устройство у вас?


Эти статьи вам тоже могут пригодиться:

136-gcUploader автоматический загрузчик HEX-файлов для Arduino — GetChip.net

С недавнего времени, как Вы заметили, я стал создавать много конструкций на базе Arduino. Причина проста – экономия времени на сборку устройства. Сейчас у меня стало не так много свободного времени, но отказываться от своего хобби я не хочу. Поэтому приходится оптимизировать производство новых устройств :). Больше времени уделять коду, чем пайке. Кроме того, конструкция на Ардуине обладает хорошей повторяемостью – трудно сделать что-то не так, когда для создания конструкции необходимо, всего лишь, соединить готовые платки десятком проводков. Но, несмотря на то, что устройства создаются при помощи Ардуины, программы под них я все равно пишу на Algorithm Builder (родная среда программирования Ардуины очень упрощена и мне много чего в ней не хватает).

С переходом на Ардуину встал вопрос прошивки МК. Можно использовать ISP разъем на Ардуине и прошивать МК прямо с Билдера (плюсом будет внутрисхемная отладка), но грех не использовать уже прошитый в Ардуину загрузчик и прошивать свои программы посредством штатного USB-шнура Ардуины. К сожалению Билдер не может записать прошивку в Ардуину через загрузчик, поэтому приходится использовать сторонние программы – HEX-загрузчики.

Раньше процесс прошивки Ардуины у меня выглядел следующим образом.  Предварительно я запускаю один из загрузчиков (о них я писал раньше) и настраиваю его на включенную Ардуину, прописываю путь к хексу создаваемой программы. Дальше в Билдере, после очередной редакции кода, компилирую проект, перехожу к окну загрузчика, жму на нем кнопку «Загрузить» и возвращаюсь в Билдер. Процедура вроде и не сложная, но когда таких циклов в процессе отладки делаешь десятки – это начинает немного надоедать.

Для того чтобы упростить процесс прошивки Ардуины я сделал свой автоматический загрузчик — gcUploader.

gcUploader.zip (13226 Загрузок)

 

GC Uploader — маленькая программка с небольшим количеством настроек, но очень облегчающая мне жизнь.

Работает она следующим образом:
1 Подключаем Ардуину к компьютеру (драйвера уже должны быть установлены)
2 Запускаем gcUploader
3 Мышкой кидаем HEX-файл на окно gcUploader (откроется область настроек)
4 Выбираем тип Ардуины
5 Выбираем порт к которому подключена Ардуина.
6.1 Для случая, когда нужно прошить готовый хекс — кликаем пиктограмму микроконтроллера
6.2 Для случая работы с проектом, программа делает все сама (программа следит за хексом и в случае его изменения, при очередной компиляции проекта, процесс прошивки Ардуины запускается автоматически).

Программа использует для прошивки AVRDUDE. После очередного обновления Вы можете добавлять поддержку новых Ардуин, контроллеров и программаторов, из того огромного количества, что поддерживает AVRDUDE. Как это сделать читайте здесь.
gcUploader запоминает все настройки последней сессии и при повторном запуске (если Вы продолжаете все то-же проект) ничего настраивать не нужно.

Элементов управления немного и они интуитивно понятны.
Главный элемент окна – изображение микроконтроллера. Изображение меняется, отображая текущее состояние программы:


ожидание — HEX-файл не изменялся — программа ничего не делает

 


обнаружено изменение — HEX-файл изменился и, если не выбран ручной режим, прошивка начнется автоматически

 


прошивка МК

 


прошивка завершена

 

В любом из режимов работы можно начать процесс прошивки вручную, кликнув на пиктограмме микросхемы.

Далее элементы настройки:

 — открывает поле настройки программы

Нужно выбрать, соответственно, тип Ардуины и порт, к которому она подключена. В окно адреса нет необходимости прописывать путь вручную – просто киньте файл прошивки на форму и путь добавится автоматически.

 — ручной и автоматический режим прошивки. В ручном режиме программа обнаруживает изменение хекса и изменяет пиктограмму МК, но не запускает прошивку. Прошивка начнется после клика на пиктограмме МК.

 — включение/отключение отображения окна лога работы AVRDUDE. При первых прошивках проекта рекомендуется включать окно, чтобы убедиться, что все работает нормально.

    — открывает файл gcUploader.ini для добавления поддержки новых устройств
(читать подробней).

— обновление списка доступных портов, для случая подключения Ардуины после пуска программы.

Окно программы полупрозрачно и всегда находится поверх всех окон, так что Вы всегда будете в курсе того, что происходит.

Если кому чего захочется добавить в программу, пишите — постараюсь сделать (хотя, на мой взгляд, программа идеальна 🙂 )

Обновление 19.09.2016
— убрал отображение формы на панели задач (для экономии на ней места) — все равно окно программы всегда на виду;
— добавил альтернативную командную строчку для AVRDUDE в gcUploader.ini, расскоментировав которую можно увеличить скорость записи прошивки в МК (отключается верификация записанной прошивки). по умолчанию работает обычный режим с верификацией.

Обновление 20.09.2016
— добавил возможность обновления списка доступных портов (для случая, когда Ардуина подключена уже после пуска программы)

Обновление 08.02.2018
— обновил AVRDUDE до свежей 6.3 версии
— появилась возможность добавлять свои варианты Ардуин или даже микроконтроллеров и программаторов (читать подробней)

Обновление 13.05.2018
— небольшие улучшения функциональности

(Visited 22 465 times, 7 visits today)

Прошивка Ардуино ATmega328 через Arduino IDE и программатор

Загрузка скетча или прошивка контроллера Ардуино – основная операция, с которой рано или поздно сталкивается любой ардуинщик. Именно возможность быстро и без лишних проблем загрузить в память контроллера управляющую программу и стала одной из основных причин успеха платформы Arduino. В этой статье мы узнаем, как прошиваются Arduino Uno, Nano, Mega и другие платы на основе Atmega с использованием Arduino IDE, программатора или другой платы Ардуино.

Загрузка скетча в плату Ардуино

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

Что происходит, когда мы жмем кнопку «Загрузить»

Плата Ардуино – это микроконтроллер AVR (Atmega8/168/328 или Atmega1280/2560), который прошивается загрузчиком. В микроконтроллер записывается программа, называемая прошивкой, которая позволяет получать сигналы с датчиков, обрабатывать нажатия кнопок, общаться с различными устройствами через интерфейсы, управлять исполнительными процессами.

Обычно прошивка записывается в кристалл микроконтроллера при помощи специальных устройств, называемых программаторами. Для разных микроконтроллеров существуют различные программаторы – от специализированных до универсальных. Важным отличием Ардуино от других контроллеров является возможность залить прошивку через обычный USB кабель. Это достигается при помощи специальной программы – загрузчика (Bootloader). Для прошивки не требуются лишние провода, не нужно подключать дополнительные устройства или нажимать что-то на плате. Также при работе через загрузчик нельзя добраться до опасных настроек, которые выведут из строя Ардуино.

При подключении платы Ардуино к источнику питания, внутри него начинается активная деятельность микропрограмм. При запуске микроконтроллера управление получает загрузчик. Первые 2 секунды он проверяет, поступил ли новый код от пользователя.  Кроме того загрузчик подает импульсы на пин, к которому подключен светодиод, и он начинает мигать. Это означает, что загрузчик установлен и работает исправно. Когда подается скетч, загрузчик записывает его во флеш-память микроконтроллера. Затем эта программа подается на выполнение.  Если данные не поступили, загрузчик запускает предыдущую программу. Во время выполнения программы внутри Ардуино выполняется ряд операций по инициализации и настройке среды окружения, и только после этого начинается выполнение кода.

Вызов setup и loop при загрузке

В самом коде имеются несколько основных функций, на их примере можно рассмотреть работу микроконтроллера.

Команда void setup() – в ней записываются данные, которые микроконтроллер выполняет в момент загрузки, а после может про них забыть. В этой функции указываются номера пинов, к которым подключается устройство, подключаются и инициализируются библиотеки, устанавливается скорость работы с последовательным портом.

Функция void loop – в нее помещаются команды, которые должны выполняться, пока включена плата. Микроконтроллер начнет выполнять программы, начиная с первой, и когда дойдет до конца, сразу вернется в начало, чтобы повторить эту же последовательность бесконечное число раз.

Загрузка скетча в Arduino IDE

В Ардуино IDE компиляция скетча начинается при нажатии кнопки Verify, после этого скетч может быть загружен в память Ардуино через USB с помощью кнопки Upload. Перед загрузкой кода программы нужно установить все параметры в меню Tools. В этом меню выбираются порт, к которому подключена плата, и платформу. В окне Arduino IDE внизу будет отображен ход компиляции скетча. При успешной выгрузке скетча будет получено сообщение «Done uploading».  Запуск скетча начинается сразу после окончания загрузки. Для расширения возможностей можно подключать дополнительные внешние библиотеки, разработанные командой Ардуино или сторонними авторами.

Обзор возможных вариантов загрузки скетча

Кратко весь алгоритм можно записать следующим образом: Написание кода >> компиляция >> загрузка в микроконтроллер. При загрузке скетча используется Bootloader (Загрузчик). Он представляет собой небольшую программу, которая загружается в микроконтроллер на Ардуино. С помощью этой программы можно загружать скетч, не используя дополнительные аппаратные средства. При работе загрузчика на плате будет мигать светодиод.

1. Загрузка в Arduino IDE. Самый простой и удобный вариант загрузки кода. Все, что        нужно сделать – это написать или найти нужный скетч и загрузить его.

  1. Ускоренная загрузка скетча в Arduino IDE. С помощью этого метода можно увеличить скорость загрузки в микроконтроллер в два раза. Для этого нужно лишь зайти в Настройки и снять галочку с пункта Проверка кода. Пропуская шаг проверки, будет уменьшено количество байтов, которые передаются во время загрузки. При этом все равно некоторые из видов проверок будут осуществлены, но они не занимают долгого времени. Отключать проверку кода не рекомендуется, если Ардуино помещается в какой-либо ответственный проект (например, в спутник). Также можно провести проверку, если подключение производится через очень длинный USB кабель (порядка 10 метров).

Уменьшение времени загрузки при помощи отключения проверки работает с любой платой Ардуино, которая использует USB соединение. Все эти микроконтроллеры используют загрузчик avrdude. Платы, которые используют загрузчик Catarina, не нуждаются в отключении проверки кода, так как этот загрузчик работает быстрее.

  1. Загрузка скетча в Ардуино через Bluetooth. Этот способ используется, когда нужно обойтись без физического соединения Ардуино и компьютера – например, в силовых цепях или радиочастотных цепях. Для реализации загрузки потребуется Bluetooth-модуль, который оснащен платой-адаптером для Ардуино. Этот модуль нужно подключить к компьютеру через переходник USB-UART-TTL. Работа с модулем осуществляется с помощью AT-команд.
  2. Загрузка при помощи Андроид-устройства. Для осуществления такого типа загрузки кода понадобятся провода USB-A – USB-B и USB-Host (OTG-кабель), Ардуино и устройство на базе Андроид с поддержкой режима host. На Андроид-устройство нужно установить программу ArduinoDroid или ArduinoCommander из Google Play. Все устройства нужно соединить при помощи кабелей, после этого можно включать Ардуино и загружать на него код. Нужно запустить установленную программу. При включении начнется обновление IDE, на что понадобится некоторое время.

Сначала работа будет рассмотрена на примере программы ArduinoCommander. После ее запуска нужно нажать USB-Device. Затем нужно наддать Autodetect, чтобы Андроид-устройство выполнило поиск Ардуино и отобразило его на экране. Как только Ардуино появится на экране, нужно на него нажать. Чтобы перейти в меню, нужно щелкнуть в нижнем правом углу. В этом меню можно загрузить скетч с SD-карты.

ArduinoDroid представляет собой среду разработки, компилятор и загрузчик одновременно. Начать компиляцию скетча нужно нажав на кнопку Lightning-Button. После завершения компиляции нужно нажать на кнопку загрузки. Загрузка занимает несколько секунд. По окончании загрузки ардуино запустит на выполнение новый код.

  1. Программирование при помощи Raspberry Pi. Можно загружать скетчи двумя способами – при помощи Arduino IDE и при помощи пакета arduino-mk. Пакет позволяет собирать и загружать скетчи Ардуино из командной строки.

Структура памяти Ардуино, где располагается скетч и данные

На микроконтроллере Ардуино имеется 3 вида памяти – флеш-память, которая используется для хранения скетчей, ОЗУ для хранения переменных и EEPROM для хранения постоянной информации. Из этих типов памяти флеш-память и EEPROM являются энергонезависимыми, то есть информация сохраняется при выключении питания. ОЗУ используется только для хранения данных, которые имеют отношение к исполняемой программе.

Микроконтроллер ATmega168, который используется на части плат Ардуино, имеет 16 Кб флеш-памяти, 1024 байта для ОЗУ и 512 байт EEPROM. Важно обратить внимание на малый объем ОЗУ. Большие программы могут полностью ее израсходовать, что приведет к сбою в программе. По этой причине нужно следить за тем, сколько строк занимает программа, и по возможности удалять лишнее. Уменьшить объем кода можно несколькими способами:

  • Можно отправить часть информации на компьютер.
  • Для таблиц и других крупных массивов использовать минимальный тип данных для хранения.
  • Данные, которые остаются неизменными, можно объявить константами при помощи слова const перед объявлением переменной.
  • Меньше использовать рекурсию. При ее вызове в памяти, называемой стеком, выделяется фрагмент, в котором хранятся различные данные. Если часто вызывать рекурсию, стеки будут занимать большой объем памяти и могут израсходовать ее.
  • Неизменяемые строки можно сохранять во флеш-памяти во время работы программы. Для этого используется функция PROGMEM.

На объем памяти не влияют размер имени переменных и комментарии. Компилятор устроен таким образом, что не включает эти данные в скомпилированный скетч.

Для измерения объема занимаемой памяти ОЗУ используется скетч из библиотеки MemoryFree. В ней имеется специальная функция free­Memory, которая возвращает объем доступной памяти. Также эта библиотека широко используется для диагностики проблем, которые связаны с нехваткой памяти.

Оптимизация флеш-памяти. Как только будет окончена процедура компиляции, в окне появится информация о занимаемой памяти кодом. Если скетч занимает большую часть памяти, нужно произвести оптимизацию использования флеш-памяти:

  • Использование констант. Аналогично как и для ОЗУ задавать неизменяющиеся значения константами.
  • Удалить ненужные Serial.println. Эта команда используется, когда нужно увидеть значения переменных в разных местах программы, нередко эта информация просто не нужна. При этом команды занимают место в памяти, поэтому, убедившись в корректной работе программы, некоторые строки можно удалить.
  • Отказ от загрузчика – можно программировать микроконтроллер через контакты ICSP на плате с использованием аппаратных программаторов.

Флеш память является безопасным и удобным способом хранения данных, но некоторые факторы ограничивают ее использование. Для флеш-памяти характерна запись данных блоками по 64 байта. Также флеш-память гарантирует сохранность информации для 100000циклов записи, после чего информация искажается. Во флеш-памяти имеется загрузчик, который нельзя удалять или искажать. Это может привести к разрушению самой платы.

EEPROM память используется для хранения всех данных, которые потребуются после отключения питания. Для записи информации в EEPROM нужно использовать специальную библиотеку EEPROM.h, которая входит в число стандартных библиотек в Arduino IDE. Чтение и запись информации в EEPROM происходит медленно, порядка 3 мс. Также гарантируется надежность хранения данных для 100000 циклов записи, потому лучше не выполнять запись в цикле.

Варианты прошивки Ардуино

Прошивка с помощью Arduino IDE

Прошить плату при помощи среды разработки Arduino IDE можно в несколько шагов. В первую очередь нужно скачать и установить саму программу Arduino IDE. Также дополнительно нужно скачать и установить драйвер Ch441. Плату Ардуино нужно подключить к компьютеру и подождать несколько минут, пока Windows ее опознает и запомнит.

После этого нужно загрузить программу Arduino IDE и выбрать нужную плату: Инструменты – Плата. Также нужно выбрать порт, к которому она подключена: Инструменты – Порт. Готовая прошивка открывается двойным кликом, чтобы ее загрузить на плату, нужно нажать кнопку «Загрузить» вверху панели инструментов.

В некоторых ситуациях может возникнуть ошибка из-за наличия кириллицы (русских букв) в пути к папке с кодами. Для этого файл со скетчами лучше создать и сохранить в корне диска с английским наименованием.

Прошивка с помощью программатора

Одни из самых простых способов прошивки платы – при помощи программатора. Заливка будет производиться в несколько этапов.

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

После этого нужно выбрать плату, для которой нужно прошить загрузчик. Это делается в меню Сервис >> Плата.

Затем нужно выбрать программатор, к которому подключен контроллер. В данном случае используется USBasp.

Последний шаг – нажать на «записать загрузчик» в меню Сервис.

После этого начнется загрузка. Завершение произойдет примерно через 10 секунд.

Прошивка Arduino через Arduino

Для того чтобы прошить одну плату с помощью другой, нужно взять 2 Ардуино, провода и USB. В первую очередь нужно настроить плату, которая будет выступать в качестве программатора. Ее нужно подключить к компьютеру, открыть  среду разработки Arduino IDE и найти в примерах специальный скетч ArduinoISP. Нужно выбрать этот пример и прошить плату.

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

Можно начать прошивать устройство. Как только прошивка будет открыта или написана, нужно перейти в меню Скетч >> загрузить через программатор. Для заливания прошивки не подходит стандартная кнопка загрузки, так как в этом случае прошивка будет загружена на первую плату, на которой уже имеется прошивка.

Заключение

В этой статье мы рассмотрели различные аспекты загрузки скетчей в Arduino Uno и Nano. Прошивка плат на базе микроконтроллеров ATmega328 и ATmega256, как правило, не сложна и может выполняться одним нажатием кнопки в Arduino IDE. За эту простоту мы должны благодарить встроенную программу-загрузчик, выполняющую за нас все основные действия на низком уровне.

Еще одним вариантом перепрошивки контроллера является использование другой платы адуино или специальных программаторов, использующих микросхемы CP2102 Ch440, FTDI и другие. Этот метод требует дополнительных усилий и затрат, но позволяет гибко изменять параметры прошивки. Какой из двух вариантов выбрать – решать вам. Для новичков, безусловно, первым шагом станет использование Arduino IDE, благо, ее создатели сделали все, чтобы упростить этот процесс.

 

Загрузка Hex Файла В Arduino

У меня есть плата Arduino Nano, и я использую mikroPascal в качестве моей IDE разработки. Для загрузки в настоящее время я использую XLoader, но невозможно использовать это программное обеспечение с параметрами командной строки, поэтому я могу интегрировать его в свою IDE. Я ищу некоторое программное обеспечение, которое может загрузить мой HEX файл с помощью загрузчика на плате Arduino с использованием параметров командной строки, чтобы я просто нажал комбинацию клавиш в среде IDE, а затем файл был загружен, а программное обеспечение загрузчика отключилось. Надеюсь, это имеет смысл.

Обновление: я провел несколько экспериментов и нашел некоторый намек на Интернет

Я придумал командную строку, в которой говорится, что AVRDUDE.EXE -c arduino -p atmega328 -p com8 -b 57600 -vv -U flash: w: "D:\Documents\mikroPascal\Stoker\MyStokerSlave.hex ": i, но я получаю сообщение об ошибке AVRDUDE.EXE: Не могу найти идентификатор программиста" arduino "

Это немного меня озадачивает, так как у меня есть утилита XLoader, работающая из одной и той же папки, с использованием той же конфигурации AVRDUDE и работает нормально. Но, как я сказал с самого начала, я хочу добавить его в мою mikroPascal IDE, и это невозможно с XLoader

Как прошить Ардуино загрузчик без программатора

Разбираемся как прошить Arduino Uno R3 без какого-либо программатора для прошивки загрузчика в ATMEGA328P.

Установка программного обеспечения Atmel FLIP

На плате Arduino есть два микроконтроллера - ATMEGA328P (328P) и ATMEGA16U2 (16U2). Вы можете обновить прошивку 16U2, сделав его программатором AVRISP MKII, а затем использовать Atmel Studio для прошивки 328P.

Я пробовал разные варианты, но возникали разные проблемы. Многие рекомендации плохо работали в моем случае особенно в части перепрошивки загрузчика через ПО Arduino.

Переда началом прошивки Ардуино потребуется программное обеспечение Atmel (Microchip) FLIP для обновления прошивки внутри 16U2.

Скачиваем Flip с сайта Microchip - отсюда. Устанавливаем. Не должно возникнуть никаких проблем, просто следуйте инструкциям мастера установки.

Возьмите плату Arduino, отсоедините питание и USB. Замкните на ICSP1 пины 5-6 (16U2 RESET будет в низком состоянии).

Распиновка ICSP1

Выглядеть это будет так:

Далее подключите Arduino к USB. Разъедините пины на ICSP1 (5-6). В этот момент 16U2 переходит в режим DFU. Новое устройство USB должно быть распознано.

Если драйвер не устанавливается автоматически, установите его из: C:\Program Files\AtmelFlip3.4.7usb»

Перейдите в Диспетчер устройств: Win + Pause -> Оборудование -> Диспетчер устройств. Проверьте, правильно ли установлен драйвер. Он будет расположен под USB-устройствами Atmel -> ATmega16U2.

Прошивка AVRISP MKII в Arduino ATmega16U2

Мы готовы перепрошить прошивку в 16U2.

Скачайте hex файл AVRISP MKII отсюда.  Отключите Arduino от USB-кабеля и питания. Замкните контакты 5-6 ICSP1. Подключите Arduino к USB. Разомкните выводы ICSP1 5-6.

Запустите программное обеспечение FLIP: Пуск -> Все программы -> Flip. Зайдите в: Настройки -> Связь -> USB. Нажмите «Открыть».

Перейдите в: Файл -> Загрузить файл HEX. Далее выберите LUFA-BOTH-AVRISP-MKII.hex и нажмите «Выполнить».

ATMEGA16U2 теперь AVRISP MKII и работает в режиме Atmel Studio. Arduino AVRISP MKII может работать в двух режимах: Atmel Studio или Avrdude. Ниже я буду говорить только о режиме Atmel Studio, так как у меня было много проблем с режимом Avrdude.

Установка Atmel Studio

Скачайте и установите Atmel Studio (включая драйверы) отсюда. После установки подключите Arduino к USB-кабелю. Оба светодиода (RX и TX) должны мигать два раза (это означает, что 16U2 находится в режиме Atmel Studio). Новое устройство будет распознано.

Установите драйверы. Если они не распознаются автоматически, вы найдете их в USB-драйверах: С:\Program Files\Atmel.

Перейдите в Диспетчер устройств, нажмите: Win + Pause -> Оборудование -> Диспетчер устройств. Проверьте, правильно ли установлен драйвер. Должно быть в Jungo Connectivity -> AVRISP MKII.

Вот теперь мы готовы прошить Arduino ATMEGA328P. Переходим к следующему шагу.

Перепрошивка загрузчика Arduino в ATMEGA328P через ATMEGA16U2

Довольно сложная часть нашего мероприятия по прошивке Ардуино. Вам нужно будет припаять некоторые провода. В основном нам нужно подключиться таким образом:

ICSP1 MISO2.Pin.1 -> ICSP MISO.Pin.1
ICSP1 SCK2.Pin.3 -> ICSP SCK.Pin.3
ICSP1 MOSI2.Pin.4 -> ICSP MOSI.Pin.4
JP2 PB4.Pin.1 -> ICSP RESET.Pin.5

Смотрите картинку ниже для понимания:

Подключите плату Arduino к USB-кабелю. Светодиоды RX и TX должны помигать два раза. Драйверы должны быть правильно распознаны (Jungo Connectivity -> AVRISP mkII). Запустите Atmel Studio. Зайдите в: Пуск -> Все программы -> Atmel -> Atmel Studio.

Перейдите в: Инструменты -> Программирование устройства. Выберите:

Инструмент -> AVRISP mkII
Устройство -> ATmega328P
Интерфейс -> ISP

Нажмите кнопку «Применить».

Установите частоту ISP на 16,1 кГц. Нажмите кнопку «Установить».

Программатор не будет работать, если вы установите очень низкую тактовую частоту ISP. Вы получите сообщение об ошибке: "ispProgramMem: получено состояние ошибки: получено 0x81, ожидаемое 0x00 (истекло время выборки контакта RDY / nBSY)". На английском будет звучать так: "ispProgramMem: Error status received: Got 0x81, expected 0x00 (RDY/nBSY pin sampling timed out)". Однако максимальная скорость ISP также ограничена и не может превышать 1/4 частоты устройства.

Перейдите в «Подпись устройства» (Device signature) и нажмите кнопку «Читать» (Read). Вы должны увидеть правильную «подпись устройства»: 0x1E950F. Нажмите «Memories» и найдите hex файл загрузчика Arduino. Он находится в:

C:\Program Files\ Arduino\hardware\arduinobootloaders\optiboot\optiboot_atmega328.hex

Нажмите кнопку «Program». Если вы используете совершенно новый незапрограммированный ATMEGA328P, вы также должны запрограммировать FUSES. Перейдите в Fuses и используйте следующие значения: low_fuses = 0xff; high_fuses = 0xDE; extended_fuses = 0x05.

Вы успешно прошили 328P с загрузчиком Arduino. На следующем шаге мы вернем оригинальную прошивку 16U2.

Перепрошиваем Arduino ATMEGA16U2 в оригинальное ПО

Почти сделано. Нам нужно вернуть оригинальное программное обеспечение в ATMEGA16U2.

Отключите Arduino от питания и USB. Замкните на ICSP1 контакты 5-6. Подключите USB-кабель. Разомкните пины ICSP1 5-6.

Запустите программное обеспечение FLIP. Перейдите в: Пуск -> Все программы -> Flip -> Flip. Далее: Настройки -> Связь -> USB.

Нажмите «Открыть». Перейдите в: Файл -> Загрузить файл HEX.

Выберите файл:

С:\Program Files\Arduino\hardware\arduino\firmwares\atmegaxxu2\arduino-usbserial\Arduino-usbserial-atmega16u2-Uno-Rev3.hex

Нажмите «Выполнить».

Отсоедините USB-кабель и подключите его снова. Новое устройство USB должно быть распознано. Если драйвер не установлен автоматически, вы найдете его в: С:\Program Files\Arduino\drivers.

Перейдите в Диспетчер устройств: Win + Pause -> Оборудование -> Диспетчер устройств. Проверьте, правильно ли загружен драйвер. Вы должны увидеть его в: Ports -> Arduino Uno.

Теперь мы можем проверить любой скетч из примеров, типа Blink. Запустите программное обеспечение Arduino (Пуск -> Arduino).

Нажмите: Open (стрелка вверх) -> -> 01.Basics -> Blink.

Выберите COM-порт а: Инструменты -> Последовательный порт -> COM (выберите порт, на котором была распознана плата).

Нажмите значок «Загрузить» (стрелка вправо). Светодиод должен начать мигать.

Всё готово. Мы узнали как прошить Ардуино и успешно перепрограммировали ATMEGA328P без использования какого-либо внешнего программатора.

Как получить шестнадцатеричный файл из Arduino

Здравствуйте, друзья, надеюсь, у вас все хорошо, и вы весело проводите время. В сегодняшнем посте я расскажу, как получить шестнадцатеричный файл из Arduino. Это довольно простой пост, и я уже много раз объяснял его в своих постах, но все же я получаю много сообщений об этом, поэтому я подумал написать для него отдельный пост. Прежде всего, давайте немного об этом введем. Если вы работали с микроконтроллерами PIC или Atmel и т. Д., То вы видели, что вы всегда получаете шестнадцатеричный файл из их компиляторов, а затем записываете этот шестнадцатеричный файл в соответствующий микроконтроллер, используя их программатор или записывающее устройство.Но это не относится к Arduino. В платах Arduino вы просто подключаете его к компьютеру, нажимаете кнопку «Загрузить», и код автоматически загружается на платы Arduino. Он не создает никаких шестнадцатеричных файлов. Вам также следует взглянуть на библиотеку Arduino для Proteus, в которую вы можете загрузить этот шестнадцатеричный файл.

Итак, теперь возникает вопрос, зачем нам вообще нужен шестнадцатеричный файл, если мы можем загрузить код без него? Ответ на этот вопрос: во многих случаях требуется шестнадцатеричный файл.Например, вместо использования платы Arduino вы просто хотите использовать микроконтроллер ATmega328 или Attiny, тогда самый простой способ - написать код в Arduino, а затем получить его шестнадцатеричный файл и загрузить его в свой микроконтроллер, что значительно упрощает задачу. Другим примером является моделирование Proteus, когда вы хотите смоделировать свою плату Arduino в программном обеспечении Proteus, вам необходимо получить шестнадцатеричный файл, чтобы вы могли загрузить его в свой баорд Arduino. Другой случай - фриланс, когда вы работаете над каким-то проектом в качестве фрилансера, тогда есть много случаев, когда вы не хотите отправлять свой код клиенту, вместо этого вы хотите отправить ему шестнадцатеричный файл, чтобы он мог протестировать и проверить код, в таких случаях он тоже требуется.Итак, давайте начнем с того, как получить шестнадцатеричный файл из Arduino.

Как получить шестнадцатеричный файл от Arduino ???

  • Прежде всего, откройте программное обеспечение Arduino, напишите свой код и протестируйте его.
  • После того, как вы убедитесь, что ваш код готов и вы хотите сгенерировать шестнадцатеричный файл, нажмите на File опцию в меню выше, а затем на Preferences , как показано на рисунке ниже:
  • В На рисунке выше я использовал простой пример мигания и собираюсь сгенерировать его шестнадцатеричный файл.
  • Теперь, когда вы нажимаете «Настройки», появляется новое окно.
  • В этом новом окне отметьте опцию компиляции , как показано на рисунке ниже:
  • После установки отметки нажмите кнопку ОК, и это диалоговое окно закроется.
Примечание:
  • Отметив эту опцию, вы разрешаете программному обеспечению Arduino показывать подробные выходные данные на панели вывода, присутствующей в конце программного обеспечения Arduino, которая имеет черный фон.
  • Итак, вы также можете отметить опцию загрузки, но вам необходимо загрузить код для получения этих команд вывода.
  • Теперь нажмите кнопку компиляции, когда мы отметим параметр компиляции, чтобы он скомпилировал код и предоставил вам все команды, как показано ниже:
  • Теперь вы можете ясно видеть на приведенном выше рисунке, что существует много Команды в черной части - это подробные выходные данные, которые дает нам Arduino.
  • Последняя строка этих подробных выходных данных, которую я также выделил, - это ссылка на ваш шестнадцатеричный файл, который в нашем случае:

C: UserszainAppDataLocalTempbuild7243111610766241365.tmp / Blink.cpp.hex

  • Теперь удалите имя шестнадцатеричного файла из этой ссылки, и оно станет следующим:

C: UserszainAppDataLocalTempbuild7243111610766241365.tmp

  • Вставьте эту ссылку в адресную строку компьютера. эта папка откроется.
  • В этой папке найдите соответствующий файл, и вы легко получите шестнадцатеричный файл своего кода.
Примечание:
  • Фактически, при загрузке кода на платы Arduino программное обеспечение Arduino создает шестнадцатеричный файл кода во временной папке, и после загрузки кода он удаляет этот шестнадцатеричный файл.
  • Вот почему мы не получаем шестнадцатеричный файл, но, выбрав опцию, вы можете легко получить шестнадцатеричный файл, а затем использовать его для любых целей.
  • Вот видео, в котором я показал вам Как получить шестнадцатеричный файл из Arduino, надеюсь, это поможет:

На сегодня все, и я думаю, что это был довольно простой учебник, но все же, если вы есть вопросы то задавайте в комментариях и я их решу. до следующего урока, будьте осторожны !!! :)

.Сборка

- Как декомпилировать файл .hex в C ++ для Arduino?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.

как читать шестнадцатеричный файл из Arduino через порт USB?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Связаться с разработчиками
.

Как загрузить файл .hex в Arduino Uno через USB с устройства Android?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
.

Где найти выходные двоичные файлы Arduino и файлы Hex

Вы можете использовать обычный программатор AVR ISP для загрузки эскизов Arduino на плату Arduino или в микроконтроллер AVR в вашей собственной схеме, такой как ATmega328P, ATmega8 или ATmega2561, но сначала вам нужно знать, как найти шестнадцатеричные файлы, которые программист потребности. По какой-то причине Arduino IDE максимально усложняет эту задачу. В этом посте показано, как их найти, а также как заставить Arduino разместить их в более удобном месте для поиска в будущем.

Любому интернет-провайдеру потребуется то, что Arduino называет выходными двоичными файлами, а остальной мир называет HEX-файлами. Они создаются, когда вы проверяете / компилируете свой скетч, и содержат данные, необходимые микроконтроллеру AVR для запуска. IDE Arduino создает их во временных папках в ваших пользовательских библиотеках или в папках / tmp на MAC, с типичным путем, подобным этому

C: \ Documents and Settings \ ваше_имя_пользователя \ Local Settings \ Temp \ build3526495849735274299.tmp.

Это меняется с каждой сборкой, что очень затрудняет их поиск, особенно самую последнюю версию.Лучший способ - изменить путь сборки в Arduino, чтобы он поместил их в какое-то разумное место.

Запустите Arduino IDE и выберите File -> Preferences . Появится это диалоговое окно,

Диалог настроек Arduino

Включите Показывать подробный вывод во время компиляции , чтобы мы могли видеть, что происходит. Это может пригодиться позже и всегда может быть снова выключено. Внизу указан путь к вашему файлу preferences.txt, который мы собираемся редактировать. Этот путь отличается в разных операционных системах и в некоторых случаях может быть скрыт вашей системой.Если вы не можете найти этот путь в проводнике, попробуйте Организовать -> Параметры папок и поиска -> Вкладка «Просмотр» и выберите Показать скрытые файлы, папки и диски.

После того, как вы нашли файл preferences.txt , закройте IDE Arduino и откройте этот файл в текстовом редакторе, таком как Блокнот. Добавьте путь сборки в любом месте файла. Вот пример, но выберите ваше собственное предпочтительное расположение папки.

build.path = C: \ Myproject

Важное примечание: Вы должны создать эту пустую папку сейчас, поскольку Arduino этого не сделает и выдаст ошибки.

Сохраните файл, снова откройте Arduino и снова проверьте / скомпилируйте свой скетч. На этот раз нужные нам выходные файлы всегда должны появляться в папке, которую вы добавили в файл preferences.txt. Этот путь также должен появиться ближе к концу окна вывода Arduino после успешной компиляции.

Если все в порядке, ваша папка должна быть заполнена файлами вывода, в основном с расширениями .o и .d. Они используются компоновщиком и могут игнорироваться. Это будут важные файлы, в которых скетч называется Blink1.ino, так что ищите собственное имя скетча -

  • blink1.ino.cpp - выходной файл C, на самом деле C ++
  • blink1.ino.elf - выходной файл для отладчика
  • blink1.ino.eep - файл EEPROM для программатора
  • blink1.ino.hex - flash (код) файл для программатора

Файл C (.cpp) и файл Elf (.elf) можно использовать в среде разработки AVR Studio, если вы хотите отказаться от простого использования Arduino IDE. Мы расскажем об этом позже. Важными файлами для программиста являются файлы.Файлы Hex и .EEP. Если вы использовали библиотеку EEPROM Arduino для добавления данных во внутреннюю EEPROM AVR, то они будут в файле .EEP, в противном случае этот файл все еще будет существовать, но будет пустым.

Все эти усилия, но теперь у нас есть файл .hex, который необходим, если мы хотим использовать нормального ISP AVR. Преимущество этого подхода заключается в том, что теперь каждый раз, когда мы меняем и перестраиваем наш скетч, расположение выходного шестнадцатеричного файла не меняется в отличие от поведения Arduino по умолчанию.

Теперь мы можем найти шестнадцатеричный файл и посмотреть, как использовать AVR ISP, например Kanda USB AVR ISP Programmer, для программирования микроконтроллера AVR.

Как программировать Arduino с помощью AVR ISP Programmer

.

Смотрите также