Ich habe Probleme zu verstehen, welche anderen Unterbrechungen neben TMR2 auf PIC18f4550 high_isr auslösen.
Wie ich es erkenne, setze ich den Pin MY_DBG_PIN so, dass er jedes Mal umschaltet, wenn high_isr aktiviert wird, und von dem, was ich versuche, habe ich nur TMR2 aktiviert und sonst nichts.
Mein Code sieht so aus:
#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)
{
}
}
Wie Sie sehen können, feuert möglicherweise nur TMR2 ISR ab, aber dann bemerken Sie eine hohe Frequenz. Update des Debugging-Pins, wenn Sie die Zeile auskommentieren?
Wenn ich das TMR2-Interrupt-Flag in ISR spezifiziere und dann den Debugging-Pin umschalte, wird die erwartete Aktualisierungsfrequenz als aktuell aktiver Code angezeigt.
Welche andere Sache kann ISR auslösen und wie überprüfe ich das, ohne die Flags aller Interrupts zu überprüfen?
Wenn ich das richtig verstehe, dann schaltet es bei 0,7 MHz um, wenn Sie das erste (größere) Bit auskommentieren und das zweite Bit auskommentieren?
Das Interrupt-Flag wird nicht gelöscht, also springt es sofort zurück zur ISR. Das zweite Bit befindet sich nicht in einer if-Anweisung, sodass es immer ausgeführt wird. Es wird also weiterhin den Pin in interrupt_at_high_vector setzen und in high_isr löschen. Sie müssen sicherstellen, dass das Flag immer gelöscht ist (wenn es nicht automatisch gelöscht wird).
Was soll es tun?
Kortuk
sekharan
sekharan
Kortuk