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
}
}
}
¿ 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()
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.
volatile
palabra clave, bloques atómicos al acceder a variables compartidas y por qué no debería usar int
para contar un número inferior a 256.
vladimir cravero
vladimir cravero