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

13 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

Wellington disse...

Por favor ajude-me:
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.

Mega 2560

wellcomebr@yahoo.com.br

Brasilrobotics disse...

olá

Algo de errado aconteceu.
Faça um boot novo para reiniciar tudo. Depois tente entender o que aconteceu. Faz parte do processo de aprendizagem.

Anônimo disse...

Essa limitação pode ser resolvida usando um watchdog via hardware com um 555 por exemplo. como aummentar essa limitaçao com o 555???

Unknown disse...

quando utilizar o wacthdog de qualquer sistema não use os menores valores 15ms apenas deve ser usado em sistemas onde o codigo possui poucas instruções e tem de ser ineterrupt, você não consigirá mais gravar nada neste chip... lamento

:(

pode usar o watch dog mas liguese que ele reseta seu microcontrolador quando o tempo estoura e 15ms é maior que o tempo de espera do ftdi para parar o codigo e gravar a nova função.

Brasilrobotics disse...

opa

O que o Renato Murilo Falarz comentou é importante. Teria que verificar se há essa janela mesmo para confirmar.
Mas um reset muito rápido vai impedir a leitura de um novo código.
Nesse caso um gravador AVR profissional é necessário pois é mais rápido.
O arduino possui algumas limitações pois está pregado na placa que ao mesmo tempo que facilita o iniciante trava os mais experientes.
Mas com um gravador via ISP você resolve isso e seu atmega volta a vida.
Note que o AVR(ATMEGA) foi projetado com essa capacidade de 15ms mas se os periféricos não operam em sintonia pode dar esse tipo de conflito.
Recomendo um gravador AVR sempre ao seu lado pois vez ou outra vai se deparar com situações que o Arduino não anda mas o AVR diz que pode. Entende?
Recomendo executar os códigos e ir do maior tempo para o menor.
Faça alterações nos intervalos de execução do código. Ou seja faça o código durar mais tempo que o reset ou menos tempo e compare os resultados.
Vai ser natural perceber que o reset é um "pino" ou comando de grande dominância.
Nos testes que fiz não houve esse problema usando o UNO.
Mas você pode tentar resolver essa questão de tempo apertando o botão de reset físico e manter apertado, depois mandar gravar um novo código bem curto sem nada no void loop nem no void setup e logo em seguida soltar o botão de reset. Faça algumas tentativas até o código entrar antes do reset. Já obtive um bom resultado usando essa técnica sem ter que recorrer ao gravador AVR para caso semelhante.

Anônimo disse...

Tive o mesmo problema de "travar", usei um outro arduino como gravador AVR para gravar o bootloader no Arduino "travado". Ocorreu tudi certo!

byteshoppingsuport@gmail.com disse...

Boa Noite para todos os amigos.
Venho informar que quando utilizamos o Watchdog de maneira equivocada e bem simples de resolver este problema. Então vamos a Solução?
Você deve pressionar o botão Reset e fazer o upload de um código em branco, lembrando que essa transição tem que ser bem rápida, pois o arduino trabalha com um sincronismo muito alto e muito rápido.
Boa Sorte pra todos!

Unknown disse...

Antes de implementar o watchdog real simule um com um timer do arduino pra saber se o programa vai resetar o watchdog a tempo.

Alexandreinfocenter disse...

Como faço isso ?

Alexandre_Toledo disse...

Sei que pode dar trabalho, mas, trocar o cristal por um de menor frequência, também dá resultado, afinal, ele é a base de tempo para o processamento - frequência menor, período maior. ;)

Unknown disse...

Boa noite

 

©2010 Brasilrobotics | by Gamesh_