Прошивка микроконтроллеров через Ардуино.

Содержание

Итак, в предыдущем уроке мы наконец то доделали простенький автомат освещения. В принципе осталось всего ничего- заливаете скетч в любую Ардуину, собираете схему и… все! Все работает! Но! Давайте теперь попробуем посчитать денежный эквивалент самого устройства. Будем исходить из самой низкой стоимости деталей.

  1. Собственно сам контроллер Ардуино. Естественно для такого небольшого устройства нужно брать что то небольшое, тоже Nano или Pro-Mini. По сравнению с Ардуино Уно они стоят почти в 3 раза дешевле. Нано кроме того имеет контроллер интерфейса и является полной копией Ардуино Уно только небольшого размера. Очень удобно заливать прошивку без всяких сторонних программаторов и переходников (об этом чуть ниже). Итого стоимость Ардуино Нано около 120 руб вместо 300 руб Ардуино Уно.
  2. Модуль реле KY-019. Цена всего около 50-60 рублей за блок с одним реле.
  3. Блок питания (БП) на 5В. На Али есть БП мощностью несколько Ватт и стоимостью около 40 руб. Стоит посчитать мощность БП для устройства. Реле потребляет около 200 мА, Ардуино- берите еще 50 мА, ну и светодиоды, допустим 3 штуки по 20 мА=3х20=60 мА. Т.е. потребляемый ток будет равен 200+50+60=310 мА. Значит БП нужен мощностью не менее 5В х 0,31 А=1,55 Вт. Стоит учесть еще потери самого БП, т.е по идее БП на 3 Вт должно хватить. Итого еще 50 руб. Можно конечно поставить старый зарядник от сотового телефона с током не менее 0,3 А. Это будет более правильно и, кроме того, бесплатно.

Кнопки считать не будем т.к. их можно где нибудь выковырять. Вместо кнопок можно поставить различные датчики но это будет в следующем уроке, когда мне придут датчики из Китая. Вобщем посчитаем стоимость только одной Ардуины. 130 рублей. Немного. Но давайте также прикинем другие варианты. Скетч занимает 1,63 кБ. В Ардуино на 328 контроллере находится 32 кБ памяти. Это больше требуемого в 32/1,63=19,6 раз. Почти в 20 раз. Мне лично жаль тратить такой контроллер на такой небольшой скетч. Какой же выход можно найти из сложившейся ситуации? Взять контроллер с меньшим объемом памяти и прошить его так же как и Ардуино! Давайте посмотрим какие еще контроллеры есть в семействе Атмега.

Список и описания я взял с сайта http://www.gaw.ru дабы не плодить плагиат и не делать лишнюю работу. Желтым цветом отмечены МК которые не рекомендованы для новых разработок. Есть еще другие МК но они довольно мощные и здесь пока рассматривать их не будем.

Микроконтроллеры семейства TinyAVR

Классические AVR-микроконтроллеры

Микроконтроллеры семейства MegaAVR

