All for Joomla All for Webmasters

PIC Watchdog Timer

Se você é iniciante na programação de microcontroladores, você deve estar se questionando se o recurso Watchdog Timer dos microcontroladores PIC tem realmente alguma utilidade. Afinal, quem gostaria de ter o microcontrolador reiniciado, em determinadas circunstâncias, periodicamente?

Na verdade, o Watchdog timer (WDT) tem um função muito importante não apenas contra bugs de software, mas também em situações ambientais agressivas. O WDT oferece a possibilidade de reestabelecer o controle da aplicação pelo microcontrolador através da reinicialização do sistema (um simples reset) mesmo que a falha esteja na próprio oscilador do microcontrolador (o WDT possui clock independente através de um RC interno e, por isso, possui tempo de incremento constante). Esse insucesso do microcontrolador de manter o fluxo do programa adequadamente pode ter várias causas:

  • Condições ambientais que excedem os limites do microcontrolador. Neste caso, o estouro do temporizador pode ocorrer após um tempo maior do que o especificado pelo postscaler (alguns segundos) porque o hardware do microcontrolador está exposto a uma condição que não tem garantia de funcionamento.
  • Instabilidade da alimentação do microcontrolador
  • Falha no oscilador externo. A diferença do WDT em relação ao restante do sistema é justamente o fato dele possuir um oscilador independente do clock principal.
  • Bug no código do programa (um loop infinito, por exemplo). Embora o programa deva ser testado corretamente antes de colocá-lo em produção, o WDT proporciona uma opção de programação defensiva que deve ser utilizado em aplicações críticas e mesmo em outras aplicações triviais. Mesmo que a aplicação não tenha relevância, ninguém deseja ter o sistema travado inesperadamente durante longos períodos.

Portanto, o WDT pode ser utilizado em qualquer tipo de aplicação.

O WDT possui um timeout padrão de 18ms que pode ser incrementado para até alguns segundos através do postscaler. Este divisor de frequência é um recurso compartilhado entre o WDT e o TMR0; portanto, pode-se utilizar o postscaler para o WDT apenas quando ele não está sendo aplicado ao TMR0 (o controle é feito através do bit PSA do registrador OPTION_REG). Para evitar que o sistema reinicie, deve-se adicionar a instrução clrwdt a algum loop do programa para que ela seja executada periodicamente e em um período menor do que o tempo de estouro do de WDT.

O WDT pode ser desativado adicionando-se o parâmetro _WDT_OFF no __CONFIG. A detecção de um reset devido ao WDT é efetuada pela verificação do bit /TO (TimeOut) do registrador STATUS. Este sinal é ativo-baixo: /TO igual a 0 significa que houve um estouro no temporizador watchdog.

Caso o sistema esteja no modo sleep, o WDT acorda o microcontrolador. Este procedimento é chamado de WDT wake-up.

Itens relacionados (por tag)

Deixe um comentário

Certifique-se de preencher os campos indicados com (*). Não é permitido código HTML.