В китайском интернет-магазине AliExpress была куплена отладочная плата с микроконтроллером ATmega328P, совместимая с Arduino Pro Mini и рассмотренная в предыдущей статье. В статье была показана распаковка, комплектация и быстрая проверка работоспособности. Было приведено краткое описание и основные отличия от оригинальной отладочной платы. Предыдущую статью вы можете посмотреть по ссылке.
Если кто не знаком с данным вариантом отладочной платы, то рекомендую прочитать предыдущую статью, а в этой же статье я подробно опишу как использовать отладочную плату Arduino Pro Mini без BootLoader-а и как работать с ней без использования среды разработки Arduino IDE. Так же покажу Мой вариант простейшего самодельного COM-ISP программатора для прошивки микроконтроллеров AVR и отладочных плат на их основе.
Отладочная плата Arduino Pro Mini представляет из себя печатную плату с установленным микроконтроллером Atmega328P и минимально необходимой обвязкой для него. В отличие от обычного, отдельно купленного микроконтроллера Atmega328P, в установленный на Arduino Pro Mini микроконтроллер загружена небольшая программа, которая называется BootLoader. Эта программа производит самопрограммирование микроконтроллера во время нажатия кнопки «Upload» в среде Arduino IDE и производит коммуникацию со средой разработки по интерфейсу UART через выводы 0 (RX) и 1 (TX) отладочной платы.
На самом деле это весьма удобно, когда преобразователь интерфейса USB-UART установлен на самой отладочной плате, как например в случае с платами Arduino UNO или Arduino Nano. Но рассматриваемая в данной статье отладочная плата выбрана не случайно, потому что в своём составе она не имеет указанного преобразователя интерфейса, и для её программирования в любом случае придётся подключать отдельный программатор, будь то преобразователь USB-UART, или другой. Существует ещё несколько разновидностей отладочных плат Arduino без преобразователя интерфейса, и описываемый здесь способ применим и к ним.
Считывать и записывать программы мы будем по интерфейсу внутрисхемного программирования ISP, для которого стандартно отведено шесть выводов, и на отладочной плате Arduino Pro Mini это выводы:
- 11 — MOSI,
- 12 — MISO,
- 13 — SCK,
- RST — сброс,
- VCC — стабилизированное напряжение питания +5 В,
- GND — общий провод,
Это стандартные выводы шины внутрисхемного программирования ISP, имеющейся у большинства микроконтроллеров AVR, и по этой шине можно записывать/считывать программу и FUSE-биты в/с микроконтроллер. Для данного интерфейса существует распространённый разъём с шестью или десятью контактами:
Что же Нам даёт программирование по шине ISP? Оно имеет как преимущества, так и недостатки, и один из недостатков, это использование на два провода больше, чем в случае с UART. Зато появляется возможность напрямую работать с памятью микроконтроллера и загружать уже скомпилированные программы сторонними средствами. Больше нет необходимости в BootLoader-е и удалив его освобождается 2 Кбайт пространства в области программной памяти. Так же можно считывать программы из памяти микроконтроллера и менять его настройки с помощью установки нестандартных FUSE-бит. Простыми словами после удаления программы-загрузчика микроконтроллер перестаёт быть привязанным к среде разработки Arduino IDE.
COM-ISP программатор
Для начала представляю Вашему вниманию схему и фотографии применённого здесь простейшего COM-ISP программатора. Он очень распространён и весьма популярен, потому что не содержит дефицитных радиоэлементов и прост в изготовлении. Единственное условие для его использования — это наличие COM-порта на Вашем компьютере. Программатор состоит из нескольких диодов и резисторов с добавленным мною фильтром питания прошиваемого микроконтроллера на дросселе и конденсаторе:
Для питания программируемого микроконтроллера используется USB-кабель, а дроссель фильтра питания можно установить с индуктивностью 0,2-0,5 mH, или же совсем отказаться от него. Цвета выводов программатора на схеме обозначены в соответствии с моим вариантом сборки, в Вашем же случае эти цвета могут отличатся и быть по Вашему усмотрению. Сборка выполнена навесным монтажом на выводах COM-порта и полностью умещается в его корпусе:
В качестве выходной части использовались отдельные провода с разъёмами на концах. Для удобства опознавания выводов программатора к нему скотчем был приклеен листочек с цветными обозначениями, соответствующими цветам проводов с выводами для программирования:
В интернете можно найти много разновидностей данного программатора, и как и все остальные, мой вариант при испытаниях показал простоту использования и надёжность. Главное правило при этом — не использовать слишком длинные проводники от самого программатора до микроконтроллера — их рекомендуемая длина составляет до 15 см.
Добавление программатора в среду разработки
Перейдём к Нашей отладочной плате и немного доработаем среду разработки Arduino IDE под себя. Во время доработки была установлена и использовалась среда разработки Arduino IDE версии 1.8.2. В других версиях могут быть отличия.
По умолчанию программатора COM-ISP нет в списке программаторов Arduino IDE, и его поддержку нужно добавить в конфигурационный файл, а точнее нужно будет прописать его в 2-х файлах Arduino IDE. Путь первого файла hardwarearduinoavrprogrammers.txt считая от корневого каталога, где установлена и находится Arduino IDE, а второго hardwaretoolsavretcavrdude.conf
Здесь и в дальнейшем все изменения в конфигурационных файлах нужно производить редактором, корректно отображающим переход строки, таким как например Notepad++. Представляю Вам шаблоны для добавления программатора. В текстовом документе «programmers.txt» в самом начале нужно прописать следующие строки:
andro.name=AndroCOM
andro.communication=serial
andro.protocol=andro
andro.program.protocol=andro
andro.program.tool=avrdude
andro.program.extra_params=-P{serial.port}
В файле же «avrdude.conf» до программатора «avrisp» нужно будет добавить вот такую запись:
programmer
id = «andro»;
desc = «Andro COM programmer, reset=4 sck=7 mosi=3 miso=8»;
type = «serbb»;
connection_type = serial;
reset = 4;
sck = 7;
mosi = 3;
miso = 8;
;
Всё это должно выглядеть следующим образом:
На моём примере я показал, как можно добавить простой самодельный COM-ISP программатор в среду Arduino IDE, а Вы, изменяя параметры можете добавить программатор по своему усмотрению. После запуска среды программатор должен появиться на вкладке «Tools» в пункте «Programmer»:
Добавление поддержки платы без загрузчика
Так как в дальнейшем планируется всегда программировать рассматриваемую здесь плату через интерфейс ISP, то настало время избавится от программы-загрузчика в памяти микроконтроллера, которая позволяет загружать рабочие программы через последовательный интерфейс UART, и добавить поддержку отладочной платы Arduino Pro Mini без bootloader-а в среду разработки Arduino IDE. Для этого нужно отредактировать текстовый документ с описанием поддерживаемых отладочных плат и добавить в него запись с характеристиками нашей платы и указать необходимые FUSE-биты. Текстовый документ с описанием поддерживаемых отладочных плат находится по пути hardwarearduinoavrboards.txt считая от корневого каталога среды разработки Arduino IDE:
В тексте нужно указать название добавляемой платы, максимальный размер загружаемой программы, максимальной размер оперативной памяти, необходимые значения FUSE-бит и тактовую частоту микроконтроллера:
## Arduino Pro or Pro Mini (5V, 16 MHz no boot) w/ ATmega328
## ————————————————-
pro.menu.cpu.16MHzatmega328nb=ATmega328 (5V, 16 MHz no boot)
pro.menu.cpu.16MHzatmega328nb.upload.maximum_size=32768
pro.menu.cpu.16MHzatmega328nb.upload.maximum_data_size=2048
pro.menu.cpu.16MHzatmega328nb.upload.speed=9600
pro.menu.cpu.16MHzatmega328nb.bootloader.low_fuses=0xFF
pro.menu.cpu.16MHzatmega328nb.bootloader.high_fuses=0xD9
pro.menu.cpu.16MHzatmega328nb.bootloader.extended_fuses=0xFD
pro.menu.cpu.16MHzatmega328nb.build.mcu=atmega328p
pro.menu.cpu.16MHzatmega328nb.build.f_cpu=16000000L
Поясню что изменилось по сравнению с такой же платой с загрузчиком и что означают эти строки:
- Указывание максимальной используемой памяти микроконтроллера в 32 кБайт;
- Значение high-fuses 0xD9 или же, что то же самое 11011001 в двоичной системе.
Эти FUSE-биты устанавливаются в микроконтроллере при нажатии на вкладке «Tools» пункта «Burn Bootloader» и указывают микроконтроллеру не выделять место в памяти для программы-загрузчика и отключают переход к загрузчику после сброса. Запись надо добавить в том месте, где находится описание параметров «Arduino Pro or Pro Mini» и она должна выглядеть следующим образом:
После успешного добавления и сохранения изменений, при запуске Arduino IDE, на вкладке «Tools», при выбранной плате «Arduino Pro or Pro Mini», в пункте «Processor» должен появится вариант «ATmega328 (5V, 16 MHz no boot)». Для работы с отладочной платой без использования программы-загрузчика нужно выбрать именно этот вариант:
Прежде чем начать работать с платой без загрузчика и программировать её, нужно установить конфигурационные FUSE-биты в микроконтроллере. Так как с помощью Arduino IDE установка FUSE-бит происходит во время загрузки bootloader-а, то после выбора добавленной нами платы нужно нажать на пункт «Burn Bootloader» как описывалось ранее. Запись программы-загрузчика в этом случае не произойдёт, но будут запрограммированы необходимые FUSE-биты. Для этого нужно соединить программатор с отладочной платой по приведённой выше распиновке шины внутрисхемного программирования ISP и подключив программатор к COM-порту компьютера и подав питание через USB-кабель произвести вышеуказанные действия:
Так как в добавленном нами варианте платы без загрузчика мы не указали путь к HEX-файлу bootloader-а, то в среде Arduino IDE при нажатии на пункт «Burn Bootloader» произойдёт запись лишь FUSE-бит и будет выдана ошибка, что не найден файл bootloader-а:
Arduino: 1.8.2 (Windows), Board: «Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz no boot)»
avrdude: can’t open input file C:arduino-1.8.2hardwarearduinoavr/bootloaders/{bootloader.file}: No such file or directory
avrdude: read from file ‘C:arduino-1.8.2hardwarearduinoavr/bootloaders/{bootloader.file}’ failed
Error while burning bootloader.
Это не критично, и если Вы дошли до этого этапа и у Вас точно такая же ошибка, значит необходимые FUSE-биты установились и можно приступить к дальнейшему использованию платы. Вы можете писать и компилировать программы в Arduino IDE и загружать их с помощью ISP-программатора, полностью используя всю память микроконтроллера под свои нужды. Получается выигрыш в 2 кБ, и это не так уж и много, но тем, кто постоянно работает с внутрисхемным программированием или производит запись HEX-файлов сторонними программами bootloader просто не нужен.
Для достоверности и полной убеждённости в работоспособности платы после таких манипуляций, в микроконтроллер была загружена программа из стандартного примера Arduino IDE, мигающая светодиодом без функции «Delay»
Загрузка программы в микроконтроллер прошла без проблем и осложнений, и после его запуска в нормальном режиме можно наблюдать результат мигания светодиодом с установленным интервалом две секунды:
Убедившись в работоспособности и корректной отработке временных интервалов с данным способом загрузки самодельным программатором в микроконтроллер без bootloader-а, далее была проверена работа программы из предыдущей статьи, в которой описывалась сама отладочная плата. Указанная программа по сигналу с датчика препятствия на определённое время плавно включает освещение, и ещё более плавно выключает его по истечению заданного периода. При загрузке программ нестандартным программатором в микроконтроллер без программы-загрузчика нужно не забывать указывать подключённый программатор и производить загрузку через него из вкладки «Sketch» выбрав опцию «Upload Using Programmer». Компилирование и загрузка с применёнными настройками прошли успешно и упомянутая ранее программа загрузилась в память микроконтроллера:
Работа с отладочной платой через Uniprof
Так же для загрузки скомпилированных HEX-файлов в микроконтроллер можно воспользоваться описанным здесь самодельным COM-ISP программатором и программой Uniprof, но по умолчанию она не поддерживает микроконтроллер Atmega328, потому что его подписи и данных нет в каталоге подписей микроконтроллеров программы Uniprof. Для того, что бы Uniprof опознала Atmega328 и могла работать с ним, нужно создать текстовый документ в директории «SIGNATURES» с названием микроконтроллера и прописать в нём необходимую информацию, включая подпись микроконтроллера, адреса памяти и поддерживаемые FUSE-биты:
; Atmega328
;
; (c)Andro Feb-2018
;—————
$95
$14
$7FFF
$3FF
64
[o]
;— LOCK —
LB1(1)
LB2(1)
BLB01(1)
BLB02(1)
BLB11(1)
BLB12(1)
—
—
; FUSE
CKSEL0(0)
CKSEL1(1)
CKSEL2(0)
CKSEL3(0)
SUT0(0)
SUT1(1)
CKOUT(1)
CKDIV8(0)
; ———-fuse high
BOOTRST(1)
BOOTSZ0(0)
BOOTSZ1(0)
EESAVE(1)
WDTON(1)
SPIEN(0)
DWEN(1)
RSTDISBL(1)
; ———-fuse ext
BODLEVEL0(1)
BODLEVEL1(1)
BODLEVEL2(1)
—
—
—
—
—
; Atmega328P
;
; (c)Andro Feb-2018
;—————
$95
$0F
$7FFF
$3FF
64
[o]
;— LOCK —
LB1(1)
LB2(1)
BLB01(1)
BLB02(1)
BLB11(1)
BLB12(1)
—
—
; FUSE
CKSEL0(0)
CKSEL1(1)
CKSEL2(0)
CKSEL3(0)
SUT0(0)
SUT1(1)
CKOUT(1)
CKDIV8(0)
; ———-fuse high
BOOTRST(1)
BOOTSZ0(0)
BOOTSZ1(0)
EESAVE(1)
WDTON(1)
SPIEN(0)
DWEN(1)
RSTDISBL(1)
; ———-fuse ext
BODLEVEL0(1)
BODLEVEL1(1)
BODLEVEL2(1)
—
—
—
—
—
Я создал и заархивировал два текстовых документа для микроконтроллеров Atmega328 и Atmega328P, и распаковав эти файлы в папку «SIGNATURES» программы Uniprof Вы сможете добавить поддержку указанных микроконтроллеров в программу:
Данные файлы вы можете скачать по ссылкам в конце статьи
Соединив ранее запрограммированную отладочную плату с нашим самодельным программатором и запустив на компьютере программу Uniprof видно, что микроконтроллер отладочной платы определяется как mega328p, и теперь уже можно свободно работать с ним, как с любым другим обычным микроконтроллером, поддерживаемым программой Uniprof (если микроконтроллер не опознаётся, нужно указать другой COM-порт, установить галочку «Торомоз» или выбрать микроконтроллер из списка):
С этого момента Я подробно, с иллюстрациями, опишу как пользоваться программой Uniprof для чтения и записи программ и FUSE-бит микроконтроллера. Так же Я покажу как скомпилировать и загрузить программу, написанную в среде Arduino IDE, используя самодельный COM-ISP программатор и программу Uniprof.
Программа Uniprof является превосходным инструментом для работы с микроконтроллерами AVR. Она имеет простой и понятный дружелюбный вид, очень удобна и умеет считывать и записывать FUSE-биты, считывать программную память и область EEPROM микроконтроллера, и сохранять считанные данные в файл, а так же записывать данные из файла в микроконтроллер. Имеется функция сравнения данных в памяти микроконтроллера с данными в файле и функция «Торомоз» для работы с низкоскоростными микроконтроллерами.
Каждый раз, перед произведением каких-либо действий над микроконтроллером, рекомендуется считать так называемые FUSE-биты — это определённые ячейки памяти, в которых хранятся настройки микроконтроллера (тактовая частота, размер загрузочного сектора и др.). В разных программах для работы с микроконтроллерами указывание значений этих ячеек происходит по разному, и всегда перед изменением этих значений и их записью в микроконтроллер хорошо бы сначала считать их, что бы понять каким образом потом эти значения выставлять. Не будем углубляться в историю, просто коротко скажу, что издавна сложилось так, что если какая-то функция микроконтроллера должна быть задействована, то для этого в соответствующей ячейке должен быть записан ноль (бит сброшен), а если функция не нужна и её использование нужно запретить, то в соответствующую ячейку записывается единица (бит установлен). В программе Uniprof, во время настройки FUSE-бит, галочками отмечаются функции, которые нужно запретить, в других программах бывает наоборот.
После запуска программы Uniprof и опознавания ею микроконтроллера, для работы с FUSE-битами нужно нажать кнопку «FUSE» на панели инструментов. Перед этим действием рекомендуется установить галочку «Торомоз» для избежания ошибок чтения/записи:
После нажатия на кнопку «FUSE» откроется небольшое окно с четырьмя колонками с перечнем поддерживаемых данным микроконтроллером FUSE-бит. Нажав в нужной колонке кнопку «Read» можно считать данные, записанные в соответствующей ячейке, и установив необходимые значения, записать их в микроконтроллер нажатием на кнопку «Write» :
Для считывания памяти программ микроконтроллера нужно нажать кнопку «Read» на панели инструментов программы Uniprof с установленной галочкой «PROGRAM» :
Далее начнётся процесс считывания данных, прогресс которого отображается в самой нижней части программы:
После успешного завершения, содержание ячеек памяти программ отобразится в таблице слева:
Содержимое памяти микроконтроллера можно сохранить в файл для дальнейшего его использования. Для этого, с установленной галочкой «HEX», нужно нажать на кнопку «HEX» в панели инструментов, и указав расположение сохраняемого файла и задав его имя, сохранить файл на компьютере:
Кроме считывания данных с памяти микроконтроллера и сохранения их в файл можно так же загрузить данные из файла в память микроконтроллера. Так где же взять файл с готовой рабочей программой для загрузки в микроконтроллер? Можно использовать файл со считанными данными из другого микроконтроллера, при условии, что микроконтроллеры абсолютно одинаковые и работают с одинаковыми настройками. Или же взять скомпилированный файл из какой-нибудь среды разработки. Далее я покажу как можно скомпилировать и загрузить программу из среды разработки Arduino IDE с помощью Uniprof.
Среда разработки Arduino IDE позволяет осуществить быстрый старт по программированию микроконтроллеров AVR не углубляясь в знания языка программирования Си или Ассемблера. Существует много надёжных форумов, посвящённых Arduino, где можно найти готовые исходные коды (скетчи) на любой вкус. В среде разработки Arduino IDE можно легко скомпилировать программу в HEX-файл, а потом уже забрав его куда угодно, можно загрузить в соответствующий микроконтроллер любым удобным и возможным способом.
Для этого в среде разработки, открыв исходный текст программы и выбрав отладочную плату с соответствующим микроконтроллером, на вкладке «Sketch» нужно нажать на пункт «Export compiled Binary» или на сочетание горячих клавиш «Ctrl+Alt+S»
После указанных действий начнётся компилирование HEX-файла программы, который в случае успешного завершения будет сохранён в каталог со скетчем:
В дальнейшем для записи программы в микроконтроллер не понадобится среда разработки Arduino IDE и компилирование исходного текста. Готовый HEX-файл можно отправить тому, у кого совсем нет среды разработки, но есть возможность записи программы в микроконтроллер, например с помощью UniProf. Прежде чем записать новую программу в кристалл, его предварительно нужно очистить. Для этого в Uniprof на панели инструментов надо нажать на кнопку с красной надписью «Erase»
Так как после совершения данного действия будет произведено стирание памяти микроконтроллера, то вслед за нажатием на кнопку «Erase» будет сделан запрос на подтверждение данного действия:
После подтверждения на стирание памяти микроконтроллера произойдёт очистка кристалла и будет выдано сообщение о готовности:
Теперь уже можно произвести запись новой программы в чистый микроконтроллер, для чего надо открыть HEX-файл с кодом программы нажатием на кнопку «HEX» в панели инструментов:
После выбора и открывания HEX-файла таблица слева заполнится содержанием его кода, которым теперь можно заполнить ячейки памяти микроконтроллера нажатием на кнопку «Prog» в панели инструментов:
После указанного действия начнётся процесс записи исполняемого кода в память микроконтроллера, прогресс которого, как и прогресс процесса чтения, отображается в самой нижней части программы Uniprof:
Успешно записав код программы в память микроконтроллера, в случае надобности можно установить необходимые FUSE-биты. В данном случае в микроконтроллере отладочной платы записаны ранее установленные через среду разработки FUSE-биты, посмотреть которые можно войдя в соответствующий раздел нажав на кнопку «FUSE» в панели инструментов, а далее в открывшемся окне на кнопку «Read» интересующего пункта:
Если на каком-то этапе работы с микроконтроллером необходимо сравнить записанные в него данные с данными из исходного файла, то в программе Uniprof следует открыть файл с исполняемым кодом и на панели инструментов нажать на кнопку «Test». После этого начнётся считывание данных с кристалла и сравнение содержимого ячеек памяти с таблицей:
При завершении считывания памяти микроконтроллера будет выдано сообщение, в котором, при совпадении данных с кристалла и HEX-файла, будет указано, что содержание обеих источников идентично:
На этом программирование микроконтроллера Atmega328P без надобности butloader-а, установленного на отладочную плату Arduino Pro Mini, осуществляемое использованием среды разработки Arduino IDE и/или программы UniProf, подошло к концу. В другой статье будет показан подобный способ программирования микроконтроллера Atmega88, установленного на плате от использованного и отслужившего свой срок устройства, рассмотренного в статье по ссылке.
Так же в другой статье был рассмотрен светодиодный драйвер с возможностью диммирования. А потому что используемый здесь исполняемый код предназначен для управления освещением с задействованием ШИМ, то для проверки, упомянутый светодиодный драйвер вместе с мощным светодиодом был подключен к, запрограммированной описанным методом, отладочной плате выводом «Dim» для управления яркостью светодиода:
После подачи питания и срабатывания датчика препятствия, сверхъяркий светодиод быстро набирал яркость свечения, доходя до максимума, и после истечения заданного времени свечения, яркость плавно уменьшалась до полного погасания:
Проверив работоспособность описанного в статье метода на практике и наглядно показав пример работы запрограммированного данным способом микроконтроллера, тему статьи можно считать исчерпанной. Если Вы не читали предыдущие статьи, то настоятельно рекомендую хотя бы мельком просмотреть их, потому что там подробно описаны отладочная плата Arduino Pro Mini с программой управления освещением и модуль светодиодного драйвера со сверхъярким светодиодом белого свечения.
Ссылки на связанные статьи:
- Отладочная плата с микроконтроллером ATmega328: /me/arduino/arduino233.php
- Светодиодный драйвер повышенной точности на микросхеме LM3406HV: /me/pitanie/5-354.php
- Разборка электропривода Danfoss AME 120 NL: /me/promelectr/promelectr35.php
Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот
Список радиоэлементов для сборки COM-ISP программатораUSB
РазъёмUSB Type A male1
для подачи питанияCOM
РазъёмDB9 female1
подключение к COM-портуISP
РазъёмDupont Wire Female Pin6
подключение к микроконтроллеру1N4148
Выпрямительный диод1N41483
высокочастотный диод1k
Резистор1 кОм3
1.8k
Резистор1.8 кОм3
510
Резистор0.51 кОм1
100
Электролитический конденсатор100 мкФ1
фильтр питания0.27 mH
Дроссель0.27mH1
фильтр питанияДобавить все
Скачать список элементов (PDF)
Прикрепленные файлы:
- COM-ISP_Programmer_colors.pdf (66 Кб)
- UniProf_with_mega328_by_Andro.rar (353 Кб)
- mega328p.rar (1 Кб)
- mega328.rar (1 Кб)
- Sensor_with_PWM.ino.ino (3 Кб)
- Sensor_with_PWM.ino.ino_eightanaloginputs.hex (4 Кб)