compilador PIC18 xc8: cómo resolver el “código” de pragma de advertencia (335) desconocido

2

Estoy tratando de compilar este código para que parpadee el led con la interrupción del botó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 ocurre 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
        }
    }
}
    
pregunta Makhlouf GHARBI

2 respuestas

7

¿Has 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 la función (o __interrupción) se puede aplicar a una definición de la función C para que se ejecute una vez que se produzca la interrupción. El compilador procesará la función de interrupción de manera diferente a cualquier otra función, generando un código para guardar y restaurar cualquier registro utilizado y regresar utilizando una instrucción especial.

y:

  

Una función de interrupción se debe declarar como tipo de interrupción nula 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 se encarga de insertar el código en la ubicación correcta en la tabla vectorial para llamar al ISR.

Por defecto, utiliza el vector de interrupción de alta prioridad. Para especificar el vector de prioridad baja, inserte el atributo low_priority :

void interrupt low_priority tc_int()
    
respondido por el Majenko
2

Además de la respuesta correcta de Majenko, tiene otros problemas con su código. Parece que levantaste una configuración de un ejemplo que encontraste en algún lugar. Desafortunadamente, los ajustes de configuración en cada PIC son diferentes. La única excepción a eso es 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 - > PIC Memory Views- > Configuration Bits. Se abrirá una nueva pestaña llamada "Bits de configuración" en la parte inferior de la pantalla. Ajuste la configuración según sea necesario en la columna Opciones (sugerencia: deseará apagar el WDT y el FOSC a HS; es probable que todo lo demás siga igual). Luego haga clic en el botón "Generar código fuente para generar". Producirá una larga lista de líneas "#pragma config". Copia todo y pégalo en la parte superior de tu código.

    
respondido por el Dan Laks

Lea otras preguntas en las etiquetas