Hola, estoy usando un PIC18F2550 en un proyecto, el tema es que debo disponer de un cronometro para llevar un conteo de tiempo, para actualizar el conteo aprovecho una interrupcion que genero cada 20ms exactos, incrementando un contador y luego realizando los calculos para obtener H:M:S. El tema es que el cronometro atrasa 2 o 3 segundos cada 20min. No se si he realizado los calculos mal. Dejo la rutina empleada a ver si alguien me arroja un poco de luz. Gracias por anticipado.
Utilizo oscilador externo con un cristal de 8mhz.
//variables utilizadas
int32 tiempo=0;//Tiempo de vuelo incrementa en cada interrupcion de tmr3
int32 tiempoS;// conteo de segundos
int32 tiempoH;// conteo de minutos
int32 tiempoM;// conteo de horas
//Control de interrupcion cada 20ms
#INT_TIMER3
void tmr3_isr()
{
output_toggle(BUZZER);//chivato
set_timer3(25536);
if (tiempo < 17999999)tiempo ++; else tiempo=0;// aumenta cada 20ms, para llevar
//el tiempo de vuelo, al llegar a las 100h resetea)
}
Este es el bucle infinito dentro del main por el que muestro el cronometro en un LCD:
bucle:
lcd_gotoxy(1,1);
tiempoS=((tiempo*20)/1000);//pasar de numero de instrucciones a segundos
tiempoH=tiempoS /3600;//saco horas
tiempoS=tiempoS-(tiempoH*3600);//resto horas de los segundos
tiempoM=tiempoS/60;//saco minutos
tiempoS=tiempoS - (tiempoM*60);//resto minutos de los segundos
printf(lcd_putc,"%02lu:%02lu:%02lu",tiempoH,tiempoM,tiempoS);
goto bucle;