
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:
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
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


0