Ich muss eine Interrupt Service Routine (ISR) zu bestehendem Code in C für einen PIC18F4620 und einen PIC18F46K22 hinzufügen . Wie Sie in Abschnitt 9 (beider Datenblätter) sehen können, haben diese Geräte mehrere Interrupt-Vektoren: 0x0008
für Interrupts mit hoher Priorität, 0x0018
für Interrupts mit niedriger Priorität.
Ich hätte gerne eine Antwort, die in vielen Fällen nützlich ist, also wäre die Frage: Wie kann ich eine Funktion an einer bestimmten Programmspeicheradresse ausführen? Für den ISR wäre diese Adresse 0x0008
oder 0x0018
.
Wenn es von Nutzen ist, verwende ich den MPLAB C18-Compiler, v3.44.
Verwandte: C-Codierungsdesign - Funktionszeiger?
Die benötigten Informationen finden Sie im Compiler-Handbuch: MPLAB C18 C COMPILER USER'S GUIDE .
Ab Seite 37 der Bedienungsanleitung:
MPLAB C18 platziert nicht automatisch eine ISR am Interrupt-Vektor. Üblicherweise
GOTO
wird am Unterbrechungsvektor eine Anweisung platziert, um die Steuerung an die eigentliche ISR zu übertragen. Zum Beispiel:
void lowPriorityISR(void);
#pragma code low_vector=0x18
void interrupt_at_low_vector(void) {
_asm GOTO lowPriorityISR _endasm
}
#pragma code
#pragma interruptlow lowPriorityISR
void lowPriorityISR() {
}
Wenn Sie eine ISR mit hoher Priorität implementieren, können Sie das interrupthigh
Pragma nicht wie erwartet verwenden. Sie müssen stattdessen das interrupt
Pragma verwenden, wie es hier beschrieben wird .
Wenn Sie den Compiler ändern können: Die Verwendung von Interrupts ist in den Microchip XC8- oder HI-TECH PICC-Compilern einfacher.
Lundin