Watch Dog Timer + Arduino


8

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


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


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
}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.