🛠 Resusciter une Duemilanove sans bootloader : ICSP, fusibles et ATmegaBOOT
Objetivos
El bootloader ATmegaBOOT (protocolo STK500 original, 57600 baudios en 328 / 19200 en 168) puede desaparecer: fusibles modificados, borrado accidental, grabación fallida. La placa entonces no responde al IDE pero NO está muerta: el conector ICSP 2×3 da acceso directo al chip. Este tutorial es el procedimiento completo de resurrección documentado por el tutorial oficial «Programmer»: lectura de los fusibles, reescritura del HEX correcto del bootloader, verificación.
Material
- 1 Duemilanove «brick» (sin puerto que suba al cargar, o timeout permanente)
- 1 programador ICSP: AVR-ISP mkII, USBtinyISP (el clásico barato), o una otra Arduino en ArduinoISP (ver el tutorial del programador)
- Cable plano ICSP 2×3; cable USB
- Los HEX oficiales: carpeta bootloaders/atmega/ del repositorio ArduinoCore-avr (ATmegaBOOT_168_atmega328.hex para una 328)
Código completo
# 1) Brancher le programmateur sur l'ICSP de la Duemilanove (respecter
# le sens du nappe : pin 1 = marque rouge, vers le RESET).
# 2) Lire les fusibles (USBtinyISP via avrisp ; 19200 est le debit ISP)
# Attendu pour ATmega328 : low=0xFF high=0xDA extended=0xFD
avrdude -c usbtiny -p m328p -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h
# 3) Si les fusibles sont hors spec (ex. high=0xC9 : RESET coupe !),
# les reprogrammer :
avrdude -c usbtiny -p m328p -U lfuse:w:0xFF:m -U hfuse:w:0xDA:m -U efuse:w:0xFD:m
# 4) Recrire le bootloader officiel (HEX du core, 2 Ko en fin de flash)
avrdude -c usbtiny -p m328p -U flash:w:ATmegaBOOT_168_atmega328.hex:i
# 5) Verifier la signature puis tester par le bootloader :
avrdude -c usbtiny -p m328p -n # "Reading | ####... signature 0x1E950F"
# IDE : carte "Duemilanove or Diecimila / ATmega328" + Blink -> doit repasser
# Variante 168 : -p m168, fusibles high=0xDD extended=0xF8,
# HEX ATmegaBOOT_168.hex, upload a 19200 bauds.
Verificación esperada
La lectura de los fusibles devuelve low=0xFF, high=0xDA, extended=0xFD (328) — high=0xDD/extended=0xF8 para una 168. La firma leída es 0x1E950F (328) o 0x1E940B (168). Tras la reescritura del HEX, el Blink de prueba se carga normalmente por USB a 57600 baudios: el bootloader está vivo. El LED TX parpadea al abrir el puerto.
Errores frecuentes
- Cable plano ICSP al revés: avrdude responde «device not responding» o lee 0x000000/0xFFFFFF; el hilo rojo (pin 1) debe ir hacia el lado de RESET — en la Duemilanove, la orientación del conector 2×3 difiere según las revisiones, verificar con el multímetro.
- Equivocarse de chip en avrdude:
-p m328psobre una 168 graba fusibles incompatibles; la firma leída (0x1E940B vs 0x1E950F) resuelve la duda. - Confundir las dos velocidades: el bootloader habla a 57600 (328) pero la programación ISP se hace a la velocidad propia del programador — no poner
-b 57600en un comando-c usbtiny. - Dejar el programador conectado durante una carga por USB: la señal RESET se tira desde ambos lados, la carga falla.
- Sobrescribir el bootloader con un HEX de sketch: tras un
-U flash:w:misketch.hexsin bootloader, la placa no se reprograma más por USB — regraba el bootloader antes de probar el IDE. - Alimentar el objetivo con 5 V por el programador Y por el USB de la Duemilanove simultáneamente: generalmente aceptable (mismo riel) pero fuente de conflictos con algunos clones — alimentar por una sola fuente.
- Confundir este caso con el polyfuse: una placa «muerta» que ni siquiera enciende su LED ON suele ser un fusible autorrearmable de 500 mA disparado (cortocircuito en el 5 V) — desenchufar todo, esperar, volver a enchufar antes de atacar el ICSP.
Otros tutoriales para esta placa
- Faire clignoter la LED 13 d'une Duemilanove (et choisir le bon ATmega)
- Bouton poussoir et moniteur série sur la Duemilanove (avec ses 0,5 s de silence)
- Potentiomètre et variation LED : l'ADC 10 bits et le PWM 8 bits version AVR
- Ajouter un deuxième port série avec SoftwareSerial (GPS sur broches 10/11)
- Régler la référence de mesure avec AREF et analogReference
- Persister une calibration dans l'EEPROM de l'ATmega (512 octets ou 1 Ko)
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinopwm-respiration.inoArduinopotentiometre-plotter.inoArduinoservo-balayage.inoArduinobuzzer-melodie.inoArduino