Wie definiere ich einen Interrupt in PIC18F?

Ich denke, die PIC18F-Familie hat Interrupt-Service-Routinen mit hoher und niedriger Priorität, nicht nur eine ISR. Ich beschäftige mich zum ersten Mal damit und ich kann den Compiler (XC8) anscheinend nicht dazu bringen, die beiden unterschiedlichen Interrupts aus einem älteren Code zu erkennen. Grundsätzlich weiß ich nicht, wo ich suchen soll, wenn ich hoffe, herauszufinden, was ich dem Compiler sagen soll, um diese beiden Funktionen als Interrupts zu markieren?

#include <xc8.h>
...
__interrupt(high_priority) void MyHighPriorityIsr(void)
{
// stuff
}

__interrupt(low_priority) void MyLowPriorityIsr(void)
{
// stuff
}

Ich erhalte:

error: (285) no identifier in declaration
error: (1275) only functions may be qualified "interrupt"

Auf Seite 34 des Benutzerhandbuchs des Compilers scheint es in Ordnung zu sein, aber ich erhalte Fehler und kann nicht kompilieren: http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_XC8_C_Compiler_User_Guide.pdf

Er sagte, es ist XC8!
@LeonHeller Nachdem ich ihn gefragt habe...
tarabyte, also bist du mit den antworten zufrieden oder nicht. Wenn nicht, lassen Sie mich genau wissen, welchen Prozessor Sie verwenden, damit ich überprüfen kann, ob meine Lösung für Sie funktioniert. Ich verwende PIC18F46K20 mit LOW- und HIGH-Priority-Interrupts unter XC8-Compiler Version 1.30 und MPLAB 8.76 und alles funktioniert einwandfrei, Code wird kompiliert und tut tatsächlich, was er tun soll (ADC Ints, TMR0- und TMR1-Ints, Ints bei Pin-Änderung (IOCB) ). Aber ich muss zugeben, dass ich Stunden gebraucht habe, um herauszufinden, welche Bits in welchen Registern zu setzen sind und welche Form von ISR def/decl zu verwenden ist. XC8-Handbuch ist zu allgemein. Sie hätten das C18-Erbe und n aufgeben sollen

Antworten (2)

void low_priority interrupt Low_Priority_Interrupt(void) {
    if (TMR1IE && TMR1IF) {
        TMR1H = 0xFE;//Pre load for 125 ms
        Timer1_Isr();
        TMR1IF = 0;
        return;
    }
}

void high_priority interrupt High_Priority_Interrupt(void) {
    if (TX2IE && TX2IF) {
        SerialTx_Isr();
        TX2IF = 0;
        return;
    }
    if (RC2IE && RC2IF) {
        SerialRx_Isr();
        RC2IF = 0;
        return;
    }
}

Ist es möglich, dass Sie Ihre Funktionen nicht richtig deklarieren?

Weiter oben in Ihrem Code sollten Sie die Deklarationen haben:

void __interrupt(high_priority) MyHighPriorityIsr(void);
void __interrupt(low_priority) MyLowPriorityIsr(void);

Dann später Ihre Funktionsdefinitionen:

void __interrupt(high_priority) MyHighPriorityIsr(void)
{
// stuff
}

void __interrupt(low_priority) MyLowPriorityIsr(void)
{
// stuff
}

Beachten Sie auch, dass "void" vor kommt __interrupt()

Viel Glück!

Alle Permutationen, wo ich __interrupt platziere, scheinen mir nicht zu erlauben, zu kompilieren :(
Das ist nicht die Art und Weise, wie XC8 ISRs schreibt.
@MattYoung Ich glaube dir, da es für Terabyte nicht funktioniert hat. Aber ich habe es direkt aus dem XC-Benutzerhandbuch (Version D), Abschnitt 2.5.10.3, entnommen. Beispielsweise heißt es, dass für 8-Bit-Compiler der Wechsel void interrupt myIsr(void)zu void __interrupt(high_priority) myIsr(void)und der Wechsel void interrupt low_priority myLoIsr(void)zu void __interrupt(low_priority) myLoIsr(void). Ich habe kopiert und eingefügt ... Können Sie mir sagen, wie es gemacht werden sollte? Ich bin noch nicht von Microchips C18 migriert :)
Was Eric Friesen gesagt hat. Der relevante Teil des XC8-Handbuchs ist Abschnitt 5.9. Und bleib bei C18, XC8 ist unterlegen.
mag ich auch nicht. Sie haben Kuriositäten, die nach der Verwendung von c32 ärgerlich sind.