Hola a todos, resulta q quiero saber bien el funcionamiento de las interrupciones en el 16F84, ya me informe sobre q es lo q debo configurar para trabajar con las interruciones, me encamine a hacer una rutina sencilla para hacer el siguiente programa
si RA0=1 se realiza una suma de dos valores previamente cargados, en este caso NUM1=5 NUM2=4, y se muestra el resultado por el portb durante 5 segundos, el programa se queda en un bucle esperando a q RA0 sea 1.
Por el lado de la interrupcion tengo configurado por cambio de estado de RB7:RB4, si se detecta la interrupcion se realiza NUM1-NUM2 y se debe mostrar por el puertoB el resultado, es decir "1" durante 5 segundos, y luego volver a preguntar por el estado de RA0.
el problema esta en q cuando se detecta la interrupcion se queda siempre mostrando el resultado de la resta y no regresa al preguntar el estado de RA0, yo creo q el problema lo genera la rutina de tiempo o tal vez estoy manejando mal la interrupcion, adjunto el codigo .
gracias por las aclaraciones q me puedan hacerLIST P=16F84A
#INCLUDE "P16F84A.INC"
CBLOCK 0CH
NUM1
NUM2
PDel0
PDel1
PDel2
ENDC
ORG 0
GOTO INICIO
;##################interrupcion#######################
ORG 4
RESTA MOVF NUM2,W
SUBWF NUM1,W
MOVWF PORTB
CALL DEMORA
CLRF PORTB
BCF INTCON,RBIF
;BSF INTCON,GIE
retfie
;GOTO PREGUNTA
;##########################################################
;*****Principal***************************
INICIO BSF STATUS,5
BSF PORTA,0
MOVLW 0XF0
MOVWF PORTB
BCF STATUS,5
CLRF PORTB
CLRF PORTA
PRE MOVLW 88H
MOVWF INTCON
MOVLW 5H
MOVWF NUM1
MOVLW 4H
MOVWF NUM2
PREGUNTA BTFSS PORTA,0
GOTO PREGUNTA
GOTO SUMA
SUMA MOVF NUM2,W
ADDWF NUM1,W
MOVWF PORTB
CALL DEMORA
CLRF PORTB
GOTO PREGUNTA
;********************************************
DEMORA movlw .165 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .41 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .147 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
return ; 2+2 Fin.
END