Soy nuevo en esto de los microcontroladores y para colmo estoy debutando con un dspic30f3013. Estoy tratando de hacer un programita bien sencillo para probar las interrupciones y no doy pie con bola. El parpadeo del led en RD8 funciona en tanto INT0 esta conectado a masa, si levanto la coneccion de INT0 y la dejo libre el led permanece encendido sin parpadear. Y cuando acciono el swich de la INT0 y la pone a Vdd, no pasa naranja, sigue parpadeando el led en RD(.
Esto es lo que programe:
.EQU __30F3013, 1;
.include "p30F3013.inc";
.GLOBAL __reset, _INT0Interrupt, INICIO, BUCLE, LOOP, DELAY1;
;
.ORG 0x0000;
__reset: GOTO INICIO;
;
.ORG 0x0014; IVT
GOTO _INT0Interrupt;
;
.ORG 0x0094; AIVT
GOTO _INT0Interrupt;
;
.text;
INICIO: MOV #__SP_init, W15; Inicializacion SP
MOV #__SPLIM_init, W0;
MOV W0, SPLIM;
;
MOV #0x0000, W0;
MOV W0, INTCON2; set up INT0 ... INT4 to interrupt on positive edge
MOV #0x0000, W0;
MOV W0, IFS0; Reset INT0 interrupt flag INT0IF en el registro IFS0
MOV #0x0001, W0;
MOV W0, IEC0; INT0 enable
;
MOV #0x0000, W0;
MOV W0, PORTD; Limpio puertos salida RD8 y RD9
MOV #0x0200, W0;
MOV W0, TRISD; Habilito como salida RD8
;
LOOP: MOV #0x0100, W0;
MOV W0, PORTD; prendo el LED en RD8
CALL DELAY1;
MOV #0x0000, W0;
MOV W0, PORTD; apago el LED
CALL DELAY1;
NOP;
GOTO LOOP;
;
_INT0Interrupt: MOV #0x0000, W0;
; MOV W0, IFS0; Reseteo INT0 interrupt flag
; MOV #0x0000, W0;
MOV W0, PORTD; limpio el puerto de salida RD9
MOV #0x0100, W0;
MOV W0, TRISD; habilito el RD9
;
BUCLE: MOV #0x0200, W0;
MOV W0, PORTD; prendo el LED en RD9
CALL DELAY1;
MOV #0x0000, W0;
MOV W0, PORTD; apago el LED
CALL DELAY1;
NOP;
GOTO BUCLE;
;
DELAY1: MOV #0xFFFF, W1;
REPEAT W1;
NOP;
REPEAT W1;
NOP;
REPEAT W1;
NOP;
REPEAT W1;
NOP;
REPEAT W1;
NOP;
REPEAT W1;
NOP;
REPEAT W1;
NOP;
REPEAT W1;
NOP;
REPEAT W1;
NOP;
REPEAT W1;
NOP;
RETURN;
.END;