Hola, quiero que echen un vistazo a esta parte de codigo de un frecuencimetro, que funciona, pero la lectura oscila sobre unos +/-10Hz:
//Medimos frecuencia
set_timer1(0x0000);//borra el timer1
set_timer0(Periodo);
EN_FREC=1;//comienza cuenta de impulsos.
enable_interrupts(GLOBAL);//comieza a contar la base de tiempo.
while(FlagBT==1){
if(TMR1IF){//Se a desbordado el timer1
TMR1IF=0;//borra flag del timer1
Frec=Frec+0xFFFF;}
}//Ha finalizado la base de tiempo.
aux=get_TIMER1();
disable_interrupts(GLOBAL);
Frec=Frec+aux;
FlagBT=1;
//Fin de medir frecuencia. Resultado en Frec.
Despues de esta parte de codigo (en un bucle infinito), lo que se hace es tratar la lectura y representarla en un display, y despues de esto empezar de nuevo.
Esta es la interrupcion del timer (base de tiempo)
#INT_TIMER0
base_tiempo(){
set_timer0(Periodo);
BaseTiempo--;
if(BaseTiempo==0){
EN_FREC=0;//cortamos cuenta de impulsos.
FlagBT=0;}
}
Quizas el problema esté en el cristal del pic, que es uno estandar en lugar de TCXO.