watchdog-secours.ino
En boîtier scellé, un plantage logiciel doit finir en redémarrage : le watchdog du 4809 réinitialise la carte si le firmware oublie sa rafrâche pendant une seconde. Ce croquis arme le chien et montre où placer les wdt_reset dans une tâche longue.
Matériel requis
Un Arduino Nano Every (ATmega4809 à 20 MHz, brochage identique au Nano, USB micro-B, convertisseur UART séparé, broches 5 V, pile de compatibilité avec le Nano classique). Nano Every seule ; le watchdog est un périphérique matériel du 4809.
Câblage
Aucun câblage ; testez en décommentant la boucle bloquante, la carte se remet toute seule chaque seconde.
Fonctionnement
wdt_enable(WDTO_1S) arme le compte à rebours matériel ; wdt_reset() le recharge. Sans rafrâche, le 4809 génère un reset système — reprise propre du setup().
Exécution
Installez le package Arduino megaAVR Boards dans l'IDE, sélectionnez Arduino Nano Every, téléversez. Le Serial USB est séparé du Serial1 matériel (broches RX/TX) : le code série classique fonctionne tel quel.
Variantes
Ajustez le délai (WDTO_250MS à WDTO_8S) selon votre tâche la plus longue, ou désarmez le chien avant une programmation par série.
watchdog-secours.ino
// Watchdog du 4809 : reinitialise la carte si le programme bloque.
// Le core megaAVR fournit l'API wdt identique a l'ancien core AVR.
#include <avr/wdt.h>
void setup() {
// lire la cause du redemarrage AVANT d'armer le watchdog
wdt_disable();
Serial.begin(9600);
Serial.println(F("demarrage"));
wdt_enable(WDTO_1S); // si pas de rafle pendant 1 s -> reset
}
void loop() {
// Tache longue : la boucle doit "nourrir" le chien regulierement
for (int etape = 0; etape < 100; etape++) {
travail(); // votre code potentiellement bloquant
wdt_reset(); // rafle : le programme est vivant
}
// Volontairement bloque ? decommentez pour tester le reset :
// while (true) {}
}
void travail() {
static unsigned long t = 0;
if (millis() - t > 1000) {
t = millis();
Serial.println(F("en vie"));
}
}