Hola, empezando con las interrupciones en C18, con las guías de suky y microcadver; me tropecé con esto para un micro 18F1320:
#include <p18f1320.h>
#include <delays.h>
#include <portb.h>
#pragma config OSC=INTIO2, FSCM=OFF, IESO=OFF, PWRT=ON, BOR=OFF, WDT=OFF, MCLRE=ON, STVR=OFF
#pragma config LVP=OFF, DEBUG=OFF, CP0=OFF, CP1=OFF, CPB=OFF, CPD=OFF, WRT0=OFF, WRT1=OFF
#pragma config WRTB=OFF, WRTC=OFF, EBTR0=OFF, EBTR1=OFF, EBTRB=OFF
#define true 1
volatile char bandera=0;
char a=0;
void int_extISR(void);
// Creamos una nueva seccion de codigo a partir de la direccion 0x08.-
#pragma code Interrupcion = 0X0008
void VectorInterrupcion(void){
_asm goto int_extISR _endasm
}
#pragma code // Cerramos seccion.-
// Rutina de Interrupcion.-
#pragma interrupt int_extISR
void int_extISR(void){
if(INTCONbits.INT0IF==1){
bandera=1; // Indicamos que se ha producido la interrupción.-
INTCONbits.INT0IF=0; // Borramos bandera.-
}
}
void main(void){
OSCCON=0b1110010; //Oscilador interno a 8MHz
TRISA=255; //puerto a entradas
TRISB=0x7f; //solo RB7 salida
LATBbits.LATB7=1; //RB7 puesto a uno
OpenRB0INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_OFF);
//INTCON = 0X90;//configuramos la interrupcion externa del RB0
//INTCON2 = 0X40;//configuramos el flanco de subida para la interrupcion
RCONbits.IPEN=0; // Deshabilitamos Prioridades
//INTCONbits.INT0IE=1; //Habilitamos Interrupción Externa 0
INTCONbits.GIE=1; // Habilitamos interrupcion Global.
while(true){
if(bandera==1){
do{}while(PORTBbits.RB0==0);
if(a==0)
PORTBbits.RB7=0;
else
PORTBbits.RB7=1;
a=~a;
bandera=0;
}
}
}
He estado simulando en proteus 7.4sp3con el .cof y no ocurre la interrupción en el flanco de bajada al que lo configuré, no se donde está el error, o que podría faltar, ya revisé y revisé y no pillé nada... será porque soy muy noob con C18?
He probado con OpenRB0INT y sin open también, solo configurando los registros correspondientes y nada, o será que me falta algún registro por configurar?
Espero puedan ayudarme con este programa, muchas gracias.
saludos.