2 de dezembro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

PIC em Sleep Mode

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. Veremos nesse artigo como colocar o PIC em sleep mode.

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 colocamos o PIC em sleep mode 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 esclarecimentos 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 vídeo 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!