Ensamblador - Codigo con Interrupciones por RB0 y RB4-RB7 no funciona correctamente

   
Vista:

Codigo con Interrupciones por RB0 y RB4-RB7 no funciona correctamente

Publicado por William (2 intervenciones) el 14/03/2014 07:34:14
Buen dia. Tengo el siguiente problema.

El código que les presento no se comporta correctamente; no hay errores de sintaxis y eh analizado muy bien qué es lo que quiero, mas sin embargo al correrlo y luego de una interrupcion, matlab justo cuando me regresa al programa principal, el PC salta a una dirección que no eh usado ni la pienso usar (Line: 101C).

Como voy siguiendo los pasos del codigo con F7, continuo a ver que pasa, y simplemente baja hasta volver a la rutina de interrupción RUT_INT (Line: 10AA), cuando llega a ese RETURN, salta otra vez a GOTO INICIO y de alli se va a Line: 1009, en este punto, vuelve a RUT_INT y el cuento se repite.

Necesito hacer lo siguiente:

Para el siguiente circuito elabore un programa que funcione de la siguiente manera: Si se presiona el pulsador P1 encender en el display el número 0 (cero) y mantenerlo hasta tanto se libere el pulsador. De igual manera ocurre para el pulsador P2 mostrar el numero 4, P3 mostrar 5 y así sucesivamente. Mientras no se presiona ningún boton el display estará mostrando la letra P. Atender los pulsadores utilizando interrupciones.
La rutina de interrupciones debe estar a partir de la dirección 10AAh en la memoria de programa.




Aqui está el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
list p=16F877
 
#include <p16f877.inc>
 
		ORG 0X00
		GOTO INICIO
 
		ORG 0X04			;CUANDO HAY UNA INTERRUPCION, EL CONTADOR DE PROGRAMA VIENE ACÁ
		CALL RUT_INT		;SE QUIERE QUE ESCRIBAMOS LAS RUTINAS DE INTERRUPCION EN 10AAH
		BCF INTCON,INTF
		BCF INTCON,RBIF
		RETFIE
 
			ORG 0X10AA
		RUT_INT
		BTFSC INTCON,INTF	;INTERRUOPCIÓN POR RB0?
		CALL SUB_RUT_INT 	;SI
		BTFSC INTCON,RBIF	;NO, ENTONCES, INTERRUPCION POR RB4:RB7?
		CALL SUB_RUT_RB  	;SI
		RETURN			 	;NO
 
		SUB_RUT_INT
		MOVLW b'11000000'	;	NUMERO 0
		MOVWF PORTD
		RETURN
 
		SUB_RUT_RB
		BTFSC PORTB,RB4		;FUE RB4?
		CALL NUM_4
		BTFSC PORTB,RB5
		CALL NUM_5
		BTFSS PORTB,RB6
		CALL NUM_6
		BTFSS PORTB,RB7 	;FUE RB7?
		CALL NUM_7
		RETURN
 
		NUM_4
		MOVLW b'10011001'
		MOVWF PORTD
		RETURN
 
		NUM_5
		MOVLW b'10010010'
		MOVWF PORTD
		RETURN
 
		NUM_6
		MOVLW b'10000010'
		MOVWF PORTD
		RETURN
 
		NUM_7
		MOVLW b'11111000'
		MOVWF PORTD
		RETURN
;--------------------------------------------------------------------------
		ORG 0X09
		INICIO
		BANKSEL 0
		BSF INTCON,7		;PERMITO LAS INTERRUPCIONES A NIVEL GLOBAL
		BSF INTCON,4		;HABILITO LAS INTERRUPCIONES POR RB0/INT
		BSF INTCON,3		;HABILITO LAS INTERRUPCIONES POR CAMBIO DE NIVEL EN RB4:RB7
 
		BANKSEL OPTION_REG
		BCF OPTION_REG,7	;ACTIVO LAS RESISTENCIAS PULL-UP
		BSF OPTION_REG,6	;INTERRUPCION POR FLANCO ASCENDENTE
 
		BANKSEL TRISB
		MOVLW 0XF1
		MOVWF TRISB			;RB0 Y RB4:RB7 COMO ENTRADAS
		MOVLW 0X00
		MOVWF TRISD			;RD0:RD7 COMO SALIDAS
		BANKSEL 0
;--------------------------------------------------------------------------
		LETRA_P
		MOVLW b'10001100'
		MOVWF PORTD			;MUESTRA P EN EL DISPLAY
		CICLO
		BTFSC PORTB,RB0		;RB0=1?
		GOTO CICLO
		BTFSC PORTB,RB4		;RB4=1?
		GOTO CICLO
		BTFSC PORTB,RB5		;RB5=1?
		GOTO CICLO
		BTFSS PORTB,RB6		;RB6=0?
		GOTO CICLO
		BTFSS PORTB,RB7		;RB7=0?
		GOTO CICLO
		GOTO LETRA_P
		END

Asi estoy trabajando en MATLAB



Al cargar el archivo HEX en Proteus para el PIC16F877A me aparece estos Warnings:



TODO LO QUE EH INTENTADO ES MODIFICAR EL CÓDIGO YA QUE SOY NOVATO CON EL SOFTWARE
GRACIAS POR CUALQUIER AYUDA APORTADA
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Codigo con Interrupciones por RB0 y RB4-RB7 no funciona correctamente

Publicado por Pico (50 intervenciones) el 14/03/2014 09:07:47
El funcionmiento de una interrupción es igual que un call: se guarda el ip actual en la pila, y el iret de la rutina de interrupción lo recupera para volver al mismo punto. Si se va a un sitio que no se sabe de dónde sale es que has pateado la pila en la rutina de interrupción.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Codigo con Interrupciones por RB0 y RB4-RB7 no funciona correctamente

Publicado por William (2 intervenciones) el 19/03/2014 08:15:55
Pico, el regresa al Main gracias al retfie pero justo cuando va a continuar en lo que estaba haciendo se va a otro lugar. Gracias por mostrarte interesado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Codigo con Interrupciones por RB0 y RB4-RB7 no funciona correctamente

Publicado por Pico (50 intervenciones) el 19/03/2014 17:43:45
Un procesador sólo puede irse a dos sitios. O va donde marque el puntero de instrucción o va donde le mande una interrupción, que lo que hace una interrupción es guardar el valor del actual en la pila y ponerle en el puntero de instrucción el de la interrupción. El retfie lo que hace es poner en el puntero de instrucción lo que haya en la cima de la pila, y lo que tiene que haber es el valor que tuviera el puntero de instrucción en el momento de la interrupción. Si hay otra cosa porque has pateado la pila, se irá a cualquier sitio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Codigo con Interrupciones por RB0 y RB4-RB7 no funciona correctamente

Publicado por William (1 intervención) el 07/05/2014 10:31:26
Ya solucione el problema, todo radicaba en que codifique en la hoja 2 la rutina de interrupcion pero no le indicaba al PCLATH que hiciera el cambio, por lo que tenia que llegar "a pie" hasta la rutina de interrupcion pero luego no podia salir de la hoja 2 al programa principal. ordenandole al PIC hacer el cambio en el momento correcto, todo queda genial.
Gracias a los que se mostraron interesados.
PD: Como doy por solucionada esta cosulta?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar