watchdog-secours.ino

Arduino Nano Every · Archivo : watchdog-secours.ino · Lenguaje : Arduino · Uso : Auto-reprise après blocage grâce au watchdog

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"));
  }
}

← Volver a la ficha