Archivo de la etiqueta: Watchdog

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 http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-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

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: https://github.com/WickedDevice/SoftReset

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

Más información:

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: http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection

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 http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_datasheet.pdf

Más información:

Ejercicio Watchdog Arduino

Comprobar el funcionamiento del watchdog con este ejercicio.

Ejercicio52: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio53-Watchdog