Hola BrunoF. Soy nuevo en el foro y he mirado este post porque tengo un problema similar.
He probado lo que dices y no me ha funcionado, ademas he checado exactamente para
que sirve BANKSEL y si, efectivamente es para ajustar los valores del STATUS y
acceder a la memoria SRAM y no a la de programa...
tengo muchas tablas que aloje asi:
org 0x200
#include "Uchars.inc"
org 0x300
#include "Lchars.inc"
El contenido de los "inc" es algo parecido a esto
ChrA addwf PCL,F
dt b'01111110', b'10010001', b'10010001', b'10010001', b'11111110'
ChrB addwf PCL,F
dt b'01111111', b'11001001', b'11001001', b'11001001', b'10110110'
.
.
.
En si cada archivo contiene 27 tablas que me definen los valores del abecedario para
una matriz de Led de 7 x 5. Todas las tablas caben perfectamente entre cada pagina
de programa y no excede la frontera como dices...
Mi codigo que utiliza estas tablas lo tengo en las primeras 2 paginas de programa (00h-FF,100- 1FF)
Nota: Utilizo un pic 16F627A
Me di cuenta que al ensamblar me ponia mensajes de advertencia de que no generó codigo para
los BANKSEL y que ademas la locacion de RAM es incorrecta. El mensaje es el siguiente:
Warning[219] C:\16F627\MATRIX.ASM 46 : Invalid RAM location specified.
en la linea 46 tengo el BANKSEL.
Investigando encontre que para hacer lo mismo pero para bancos de memoria de programa y no de RAM
se utiliza PAGESEL o PAGESELW... Lo probe pero aun asi no se resulve el problema, ya que simulando
con el propio MPLAB se carga correctamente el PCLATH y recoge el valor de la tabla pero al retornar
me brinca instrucciones y se cuelga el programa con un loop infinito en la direccion 0000h.
Pongo el segmento de codigo que es una macro:
Llenar macro Buffer,Frames
local nextb
movlw PTR ;PTR = 20h
movwf FSR ;
nextb movf FSR,W ;
andlw 0Fh ;
BANKSEL Buffer ; AKI ESTA EL BANKSEL, TAMBIEN PROBE CON PAGESEL y no =(
call Buffer
movwf INDF
incf FSR
movlw PTR+5
subwf FSR,W
btfss STATUS,Z
goto nextb ; aki tambien se produce un problema,: PCLATH > 0 esto lleva a la dir 00h y se estanca
movlw Frames
call Barrer
endm
En si lo que deberia hacer la macro es Llenar desde 20h hasta 25h con los valores de la tabla (algo asi como un buffer de video)
Despues que ya esta listo el buffer la Subrutina "Barrer" hace un barrido a la matriz de leds con el Buffer que cargamos,
esto lo hace el numero de veces especificado en la constante "Frames" , esto si funciona ok =)...
No se que es lo que pasa ezactamente y no funciona, ahorita acabo de bajar una nota de aplicacion de Microchip
referente a esto (
http://ww1.microchip.com/downloads/en/AppNotes/00586b.pdf AN586 - Macros for Page and Bank Switching ) , pero aun asi espero de su ayuda...
Gracias de antemano