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
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /*--------------------------------------------------------- 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