WatchDog

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

WatchDog

Mensagempor rsdias » 25 Set 2008 10:54

Olá a todos, estou com um problema, fiz um programa para acionar carga com bateria quando a energia da rede AC acaba, ele tem vários loop's, percebi que este programa está travando, como faço para usar o watchdog para corrigir estas travadas que o programa dá devido a loops muito longos. Como faço para contar o tempo que o watchdog estoura e limpar ele antes, alguem pode me explicar? Obrigado a todos desde já.

Roberto S. Dias
rsdias
Bit
 
Mensagens: 20
Registrado em: 01 Set 2008 17:51

Mensagempor fabim » 25 Set 2008 11:00

rsdias.
tudo god..
o WDT existe não para corrigir algo, e sim no caso de um erro absurdo de sistema o uControlador venha a resetar.
Imagine a seguinte situação, no momento da programação você criou uma rotina que o uControlador só passa deste ponto se POTB, 0 & 1 = 0;
Mas naquele momento do teste aconteceu algo que ficou 0 & 1.
Seja por um rele defeituso, ou uma chave tactil que esta com problemas.
Se você não concertar a chave ou trocar o rele, o WDT por não ser limpo naquela parte e somente no main vai estourar, e resetar o uC.
Desta forma nõ boot do uControlador você por exemplo testa o flag de estouro do wdt, se true então por exemplo dispara beep mostra no rele qual o defeito ou algo do tipo.

Seu problema esta sendo simplesmente na lógica do programa, alguma coisa que você esta deichando passar despercebido.

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor renatokodaira » 25 Set 2008 12:00

1) Voce liga o watchdog timer nos fusiveis de configuraçao ao gravar o PIC (ou coloca WDT_ON nas diretivas do seu firmware).

2) O tempo de estouro nominal do WDT é de 18 ms, mas pode configurar um prescaler no registrador OPTION (bits PS0 a PS2) que multiplica esse valor por 2, 4, 8, 16, 32, 64 ou 128 vezes (no máximo 2,3 s).

3) Quando voce liga o WDT, precisa entao inserir instruçoes Clrwdt (clear watchdog timer) no meio do seu programa. Essa eh a parte complicada da historia: saber quantas e onde inserir essas instruçoes (pra nao ficar resetando a toa).

4) Se voce tiver usando por ex. o 16F88, ele pode usar tambem um oscilador interno de 31kHz e mais um postscaler que multiplica o periodo de estouro por até 65536 vezes.
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

Watch Dog

Mensagempor rsdias » 25 Set 2008 13:05

Obrigado por me responder, mas fiquei com outra dúvida vendo a resposta do fabim, é verdade que só uso isto para corrigir uma falha grave? ou posso usar no caso de ter varios loops longos para proteger o programa?

E como faço a contagem entre as linhas de programação para ver onde coloco a instrução de limpar o WDT.?

Obrigado pela resposta.
rsdias
Bit
 
Mensagens: 20
Registrado em: 01 Set 2008 17:51

Mensagempor fabim » 25 Set 2008 13:30

renatokodaira, num complica a vida do menino não.
Se o bixo esta se perdendo ou travando.. alguma coisa esta errada.
Se esta errado, tem que achar o erro.

Se por um acaso, o sistema em especial necessite do wdt "nunca precisei utilizar", aí é outro caso.

Imagine você investir milhões de neuronios destruidos, tempo dinheiro, em um produto. Mas o programador contou com o WDT por saber que o fonte tinha alguma falha.

Despeça-o... Incompetente.

o sistema tem que ser gerado de tal forma, que caso haja algum erro grave o bixim resete... E da pra saber se resetou por bor ou wdt..
se WDT foi por motivo grave, se é grave vai acontecer varias outras vezes, então o aparelho tem que passar por manutenção ou revisão do firmware pra saber o que esta acontecendo..

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor renatokodaira » 25 Set 2008 13:44

Jah respondendo tambem a msg privada, o watchdog eh usado para que o microcontrolador seja reinicializado e por conseguinte a sua aplicaçao volte a funcionar normalmente em caso de ocorrer um evento nao previsto por falha de software (por exemplo ele entre em loop infinito) que impeça de continuar o programa. Ele nao é projetado para corrigir falhas de hardware (por ex. brown-out = queda na alimentaçao do PIC).
Se o PIC entrar num loop infinito ou parar a execuçao do programa (por ex. sleep - nesse caso o WDT apenas acorda o PIC, sem resetá-lo) o WDT acionado nao vai encontrar uma instruçao clrwdt, o contador vai estourar e colocar a aplicaçao em execuçao novamente.

Usar o WDT é uma mistura de arte e de experiencia. Precisa saber identificar quais trechos do seu programa podem estar sujeitos a travamentos, saber contar o tempo de execuçao de cada rotina (depende do clock, das instruçoes usadas, saltos, etc), se seus loops sao longos colocar pelo menos algumas clrwdt no meio (pode ter um efeito contrario: se houver um clrwdt no meio de um loop infinito, ai o WDT nunca vai resetar e o PIC ficará no loop pra sempre), saber configura-lo com o tempo adequado (isso vai depender de sua aplicaçao - quanto tempo ela pode ficar inerte), etc.

Nao tem uma receita pronta. Uma boa dica é usar um ICD para visualizar a execuçao passo a passo do seu programa e assim poder identificar os pontos criticos passiveis de falha.
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

WatchDog

Mensagempor rsdias » 25 Set 2008 13:49

Obrigado a todos pelas dicas, valeu mesmo.
rsdias
Bit
 
Mensagens: 20
Registrado em: 01 Set 2008 17:51

Mensagempor renatokodaira » 25 Set 2008 13:56

renatokodaira, num complica a vida do menino não.
Se o bixo esta se perdendo ou travando.. alguma coisa esta errada.
Se esta errado, tem que achar o erro.


EU nao estou complicando a vida dele, apenas estou respondendo objetivamente o que ele perguntou: como ativar o WDT, como saber o tempo de estouro, como fazer para nao estourar, etc. Nada de complicaçao. Bem claro e objetivo.
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

Mensagempor fabim » 25 Set 2008 14:07

hehe, o bixo ainda num pegou meu jeitão.rs
Discurpa sinhozim, não quis ser mau educado..

digo o seguinte.. Tu explicou belezinha. No problem " só o lula"

Amigo, não sei se ja tem o abito de zoiar o datasheet.
Os PIC´s em geral seguem a risca o que o renatim falou.

Sobre onde colocar.. aí complica.

Imagina nesse delay longo que você disse colocar um comando CLRWDT;

E ele travar um loop bem encima ou na parte que tem este comando dentro !!! Jamé de reseta.. Viu francês..rs

Em geral, suponha o seguinte.

WDT TIME em EX: 3,2S..

vocÊ sabe que o máximo que todas as rotina juntas de no máximo 2,5S..

No main principal, você pode colocar este comando la no finalzinho de tudo..

tipo

Void main (Void) {
comando
comando
comando
comando
(testes
(testes

// *****CLRWDT;<<<<<<<<<<<< }

MAis fabim eu tenho um delay_ms(20000); 20 segundos.

Aí ferrou geral.

sua função de tempo tem que ser feita de tal forma que para cada ex: 1S ele volte no main para poder Zerar o wdt.
ou Dentro de uma sub rotina tem que prever o CLRWDT, de tal forma que caso ele trave ele não execute este comando, e resete realmente.

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 25 Set 2008 15:58

o amigo postulante parece estar a começar neste mundo. sugiro a ele...é a voce mesmo que desabilite este trem nesta etapa inicial de tua existência. depois de criar alguns calos, aí sim retome-o. pra brincadeiras o cão de guarda só serve pra encher o saco...
ah, mas se for pra algo profissional, médico, militar e o escambal, aí sim compensa encher o saco deste oráculo. aí ninguém vai te dar bola ou lhe ensinar errado...sacumékié né...concorrencia... rs. brinc. - eticamente impossível neste forum.
abrs
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Cláudio » 26 Set 2008 11:03

Lembrando que, para alguns PIC´s novos (inclusive da linha 16) está disponível o WDT Enhanced, que chega até 268 segundos. Assim, realmente dá para utilizá-lo de maneira muito eficiente - por exemplo, colocando apenas uma instrução "clrwdt" no loop principal de seu programa.
[]´s
Cláudio
_______________________________________
"Quem quer, de verdade, faz. Quem não quer, inventa desculpas.
Avatar do usuário
Cláudio
Byte
 
Mensagens: 110
Registrado em: 17 Out 2006 09:19

Mensagempor alex1000 » 29 Abr 2009 20:06

Pessoal, retomo este tópico para solicitar como calcular o tempo de instruções de um programa em C.
Qual é o método para calcular isso?
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor alex1000 » 29 Abr 2009 20:10

Ou melhor ainda para aumentar o tempo do watchdog está escrito que devo alterar o registrador OPTION. Como posso fazer isso em C?
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor jeanfernandes » 29 Abr 2009 22:03

Bom

EM sistemas mais criticos eu uso um WDT interno + WDT externo.
O problema de por um clear no WDT interno so para garantir que o programinha passou la pelo bagulhao do ponto nao te garante nada...

Por exemplo se voce projetou mal uma FIFO na serial e ela entupir ou o ponteiro ficar leleh, o WDT nao te indica nada....

Sinceramente eu nao me lembro a ultima vez que eu tive um problema desses, mas creio que seja pelo jeito deu testar as coisas...
Sei la acho que varia muito com que tipo de analise que voce venha fazer do teu sistema....

Por exemplo, eu uso uma variavel de 16 bits que me sinaliza certas falhas de entradas e saidas do sistema...das funcoes e tals...e quando a quantidade de tempo de execucao das rotinas vai aumentando num certo valor (ai eh experiencia) eu ligo o flag e sinalizo, as vezes no protocolo, as vezes com leds...as vezes eu do reset mermo ....(desligo o refresh do wdt externo)....

Algumas tecnicas fail safe de software sao meio dificeis de falar. Tipo, vamos supor que voce sabe a latencia maxima do seu sistema, tipo ...sei la ...N interrupcoes em X tempo...faca X o menor possivel....e tipo ligue um flag na entrada e desligue na saida de uma rotina para testar....
e ponha um timeout... numa interrupcao proximo de NMI voce pode mandar pela serial, gravar numa flash de teste (sim , eu uso um log de eventos as vezes para me mostrar se os burnin tao file ou nao)....

O pirex me ensinou outras coisas...tipo ficar ligando e desligando a placa initerruptamente para ver como ela se comporta com o transitorio e por ae vai....

Sinceramente eu nao gosto de WDT interno. Sei la...eh util as vezes, mas nao te da certas certezas que um externo da....
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor alex1000 » 30 Abr 2009 13:32

Jean, poderia me explicar como funcionaria um WDT externo? Desconheço esta aplicação do WDT.
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x