Микроконтроллеры AVR
AVR — 8-битные RISC-микроконтроллеры Microchip (до 2016 года — Atmel): от шестивыводных ATtiny до ATmega2560 и новых серий AVR Dx и Ex. Здесь — чем отличаются семейства, как их прошивать и какими инструментами пользоваться.
AVR — семейство 8-битных микроконтроллеров с RISC-архитектурой. Ядро построено по гарвардской схеме: программа хранится во флеш-памяти и выбирается по своей шине, данные — в ОЗУ и регистрах. У ядра 32 регистра общего назначения R0–R31 (у урезанного ядра AVRrc в ATtiny4–10 — 16), и большинство команд выполняется за один такт. Архитектуру разработали Альф-Эгиль Боген и Вегард Воллан, студенты Норвежского технологического института в Тронхейме; Atmel объявила о семействе AVR в 1997 году, а в 2016 году компанию купила Microchip, которая выпускает и развивает AVR до сих пор.
Самые известные AVR — ATmega328P из Arduino Uno и Nano и ATtiny85 из миниатюрных модулей. Но семейство гораздо шире: от шестивыводных ATtiny10 до 100-выводного ATmega2560 и новых серий AVR Dx и Ex с питанием 1,8–5,5 В и прошивкой по одному проводу.
Семейства AVR
| Семейство и примеры | Ядро | Частота, до | Флеш-память | Питание | Прошивка и отладка |
|---|---|---|---|---|---|
| tinyAVR, классические ATtiny13A, ATtiny85, ATtiny2313A | AVRe; AVRrc у ATtiny4–10, 20, 40, 102 | 20 МГц; ATtiny4–10 — 12 МГц | 0,5–16 КБ | 1,8–5,5 В, зависит от модели | ISP, HVSP, debugWIRE; у ATtiny4–10 — TPI |
| megaAVR, классические ATmega8A, ATmega328P, ATmega2560, ATmega32U4 | AVRe+ | 16–20 МГц | 4–256 КБ | 1,8–5,5 В; ATmega8A — 2,7–5,5 В | ISP, высоковольтная параллельная; debugWIRE или JTAG |
| XMEGA ATxmega128A1U, ATxmega32E5 | AVRxm | 32 МГц | 8–384 КБ | 1,6–3,6 В | PDI; у части серии A — JTAG |
| tinyAVR 0, 1, 2 ATtiny1604, ATtiny3216, ATtiny3226 | AVRxt | 20 МГц | 2–32 КБ | 1,8–5,5 В | UPDI |
| megaAVR 0 ATmega4809 | AVRxt | 20 МГц | 8–48 КБ | 1,8–5,5 В | UPDI |
| AVR DA, DB, DD, DU AVR128DA48, AVR128DB48, AVR64DD32, AVR64DU32 | AVRxt | 24 МГц | 16–128 КБ | 1,8–5,5 В | UPDI |
| AVR EA, EB AVR64EA48, AVR32EB32 | AVRxt | 20 МГц | 16–64 КБ | 1,8–5,5 В | UPDI |
| AVR SD AVR64SD48 | 2 × AVRxt в режиме lockstep | 20 МГц | 32–64 КБ | 2,7–5,5 В | UPDI |
Частоты указаны для верхней части диапазона питания: у классических AVR 20 МГц достижимы при 4,5–5,5 В, у XMEGA 32 МГц — от 2,7 В. Чем отличаются серии внутри поколения:
- XMEGA — контроллер DMA, система событий (Event System), 12-битный АЦП, аппаратное шифрование AES и DES, у серии AU — USB.
- tinyAVR 1 — по сравнению с серией 0 больше периферии: таймер TCD, у многих моделей — сенсорный контроллер PTC. tinyAVR 2 — 12-битный дифференциальный АЦП с усилителем PGA.
- megaAVR 0 — система событий, конфигурируемая логика CCL и до четырёх USART.
- AVR DA — сенсорный контроллер PTC, 12-битный АЦП и 10-битный ЦАП; AVR DB — порт с собственным питанием MVIO для сопряжения с другой логикой и встроенные операционные усилители; AVR DD — MVIO в небольших корпусах; AVR DU — USB 2.0 Full-Speed без кварца (USB работает при питании выше 3,0 В).
- AVR EA — 12-битный дифференциальный АЦП с усилением до 16×; AVR EB — таймеры для управления двигателями (TCE с расширением WEX и TCF).
- AVR SD — для систем функциональной безопасности: два ядра сверяют друг друга в режиме lockstep, память защищена кодом коррекции ошибок (ECC).
Набор команд у семейств в основном общий: различаются отдельные инструкции, число тактов, а у ядра AVRrc — ещё и число регистров. Подробно — в статье «Система команд AVR».
Классические AVR и новые серии
Начиная с tinyAVR 0/1 и megaAVR 0, Microchip перешла на новое поколение AVR. Ядро AVRxt почти не изменилось, зато остальное устроено иначе:
- Прошивка по одному проводу. Вместо четырёх линий ISP (MOSI, MISO, SCK, RESET) — один вывод UPDI. Высокое напряжение и отдельный высоковольтный программатор не нужны, кроме случая, когда вывод UPDI переназначен под порт ввода-вывода.
- Единое адресное пространство. Регистры периферии, EEPROM и флеш-память видны в адресном пространстве данных — флеш-память целиком или, у моделей с большим объёмом, окном по 32 КБ. Поэтому константы из флеш-памяти читаются обычными командами LD, без LPM.
- Новая периферия. Регистры сгруппированы по модулям (
USART0.BAUD,PORTA.DIR), появились система событий и конфигурируемая логика. Код для ATmega328P, написанный на уровне регистров, на ATmega4809 без переделки не заработает; в Arduino разницу скрывает ядро платы. - Широкий диапазон питания — 1,8–5,5 В почти у всех новых серий, в том числе у AVR Dx с частотой 24 МГц.
Классические модели при этом никуда не делись: по заявленной политике Microchip снимает изделия с производства только при отсутствии спроса, и, за редкими исключениями, AVR остаются доступны весь жизненный цикл изделия.
Интерфейсы программирования и отладки
| Интерфейс | Линии | Где применяется |
|---|---|---|
| ISP (SPI) | MOSI, MISO, SCK, RESET | классические tinyAVR и megaAVR |
| HVSP | высоковольтный последовательный: 11,5–12,5 В на RESET | 8- и 14-выводные классические ATtiny |
| Высоковольтный параллельный | 11,5–12,5 В на RESET и шина данных | классические megaAVR |
| debugWIRE | один провод — RESET | отладка ATtiny13A, ATtiny25/45/85, ATtiny24A/44A/84A, ATmega48A…328P |
| JTAG | TCK, TMS, TDI, TDO | многовыводные megaAVR (ATmega128, ATmega2560, ATmega32U4), XMEGA A1U, A3U, A3BU |
| TPI | три провода | ATtiny4/5/9/10, ATtiny20/40, ATtiny102/104 |
| PDI | два провода | все XMEGA |
| UPDI | один провод | tinyAVR 0/1/2, megaAVR 0, AVR DA, DB, DD, DU, EA, EB, SD |
Высоковольтные интерфейсы нужны, когда фьюзами отключён сброс или ISP: обычным программатором такой кристалл уже не прошить. debugWIRE занимает вывод RESET, поэтому, пока он включён, внешний сброс не работает. После отладки фьюз DWEN стоит отключить: он оставляет часть тактовой системы работать во сне и увеличивает потребление.
Инструменты
- avr-gcc и avr-libc — бесплатный компилятор C/C++ (цель AVR есть в основной ветке GCC, кристалл выбирают ключом
-mmcu) и стандартная библиотека. Проект avr-libc переехал на GitHub (avrdudes/avr-libc). - avrdude — программа прошивки для Windows, macOS и Linux. Поддерживает ISP, TPI, PDI, HVSP, высоковольтное параллельное программирование и UPDI, в том числе программатор SerialUPDI из обычного переходника USB–UART.
- Microchip Studio — бывшая Atmel Studio, переименована в 2020 году. Работает только в Windows.
- MPLAB X IDE с компилятором MPLAB XC8 — среда Microchip для Windows, macOS и Linux. AVR в ней поддерживаются с 2018 года.
- Arduino IDE — использует те же avr-gcc и avrdude, а работу с регистрами прячет за библиотеками.
- Программаторы и отладчики: Atmel-ICE (JTAG, PDI, debugWIRE, ISP, UPDI, TPI), PICkit 4 и 5, MPLAB Snap, встроенный отладчик плат Curiosity Nano; для ISP — недорогие USB-программаторы и плата Arduino со скетчем ArduinoISP.
AVR в платах Arduino
| Плата | Микроконтроллер | Частота | Связь с компьютером |
|---|---|---|---|
| Arduino Uno R3 | ATmega328P | 16 МГц | USB–UART на ATmega16U2 |
| Arduino Nano | ATmega328P | 16 МГц | USB–UART на отдельной микросхеме |
| Arduino Mega 2560 Rev3 | ATmega2560 | 16 МГц | USB–UART на ATmega16U2 |
| Arduino Leonardo | ATmega32U4 | 16 МГц | USB встроен в микроконтроллер |
| Arduino Nano Every | ATmega4809 | 20 МГц | USB-мост на SAMD11 |
| Arduino Uno WiFi Rev2 | ATmega4809 | 16 МГц | USB-мост на отдельной микросхеме |
Плата Arduino — удобный способ начать: отдельный программатор не нужен. Программу по USB принимает загрузчик (bootloader) в микроконтроллере, а у плат на ATmega4809 — USB-мост, который сам прошивает кристалл по UPDI. Тот же кристалл можно программировать и без Arduino — на C с avr-libc или на ассемблере, получая полный контроль над тактами и периферией.
С чего начать
- Разберитесь с регистрами и командами ядра — система команд AVR с флагами и тактами для каждой инструкции.
- Подключите датчики и модули: шина I²C (в AVR она называется TWI), RS-232 и RS-485 — с примерами кода для ATmega328P.
- Для расчёта обвязки пригодятся калькуляторы резистора для светодиода и делителя напряжения.
Другие семейства микроконтроллеров и советы по выбору — в разделе «Микроконтроллеры».
Готовятся к публикации
Архитектура AVR · ATmega328P · ATmega8 · ATtiny85 · XMEGA · AVR Dx и Ex · Фьюзы AVR · Программаторы и прошивка · Таймеры и ШИМ · АЦП AVR · Примеры программ
Частые вопросы
Какой программатор нужен для AVR?
Зависит от интерфейса прошивки. Классические ATmega и ATtiny прошивают по ISP (SPI): подойдёт любой ISP-программатор или плата Arduino со скетчем ArduinoISP. Новые серии — tinyAVR 0/1/2, megaAVR 0, AVR Dx и Ex — прошивают по однопроводному UPDI: хватит переходника USB–UART с резистором (SerialUPDI) или фирменных Atmel-ICE, PICkit 4/5, MPLAB Snap. У ATtiny4–10 интерфейс TPI, у XMEGA — PDI.
Чем ATmega328P отличается от ATmega4809?
ATmega328P — классический megaAVR (Arduino Uno и Nano): 32 КБ флеш-памяти, 2 КБ ОЗУ, до 20 МГц, прошивка по ISP. ATmega4809 из серии megaAVR 0 (Arduino Nano Every, Uno WiFi Rev2): 48 КБ флеш-памяти, 6 КБ ОЗУ, 20 МГц, прошивка по UPDI. Ядро у них почти одинаковое, но периферия устроена иначе, поэтому код, написанный на уровне регистров, без переделки не переносится.
Можно ли программировать AVR без Arduino?
Да. Бесплатный набор — компилятор avr-gcc с библиотекой avr-libc и программа прошивки avrdude — работает в Windows, macOS и Linux. Есть и среды разработки Microchip: Microchip Studio (только Windows) и MPLAB X IDE с компилятором XC8. Arduino IDE тоже использует avr-gcc и avrdude, просто скрывает их за кнопкой «Загрузить».
Какой AVR выбрать для нового проекта?
Для учёбы и макетов — ATmega328P на плате Arduino: под него больше всего примеров. Для нового изделия стоит посмотреть серии AVR Dx и Ex и tinyAVR 2: при той же простоте ядра у них больше памяти и периферии, прошивка по одному проводу UPDI и питание 1,8–5,5 В. Классические модели удобны, когда нужна совместимость со старыми платами и кодом.