Problema retorno de interrupción 16f84a

Hola, estoy aprendiendo a programar pic y tengo un problema:
estoy usando los pines RB4-RB7 como entradas de interrupción, la interrupción se ejecuta pero cuando termina la rutina la interrupción se ejecuta nuevamente y nunca regresa al programa principal. Este es el programa en assembler.

#include <p16f84a.inc>
STATUS equ 0x03
PORTA equ 0x05
PORTB equ 0x06
INTCON equ 0x0B
TIME equ 0x0C
COUNT1 equ 0x0D
COUNT2 equ 0x0E
COUNT3 equ 0x0F
TEMP equ 0x10

org 0x00
goto BEGIN
org 0x04 ;inicio int.
movwf TEMP
VERIF1: btfss PORTA,3
goto VERIF2
movlw 0x19 ; preset 25 sec
movwf TIME
goto FININT
VERIF2: btfss PORTA,4
goto FININT
movlw 0x37 ;preset 55 sec
movwf TIME
FININT: bcf INTCON,1
movfw TEMP
retfie

;Main
BEGIN: bsf INTCON,7
bsf INTCON,3
bcf INTCON,1
bsf STATUS,5
movlw 0x18
movwf PORTA
movlw 0xF0
movwf PORTB
bcf STATUS,5
movlw 0x01
movwf PORTA
movlw 0x04
movwf PORTB
LOOP: movlw 0xFA
movwf COUNT1
movlw 0xC8
movwf COUNT2
movlw 0x14
movwf COUNT3
LOOP1: decfsz COUNT1,1
goto LOOP1
movlw 0xFA
movwf COUNT1
decfsz COUNT2,1
goto LOOP1
movlw 0x0F
movwf COUNT2
decfsz COUNT3,1
goto LOOP1
incf TIME,1
movlw 0x3C ;tiempo 60 sec
subwf TIME,0
btfsc STATUS,2
clrf TIME
movlw 0x00 ;tiempo 0 sec
subwf TIME,0
btfsc STATUS,2
goto FIRST
movlw 0x19 ;tiempo 25 sec
subwf TIME,0
btfsc STATUS,2
goto SECOND
movlw 0x1E ;tiempo 30 sec
subwf TIME,0
btfsc STATUS,2
goto THIRD
movlw 0x37 ;tiempo 55 sec
subwf TIME,0
btfsc STATUS,2
goto FOURTH
goto FINISH
FIRST: movlw 0x01
movwf PORTA
movlw 0x04
movwf PORTB
goto FINISH
SECOND: movlw 0x02
movwf PORTA
goto FINISH
THIRD: movlw 0x04
movwf PORTA
movlw 0x01
movwf PORTB
goto FINISH
FOURTH: movlw 0x02
movwf PORTB
goto FINISH
FINISH: goto LOOP

end

Cuando detecta la interrupción el pic se queda ejecutando la parte en negrita indefinidamente.
El PCL si guarda la dirección de retorno en el stack pero no lo recupera en RETFIE.
lo probé con el simulador del MPLAB y Proteus con los mismos resultados.
 
Debes borra el FLAG correspondiente a la INT, si no lo hace al salir regresa inmediatamente a ella y se queda ahi, recuerdo que tambien sugerian al entrar a la rutina de INTs deshabilitar globalmente las INTS y al salir de la rutina de INTs activarla nuevamente, recuerda las FLAGs se activan al ocurrir una INT pero se deben borrar por SOFT, chauuuuuuuuuu

Estas haciendolo por lo que veo bien, pero estas borrando el FLAg de la INT RB0 con bcf INTCON,1
debes hacerlo asi: bcf INTCON,0 que es el FLAg de la INT RBIE
 
Última edición:
gracias fdsergio por tu pronta respuesta, me hiciste ver otro error que había cometido.
pero la verdadera solución es que se tiene que leer o escribir el puerto B antes de borrar el flag RBIF aunque no entiendo aún muy bien el porque.
 
Ah ese es un error comun porque debes asegurarte que te provocara la INT, recuerda que esa INT se activa con cambio de estado osea asi: Cuando pasa de "0" a "1" y tambien cuando pasa de "1" a "0", por eso al ingresar a la INT debes probar el estado del BIt, te explico: si tenes una pulsador entre tierra y el BIT de entrada ej. RB4 y tenes activas la R de PULL UP, debes definir cual es el estado que te importa , lo mas adecuado seria cuando pasa de 1 a 0, esto lo analizas al entrar a la INT, pruebas si el bit esta en 0 y ejecutas la rutina que hayas definido, pero como cuando sueltes el pulsador pasara de 0 a 1 tambien se producira la INT, ahora como ingresas a la INT y pruebas y esta en 1 el bit Rb4 entonces no haces nada y sales pero borrando el FLAG en ambos, asi no hayas hecho nada, eso es la forma, chauuuu
 
Atrás
Arriba