Autor Tema: timer1 y adc en modo sleep con 16F873A  (Leído 2660 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jhonastad

  • PIC10
  • *
  • Mensajes: 34
timer1 y adc en modo sleep con 16F873A
« en: 09 de Septiembre de 2009, 16:05:54 »
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.

Código: [Seleccionar]
# 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

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: timer1 y adc en modo sleep con 16F873A
« Respuesta #1 en: 09 de Septiembre de 2009, 16:40:18 »
Me parece que el problema podria estar en la bandera flagSLEEP , tendrias que inicializarla en 1 para asegurarte que no entre al if donde esta la instruccion sleep(), y recuerda que el USART no puede despertar al micro.

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado jhonastad

  • PIC10
  • *
  • Mensajes: 34
Re: timer1 y adc en modo sleep con 16F873A
« Respuesta #2 en: 09 de Septiembre de 2009, 18:03:40 »
Me parece que el problema podria estar en la bandera flagSLEEP , tendrias que inicializarla en 1 para asegurarte que no entre al if donde esta la instruccion sleep(), y recuerda que el USART no puede despertar al micro.

Saludos

Gracias por responder, mira realice la simulacion en proteus y si se despierta con la interrupion rda, pero no pasa nada con el timer1, lo probe fisicamente y no funciona, tambien lo probe con reloj interno el cual en proteus funciona bien pero al implementarlo no funciona, no se ha que se deba el problema, supongo que es de programacion.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: timer1 y adc en modo sleep con 16F873A
« Respuesta #3 en: 09 de Septiembre de 2009, 18:55:13 »
Del proteus no te fies mucho, revisa la hoja de datos del PIC y veras que el USART en modo asincrono no despierta al PIC, en modo sincrono dice que si ,ahora si el proteus lo simula es un error del Proteus.

Otra cosa, para simular el reloj externo en el Proteus yo he usado el generador de pulso del proteus (Pulse), talvez con esto puedas simular el TMR1, pero si no te funciona en la vida real revisa lo que te digo la interrupcion del USART que no despierta al PIC.

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado jhonastad

  • PIC10
  • *
  • Mensajes: 34
Re: timer1 y adc en modo sleep con 16F873A
« Respuesta #4 en: 09 de Septiembre de 2009, 19:41:22 »
Tienes razón, probé el circuito fisicamente y no despierta por la interrupcion rda  :(.

Desconectado jhonastad

  • PIC10
  • *
  • Mensajes: 34
Re: timer1 y adc en modo sleep con 16F873A
« Respuesta #5 en: 21 de Septiembre de 2009, 18:33:13 »
Hola de nuevo, solucioné el problema, pero ahora me surge otro, resulta que conecte el timer1 con un cristal externo y cuando lo inicializo para que empiece a contar el micro se resetea y tarda mas de 5 minutos en activarse el timer1 no logro entenderlo.


 

anything