AFON // радиотехник affonya@mail.ru
← Микроконтроллеры и ПЛИС

Микроконтроллеры AVR

Справочник по контроллерам Atmel/Microchip: архитектура и 32 регистра, семейства ATtiny и ATmega, память, fuse-биты, периферия и программирование — от первого включения до рабочего проекта.

Что такое AVR

AVR — семейство 8-разрядных микроконтроллеров, разработанное компанией Atmel (с 2016 года — часть Microchip). AVR стали особенно популярны после появления платформы Arduino, но задолго до неё ценились радиолюбителями за быстрое ядро, удобную для языка C архитектуру и бесплатный компилятор.

Как и PIC, AVR построены по гарвардской архитектуре (раздельные память программ и данных) и RISC-принципу, но ядро AVR исполняет большинство команд за один такт — при 16 МГц это до 16 MIPS. Ключевая особенность — 32 регистра общего назначения (r0–r31), напрямую связанных с АЛУ.

Семейства AVR

СемействоКратко
tinyAVR (ATtiny)Малые корпуса 6–20 выводов, минимум памяти — для простых задач
megaAVR (ATmega)Основная массовая линейка: богатая периферия, до 256 КБ Flash
AVR Dx / 0- и 1-seriesНовые tiny/mega: улучшенная периферия, события, до 24 МГц без кварца
XMEGAПроизводительные AVR с DMA и расширенной периферией

Для большинства проектов радиолюбителя оптимальны megaAVR — прежде всего ATmega328P (сердце Arduino UNO) и ATmega8/16/32; для миниатюрных устройств — ATtiny13/85.

Архитектура и регистры

32 регистра общего назначения r0–r31 доступны АЛУ напрямую, что делает код компактным и быстрым. Старшие пары образуют 16-битные указатели X (r26:r27), Y (r28:r29) и Z (r30:r31) — через них идёт адресация памяти, а Z ещё и читает Flash (таблицы, константы).

Флаги результата (перенос, ноль, знак и др.) хранит регистр состояния SREG; бит I в нём глобально разрешает прерывания. Стек располагается в SRAM и растёт вниз от вершины (указатель SP).

Память

У AVR три раздельных адресных пространства:

  • Flash — память программ (и таблицы через LPM), перепрошивается многократно.
  • SRAM — оперативная память: регистры ввода-вывода и переменные; очищается при выключении.
  • EEPROM — небольшая энергонезависимая область для настроек и калибровок.

Отдельно стоят fuse-биты и lock-биты — они не часть программы, а конфигурация чипа (см. ниже).

Тактирование

«Из коробки» ATmega обычно работает от внутреннего RC-генератора 8 МГц с включённым делителем CKDIV8 — то есть реально на 1 МГц. Источник задаётся fuse-битами CKSEL, а время запуска — SUT. Варианты: внутренний RC, внешний кварц (через XTAL1/XTAL2), внешний генератор, низкочастотный часовой кварц.

Частая ошибка новичка — выставить fuse на внешний кварц, не подключив его: чип «замолкает» и оживает только внешним тактированием или высоковольтным программатором.

Периферия

  • Порты ввода-вывода: три регистра на порт — DDRx (направление), PORTx (вывод / подтяжка), PINx (чтение).
  • Таймеры-счётчики 8- и 16-битные с режимами CTC и ШИМ (Fast/Phase-Correct PWM).
  • АЦП 10 бит с мультиплексором каналов.
  • USART — асинхронный/синхронный последовательный порт (UART).
  • SPI и TWI (аппаратный I²C).
  • Аналоговый компаратор, система прерываний (внешние, по таймерам, PCINT), сторожевой таймер WDT.

Значение регистра таймера/ШИМ удобно подобрать в калькуляторе таймера AVR, делитель UART — в калькуляторе UART/UBRR, а собрать байт настройки по битам — в конструкторе регистра.

Fuse-биты

Fuse-биты (low / high / extended) задают источник и делитель тактовой частоты, порог сброса по питанию BODLEVEL, разрешение внутрисхемного программирования SPIEN, сторожевой таймер WDTON и др. Важно: у AVR fuse-бит в состоянии «0» считается запрограммированным (активным). Биты RSTDISBL и DWEN отключают вывод RESET / включают debugWIRE — их неосторожная установка блокирует обычный ISP-программатор.

; типовые fuse ATmega328P: внешний кварц 16 МГц, CKDIV8 выкл.
; low = 0xFF   (внешний HS-кварц, полный размах)
; high = 0xDE  (SPIEN вкл., загрузчик)
; ext  = 0x05  (BOD 2.7 В)

Популярные контроллеры

МодельВыв.FlashSRAMEEPROMОсобенности
ATtiny1381K64 Б64 БМинимальный AVR для мелких задач
ATtiny8588K512 Б512 БПопулярен в компактных устройствах
ATmega8288K1K512 БКлассика, USART, ADC, SPI
ATmega328P28/3232K2K1KСердце Arduino UNO, богатая периферия
ATmega16 / 324016/32K1/2K512/1KМного выводов, JTAG
ATmega2560100256K8K4KArduino Mega, множество портов

Цоколёвку ATmega328P и ATtiny13 смотри в справочнике цоколёвок.

Программирование

Прошивка (ISP)

AVR прошиваются по ISP (In-System Programming) через интерфейс SPI: линии MOSI, MISO, SCK, RESET, плюс питание. Программаторы: недорогой USBasp, AVRISP mkII, а также «Arduino as ISP». Заливку выполняет утилита avrdude. Для отладки применяются debugWIRE и JTAG (на старших ATmega).

Среда и компиляторы

Бесплатный тулчейн — avr-gcc + avr-libc (GCC для AVR), поверх него работают Microchip/Atmel Studio, Arduino IDE, PlatformIO. Язык — C/C++ или ассемблер AVR.

// «Мигалка» на ATmega328P (PB5 = вывод 13 Arduino), avr-gcc
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void) {
    DDRB |= (1 << PB5);        // PB5 как выход
    while (1) {
        PORTB ^= (1 << PB5);   // переключить уровень
        _delay_ms(500);
    }
}

Готовый HEX проверяется в разборе Intel HEX, контрольные суммы протоколов — в CRC, а перевод чисел — в конвертере систем счисления.

AVR или PIC

Оба семейства закрывают схожие задачи. Грубо: у AVR — 32 регистра, одно-тактовое ядро и очень удобный бесплатный C-тулчейн (плюс экосистема Arduino); у PIC — шире номенклатура младших дешёвых чипов и давние традиции в промышленности. Выбор чаще определяется тем, что уже освоено и под что больше готовых примеров. Подробнее о втором семействе — в разделе PIC контроллеры.

С чего начать

  1. Возьми ATmega328P (или плату Arduino UNO) — максимум примеров и документации.
  2. Поставь avr-gcc (Microchip Studio / Arduino IDE) и программатор USBasp.
  3. Собери «мигалку», проверь fuse-биты (источник такта!) и подтяжку RESET.
  4. Дальше — UART для связи с ПК, таймеры и ШИМ, ADC для датчиков, I²C/SPI для модулей.

Смотрите также: PIC контроллеры · ПЛИС · I²C.