Buenas, estoy realizando un programa con mi PIC32MX250F128B que haga lo siguiente:
1)Parpadee un LED conectado en RB5 mediante INTERRUPCION CON EL TIMER 2
2)Parpadee un LED conectado en RB15 mediante INT0, con un pulsador en RB7
Cuando habilito INT0, lo pongo en modo Single Vector y funciona la interrupción INT0 con su LED RB15
Cuando habilito INT TIMER2, lo pongo en modo Multi Vector y funciona la interrupción TIMER2 con su LED RB5
PROBLEMA) No consigo que funcionen a la vez las 2 interrupciones: Poniendo "Multi Vector" y las 2 interrupciones habilitadas, parpadea el LED de la interrupción del TIMER, pero cuando pulso el boton INT0, deja de parpadear el LED del timer, y el LED de INT0 no hace nada. Y se queda en este estado para siempre.
Alguien tiene alguna idea de que puede pasar?
Adjunto el código:
#include <p32mx250f128b.h>
#include <plib.h>
#pragma config FNOSC = FRCPLL // Internal Fast RC oscillator (8 MHz) w/ PLL
#pragma config FPLLIDIV = DIV_2 // Divide FRC before PLL (now 4 MHz)
#pragma config FPLLMUL = MUL_20 // PLL Multiply (now 80 MHz)
#pragma config FPLLODIV = DIV_2 // Divide After PLL (now 40 MHz)
#pragma config FWDTEN = OFF // Watchdog Timer Disabled
#pragma config ICESEL = ICS_PGx1 // ICE/ICD Comm Channel Select
#pragma config JTAGEN = OFF // Disable JTAG
#pragma config FSOSCEN = OFF // Disable Secondary Oscillator
#define SYSCLK 40000000L
int main(void)
{
SYSTEMConfigPerformance(SYSCLK);
ANSELB = 0; //PORT B DIGITAL
TRISBbits.TRISB5 = 0; //RB5 salida
TRISBbits.TRISB15 = 0; //Rb15 salida
TRISBbits.TRISB7 = 1; //Rb15 entrada
PORTB; //Lee el registro PORTB para limpiar el change notification
//interrupcio INT0********************************************************
IEC0bits.INT0IE = 0; //desactiva la interrupción INT0
IPC0bits.INT0IP = 1; //Prioridad 1(ipl1)
IPC0bits.INT0IS = 1; //subprioridad de 1
IFS0bits.INT0IF = 0; //Limpia la bandera de interrupción
LATBbits.LATB15 = 1; //LED RB15=ON
//interrup TIMER2******************************************************************************
T2CON = 0x8070; // timer 2 de 16bits= ON, prescaler 1:256.
PR2 = 0Xffff; //timer 2 cargado con el valor 65535. Frecuencia: (1/Pbclk)*prescaler*PR2 = (1/4M)*256*65535=0,4s
IEC0bits.T2IE = 0; //DESACTIVA LA INTERRUPT TIMER2
IPC2bits.T2IP = 4; //prioritat 4
IPC2bits.T2IS = 0; //subprioritat 1
IFS0bits.T2IF = 0; // clear Timer2 int flag, IFS0<9>
//************PROBLEMA********************PROBLEMA***************************PROBLEMA**********************PROBLEMA*********PROBLEMA************************PROBLEMA
//habilitar interrupciones (en estas 4 lineas esta el problema):
IEC0bits.INT0IE = 1; //Activa la interrupción INT0
IEC0bits.T2IE = 1; //ACTIVA LA INTERRUPT TIMER2
//INTEnableSystemSingleVectoredInt(); // Activa el modo Single Vector: INT0
INTEnableSystemMultiVectoredInt(); //Activa el modo multi Vector: Timer2
//********* FIN PROBLEMA*****************FIN PROBLEMA************************FIN PROBLEMA*******************FIN PROBLEMA******FIN PROBLEMA******************FIN PROBLEMA
//bucle principal:
while(1);
return 0;
}
//RUTINA DE INTERRUPCIÓN INT0
void __ISR( 0, ipl1) InterruptHandler( void)
{
LATBbits.LATB15 ++; //enciende i apaga el led
IFS0bits.INT0IF = 0; //Limpia la bandera de interrupción
}
// RUTINA INTERRUPCION Timer2
void __ISR(8, ipl4) Timer2IntHandler(void){
LATBbits.LATB5 ++; //enciende i apaga el led
IFS0bits.T2IF = 0; // clear Timer2 int flag, IFS0<9>
}
Solucionado: La declaración de la interrupción int0 estaba declarada en con el vector 0, cuando tiene que ser el 3. Así pues seria: "void __ISR( 3, ipl1) InterruptHandler( void)", con las 2 interrupciones habilitadas y con multi vector.