Найти в Дзене
Андрей Андреич

Программирование микроконтроллеров AVR с помощью Arduino на примере ATmega8

Далеко не во всех проектах целесообразно использовать плату Ардуино целиком, иногда достаточно всего нескольких выводов микроконтроллера, да и интегрировать её в схему не всегда удобно. В таких случаях разумно совместить простоту и удобство среды программирования Arduino IDE и дешевизну и малый размер «голого» микроконтроллера, тем более, что прошивать такие МК можно непосредственно с помощью платы Ардуино. В семействе AVR огромное множество микроконтроллеров на любой вкус. Для стандарт tinyAVR (ATtinyxxx) характерны небольшое количество флеш-памяти (до 16 килобайт) и количество линий ввода-вывода в совокупности с низким энергопотреблением, а для стандарта megaAVR (ATmegaxxx) доступно уже до 256 килобайт памяти и до сотни портов ввода-вывода (зависит от модели МК), так же доступна расширенная система команд и периферийных устройств. Сегодня будем прошивать ATmega8, цифра 8 в названии говорит нам о том, что у этого микроконтроллера 8 килобайт встроенной памяти. На картинке ниже расписан

Далеко не во всех проектах целесообразно использовать плату Ардуино целиком, иногда достаточно всего нескольких выводов микроконтроллера, да и интегрировать её в схему не всегда удобно. В таких случаях разумно совместить простоту и удобство среды программирования Arduino IDE и дешевизну и малый размер «голого» микроконтроллера, тем более, что прошивать такие МК можно непосредственно с помощью платы Ардуино.

В семействе AVR огромное множество микроконтроллеров на любой вкус. Для стандарт tinyAVR (ATtinyxxx) характерны небольшое количество флеш-памяти (до 16 килобайт) и количество линий ввода-вывода в совокупности с низким энергопотреблением, а для стандарта megaAVR (ATmegaxxx) доступно уже до 256 килобайт памяти и до сотни портов ввода-вывода (зависит от модели МК), так же доступна расширенная система команд и периферийных устройств.

Микроконтроллер ATmega8 в корпусе TQFP
Микроконтроллер ATmega8 в корпусе TQFP

Сегодня будем прошивать ATmega8, цифра 8 в названии говорит нам о том, что у этого микроконтроллера 8 килобайт встроенной памяти. На картинке ниже расписаны выводы микроконтроллера в DIP корпусе. Кстати у ATmega48/88/168/328 выводы расположены аналогичным образом.

Расположение выводов микроконтроллера ATmega8
Расположение выводов микроконтроллера ATmega8
  • Ground (8 и 22 ноги) — земля, минус питания.
  • VCC (7 нога) — + питания.
  • Crystal (9 и 10 ноги) — сюда подключается кварцевый резонатор нужной частоты, в случае если МК настроен на работу от внешнего генератора.
  • AVCC (20 нога) — это + питание для аналоговой части МК, их разделяют с VCC в случаях когда необходимо получать сильно точные значения, питания подают отфильтрованное от помех и т.п. На практике для рядовых задач просто соединяют эту ногу с VCC.
  • AREF (21 нога) — на эту ногу можно подавать опорное напряжение отличное от пяти вольт питания микроконтроллера, например если есть необходимость измерять напряжение в пределах 3 вольт.
  • RESET — сброс настроек, перезагрузка МК. Кратковременная подача логического ноля на этот вывод приведет к перезапуску прошивки, так же необходим для перезаписи.
  • Остальные выводы — это порты ввода вывода такие же как и на плате Ардуино, их можно использовать по своему усмотрению.

Для прошивки микроконтроллера понадобятся его порты последовательного периферийного интерфейса (SPI — Serial Peripheral Interface) — это синхронный протокол последовательной передачи данных, используемый для связи микроконтроллера с одним или несколькими периферийными устройствами. В нашем случае это выводы:

  • 17 выводMOSI (Master Out Slave In) — линия для передачи данных от ведущего устройства (Master) к ведомым (Slave)
  • 18 вывод — MISO (Master In Slave Out) — линия для передачи данных от ведомого устройства (Slave) к ведущему (Master)
  • 19 вывод — SCK (Serial Clock) — тактовые импульсы, генерируемые ведущим устройством (Master) для синхронизации процесса передачи данных

В первую очередь необходимо из Ардуино сделать программатор, в этом нет ничего сложного, нужно просто загрузить в неё код из готового примера «ArduinoISP».

-3

