🛠 Resusciter une Duemilanove sans bootloader : ICSP, fusibles et ATmegaBOOT
Objectifs
Le bootloader ATmegaBOOT (protocole STK500 d'origine, 57600 bauds sur 328 / 19200 sur 168) peut disparaître : fusibles modifiés, effacement accidentel, gravure ratée. La carte alors ne répond plus à l'IDE mais n'est PAS morte : le connecteur ICSP 2×3 donne accès direct au chip. Ce tuto est la procédure complète de résurrection documentée par le tutoriel officiel « Programmer » : lecture des fusibles, réécriture du bon HEX de bootloader, vérification.
Matériel
- 1 Duemilanove « brique » (pas de port qui monte en téléversant, ou timeout permanent)
- 1 programmateur ICSP : AVR-ISP mkII, USBtinyISP (le classique pas-cher), ou une autre Arduino en ArduinoISP (voir le tuto programmateur)
- Câble nappe ICSP 2×3 ; câble USB
- Les HEX officiels : dossier bootloaders/atmega/ du dépôt ArduinoCore-avr (ATmegaBOOT_168_atmega328.hex pour une 328)
Code complet
# 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 débit 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.
Vérification attendue
La lecture des fusibles renvoie low=0xFF, high=0xDA, extended=0xFD (328) — high=0xDD/extended=0xF8 pour une 168. La signature lue est 0x1E950F (328) ou 0x1E940B (168). Après réécriture du HEX, le Blink de test se téléverse normalement par USB à 57600 bauds : le bootloader est vivant. La LED TX clignote à l'ouverture du port.
Erreurs fréquentes
- Nappe ICSP à l'envers : avrdude répond « device not responding » ou lit 0x000000/0xFFFFFF ; le fil rouge (broche 1) doit aller côté RESET — sur la Duemilanove, l'orientation du connecteur 2×3 diffère selon les révisions, vérifier au multimètre.
- Se tromper de puce dans avrdude :
-p m328psur une 168 grave des fusibles incompatibles ; la signature lue (0x1E940B vs 0x1E950F) tranche la question. - Fusionner les deux vitesses : le bootloader parle à 57600 (328) mais la programmation ISP, elle, se fait au débit propre au programmateur — ne pas mettre
-b 57600sur une commande-c usbtiny. - Laisser le programmateur branché pendant un téléversement USB : le signal RESET est tiré des deux côtés, le téléversement échoue.
- Écraser le bootloader avec un HEX de sketch : après un
-U flash:w:monsketch.hexsans bootloader, la carte ne se reprogramme plus par USB — regravé le bootloader avant de tester l'IDE. - Nourrir la cible en 5 V par le programmateur ET par l'USB de la Duemilanove simultanément : généralement acceptable (même rail) mais source de conflits avec certains clones — alimenter par une seule source.
- Confondre ce cas avec le polyfuse : une carte « morte » qui ne fait même pas sa LED ON est souvent un fusible à réenclenchement de 500 mA déclenché (court-circuit sur le 5 V) — débrancher tout, attendre, rebrancher avant d'attaquer l'ICSP.
Autres tutoriels pour cette carte
- 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)
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinopwm-respiration.inoArduinopotentiometre-plotter.inoArduinoservo-balayage.inoArduinobuzzer-melodie.inoArduino