Autor Tema: Ayuda con Tablas en ASM - PIC16F88  (Leído 2517 veces)

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

Desconectado Alan Valdivia

  • PIC10
  • *
  • Mensajes: 4
Ayuda con Tablas en ASM - PIC16F88
« en: 16 de Agosto de 2017, 23:57:37 »
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:
Código: [Seleccionar]
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
« Última modificación: 17 de Agosto de 2017, 00:00:41 por Alan Valdivia »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con Tablas en ASM - PIC16F88
« Respuesta #1 en: 17 de Agosto de 2017, 09:06:54 »
Citar
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.

Como dijiste, el problema parece ser el PCLATH, en realidad el Contador de Programa o PC son 2 registros, el PCL que es de 8 bits ( 256 ) y la parte superior no es posible leerla, El  PCLATH se usa cuando hay que actualizar esa parte superior

El CALL y el GOTO no tienen demasiados problemas ya que estos pueden direccionar 11bits por si solos, tomando unicamente los bits 3 y 4 del PCLATH.
El RETURN por su parte toma los 13 bits del stack y los vuelve a poner en el PC, es decir no hay interaccion con el PCLATH.

El problema casi siempre esta en el ADDWF, aca actua sobre el PCL nomas y todos los bits del PCLATH son usados para la parte superior. Asi que si por ejemplo tenes una tabla de 10 entradas (ubicada en 0x1FD) y la primer entrada de la tabla esta en 0x1FF, vos por el momento no cambiase PCLATH ya que para el GOTO/CALL los 11 bits llegan para llamar al 0x1FD por lo tanto tu PCLATH sigue en 0. Al usar el ADDWF y sumar 2 el resultado del PCL toma 0x00 y encima el PCLATH estaba en 0, por lo tanto al hacer ese salto, lo hizo a la direccion 0x000 ( vector de reset )

Ahi tenes 2 problemas:

- PCLATH no seteado correctamente
- No revisar el correcto valor de que es posible pasarse de los 256 bytes ( 0xFF del PCL )

Soluciones:

- Setear el PCLATH antes de hacer el CALL a la tabla:

Código: ASM
  1. movlw HIGH(Tabla) ; carga el PCLATH con el valor alto del PCL donde se encuentra la etiqueta Tabla
  2.    movwf PCLATH ;
  3.    movf  offset,W ; cargo el offset de la tabla en W
  4.    call Tabla   ; llamo a la Tabla
  5.  
  6. ....
  7.  
  8. Tabla:
  9.     addwf ......

Esto lo vas a tener que realizar antes de cada CALL o luego de llamar a la tabla poner el PCLATH en 0, asi los CALL de tus programas y que no son las tablas que estan al ultimo no necesitas cargarle el PCLATH, ya que esto funcionaria perfecto si es que te mantenes entre 0x000 y 0x3FF ( 11bits )

- Actuar sobre el ADDWF correctamente. Revisar si hay un salto o no. Aca seteo todo y me aseguro de todo, PCLATH

Código: ASM
  1. movlw LOW(Tabla) ; Los 8 bits mas bajos
  2.    addwf offset,W ; hacer la suma para ver si se sobrepasa
  3.    movlw HIGH(Table) ; Obtengo la parte superior del PC
  4.    btfsc status,c ; Se paso de la pagina de 256bytes?
  5.    addlw 1 ; En caso de que si, aumento 1, sino lo dejo como esta
  6.    movwf PCLATH ; Y cargo el valor al PCLATH
  7.    movf offset,w ; Cargo el offset en W asi se usa en la tabla
  8.    call Tabla
  9.  
  10. .....
  11.  
  12. Tabla:
  13.   addwf PCL, W ; Salto

Un par de cosas, si observas pasamos el "offset" es decir la cantidad que debe saltar a través de W.
Ahora se hace primero el calculo de los 13 bits para ver cual es la direccion final, y luego se procede al salto.

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Ayuda con Tablas en ASM - PIC16F88
« Respuesta #2 en: 17 de Agosto de 2017, 10:48:57 »
Tuve un problema similar alguna vez.

Lo solucioné haciendo uso de la directiva ORG: Localicé la tabla en las primeras posiciones de memora disponibles(en tu caso, después de ORG 0x0004)y el resto del código en una nueva página.

Saludos!

Desconectado Alan Valdivia

  • PIC10
  • *
  • Mensajes: 4
Re:Ayuda con Tablas en ASM - PIC16F88
« Respuesta #3 en: 17 de Agosto de 2017, 12:55:50 »
¡Muchas gracias! Una vez configurado el PCLATH el programa funciona muy bien. Voy a tenerlo en cuenta al hacer tablas de ahora en adelante. Saludos!