Autor Tema: [solucionado]Interrupciones: timer2+INT0 (Por separado funcionan, al unirlas no)  (Leído 2435 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado aleix111

  • PIC10
  • *
  • Mensajes: 14
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:
Código: [Seleccionar]
#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.
« Última modificación: 29 de Noviembre de 2012, 11:18:52 por aleix111 »


 

anything