Estimado Meta:
Es aquí donde debes usar el registro PCLATH, ya que la instrucción ADDWF PCL,F suma dos registros de un byte cada uno, por lo cual el resultado es de un byte y sólo puedes direccionar de entre 255 direcciones de una subpágina. Por tanto, si el registro PCLATH no selecciona la página correspondiente, el programa no funcionará correctamente.
Una manera de solucionarlo consiste en, antes de llamar a la tabla, sumar los valores del registro W y de la dirección (tabla + 1) (recordemos que al ejecutarse la instrucción ADDWF PCL,F el registro PCL está direccionando la siguiente instrucción). El byte alto del resultado lo cargamos en PCLATH y, posteriormente, llamamos la tabla como siempre. Ejemplo:
Supongamos que queremos tomar los 6 bits menos significativos de PORTA como entradas de la tabla, haríamos lo siguiente:
Es un poco tedioso, pero funciona. Lamentablemente, ese arreglo también lo tendrás que hacer en la librería LCD_MENS.INC y en todas las librerías que usen tablas. Una vez que hagas ese arreglo, puedes quitar la directiva IF Fin_Tabla...
Espero te sirva. Saludos.
Es aquí donde debes usar el registro PCLATH, ya que la instrucción ADDWF PCL,F suma dos registros de un byte cada uno, por lo cual el resultado es de un byte y sólo puedes direccionar de entre 255 direcciones de una subpágina. Por tanto, si el registro PCLATH no selecciona la página correspondiente, el programa no funcionará correctamente.
Una manera de solucionarlo consiste en, antes de llamar a la tabla, sumar los valores del registro W y de la dirección (tabla + 1) (recordemos que al ejecutarse la instrucción ADDWF PCL,F el registro PCL está direccionando la siguiente instrucción). El byte alto del resultado lo cargamos en PCLATH y, posteriormente, llamamos la tabla como siempre. Ejemplo:
Supongamos que queremos tomar los 6 bits menos significativos de PORTA como entradas de la tabla, haríamos lo siguiente:
Código (asm) [Seleccionar]
movf PORTA,W
andlw b'00111111'
addlw low(Tabla+.1) ; Suma el valor de desplazamiento con la dirección (Tabla + 1).
movlw high(Tabla+.1) ; Obtiene el byte alto de la dirección (Tabla + 1).
btfsc STATUS,C ; Si la suma de bytes bajos dió acarreo...
addlw .1 ; lo suma al byte alto de la dirección (Tabla + 1)
movwf PCLATH ; y lo carga en PCLATH para seleccionar la página correspondiente.
movf PORTA,W ; Ahora llama la tabla normalmente.
andlw b'00111111'
call Tabla
Es un poco tedioso, pero funciona. Lamentablemente, ese arreglo también lo tendrás que hacer en la librería LCD_MENS.INC y en todas las librerías que usen tablas. Una vez que hagas ese arreglo, puedes quitar la directiva IF Fin_Tabla...
Espero te sirva. Saludos.