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?
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?
Kortuk
sekharan
sekharan
Kortuk