Manual
do
Maker
.
com
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 Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.