После его загрузки в плату (кстати я буду использовать Arduino UNO для наглядности, но это не принципиально, можно и другую) в меню Инструменты — >>Программатор необходимо выбрать «Arduino as ISP».

Программатор Arduino as ISP
Программатор Arduino as ISP

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

  • 17 нога микроконтроллера (MOSI) к 11 пину платы Ардуино
  • 18 нога микроконтроллера (MISO) к 12 пину платы Ардуино
  • 19 нога микроконтроллера (SCK) к 13 пину платы Ардуино
  • 1 нога (RESET) к 10 пину платы Ардуино
  • 8 ногу к GND
  • 7 ногу к +5V

Дополнительно подключим на нулевой цифровой выход ATmega8 (вторая ножка микросхемы) светодиод через токоограничивающий резистор на 220 Ом, для наглядного подтверждения того, что микроконтроллер работает.

Схема подключения микроконтроллера ATmega8 к плате Arduino Uno
Схема подключения микроконтроллера ATmega8 к плате Arduino Uno

Как видно из описания примера «Arduino ISP» к 7, 8 и 9-му пинам платы Ардуино можно подключить информационные светодиоды (через резисторы) отображающие ход работы программатора, но это по желанию.

// Put an LED (with resistor) on the following pins:
// 9: Heartbeat — shows the programmer is running
// 8: Error — Lights up if something goes wrong (use red if that makes sense)
// 7: Programming — In communication with the slave

Теперь почти всё готово, осталось только сообщить среде программирования, что именно мы собираемся прошивать. Для этого нужно добавить нашу ATmega8 в среду разработки Arduino IDE, то есть нужно установить так называемое ядро, или как оно называется в самой Arduino IDE – плату.

MiniCore – ядро для поддержки микроконтроллеров ATmega328, ATmega168, ATmega88, ATmega48 и ATmega8, для его установки нажимаем Файл —>> Параметры и в открывшемся окне ищем строчку: «Дополнительные ссылки для менеджера плат:», в это поле необходимо ввести ссылку:

https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json

-6

Далее заходим в Инструменты —>> Плата —>> Менеджер плат находим и устанавливаем нужное ядро.

Установка ядра miniCore  в менеджере плат
Установка ядра miniCore в менеджере плат

После всех манипуляций в менеджере плат должны появиться следующие варианты:

Платы ядра MiniCore в меню менеджера плат
Платы ядра MiniCore в меню менеджера плат

В качестве платы выбираем нашу ATmega8, параметр «Clock:» устанавливаем «Internal 8 MHz», так МК будет работать от внутреннего генератора.

Все готово! Теперь подключаем плату Ардуино к компьютеру и не забыв выбрать нужный COM порт, выбираем в меню «Инструменты» пункт «Записать загрузчик».

Запись загрузчика
Запись загрузчика

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

void setup() {
pinMode(0, OUTPUT);
}

void loop() {
digitalWrite(0, HIGH);
delay(1000);
digitalWrite(0, LOW);
delay(1000);
}

Загружать нужно не кнопкой как обычно, а через меню Скетч —>> Загрузить на плату при помощи программатора, если все сделано правильно, то светодиод начнет мигать.

Загрузка на плату при помощи программатора
Загрузка на плату при помощи программатора
Прошитая мигалка в микроконтроллер ATmega8
Прошитая мигалка в микроконтроллер ATmega8

В Arduino IDE можно прошить ATmega8 и без установки дополнительных плат, выбрав в качестве платы «Arduino NG or older» и в качестве процессора «aTmega8». Но в таком случае не будет возможности выбора от какого генератора (внешнего или внутреннего) и на какой частоте будет работать МК, а работать он будет от внешнего генератора на чистоте 16 MGz, и перезаписать его настройки в дальнейшем без подключения кварцевого резонатора к выводам 9 и 10 будет невозможно, будьте внимательны!

Выбор в качестве платы Arduino NG or older
Выбор в качестве платы Arduino NG or older

Ну и напоследок приведу ссылки на ядра для работы с микроконтроллерами серии ATtiny, устанавливаются они аналогично MiniCore:

  • ATTinyCore — поддержка микроконтроллеров ATtiny 441/841, 44/84, 45/85, 461/861, 48/88, 828, 1634, 87, 167. Ссылка для менеджера плат: http://drazzy.com/package_drazzy.com_index.json
  • MicroCore — поддержка микроконтроллеров ATtiny13. Ссылка для менеджера плат: https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json