Ошибка avrdude: initialization failed, rc=-1 при попытке прошить ATmega328P через USBasp чаще всего указывает не на неисправный микроконтроллер, а на неверное подключение линий ISP или отсутствие питания на целевой плате. Прошивка этого чипа программатором — штатная процедура: загрузчик, скетч или готовый HEX-файл записываются по интерфейсу ISP за пару минут, если соблюдены три условия — правильная распайка шести сигналов, корректные драйверы и верно выбранные параметры в программе-прошивальщике.

В этой инструкции разберём весь цикл: от выбора программатора и распиновки до записи фьюзов и проверки результата. Материал подходит как для «голого» чипа на макетке, так и для платы Arduino Uno/Nano, где ATmega328P установлен на заводе.

Что понадобится для прошивки

Минимальный набор — сам программатор, целевой микроконтроллер и компьютер с подходящим софтом. Наиболее распространены два варианта аппаратной части: клон USBasp на базе ATmega8 и Arduino as ISP, когда в роли программатора выступает вторая плата Arduino. Оба работают через шестипроводный интерфейс ISP (In-System Programming).

Программная часть тоже проста. Утилита avrdude входит в состав Arduino IDE, поэтому отдельно устанавливать её обычно не нужно. Для Windows потребуется драйвер программатора (для USBasp это драйвер на базе libusb, который удобно ставить через Zadig), для Linux — как правило, только права доступа к USB-устройству.

  • 🔌 Программатор: USBasp, AVRISP mkII, USBtinyISP или Arduino в режиме ISP
  • 🎯 Целевой чип ATmega328P — на плате Arduino или отдельно
  • 🖥️ Компьютер с Arduino IDE или standalone-версией avrdude
  • 🔗 Перемычки «мама–мама» или шлейф с разъёмом ISP 6/10 pin
  • 🔋 Источник питания 5 В для целевой схемы (часто берётся с программатора)
📊 Каким программатором вы прошиваете AVR?
USBasp
Arduino as ISP
AVRISP mkII / оригинальный
Другой / ещё выбираю

Подключение ATmega328P к программатору по ISP

Интерфейс ISP использует шесть линий: MOSI, MISO, SCK, RESET, VCC и GND. На платах Arduino эти сигналы выведены на стандартный шестипиновый разъём ICSP, а также продублированы на цифровых пинах 11 (MOSI), 12 (MISO), 13 (SCK), а RESET — на соответствующем выводе. Для «голого» чипа в DIP-корпусе сигналы снимаются с ножек согласно даташиту: MOSI — вывод 17, MISO — 18, SCK — 19, RESET — 1.

Порядок соединения прост, но требует внимательности. Сначала соедините земли программатора и целевой схемы — без общего GND ничего не заработает. Затем подключите MOSI к MOSI, MISO к MISO, SCK к SCK и RESET программатора к RESET чипа. Перекрестного соединения, как в UART, здесь нет: сигналы идут «один в один».

Сигнал ISPПин ATmega328P (DIP-28)Пин Arduino UnoНазначение
MOSI17D11 / ICSPДанные от программатора
MISO18D12 / ICSPДанные от чипа
SCK19D13 / ICSPТактирование
RESET1RESETВход в режим программирования
VCC / GND7, 20 / 8, 225V / GNDПитание
⚠️ Внимание: не подавайте питание на целевую плату одновременно от программатора и от внешнего источника — возможен конфликт по линии 5 В. Выберите один источник. Также проверьте положение перемычки выбора напряжения на USBasp, если она есть: ATmega328P в стандартной схеме работает от 5 В, а для 3,3-вольтовых схем нужен соответствующий уровень.
💡

Если чип «голый» и новый, он тактируется от внутреннего RC-генератора на низкой частоте. Пониженная скорость ISP (джампер JP3 / «slow SCK» на USBasp) заметно повышает шанс успешного первого контакта.

Установка драйверов и проверка связи

Для Windows ключевой этап — драйвер. USBasp определяется системой как неизвестное устройство, пока не установлен драйвер на базе libusb. Проще всего сделать это через программу Zadig: подключите программатор, выберите его в списке, укажите драйвер libusbK или libusb-win32 и нажмите установку. Arduino as ISP драйвера отдельного не требует — он виден как обычный COM-порт.

Проверить связь с чипом можно короткой командой avrdude, которая только читает сигнатуру микроконтроллера и ничего не записывает:

avrdude -c usbasp -p m328p

В ответ утилита должна вывести сигнатуру устройства. Для ATmega328P ожидаемое значение — 0x1E 0x95 0x0F. Если вместо этого вы видите target doesn't answer или нулевую сигнатуру, проблема в проводах, питании или слишком высокой скорости SCK — вернитесь к проверке подключения.

☑️ Проверка перед прошивкой

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

Прошивка через Arduino IDE и avrdude

Самый наглядный путь — Arduino IDE. Загрузите в IDE нужный скетч, откройте меню Инструменты → Программатор и выберите свой вариант (USBasp или Arduino as ISP). Плату выбирайте соответствующую целевому устройству — для Uno/Nano с ATmega328P это Arduino Uno или Arduino Nano. Затем используйте пункт Скетч → Загрузить через программатор — скетч запишется напрямую, затирая загрузчик.

Для записи готового HEX-файла удобнее командная строка. Типовая команда выглядит так:

