Hola picto.
Bueno, pero 35 mensajes no te van a entrar en las 256 primeras posiciones de la FLASH. Probablemente ocupen mucho mas.
Cada MensajeXX deberia contener la instruccion addwf PCL,F. No solamente al principio.
Bueno, en realidad es bastante dificil ubicarte las tablas asi sin saber cuanto ocupa tu programa, el pic que estas usando,etc.
Podes escribir tantos mensajes como memoria FLASH tengas. Es la unica limitacion, seguida de un par mas de menor jerarquia.
El problema con estos PICs y las tablas es que cuando haces la llamada a una tabla, el valor del PCLATH no se setea. Por lo tanto, si no cargas manualmente el valor correcto en el registro PCLATH, cuando llamas a la tabla y se ejecuta el addwf PCL,F el PIC se redirecciona a la primera parte de la FLASH, produciendo lo que puede parecer un RESET(y no lo es).
Si estas usando un 16F87XX entonces tendras, por lo menos, 2KWord de FLASH.Esto es decir. 2048 instrucciones que puedes grabar en la memoria FLASH.
Ahora, la ley es simple. En tu caso tenes demasiadas tablas, lo que hace imposible que entren todas en las primeras 256 lineas de la FLASH.Entonces hay que recurrir a setear el valor correcto del registro PCLATH antes de llamar a cada tabla.
Otra cosa tener en cuenta es que una tabla no debe, para facilitar las cosas, NUNCA cruzar dos paginas.
Primero vamos a ubicar manualmente las tablas dentro de la FLASH para que no cruce ninguna dos paginas.
Con paginas me refiero a segmentos de 256 palabras de memoria flash, entonces en un 16F877A tendriamos esto:
primer pagina banco cero: 0x000 a 0x0FF
segunda pagina banco cero: 0x100 a 0x1FF
tercer pagina banco cero: 0x200 a 0x2FF
cuarta pagina banco cero: 0x300 a 0x3FF
y asi seguiria con los restantes 3 bancos del 16F877A...
Ahora, voy a suponer que tu codigo(sin contar las tablas de los mensajes) no llega mas alla de la posicion 0x1FF de la FLASH. Si llega a ocupar mas, vas a obtener probablemente una gran tanda de Advertencias del ensamblador diciendo que se han sobreescrito posiciones de la FLASH. Por ahora, supongamos que no sucedera.
Ubica las tablas asi:
Primero, indicamos con un vector, la posicion donde comenzaremos a ponerlas:
ORG 0x200 ;<- Estamos diciendole al ensamblador que lo que ponga debajo de esto se va a grabar a partir de la posicion 0x200 de la memoria FLASH del pic. Es decir, al inicio del tercer pagina del banco cero
;Inmediatamente debajo de eso, ubicaremos la mitad de los mensajes de la siguiente manera:
Mensajes
Mensaje0 addwf PCL,F
DT "XXXXXXX",0x00
Mensaje1 addwf PCL,F
DT "XXXXXXX",0x00
Mensaje2 addwf PCL,F
DT "XXXXXXX",0x00
;...y asi siguen
Mensaje15 addwf PCL,F
DT "XXXXXXX",0x00
Mensaje16 addwf PCL,F
DT "XXXXXXX",0x00
;luego, como precaucion, cambiaremos nuevamente de pagina para evitar que alguna tabla cruce desde la pagina 3 a la 4.
ORG 0x300 ;Indicando que todo lo que pongamos debajo de esto se grabra partiendo de la posicion 0x300 de la memoria FLASH.
Mensaje17 addwf PCL,F
DT "XXXXXXX",0x00
Mensaje18 addwf PCL,F
DT "XXXXXXX",0x00
Mensaje19 addwf PCL,F
DT "XXXXXXX",0x00
;...y asi siguen
Mensaje34 addwf PCL,F
DT "Activacion aut.",0x00
Mensaje35 addwf PCL,F
DT " salidas", 0x00
Finmensajes
Y ahora, en lugar de llamar a las tablas como venias seguramente haciendo, es decir asi:
Ejemplo:
movf RECORRE,W
call Mensaje16
Hacelo asi:
pageselw Mensaje16
movwf PCLATH
movf RECORRE,W
call Mensaje16
Asi cargamos manualmente el PCLATH antes de llamar a una tabla.
Espero estes un poquitin mas orientado.
Saludos.