Autor Tema: Problema de interrupción en PIC32MX con un código simple  (Leído 3920 veces)

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

Desconectado Alex1

  • PIC10
  • *
  • Mensajes: 6
Problema de interrupción en PIC32MX con un código simple
« en: 14 de Febrero de 2016, 23:05:25 »
Hola,

Estoy probando por primera vez un micro de 32bits, específicamente un PIC32MX170256B a 50Mhz.
A la hora de probar las interrupciones, no consigue entrar a las ISR.

Este código debería hacer interrupción de timer1:

Código: C
  1. #include <xc.h>  
  2. #include <stdio.h>
  3. #include <stdint.h>
  4. #include <proc/p32mx170f256b.h>
  5. #include <sys/attribs.h>
  6.  
  7. //Configuration bits
  8. #pragma config FPLLIDIV = DIV_2 // PLL Input Divider (2x Divider)
  9. #pragma config FPLLMUL = MUL_20 // PLL Multiplier (20x Multiplier)
  10. #pragma config FPLLODIV = DIV_2 // System PLL Output Clock Divider (PLL Divide by 2)
  11. // DEVCFG1
  12. #pragma config FNOSC = PRIPLL   // Oscillator Selection Bits (Primary Osc w/PLL (XT+,HS+,EC+PLL))
  13. #pragma config FSOSCEN = OFF    // Secondary Oscillator Enable (Disabled)
  14. #pragma config IESO = ON                // Internal/External Switch Over (Enabled)
  15. #pragma config POSCMOD = HS             // Primary Oscillator Configuration (HS osc mode)
  16. #pragma config OSCIOFNC = OFF   // CLKO Output Signal Active on the OSCO Pin (Disabled)
  17. #pragma config FPBDIV = DIV_1   // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/1)
  18. #pragma config FWDTEN = OFF             // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))
  19. // DEVCFG0
  20. #pragma config JTAGEN = OFF             // JTAG Enable (JTAG Disabled)
  21.  
  22. //Definición de ISR
  23. void __attribute__( (interrupt(ipl2),
  24. vector(_TIMER_1_VECTOR))) Timer1Handler ( void );
  25.  
  26. int main() {
  27.  
  28.     INTCONbits.MVEC = 1;                //Interrupt controller configured for Multi-vectored mode
  29.    
  30.     IPC1 = 0;
  31.     IPC1bits.T1IP = 2;                  //Priority
  32.    
  33.     //TIMER1 CONFIG
  34.     T1CONbits.ON = 1;                   //Timer1 ON
  35.     T1CONbits.TCKPS0 = 0;               //00 = 1:1 prescale value
  36.     T1CONbits.TCKPS1 = 0;
  37.     T1CONbits.TCS = 0;                  //Timer Clock Source Select bit, 0 = Internal peripheral clock
  38.    
  39.     TMR1 = 0;
  40.     IFS0bits.T1IF = 0;                  //Clear flags interrupt  
  41.     IEC0bits.T1IE = 1;                  //Enable interrupt timer1    
  42.  
  43.     ANSELA = 0;
  44.     ANSELB = 0;
  45.     TRISBbits.TRISB7 = 0;               //Output
  46.     LATBbits.LATB7 = 0;
  47.  
  48.     while (1) {
  49.         asm("nop");
  50.     }
  51.     return 0;
  52. }
  53.  
  54.  void __ISR(_TIMER_1_VECTOR, IPL2SOFT) Timer1Handler(void){
  55.     IFS0bits.T1IF = 0;                                  //Clear flag
  56.     LATBbits.LATB7 = LATBbits.LATB7 ^ 1; //Toogle output
  57.  }

El el simulador de MPLAB, timer1 se incrementa en cada ciclo, y cuando tiene el valor 0xFFFF se activa IFS0bits.T1IF, pero no entra a la rutina de interrupción, se queda siempre en main().

¿Alguna idea?

Gracias

Desconectado pablinza

  • PIC10
  • *
  • Mensajes: 3
Re:Problema de interrupción en PIC32MX con un código simple
« Respuesta #1 en: 15 de Febrero de 2016, 10:42:34 »
Hola Alex1,  has probado el codigo en un proto, te digo porque yo tambien he tenido problemas con la simulacion supongo que algunos bugs o tal vez alguna configuracion que no estoy considerando.

Yo personalmente he optado por hacer pruebas en circuito real, si tienes un ICD podras creas varios breakpoints en la depuracion, aunque tambien  podrias probar generando un retardo mediante contadores en la rutina de interrupciones.

Saludos.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Problema de interrupción en PIC32MX con un código simple
« Respuesta #2 en: 15 de Febrero de 2016, 11:53:44 »
Tal vez te falta esto:



Código: C
  1. // configure for multi-vectored mode
  2.  INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
  3.  // enable interrupts
  4. INTEnableInterrupts();

¿Estás trabajando con MLA o con Harmony?
« Última modificación: 15 de Febrero de 2016, 11:59:46 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Alex1

  • PIC10
  • *
  • Mensajes: 6
