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();
}
}