Autor Tema: no logro medir mas de 10Khz con el Timer1 en CCS  (Leído 4871 veces)

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

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
no logro medir mas de 10Khz con el Timer1 en CCS
« en: 13 de Junio de 2009, 16:37:03 »
hola muchachos... recien estoy entrando al mundo del CCS... antes hacía todo con MikroC y Asm...
decidí experimentar montando un simple circuito para medir frecuencia,... el mismo muestra en un LCD la frecuencia y el periodo calculado...
paro obtener el tiempo implemento el Timer 1 sin preescaler.... es decir que esperaba medir un ancho de banda de 15Hz a 1Mhz... pero solo llego a los 10Khz... no se rian de mi "bajo Nivel" de programacion... recien empiezo tenganme piedad  :)

acá les dejo mi código...
Saludos

#include <18f2550.h>
#fuses XT, NOWDT, NOLVP, NOMCLR, NOPBADEN
#use delay(clock=4000000)
#include <lcd.c>
#byte PIR1=0x0C
   
int16 TFS1=0,TFS2=0,TF=0;         
float AP=0.0, frec=0.0, PromAP=0.0, SumAP=0.0, VarProm=5, Muestra=0; //Variables flotantes
int1 cambio=0, nuevopulso=0;        //Cambio de flanco de disparo

#int_ccp1               // rutina de interrupcion que adquiere los tiempos para calcular el periodo de un cilo de la señal de entrada
void ccp1_int(){      //Función interrupción
  if(cambio==0){     
    TFS1=CCP_1;      //Carga del valor del registro CCPR1
    setup_ccp1(CCP_CAPTURE_FE);
    cambio=1;                 
  }
  else
  {                         //
   TFS2=CCP_1;      //Carga del valor del registro CCPR1 en flanco subida
   setup_ccp1(CCP_CAPTURE_FE);
   cambio=0;                   

  if(nuevopulso==0){     //Fin de pulso...
   nuevopulso=1;           //pulso a medir
  }
  }
}

void main() {

lcd_init();
delay_ms (1000);
lcd_gotoxy (1,1);
printf(lcd_putc,"Esperando");
lcd_gotoxy (1,2);
printf(lcd_putc,"señal...     ");
delay_ms (1000);

setup_timer_1(T1_INTERNAL);   //Configuración TMR1
setup_ccp1(CCP_CAPTURE_FE);  //Configuración modo Captura en flanco de subida
cambio = 0;                  //Control de cambio a 0

enable_interrupts(int_ccp1);   //Habilitación interrupción modulo CCP
enable_interrupts(global);     //Habilitación interrupción global

  do {
    if(nuevopulso==1)
        {                //¿Pulso nuevo?
       TF=(TFS2-TFS1);   //Ancho de pulso.
       AP = TF*1.0;   //(a 4MHz:1us por ciclo de maquina)
       Muestra=Muestra+1;
       SumAP=(AP+SumAP);     
       if (Muestra==VarProm)     // si ya promedio 5 valores los muestra
         {
         PromAP=SumAP/VarProm;
         frec =(1000/PromAP);  //frecuencia en KHz
         lcd_gotoxy (1,1);
         printf(lcd_putc,"T= %5.2f uS        ", PromAP);
         lcd_gotoxy (1,2);
         printf(lcd_putc,"F= %5.2f KHz        ", frec);
         SumAP=0;
         PromAP=0;
         frec=0;
         Muestra=0;
         }
       nuevopulso=0;     //Pulso ya medido, espera nuevo 
       }
  } while (TRUE);
}
« Última modificación: 13 de Junio de 2009, 16:40:42 por NANO1985 »
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: no logro medir mas de 10Khz con el Timer1 en CCS
« Respuesta #1 en: 13 de Junio de 2009, 17:09:11 »
Para medir frecuencias de hasta 1MHz debes aumentar la velocidad del oscilador y/o utilizar el PLL interno del PIC. También esta la posibilidad de preescalar los pulsos, comparando cada 4 o 16. Y para bajas frecuencias utilizar otra variable que indique los overflow del Timer1.
Para ser lo más preciso posible en medir frecuencias altas, el tratamiento de la interrupción tiene que ser lo más eficiente, ósea que ocupe el mínimo de instrucciones, setup_ccp1 no es necesario colocarlo dentro de la interrupción.
« Última modificación: 13 de Junio de 2009, 17:20:09 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: no logro medir mas de 10Khz con el Timer1 en CCS
« Respuesta #2 en: 13 de Junio de 2009, 17:11:02 »
creo q te entiendo.... tienes algun ejemplo??
saludos y muchas grcias por tu respusta suky  8)
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: no logro medir mas de 10Khz con el Timer1 en CCS
« Respuesta #3 en: 13 de Junio de 2009, 17:20:30 »
Esta es la idea:
Código: C
  1. #int_ccp1              
  2. void ccp1_int(){      //Función interrupción
  3.     TFS1=CCP_1;      //Carga del valor del registro CCPR1
  4.     pulso++;      //Cuando se 2, en main se realiza: Periodo=(Overflow.65536 + TFS1).Tcy  
  5.     set_timer1(0); //Para proxima medida.
  6. }

