Hola Nocturno. Sabes que estuve viendo detenidamente la instrucción TBLRD para leer datos de la ROM
entre unos ejemplitos que escribí e investigando en la ayuda del CCS, llegué al siguiente resultado:
- una forma de guardar tablas en la ROM es usando
#rom direccion = {'datos'}
y la función para leerla es
READ_PROGRAM_MEMORY (direccion, dataptr, count );
dataptr es el arreglo donde se guardaran los datos y count la cantidad de bytes
aquí hay un ejemplo que hice
#include <18f4550.h> //archivo de cabecera
#use delay(clock=48000000) // el clock que tendremos a la entrada del CPU
#rom 0x600 = {"Me encanta que los planes salgan bien\0"}
void main(){
int i[39], t;
for(t=0;t<39;t++){
i[t]=0; // limpiamos el arreglo
}
delay_cycles(1);
read_program_memory(0x600,i,39);
// cargamos la direccion del puntero y guardamos la tabla en
// el arreglo i
delay_cycles(1);
}
una simulación en MPLAB:
ver imagen en el adjunto.
si miramos el listado en asm por un momento veremos
13: read_program_memory(0x600,i,39);
0056 6AF8 CLRF 0xff8, ACCESS ; TBLPTRU <- 0
0058 0E06 MOVLW 0x6
005A 6EF7 MOVWF 0xff7, ACCESS ; TBLPTRH <- 0x6
005C 6AF6 CLRF 0xff6, ACCESS ; TBLPTRL <- 0
ese pedacito de código está cargando a 0x600 en el el registro de 21 bits TBLPTR sospecho y casi que estoy seguro que hacen la lectura a través del Table Latch (TABLAT) para después tomar los datos a partir de esa dirección.
no se como se implementaría en tu programa, pero haz la prueba a ver si esto te sirve.
si hay que estar pendiente que la direccion esté desocupada (el inconveniente), pero se puede solucionar si asignas al resto del código un
#org start, end es cuestión de jugar con la cantidad de espacio que se lleve tu programa.