AVR с нуля
Восемь уроков программирования ATmega328P на чистом C без библиотеки Arduino: от первой сборки и прошивки до таймеров, ШИМ, АЦП и UART. Каждое имя регистра и бита, каждая формула — из даташита Microchip с номером раздела.
8 уроков
- Урок 1. Тулчейн и первая прошивкаavr-gcc, avr-objcopy и avrdude: от main.c до светодиода на платеУрок 1 · 25 мин
- Урок 2. Порты и регистры: мигаем светодиодомDDRx, PORTx, PINx, маски битов и мигание светодиодомУрок 2 · 25 мин
- Урок 3. Кнопка: подтяжка, чтение PINx и дребезгВход с подтяжкой, чтение PIND, антидребезг опросомУрок 3 · 25 мин
- Урок 4. Тактовая частота, фьюзы и F_CPUCKSEL, CKDIV8, CLKPR, F_CPU и как не заблокировать кристаллУрок 4 · 30 мин
- Урок 5. Таймеры, прерывания и volatileCTC на Timer0 и Timer1, ISR, sei, volatile, ATOMIC_BLOCKУрок 5 · 30 мин
- Урок 6. ШИМ на таймерах Timer0 и Timer2Fast PWM и Phase Correct, WGM, COM, OCR0A, частота и скважностьУрок 6 · 25 мин
- Урок 7. АЦП: читаем потенциометрREFS, MUX, ADPS, ADSC и пересчёт кода АЦП в напряжениеУрок 7 · 25 мин
- Урок 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 или тактовый генератор, и тогда без особого программатора кристалл не оживить. Пока фьюзы не трогаете, прошивку через загрузчик можно повторять сколько угодно.
Смотрите также
- ATmega328PРаспиновка, фьюзы, Optiboot, периферия, питание, схема и код на C
- avr-gcc и avr-libcКомпилятор, binutils, avr-libc, avrdude: установка, команды сборки, Makefile, заголовки, ошибки
- AVRDUDEПрошивка AVR из командной строки: ключи, Arduino, USBasp, фьюзы, ошибки
- Генератор кода инициализации AVRUSART, таймер, АЦП, INT0/INT1 и GPIO → код на C с проверками