Ayuda con interrupciones pic 16f84a

Hola, compañeros del foro.
Bueno lo que pasa es que quiero hacer un programa en donde al apretar un botón el pic me muestre en la parte de arriba un mensaje y cuando apriete otro botón me muestre otro mensaje en la parte de abajo, solamente que el de la parte de abajo tiene que estar parpadeando, todo esto con interrupciones, el problema viene cuando quiero que el segundo mensaje se muestre intermitente mente parpadeando, puesto que si lo hago en la subrutina de la interrupción, no hay manera que salga del bucle.
Quiero decir, si presiono el botón del mensaje de abajo primero, no me permitirá mostrar el de arriba, intente que en las interrupciones solamente cambiaran un registro y usar ese para un salto indexado pero me hace cosas muy extrañas, en la simulación de proteus.
Mi intención era que la segunda vez que se apretara cualquiera de los botones el mensaje desapareciera, pero no he podido lograr, ni la primera parte.
adjunto la simulación y lo que llevo
Espero y me puedan dar alguna idea o camino que me sirva :/, muchas gracias de antemano :), saludos.
 

Adjuntos

  • Practica3.2.rar
    37.1 KB · Visitas: 10
hola, ya he cambiado un poco el código, y en mplab la secuencia si se realiza como se supone que debe de proceder, pero no se como realizar las conexiones en proteus y porsupuesto fisicamente, puesto que la entrada de la interrupción que son RB6 Y RB7, son compartidas con las salidas que controlan el lcd, les adjunto mi nuevo codigo
Código:
	__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
	LIST	   P=16F84A
	INCLUDE  <P16F84A.INC>

	CBLOCK  0x0C
	Habilita
	ENDC

#DEFINE  EntradaRB7	PORTB,7
#DEFINE  EntradaRB6	PORTB,6

; ZONA DE CÓDIGOS ********************************************************************

	ORG 	0
	goto	Inicio
	ORG	4			; Vector de interrupción.
	goto	ServicioInterrupcion
Inicio
	call	LCD_Inicializa
	bsf	STATUS,RP0		; Acceso al Banco 1.
	bsf	EntradaRB7		; Las líneas se configuran como entrada.
	bsf	EntradaRB6
	bcf	STATUS,RP0		; Acceso al Banco 0.
	movlw	b'10001000'		; Activa interrupción  por cambio en las
	movwf	INTCON			; líneas del Puerto B (RBIE) y la general (GIE)

Principal
	sleep				; Pasa a modo bajo consumo esperando las
	addwf	PCL,F
	goto 	VisualizaRB7
	goto	VisualizaRB6

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Subrutina de atención a la interrupción. Detecta qué ha producido la interrupción y
; ejecuta la subrutina correspondiente.

ServicioInterrupcion
	call	Retardo_20ms		; Espera se estabilicen niveles.	
	btfss	EntradaRB7		; ¿Está presionado el pulsador RB7?
	call	VisualizaRB7w
	btfss	EntradaRB6		; ¿Está presionado el pulsador RB6?
	call	VisualizaRB6w
	bcf	INTCON,RBIF
	retfie				; Retorna y rehabilita las interrupciones, GIE=1.

; Subrutinas "VisualizaRB7" y "VisualizaRB6" --------------------------------------------

VisualizaRB7w
	movlw	b'00000000'
	movwf	Habilita
	return
VisualizaRB7
	call	LCD_Linea1
		movlw 	'H'
		call	LCD_Caracter
		movlw 	'O'
		call	LCD_Caracter
		movlw 	'L'
		call	LCD_Caracter
		movlw 	'A'
		call	LCD_Caracter
		movlw 	' '
		call	LCD_Caracter
		movlw 	'F'
		call	LCD_Caracter
		movlw 	'U'
		call	LCD_Caracter
		movlw 	'N'
		call	LCD_Caracter
		movlw 	'C'
		call	LCD_Caracter
		movlw 	'I'
		call	LCD_Caracter
		movlw 	'O'
		call	LCD_Caracter
		movlw 	'N'
		call	LCD_Caracter
		movlw 	'O'
		call	LCD_Caracter
	movf	Habilita,0
	addwf	PCL,F
    goto 	VisualizaRB7
	goto	VisualizaRB6
	return
Auxiliar
	goto	VisualizaRB7
VisualizaRB6w
	movlw	b'00000001'
	movwf	Habilita
	return
VisualizaRB6
	call	LCD_Linea2
		movlw 	'Y'
		call	LCD_Caracter
		movlw 	' '
		call	LCD_Caracter
		movlw 	'P'
		call	LCD_Caracter
		movlw 	'A'
		call	LCD_Caracter
		movlw 	'R'
		call	LCD_Caracter
		movlw 	'P'
		call	LCD_Caracter
		movlw 	'A'
		call	LCD_Caracter
		movlw 	'D'
		call	LCD_Caracter
		movlw 	'E'
		call	LCD_Caracter
		movlw 	'O'
		call	LCD_Caracter
		call	Retardo_500ms
		call	LCD_Linea2
		call	LCD_LineaEnBlanco
		call	Retardo_500ms
	movf	Habilita,0
	addwf	PCL,F
    goto 	VisualizaRB7
	goto	VisualizaRB6
	return

; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
	addwf	PCL,F
MensajeRB7
	DT "Hola funciono",0x00
MensajeRB6
	DT "Y parpadeo",0x00

	INCLUDE   <LCD_4BIT.INC>
	INCLUDE   <LCD_MENS.INC>
	INCLUDE   <RETARDOS.INC>
	END
 
Hay varios errores pero comenzaré con el mas notable, ya que RB6 y RB7 se usan como entradas para generar la interrupcion y luego como salidas para enviar datos al LCD. Donde haces el cambio? en las subrutinas de las librerias que incluyes? yo no veo siquiera la coincidencia entre los nombres de las subrutinas que llamas y las que aparecen en las librerias.

Trata de organizar mejor tus ideas en un diagrama de flujo, y tambien te recomiendo, si quieres aprender bien del tema que para empezar no uses esas librerias sino que trates de incluir en el codigo todo lo que necesites, osea escribe tu mismo todo, claro una vez que lo hayas entendido.
 
muchísimas gracias por tu respuesta, si era un error con el manejo de los goto, necesitaba usar call en vez de goto, la simulación no salio del todo bien, pero en físico quedo perfecto, solo que la linea que prende y apaga lo hace como en secuencia, no prenden y apagan todas las letras de la segunda linea al mismo tiempo, como que tienen un retraso en comparacion con la letra que sigue en prender, eso es muy raro, por que simulado sin interrupciones, lo hace como se supone que debería pasar, pero bueno, y con lo de que en donde se activaba el lcd como salida, en la sub rutina, si es tan algo laboriosas y todavía no las entiendo del todo, pero como dices lo ideal es que sea un código mio, poco a poco creo yo, como sea muchas gracias
 
Atrás
Arriba