Распиновка ATmega328 (ATmega328P): пины DIP-28 и прошивка через ISP
На столе лежит ATmega328P в DIP-28 — двадцать восемь ножек, ни одной подписи. Вставил в макетку, подал пять вольт — тишина: светодиод не мигает, программатор чип не видит. В девяти случаях из десяти не хватает одной из трёх вещей: подтяжки на RESET, питания на AVCC или кварца. Ниже — таблица всех 28 пинов с расшифровкой, что куда вешать и как прошить чип без платы.
Тот же кристалл стоит внутри Arduino Uno и Nano — макетный вариант удобен тем, что чип вытаскивается и вставляется обратно. Соответствие простое: PB5 чипа — это D13 на Uno, PC0 — это A0. Опору для сравнения даёт распиновка Uno, а логику будущей прошивки можно прогнать в симуляторе — он исполняет код уровня ATmega328P прямо в браузере.
Дальше по порядку: корпуса DIP-28 и TQFP-32, группы портов B, C, D, питание 1.8–5.5 В и его связь с частотой, схема ISP-прошивки через вторую Arduino и разница между ATmega328P и ATmega328.
Корпуса: DIP-28 и TQFP-32
Один и тот же кристалл продаётся в двух упаковках. DIP-28 — крупные ножки под макетку и панельку, чип вынимается пальцами без паяльника. TQFP-32 — плоский квадрат 8×8 мм с ножками по четырём сторонам: он распаян на Nano, Pro Mini и большинстве плат-клонов. У TQFP на два аналоговых входа больше — ADC6 и ADC7: именно они на Nano зовутся A6 и A7. Выводы кварца PB6 и PB7 в TQFP остаются на месте, так что логика у обеих упаковок совпадает.
| Пин | Имя в чипе | На Uno/Nano | Зачем нужен |
|---|---|---|---|
| 1 | PC6, RESET | RESET | Сброс чипа; на плате подтянут резистором 10 кОм к питанию |
| 2 | PD0 (RXD) | D0 (RX) | Приём по UART |
| 3 | PD1 (TXD) | D1 (TX) | Передача по UART |
| 4 | PD2 | D2 | Цифровой пин, внешнее прерывание INT0 |
| 5 | PD3 | D3 | Цифровой, INT1, ШИМ |
| 6 | PD4 | D4 | Цифровой |
| 7 | VCC | 5V | Питание чипа: 1.8–5.5 В |
| 8 | GND | GND | Земля |
| 9 | PB6 (XTAL1) | — | Внешний кварц; без него работает внутренний генератор 8 МГц |
| 10 | PB7 (XTAL2) | — | Второй вывод кварца |
| 11 | PD5 | D5 | Цифровой, ШИМ |
| 12 | PD6 | D6 | Цифровой, ШИМ |
| 13 | PD7 | D7 | Цифровой |
| 14 | PB0 | D8 | Цифровой |
| 15 | PB1 | D9 | Цифровой, ШИМ |
| 16 | PB2 (SS) | D10 | Цифровой, ШИМ, выбор ведомого в SPI |
| 17 | PB3 (MOSI) | D11 | ШИМ и MOSI шины SPI — через него данные заходят при прошивке по ISP |
| 18 | PB4 (MISO) | D12 | MISO шины SPI — через него программатор читает ответ |
| 19 | PB5 (SCK) | D13 | SCK шины SPI и встроенный светодиод |
| 20 | AVCC | — | Питание модуля АЦП; на плате соединён с 5 В через фильтр |
| 21 | AREF | AREF | Вход опорного напряжения АЦП |
| 22 | GND | — | Вторая земля |
| 23 | PC0 (ADC0) | A0 | Аналоговый вход |
| 24 | PC1 (ADC1) | A1 | Аналоговый вход |
| 25 | PC2 (ADC2) | A2 | Аналоговый вход |
| 26 | PC3 (ADC3) | A3 | Аналоговый вход |
| 27 | PC4 (ADC4, SDA) | A4 | Аналоговый вход и линия I2C SDA |
| 28 | PC5 (ADC5, SCL) | A5 | Аналоговый вход и линия I2C SCL |
Группы портов B, C, D
Все 23 линии ввода-вывода внутри чипа собраны в три порта. PB0–PB5 — это D8–D13: порт B держит SPI (PB2–PB5 — SS, MOSI, MISO, SCK) и встроенный светодиод на PB5. PC0–PC5 — аналоговые входы A0–A5, на PC4/PC5 сидит I2C. PD0–PD7 — это D0–D7: на PD0/PD1 живёт UART, на PD2/PD3 — внешние прерывания INT0 и INT1, ШИМ раскидан по PD3, PD5 и PD6. Старшие биты заняты периферией: PB6/PB7 — кварц, PC6 — RESET. Знать принадлежность пина к порту нужно для прямой работы с регистрами: DDRB, PORTB и PINB вместо digitalWrite.
Питание и тактирование
Чип живёт от 1.8 до 5.5 В. Но частота завязана на питание: до 4 МГц можно при 1.8 В, до 10 МГц — при 2.7 В, полные 20 МГц — только при 4.5–5.5 В. Кварц 16 МГц, которым прошиты Uno и Nano, честно работает на пяти вольтах; от трёх батареек тот же кварц формально вне спецификации. Про стабилизаторы и источники — в гайде по питанию.
RESET (пин 1) на плате подтянут резистором 10 кОм к питанию: без подтяжки чип перезапускается от наводок, а конденсатор 100 нФ на линию DTR даёт автосброс при прошивке по UART. AREF (пин 21) — вход опоры АЦП: по умолчанию опорное берётся с AVCC, внутри доступна и своя на 1.1 В; между AREF и землёй на плате стоит конденсатор 100 нФ.
Прошивка голого чипа: Uno как программатор
Свежий чип из магазина пустой: без загрузчика, на заводских фьюзах с внутренним генератором 1 МГц. Самый дешёвый путь прошить его — вторая Arduino со скетчем ArduinoISP: откройте Файл → Примеры → 11.ArduinoISP, залейте в Uno, соедините платы по таблице и в IDE выберите «Прошить через программатор».
| Пин Uno | Пин ATmega328P (DIP-28) | Что это |
|---|---|---|
| D10 | Пин 1 (RESET) | Сброс — программатор им управляет |
| D11 | Пин 17 (MOSI) | Данные в чип |
| D12 | Пин 18 (MISO) | Данные из чипа |
| D13 | Пин 19 (SCK) | Тактирование |
| 5V | Пины 7 и 20 (VCC, AVCC) | Питание 5 В |
| GND | Пины 8 и 22 (GND) | Общая земля |
| — | Пины 9 и 10 | Кварц 16 МГц и два конденсатора 22 пФ на землю |
| — | Пин 1 (RESET) | Резистор 10 кОм на питание, чтобы чип не сбрасывался сам |
// Голый ATmega328P: светодиод с резистором 220 Ом между PB5 и GND// PB5 — физический пин 19 чипа, он же D13 на Uno void setup() { DDRB |= (1 << PB5); // PB5 — выход} void loop() { PORTB ^= (1 << PB5); // инвертировать бит — фронт раз в полсекунды delay(500); // при кварце 16 МГц это мигание 1 Гц}ATmega328P и ATmega328: в чём разница
Буква P — это picoPower: тот же чип с доработанными спящими режимами. В power-down ATmega328P опускается примерно до 0.1 мкА — батарейный проект на нём живёт годами, старый ATmega328 в той же яме ест на порядок больше. Сигнатуры у чипов различаются (1E 95 0F против 1E 95 14), поэтому программатор при записи загрузчика может отчитаться о незнакомом кристалле — прошиваются оба одинаково. С 2010-х коробочные Uno и Nano комплектуются только 328P. В свежих клонах встречается ещё ATmega328PB: у него два SPI, два I2C и лишний UART, но для него нужно ставить отдельное ядро в IDE.
Оживший чип ведёт себя как маленькая Uno: те же D2–D13 и A0–A5, те же библиотеки. Схему первой мигалки с резистором удобнее собрать по уроку про светодиод и гайду по подключению, а платы вокруг этого кристалла разобраны в распиновке Uno и распиновке Nano.