Ошибка 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
RESETPC61
SCKPB519
MISOPB418
MOSIPB317
VCC7
GND8 (и 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

Выполнено: 0 / 6

В команде avrdude программатор указывается как arduino с явным портом, например:

avrdude -c arduino -p m328p -P COM5 -b 19200 -U flash:w:firmware.hex:i

Порт (COM5 в примере) замените на тот, который заняла ваша плата Arduino — его видно в диспетчере устройств или в Arduino IDE. Скорость -b 19200 соответствует стандартному скетчу ArduinoISP.

📊 Каким способом вы прошиваете ATmega328P?
USBasp
Arduino as ISP
Через загрузчик (загрузчик Arduino по UART)
TL866 / универсальный программатор

Прошивка через 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 могут сорвать прошивку. Иногда достаточно временно отключить мешающие узлы или прошивать при снятом внешнем питании устройства.