Что такое 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 В)
Популярные контроллеры
| Модель | Выв. | Flash | SRAM | EEPROM | Особенности |
|---|---|---|---|---|---|
| ATtiny13 | 8 | 1K | 64 Б | 64 Б | Минимальный AVR для мелких задач |
| ATtiny85 | 8 | 8K | 512 Б | 512 Б | Популярен в компактных устройствах |
| ATmega8 | 28 | 8K | 1K | 512 Б | Классика, USART, ADC, SPI |
| ATmega328P | 28/32 | 32K | 2K | 1K | Сердце Arduino UNO, богатая периферия |
| ATmega16 / 32 | 40 | 16/32K | 1/2K | 512/1K | Много выводов, JTAG |
| ATmega2560 | 100 | 256K | 8K | 4K | Arduino 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 контроллеры.
С чего начать
- Возьми ATmega328P (или плату Arduino UNO) — максимум примеров и документации.
- Поставь avr-gcc (Microchip Studio / Arduino IDE) и программатор USBasp.
- Собери «мигалку», проверь fuse-биты (источник такта!) и подтяжку RESET.
- Дальше — UART для связи с ПК, таймеры и ШИМ, ADC для датчиков, I²C/SPI для модулей.
Смотрите также: PIC контроллеры · ПЛИС · I²C.