PIC em Sleep Mode

 

Para continuarmos com nosso projeto do cofrinho eletrônico serão necessários alguns conceitos mais a respeito dessa MCU utilizada, o 16F1827. Um dos recursos que será utilizado é o sleep, para a MCU dormir enquanto não estiver processando nada. Essa é uma das maneiras de economizar energia, uma vez que a intenção é alimentar na bateria com possibilidade de ligar a uma fonte externa.

O sleep pode ser iniciado em qualquer parte, tanto nas interrupções quanto em main() e para levantar a MCU pode-se utilizar WDT, reset externo no MCLR, BOR ou POR. Pode-se utilizar também qualquer tipo de interrupção externa e qualquer tipo de interrupção periférica capaz de rodar em modo sleep.

Para exemplificar como colocar em sleep e como levantar, utilizarei a INT0, na porta RB0. Os demais comentários colocarei diretamente no código a seguir, escrito na IDE MikroC.


// Oscilador interno a 8 MHz
sbit LED at RB1_bit; // LED para responder quando a MCU levantar

sbit WAKEUP_TRIS at TRISB0_bit; //Configurando a porta RB0 para receber interrupção
sbit WAKEUP      at RB0_bit;

/*Aqui está a declaração da função que trata as interrupções.
  Como a única  interrupção  configurada  está  na  RB0,  não
  precisamos muito tratamento por agora.
*/
void interrupt(void){
  if (INTCON.INTF == 1){
 /*Acontecendo a interrupção, a MCU levanta e a primeira coisa a
   fazer (como sempre) é desligar a chave geral das interrupções.
   Toda a rotina pretendida pode ser tratada diretamente dentro 
   dessa função ou então em uma função externa.
*/
  INTCON.GIE  = 0;
   LED = 1;
   Delay_ms(400);
   LED = 0;
   Delay_ms(200); 
   INTCON.INTF = 0;
   IOCBF0_bit  = 0;
   INTCON.GIE  = 1;
   asm sleep;
  }
 /*Ao término, as flags de interrupções foram tratadas
   e novamente o processador foi colocado para dormir*/
}
void main() {
 TRISB = 0b00000000;
 TRISA = 0b00100000;
 WAKEUP_TRIS = 1;
 
 INTCON.GIE  = 1;
 INTCON.PEIE = 1;
 INTCON.INTE = 1;
 
 LED = 0;
 /*Ao ligar  a MCU, não haverá de  imediato interrupção,
   portanto   usa-se  o  main  para  fazê-la dormir pela 
   primeira vez. Note que essa inst rução precede o loop
   e o loop é infinito, prendendo a execução do programa.
 */
 asm sleep;
  
 while(1){

 }
}

O consumo de energia já é um bocado baixo, ficando em torno de 7.3 mA (com o PIC alimentando o LED de 3mm, com consumo de 6.9mA), mas quando em sleep o consumo cai para 70uA, algo realmente representativo. Testei um LED na própria protoboard e resultou num consumo de 4.6mA. Considerando que um LED já tem um consumo ínfimo, o PIC por sí só já é incrivelmente econômico, mas quando em sleep é quase que realmente desligado.

Veja o vídeo da medição do consumo.

Sem o LED o PIC levanta consumindo ~520uA e estáveis 47uA quando em sleep. Obviamente o PIC não será utilizado apenas para dormir e acordar, então o video é apenas para mostrar a entrada e saída com algum consumo de recurso.

Por fim, deixem seus comentários e não se acanhem em perguntar pelo próprio blog. Tenho recebido emails para exclarecimentos e prestá-los no blog ajudará também a outras pessoas que podem não saber formular a pergunta ou não perguntam por qualquer outro motivo.

No próximo post veremos como gravar em EEPROM interna e externa para armazenar os valores variáveis e configurações de inicialização do nosso cofrinho eletrônico, espero-os lá!

Se gostou, não deixe de compartilhar; dê seu like no video e inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Prefere seguir-nos pelo facebook? Basta curtir aqui.

Prefere twitter? @DobitAoByte.

Próximo post a caminho!

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Deixe uma resposta