Hola a todos aqui les dejo un programa como administre las interrupciones para el control del PSP, espero que les sirva de mucho y sigamos mejorandolo para hacer algo mas interesante:
TRISA = 0 "Puerto A como salida
TRISB = %00000001 "RB0 como entrada
TRISD = 0 "Puerto D como salida
TRISE = %00010111 "RE0 y RE1 Como entradas y
"habilita el modo PSP
@ clrf PORTA "Limpia Buffer Puerto A
@ clrf PORTB "Limpia Buffer Puerto B
@ clrf PORTD "Limpia Buffer Puerto D
INTE Var PIE1.7 "Bit que habilita la interrupción
"por PSP
INTF Var PIR1.7 "Flag de la interrupción por PSP
IBF_BIT Var TRISE.7 "Flag de escritura
OBF_BIT Var TRISE.6 "Flag de lectura
LED1 Var PORTA.0 "Led conectado a RA0
LED2 Var PORTA.1 "Led conectado a RA1
LED3 Var PORTA.2 "Led conectado a RA2
Dato Var Byte "Variable de almacenamiento
i Var Byte "Contador
On Interrupt Goto Mi_Int "Define vector de interrupción
INTCON = %11000000 "Habilita las interrupciones, la
"interrupción para perifericos (PSP)
PIE1 = %10000000 "Habilita la interrupción para PSP
Goto Inicio "Salta al inicio del programa
Disable
Mi_Int: if INTF = 1 then "Si se ha producido una interrupción
"por PSP, RD o WR
if OBF_BIT = 0 then "Si se produce una Lectura (RD)
LED3 = 1 "Enciende Led 3
Pause 1000 "Pausa de 1 segundo
PORTD = Dato "Saca Dato por el Puerto D
endif
if IBF_BIT = 1 then "Si se produce una Escritura (WR)
LED2 = 1 "Enciende Led 2
Pause 1000 "Pausa de 1 segundo
Dato = PORTD "Lee Dato desde el Puerto D
endif
endif
INTF = 0 "Limpia flag por PSP
IBF_BIT = 0 "Limpia flag por Escritura
OBF_BIT = 1 "Limpia flag por Lectura
resume "Retorna al programa
Enable
Inicio: LED1 = 1 "Enciende el led 2
Gosub Retardo "Pausa por 0,5 segundos
LED1 = 0 "Apaga el led 2
Gosub Retardo "Pausa por 0,5 segundos
Goto Inicio "Loop infinito
Retardo: For i = 0 to 500 "Inicio de ciclo
Pause 1 "Pausa de 1 milisegundo
Next i "Termino de ciclo
Return
end