Тип Напр. питания, В Такт. Частота, МГц I/O Flash EEPROM SRAM Интер-
фейсы
АЦП Таймеры ISP Корпус
ATmega406 4.0 — 25 1 18 40K 512 2K JTAG
TWI
10x12bit
1x18bit
1x8bit
1x16bit
I
Power-save
Power-down
Power-off
LQFP48
ATmega48 1.8-5.5 20 23 4K 256 512 UART
SPI
I 2 C
6x10bit
2x8bit
2x8bit
1x16bit
S DIP28 TQFP32 MLF32
ATmega48 Avtomotove 2.7-5.5 16 23 4K 256 512 UART
SPI
I 2 C
6x10bit
2x8bit
2x8bit
1x16bit
S TQFP32 MLF32
ATmega88 1.8-5.5 20 23 8K 512 1k UART
SPI
I 2 C
6x10bit
2x8bit
2x8bit
1x16bit
S DIP28 TQFP32 MLF32
ATmega88 Avtomotove 2.7-5.5 20 23 8K 512 1k UART
SPI
I 2 C
6x10bit
2x8bit
2x8bit
1x16bit
S TQFP32 MLF32
ATmega168 1.8-5.5 20 23 16K 512 1k UART
SPI
I 2 C
6x10bit
2x8bit
2x8bit
1x16bit
S DIP28 TQFP32 MLF32
ATmega168 Avtomotove 2.7-5.5 20 23 16K 512 1k UART
SPI
I 2 C
6x10bit
2x8bit
2x8bit
1x16bit
S TQFP32 MLF32
ATmega8 2.7-5.5 16 23 8K 512 1k UART
SPI
8x10bit 2x8bit
1x16bit
S DIP28 TQFP32 MLF32
ATmega16 2.7-5.5 16 32 16K 512 1k UART
SPI
8x10bit 2x8bit
1x16bit
S DIP40 TQFP44 MLF44
ATmega32 2.7-5.5 16 32 32K 1K 2K UART
SPI
8x10bit 2x8bit
1x16bit
S DIP40 TQFP44 MLF44
ATmega64 2.7-5.5 16 53 64K 2K 4K 2xUART
SPI
8x10bit 2x8bit
2x16bit
S TQFP64 MLF64
ATmega640 1,8…5,5
4,5…5,5
8
16
86 64K 4K 8K 4xUART
JTAG
SPI
16x10bit 2x8bit
4x16bit
I TQFP100
ATmega128 2.7-5.5 16 53 128K 4K 4K 2xUART
SPI
8x10bit 2x8bit
2x16bit
S TQFP64 MLF64
ATmega1280 1,8…5,5
4,5…5,5
8
16
86 128K 4K 8K 4xUART
JTAG
SPI
16x10bit 2x8bit
4x16bit
I TQFP100
ATmega1281 1,8…5,5
4,5…5,5
8
16
54 128K 4K 8K 2xUART
JTAG
SPI
8x10bit 2x8bit
4x16bit
I TQFP64
AT90CAN32 2.7-5.5 16 53 32K 1K 2048 UART
JTAG
CAN
USART
8x10bit 2x8bit
2x16bit
S MLF 64 LQFP 64
AT90CAN64 2.7-5.5 16 53 64K 2K 4K UART
JTAG
CAN
USART
8x10bit 2x8bit
2x16bit
S MLF 64 LQFP 64
AT90CAN128 2.7-5.5 16 53 128K 4K 4K 2xUART
SPI
CAN
8x10bit 2x8bit
2x16bit
S TQFP64 MLF64
AT90CAN128 Automotive 2.7-5.5 16 53 128K 4K 4096 2xUART
SPI
CAN
8x10bit 2x8bit
2x16bit
S MLF64 LQFP64
ATmega103 4.0-5.5 6 48 128K 4K 4K UART
SPI
8x10bit 2x8bit
2x16bit
I TQFP64
ATmega161 2.7-5.5 8 35 16K 512 1K 2xUART
SPI
— 2x8bit
1x16bit
S DIP40 TQFP44
ATmega162 1.8-5.5 16 35 16K 512 1K 2xUART
SPI
— 2x8bit
1x16bit
S DIP40 TQFP44 MLF44
ATmega163L 2.7-5.5 8 32 16K 512 1K UART
SPI
8x10bit 2x8bit
1x16bit
S DIP40 TQFP44 MLF44
ATmega164P/V 1.8-5.5 16 32 16K 512K 1024 2xUART
SPI+USART
TWI
8x10bit 2x8bit
1x16bit
S MLF44 PDIP40 TQFP44
ATmega165 1.8-5.5
2.7-5.5
8
16
53 16K 512 1K UART
SPI
JTAG
PWM
8x10bit 2x8bit
1x16bit
S TQFP64 MLF64
ATmega165P 1.8-5.5 16 54 16K 0.5 1024 UART
SPI+USI
4PWM
8x10bit 2x8bit
1x16bit
S MLF64 TQFP64
ATmega169 1.8-3.6 4 53
4×25 LCD
16K 512 1K UART
SPI
8x10bit 2x8bit
1x16bit
S TQFP64
ATmega169P 1.8-5.5 16 54 16K 0.5 1024 UART
SPI+USI
4PWM
8x10bit 2x8bit
1x16bit
S MLF64 TQFP64
ATmega8515 2.7-5.5 16 35 8K 512 512 UART
SPI
— 2x8bit
1x16bit
S PDIP40 PLCC44 TQFP,MLF
ATmega8535 2.7-5.5 16 32 8K 512 512 UART
SPI
8x10bit 2x8bit
1x16bit
S PDIP40 PLCC44 TQFP MLF
ATmega2560 1,8…5,5
4,5…5,5
8
16
86 256K 4K 8K 2xUART
JTAG
SPI
16x10bit 2x8bit
4x16bit
I TQFP100
ATmega2561 1,8…5,5
4,5…5,5
8
16
54 256K 4K 8K 2xUART
JTAG
SPI
8x10bit 2x8bit
4x16bit
I TQFP64
ATmega324P/V 1.8-5.5 20 32 32K 1K 2048 2xUART
SPI+USART
TWI
8x10bit 2x8bit
1x16bit
S MLF44 PDIP40 TQFP44
ATmega325 1.8-5.5 16 53 32K 1K 2K UART
SPI
8x10bit 2x8bit
1x16bit
S TQFP MLF
ATmega3250 1.8-5.5 16 68 32K 1K 2K UART
SPI
8x10bit 2x8bit
1x16bit
S TQFP MLF
ATmega325P 1.8-5.5 20 54 32K 1K 2048 UART
SPI
8x10bit 2x8bit
1x16bit
S MLF64 TQFP64
ATmega3250P 1.8-5.5 20 54 32K 1K 2048 UART
SPI
8x10bit 2x8bit
1x16bit
S TQFP100
ATmega329P 1.8-5.5 16 54 32K 1K 2048 JTAG
SPI
8x10bit 2x8bit
1x16bit
S MLF64 TQFP64
ATmega3290P 1.8-5.5 16 54 32K 1K 2048 JTAG
SPI
8x10bit 2x8bit
1x16bit
S TQFP100
ATmega644P/V 1.8-5.5 20 32 64K 2K 4096 2xUART
SPI+USART
TWI
8x10bit 2x8bit
1x16bit
S MLF44 PDIP40 TQFP44
ATmega645 1.8-5.5 16 53 64K 2K 4K UART
SPI
8x10bit 2x8bit
1x16bit
S TQFP MLF
ATmega6450 1.8-5.5 16 68 64K 2K 4K UART
SPI
8x10bit 2x8bit
1x16bit
S TQFP MLF
ATmega644 1.8-5.5
2.7-5.5
10
20
32 64K 2K 4K UART
SPI
TWI
PWM
JTAG
8x10bit 2x8bit
1x16bit
S PDIP40 TQFP44 MLF44
ATmega329 1.8-5.5 16 53
LCD 4×25
32K 1K 2K UART
SPI
8x10bit 2x8bit
1x16bit
S TQFP MLF
ATmega3290 1.8-5.5 16 68
LCD 4×40
32K 1K 2K UART
SPI
8x10bit 2x8bit
1x16bit
S TQFP MLF
ATmega649 1.8-5.5 16 53
LCD 4×25
64K 2K 4K UART
SPI
8x10bit 2x8bit
1x16bit
S TQFP MLF
ATmega6490 1.8-5.5 16 68
LCD 4×40
64K 2K 4K UART
SPI
8x10bit 2x8bit
1x16bit
S TQFP MLF

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

  1. Объем памяти. Действительно, если представить что нам нужно 4 кБ памяти и взять, например, ATtiny25 то памяти просто не хватит т.к. этот МК имеет всего 2 кБ памяти. Поэтому лучше брать все таки побольше. Я бы выбрал ATtiny85. Там уже 8 кБ памяти и, если будет доработка функционала, есть некоторый буфер для программы.
  2. Количество выводов. Это наверное даже поважнее чем п.1. Все упирается в количество портов ввода-вывода. На выводы конечно можно подключать устройства I2C и поадресно их опрашивать и выводить информацию. Но с I2C такие МК работают достаточно медленно. В нашем случает с ATtiny85 есть 8 выводов (корпус PDIP8 SOIC8, т.е. 8 выводов), из которых 2 питание а остальные 6 мы смело можем использовать! Нам при изготовлении нужно: 1 вывод на кнопки, 1 вывод на светодиоды, 1 вывод на реле. Свободными остаются еще 3 вывода! Т.е. нам хватит и памяти и выводов. Тем более её размер. В корпусе PDIP8 их уместится несколько штук на ногте! Цена вопроса. Тиньки (ATtiny контроллеры так называют радиолюбители) вместе с контроллером для программирования через USB порт стоят около 80 руб. Уже дешевле. Но что странно. В Китае просто МК стоят дороже чем готовое устройство! Нонсенс!
  3. Напряжение питания. Дальше мы рассмотрим работу с фьюзами. Так вот именно эти внутренние переключатели указывают как будет работать МК. С чем это можно сравнить. Например вы написали программу на компьютере. Включаете компьютер и.. компьютер не включился. Почему спросите вы? Ну причин может быть много: неисправный БП (1 причина), процессор (2), память (3) и т.д… а может быть просто слетел БИОС. Так вот именно фьюзы и работают как БИОС на компьютере- они указывают как будет работать собственно ядро МК. Можно выставить частоту работы ядра, от какого генератора синхронизируется МК, внешнего или внутреннего, пределы допустимого напряжения питания при которых МК будет работать. Ту же 85 тиньку можно питать напряжением от 2,7 до 5,5 В. Достаточно просто правильно выставить фьюзы.

