Ich habe Probleme zu verstehen, welche anderen Interrupts außer TMR2 auf PIC18f4550 ausgelöst werden

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?

Einfache Codierungspraxis, der ich folge, jede mögliche ISR hat Code. In diesem Code, der nicht aufgerufen werden sollte, haben Sie einen zweiten Pin, den Sie hochheben können.
@ Kortuk: Ich verstehe nicht wirklich, was du sagst. Können Sie bitte erweitern, um mir beim Lernen zu helfen?
Gelöst. Keine andere Interrupt-Auslösung, aber das Problem war, dass ich die Zeile 'PIR1bits.TMR2IF = 0;' nicht hatte. für das zweite (derzeit kommentierte) Bit. Danke Oli Glaser!
Auch wenn Sie möglicherweise keine anderen vorhandenen Interrupts verwenden, nehmen Sie sich bitte die Zeit, Code zu erstellen, um den Fall abzudecken, wenn sie ausgelöst werden. Heben Sie im Code dafür einen Pin hoch oder deaktivieren Sie WDT, wenn Sie sich noch im Debugger befinden, und gehen Sie in eine Endlosschleife. Auf diese Weise finden Sie heraus, ob Sie einen Interrupt auslösen, der nicht sein sollte. Sie möchten nicht, dass ein Fehler irgendwo einmal im Monat zu einem Produkt führt, das unmöglich aufzuspüren ist.

Antworten (1)

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?

Beide Annahmen sind richtig, und Sie haben auch Recht, wenn Sie sagen, dass das Problem darin bestand, dass ich die Zeile 'PIR1bits.TMR2IF = 0;' nicht hatte. für das zweite (derzeit kommentierte) Bit. Ich verwirre jedoch - wie ist eine 0,7-MHz-Ausgabe durch Bit-Umschalten auf einem 12-MIPS-Kern möglich?
@SGosh - Es wären 68 Taktzyklen oder 17 Anweisungen 1/(17/12e6)) = 705882 kHz. Außerdem muss es nicht mit 12 MIPS laufen, das ist das Maximum, wenn die PLL für einen 48-MHz-Takt eingerichtet ist.