Captura de periodo entre pulsos con pic18f4620

Soy nuevo en el foro y quiero decir que estoy impresionado con el volumen de conocimientos aqui expuestos. Ante todo agradecer de antemano vuestra ayuda o sugerencias y a continuacion os planteo mi problema.

He realizado un programa para capturar el periodo entre dos flancos ascendentes por interrupcion del ccp1, el cual mide el tiempo entre ambos flancos y ademas cuando el timer desborda genera tb una interrupcion para poder medir periodos de gran duracion.
El problema es que a pesar de darse ambas interrupciones no consigo que generando la señal con un generador de funciones(el cual se supone que siempre me da la misma frecuencia) obtener un periodo constante o bien dentro de una desviacion ni siquiera razonable.

Si me pudieseis echar una mano.

El codigo es el siguiente:


//Programa en c18 para determinar el periodo de una sñal usando la funcionalidad
//de captura
//Trabajando con un reloj de 4MHz, el priodo de la señal
//queda expresado en milisegundos en la variable "periodo"
//Si la señal es demasiado lenta, se reinicia el proceso y periodo
//pasa a valer 0 hasta que la señal tenga un periodo menor que 2,5 segundos
//----------------------------------------------------------------------

#pragma config LVP=OFF,WDT=OFF,OSC=XT //Palabra de configuración
#include <P18f4620.h>

void calculos(void);


//--------------------Variables globales------------------------------------

unsigned char desbordamientos, vez;
unsigned int periodo, captura1, captura2;
float aux1, aux2;

//--------------------Declaración de funciones------------------------------

void calculos();

//--------------------Rutina de interrupción--------------------------------

#pragma interrupt Timer1OverloadInterrupt //Vector de interrupción
void Timer1OverloadInterrupt ()
{
calculos();
}



#pragma code seccionAltaPrioridad=0x8 // Abre una sección de código en 0x08

void rutinaAltaPrioridad (void)
{

_asm

GOTO Timer1OverloadInterrupt // Salto a la rutina que atiende a las
// interrupciones de alta prioridad
_endasm
}
#pragma code



//--------------------------------------------------------------------------

#include <math.h> //Libreria matemática

//---------------------Programa principal-----------------------------------

void main(void)
{
T1CON=0b00110001; //Timer1 como timer con preescalado x8
CCP1CON=0b00000101; //Registro 1 en modo captura (pin RC2)
TRISCbits.TRISC2=1; //RC1 (portC.2) como entrada
INTCONbits.GIE=1; //Habilitación de interrupciones
INTCONbits.PEIE=1;
PIE1bits.CCP1IE=1; //Habilitación de la int de la captura
PIE1bits.TMR1IE=1; //Habilitación de la interupción del timer
periodo=0;
vez=0;
desbordamientos=0;
while(1);}
//---------Rutina para el tratamiento de las interrupciones---------------

void calculos(){
//-----------------------Tratamiento de la captura-------------------------
if(PIR1bits.CCP1IF && PIE1bits.CCP1IE){
PIR1bits.CCP1IF=0;
if(vez==1){ //Segunda y sucesivas capturas despues
captura2=CCPR1L; //de reiniciado el proceso
captura2|= (CCPR1H << 8);
captura2=captura2>>1;
aux2=captura2;
aux1=captura1;
aux2=aux2-aux1;
aux1=desbordamientos;
aux1=aux1*32768;
aux2=aux2+aux1;
aux2=aux2*0.016;
periodo=aux2;
captura1=captura2;
desbordamientos=0;
TRISA=0;
TRISA=0x01;
PIR1bits.TMR1IF=0;
}
else { //Si es la primera captura, o se ha reiniciado
vez=1; //el proceso
captura1=CCPR1L;
captura1|= (CCPR1H << 8);
captura1=captura1>>1;
periodo=0;
TRISA=0;
TRISA=0x00;
}
}
//--------------------Tratamiento de los desbordamientos de T1------------
if(PIR1bits.TMR1IF && PIE1bits.TMR1IE){
PIR1bits.TMR1IF=0;
desbordamientos++;
if (desbordamientos==10){ //Si se exceden los 5 desbordamientos (2,5 segundos)
desbordamientos=0; //se reinicia el proceso
vez=0;

}
}
}

muchisimas gracias
 
Atrás
Arriba