Перейти к содержанию

Как прошить ATmega328P через другую Arduino?

Обновлено Редакция GAW

Программатор ISP для AVR можно сделать из любой Arduino: пример ArduinoISP из комплекта Arduino IDE превращает её в программатор с протоколом STK500 версии 1. Так прошивают голый ATmega328P, записывают загрузчик или меняют фьюзы без покупки USBasp.

Подключение

Arduino Uno (программатор)Цель: ATmega328P в DIP-28Цель: другая Uno
D10RESET (вывод 1)RESET
D11 (MOSI)PB3/MOSI (вывод 17)D11
D12 (MISO)PB4/MISO (вывод 18)D12
D13 (SCK)PB5/SCK (вывод 19)D13
5VVCC, AVCC (выводы 7, 20)5V
GNDGND (выводы 8, 22)GND

Те же сигналы выведены на 6-контактный разъём ICSP — его распиновка. Конденсатор 10 мкФ ставят между RESET и GND программатора, плюсом к RESET, после загрузки скетча.

Порядок действий

  1. Загрузите в программатор «Файл → Примеры → ArduinoISP» как обычный скетч.
  2. Соберите схему и поставьте конденсатор.
  3. В Arduino IDE выберите целевую плату, программатор «Arduino as ISP» и порт программатора; затем «Записать загрузчик» — подробности в ответе «Как записать загрузчик Arduino в новый ATmega328P?».

Из командной строки то же делает avrdude:

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

Скорость такта

Скетч запрашивает такт SPI 1 МГц / 6 ≈ 167 кГц и, раз это больше F_CPU / 128, включает аппаратный SPI. У ATmega328P программатора аппаратный SPI делит 16 МГц только на 2, 4, 8, 16, 32, 64 и 128 (табл. 19-5 даташита), и ближайшая частота не выше запрошенной — 16 МГц / 128 = 125 кГц (наш расчёт). Даташит цели требует, чтобы уровни SCK длились дольше двух её тактов, то есть частота ISP меньше fck/4. Для нового кристалла на 1 МГц это меньше 250 кГц — 125 кГц проходят с запасом. Что такое внутрисхемное программирование и какие ещё программаторы бывают, рассказывает статья об ISP.

Похожие вопросы

Зачем конденсатор 10 мкФ на RESET программатора?

Когда avrdude открывает COM-порт, преобразователь USB–UART на Uno сбрасывает микроконтроллер — так работает автосброс для загрузчика. Программатор при этом перезапустился бы и не ответил. Конденсатор гасит импульс сброса; ставят его после загрузки ArduinoISP, иначе не загрузится сам скетч.

Почему avrdude пишет, что сигнатура 00 00 00?

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

Можно ли так восстановить кристалл с отключённым RESET?

Нет: ArduinoISP работает только по последовательному интерфейсу, а после RSTDISBL нужен высоковольтный параллельный программатор, который подаёт 12 В на вывод RESET. Делать его своими силами рискованно: 12 В на любом другом выводе сожжёт кристалл и всё, что к нему подключено.

Источники

  1. Arduino. ArduinoISP.ino, репозиторий arduino/arduino-examples (examples/11.ArduinoISP) — вывод 10 сбрасывает целевой кристалл; аппаратный SPI — MISO, MOSI, SCK (на Uno — D12, D11, D13); светодиоды на 9 (работает), 8 (ошибка), 7 (идёт программирование); SPI_CLOCK = 1 МГц / 6; если SPI_CLOCK > F_CPU / 128, на AVR используется аппаратный SPI (USE_HARDWARE_SPI); BAUDRATE 19200
  2. Arduino Docs. Arduino as ISP and Arduino Bootloaders (репозиторий arduino/docs-content) — программирование использует VCC, GND и четыре сигнала; D10 программатора — к RESET цели; электролитический конденсатор 10 мкФ между RESET и GND программатора (плюс — к RESET) нужен платам с отдельным USB-преобразователем — Uno, Mega, Mini, Nano — и ставится после загрузки скетча; неверные фьюзы могут закрыть доступ по ISP, тогда помогает только высоковольтный программатор на 12 В
  3. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B, 2020 — разд. 1, рис. 1-1 — выводы корпуса 28 PDIP: 1 — RESET, 7 — VCC, 8 и 22 — GND, 17–19 — PB3–PB5 (MOSI, MISO, SCK), 20 — AVCC; 28.8 — последовательное программирование: низкий и высокий уровни SCK длиннее двух тактов процессора при fck < 12 МГц; табл. 19-5 — частота SCK ведущего SPI: fosc/2 … fosc/128

Нашли ошибку?