Entonces pulso debe iniciar en 0, al recibir el primer _| lee CCP_1, pero no lo usa, y al recibir el segundo _| lee nuevamente CCP_1, y con este valor realiza el calculo.
Habría que agregar:
Código: C
  1. #int_timer1
  2. timer1_isr()
  3. {
  4.    overflow++; // Para frecuencias bajas.
  5. }
No contesto mensajes privados, las consultas en el foro

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: no logro medir mas de 10Khz con el Timer1 en CCS
« Respuesta #4 en: 13 de Junio de 2009, 17:38:35 »
muchas gracias suky.... voy a meter mano de nuevo....
Saludos
 8)
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: no logro medir mas de 10Khz con el Timer1 en CCS
« Respuesta #5 en: 13 de Junio de 2009, 18:27:33 »
Te recomiendo que eches un vistazo al ejemplo EX_FREQC de CCS. No usa interrupciones pero es capaz de medir hasta 20MHz.

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: no logro medir mas de 10Khz con el Timer1 en CCS
« Respuesta #6 en: 13 de Junio de 2009, 21:23:54 »
justamente lo estaba viendo manolo.... muchas gracias...
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: no logro medir mas de 10Khz con el Timer1 en CCS
« Respuesta #7 en: 11 de Julio de 2009, 15:13:04 »
es muy complejo el ejemplo EX_FREQC de CCS para mis sutiles conocimientos del lenguaje.... alguien me podría dar una mano?...
lo que tengo muy en claro es que quiero medir frecuencias que va desde los 500Khz para abajo....
para altas frecuencias (cercanas a los 500Khz), con el timer 1 me alcansa para contar su periodo,....
pero para bajas fecuencias el Timer 1 ya no me alcansa tengo entendido que lo que debo hacer es implementar un contador que la fuente de cuenta sea el overflow del timer1...
en fin... la idea la tengo.... pero siento que me faltan herramientas....
si alguien me da una mano agradecido desde ya.... de todas formas estoy leyendo un libro de CCS y el help del CCS en si...

por ahora estoy con ésto.... digame si no me equivoco o corrijanme...
gracias....
supuestamente la ecuacion para calcular el tiempo es la siguiente

T= Tcm x preescaler x (65536 - TMR1)        donde Tcm es el tiempode ciclo de maquina, usando un cristal de 20Mhz
                                                                obtenemos un Tcm=200nS

tomando un preescaler 1:1 obtenemos la siguiente expresion:

T= 200nS x 1 x (65536 - TMR1)         si suponemos que el TMR1 estaba en cero y se incrementó en 1 bit
                                                      obtenemos un periodo final maximo y una frecuencia minima de:
T=13.107mS  ---> F=76.29Hz

T= 200nS x 1 x (65536 - TMR1)         si suponemos que el TMR1 está en su máxima cuenta, entonces
                                                      obtenemos un periodo final minimo  y una frecuencia máxima de:
T=200nS---> F=5Mhz

éstos son los limites de contar tiempos o medir frecuencias con el Timer1??
Saludos
« Última modificación: 11 de Julio de 2009, 15:34:59 por NANO1985 »
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: no logro medir mas de 10Khz con el Timer1 en CCS
« Respuesta #8 en: 11 de Julio de 2009, 16:18:18 »
En teoria, pero a alta frecuencia hay que tener en cuenta las intrucciones dentro de la interrupción, para guardar el dato, resetar el timer, etc. Que reducen la frecuencia a medir.
Aquí hice uno sencillo en asm, como para que tengas una idea. :wink:
No contesto mensajes privados, las consultas en el foro

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: no logro medir mas de 10Khz con el Timer1 en CCS
« Respuesta #9 en: 11 de Julio de 2009, 17:11:10 »
En teoria, pero a alta frecuencia hay que tener en cuenta las intrucciones dentro de la interrupción, para guardar el dato, resetar el timer, etc. Que reducen la frecuencia a medir.
Aquí hice uno sencillo en asm, como para que tengas una idea. :wink:

mucgas gracias suky... voy a ver el link
saludos
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado javierexe22

  • PIC10
  • *
  • Mensajes: 20
Re: no logro medir mas de 10Khz con el Timer1 en CCS
« Respuesta #10 en: 30 de Abril de 2010, 11:59:08 »
Hola gente, hace días que estoy tratando de medir frecuencias bajas, me base en el código que colgó nano1985 y en las ideas que aporto suky... Recién me inicio con la programación en  CCS. El problema es que cuando lo simulo en Proteus no se realiza la operación:
                                                       
Periodo=Overflow*65536

Agradezco cualquier sugerencia o ayuda! Saludos
« Última modificación: 01 de Mayo de 2010, 12:30:31 por javierexe22 »