watchdog-secours.ino
En caja sellada, un cuelgue de software debe acabar en reinicio: el watchdog del 4809 reinicia la placa si el firmware olvida su refresco durante un segundo. Este sketch arma el perro y muestra dónde colocar wdt_reset en una tarea larga.
Hardware
Un Arduino Nano Every (ATmega4809 a 20 MHz, mismo formato que el Nano, USB micro-B, chip UART separado, pines de 5 V, compatibilidad directa con el Nano clásico). Nano Every sola; el watchdog es un periférico de hardware del 4809.
Cableado
Sin cableado; prueba descomentando el bucle bloqueante: la placa se reinicia sola cada segundo.
Funcionamiento
wdt_enable(WDTO_1S) arma la cuenta atrás de hardware; wdt_reset() la recarga. Sin refresco, el 4809 genera un reset de sistema: recuperación limpia del setup().
Ejecución
Instala el paquete Arduino megaAVR Boards en el IDE, selecciona Arduino Nano Every y carga. El Serial USB está separado del Serial1 de hardware (pines RX/TX): el código serie clásico funciona tal cual.
Variantes
Ajusta el retardo (WDTO_250MS a WDTO_8S) a tu tarea más larga o desarma el perro antes de programar por serie.
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"));
}
}