¿Cómo definir una interrupción en PIC18F?

Supongo que la familia PIC18F tiene rutinas de servicio de interrupción de alta y baja prioridad, no solo una ISR. Es la primera vez que trato con esto y parece que no puedo hacer que el compilador (XC8) reconozca las dos interrupciones de diferencia de algún código heredado. Básicamente, no sé dónde mirar cuando espero averiguar qué decirle al compilador para marcar estas dos funciones como interrupciones.

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

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

Me estoy poniendo:

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

La página 34 de la guía del usuario del compilador parece estar bien, pero recibo errores y no puedo compilar: http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_XC8_C_Compiler_User_Guide.pdf

¡Dijo que es XC8!
@LeonHeller Después de que le pregunté...
tarabyte, entonces, ¿estás satisfecho con las respuestas o no? Si no, hágame saber exactamente qué procesador está usando, para que pueda verificar que mi solución funcione para usted. Uso PIC18F46K20 con interrupciones de prioridad BAJA y ALTA, bajo el compilador XC8 versión 1.30 y MPLAB 8.76 y todo funciona bien, el código se compila y realmente hace lo que se supone que debe hacer (ADC Ints, TMR0 y TMR1 Ints, Ints on pin change (IOCB) ). Pero debo admitir que me tomó horas averiguar qué bits en qué registros configurar y qué forma de ISR def/decl usar. El manual del XC8 es demasiado genérico. Deberían haber abandonado el legado C18 y n

Respuestas (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;
    }
}

¿Es posible que no esté declarando sus funciones correctamente?

Más arriba en su código, debe tener las declaraciones:

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

Luego, más tarde, sus definiciones de función:

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

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

Además, observe que "vacío" viene antes __interrupt()

¡Buena suerte!

todas las permutaciones de donde coloco __interrupt parecen no permitirme compilar :(
Esa no es la forma XC8 de escribir ISR.
@MattYoung Te creo, ya que no funcionó para terabyte. Pero lo tomé directamente de la Guía del usuario de XC (versión D), sección 2.5.10.3. Por ejemplo, dice que para los compiladores de 8 bits, cambiar void interrupt myIsr(void)a void __interrupt(high_priority) myIsr(void)y cambiar void interrupt low_priority myLoIsr(void)a void __interrupt(low_priority) myLoIsr(void). Copié y pegué... ¿Me podrían decir cómo se debe hacer? Todavía no he migrado del C18 de Microchip :)
Lo que dijo Eric Friesen. La parte pertinente del manual XC8 es la sección 5.9. Y quédate con C18, XC8 es inferior.
tampoco me gusta Tienen rarezas que son molestas después de usar c32.