3 votos

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

Estoy tratando de compilar este código para parpadear led con botón de interrupción, utilizando xc8 compilador y PIC18F4550. He recibido estas advertencias, por lo que las líneas de código son ignorados y el programa no funciona correctamente (al hacer clic en el botón no pasa 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 del 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
        }
    }
}

7voto

user4245 Puntos 324

¿Ha leído el Guía del usuario de XC8 ? La sección 5.9 trata de las interrupciones.

Allí dice:

El calificador de función interrupt (o __interrupt) puede aplicarse a una definición de función C para que se ejecute cuando se produzca la interrupción. El compilador procesará la función de interrupción de forma diferente a cualquier otra función, generando código para guardar y restaurar cualquier registro utilizado y retornar utilizando una instrucción especial.

y:

Una función de interrupción debe declararse como interrupción de tipo void 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 llaman directamente en el código fuente.

A continuación pone 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 propio compilador se encarga de insertar el código en la ubicación correcta de la tabla de vectores para llamar al ISR.

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

void interrupt low_priority tc_int()

2voto

Dan Laks Puntos 5744

Además de la respuesta correcta de Majenko, tienes otros problemas con tu código. Parece que has tomado un parámetro de configuración de un ejemplo que encontraste en alguna parte. Desafortunadamente, los ajustes de configuración en cada PIC son diferentes. La única excepción son los PIC de la misma familia. No puedes simplemente copiar los ajustes de configuración del código fuente de un PIC diferente y esperar que funcione. Tal y como está, tu código no funcionará debido a la falta de ajustes de configuración adecuados.

Por suerte, conseguir los ajustes de configuración correctos es muy fácil. Asumiendo que estás usando MPLAB X, ve a Windows->PIC Memory Views->Configuration Bits. Una nueva pestaña llamada "Bits de Configuración" debería abrirse en la parte inferior de la pantalla. Ajusta la configuración como necesites en la columna Opciones (pista: querrás desactivar el WDT y el FOSC a HS, todo lo demás probablemente puede permanecer igual). A continuación, haga clic en el botón "Generar código fuente de salida". Se producirá una larga lista de líneas "#pragma config". Copie todo y pegarlo en la parte superior de su código.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X