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.
// 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){ } }
sbit WAKEUP at RB0_bit;
Como a única interrupção configurada está na RB0, não
IOCBF0_bit = 0;
/*Ao ligar a MCU, não haverá de imediato interrupção,
portanto usa-se o main para fazê-la dormir pela
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.
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.