Вобщем будем выбирать контроллер с Flash- памятью (туда именно и записывается наш код программы) не менее 8 кБ и как можно дешевле (здесь не говорится о минимизации, если нужно миниатюрное устройство то стоит поискать МК для поверхностного монтажа в корпусах TQFP и SO). Возьмем мой любимый МК ATmega8. Его достоинства: 8 кБ памяти, 28 выводов (из них около 20- наши), имеется 512 байт энергонезависимой памяти в которую мы можем сохранять и считывать необходимые данные. Цена- около 50-60 руб за штуку в Китае. Итого мы удешевили наш проект только по МК уже не менее чем в 2 раза. Осталось научиться запрограммировать МК.

Мы рассмотрим 3 программы для программирования МК. Это будет собственно сама оболочка Arduino IDE, AVRDUDESHELL и Sinaprog. Самая простая- Sinaprog но ей необходимо подготовить hex- файл в Arduino IDE. Самая навороченная- AVRDUDESHELL. Но начнем мы все таки с Arduino IDE т.к. без нее никуда и ей просто надо уметь пользоваться. Приступаем к программированию.

Как запрограммировать Atmega с помощью Arduino и Arduino IDE

Итак открываем Arduino IDE и прежде всего нужно загрузить библиотеки нужных контроллеров в саму Arduino IDE. Это делается следующим образом: Нажимаем Скетч- Подключить библиотеку- Управлять библиотеками. В открывшемся окне в верхнем правом поле наберите MiniCore (можете прямо отсюда скопировать). Кликаете на данный пакет и жмете кнопку Установка. Пакет установится и теперь при выборе платы в меню Инструменты в самом низу появится еще целых 5 типов контроллеров (возможно в новых обновлениях будет больше выбор)! Выбираете какой вам нужен и можете переходить к более точной настройке. Т.е. в меню инструменты вам становятся доступны менюшки по настройкам фьюзов. Значение Bootloader предлагает вам записать ардуиновский загрузчик. Можете выбрать Да или Нет. Загрузчик тоже занимает место. Учтите это. BOD- это минимальное напряжение питания при котором контроллер отключится. Можете выбрать 2,7v и тогда МК будет работать от, например, элемента 18650. Особое внимание обратите на значение Clock. В данном меню указывается частота ядра МК и тип задающего генератора. Например запись 20MHz external предписывает МК работать от ВНЕШНЕГО кварцевого резонатора с частотой 20 МГц. Т.е. для запуска МК вам придется подключить такую схему,

