dsPIC33E no se produce la interrupción del comparador

1

Actualmente estoy intentando que el comparador en dsPIC33EP256GP502 funcione, pero se atasca en la interrupción del comparador. Básicamente, lo que quiero hacer es usar el comparador para comparar dos entradas de voltaje externas y generar la interrupción en la transición de bajo a alto de la salida del comparador, pero el programa nunca ingresó el ISR en la prueba.

He intentado establecer manualmente el indicador de interrupción (IFS1bits.CMIF) en 1 en el bucle principal, luego la interrupción se activó con éxito, ingresé en el ISR y en el ISR probé, la siguiente condición de interrupción es cumplido:

CMSTATbits.C1EVT = 1 y CMSTATbits.C1OUT = 1

Simplemente no sé por qué la interrupción no se puede activar automáticamente cuando se cumplen las condiciones previas, ¿tal vez hay algunos errores de configuración?

Realmente necesito sugerencias e instrucciones, ya que he perdido mucho tiempo en este tema.

Cualquier sugerencia es muy apreciada, y gracias de antemano.

Pego mi código para configurar el comparador a continuación:

   // comparator 1 input pin set
    ANSELBbits.ANSB2 = 1; // C1IN1+ ANALOG
    TRISBbits.TRISB2 = 1; // C1IN1+ INPUT
    ANSELBbits.ANSB3 = 1; // C1IN1- ANALOG
    TRISBbits.TRISB3 = 1; // C1IN1- INPUT

    // COMPARATOR 1
    CM1CONbits.COE = 0;         // comparator output is internal only
    CM1CONbits.CPOL = 1;        // comparator output is inverted
    CM1CONbits.OPMODE = 0;      // Op Amp is disabled
    CM1CONbits.CEVT = 0;        // clear comparator event bit
    CM1CONbits.COUT = 0;        // initially the Vin+ > Vin-
    CM1CONbits.EVPOL = 0b01;    // interrupt is generated only on low-to-high transition of the comparator output
    CM1CONbits.CREF = 0;        // VIN+ input connects to C1IN1+
    CM1CONbits.CCH = 0b00;      // select VIN- input connects to C1IN1-
    CM1CONbits.CON = 1;         // enable comparator 1

    CM1FLTRbits.CFLTREN = 0;    // disablt the digital filter

    CMSTATbits.PSIDL = 0; // continues operation of all comparators in idle mode

    IPC4bits.CMIP = 4; // set interrupt priority to 4
    IFS1bits.CMIF = 0; // clear the intrrupt flag
    IEC1bits.CMIE = 1; // Enable the interrupt
    INTCON2bits.GIE = 1 // Enable the global interrupt

// ISR
void __attribute__((interrupt,no_auto_psv)) _CM1Interrupt(void)
{
    IFS1bits.CMIF = 0;

    // IF INTERRUPT FROM CM1
    if(CMSTATbits.C1EVT && CMSTATbits.C1OUT)
    {
        CM1CONbits.CEVT = 0;
        CM1CONbits.COUT = 0;

        // Turn off the valve1 PWM output
        set_valve_channel_one_pwm_off();
    }
}
    
pregunta GangNanTed

2 respuestas

1

En realidad, lo que Oleg Mazurov dijo es correcto, solo se generó un evento de comparación, pero no se debe a la forma en que estoy haciendo la prueba. La razón es que la habilitación del comparador (CON = 1) está varias líneas de código por delante de la habilitación de interrupción del comparador (CMIE = 1), lo que llevará a que incluso se haya activado una y se establezca el bit CEVT como la transición inicial de C1OUT antes de la habilitación de interrupción del comparador, pero el indicador de interrupción copmparator no se configurará para ingresar al ISR ya que la interrupción no está habilitada ahora, sin ingresar el ISR, el bit CEVT no se borrará, lo que bloqueará todos los demás eventos del comparador como el bit CEVT no se han borrado.

Entonces, la solución es poner el comparador habilitar e interrumpir los códigos de habilitación lado a lado:

CM1CONbits.CON = 1; // enable comparator 1
IEC1bits.CMIE = 1; // Enable the interrupt

o borre el bit CEVT antes de habilitar la interrupción:

CM1CONbits.CEVT = 0; // clear comparator event bit
IEC1bits.CMIE = 1; // Enable the interrupt 
    
respondido por el GangNanTed
0

IFS1bits.CMPIF = 0; Borrar la bandera del comparador.

El bit de indicador de interrupción del comparador (CMPIF) (IFS1 < 2 >) se establece cuando el valor de salida sincronizado De cualquiera de los cambios de los comparadores, con respecto al último valor leído. Los bits CxEVT en el La aplicación de usuario puede leer el registro CMSTAT para detectar un evento.

    
respondido por el user156492

Lea otras preguntas en las etiquetas