Tengo problemas para entender qué otras interrupciones se disparan además de TMR2 en PIC18f4550

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

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

Mi código se parece 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 puede ver, solo TMR2 posiblemente dispare ISR, pero luego nota alta frecuencia. actualización del pin de depuración si descomentas la línea?

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

¿Qué otra cosa puede estar desencadenando ISR y cómo lo compruebo sin verificar los indicadores de todas las interrupciones?

Práctica de codificación simple que sigo, cada ISR posible tiene código. En ese código que no debe llamarse tiene un segundo pin que puede subir alto.
@Kortuk: Realmente no entiendo lo que dices. ¿Puedes ampliar por favor para ayudarme a aprender?
Resuelto. No hubo otra activación de interrupción, pero el problema fue que no tenía la línea 'PIR1bits.TMR2IF = 0;' para el segundo bit (actualmente comentado). ¡Gracias a Oli Glaser!
aunque es posible que no esté utilizando otras interrupciones que existen, tómese el tiempo para crear código para cubrir el caso si se activan. En el código para esto, eleve un pin alto, o si todavía está en el depurador, deshabilite WDT y entre en un ciclo infinito. De esta manera, descubrirá si está activando una interrupción que no debería. No desea que un error en alguna parte le dé un error una vez al mes en un producto que es imposible de rastrear.

Respuestas (1)

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

Ambas suposiciones son correctas, y también tiene razón cuando dice que el problema fue que no tenía la línea 'PIR1bits.TMR2IF = 0;' para el segundo bit (actualmente comentado). Sin embargo, me confundo: ¿cómo es posible la salida de 0,7 Mhz al cambiar de bit en un núcleo de 12 MIPS?
@SGosh: serían 68 ciclos de reloj o 17 instrucciones 1/(17/12e6)) = 705882 kHz. Además, no tiene que funcionar a 12 MIPS, ese es el máximo usando la configuración PLL para un reloj de 48 MHz.