avrdude -c usbasp -p m328p -U flash:w:firmware.hex:i

Здесь -U flash:w:...:i означает запись (w) во флеш-память файла в формате Intel HEX. После записи avrdude автоматически выполняет верификацию — сравнивает записанное с исходным файлом. Сообщение verified в конце лога означает, что прошивка легла корректно.

Если нужно не заменить, а восстановить загрузчик Arduino, используйте пункт Инструменты → Записать загрузчик — IDE сама выставит штатные фьюзы и запишет boot-секцию. После этого плату снова можно прошивать по USB-UART обычным способом.

Как сделать программатор из второй платы Arduino

Загрузите в плату-донор скетч ArduinoISP из примеров IDE (Файл → Примеры → 11.ArduinoISP). Затем соедините пины донора 11, 12, 13 и 10 с MOSI, MISO, SCK и RESET целевого чипа соответственно (пин 10 донора управляет RESET цели). В списке программаторов выберите «Arduino as ISP» — именно его, а не «ArduinoISP». Для плат с керамическим резонатором иногда требуется конденсатор между RESET и GND донора, чтобы подавить автосброс; необходимость зависит от конкретной платы.

Фьюзы ATmega328P: что важно знать

Фьюзы (fuse bytes) — это конфигурационные ячейки, определяющие источник тактирования, размер boot-секции, порог сброса по питанию и другие аппаратные настройки. Записываются они тем же avrdude, например: -U lfuse:w:0xFF:m для младшего байта. Штатные значения для Arduino Uno можно посмотреть в файле boards.txt внутри пакета поддержки плат.

⚠️ Внимание: ошибка в фьюзах — самая частая причина «окирпичивания» чипа. Установка фьюза RSTDISBL отключает вывод RESET, и дальнейшая прошивка по ISP становится невозможной; неверный выбор источника тактирования (внешний кварц, которого нет на плате) оставит чип без тактов. Перед записью фьюзов сверяйте значения с даташитом или проверенным калькулятором фьюзов и записывайте исходные значения, прочитанные до изменения.

Безопасное правило: сначала прочитайте текущие фьюзы командой avrdude -c usbasp -p m328p -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h и сохраните вывод. Если после изменений чип перестал отвечать, восстановление обычно возможно только высоковольтным программатором (HVPP/HVSP) — это отдельное устройство, поэтому лучше не доводить до такой ситуации.

💡

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

Типичные ошибки и их решение

Большинство проблем при прошивке ATmega328P сводится к нескольким повторяющимся сценариям. Разберём их по симптомам.

  • rc=-1 / target doesn't answer — нет связи с чипом: проверьте распайку, питание, общий GND и включите медленный SCK
  • signature 0x000000 — MISO замкнут на землю или чип обесточен; 0xFFFFFF — MISO не подключен вовсе
  • verification mismatch — данные записались с ошибками: снизьте скорость SCK, укоротите провода, проверьте питание
  • ❌ Чип «не виден» после смены фьюзов — вероятно, выбран внешний источник тактирования; попробуйте подать внешний клок на XTAL1 или используйте HVSP-программатор

Отдельный случай — устаревшая прошивка самого USBasp. avrdude может выдавать предупреждение warning: cannot set sck period. Оно не критично и не мешает прошивке, но обновление прошивки программатора (делается вторым программатором) устраняет сообщение и добавляет поддержку автоматического выбора скорости.

💡

Держите провода ISP короткими — 10–15 см. Длинные шлейфы на высокой скорости SCK дают сбои верификации даже при исправной схеме.

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

Можно ли прошить ATmega328P без программатора?

Да, если в чип уже записан загрузчик Arduino — тогда прошивка идёт через USB-UART-преобразователь. Но загрузчик в «чистый» чип впервые записывается только программатором по ISP.

Затрётся ли загрузчик при прошивке через программатор?

Да. Запись скетча командой «Загрузить через программатор» стирает область загрузчика. Восстановить его можно пунктом «Записать загрузчик» в Arduino IDE тем же программатором.

Как узнать, что чип исправен, а проблема в подключении?

Чтение сигнатуры — лучший тест. Если avrdude стабильно возвращает 0x1E 0x95 0x0F, микроконтроллер жив и отвечает. Нулевая или «плавающая» сигнатура почти всегда указывает на монтаж, а не на неисправность.

Чем отличается ISP от высоковольтного программирования (HVSP)?

ISP работает через штатные сигналы и требует активного вывода RESET и корректных фьюзов тактирования. HVSP подаёт +12 В на RESET и позволяет сбросить любые фьюзы, включая RSTDISBL — это способ восстановления «залоченных» чипов, но нужен специальный программатор.

Какие фьюзы ставить для работы от внутреннего генератора 8 МГц?

Точные значения зависят от требуемых настроек BOD и стартапа, поэтому рассчитывайте их по даташиту ATmega328P или проверенным калькулятором фьюзов. Ключевой момент — выбор внутреннего RC-источника в младшем фьюз-байте вместо внешнего кварца. Не копируйте значения вслепую: сначала прочитайте и сохраните заводские фьюзы.

💡

ATmega328P прошивается любым ISP-программатором по шести проводам; главные условия успеха — верная распайка, единое питание, чтение сигнатуры перед записью и осторожность с фьюзами.