Предисловие
При разборке большинства отслуживших свой срок работы, промышленных устройств на микроконтроллерах AVR, чаще всего встречаются микроконтроллеры ATmega88. Рабочие чипы не стоит выбрасывать, так как они уже припаяны к плате и большинство их выводов удобно выведены к тем или иным радиоэлементам. Продвинутые программисты могут писать для них программы на языке «C» или даже на ассемблере, но для начинающих легче всего освоится в среде Arduino IDE. К тому же Arduino уже набрала популярность и в сети есть много примеров и готовых программ для различных задач. Хотя микроконтроллер mega88 и не поддерживается в данной среде, но произведя некоторые изменения в конфигурационном файле, можно легко добавить тип платы с этим или другим микроконтроллером и писать программы с последующей компиляцией и загрузкой.
На сайте имеется прекрасная статья «Отладочная плата для устройств на МК Atmega8/48/88/168/328», но в отличии от настоящей публикации там использован микроконтроллер в DIP-корпусе и не описана возможность работы с платой через среду разработки Ардуино. На данном же примере будет подробно, с иллюстрациями, показано что нужно добавить и как это сделать. Автором так же была разработана печатная плата для установки на неё отдельно имеющегося микроконтроллера ATmega88/168/328 в корпусе поверхностного монтажа любого из трёх типов.
Использование платы с микроконтроллером Atmega88
В предыдущей статье была произведена разборка электропривода Danfoss AME 120 NL, и после разборки осталась печатная плата с AVR микроконтроллером ATmega88 и некоторыми радиоэлементами:
На рисунке ниже представлена принципиальная схема того, что осталось уцелевшим на данной плате после разборки:
На изображении печатной платы, возле контактных площадок, цифрами были отмечены соединённые с этими площадками соответствующие порты ввода-вывода микроконтроллера:
Но при написании программы в среде Arduino IDE обращение происходит не прямо к портам ввода-вывода, а к определённым названиям и нумерации соответственно отладочной плате Arduino. В данном конкретном примере на плате от разобранного устройства нет преобразователя USB-TTL и имеется только минимально необходимая обвязка микроконтроллера. Поэтому по количеству выводов и по обвязке она больше похожа на Arduino mini и Arduino Pro mini. Но в Arduino Pro mini установлен микроконтроллер ATmega168 или ATmega328 и работают они с кварцевым резонатором на частотах 16 или 8 МГц, а у нас имеется ATmega88 без кварцевого резонатора. Далее будет показано как добавить поддержку данной платы с микроконтроллером ATmega88 в Arduino IDE и как для этой платы компилировать и загружать программу, написанную в среде разработки Ардуино.
Выводы Arduino Pro mini
Так как мы будем работать с платой на микроконтроллере mega88 по аналогии с Arduino Pro mini, то в первую очередь рассмотрим с каким выводом микроконтроллера соединён каждый именованный вывод платы. Итак, отладочная плата Arduino Pro mini имеет 14 цифровых выводов, которые могут быть использованы как входы или как выходы, и 8 аналоговых выводов с разрешением 10 бит каждый.
Была составлена, и на рисунке ниже показана схема соответствия выводов платы Arduino Pro mini выводам микроконтроллера в 32-х выводном SMD-корпусе для поверхностного монтажа:
Теперь уже на изображении печатной платы, возле контактных площадок, цифрами были отмечены соответствующие выводы Ардуино:
Создание собственной отладочной платы
Далее была составлена принципиальная схема авторской отладочной платы с минимально необходимой обвязкой микроконтроллера, которую сможет собрать каждый желающий. Не смотря на свою простоту, плата имеет весь присущий Ардуино функционал, кроме порта USB, которого нет и на оригинальной плате Pro Mini, который и не требовался для дальнейших проектов, так как плату планировалось использовать в устройствах с низким энергопотреблением. Основные технические характеристики и параметры самодельной отладочной платы, совместимой с Arduino, приведены в таблице:
Параметр | Значение |
---|---|
Рабочее напряжение | 5 (3,3) Вольт |
Напряжение питания | 8 — 16 Вольт |
Установленный микроконтроллер | ATmega88 |
Количество цифровых выводов | 14 |
Число аналоговых входов | 8 |
Допустимый ток одного вывода | 10 мА |
Тактовая частота | 8 (1) МГц |
В проекте были оставлены оба светодиода для случая необходимости проверки как цифрового, так и аналогового вывода. Подключены светодиоды через положительный полюс +5V для разгрузки выводов питания микроконтроллера:
На схеме предусмотрена перемычка, разрывающая цепь интегрального стабилизатора напряжения вместе со светодиодом индикации питания, необходимая для снижения потребляемой мощности при автономном питании от батарей. Так же один из аналоговых входов, через делитель напряжения соединён с входным не стабилизированным источником питания, для определения наличия и измерения значения уровня питающего напряжения.
Так как название «Arduino» является зарегистрированным товарным знаком, то его использование в собственных проектах сопряжено с определёнными трудностями и ограничениями. Для названия описываемой в статье платы было использовано имя «ANDROino M88-V1» в честь её автора Andro и установленного на ней микроконтроллера MEGA88, а V1 обозначает что это первая версия разработки, и при дальнейших изменениях можно использовать возрастающие порядковые номера и не будет путаницы и конфликта между различными версиями одного и того же устройства.
Печатная плата
Для самостоятельной сборки, в программе «Sprint-Layout 6» была разработана печатная плата. Плата рассчитана на установку большинства радиокомпонентов поверхностного монтажа с возможностью использования микроконтроллера ATmega88/168/328 в корпусах типа TQFP, QFN или MLF. Изначально чертёж платы задуман для реализации с двухсторонним фольгированием, но можно использовать так же односторонний материал, а там где должны быть проводящие дорожки с обратной стороны платы, предусмотрена установка проволочных перемычек, и эти участки соответствующим образом отмечены на чертеже. Это сделано для возможности изготовления устройства начинающими радиолюбителями, у которых пока нет навыков или средств для изготовления двухсторонних печатных плат.
Рисунок верхней стороны печатной платы:
На двухстороннем варианте имеются сквозные отверстия, в которые нужно вставить отрезки провода и припаять их с обеих сторон для соединения токопроводящих участков фольги друг с другом.
Рисунок нижней стороны двухсторонней печатной платы:
В случае с односторонним фольгированием разъёмы и перемычку JP1 придётся установить снизу, припаяв их к токопроводящим фольгированным участкам с верхней стороны платы. Так же нужно будет установить ранее упомянутые проволочные перемычки, ненужные при травлении двух слоёв фольги, но необходимые для соединения определённых участков при применении фольгирования только с верхней стороны. Перемычки можно расположить как с нижней стороны платы, так и со стороны расположения радиокомпонентов.
Рисунок нижней стороны односторонней печатной платы:
Также нужно обратить внимание на то, что при расположении ICSP — разъёма с нижней стороны платы, зеркально будет отражена последовательность его контактов и нужно будет принять меры во время подключения к нему программатора, изготовив переходник или соединив каждый его вывод отдельным проводником.
Все необходимые файлы для травления печатной платы находятся в конце статьи.
Добавление платы в среду разработки Ардуино
После изготовления собственной отладочной платы с микроконтроллером ATmega88, для написания скетчей и работы с ней в среде разработки Arduino IDE, нужно добавить её поддержку и корректно определить некоторые параметры, такие как тип установленного микроконтроллера, его конфигурационные FUSE — биты, частота тактирования процессора, объём доступной памяти и выводы с подключенными светодиодами.
Нужно будет произвести изменения в одном из имеющихся из конфигурационных файлов и добавить несколько собственных. Все изменения в конфигурационных файлах нужно производить текстовым редактором, корректно отображающим переход строки, таким как например Notepad++. Во время добавления отладочной платы собственного производства была установлена и использовалась среда разработки Arduino IDE версии 1.8.5. В других версиях могут быть отличия.
Среду разработки можно бесплатно скачать с официального сайта проекта Ардуино по ссылке https://www.arduino.cc/en/main/software где имеются версии для Windows, Mac OS X и Linux. Для Windows можно выбрать установщик, аппликацию или ZIP-файл для портативной работы.
Все пути к указанным файлам и папкам будут идти считая от корневого каталога расположения среды разработки, где бы он не находился. В данном случае каталог называется «arduino-1.8.5» и все необходимые директории установлены внутри него. Для начала нужно отредактировать текстовый файл “boards.txt” с описанием отладочных плат, расположенный по пути «hardwarearduinoavr»
Описав характеристики собственной платы, в него нужно добавить следующую запись:
############################################################## andro.name=Andro Board andro.upload.tool=avrdude andro.upload.protocol=arduino andro.upload.maximum_size=8192 andro.upload.maximum_data_size=1024 andro.bootloader.tool=avrdude andro.bootloader.unlock_bits=0x3F andro.bootloader.lock_bits=0x0F andro.bootloader.extended_fuses=0xFD andro.bootloader.file=andro/null.hex andro.build.board=ANDRO andro.build.core=arduino andro.build.variant=andro_mega88 ## Andro Board on the ATmega88 (5V, 8 MHz) w/ ATmega88 ## ------------------------------------------------- andro.menu.cpu.8MHzatmega88=ATmega88 (5V, 8 MHz) andro.menu.cpu.8MHzatmega88.upload.speed=38400 andro.menu.cpu.8MHzatmega88.bootloader.low_fuses=0xE2 andro.menu.cpu.8MHzatmega88.bootloader.high_fuses=0xD5 andro.menu.cpu.8MHzatmega88.build.mcu=atmega88 andro.menu.cpu.8MHzatmega88.build.f_cpu=8000000L ## Andro Board on the ATmega88 (3.3V, 1 MHz) w/ ATmega88 ## ------------------------------------------------- andro.menu.cpu.1MHzatmega88=ATmega88 (3.3V, 1 MHz) andro.menu.cpu.1MHzatmega88.upload.speed=9600 andro.menu.cpu.1MHzatmega88.bootloader.low_fuses=0x62 andro.menu.cpu.1MHzatmega88.bootloader.high_fuses=0xD6 andro.menu.cpu.1MHzatmega88.build.mcu=atmega88 andro.menu.cpu.1MHzatmega88.build.f_cpu=1000000L
При добавлении в самое начало эта запись должна выглядеть следующим образом:
Далее надо определить номера выводов платы, к которым подключены внутренние светодиоды, и дать им логичные и понятные названия. Для этого в каталоге «hardwarearduinoavrvariants» нужно создать папку «andro_mega88», а в ней текстовый файл «pins_arduino.h»:
В созданном файле нужно сделать запись следующего типа:
#include "../standard/pins_arduino.h" #undef NUM_ANALOG_INPUTS #define NUM_ANALOG_INPUTS 8 #undef LED_BUILTIN #define LED_BUILTIN 7 #define RED_LED_BUILTIN 7 #define GREEN_LED_BUILTIN A1
Для простоты можно скопировать подобный файл из другого каталога описания выводов и произвести в нём необходимые изменения:
Обычно для загрузки программ в микроконтроллеры на отладочных платах Ардуино, используется записанная в сам микроконтроллер небольшая программа-загрузчик — «bootloader» — позволяющая наладить связь между микроконтроллером и средой разработки через последовательный порт передачи данных UART.
Но так как объём программной памяти микроконтроллера АТмега88 небольшой, то в рассматриваемом случае bootloader не применяется, и вся доступная память выделяется и используется под исполняемый код написанных программ. В таком случае на плате предусмотрен шести-контактный разъём внутрисхемного программирования для подключения ISP-программатора.
Но для избежания показа ошибок во время первичного конфигурирования и настройки микроконтроллера нужно указать хотя бы пустой файл бутлоадера, и для этого была создана папка “andro” в директории «hardwarearduinoavrbootloaders», а в ней текстовый файл «null.hex»:
В самом файле была сделана запись с минимально возможным корректным набором символов:
:020000000000FE :00000001FF
Произведённая запись должна выглядеть следующим образом:
После правильного выполнения всех указанных действий можно запускать среду разработки Arduino IDE, где во вкладке “Tools” > “Board:” появится добавленная ранее плата:
А на той же вкладке “Tools” в пункте “Processor:” будут варианты исполнения платы, в зависимости от тактовой частоты и рабочего напряжения:
Конфигурирование микроконтроллера
После выбора платы, перед первым её использованием, нужно соответствующим образом произвести настройку установленного на ней микроконтроллера. Для этого, с подключённым к плате программатором, на вкладке “Tools” всего лишь нужно выбрать пункт «Burn Bootloader»:
При этом в программную память микроконтроллера начнётся запись созданного ранее файла «null.hex» и будет произведена настройка необходимых FUSE-бит:
Запустив программу «UniProf» можно прочитать содержимое Flash-памяти и значения конфигурационных ячеек микроконтроллера:
По отображаемым данным можно видеть почти пустую область программной памяти и, задающие необходимые для правильной работы микроконтроллера, параметры конфигурационных бит:
Далее всегда во время тестирования, для проверки записанных данных и возможности обнаружения ошибки, будет использоваться программа UniProf. Если Вы не знаете как с ней работать, то советую прочитать интересную и познавательную статью «Arduino ProMini и UniProf», ссылка на которую находится в конце данной статьи.
Программная проверка
Теперь же для проверки работы программного кода и правильности функционирования отладочной платы напишем небольшую тестовую программу, с определённым интервалом попеременно переключающую установленные на плате светодиоды:
// Назначение выводов микроконтроллера для подключения светодиодов const byte RedLed = 7; // Вывод для красного светодиода const byte GreenLed = A1; // Вывод для зелёного светодиода const int delay_time = 2000; // ожидание 2 секунды void setup() { pinMode(RedLed, OUTPUT); // Назначение вывода микроконтроллера как выход pinMode(GreenLed, OUTPUT); // Назначение вывода микроконтроллера как выход } // Переключение сигналов на выводах void loop() { digitalWrite(RedLed, !HIGH); // зажигание красного светодиода digitalWrite(GreenLed, !LOW); // гашение зелёного светодиода delay(delay_time); // ожидание 2 секунды digitalWrite(RedLed, !LOW); // гашение красного светодиода digitalWrite(GreenLed, !HIGH); // зажигание зелёного светодиода delay(delay_time); // ожидание 2 секунды }
На вкладке «Sketch» выбрав пункт «Export compiled Binary» предварительно сохраняем скомпилированный двоичный файл исполняемого кода написанной программы. Для выполнения этого действия так же можно использовать сочетание горячих клавиш «Ctrl+Alt+S»:
В нижней зоне рабочего окна выдаётся информация о размере исполняемого кода, и необходимом для его работы объёме оперативной памяти микроконтроллера, а сам файл сохранился в формате «HEX» в той же папке, где находится скетч:
В микроконтроллер скомпилированный код программы загружается обычным способом с помощью программатора, выбрав на той же вкладке «Sketch» пункт «Upload Using Programmer», или используя сочетание горячих клавиш «Ctrl+Shift+U»:
Начнётся загрузка исполняемого кода в программную область памяти микроконтроллера и будут установлены определённые LOCK-биты:
После успешной загрузки снова запустим программу UniProf и проверим значения конфигурационных ячеек микроконтроллера:
Так же откроем ранее скомпилированный HEX-файл прошивки и сравним его с содержимым программной памяти микроконтроллера:
После сравнения можно убедиться, что содержимое двоичного файла и программной области идентично и исполняемый код программы в микроконтроллер записан без ошибок:
Низковольтный вариант с пониженной частотой
При низковольтном питании платы, или во время работы с пониженной тактовой частотой, для меньшего энергопотребления, в среде разработки нужно выбрать второй вариант пункта “Tools” > “Processor:”
Далее так же, как и в прошлый раз, нужно воспользоваться пунктом “Tools” > «Burn Bootloader» и записать необходимые данные в микроконтроллер:
Опять же после проверки конфигурационных ячеек можно убедится, что они настроены в соответствии с необходимыми условиями работы:
Снова загрузим скомпилированную по новым параметрам программу в память микроконтроллера:
И произведём экспортирование нового двоичного файла для работы на частоте 1 МГц с пониженным напряжением питания:
Открыв этот файл в программе UniProf и сравнив его с содержимым чипа, убеждаемся что FLASH-память прошита без ошибок и всё работает как надо:
Отсоединив вывод «Reset» программатора и запустив микроконтроллер в рабочем режиме, можно визуально наблюдать работу написанной программы попеременным миганием установленных на плате светодиодов с заданным интервалом времени:
Чтобы убедится в правильной настройке и отработке временных интервалов, время задержки между переключениями светодиодов было изменено в несколько раз, и программа с новыми параметрами снова была загружена в микроконтроллер:
Время мигания светодиодов изменилось и частота переключения соответственно возросла:
Для загрузки программ в микроконтроллер использовался рассмотренный в ранней статье COM-ISP программатор. Там же есть описание возможности его интеграции в среду разработки Arduino IDE, но при работе с микроконтроллером АТмега88 пришлось принять меры для увеличения таймингов в целях безошибочной загрузки программного кода в память чипа.
Текстовый файл «programmers.txt», в который были внесены изменения, находится в директории «hardwarearduinoavr»:
Изменения коснулись последней строки, в которую была добавлена опция задержки:
andro.name=Andro COM-ISP andro.communication=serial andro.protocol=andro andro.program.protocol=andro andro.program.tool=avrdude andro.program.extra_params=-P{serial.port} -i10
В редактируемом файле вся запись выглядит следующим образом:
Теперь, когда всё отлажено и правильно работает, можно приступать к написанию более сложных программ на Ардуино. Единственное, что надо учесть, это то, что на используемой плате микроконтроллер тактируется от внутреннего генератора со сравнительно низкой частотой. С одной стороны это даёт более низкое энергопотребление, а с другой нет возможности использовать плату там, где важны короткие и точные временные промежутки.
Эпилог
В добавок была написана программа, мигающая установленными на плате светодиодами с различной частотой, независимо друг от друга:
// Настройка выводов и задержек для светодиодов: #define greenLedPin GREEN_LED_BUILTIN // вывод для зелёного светодиода #define greenLedDelay 200 // полупериод миигания зелёного светодиода #define redLedPin RED_LED_BUILTIN // вывод для красного светодиода #define redLedDelay 1200 // полупериод миигания красного светодиода // Структура параметров для светодиода (здесь ничего менять нельзя!) struct LedSet { byte Pin; // определение вывода светодиода unsigned long OnTime; // продолжительность свечения/погасания светодиода bool PwrState; // состояние светодиода unsigned long LastTurnTime; // время последнего переключения }; // Настройки очередного светодиода (после "LedSet" задаётся имя структуры) LedSet greenLed = { greenLedPin, // номер вывода конкретного светодиода greenLedDelay // нужная продолжительность свечения/погасания }; // Настройки очередного светодиода (после "LedSet" задаётся имя структуры) LedSet redLed = { redLedPin, // номер вывода конкретного светодиода redLedDelay // нужная продолжительность свечения/погасания }; // Функция мигания светодиодом с определённым периодом // В функцию передаётся структура заданных параметров светодиода: void LedBlink(LedSet &Led) { // если после времени последнего переключения прошло // время большее продолжительности полупериода if ((millis() - Led.LastTurnTime) > Led.OnTime) { Led.PwrState = !Led.PwrState; // изменить состояние светодиода Led.LastTurnTime = millis(); // запомнить время переключения // записать состояние светодиода в порт: digitalWrite (Led.Pin, Led.PwrState); } } // Процедура настройки Arduino: void setup() { // настройка вывода светодиода как выход: pinMode(greenLed.Pin, OUTPUT); // настройка вывода светодиода как выход: pinMode(redLed.Pin, OUTPUT); } // Основной цикл Arduino: void loop() { // Вызов функции мигания зелёным светодиодом: LedBlink(greenLed); // Вызов функции мигания красным светодиодом: LedBlink(redLed); }
Программа работает на прерываниях и не задерживает на долго основной цикл. а число светодиодов может быть сколь угодно большим в разумных пределах. Для демонстрации её возможностей был создан вариант с задействованием всех возможных выводов Ардуино.
Известно, что аналоговые выводы можно использовать как цифровые, и что у 32-х выводного микроконтроллера поверхностного монтажа на два аналоговых входа больше, чем у чипа в DIP-корпусе, и общее число аналоговых выводов составляет 8. Но ОЧЕНь ВАЖНАЯ ДЕТАЛь! Аналоговые входы A6 и A7 не являются портом ввода-вывода, а лишь составляют часть мультиплексора для аналоговых измерений. Поэтому эти два вывода невозможно использовать как цифровые, и общее число задействованных выводов составило (D0 … D13) + (A0 … A5) = 14D + 6A = 20:
Проект программы вместе с файлом симуляции для Протеуса можете скачать по ссылке. Каждый светодиод мигает со своей частотой, самая высокая частота мигания у светодиода, подключённого к выводу «0», и она уменьшается с возрастанием порядкового номера вывода платы.
Фрагмент процесса симуляции:
Заключение
Довольно простыми манипуляциями получилось создать собственную отладочную плату и удалось интегрировать её в среду разработки Arduino IDE без применения сторонних библиотек и установки дополнительных модулей или какого—либо ядра.
Описанным способом можно изготовить и добавить плату на основе другого поддерживаемого AVR-микроконтроллера. В данном случае из за небольшого объёма программной памяти было решено отказаться от бутлоадера, но при необходимости на плату можно установить кварцевый резонатор и записать в чип программу-загрузчик.
Так же плату всегда можно использовать без среды Ардуино и писать для неё программы например в «Atmel Studio» или загружать в чип уже скомпилированные прошивки любыми удобными средствами, такими как к примеру «UniProf».
В качестве дополнения в архиве «arduino-1_8_5.rar» собраны все необходимые конфигурационные файлы для интеграции в среду разработки микроконтроллеров АТмега88/168/328 без использования bootloader-а.
Статьи по теме
- Разборка электропривода Danfoss AME 120 NL
- Отладочная плата с микроконтроллером ATmega328
- Arduino Pro Mini и UniProf
- Автономный светодиодный прожектор на Arduino
- Быстрый старт с Ардуино — отладочная плата Arduino UNO R3
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот | |
---|---|---|---|---|---|---|---|
Конденсаторы | |||||||
C1, C3, C5, C6, C9, C10 | Конденсатор | 100 нФ | 6 | ||||
C2 | Электролитический конденсатор | 100µ 35V | 1 | ||||
C4 | Электролитический конденсатор | 100µ 16V | 1 | ||||
C7, C8 | Конденсатор | 22 пФ | 2 | ||||
Резисторы | |||||||
R1, R5, R6, R7 | Резистор | 1 кОм | 4 | Маркировка 01B | |||
R2 | Резистор | 330 Ом | 1 | Маркировка 331 | |||
R3 | Резистор | 100 кОм | 1 | Маркировка 01D | |||
R4 | Резистор | 2.7 кОм | 1 | Маркировка 272 | |||
Полупроводники, микросхемы | |||||||
D1 | Выпрямительный диод | 1N4001 | 1 | Маркировка M1 | |||
U1 | Линейный регулятор | LM78L05A | 1 | Маркировка 78L05A | |||
IC1 | МК AVR 8-бит | ATmega88 | 1 | ||||
LED1 | Светодиод | Красный | 1 | RED | |||
LED2 | Светодиод | Зелёный | 1 | GREEN | |||
LED3 | Светодиод | Красный | 1 | POWER | |||
Разъёмы, кнопки | |||||||
XP1-1 | Разъём | 7 Pin | 1 | I/O | |||
XP1-2 | Разъём | 10 Pin | 1 | I/O | |||
XP1-3 | Разъём | 10 Pin | 1 | I/O | |||
XP2 | Разъём | 4 Pin | 1 | Power | |||
ISP1 | Разъём | 6 Pin | 1 | ICSP | |||
Jp1 | Перемычка | 3 Pin | 1 | Энергосбережение | |||
S1 | Кнопка | Без фиксации | 1 | Reset | |||