Autor Tema: Frecuencimetro inestable  (Leído 1579 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Frecuencimetro inestable
« en: 18 de Octubre de 2009, 16:28:27 »
Hace tiempo hice un frecuencimetro, y si mido la frecuencia de un oscilador a cristal la medida con el tiempo se va decrementando, aproximadamente 1Hz cada 5 o 6 segundos.

Le he dado mil vueltas y no he conseguido dar con el problema, he retomado el tema al ver algo parecido en este foro sobre un reloj.

Utilizo el TIMER1 para contar los impulsos de la señal a medir, y el TIMER0 para la base de tiempo.

Este es el codigo principal:

Interrupcion del TIMER0:
Código: [Seleccionar]
#INT_TIMER0
base_tiempo(){
set_timer0(Periodo);
BaseTiempo--;
if(BaseTiempo==0){
      EN_FREC=0;//cortamos cuenta de impulsos.
      FlagBT=0;}
}

Periodo = 6;
BaseTiempo = 250;

La cuenta de impulsos:
Código: [Seleccionar]
//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;
BaseTiempo = 250;
//Fin de medir frecuencia. Resultado en Frec.

La configuracion del main:
Código: [Seleccionar]
set_tris_a(0b11111111);
set_tris_b(0b01001111);
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_32);//4msg, XT=8MHz.
enable_interrupts(INT_TIMER0);
disable_interrupts(GLOBAL);
TMR1IF=0;//borra flag del timer1

No se si se debe al cristal del frecuencimetro, al del oscilador que mido, a los dos, o un error de programacion.

En el hilo del reloj de este foro se comenta que la escritura del TIMER0 demora dos ciclos, pero en mi caso como para cada ciclo de medida se parte de cero esos errores no serian acumulativos en la medida; en todo caso daria un error en la medida, pero siempre el mismo.

El TIMER1 se desborda cada 65536 pulsos, en el peor caso (que seria la medida de 50MHz) se desborda cada 65536*1/50e6=1.31msg por lo que pienso que el PIC a 8Mhz tiene tiempo suficiente para actualizar el TIMER0.

Saludos.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡


 

anything