8 de dezembro de 2018

Watchdog Timer - Reset Automático do Circuito

Um sistema de Watchdog é responsável por reiniciar o circuito caso ocorra travamentos.


O watchdog funciona como um cronômetro e, ao atingir seu tempo limite é disparado o comando de reset do circuito.
Em projetos onde o circuito necessita estar operando por várias horas, a utilização do recurso de reset automático para prevenção de travamentos é essencial.

É possível o sistema de watchdog por hardware e via software.
Vamos ver como fazer por software no Arduino.

O funcionamento é da seguinte forma: deve-se configurar qual será o timeout do watchdog e, de forma intermitente, devemos enviar um comando para zerar seu cronômetro, sempre antes de ser atingido seu timeout.
Se por algum motivo o sistema parar de responder e travar, não será enviado o comando para zerar o cronômetro, fazendo com que seu timeout seja atingido e assim será gerado o reset do circuito.

Para utilização no Arduino é necessário incluir a biblioteca do watchdog <avr/wdt.h>.
A biblioteca permite a configuração de alguns valores para timeout:
  • WDTO_15MS para 15 milissegundos
  • WDTO_30MS para 30 milissegundos
  • WDTO_60MS para 60 milissegundos
  • WDTO_120MS para 120 milissegundos
  • WDTO_250MS para 250 milissegundos
  • WDTO_500MS para 500 milissegundos
  • WDTO_1S para 1 segundo
  • WDTO_2S para 2 segundos
  • WDTO_4S para 4 segundos
  • WDTO_8S para 8 segundos
O exemplo que utilizaremos foi configurado um watchdog com timeout de 4 segundos.
A comunicação serial exibirá uma contagem numérica e, ao pressionar o botão por 1 segundo, será executado um delay com tempo igual ao timeout, fazendo com que o comando para zerar o cronômetro do watchdog não seja executado.
O sistema será reiniciado pois o watchdog atingirá seu timeout.

/*---------------------------------------------------------
  Programa : WATCHDOG TIMER
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 08/12/2018
  ---------------------------------------------------------*/
#include <avr/wdt.h> //Biblioteca do watchdog
#define BUTTON 2     //Porta de conexão do botão
int count = 0;       //Variável para contagem numérica

void setup() {
  //Configura a porta com pull-up interno
  pinMode(BUTTON, INPUT_PULLUP);

  //Inicia a comunicação serial e exibe a mensagem
  Serial.begin(9600);
  Serial.println("WATCHDOG TIMER");

  //Habilita o watchdog configurando o timeout para 4 segundos
  wdt_enable(WDTO_4S);
}

void loop() {
  //Exibe o valor da variável através da serial
  Serial.println(count);
  count++;

  //Delay de 1 segundo
  delay(1000);

  //Executa um delay mais alto caso o botão seja pressionado
  if (digitalRead(BUTTON) == LOW) {
    Serial.println("O botao foi pressionado.\nO reset do cronometro do watchdog nao sera realizado antes de atingir o timeout.\n");
    delay(4000);
  }

  //Reseta o temporizador do watchdog
  wdt_reset();
}

Nenhum comentário:

Postar um comentário