Compilador PIC18 xc8: cómo resolver la advertencia (335) pragma "código" desconocido

Estoy tratando de compilar este código para que parpadee con el botón de interrupción, usando el compilador xc8 y PIC18F4550. Recibí esas advertencias, por lo que las líneas de código se ignoran y el programa no funciona correctamente (al hacer clic en el botón, no sucede nada)

newmain.c:45: warning: (335) unknown pragma "code"
newmain.c:46: warning: (335) unknown pragma "interrupt"
newmain.c:65: warning: (335) unknown pragma "code"

código de programa

#define _XTAL_FREQ 4000000
#include <pic18f4550.h>

// BEGIN CONFIG
#pragma config OSC = HS

static int cpt = 1;

void IntExternal_INT(void) {
    TRISB0 = 1; // PORT B0 as input
    INT0E = 1;
    INTCONbits.PEIE = 1; //enable periphyrical interrupts 
    INTCONbits.GIE = 1;
    INTEDG0 = 0; //: Interrupt Edge Select bit : 1 = Interrupt on rising edge of RB0/INT pin
    //  0 = interrupt on falling edge
    INT0F = 0;
}

void delay() {
    volatile int i, j;
    for (i = 0; i < 2000; i++)
        for (j = 0; j < 10; j++);
}

#pragma code isr = 0x08 // Store the below code at address 0x08
#pragma interrupt isr  // let the compiler know that the function isr() is an interrupt handler

void iscr(void) {
    cpt++;

    if (INT0IF) //If External Edge INT Interrupt
    {
        LATDbits.LATD0 = 1; // RD-0 to High
        LATDbits.LATD1 = 1; // RD-1 to High
        delay();
        LATDbits.LATD0 = 0; // RD-0 to LOW
        LATDbits.LATD1 = 0; // RD-1 to LOW
        delay();
        INT0IF = 0; // clear the interrupt
    }
}    
#pragma code // Return to the default code section

void main(void) {
    IntExternal_INT();
    TRISD = 0xF0; // PORT B Setting: Set all the pins in port D to Output.
    while (1) {
        if (cpt % 2 == 0) {
            delay();
            LATDbits.LATD0 = 1; // RD-0 to High
            LATDbits.LATD1 = 1; // RD-1 to High
            delay();
            LATDbits.LATD0 = 0; // RD-0 to LOW
            LATDbits.LATD1 = 0; // RD-1 to LOW
        }
    }
}
Creo que debe llamar a su iscr isr, y debe declararlo por encima del #pragma interrupt isr
aaa y eso tampoco funcionará porque no tiene tanto espacio en la memoria, necesitará ir a un controlador apropiado.

Respuestas (2)

¿ Ha leído la guía del usuario de XC8 ? La Sección 5.9 trata de las interrupciones.

Allí dice:

La interrupción del calificador de función (o __interrupt) se puede aplicar a una definición de función C para que se ejecute una vez que ocurra la interrupción. El compilador procesará la función de interrupción de manera diferente a cualquier otra función, generando código para guardar y restaurar cualquier registro usado y regresar usando una instrucción especial.

y:

Una función de interrupción debe declararse como tipo void interrupt y no puede tener parámetros. Este es el único prototipo de función que tiene sentido para una función de interrupción, ya que nunca se les llama directamente en el código fuente.

Luego pasa a dar un ejemplo:

int tick_count;

void interrupt tc_int(void)
{
    if (TMR0IE && TMR0IF) {
        TMR0IF=0;
        ++tick_count;
        return;
    }
    // process other interrupt sources here, if required
}

El compilador mismo maneja la inserción del código en la ubicación correcta en la tabla de vectores para llamar al ISR.

De forma predeterminada, utiliza el vector de interrupción de alta prioridad. Para especificar el vector de baja prioridad, inserte el atributo low_priority:

void interrupt low_priority tc_int()
Hice exactamente lo que dijiste antes, pero no funcionó stackoverflow.com/questions/25553762/… . así que probé este método que encontré en un tutorial
Creo que el método #pragma era de C18, que ahora está obsoleto.
entonces quiere decir que el método de interrupción de este código está obsoleto y debería seguir el primer método (pregunta sobre stackoverflow). estoy usando el compilador xc8
Sí, ya que XC8 usa el método que detallo (y usted tiene en su otra pregunta), no el método #pragma. Por eso te dice claramente cuando compilas que lo estás haciendo mal.
Majenco tiene toda la razón, mis comentarios a las preguntas están ahí porque pensé que se trataba de C18 (malinterpretado)
Sugeriría eliminar su código hasta el mínimo y hacer que el ISR simplemente encienda un LED y nada más (ni siquiera lo apague nuevamente): confirme si se está llamando al ISR o no. Tampoco haga que el ciclo principal haga nada, solo while(1);. Si el LED se enciende, el código ISR está funcionando y su problema está en otra parte.

Además de la respuesta correcta de Majenko, tiene otros problemas con su código. Parece que eliminó una configuración de un ejemplo que encontró en alguna parte. Desafortunadamente, los ajustes de configuración en cada PIC son diferentes. La única excepción a eso son los PIC dentro de la misma familia. No puede simplemente copiar los ajustes de configuración del código fuente para un PIC diferente y esperar que funcione. Tal como está, su código no funcionará debido a la falta de ajustes de configuración adecuados.

Afortunadamente, obtener los ajustes de configuración correctos es muy fácil. Suponiendo que está utilizando MPLAB X, vaya a Windows->Vistas de memoria PIC->Bits de configuración. Debería abrirse una nueva pestaña llamada "Bits de configuración" en la parte inferior de la pantalla. Ajuste la configuración según lo necesite en la columna Opciones (pista: querrá apagar el WDT y el FOSC a HS, todo lo demás probablemente permanezca igual). Luego haga clic en el botón "Generar código fuente para salida". Producirá una larga lista de líneas "#pragma config". Copie todo y péguelo en la parte superior de su código.

la configuración no se ha escrito en el código haciendo clic en generar código fuente para generar
También otras cosas a considerar / aprender son cómo usar la volatilepalabra clave, bloques atómicos al acceder a variables compartidas y por qué no debería usar intpara contar un número inferior a 256.
@Makouda, la última línea de mi respuesta dice que debe copiar y pegar el texto manualmente. No lo inserta en su código por usted.
@DanLaks ok entiendo, puedo ver la configuración de salida, gracias