Post original resgatado do ASM51 antigo:
O comando SLEEP do basic e C é traduzido diretamente em uma instrução SLEEP Assembly do PIC.
Em modo SLEEP, o consumo típico de um 16F84A é da ordem 3.5uA @ 4.5V. Se o watchdog estiver habilitado, adicione 30uA a esse valor. Lembre-se de que as cargas conectadas aos pinos de I/O também irão consumir corrente. Por isso, antes de entrar em SLEEP, é interessante desativar tudo o que é supérfluo ao funcionamento do circuito quando o mesmo estiver "nanando".
Para retornar ao funcionamento normal, basta um RESET de hardware, o estouro do watchdog (que permanece em operação, mesmo no modo SLEEP) ou ocorrência de uma interrupção assíncrona (INT, RB, Comparadores, A/D, TMR1 (modo assíncrono, clock externo), LCD, SSP e Captura (módulo CCP)).
Note que, obviamente, para que o watchdog possa gerar o evento de WAKE-UP, é necessário que o mesmo esteja ativado ... (hehehe). Outra curiosidade interessante: o watchdog, ao estourar a contagem durante o modo SLEEP, não irá provocar um RESET no dispositivo (como acontece com o chip no modo RUN), mas irá resumir a execução do programa da instrução seguinte ao comando SLEEP.
Com relação ao wake-up por interrupções, lembre-se de que é necessário que uma das interrupções assíncronas citadas acima esteja individualmente habilitada ...
Se o bit GIE estiver habilitado, o chip será acordado o fluxo do programa será desviado para o vetor de interrupções. Ao término da RTI o programa irá resumir a execução a partir da instrução seguinte ao SLEEP.
Se o GIE estiver desabilitado, o chip será acordado e a execução será resumida da instrução seguinte ao SLEEP.
Até +
Fábio Pereira
luca
Aspirante
Brazil
119 Posts Posted - 01/03/2003 : 02:14:45
--------------------------------------------------------------------------------
Ola Fabio,
Uma duvida .
Se pongo em sleep o pic para aguardar um interrupt externo, por exemplo aguardo fonte principal voltar, mas se o wachdog esta habilitado , cada estouro acorda o pic, entao o comando sleep e´inutil.
Tem a possibilidade de manter em sleep o pic com o wachdog ligado?
Obrigado
Luca
quote:
--------------------------------------------------------------------------------
Para retornar ao funcionamento normal, basta um RESET de hardware, o estouro do watchdog (que permanece em operação, mesmo no modo SLEEP) ou ocorrência de uma interrupção assíncrona (INT, RB, Comparadores, A/D, TMR1 (modo assíncrono, clock externo), LCD, SSP e Captura (módulo CCP)).
Fábio Pereira
--------------------------------------------------------------------------------
Fabio Pereira
Conselheiro
Brazil
2205 Posts Posted - 01/03/2003 : 02:31:45
--------------------------------------------------------------------------------
Bom, a única forma de utilizar o watchdog como você quer será implementar uma rotina ou função para entrar no modo SLEEP e ao sair do SLEEP, verificar o bit TO. Se o mesmo estiver em 0, o PIC deverá ser colocado para dormir novamente, algo como:
void Modo_sleep (void)
{
while (true)
{
GIE = 1;
sleep();
delay_us (5);
if (TO == 0) sleep(); // se acordou e o watchdog estourou, volta a dormir
}
}
Repare que a solução acima irá ficar em um loop SLEEP infinito (acordando regularmente para atender ao estouro do watchdog). Ao ocorrer uma interrupção, o loop será interrompido, a interrupção será tratada e o programa retornará para o modo sleep ...
Até +