Hola amigos del foro, estoy realizando un datalogger, el cual funciona con una pila de 3.6v, el problema que tengo es que necesito tomar muestras con el adc cada cierto tiempo, el asunto es que en modo normal las pilas me duran muy poco y el único método de que la pila no se consuma en tan poco tiempo es dejar al micro dormido. Ahora, he estudiado el datasheet del 16f873A y dice que con el timer1 con un reloj externo se puede despertar el micro por la interrupción de este y que también se puede muestrear con el adc en este modo de bajo consumo, mi problema es que no he logrado que el micro se interrumpa, no se cual sea el problema, adjunto el código y el diagrama por si alguien puede ayudarme.
# include<16f873a.h>
//# device adc=10
# use delay(clock = 4M)
//# include <string.h>
# fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT
//# priority timer1,rda
/***************************************************************************************************/
# use rs232(baud = 9600, rcv = PIN_C7, xmit = PIN_C6, parity = N, bits = 8, stream = com1, stop = 1)
/***************************************************************************************************/
//# include"drivers.c"
char rcvdata[10];
boolean flagRCV = 1, flagSLEEP;
byte cont1SEG, segundos;
/***************************************************************************************************/
void init_micro(void){
//rtc_init();
//init_ext_eeprom(); // Inicializa eeprom 24LC256
//setup_adc(adc_clock_internal); // Reloj interno para ADC
//setup_adc_ports(RA0_analog); // Utilizo RA0 como analogo
//setup_adc(AN0); // Activo el conversor de RA0
enable_interrupts(int_rda); // Activo interrupcion serial
enable_interrupts(global);
fprintf(com1,"Conectado....\r\n");
}
void start_loggin(void){
enable_interrupts(int_timer1);
enable_interrupts(global);
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_8);
delay_ms(10);
set_timer1(0);
fprintf(com1,"\r\nSTART LOGGIN\r\n");
}
void command(void){
byte index;
flagRCV = 0;
if(rcvdata[0] == 0x33)
start_loggin();
for(index=0; index<10; index++)
rcvdata[index] = 0x00;
flagSLEEP = 0;
}
void low_power(void){
flagSLEEP = 1;
sleep();
}
void main(void){
init_micro();
while(true){
if(!flagSLEEP)
sleep();
if(flagRCV){
command();
}
}
}
# int_rda
void serial_isr(void){
flagSLEEP = 1;
if(kbhit()){
flagRCV = 1;
gets(rcvdata);
}
}
# int_timer1
void timer1_isr(void){
//flagSLEEP = 1;
cont1SEG++;
if(cont1SEG == 2){
segundos++;
if(segundos%2 != 0)
output_high(PIN_B1);
if(segundos%2 == 0){
output_low(PIN_B1);
segundos = 0;
}
cont1SEG = 0;
}
}
Para saber si se produce la interrupcion en modo sleep enciendo y apago un led cada vez que se mete a la interrupción del timer, el cristal externo es de 32.768 khz y lo tengo conectado en RCO/T1OSO y RC1/T1OSI