watchdog-secours.ino

Arduino Nano Every · Fichier : watchdog-secours.ino · Langage : Arduino · Usage : Auto-reprise après blocage grâce au watchdog

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

← Retour à la fiche