Почему C для AVR
Микроконтроллеры AVR (ATtiny, ATmega) можно программировать на ассемблере, но язык C даёт куда большую производительность разработки при почти той же эффективности кода: читаемость, переносимость, готовые библиотеки. Эта статья — практическое введение в программирование AVR на C; обзорный справочник по самим контроллерам см. на странице AVR контроллеры.
Инструментарий
- Компилятор — avr-gcc (в составе Microchip Studio / бывш. AVR Studio, или отдельно с avr-libc).
- Библиотека — avr-libc: заголовки регистров, задержки, работа с EEPROM и прерываниями.
- Прошивка — avrdude через программатор ISP (USBasp, USBtinyISP) или встроенный бутлоадер.
Порты ввода-вывода
Каждый порт AVR управляется тремя регистрами: DDRx задаёт направление (1 — выход, 0 — вход), PORTx — уровень на выходе (или подтяжку на входе), PINx — чтение состояния входа.
DDRB |= (1 << PB0); // PB0 — выход
PORTB |= (1 << PB0); // высокий уровень
PORTB &= ~(1 << PB0); // низкий уровень
if (PINB & (1 << PB1)) { … } // чтение входа PB1
Первая программа — мигалка
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
int main(void) {
DDRB |= (1 << PB0); // светодиод на PB0
while (1) {
PORTB ^= (1 << PB0); // инверсия
_delay_ms(500);
}
}
Здесь F_CPU задаёт тактовую частоту для корректных задержек, а операция XOR переключает вывод.
Работа с битами
Основные приёмы: установить бит — reg |= (1<<n); сбросить — reg &= ~(1<<n); инвертировать — reg ^= (1<<n); проверить — reg & (1<<n). Эти шаблоны — основа работы с регистрами периферии.
Тактирование и fuse-биты
Источник и частоту такта задают fuse-биты при прошивке (внутренний генератор 1/8 МГц по умолчанию, внешний кварц и т.д.). Неверные fuse — частая причина «немого» контроллера. Значение F_CPU в коде должно совпадать с реальной частотой, иначе задержки и UART будут неточны. Расчёт делителя UART под частоту — в калькуляторе UART, сборка значений регистров по битам — в конструкторе регистра.
Частые вопросы
Чем C лучше ассемблера для AVR?
C даёт быструю разработку, читаемый и переносимый код, готовые библиотеки. Ассемблер выигрывает лишь в предельно критичных по времени/памяти участках, которые можно вставлять и в C-программу.
Почему после прошивки контроллер «молчит»?
Чаще всего — неверные fuse-биты (не тот источник такта) или несоответствие F_CPU реальной частоте. Проверьте fuse, тактирование и подтяжку RESET.
Итоги
Программирование AVR на C сводится к управлению регистрами периферии через простые битовые операции. Тулчейн avr-gcc + avr-libc и программатор ISP покрывают весь цикл: от «мигалки» до работы с таймерами, АЦП и UART. Главное на старте — верно задать тактирование (fuse и F_CPU).
Смотрите также: AVR контроллеры · Прерывания и таймеры · UART · Конструктор регистра.