Cuidado com o Watchdog Timer no Arduino

Mesmo já tendo utilizados outras famílias de microcontroladores nem sempre você acaba lembrando do básico quando utiliza Arduino, e isso pode se um problema.

Para controlar o portão eletrônico e o alarme do condomínio, fiz um sistema utilizando um Arduino Uno, um Shield Ethernet e 2 relés juntamente com um controle que funcionava tanto para o portão quanto para o alarme. O sistema fica ligado ao roteador e funciona mesmo fora da rede local através da web.

Um problema que percebi é que nem sempre o sistema estava ativo e como não sabia ainda qual era realmente o problema resolvi ativar o WDT (Watchdog Timer) do Arduino. Para quem não sabe o WTD é uma parte independente do processamento principal do microcontrolador que, quanto ativo, realiza uma contagem e se chegar ao limite gera uma interrupção reiniciando o sistema para previnir que este fique travado durante muito tempo por algum problema ocorrido. Para que não ocorra sempre você deve resetar o WDT para que ele nunca alcance seu limite e assim seu código possa ser executado normalmente.

Quando ativei o WTD do meu sistema ele não funcionou bem como deveria. O sistema ficou se reiniciando o tempo todo (é o que acho, não cheguei a esta conclusão empiricamente) e dessa forma eu não conseguia realizar um novo upload para o Arduino e achei que equele chip estava perdido, pois sempre ocorria um timeout na gravação e um mensagem “avrdude: stk500_getsync(): not in sync: resp=0x00″, como se minha placa não fosse a correta ou não estivesse funcionando corretamente.

errowtd
Código que causa loop infinito de resets no Arduino.

Após fazer algumas pesquisas sem sucesso na web resolvi fazer uma tentativa fora do comum para gravar o chip. Após a etapa de compilação e um pouco depois do aparecimento da mensagem “Uploading…”, eu fiz um curto rápido, utilizando um fio, entre o GND e o 5V da placa. Após o curto a placa faz um reset diferente do realizando através do botão e o Arduino consegui entrar em modo gravação. Tentei muitas coisas sem sucesso antes dessa sugestão desesperada. Fiz a mesma coisa em um Arduino Nano e também tive sucesso.

Não tenho tanta experiência com Arduino e não sou profissional na área. Se alguém quiser enviar ou, por comentário mesmo, fazer alguma observação ou sugestão fiquem à vontade.

 

6 comentários sobre “Cuidado com o Watchdog Timer no Arduino

  1. Cara, estive fazendo uns testes com WDT também e estou com um chip 328 travado igual ao seu.
    Vou fazer um curto desses para testar…afinal, já tá perdido mesmo…rs

    Abraços.

  2. Meu amigo, você me salvou! Na realidade o que você fez foi desligar o Arduino ao fechar o curto na alimentação. Eu não corri esse risco, simplesmente desliguei a alimentação e só religuei no momento que a IDE informou que estava carregando e finalmente deu certo! Ao desligar a alimentação, o Arduino demora para reiniciar e da tempo de carregar o novo programa antes do Watchdog começar a atuar.

  3. Acredito que definir um timer de watchdog maior, tipo uns 8 segundos pode evitar problemas desse tipo, ou até mesmo quando aparecer uploading na ide, apertar o botão de reset do arduíno (não é pra apertar o reset enquanto está compilando, apenas quando aparecer que está enviando, mas tem que ser rápido). Fechar curto nos 5v em alguns computadores pode danificar a placa, queimando componentes da placa principalmente de notebooks. Até porque o arduino está ligado ao seu computador.

    1. É ótima sua observação Isael, a minha abordagem realmente foi um ato de desespero! Como mencionei, eu testei tudo que podia inclusive o botão de reset em diferentes momentos. Realmente corri o risco de danificar minha USB. Se fosse para testar algo do tipo novamente (espero que nunca!) o faria em um HUB USB, que tem um circuito a parte, não diretamente na porta no notebook.

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>