Re:Problema de interrupción en PIC32MX con un código simple
« Respuesta #3 en: 15 de Febrero de 2016, 16:22:39 »

Hola, gracias por la ayuda.

pablinza: He probado con simulador y con ICD, pero el resultado es idéntico. Acabo de detectar que el problema es con una configuración faltante.

DominusDRR: En este caso no estoy usando MLA ni Harmony, ya que de momento es una prueba simple.

Para salir de dudas, instalé la última versión de Harmony (1.06), generé y configuré un nuevo proyecto y ha funcionado, la ISR para timer1 es:

Código: C
  1. #include <xc.h>
  2. #include <sys/attribs.h>
  3. #include "app.h"
  4. #include "system_definitions.h"
  5.  
  6. // *****************************************************************************
  7. // Section: System Interrupt Vector Functions
  8. // *****************************************************************************
  9. void __ISR(_TIMER_1_VECTOR, ipl7AUTO) _IntHandlerDrvTmrInstance0(void)
  10. {
  11.     LATBbits.LATB7 = LATBbits.LATB7 ^ 1;
  12.     PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_TIMER_1);
  13.  
  14. }


Revisaré el código de configuración generado para no quedarme con la duda. Ya por lo menos funciona, RB7 cambia de estado al desbordar timer1  :-)

Gracias,
Saludos

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Problema de interrupción en PIC32MX con un código simple
« Respuesta #4 en: 15 de Febrero de 2016, 16:54:36 »

Para salir de dudas, instalé la última versión de Harmony (1.06), generé y configuré un nuevo proyecto y ha funcionado, la ISR para timer1 es:


El Harmony es un conjunto de librerías, si no las piensas utilizar, no tiene sentido que las descargues.

Yo utilizo el TMR1 con interrupción y lo hago así con MLA, tal vez te sea útil:

En el archivo main:

Código: C
  1. #include <p32xxxx.h> //
  2. #include <plib.h>
  3. #include <xc.h>
  4. #include <peripheral/int.h>
  5.  
  6. ....
  7.  
  8.  OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_1, 0x2710);
  9.  ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_3);
  10.  
  11. ...
  12.  
  13.  // configure for multi-vectored mode
  14.  INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
  15.  // enable interrupts
  16.  INTEnableInterrupts();

En otro archivo c adminsitro las interrupciones:

Código: C
  1. #include <p32xxxx.h> //
  2. #include <plib.h>
  3. #include <peripheral/int.h>
  4.  
  5. void __ISR(_TIMER_1_VECTOR, ipl3)AdministradorTemporizador1(void)
  6. {
  7.     if (INTGetFlag(INT_T1))
  8.     {
  9.         AnalisisTemporizador1();
  10.         INTClearFlag(INT_T1);
  11.     }
  12. }

En Harmony es un poco más "complejo", debes crear una app para administrar la configuración y la interrupción del temporizador con MHC.

Código: C
  1. void SYS_Initialize ( void* data )
  2. {
  3. ...
  4.  
  5. sysObj.drvTmr1 = DRV_TMR_Initialize(DRV_TMR_INDEX_1, (SYS_MODULE_INIT *)&drvTmr1InitData);
  6. ...

La app sería más o menos así:

Código: C
  1. void APP_Tasks ( void )
  2. {
  3.    
  4.     /* Check the application's current state. */
  5.     switch ( appData.state )
  6.     {
  7.          case APP_INICIALIZAR: appData.state = APP_EN_REPOSO; break;
  8.          case APP_REPOSO: break;
  9.          case APP_PROCESAR_INTERRUPCION:
  10.          {
  11.             // llamar a la función que atiende la interrupcion
  12.              appData.state =  APP_EN_REPOSO; // vuekvo a esperar otra interrupción
  13.              break;
  14.          }
  15.          default: break; /* TODO: Handle error in application's state machine. */
  16.  
  17.     }

Cuando sucede la interrupción, ésta debe modificar el estado de la app:

Código: C
  1. #include "app.h"
  2.  
  3. extern APP_DATA appData;
  4.  
  5.  
  6. void __ISR(_TIMER_1_VECTOR, ipl1AUTO) _IntHandlerDrvTmrInstance0(void)
  7. {
  8.    appData.state = APP_PROCESAR_INTERRUPCION;
  9.     DRV_TMR_Tasks_ISR(sysObj.drvTmr0);
  10.  
  11. }
« Última modificación: 15 de Febrero de 2016, 16:58:09 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Alex1

  • PIC10
  • *
  • Mensajes: 6
Re:Problema de interrupción en PIC32MX con un código simple
« Respuesta #5 en: 15 de Febrero de 2016, 21:41:41 »

Muchas gracias por la ayuda, funciona bien con el código de ejemplo que haz colocado de MLA.
Ya que está instalado voy a revisar Harmony con mas detalle.

Saludos



 

anything