Discutindo sobre Watchdog no Arduino

|


Já se imaginou parado num semafaro aguardando as luz mudar de cor 1,2,5min e... Eis que nada contece. Logo você se atira ao acaso e espera que um outro lunático não faça o mesmo na outra mão.
E uma pergunda vem a mente: Quem foi o gênio que não ativou o Watchdog dessa casa de "Mãe Joana"?
Vez ou outra travamentos acontecem e e´ preciso estar pronto para eles. Ou você espera mandar alguem  apertar o botão de reset de um Satelite em orbita? E se a máquina de respiraçao forçada no hospital der um "Xabu"? De fato o "carbra morre".
Vamos descombrir como resolver problema?
    


Devemos ter em mente alguns conceitos básicos.
Exite um software rodando no AVR do Arduino e essa "nuvem" de dados transitando está sujeita a erros.
Você pode fazer uma analogia com o Windows que costuma dar erro mais do que deveria e de imediato você e´ tomado a evocar o poderoso botão de RESET que resolve na marra o que o (Ctrl+Alt+Del) já não dá conta. Quando isso e´ feito tudo volta do ínicio, mas resolve.
Bem.. o arduino também possui o mesmo botão de RESET na placa para a mesma função.
Entretanto nos microcontroladores não e´ viável nem lógico apertar esse botão. As aplições normalmente demandam funcionamento repetitivo e autônomo.
O Watchdog faz a tarefa de testar se o código está travado ou rodando normalmente. Isso pode ser ativado no minimo a cada 15ms ou no máximo 8s usando as configurações básica do AVR.






As configurações básicas que oferencem os tempos de testes e são essas:

 Tempo / Declaraçao para a função / Compatibilidade
15 ms WDTO_15MS ATMega 8, 168, 328, 1280, 2560
30 ms WDTO_30MS ATMega 8, 168, 328, 1280, 2560
60 ms WDTO_60MS ATMega 8, 168, 328, 1280, 2560
120 ms WDTO_120MS ATMega 8, 168, 328, 1280, 2560
250 ms WDTO_250MS ATMega 8, 168, 328, 1280, 2560
500 ms WDTO_500MS ATMega 8, 168, 328, 1280, 2560
1 s WDTO_1S ATMega 8, 168, 328, 1280, 2560
2 s WDTO_2S ATMega 8, 168, 328, 1280, 2560
4 s WDTO_4S ATMega 168, 328, 1280, 2560
8 s WDTO_8S ATMega 168, 328, 1280, 2560


E´ impotante notar que o tempo de execução máximo do código não pode passar de 8s pois estoura o teste e acabará resetando automanticamente, assim parte do código nao será executado..
Essa limitação pode ser resolvida usando um watchdog via hardware com um 555 por exemplo.

Para exemplificar vamos apresentar um código básico sobre o tema:
Baixe o código para executar no arduino: Baixar



#include   avr/wdt.h

void setup() {
  
   pinMode(12, OUTPUT); //use um LEd no pino 12
   wdt_enable(WDTO_2S); //Função que ativa e altera o Watchdog

}


void loop()
{
  digitalWrite(12, HIGH);  
  delay(1000);             
  digitalWrite(12, LOW); 
  delay(1000);
  wdt_reset(); //diz que esta tudo ok
}



OBS: Baixe o código para executar no arduino.

Vamos ao entendimento do código:

 #include  avr/wdt.h
Adiciona a biblioteca que habilita o funcionamento do Watchdog.
E´ o que tem a informação de tudo e diz em detalhes(fica oculto) como cada coisa deve acontecer.


wdt_enable(WDTO_2S); 
Esta e´ uma função que informa o tempo que cada teste deve ser feito.
Altere WDTO_2S o que está entre ( ) para WDTO_15MS e vera o LED piscar alucinado pois está resetando o código ou mude para WDTO_4S onde faz duas vezes o loop para fazer um novo teste.

wdt_reset(); 
Esta função informa que o código está ok e permite tudo continuar normalmente.

Gostou desta Aula? Incentive visitando:
LOJA do Brasilrobotics

2 comentários:

Anônimo disse...

Você tem a biblioteca para me enviar?

Anônimo disse...

Olha a besteira que fiz...rsrs
Coloquei wdt_enable(WDTO_15MS); //Função que ativa e altera o Watchdog
Agora a placa fica em loop e não consigo mais gravar nada.

Alguma dica?

Obrigado

 

©2010 Brasil Robotics | by Gamesh_