Autor Tema: Bucle infinito al interrumpir el puerto B  (Leído 1842 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pingui56

  • PIC10
  • *
  • Mensajes: 1
Bucle infinito al interrumpir el puerto B
« en: 12 de Febrero de 2013, 00:29:21 »
Hola amigos del foro..

Quiero interrumpir un programa mediante un cambio de estado en RB7, para lo cual configuro esta línea del micro como entrada.
Pero 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.
Reduje el programa todo lo posible para no causar dolores de cabeza y alguien pueda detectar la falla que tanto busco.
Tal vez a alguien ya le pasó. Saludos

Código: [Seleccionar]
; 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

Eliminé todo el bulto del programa que es mucho más largo, dejando solo esto para que se vea fácil el error..
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 interrupcion 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.
Si quieren saber para que necesito esta interrupción les explico. Hice un contador de 3 displays, el cual manejo con un PIC16F84A y ningún CI más.
Mediante pulsos bajos en RA4/TOCKI incremento el contador.
Mediante un cambio de estado en RB7 (el único pin sobrante del PORT B) interrumpo el programa y descuento el contador.. He aquí el problema, cuando interrumpo
se queda ahí dando vueltas en la interrupción y no sale.
Les comento que ya armé en protoboard este trabajo y funciona perfecto, excepto que no puedo hacer que descienda el contador, únicamente resetearlo.

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

Disculpen si es algo tonto, ya fui "al Ingeniero" y traté mucho por mi cuenta también sin encontrar solución  :(
Agradezco mucho su ayuda.
PD: Si alguien quiere este programa, lo comparto completo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Bucle infinito al interrumpir el puerto B
« Respuesta #1 en: 12 de Febrero de 2013, 01:16:33 »
Hola.

Bienvenido al foro.

En el datasheet está la mayoría de las respuestas. Y en este foro las restantes. La interrupción por cambio en los pines [RB4-RB7] requiere que dentro de la ISR(subrutina de manejo de interrupciones) hagas una lectura del puerto B para refrescar el latch interno que es el que se usa para detectar el cambio. Hasta que no lo hagas, no va a dejar de existir la discrepancia y por ende limpiar el flag no sirve.

No hace falta un ingeniero para esto, hace falta un sencillo MOV PORTB,F al ingresar a la ISR.

Saludos.
« Última modificación: 12 de Febrero de 2013, 01:18:50 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.