Buenas, estoy realizando el control de 4 matrices de LED's 8x8, controlando las letras que se elijen mediante el celular, con un módulo Bluetooth, programando todo en assembler, con el PIC16F88.
El único problema es el siguiente, hice una tabla para cada letra, pero en el momento en que me devuelve la letra con el RETLW, en vez de volver al CALL donde lo llamé, vuelve a una parte aleatoria del programa, descontrolando toda la interfaz.
Estuve leyendo y creo que puede ser un problema con las páginas de donde llamo a la subrutina, y que debería configurar el PCLATH, pero que esto solo es necesario si se encuentra en una página distinta a la 0. Por lo que tengo entendido, la pág. 0 termina en 0x800, si esto es cierto, mi programa se encuentra completamente en la página 0 y no sería necesario (por cierto, el programa funciona bien cuando hay pocas tablas, el problema solo ocurre cuando están todas las letras). También debo mencionarles que revisé el stack con el debugger del MPLab, guarda bien la direccion a donde debe retornar el programa, pero sin embargo, contradice al stack y se va a otro lugar. Este problema me tiene loco, hace mucho que estoy tratando de encontrar una solución, y probé de todo pero no encuentro nada que solucione mi problema, es para un trabajo de la secundaria, el profesor quiere que lo hagamos en lenguaje ensamblador y no en C...
En fin, les agradecería mucho si pueden "iluminarme" con respecto al funcionamiento del PCLATH y que otras consideraciones debo tener en cuenta al momento de hacer una tabla.
Sin más preámbulos, les adjunto mi código por si quieren chequearlo, el problema ocurre cuando la subrutina Elegir_letra llama a cualquiera de las letras, al llegar al RETLW, en vez de retornar, vuelve a cualquier parte del programa:
Programa completo:
LIST p=16F88
#INCLUDE <P16F88.INC>
ERRORLEVEL -302
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
CBLOCK 0x20
Register
Value
SendRegister
Temp
Contador
Letra
REG_CS
Temp1
ENDC
W_TEMP EQU 0x7D
STATUS_TEMP EQU 0x7E
PCLATH_TEMP EQU 0x7F
DATAEE ORG 0x2100
DE "MCHP"
RESET ORG 0x0000
PAGESEL START
GOTO START
ISR ORG 0x0004
MOVWF W_TEMP
MOVF STATUS,W
MOVWF STATUS_TEMP
MOVF PCLATH,W
MOVWF PCLATH_TEMP
BTFSC PIR1, RCIF
GOTO INT_REC
GOTO Salgo
INT_REC
Preguntar_por_Q
movlw .0
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_W
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_W
movlw .1
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_E
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_E
movlw .2
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_R
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_R
movlw .3
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_T
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_T
movlw .4
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_Y
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_Y
movlw .5
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_U
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_U
movlw .6
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_I
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_I
movlw .7
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_O
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_O
movlw .8
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_P
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_P
movlw .9
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_A
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_A
movlw .10
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_S
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_S
movlw .11
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_D
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_D
movlw .12
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_F
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_F
movlw .13
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_G
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_G
movlw .14
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_W
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_H
movlw .15
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_J
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_J
movlw .16
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_K
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_K
movlw .17
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_L
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_L
movlw .18
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_Z
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_Z
movlw .19
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_X
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_X
movlw .20
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_C
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_C
movlw .21
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_V
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_V
movlw .22
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_W
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_B
movlw .23
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_N
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_N
movlw .24
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_M
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_M
movlw .25
movwf Letra
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_ESP
call Cambiar_matriz
call Bucle_letra
goto Salgo
Preguntar_por_ESP
movlw .26
subwf RCREG,0
btfss STATUS,Z
goto Preguntar_por_MC
call Cambiar_matriz
call Clear
goto Salgo
Preguntar_por_MC
movlw .27
subwf RCREG,0
btfss STATUS,Z
goto Salgo
call Clear_all
goto Salgo
Salgo
bcf PIR1, RCIF
movf PCLATH_TEMP,W
movwf PCLATH
movf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie
START
movlw b'01100001'
BANKSEL OSCCON
movwf OSCCON
btfss OSCCON,IOFS
goto $-1
banksel PORTA
CLRF PORTA
banksel PORTB
CLRF PORTB
banksel ANSEL
movlw b'00000000'
movwf ANSEL
banksel TRISA
movlw b'00000000'
movwf TRISA
movlw b'00000000'
movwf TRISB
banksel OPTION_REG
movlw b'10000111'
movwf OPTION_REG
banksel INTCON
movlw b'11000000'
movwf INTCON
banksel PIR1
movlw b'00000000'
movwf PIR1
banksel PIE1
movlw b'00100000'
movwf PIE1
banksel PIR2
movlw b'00000000'
movwf PIR2
banksel PIE2
movlw b'00000000'
movwf PIE2
banksel PCON
movlw b'00000000'
movwf PCON
banksel ADCON0
movlw b'00000000'
movwf ADCON0
banksel ADCON1
movlw b'10000000'
movwf ADCON1
banksel PORTB
Setup
#define DIN PORTB,3
#define CLK PORTB,4
#define LOAD0 PORTA,0
#define LOAD1 PORTA,1
#define LOAD2 PORTA,2
#define LOAD3 PORTA,3
banksel TXSTA
bcf TXSTA, SYNC
bcf TXSTA, TX9
bcf TXSTA, TXEN
bcf TXSTA, BRGH
movlw .5
movwf SPBRG
banksel RCSTA
bsf RCSTA, SPEN
bcf RCSTA, RX9
bsf RCSTA, CREN
banksel PIE1
bsf PIE1, RCIE
bcf PIE1, TXIE
banksel PORTB
clrf REG_CS
movlw .4
movwf Contador
r0 clrw
call SetDecodeMode
movlw 0x0f
call SetIntensity
movlw 0x07
call SetScanLimit
call Display_ON
clrw
call SetDisplayTest
decfsz Contador,1
goto $+5
call Clear_all
movlw 0xFF
movwf REG_CS
goto Main
incf REG_CS,1
goto r0
Main
goto $
Cambiar_matriz
movlw .3
xorwf REG_CS,0
btfsc STATUS,Z
goto Main
incf REG_CS,1
return
;------------------------------------------------------------------------------------------------
; Enviar datos
;------------------------------------------------------------------------------------------------
Send
movf Register, 0
movwf SendRegister
call CS
movlw .16
Send_Loop
bcf DIN
btfsc SendRegister, 7
bsf DIN
rlf Value, 1
rlf SendRegister, 1
bsf CLK
nop
bcf CLK
addlw 0xff
btfss STATUS, Z
goto Send_Loop
call CS_END
return
CS
movlw .0
xorwf REG_CS,0
btfss STATUS,Z
goto $+3
bcf LOAD0
return
movlw .1
xorwf REG_CS,0
btfss STATUS,Z
goto $+3
bcf LOAD1
return
movlw .2
xorwf REG_CS,0
btfss STATUS,Z
goto $+3
bcf LOAD2
return
bcf LOAD3
return
CS_END
movlw .0
xorwf REG_CS,0
btfss STATUS,Z
goto $+3
bsf LOAD0
return
movlw .1
xorwf REG_CS,0
btfss STATUS,Z
goto $+3
bsf LOAD1
return
movlw .2
xorwf REG_CS,0
btfss STATUS,Z
goto $+3
bsf LOAD2
return
bsf LOAD3
return
;------------------------------------------------------------------------------------------------
; Configurar decode mode
;------------------------------------------------------------------------------------------------
SetDecodeMode
movwf Value
movlw 0x09
movwf Register
goto Send
;------------------------------------------------------------------------------------------------
; Configurar intensidad
;------------------------------------------------------------------------------------------------
SetIntensity
movwf Value
movlw 0x0a
movwf Register
goto Send
;------------------------------------------------------------------------------------------------
; Configurar columnas
;------------------------------------------------------------------------------------------------
SetScanLimit
movwf Value
movlw 0x0b
movwf Register
goto Send
;------------------------------------------------------------------------------------------------
; Configurar Shutdown
;------------------------------------------------------------------------------------------------
Display_ON
movlw 0x01
goto SetShutdown
Display_OFF
movlw 0x00
SetShutdown
movwf Value
movlw 0x0c
movwf Register
goto Send
;------------------------------------------------------------------------------------------------
; Configurar Test
;------------------------------------------------------------------------------------------------
SetDisplayTest
movwf Value
movlw 0x0f
movwf Register
goto Send
;------------------------------------------------------------------------------------------------
; Clarear
;------------------------------------------------------------------------------------------------
Clear_all
movlw .4
movwf Contador
clrf REG_CS
r1 call Clear
decfsz Contador,1
goto $+2
return
incf REG_CS,1
goto r1
Clear
movlw 0x00
movwf Temp
movlw 0x08
movwf Register
Bucle
movf Temp, w
movwf Value
call Send
decfsz Register, 1
goto Bucle
return
;------------------------------------------------------------------------------------------------
; Letras
;------------------------------------------------------------------------------------------------
Bucle_letra
movlw 0x01
movwf Register
r2 call Elegir_letra
movwf Value
call Send
incf Contador,1
incf Register,1
movlw 0x09
xorwf Register,0
btfss STATUS,Z
goto r2
clrf Contador
return
Elegir_letra
movlw .1
xorwf Letra,0
btfss STATUS,Z
goto $+3
call Q_
return
movlw .2
xorwf Letra,0
btfss STATUS,Z
goto $+3
call W_
return
movlw .3
xorwf Letra,0
btfss STATUS,Z
goto $+3
call E_
return
movlw .4
xorwf Letra,0
btfss STATUS,Z
goto $+3
call R_
return
movlw .5
xorwf Letra,0
btfss STATUS,Z
goto $+3
call T_
return
movlw .6
xorwf Letra,0
btfss STATUS,Z
goto $+3
call Y_
return
movlw .7
xorwf Letra,0
btfss STATUS,Z
goto $+3
call U_
return
movlw .8
xorwf Letra,0
btfss STATUS,Z
goto $+3
call I_
return
movlw .9
xorwf Letra,0
btfss STATUS,Z
goto $+3
call O_
return
movlw .10
xorwf Letra,0
btfss STATUS,Z
goto $+3
call P_
return
movlw .11
xorwf Letra,0
btfss STATUS,Z
goto $+3
call A_
return
movlw .12
xorwf Letra,0
btfss STATUS,Z
goto $+3
call S_
return
movlw .13
xorwf Letra,0
btfss STATUS,Z
goto $+3
call D_
return
movlw .14
xorwf Letra,0
btfss STATUS,Z
goto $+3
call F_
return
movlw .15
xorwf Letra,0
btfss STATUS,Z
goto $+3
call G_
return
movlw .16
xorwf Letra,0
btfss STATUS,Z
goto $+3
call H_
return
movlw .17
xorwf Letra,0
btfss STATUS,Z
goto $+3
call J_
return
movlw .18
xorwf Letra,0
btfss STATUS,Z
goto $+3
call K_
return
movlw .19
xorwf Letra,0
btfss STATUS,Z
goto $+3
call L_
return
movlw .20
xorwf Letra,0
btfss STATUS,Z
goto $+3
call Z_
return
movlw .21
xorwf Letra,0
btfss STATUS,Z
goto $+3
call X_
return
movlw .22
xorwf Letra,0
btfss STATUS,Z
goto $+3
call C_
return
movlw .23
xorwf Letra,0
btfss STATUS,Z
goto $+3
call V_
return
movlw .24
xorwf Letra,0
btfss STATUS,Z
goto $+3
call B_
return
movlw .25
xorwf Letra,0
btfss STATUS,Z
goto $+3
call N_
return
call M_
return
A_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'00111100'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01111110'
retlw b'01100110'
retlw b'01100110'
B_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01111100'
retlw b'01100110'
retlw b'01100110'
retlw b'01111100'
retlw b'01100110'
retlw b'01100110'
retlw b'01111100'
C_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'00111100'
retlw b'01100110'
retlw b'01100000'
retlw b'01100000'
retlw b'01100000'
retlw b'01100110'
retlw b'00111100'
D_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01111100'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01111100'
E_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01111110'
retlw b'01100000'
retlw b'01100000'
retlw b'01111100'
retlw b'01100000'
retlw b'01100000'
retlw b'01111110'
F_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01111110'
retlw b'01100000'
retlw b'01100000'
retlw b'01111100'
retlw b'01100000'
retlw b'01100000'
retlw b'01100000'
G_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'00111100'
retlw b'01100110'
retlw b'01100000'
retlw b'01100000'
retlw b'01101110'
retlw b'01100110'
retlw b'00111100'
H_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01100110'
retlw b'01100110'
retlw b'0110110'
retlw b'01111110'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
I_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'00111100'
retlw b'00011000'
retlw b'00011000'
retlw b'00011000'
retlw b'00011000'
retlw b'00011000'
retlw b'00111100'
J_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'00011110'
retlw b'00001100'
retlw b'00001100'
retlw b'00001100'
retlw b'01101100'
retlw b'01101100'
retlw b'00111000'
K_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01100110'
retlw b'01101100'
retlw b'01111000'
retlw b'01110000'
retlw b'01111000'
retlw b'01101100'
retlw b'01100110'
L_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01100000'
retlw b'0110000'
retlw b'01100000'
retlw b'01100000'
retlw b'01101000'
retlw b'01100000'
retlw b'01111110'
M_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01100011'
retlw b'01110111'
retlw b'01111111'
retlw b'01101011'
retlw b'01100011'
retlw b'01100011'
retlw b'01100011'
N_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01100011'
retlw b'01110011'
retlw b'01111011'
retlw b'01101111'
retlw b'01100111'
retlw b'01100011'
retlw b'01100011'
O_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'00111100'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'00111100'
P_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01111100'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01111100'
retlw b'01100000'
retlw b'01100000'
Q_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'00111100'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01101110'
retlw b'00111100'
retlw b'00000110'
R_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01111100'
retlw b'01100110'
retlw b'01100110'
retlw b'01111100'
retlw b'01111000'
retlw b'01101100'
retlw b'01100110'
S_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'00111100'
retlw b'01100110'
retlw b'01100000'
retlw b'00111100'
retlw b'00000110'
retlw b'01100110'
retlw b'00111100'
T_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01111110'
retlw b'01011010'
retlw b'00011000'
retlw b'00011000'
retlw b'00011000'
retlw b'00011000'
retlw b'00011000'
U_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'00111110'
V_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'00111100'
retlw b'00011000'
W_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01100011'
retlw b'01100011'
retlw b'01100011'
retlw b'01101011'
retlw b'01111111'
retlw b'01110111'
retlw b'01100011'
X_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01100011'
retlw b'01100011'
retlw b'00110110'
retlw b'00011100'
retlw b'00110110'
retlw b'01100011'
retlw b'01100011'
Y_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01100110'
retlw b'01100110'
retlw b'01100110'
retlw b'00111100'
retlw b'00011000'
retlw b'00011000'
retlw b'00011000'
Z_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01111110'
retlw b'00000110'
retlw b'00001100'
retlw b'00011000'
retlw b'00110000'
retlw b'01100000'
retlw b'01111110'
END