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
El contador ya funciona, pero no puedo decrementarlo, es decir hasta ahora solo es ascendente.
Le dejo una foto probandolo:
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
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:
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
Última edición: