Watch dog timer (LPC2138)

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Watch dog timer (LPC2138)

Mensagempor Renato » 24 Dez 2006 18:25

2 perguntas básicas de como usar o WDT:

1) Como recarregar o registrador WDTC para evitar o estouro ?
Basta repetir a sequência 0xAA / 0x55 no WDFEED, por exemplo
no final do loop principal. ou é outra maneira ?

2) No caso de colocar o processador no modo Idle ou Power Down
o timer é parado automaticamente ou o programador tem que
prever isso e desativá-lo antes para não estourar ?

Grato.
Renato
Byte
 
Mensagens: 224
Registrado em: 20 Out 2006 08:35

Mensagempor microeletronica » 28 Dez 2006 09:19

1) Sim, se colocar uma sequencia diferente de 0XAA e 0X55, um erro no watchdog feed acontece e um evento de interrupcao e reset do watchdog ocorre.
Mas respondendo, se colocar 0xAA seguido de 0x55, zera o watchdog.
Existe um registrador chamado de WatchDog Timer Value Register, que vc pode acompanhar o incremento do watchdog.


2) O PowerDown Mode automaticamente desconecta e desliga o PLL.
"In Power Down mode, the oscillator is shut down and the chip receives no internal clocks."
e veja que : "Since all chip operations, including the Watchdog Timer, are dependent on the PLL when it is providing the chip clock, accidental
changes to the PLL setup could result in unexpected behavior of the microcontroller."

Entao no Power Down, o WDT pode ser esquecido.

No Idle mode, apenas os perifericos continuam ativos: "Peripheral functions continue operation during Idle mode and may generate interrupts to cause the processor to resume execution. - Idle mode eliminates power used by the processor itself, memory systems and related controllers, and internal buses."

No Idle tambem.

O Reset entra no "System Functions" e a interrupcao é direta no processador. :) Pode esquecer o WDT nesta situacao.

Sugiro que habite ele novamente, zerando-o, quando retornar do Low Power Mode.
microeletronica
Byte
 
Mensagens: 158
Registrado em: 05 Dez 2006 18:22

Mensagempor Renato » 10 Jan 2007 16:50

Outro detalhe:
Na sequência de recarga do WDT
WDFEED=&HAA
WDFEED=&H55

Se durante a execução da primeira linha acontecer uma
interrupt qualquer, foi-se a sequência e o tempo poderá estourar ...
Então teria que:
DISABLE INTERRUPT
WDFEED=&HAA
WDFEED=&H55
ENABLE INTERRUPT

Comentários ?
Renato
Byte
 
Mensagens: 224
Registrado em: 20 Out 2006 08:35

Mensagempor Viktor » 10 Jan 2007 18:00

Renato escreveu:Se durante a execução da primeira linha acontecer uma
interrupt qualquer, foi-se a sequência e o tempo poderá estourar


Correto, porém se houverem bem mais sequencias de reset que o mínimo necessário então pode-se esquecer esse detalhe já que mesmo que isso ocorra é improvável que ocorra várias vezes sucessivas
Viktor
Byte
 
Mensagens: 281
Registrado em: 12 Out 2006 11:33

Mensagempor Renato » 10 Jan 2007 19:24

Na verdade o tempo estourar não seria a situação, embora também
possa acontecer dependendo do valor.

Referi errado.
Quis referir a quebra da sequência, devido ao desvio p/ a interrupção.
Isto poderá gerar o reset (ou interrupção WDT), indesejável no caso ?
Renato
Byte
 
Mensagens: 224
Registrado em: 20 Out 2006 08:35

Mensagempor Viktor » 11 Jan 2007 05:46

Renato escreveu:Quis referir a quebra da sequência, devido ao desvio p/ a interrupção.
Isto poderá gerar o reset (ou interrupção WDT), indesejável no caso ?


Apenas se o tempo até a próxima sequência de reset for insuficiente
Viktor
Byte
 
Mensagens: 281
Registrado em: 12 Out 2006 11:33

Mensagempor Renato » 14 Jan 2007 12:05

Achei no forum Yahoo uma referência p/ esta situação, e a conclusão foi
que realmente a quebra da sequência sempre provoca um reset (ou interrupção WDT), logo é prudente desabilitar Ints antes da sequência, e
claro, habilitar após.
Renato
Byte
 
Mensagens: 224
Registrado em: 20 Out 2006 08:35

Mensagempor microeletronica » 16 Jan 2007 22:08

Transcrevendo do forum:

LPC2104 Watchdog timer

You need to keep in mind that the feed of the watchdog needs to be an atomic instruction, ie if you're IRQ's are firing after you write 0xAA you'll
effectively reset the board.
So first off you need to ensure you're not going to get interrupted mid
feed... sort that first and then if you're still having problems post back
again.

Andy
microeletronica
Byte
 
Mensagens: 158
Registrado em: 05 Dez 2006 18:22

Mensagempor Viktor » 23 Mar 2007 08:19

Caso a informação anterior seja verdadeira, lembro que mesmo escrevendo um comando anterior que desabilite a interrupção, conforme escrito, o ARM pode receber, mesmo assim a interrupção devido ao pipeline. Por este motivo aconselha-se a colocar código nos handlers de interrupção IRQ e FIQ para tratar deste fenômeno. A conclusão disto é que não é possível ter um watchdog confiável nesta situação porque mesmo assim poderá haver um desvio para a interrupção (temporário) entre os caracteres sendo escritos no watchdog.

Gostaria de saber se é realmente obrigatório que SEMPRE os caracteres sejam escritos em sequência.

PS : Na página:
http://www.standardics.nxp.com/support/ ... pe=LPC2148

há um arquivo :

Sample Code Bundle for LPC213x/LPC214x Peripherals using Keil's μVision

onde há um exemplo onde não vejo nada que desabilite as interupções antes de escrever a sequência :
WDFEED = 0xAA;
WDFEED = 0x55;
Viktor
Byte
 
Mensagens: 281
Registrado em: 12 Out 2006 11:33

Mensagempor Renato » 23 Mar 2007 18:19

Viktor escreveu: o ARM pode receber, mesmo assim a interrupção devido ao pipeline. ;

Estás afirmando isso ?! Eu entendia que o Pipeline faz Busca/Decodificação/Execução simultanea de instruções diferentes.
Isto é, está Executando uma, tá decodificando a próxima, e também já
buscando a seguinte.
Se a da Execução for a Interrupt Disable não haverá mais a Int no
próximo ciclo. Ou não ?

Viktor escreveu:Gostaria de saber se é realmente obrigatório que SEMPRE os caracteres sejam escritos em sequência.;

A conclusão é que sim.
Fiz alguns testes aqui e constatei que é necessário desabilitar.

Viktor escreveu:onde há um exemplo onde não vejo nada que desabilite as interupções antes de escrever a sequência :
WDFEED = 0xAA;
WDFEED = 0x55;


Quem sabe no exemplo não é usado Interrupt ou já estava desabilitada, logo não há porquê desabilitar ???
Renato
Byte
 
Mensagens: 224
Registrado em: 20 Out 2006 08:35

Mensagempor Viktor » 23 Mar 2007 18:31

Se a da Execução for a Interrupt Disable não haverá mais a Int no
próximo ciclo. Ou não ?

Poderá. Isto está no manual da ARM referente à arquitetura.



Quem sabe no exemplo não é usado Interrupt ou já estava desabilitada, logo não há porquê desabilitar ???

É possível que esse seja o caso
Viktor
Byte
 
Mensagens: 281
Registrado em: 12 Out 2006 11:33

Mensagempor Renato » 23 Mar 2007 18:46

Bem, se é assim, para o Pipeline de 3 níveis faríamos a seguinte
"medida não-convencional" (ou no popular, gambiarra):

INT DISABLE
INT DISABLE
INT DISABLE
WDFEED = 0xAA
WDFEED = 0x55
INT ENABLE

Mas fico pensando: Será que os caras da Philips não pensaram nisso ?
Ou o Pipeline é apressado e tem um preço para isso eheheh !!!

Estranho que parece bem ao contrário do que menciona o manual sobre
escrita na SRAM, que para garantir um valor escrito em determinadas situações, por exemplo antes de um reset, devo escrever 2 vezes.
Renato
Byte
 
Mensagens: 224
Registrado em: 20 Out 2006 08:35

Mensagempor Viktor » 24 Mar 2007 09:31

Renato,

Refiz minhas observações e pelo jeito o problema só vai aparecer caso dentro da interrupção a(s) interrupção(es) seja(m) habilitada(s), isto é, quando você manda desabilitar as interrupções, pode ser que uma interrupção ocorra e seja atendida. Uma vez dentro da interrupção o flag desta estará desabilitado devido à instrução imediatamente antes da interrupção. O correto seria retornar neste caso. Caso não se retorne, se complete a rotina de interrupção e dentro desta se habilite esta interrupção, poderá ocorrer um problema durante o feed do watchdog
Viktor
Byte
 
Mensagens: 281
Registrado em: 12 Out 2006 11:33


Voltar para ARM

Quem está online

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

x