Watch Dog Timer + Arduino

8

¿Cómo configuro un temporizador de vigilancia de hardware con un Arduino?

littlebirdceo
fuente
2
Creo que deberías elegir la otra respuesta ya que Arduino tiene incorporado el perro guardián.
Matt Williamson

Respuestas:

7

Hay una serie de chips de vigilancia de hardware dedicados disponibles, pero es bastante fácil hacerlo usando un IC de temporizador 555 normal y un par de piezas de soporte. Con el 555 configurado en modo astable con un período "ALTO" muy largo y un período "BAJO" relativamente corto (quizás 0.3 segundos), la salida se puede conectar al pin de reinicio del Arduino a través de un diodo para hacer que el perro guardián sea un colector abierto dispositivo. Luego, el Arduino puede restablecer periódicamente el perro guardián utilizando una salida digital para encender un transistor que descarga el capacitor de temporización conectado al 555, evitando que llegue a un punto de activación que hará que reinicie el Arduino.

Alguna información básica sobre un proyecto para hacer esto está disponible en http://www.practicalarduino.com/news/id/471

jonoxer
fuente
1
phooky es absolutamente correcto, pero el WDT interno tiene limitaciones: no puede ejecutarse durante más de aproximadamente 6 segundos (depende del modelo de la CPU) y no hay forma de hacer un "reinicio" limpio únicamente desde el software. Puede decirle a la CPU que salte a la posición 0 y reinicie el gestor de arranque, pero es posible que se quede con cosas poco fiables en la RAM y cosas como banderas de interrupción todavía establecidas en la CPU. La afirmación de RESET en hardware garantiza que Arduino obtendrá un entorno limpio.
jonoxer
2
dejando que el tiempo fuera WDT va causar un "reinicio limpio", como se les garantizará todos los registros para poner en marcha en un estado definido. Lograrlo en el software es tan simple como deshabilitar las interrupciones y hacer un bucle sin fin.
Nick T
14

Ya hay un temporizador de vigilancia integrado en el chip atmega; puedes usar avr/wdt.hpara manipularlo.

Un ejemplo rápido:

#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
}
phooky
fuente
3

He oído que se informan algunos problemas con el WDT y el cargador de arranque normal, por lo que es posible que desee probar con otro cargador de arranque, por ejemplo, Adaboot.

Además, puede hacer muchas más cosas con el WDT además de solo un reinicio. Recomiendo http://www.atmel.com/dyn/resources/prod_documents/doc2551.pdf

Puñal
fuente