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.
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.