HOME      PROJETOS      PROGRAMAÇÃO     
  1. INTRODUÇÃO
  2. RECURSOS
  3. ARQUITETURA
  4. ENDEREÇAMENTO
  5. INTERRUPÇÕES
  6. NÍVEIS DE INTERRUPÇÕES NA FAMÍLIA 18F
  7. RESETS DO MICROCONTROLADOR
  8. MODO SLEEP
  9. WATCHDOG TIMER
  10. O STACK
  11. A LINGUAGEM ASSEMBLER
  12. MPLAB - Criando Projetos
  13. LIBRARIES - Usando Bibliotecas de Funções


MODO SLEEP

A função SLEEP dos MCU PICs é muito útil para economizar energia numa aplicação em que o MCU é alimentado por uma bateria.



Entrando no Modo Sleep

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...



Saindo do Modo Sleep

O MCU sairá do modo Sleep, quando um dos seguintes eventos ocorrer:

  1. Qualquer tipo de Reset como: reset no pino MLCR, Power On, Brown-Out ou Stack Overflow.
  2. Estouro do Watch Dog Timer.
  3. Uma interrupção de módulo periférico que consiga ligar o flag de interrupção durante o modo Sleep como:
    Interrupção externa, Interrupção On-Change, Comparators, A/D converter, Timer1, SSP, Capture, etc.

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.



Acordando com o WatchDog Timer

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.





Acordando com Interrupções

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.





  1. INTRODUÇÃO
  2. RECURSOS
  3. ARQUITETURA
  4. ENDEREÇAMENTO
  5. INTERRUPÇÕES
  6. NÍVEIS DE INTERRUPÇÕES NA FAMÍLIA 18F
  7. RESETS DO MICROCONTROLADOR
  8. MODO SLEEP
  9. WATCHDOG TIMER
  10. O STACK
  11. A LINGUAGEM ASSEMBLER
  12. MPLAB - Criando Projetos
  13. LIBRARIES - Usando Bibliotecas de Funções

H P S P I N

Desde 04 de Março de 2010

Atualização: 08 de Oct de 2024