Tengo problemas para entender qué otra interrupción se dispara además de TMR2 en PIC18f4550

1

Tengo problemas para entender qué otra interrupción dispara high_isr además de TMR2 en PIC18f4550.

La forma en que lo detecto, configuro el pin MY_DBG_PIN que alterna cada vez que se activa high_isr, y por lo que trato de hacer, solo TMR2 lo he activado y nada más.

Mi código es similar a:

#include <p18f4550.h>

#define USE_OR_MASKS

#include <pwm.h>
#include <timers.h>

#pragma config PLLDIV = 10
#pragma config FOSC = ECPLLIO_EC

#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config MCLRE = ON
#pragma config PBADEN = OFF
#pragma config ICPRT = OFF
#pragma config LVP = OFF
#pragma config WDT = OFF,DEBUG=OFF

/* Sets the PWM value on CCP1 to 50% duty cycle*/

#define MY_DBG_PIN        LATBbits.LATB1 
#define MY_DBG_PIN_TRIS   TRISBbits.TRISB1

#pragma interrupt high_isr
void high_isr (void)
{
    //* Comment to notice toggling of MY_DBG_PIN at 0.7Mhz
    if(PIR1bits.TMR2IF)         // Timer 2 interrupt
    {
        MY_DBG_PIN = 0;

        PIR1bits.TMR2IF = 0;
    }
    //*/

    // Are some other interrupts also firing? Why?
    //MY_DBG_PIN = 0; // If uncomment, toggling at 0.7Mhz
}

#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
    MY_DBG_PIN = 1;
    _asm GOTO high_isr _endasm
}
#pragma code /* return to the default code section */

void main (void)
{
    TRISC=0;
    OpenTimer2(TIMER_INT_ON | T2_PS_1_4 | T2_POST_1_16 );
    OpenPWM1( 149 );
    SetDCPWM1( 300 );

    MY_DBG_PIN_TRIS = 0;    // make it an output 

    PIE1bits.TMR2IE=1;           //enable Timer2 interrupt
    INTCONbits.PEIE=1;          //enable peripheral interrupts
    INTCONbits.GIE=1;           //enable glogal interrupts
    INTCONbits.GIEH = 1; /* Enable global Interupt */

    while(1)
    {
    }
}

Como se puede ver, solo TMR2 posiblemente dispare ISR, pero luego observa una alta frecuencia. actualizar el pin de depuración si descomprime la línea?

Si especifico el indicador de interrupción TMR2 en ISR y luego alterno el pin de depuración, entonces la frecuencia de actualización esperada es similar al código activo actual.

¿Qué otra cosa puede estar activando ISR y cómo verifico eso sin marcar los indicadores de todas las interrupciones?

    
pregunta sekharan

1 respuesta

3

Si entiendo bien, entonces cuando comentas el primer bit (más grande) y eliminas el comentario del segundo bit, cambia a 0.7MHz.
El indicador de interrupción no se borra, por lo que saltará inmediatamente al ISR. El segundo bit no está en una sentencia if, por lo que siempre se ejecutará. Por lo tanto, seguirá configurando el pin en el interrupt_at_high_vector y eliminándolo en high_isr. Debe asegurarse de que la bandera siempre esté despejada (si no se borra automáticamente)
¿Qué quieres que haga?

    
respondido por el Oli Glaser

Lea otras preguntas en las etiquetas