WatchDog - Reset a system



WatchDog Hardware

Circuitul prezentat este realizat în jurul integratului 555 și folosit ca timer pentru resetarea unui dispozitiv. Sistemul este denumit "WatchDog". În această situație circuitul este folosit pentru placa de dezvoltare Arduino.
Varianta hardware reprezintă aplicarea unui semnal pe pinul de reset al dispozitivului, cea ce duce la resetarea sistemului.

Circuitul funcționează ca un astabil. La punerea în funcțiune, ieșirea 555 este pozitivă și datorită diodei nu poate trece spre Reset. Condensatorul C1 se încarcă prin R1 și R2 până când linia Discharge 555 se deschide, cea ce duce la descărcarea C1 și apariția unei tensiuni negative la ieșirea 555 și implicit la pinul Reset prin D1, rezultând Resetarea Sistemului. După descărcarea C1 ciclul se reaia.
În această configurație, fără  să conectam pinul Digital I/O, ciclul se repetă după aprox. 80 secunde (avem un Reset la fiecare 80 sec.). Dacă dorim controlul Resetului, trebuie aplicat la pinul Digital I/O un semnal negativ scurt în intervalul de 80 sec pentru a reinițializa circuitul (mai exact, punerea la masă prin R3 duce la reîncărcarea C1).



Programare Arduino pentru control 555 prin pin Digital I/O:

Reinițializare WatchDog la un interval de 5 secunde folosind funcția Delay
>> (Această variantă întârzie ciclul programului cu 5 sec. !!!)

int dog = 12;                                     // set pin for harware watchdog (Digital I/O)

void loop()
{
  // set harware watchdog circuit
  pinMode(dog, OUTPUT);             // set dog pin
  digitalWrite(dog, LOW);               // reset dog
  delay(200);
  pinMode(dog, INPUT);                 // release dog
  Serial.println("WatchDog Hardware restarted...");
  delay(5000);                                  // wait 5 sec before run again
}

Reinițializare WatchDog la un interval de 10 secunde folosind funcția millis

int dog = 12;                                                    // set pin for harware watchdog (Digital I/O)
unsigned long timedelay = millis();             // store last time update for harware watchdog
const int interval = 10000;                           // set 10 sec. interval for restart harware watchdog

void loop()
{
    // set harware watchdog circuit
  if ((millis()-timedelay) > interval) {
  pinMode(dog, OUTPUT);                      // set dog pin
  digitalWrite(dog, LOW);                        // reset dog
  delay(200);
  pinMode(dog, INPUT);                          // release dog
  Serial.println("WatchDog Hardware restarted...");
  timedelay = millis();
}

WatchDog Software

 Varianta software constă doar în programarea plăcii de dezvoltare și nu necesită alte circuite periferice. Timerul intern variază între 15milisec și 8sec. Pentru programare este necesară includerea unor librării.

Programare Arduino pentru reset:

Reset dacă sistemul staționează mai mult de 2 secunde
 
#include <avr/wdt.h>  // include library
 
void setup() {
  wdt_disable(); // disable reset function at startup
  wdt_enable(WDTO_2S); // set reset for 2 sec
}
 
void loop() {
  wdt_reset(); // restart reset function
}

 
Reset folosind funcția de chemare și funcția millis la un interval de 60 sec
 
#include <avr/wdt.h>  // include library
unsigned long resetsys = millis();  // store millis for system reset
void loop() {
// millis function trigger on every 60 sec   
  if ((millis()-resetsys) > 60000) {
    reset(); // call reset function
    resetsys = millis(); // reset millis   
  }
}
 
void reset() {
  wdt_enable(WDTO_250MS);
  while(1);
} 



0 comentarii:

Trimiteți un comentariu