0% encontró este documento útil (0 votos)
38 vistas5 páginas

Uso del Watchdog Timer en Arduino

El watchdog es un temporizador independiente en el microcontrolador que causa un reinicio del sistema si el programa principal se bloquea y deja de actualizar el contador del watchdog. El watchdog en Arduino tiene tres modos de funcionamiento y se configura y gestiona mediante la librería wdt.h y funciones como wdt_enable() y wdt_reset().

Cargado por

Art Xpress
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
38 vistas5 páginas

Uso del Watchdog Timer en Arduino

El watchdog es un temporizador independiente en el microcontrolador que causa un reinicio del sistema si el programa principal se bloquea y deja de actualizar el contador del watchdog. El watchdog en Arduino tiene tres modos de funcionamiento y se configura y gestiona mediante la librería wdt.h y funciones como wdt_enable() y wdt_reset().

Cargado por

Art Xpress
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Arduino Watchdog

En electrónica, un perro guardián (en inglés watchdog) es un mecanismo de seguridad que provoca un
reset del sistema en caso de que éste se haya bloqueado.
Consiste en un temporizador que irá continuamente decrementando un contador, inicialmente con un
valor relativamente alto. Cuando este contador llegue a cero, se reiniciará el sistema, así que se debe
diseñar una subrutina en el programa de manera que refresque o reinicie al perro guardián antes de que
provoque el reset. Si el programa falla o se bloquea, al no actualizar el contador del perro guardián a su
valor de inicio, éste llegará a decrementarse hasta cero y se reiniciará el sistema mediante una
interrupción.

El watchdog es un timer que va dentro de la arquitectura del microcontrolador y es independiente del


resto de timers. Ver diagrama de bloques:
La interrupción del watchdog como vimos anteriormente es la más prioritaria en la tabla de los vectores
de interrupción.
El Watchdog Timer en el microprocesador del Arduino solo tiene una fuente de reloj que es su propio
oscilador interno de 128kHz (a diferencia de los temporizadores internos de 8/16bit, que pueden usar el
reloj del sistema de 16Mhz o un reloj externo). Es este oscilador separado permite que el WDT funcione
en el modo de potencia más baja: SLEEP_MODE_PWR_DOWN .

Toda la información del wathcdog en el ATmega328p está en la página 75 de


[Link]
328P_datasheet.pdf
Los registros que maneja el watchdog son:

 MCU Status Register – To make use of the Reset Flags to identify a reset condition, the user
should read and then Reset the MCUSR as early as possible in the program. If the register is
cleared before another reset occurs, the source of the reset can be found by examining the
Reset Flags.
Name: MCUSR
 WDTCSR – Watchdog Timer Control Register
Name: WDTCSR

Configuración del watchdog timer:

(1) WDTON es un fuse que habilita o deshabilita el watchdog.


Los tres modos de funcionamiento son:
 Interrupt Mode – La rutina del vector de interrupción WDT_vect se llamará cuando el WDT
expire. Puede utilizarse para despertar al microcontrolador desde los modos de sleep, incluido
el modo de suspensión de menor potencia (SLEEP_MODE_PWR_DOWN), en el que no están
disponibles otros temporizadores.
 System reset Mode: cuando se produce un timeout del tiempo de espera del watchdog, se
reiniciará el microcontrolador. Para usar en el manejo de bloqueos o culegues del código.
 Interrupt and System Reset Mode – Primero se llamará a la ISR de la interrupción WDT_vect,
cuando se complete se va al System Reset Mode.
La selección del prescale se hace mediante estos bits y son los únicos tiempos permitidos al watchdog:
Para gestionar el watchdog con Arduino debe utilizarse la librería de wdt.h y sólo tres funciones:
 wdt_disable() para desactivar el watchdog, necesario llamarlo antes de configurar un nuevo
watchdog
 wdt_enable(tiempo) que configura y activa el watchdog al tiempo que se indica como
parámetro (tiempo)
 wdt_reset() que renueva el intervalo que cuenta el perro guardián.

La documentación de la librería <avr/wdt.h>: Watchdog timer handling


 [Link]
 [Link]
 Macro wdt_enable:
[Link]
[Link]
 Macro wdt_disable:
[Link]
[Link]

La librería wdt.h se encuentra en la ruta: C:\Program Files


(x86)\Arduino\hardware\tools\avr\avr\include\avr
También disponemos de una librería para manejar el wdt: [Link]

NOTA: los bootloader antiguos de Arduino no tienen soporte para watchdog y en ese caso hay que
actualizar el bootloader o poner el optiboot: [Link] Optiboot está
instalado por defecto en el Arduino y puede usarse para actualizar los Arduino antiguos.

Más información:
 [Link]
 [Link]
 [Link]
 [Link]
fun-and-profit/
 [Link]
 Interesante artículo de watchdog en Arduino y Raspberry PI:
[Link]
Systems/?ALLSTEPS
 Interesante artículo de watchdog en Arduino y Raspberry PI:
[Link]
Systems/?ALLSTEPS

Resetear Arduino
Al pulsar el botón de reinicio, se resetea el AVR. Además, el IDE de Arduino envía una señal especial
que hace que la tarjeta Arduino se resete.
Cómo deshabilitar el autoreset on serial connnection:
[Link]

Después de encender o reiniciar el AVR, inmediatamente comienza a ejecutar el bootloader. El


bootloader de Arduino observa durante unos segundos para ver si se está descargando un nuevo sketch
desde el IDE de Arduino. Si es así, borra todo lo que estaba en flash y quema en el nuevo sketch. A
continuación, el gestor de arranque comienza a ejecutar cualquier sketch que se encuentre en el flash.
Si queremos saber cuántas veces se ha reiniciado un Arduino, podemos guardarlo en la EEPROM, e
incluso saber la razón del reinicio mirando el registro MCUSR.
Otras formas de resetear Arduino:

 WDT, es la forma más fiable de resetear el AVR el mismo


 Conectar un cable al pin de reset desde alguna fuente externa o desde un pin del mismo Arduino
con una resistenca de 1K.
 Ejecutar la dirección 0 (jmp 000) que vuelve a la dirección 0 pero no resetea completamente
Arduino y no todas las configuraciones por defecto son restauradas, como por ejemplo el estado
de los pines.

Código:
void software_Reset()
// Restarts program from beginning but
// does not reset the peripherals and registers
{
asm volatile (” jmp 0″);
}
void(* resetFunc) (void) = 0; //declare reset function at address 0

Para más información sobre System Reset ver página 72 de [Link]


8-bit-AVR-Microcontroller-ATmega328-328P_datasheet.pdf
Más información:
 [Link]
 [Link]
board-by-code/
 [Link]

Ejercicio Watchdog Arduino


Comprobar el funcionamiento del watchdog con este ejercicio.

[Link]

También podría gustarte