Ошибка avrdude: initialization failed, rc=-1 при прошивке ATmega328P почти всегда означает одно: программатор не видит микроконтроллер из-за неправильного подключения шести ISP-линий. Чип прошивается через интерфейс SPI по пинам MOSI, MISO, SCK, RESET, VCC и GND, и перепутанная хотя бы одна линия полностью блокирует запись прошивки.
В этой статье разберём распиновку ATmega328P в корпусах DIP-28 и TQFP-32, покажем, какие выводы используются для внутрисхемного программирования, как подключить программатор USBasp или Arduino в режиме Arduino as ISP, и что проверить, если чип не определяется.
Какие пины ATmega328P нужны для прошивки
Для прошивки через ISP (In-System Programming) задействуются линии интерфейса SPI плюс сигнал сброса и питание. Всего шесть обязательных соединений:
- 🔌 MOSI — линия данных от программатора к микроконтроллеру (физически это пин PB3);
- 📡 MISO — линия данных от микроконтроллера к программатору (пин PB4);
- ⏱️ SCK — тактовый сигнал синхронизации (пин PB5);
- 🔄 RESET — сброс, удерживается низким уровнем во время программирования (пин PC6);
- ⚡ VCC и GND — питание чипа, без стабильного питания прошивка невозможна.
Обратите внимание: линия RESET во время прошивки должна быть подтянута к питанию через резистор (типично используют номинал порядка 10 кОм), а программатор в момент записи притягивает её к земле. Если на линии сброса висит конденсатор большой ёмкости или кнопка с замыканием на землю, прошивка может не стартовать.
Для ISP-прошивки ATmega328P достаточно шести линий: MOSI, MISO, SCK, RESET, VCC, GND. Все они есть и в DIP-28, и в TQFP-32 корпусе.
Распиновка ISP-пинов в корпусе DIP-28
Корпус DIP-28 — самый популярный вариант для макетирования на breadboard и в любительских конструкциях. Нумерация выводов идёт против часовой стрелки от ключа (выемки) на торце корпуса. Искомые пины расположены так:
| Сигнал ISP | Вывод порта | Номер ножки DIP-28 |
|---|---|---|
| RESET | PC6 | 1 |
| SCK | PB5 | 19 |
| MISO | PB4 | 18 |
| MOSI | PB3 | 17 |
| VCC | — | 7 |
| GND | — | 8 (и 22) |
Дополнительно стоит подключить AVCC (ножка 20) к питанию — этот вывод питает аналоговую часть и порт C, и оставлять его висящим в воздухе не следует, даже если АЦП не используется. Вывод AREF (ножка 21) при прошивке можно оставить свободным.
Если чип новый, с заводскими фьюзами, он тактируется от внутреннего RC-генератора, и внешний кварц для прошивки не нужен. Но если фьюзы уже переключены на внешний резонатор, без кварца на выводах XTAL1/XTAL2 (ножки 9 и 10) чип не ответит программатору — это одна из самых частых причин «мёртвого» микроконтроллера после неудачной записи фьюзов.
Распиновка для корпуса TQFP-32
В планарном корпусе TQFP-32 (как на платах Arduino Nano и некоторых Pro Mini) нумерация идёт от точки-метки у первого вывода против часовой стрелки. Соответствие сигналов такое: MOSI — ножка 15, MISO — ножка 16, SCK — ножка 17, RESET — ножка 29. Питающих выводов VCC и GND здесь несколько, и все их необходимо подключить.
Поскольку распайка TQFP вручную требует аккуратности, для прошивки отдельных чипов удобнее использовать переходные адаптеры (test socket) TQFP-32 → DIP. Точные номера выводов конкретного корпуса всегда стоит сверять с официальным даташитом Microchip на ATmega328P — там приведены все варианты корпусов, включая MLF.
Почему чип не шьётся после записи фьюзов
Если фьюзами выбран внешний кварцевый резонатор, а кварц не установлен, тактирование отсутствует и ISP не работает. Решение — временно подключить кварц с конденсаторами или подать внешний тактовый сигнал на XTAL1, затем вернуть фьюзы к внутреннему генератору.
Подключение программатора USBasp
Программатор USBasp — бюджетный и распространённый вариант. Он имеет 10-пиновый (или 6-пиновый) ISP-разъём стандартной распиновки. При подключении к «голому» ATmega328P соедините сигналы по именам: MOSI к MOSI, MISO к MISO и так далее — перекрещивать линии, как в UART, здесь не нужно.
На USBasp обычно есть джампер выбора напряжения (5 В или 3.3 В) — он задаёт уровень питания, которое программатор подаёт на целевую плату. Убедитесь, что напряжение соответствует вашей схеме. Ещё один джампер (часто обозначается как SLOW SCK или JP3) снижает частоту тактирования ISP — его нужно замкнуть для чипов с заводскими фьюзами, так как внутренний генератор на низкой частоте не успевает за быстрым SCK.
⚠️ Внимание: не подавайте питание на целевую плату одновременно от программатора и от внешнего источника. Двойное питание может вывести из строя USB-порт компьютера или сам программатор. Выберите один источник.
Прошивка выполняется утилитой avrdude. Пример команды для записи hex-файла:
avrdude -c usbasp -p m328p -U flash:w:firmware.hex:i
Прошивка через Arduino as ISP
Если отдельного программатора нет, его роль выполнит любая плата Arduino. Загрузите в неё скетч Файл → Примеры → ArduinoISP, после чего плата станет ISP-программатором. Сигналы снимаются с цифровых пинов: на Arduino Uno это D11 (MOSI), D12 (MISO), D13 (SCK), а D10 подключается к RESET целевого чипа.
☑️ Проверка перед прошивкой ATmega328P
В команде avrdude программатор указывается как arduino с явным портом, например:
avrdude -c arduino -p m328p -P COM5 -b 19200 -U flash:w:firmware.hex:i
Порт (COM5 в примере) замените на тот, который заняла ваша плата Arduino — его видно в диспетчере устройств или в Arduino IDE. Скорость -b 19200 соответствует стандартному скетчу ArduinoISP.
Прошивка через UART-загрузчик
Если в чип уже записан загрузчик (bootloader), как на платах Arduino, прошивать можно без ISP — через последовательный порт. Здесь задействуются пины RX (PD0, ножка 2) и TX (PD1, ножка 3), плюс линия DTR для автоматического сброса перед загрузкой скетча.
При подключении USB-UART адаптера линии перекрещиваются: TX адаптера → RX чипа, RX адаптера → TX чипа. Линия DTR подключается к RESET через конденсатор порядка 100 нФ — это формирует короткий импульс сброса в начале загрузки. Если DTR нет, кнопку сброса нужно нажимать вручную в момент начала прошивки.
Если загрузчик стёрт или чип куплен отдельно, сначала прошейте его через ISP, а уже потом используйте UART. В Arduino IDE это делается командой «Записать загрузчик» с выбранным программатором.
Типичные ошибки и диагностика
Разберём симптомы, с которыми чаще всего сталкиваются при прошивке ATmega328P, и их вероятные причины:
- ❌
rc=-1, target doesn't answer— обрыв или перепутаны линии MOSI/MISO/SCK, нет питания, либо чипу не хватает тактирования (фьюзы на внешний кварц); - ⚠️
device signature = 0x000000— линия MISO не подключена или замкнута; сигнатура из нулей — верный признак проблемы именно с чтением; - 🐌
cannot set SCK period— предупреждение о скорости; для новых чипов замкните джампер slow SCK или добавьте ключ-B 10в avrdude; - 🔀 Сигнатура не совпадает с ожидаемой — в команде указан не тот чип; проверьте параметр
-p m328p(у ATmega328 без «P» сигнатура другая).
⚠️ Внимание: запись фьюзов — необратимая на практике операция при ошибке. Неверный фьюз RSTDISBL отключает пин RESET, и дальнейшая ISP-прошивка станет невозможной — чип восстанавливается только высоковольтным программатором. Перед записью фьюзов перепроверьте значения в калькуляторе фьюзов и даташите.
Полезная диагностическая команда — просто прочитать сигнатуру без записи: avrdude -c usbasp -p m328p. Если сигнатура читается корректно (для ATmega328P это 0x1e950f), значит, подключение исправно и проблема в другом звене.
Чтение сигнатуры 0x1e950f — быстрый тест исправности подключения. Если сигнатура читается, ISP-линии в порядке; если нули или «target doesn't answer» — ищите обрыв, отсутствие питания или проблему с тактированием.
Часто задаваемые вопросы
Можно ли прошить ATmega328P без программатора?
Да, если в чипе уже записан загрузчик — тогда достаточно USB-UART адаптера, подключённого к пинам RX/TX и RESET (через конденсатор от DTR). Пустой чип без загрузчика прошивается только через ISP-программатор или другую Arduino в режиме Arduino as ISP.
Чем отличается ATmega328 от ATmega328P при прошивке?
Распиновка идентична, но сигнатуры чипов разные, поэтому в avrdude нужно указывать соответствующий идентификатор: m328p для версии с буквой P (picoPower) и m328 для обычной. При несовпадении avrdude выдаст ошибку сигнатуры.
Нужен ли кварц для прошивки нового чипа?
Нет. Новый ATmega328P с заводскими фьюзами тактируется от внутреннего RC-генератора, и внешний кварц не требуется. Кварц понадобится, только если фьюзы уже переключены на внешний источник тактирования.
Почему avrdude пишет «device signature = 0x000000»?
Нулевая сигнатура означает, что данные от чипа не приходят: проверьте линию MISO, питание VCC/GND и общий провод между программатором и целевой платой. Также убедитесь, что RESET подключён и не замкнут на землю посторонними элементами схемы.
Можно ли прошивать чип, запаянный в готовое устройство?
Да, ISP на то и рассчитан — внутрисхемное программирование. Но нужно убедиться, что прочая обвязка устройства не мешает: нагрузка на линиях MOSI/MISO/SCK или цепи на RESET могут сорвать прошивку. Иногда достаточно временно отключить мешающие узлы или прошивать при снятом внешнем питании устройства.