Módulo de captura de entrada PIC32

Estoy tratando de usar el módulo de captura de entrada en un PIC32MX250F128B para medir la frecuencia de una onda cuadrada. Los resultados que obtengo son inconsistentes e incorrectos. Todo lo que intento hacer aquí es medir la frecuencia de la onda cuadrada de entrada leyendo el valor de captura en cada interrupción de borde descendente. Luego restablezco Timer2 y leo el valor de captura nuevamente en la siguiente interrupción.

Aquí está mi ISR:

void __ISR(_INPUT_CAPTURE_4_VECTOR, ipl1) Capture4(void) {
    mPORTBToggleBits(BIT_10);
    capture_value = IC4BUF; 
    mIC4ClearIntFlag();
    TMR2 = 0;
}

Aquí están las configuraciones de mi módulo:

IC4Rbits.IC4R = 0;     // Assign peripheral pin RPA0 to IC4
mPORTASetPinsDigitalIn(BIT_0);
IC4CONbits.C32 = 0;    // 16-bit source timer
IC4CONbits.ICTMR = 1;  // Use Timer2
IC4CONbits.ICI = 0;    // Interrupt every capture event
IC4CONbits.ICM = 2;    // Simple Capture Event mode - every falling edge
IFS0bits.IC4IF = 0;    // Clear interrupt flag
IFS0bits.IC4IE = 1     // Enable IC interrupt
IFS0bits..IC4IP = 1;   // Set interrupt priority to 1
IC4CONbits.ON = 1;     // Enable IC module

T2CONbits.ON = 0;      // Disable while config
TCONbits.SIDLE  = 0;   // Continue in idle mode
TCONbits.TCS = 0;      // Use internal clock
TCONbits.TCKPS = 0;    // Set 1:1 prescale
TCONbits.TGATE = 0;    // Disable gated time accumulation
PR2 = 0xFFFF;          // set period register
TMR2 = 0;              // start counting at zero
T2CONbits.ON = 1;      // enable module

Notará que la primera línea del ISR alterna un pin de salida digital; Agregué esto para poder monitorear la actividad y ver si alguna vez se llamó a la interrupción. Se llama a la interrupción y la he visto en un osciloscopio. Esperaría que el ISR se llamara consistentemente en línea con los bordes descendentes de la onda cuadrada de entrada, pero este no es el caso. En cambio, el ISR se llama de manera inconsistente a intervalos aparentemente aleatorios. Además, los valores que se leen de IC4BUF no se correlacionan en absoluto con ningún ajuste en la frecuencia de la señal de entrada.

Claramente me estoy perdiendo algo aquí. Si tiene alguna sugerencia o puede señalar algún error obvio que haya cometido, sería muy apreciado. Además, estoy abierto a métodos alternativos para realizar la tarea de medir la frecuencia de entrada. Elegí esta ruta con Input Capture porque parecía tener más sentido. ¡Gracias!

¿Qué rango de frecuencias pretende medir y cuál es la velocidad de reloj de su PIC?
¿Se declara capture_value como volátil?
El PIC está sincronizando a 48 MHz. Estoy anticipando entradas que van desde 0.1 - 100 KHz
@RogerRowland, sí, lo intenté con capture_value declarado como volátil, sin cambios

Respuestas (1)

Verifique este comando: IFS0bits.IC4IE = 1. Aquí IEC0se debe usar el registro IFS0para verificar los bits de bandera que se SET cuando ocurre una interrupción. Entonces, modifique su comando de la siguiente manera:

IEC0bits.IC4IE = 1

(Si aún no funciona, consulte su hoja de datos para conocer la ubicación de IC4IEla broca).

IFS0bits..IC4IP = 1: este comando también es incorrecto, debe usar IPC0el registro para establecer la prioridad de la captura de entrada.