Problema al interrumpir el puerto B

Hola amigos
Estoy haciendo un contador de varios dígitos con PIC16F84, utilizo RA4/TOCKI como entrada para contar pulsos bajos e incrementar el contador. Para decrementarlo utilizo una interrupción por cambio de estado en RB7, que es el único pin sobrante que tengo en el puerto B. RB0-RB6 utilizo para controlar los displays.

El problema: Cuando hago un cambio de estado en RB7, el programa entra en la interrupción y se queda ahí en un bucle infinito. Es decir, llega a RETFIE, y en vez de volver al programa, regresa a ORG 4.
Otro dato interesante es que NO puedo resetear ningún flag en la interrupción (y este es el motivo por el que no sale, ya que RBIF, flag de interrupción por cambio de estado en RB3-RB7, se mantiene en 1). La única forma en que sale del programa es con "return", pero no me sirve porque no se resetean los flags.

Adjunto el código muy reducido para no causar dolores de cabeza
Código:
; ZONA DE CÓDIGOS ********************************************************************

ORG 0	 ; El programa comienza en la dirección 0.
goto	Inicio
ORG	 4
goto	Decrementar

Inicio
bsf	 STATUS,RP0	; Acceso al Banco 1.
movlw b'00010000' ; 1 en el bit 5 de W
movwf TRISA ; RA4: ENTRADA
clrf	TRISB	 ; RB0-RB6: SALIDAS
bsf	 TRISB,7	 ; RB7: ENTRADA
movlw	b'10001000' ;
movwf	INTCON
movlw	b'11101000'	; Configuracion del modulo TMR0
movwf OPTION_REG
bcf	STATUS,RP0	 ; Acceso al Banco 0.
goto	Inicio

;***INTERRUPCION***
Decrementar
nop                      ; Para ejemplificar nomás
bcf 	INTCON,RBIF  ; Esto realmente no sirve de nada, debería poner a 0 RBIF pero no lo hace
RETFIE

END	 ; Fin del programa

El contador ya funciona, pero no puedo decrementarlo, es decir hasta ahora solo es ascendente.
Le dejo una foto probandolo:
28.png

Dejo también una simulación completa en PROTEUS con el .hex por si alguien quiere echar un vistazo
Simulación en PROTEUS - Contador de 3 dígitos https://www.dropbox.com/s/qzyab366210x346/Display7S_Completo.zip

Espero que alguien pueda ayudarme. Muchas gracias
 

Adjuntos

  • Display7S_Completo.zip
    19.5 KB · Visitas: 1
Última edición:
Pues el hex sirve para el `pic pero no para saber que tenes malo, debes subir el codigo para verlo, solo asi se sabe, chauuuuuuuuu
 
Antes que nada debes salvar el contexto de tu PC, guardar el REG W y el STATUS y PClatch se hace porque dentro de la INT se usan y al salir te pueden afectar el programa, ademas al ingresar a la INTs debes verificar cual te provoco la INT asi sea una sola habilitada de las INTS debes hacerlo para estar seguro que fue ella, al salir antes de RETFIE debes recuperar el contexto osea nuevamente cargar W , STATUS y PClatch con los valores guardados en los REgs de soporte, como es tan sencillo tu programa por ahora salva o resguarda solo W y STATUS,

Ademas es muy importante que definas cual ESTADO es el que te sirve en la INT del pORTB pues recuerda que es por CAMBIO DE ESTADO osea cuando pasa de 0 a 1 y viceversa, OJO que no es lo mismo que la INT del RB0 que se determina el estado, chauuuuuuuu


Código:
[CODE]
;********************************     RUTINA ATENCION A LAS INTERRUPCIONES     ***************************************
;*****************************************************************************
	
INTs		BCF		INTCON,7
			BTFSC	INTCON,7
			GOTO	INTs
			MOVWF   w_temp            ; SALVO W EN w_temp
			MOVF	STATUS,w          ; MUEVO STATUS A W
			BCF     STATUS,RP0        ; BANCO 0
			MOVWF	status_temp       ; SALVO STATUS
			MOVF	PCLATH,w	  	  ; 
			MOVWF	pclath_temp	      ; SALVO PCLATCH

ACA ATIENDO LAS INTs
	
****************		
NADA		BCF     STATUS,RP0        	; BANCO 0
			MOVF	pclath_temp,w	  	; 
			MOVWF	PCLATH		  	  	; RECUPERO PCLATH 
			MOVF    status_temp,w     	; 
			MOVWF	STATUS            	; RECUPERO STATUS
			SWAPF   w_temp,f
			SWAPF   w_temp,w          	; RESTAURO W
			MOVLW	0X98
			MOVWF	INTCON				; BORRO FLAG RB4-RB7, HABILITO LAS INTs NUEVAMENTE
			RETFIE
[/CODE]
 
Última edición:
Atrás
Arriba