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.
13 comentários:
Você tem a biblioteca para me enviar?
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
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
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.
Essa limitação pode ser resolvida usando um watchdog via hardware com um 555 por exemplo. como aummentar essa limitaçao com o 555???
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.
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.
Tive o mesmo problema de "travar", usei um outro arduino como gravador AVR para gravar o bootloader no Arduino "travado". Ocorreu tudi certo!
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!
Antes de implementar o watchdog real simule um com um timer do arduino pra saber se o programa vai resetar o watchdog a tempo.
Como faço isso ?
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. ;)
Boa noite
Postar um comentário