HOME PROJETOS PROGRAMAÇÃO |
A função SLEEP dos MCU PICs é muito útil para economizar energia numa aplicação em que o MCU é alimentado por uma bateria.
O MCU entra em modo Sleep com o uso da instrução assembler SLEEP .
Enquanto o MCU permanecer nesse estado, o consumo de corrente é mínimo pois o oscilador é desligado fazendo com que nenhuma instrução seja executada.
As portas de I/O mantêm o estado que possuiam antes da instrução SLEEP ser executada. Assim, antes de entrar em Sleep, o programador deve configurar todas as portas de I/O como entrada para que elas não drenem nem forneçam corrente para os dispositivos que possam estar conectados a elas como LEDs, transistores, LCDs, etc...
O MCU sairá do modo Sleep, quando um dos seguintes eventos ocorrer:
|
Para os eventos descritos no ítem 1, o MCU vai acordar sumariamente fazendo com que o programa seja executado desde sua primeira instrução no endereço 0x0000 da memória de programa.
Para os eventos descritos nos ítens 2 e 3, o programa será reiniciado na instrução seguinte a instrução SLEEP porque, quando a instrução SLEEP é executada para entrar no modo Sleep, é feito um pré-fetch da próxima instrução e, quando quando o MCU acorda, o programa reinicia nessa instrução. No caso de interrupções, essas podem ou não requerer rotinas de ISR. Veja mais adiante.
O WatchDog Timer ou WDT é um temporizador independente que possui seu próprio oscilador.
O WDT proporciona uma forma do programa se recuperar de erros de programação que podem travar o programa ou colocá-lo em loop infinito.
Quando o temporizador WDT estoura, um reset do MCU é automaticamente provocado.
O WDT é habilitado pelo bit de configuração WDT ou WDTE, dependendo do MCU utilizado.
Quando o bit de configuração WDT está habilitado, ele não pode ser desabilitado pelo programa.
Para que o WDT não estoure ele deve ser limpo, de tempos em tempos, com a instrução assembler CLRWDT.
Por exemplo, no PIC16F628A, o WDT tem um tempo default de 18ms (milisegundos), ou seja, ele estoura a cada 18ms. Esse tempo pode ser modificado com o uso do prescaler selecionado através dos bits PS0-PS2 do registrador OPTION_REGISTER (ver data sheet). Observar que o bit PSA também deve ser ligado senão, o prescaler será atribuido ao TIMER0.
Numa situação normal, quando trabalhamos com o WDT habilitado, devemos codificar uma instrução CLRWDT numa posição estratégica dentro do programa, ou seja, onde tivermos certeza que ela sempre seja executada para limpar o WDT periodicamente, evitando seu estouro. Assim procedendo, se houver algum problema com o programa como travamento ou se ele entrar num loop, a instrução CLRWDT não será executada e o WDT vai estourar provocando um reset automático do MCU, caso em que o PC (Program Counter) será carregado com o endereço zero de memória e o programa reiniciará.
Todavia, se o MCU estiver em no Modo Sleep, o estouro do WDT znão vai provocar um reset. Neste caso, o MCU vai acordar e o programa será reiniciado na instrução seguinte a instrução SLEEP.
Em tempo, devemos observar que quando a instrução SLEEP é executada, o temporizador é zerado porém, o WDT continua rodando se estiver habilitado.
Para usar uma interrupção apenas para acordar o MCU, sem a necessidade de executar uma rotina ISR, a interrupção desejada deve estar habilitada porém, não é necessário que o bit GIE (Global Interrupt Enable) esteja ligado. Quando a interrupção ocorrer, o programa será reiniciado a partir da instrução seguinte a instrução SLEEP.
Se, no caso acima, o bit GIE estiver ligado, o programa executará a instrução seguinte ao SLEEP a desviará para a rotina de ISR apontada pelo endereço especificado no vetor de interrupção.
H P S P I N Desde 04 de Março de 2010 Atualização: 08 de Oct de 2024 |