AFON // радиотехник affonya@mail.ru
← Радиотехника

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

Практическое введение в AVR на C: тулчейн, порты ввода-вывода и битовые операции, первая программа, тактирование и fuse-биты, прошивка ISP — от мигалки к рабочему проекту.

Почему 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 · Конструктор регистра.