Как прошить ATmega328P через другую Arduino?
Обновлено Редакция GAW
Программатор ISP для AVR можно сделать из любой Arduino: пример ArduinoISP из комплекта Arduino IDE превращает её в программатор с протоколом STK500 версии 1. Так прошивают голый ATmega328P, записывают загрузчик или меняют фьюзы без покупки USBasp.
Подключение
| Arduino Uno (программатор) | Цель: ATmega328P в DIP-28 | Цель: другая Uno |
|---|---|---|
| D10 | RESET (вывод 1) | RESET |
| D11 (MOSI) | PB3/MOSI (вывод 17) | D11 |
| D12 (MISO) | PB4/MISO (вывод 18) | D12 |
| D13 (SCK) | PB5/SCK (вывод 19) | D13 |
| 5V | VCC, AVCC (выводы 7, 20) | 5V |
| GND | GND (выводы 8, 22) | GND |
Те же сигналы выведены на 6-контактный разъём ICSP — его распиновка. Конденсатор 10 мкФ ставят между RESET и GND программатора, плюсом к RESET, после загрузки скетча.
Порядок действий
- Загрузите в программатор «Файл → Примеры → ArduinoISP» как обычный скетч.
- Соберите схему и поставьте конденсатор.
- В 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 В на любом другом выводе сожжёт кристалл и всё, что к нему подключено.
Источники
- 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
- 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 В
- 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
Нашли ошибку?
Смотрите также
- ISP (внутрисхемное программирование)Прошивка AVR на плате по SPI и выводу RESET
- AVR ISP, UPDI и TPIISP 6 и 10 pin, USBasp, UPDI и TPI
- Как записать загрузчик Arduino в новый ATmega328P?Программатор ISP, кварц 16 МГц, фьюзы 0xFF/0xDE/0xFD и optiboot_atmega328.hex
- AVRDUDEПрошивка AVR из командной строки: ключи, Arduino, USBasp, фьюзы, ошибки