Подключение кварцевого резонатора к Атмега

Подключение кварцевого резонатора к Атмега

причем кварцевый резонатор должен быть на 20 МГц. Иначе МК работать не будет. Для Атмега 8 кварц нужно подключать на 9 и 10 выводы (см. даташит ниже). В случае если укажете, например, 1MHz internal то вы запускаете внутренний генератор самой атмеги и, таким образом, МК начинает работать с указанной частотой. Обратите внимание что внутренний генератор включается только на 1 и 8 МГц, чего вполне достаточно для бытовых целей. LTO (Link Time Optimization)- оптимизатор кода, позволяет сделать код более компактным, т.е. уменьшит размер занимаемой памяти, по умолчанию отключен. Можете включить но работает он непредсказуемо. Так что лучше все таки отключить. Еще добавлю общие советы. Самое главное- постарайтесь НИКОГДА НЕ ЗАНИМАТЬ ВЫВОД RESET . Если вы неудачно прошьете, решите дописать что то в новую прошивку, что то изменить в коде для удобства и решите после переписать МК с запрограммированным выводом RESET- вы вряд ли сможете записать новый код в запрограмированный МК, т.к. при программирований используется именно этот вход. А так как он занят программно то работать он, естественно, не будет. Есть конечно вариант сбросить МК к заводским настройкам с помощью AVR Doctor но опять же нужно будет делать данное устройство. Если вы довольно плотно подсели на МК Атмега то данное устройство просто необходимо вам в вашей работе. У меня МК немного но я уже несколько раз лочил (от англ. lock- запирать, закрывать) МК и только это устройство помогло мне реанимировать 3 Атмега8. Вроде немного но зато теперь я уверен- если что случится то всегда могу все вернуть на исходные позиции. Это не реклама а просто констатация факта. А что вы будете делать- решать только Вам.

