Watch Dog Timer + Arduino


8

Come posso impostare un timer watch dog hardware con un Arduino?


2
Penso che dovresti scegliere l'altra risposta poiché l'Arduino ha il cane da guardia incorporato.
Matt Williamson

Risposte:


7

Sono disponibili numerosi chip watchdog hardware dedicati, ma è abbastanza semplice utilizzare un normale timer IC 555 e un paio di parti di supporto. Con il 555 configurato in modalità astable con un periodo "HIGH" molto lungo e un periodo "LOW" relativamente breve (forse 0,3 secondi), l'uscita può essere collegata al pin di reset dell'Arduino tramite un diodo per rendere il watchdog un open-collector dispositivo. L'Arduino può quindi reimpostare periodicamente il watchdog utilizzando un'uscita digitale per attivare un transistor che scarica il condensatore di temporizzazione collegato al 555, impedendo che raggiunga mai un punto di trigger che gli causerà il ripristino dell'Arduino.

Alcune informazioni di base su un progetto per farlo sono disponibili su http://www.practicalarduino.com/news/id/471


1
il phooky è assolutamente corretto, ma il WDT interno ha dei limiti: non può funzionare per più di circa 6 secondi (dipende dal modello di CPU) e non c'è modo di fare un "riavvio" pulito esclusivamente dal software. Puoi dire alla CPU di passare alla posizione 0 e riavviare il bootloader, ma poi potresti essere lasciato con roba pericolosa nella RAM e cose come flag di interruzione ancora impostati nella CPU. L'asserzione di RESET nell'hardware garantisce che Arduino creerà un ambiente pulito.
Jonoxer,

2
lasciando che il tempo fuori WDT sarà causare un "ripristino pulito", come tutti i registri saranno garantiti per l'avvio in uno stato definito. Realizzarlo nel software è semplice come disabilitare gli interrupt e il loop continuo.
Nick T

14

C'è già un timer watchdog integrato nel chip atmega; puoi usarlo avr/wdt.hper manipolarlo.

Un rapido esempio:

#include <avr/wdt.h>

void setup() {  
  wdt_enable(WDTO_500MS); // have the wdt reset the chip
  // if 500ms passes without a reset
}

void loop() {   
  wdt_reset(); // reset the wdt
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.