dsPIC33E Interrupciones externas INT0, INT1, INT2 no se disparan

0

He leído todas las publicaciones que puedo encontrar y aún no entiendo por qué no se activan las interrupciones externas, la siguiente es mi inicialización, no está limpia, ya que estoy en el proceso de intentar todo lo que se me ocurre para hacer esto. trabajo.

Para simplificar el problema, considere solo INT1.

Actualización: parece que la bandera se está activando, pero el ISR nunca se está ejecutando. La bandera no está siendo bajada

void __attribute__((__interrupt__, no_auto_psv)) _INT1Interrupt(void)
{
IFS1bits.INT1IF = 0;    //Clear the INT1 interrupt flag 
//U1TXREG='0';

m_Capture1 = 1;

}  




// Hall Sensor A                | Pin 31    RPI24       RA8

// Disable all other pin functionality.
TRISAbits.TRISA8 = 1 ;
//LATAbits.LATA8 = 0;
ODCAbits.ODCA8=0;
CNENAbits.CNIEA8=0;
CNPUAbits.CNPUA8=0;
CNPDAbits.CNPDA8=0;


//INTCON1bits.NSTDIS = 0; // interrupt nesting enabled.
//INTCON2bits.GIE = 1;    // Global Interrupt Enable.

INTCON2 = 0x0000;       // all interrupts on rising edge.       

// Reset Interrupt flags.
IFS0bits.INT0IF = 0;      //Reset INT0 interrupt flag 
IFS1bits.INT1IF = 0;    //Reset INT1 interrupt flag
IFS1bits.INT2IF = 0;    //Reset INT2 interrupt flag

INTCON2bits.INT0EP = 1 ;
INTCON2bits.INT1EP = 1 ;
INTCON2bits.INT2EP = 1 ;

// Enable Interrupts.
IEC0bits.INT0IE = 1;    // Enable INT0 Interrupt Service Routine.
IEC1bits.INT1IE = 1;    // Enable INT1 Interrupt Service Routine. 
IEC1bits.INT2IE = 1;    // Enable INT2 Interrupt Service Routine.

// Set Interrupt Priority.
//IPC5bits.INT1IP = 5;  // If all the IPC bits associated with
                        // an interrupt source are cleared, the interrupt 
                        // source is effectively disabled.
//IPC7bits.INT2IP = 2;  //set low priority
//IPC0bits.INT0IP = 2;  //set low priority
IPC5bits.INT1IP = 4;    /*set low priority*/


RPINR0bits.INT1R |= 24;//0x18; //001 1000;    // Set Hall A - RPI24/RA8 set                     INT1
RPINR1bits.INT2R |= 51;//0x33; //011 0011     // Set Hall B = RPI51/RC3 set INT2
// Hall C RP39/RB7 is INT0 (not mappable)

Verifiqué con un 100% de certeza que el voltaje en el pin cambia de 0 a 3.3V. Cualquier ayuda es apreciada.

Gracias, Gary

    
pregunta GodJohnson

1 respuesta

2

En este punto, estoy bastante seguro de que el problema era la línea

 INTCON2 = 0x0000;

que desactivó efectivamente el bit 15 (habilitación de interrupción global). La siguiente es una función de inicialización de trabajo.

void BldcHallSensorInit( void )
{
// Hall Sensor A                | Pin 31    RPI24       RA8     INT2
// Hall Sensor B                | Pin 35    RPI51       RC3     INT1
// Hall Sensor C                | Pin 46    RP39        RB7     not mappable


TRISAbits.TRISA8 = 1 ;
TRISCbits.TRISC3 = 1 ;

RPINR0bits.INT1R = 51;  //001 1000;     // Set Hall B = RPI51/RC3 set INT2
RPINR1bits.INT2R = 24;  //011 0011      // Set Hall A - RPI24/RA8 set INT1 


//CORCONbits.IPL3 = 0;
//INTCON1bits.NSTDIS = 0; // interrupt nesting enabled.
//INTCON2bits.DISI = 0 ;
//INTCON2bits.SWTRAP = 0 ;

//INTCON2 = 0x0000;       // **erroneous line**       

// Reset Interrupt flags.
IFS0bits.INT0IF = 0;      //Reset INT1 interrupt flag 
IFS1bits.INT1IF = 0;    //Reset INT0 interrupt flag
IFS1bits.INT2IF = 0;    //Reset INT0 interrupt flag

// Interrupt edge polarity.
INTCON2bits.INT0EP = 1 ;
INTCON2bits.INT1EP = 1 ;
INTCON2bits.INT2EP = 1 ;

// Set Interrupt Priority.
IPC0bits.INT0IP = 1;    // set low priority.
IPC5bits.INT1IP = 1;    // set low priority.
IPC7bits.INT2IP = 1;    // set low priority.

// Enable Interrupts.
IEC0bits.INT0IE = 1;    // Enable INT0 Interrupt Service Routine.
IEC1bits.INT1IE = 1;    // Enable INT1 Interrupt Service Routine. 
IEC1bits.INT2IE = 1;    // Enable INT2 Interrupt Service Routine.

INTCON2bits.GIE = 1;    // Global Interrupt Enable. Order/placement of this
                        // line is important.
}
    
respondido por el GodJohnson

Lea otras preguntas en las etiquetas