Autor Tema: Frecuencimetro en CCS  (Leído 4734 veces)

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

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Frecuencimetro en CCS
« en: 02 de Marzo de 2007, 09:50:07 »
Hola, quiero que echen un vistazo a esta parte de codigo de un frecuencimetro, que funciona, pero la lectura oscila sobre unos +/-10Hz:

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

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

Desconectado Ernie-

  • PIC12
  • **
  • Mensajes: 56
Re: Frecuencimetro en CCS
« Respuesta #1 en: 30 de Marzo de 2007, 07:57:50 »
Hola, quiero que echen un vistazo a esta parte de codigo de un frecuencimetro, que funciona, pero la lectura oscila sobre unos +/-10Hz:

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

Hola micro_pepe espero llegar a tiempo para eso que estás indicando... te comento una cosa que he visto así por encima según el problema que dices que tienes. Que yo sepa cualquier medición que se realice con tu "sensor" (sea cual sea ya que no sé si lo harás por sonido o algo así) no es exacta y puede producirse algún "error". No se si pase lo mismo con la medición de frecuencias pero en el caso de la temperatura sí que da problemas. Yo pedí ayuda aquí para terminar mi proyecto y al final conseguí que funcionara al 100%, en el código que mostré se puede ver que tengo una formulita para que la temperatura se muestre más o menos fiable ya que también tenía el problema de que no mostraba la medición correcta.
La mitad del mundo tiene algo que decir, pero no puede; la otra mitad no tiene nada que decir, pero no calla. Robert Lee Frost.