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?