Теперь делаем следующее. Находим картинку с названием выводов нашего МК. Например для Атмега 8 есть вот такая картинка- даташит (напомню что 328 и 8 атмеги различаются объемом памяти).

Распиновка 328 атмеги

Распиновка 328 атмеги

По ней находим выводы MISO, SCK, MOSI, GND, 5V, RESET. Теперь подключаемся таким образом:

Назначение ARDUINO Atmega 8
RESET 10 1
MOSI 11 17
MISO 12 18
SCK 13 19
5V +5V 7
GND GND 8, 22

Как вы поключитесь абсолютно не имеет никакого значения, можете сделать переходник и включаться напрямую в Ардуино, можете все соединить на макетной плате- не важно. Главное- правильно все подсоединить. Другие МК программируются абсолютно так же. Качаете даташит, находите указанные выше выводы и подсоединяете вывод RESET Ардуино (10 вывод) к выводу RESET МК, вывод MOSI Arduino (11 вывод) к выводу MOSI МК и т.д. Единственное что нужно- указать тип МК и прописать нужные значения в MiniCore.

Теперь подключаем Ардуино к компьютеру (Arduino ISP уже должна быть залита в Ардуино, если нет то выбираете плату Ардуино, указываете порт, заливаете Arduino ISP, переключаетесь на нужный МК, прописываете фьюзы), выбираем нужный скетч и заливаем его в МК. Разные версии программы Ардуино по разному позволяют записывать скетч в МК. В одних версиях нужно открыть меню Файл- Записать с помощью программатора. В моей версии 1.6.8 для записи через программатор достаточно нажать Shift и нажать стрелку как для заливки скетча в Ардуино. После непродолжительного перемигивания светодиодов на Ардуино скетч будет записан в МК. На этом запись закончена и можно переходить к сборке готового устройства. Хочу так же обратить ваше внимание что при указывании портов ввода- вывода на Ардуино следует учитывать что значение цифрового порта D1 не является первым выводом Атмеги. Для этого вам опять же необходимо ознакомится с картинкой расположения выводов на Атмеге. По распиновке смотрим что порт D1 находится на 3 выводе Атмеги 328 (или 8 Атмеги). Вообще выводы IDE отмечены розовым цветом. Поэтому при разводке платы следует учитывать расположение выводов микросхемы.


Источник: samosdel.ru