TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: javierexe22 en 01 de Mayo de 2010, 12:38:16
-
Hola gente, hace días que estoy tratando de medir frecuencias bajas, me base en un 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 + Captura).Tcy ...... Utilizo el prescaler en 8
Esta es la parte importante del código, obviando la configuración del pic y las interrupciones:
int32 captura=0, TC=0, TT=0;
float Periodo=0.0, frec=0.0 ;
int cuenta=0, overflow=0;
#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
{
captura=CCP_1; //Carga del valor del registro CCPR1
cuenta++ ;
enable_interrupts(int_timer1); //Habilitación interrupción timer
set_timer1(0); //empieza a contar 524 ms
}
#int_timer1
void timer1_isr()
{
overflow++; // numero de desbordes del timer
}
Función main:
do{
if(cuenta==2) //¿Pulso nuevo?
{
TC=overflow*65536;
TT=(TC+captura)*8; //
Periodo =(TT/1000000); //ciclo de maquina y prescaler 8 y dividido 4/fxtal
frec =(1/Periodo); //frecuencia en Hz
lcd_gotoxy (1,1);
printf(lcd_putc,"Periodo= %2.4f Seg ", Periodo);
lcd_gotoxy (1,2);
printf(lcd_putc,"frec= %2.4f Hz ", frec);
cuenta=0;
overflow=0;
}
}
while(TRUE);
}
Será problema de la programación, o el simulador? Empleo un cristal de 4Mhz. Agradezco cualquier sugerencia o ayuda! SALUDOS
-
Que frecuencia estas tratando de medir?? Y cual es el error?
-
Frecuencias desde los 0,1Hz hasta 10 Hz .... El Error esta en el simulador porque a la variable TC le pone el valor 0 sin respetar TC=overflow*65536. La captura de ciclos es correcta y da un resultado adecuado cuando lo hago con calculadora en mano, pero se pudre todo porque TC=0 y los resultados son erróneos
-
El tema creo que es que overflow está declarada como entero y al hacer el producto te lo toma como producto de enteros y 65536 es 0.
Debes hacer un cast a overflow TC=((int32)overflow)*65536
-
Gracias pablomanieri ya lo solucione cambiando el tipo de variable, aparentemente el problema era ese. Saludos :-/