Перейти к содержанию

AVR с нуля

Восемь уроков программирования ATmega328P на чистом C без библиотеки Arduino: от первой сборки и прошивки до таймеров, ШИМ, АЦП и UART. Каждое имя регистра и бита, каждая формула — из даташита Microchip с номером раздела.

8 уроков

  1. Урок 1. Тулчейн и первая прошивкаavr-gcc, avr-objcopy и avrdude: от main.c до светодиода на платеУрок 1 · 25 мин
  2. Урок 2. Порты и регистры: мигаем светодиодомDDRx, PORTx, PINx, маски битов и мигание светодиодомУрок 2 · 25 мин
  3. Урок 3. Кнопка: подтяжка, чтение PINx и дребезгВход с подтяжкой, чтение PIND, антидребезг опросомУрок 3 · 25 мин
  4. Урок 4. Тактовая частота, фьюзы и F_CPUCKSEL, CKDIV8, CLKPR, F_CPU и как не заблокировать кристаллУрок 4 · 30 мин
  5. Урок 5. Таймеры, прерывания и volatileCTC на Timer0 и Timer1, ISR, sei, volatile, ATOMIC_BLOCKУрок 5 · 30 мин
  6. Урок 6. ШИМ на таймерах Timer0 и Timer2Fast PWM и Phase Correct, WGM, COM, OCR0A, частота и скважностьУрок 6 · 25 мин
  7. Урок 7. АЦП: читаем потенциометрREFS, MUX, ADPS, ADSC и пересчёт кода АЦП в напряжениеУрок 7 · 25 мин
  8. Урок 8. UART: скорость, передача, приём и printfUBRR0, U2X0, UDRE0, RXC0 и printf через поток avr-libcУрок 8 · 30 мин

Как устроен трек

Трек рассчитан на тех, кто уже собирал что-то в Arduino IDE или прошёл трек «Электроника с нуля» и хочет понять, что происходит внутри микроконтроллера. Все уроки используют одну и ту же плату — Arduino Uno с ATmega328P на 16 МГц, — но ни одной функции библиотеки Arduino: только avr-gcc, заголовки avr-libc и регистры.

Каждый урок построен одинаково:

  • цель — что заработает в конце урока;
  • объяснение — регистры и биты с номерами разделов даташита;
  • программа на C, которую можно собрать и прошить;
  • задание с ответом под спойлером;
  • что дальше — следующий урок, страницы регистров атласа, калькуляторы и глоссарий.

Что понадобится

  • Arduino Uno (или Nano с ATmega328P) и кабель USB;
  • светодиод и резистор 330 Ом, кнопка, потенциометр 10 кОм, макетная плата и провода;
  • тулчейн avr-gcc, avr-libc и avrdude — как поставить его в Windows, Linux и macOS, рассказано в статье «Тулчейн AVR GCC»;
  • по желанию — ISP-программатор (USBasp или вторая плата Arduino в роли ArduinoISP) для урока о фьюзах.

Откуда числа

Имена регистров и битов, формулы и предельные параметры взяты из даташита Microchip DS40002061B на семейство ATmega48A/PA/88A/PA/168A/PA/328/P, имена векторов прерываний и макросов — из заголовков и руководства AVR-LibC. Номер раздела даташита указан рядом с каждым фактом, а расчёты, которые сделали мы сами, так и подписаны. Полный справочник по кристаллу — на странице ATmega328P, а все его регистры с битами — в разделе регистров ATmega328P.

Готовятся к публикации

Внешние прерывания INT0, INT1 и PCINT · EEPROM: хранение настроек · Сторожевой таймер и режимы сна · SPI: сдвиговый регистр 74HC595 · I2C (TWI): датчик и часы реального времени · Таймер 1: захват и измерение частоты

Частые вопросы

Что нужно для уроков AVR с нуля?

Плата Arduino Uno или любая другая с ATmega328P, кабель USB, светодиод с резистором 330 Ом, кнопка и потенциометр на 10 кОм. Из программ — тулчейн avr-gcc с avr-libc и avrdude. Программатор не обязателен: прошивать можно через загрузчик платы по USB.

Чем этот курс отличается от программирования в Arduino IDE?

Вместо digitalWrite, analogRead и Serial программа сама пишет в регистры микроконтроллера: DDRB, TCCR0A, ADMUX, UCSR0B. Код получается короче и быстрее, а главное — видно, что на самом деле происходит в кристалле. Те же знания нужны для любого другого AVR и помогают читать даташиты.

Можно ли повредить плату на этих уроках?

Только если нарушить ограничения, о которых говорится в уроках: ток вывода не больше 40 мА по абсолютному максимуму даташита, а неверно записанные фьюзы могут отключить вывод RESET или тактовый генератор, и тогда без особого программатора кристалл не оживить. Пока фьюзы не трогаете, прошивку через загрузчик можно повторять сколько угодно.