1 Tantas como kieras, los limites son impuestos por el tamaño de la memoria y las dimensiones de las tablas (y el codigo q las maneja)
2 Al igual q 1 tantos como kieras, sin embargo, existe una condicion q debes tomar en cuenta durante la creacion de estas tablas: las paginas de memoria Flash del PIC tienen un tamaño fijo, por lo q la tabla debe caber en una sola pagina (puede entrar en 2 pero deberas trabajar con el pclath porq la instruccion CALL no contiene la parte alta del PCLATH al ejecutarse, esto trae como consecuencia q la instruccion sea ejecutada sobre la pagina solamente (y no sobre la otra en caso de q tu tabla este en 2 paginas)
3, 4 y 6 Las tablas se les llama mediante una instruccion CALL <nombre de tabla>, es muy comun que al principio de la tabla exista un valor de direccion q establece q posicion de la tabla se kiere leer, este valor por lo general se guarda en el registro w:
Codigo:
;tabla 1
tablax addwf pc , 1 ;<- esto le indica a dond va a leer la tabla
retlw 0 ;valor 1
retlw 1 ;valor 2
retlw 2 ;valor 3
....
retlw n ;valor n
leer movlw 2
call tablax
retlw devuelve el valor q le sigue a la instruccion al registro w, como puedes ver, el argumento que indica q valor de la tabla se va a leer viene dado por movlw 2 (puedes usar movwf si el valor lo tienes en otro registro), y tb debes tomar en cuenta q el valor del argumento (en w) NO debe ser mayor q N (valor n), supongamos q pasas a w un valor n+1, el programa entonces al ejecutar la instruccion addwf pc, 1 hara que el pc apunte a leer (y no a un retlw como deberia ser) y el programa se kedara enclavado en un loop infinito.
5 Generalmente el PC es el unico registro involucrado en el uso de una tabla, sin embargo en caso de pasar el limite de 1 pagina deberas usar tb el registro PCLATH
Con respecto a la segunda pregunta, sólo puedes poner 256 valores por tabla, ya que el registro que vayas a sumar al pc es de 8 bits.
Otra cosa a tener en cuenta es el registro "pclath". No se puede comenzar una tabla de, por ejemplo 10 valores, en la dirección F7 de memoria. Un ejemplo:
Codigo:
f7 ca_bss addwf pcl,f
f8 retlw 0x96
f9 retlw 0x94
fa retlw 0x92
fb retlw 0x90
fc retlw 0x8e
fd retlw 0x8c
fe retlw 0x8a
ff retlw 0x88
100 retlw 0x86 ;A esta línea nunca se saltaría. Siempre se saltaría a la dirección "f0"
101 retlw 0x84
En este caso lo mejor es colocar la tabla a partir de la dirección de memoria 0x100:
Codigo:
org 0x100
100 ca_bss movwf temp0
101 movlw 0x01
102 movwf pclath
103 movf temp0,w
104 addwf pcl,f
105 retlw 0x96
106 retlw 0x94
107 retlw 0x92
108 retlw 0x90
109 retlw 0x8e
10a retlw 0x8c
10b retlw 0x8a
10c retlw 0x88
10d retlw 0x86
10e retlw 0x84
Así es como hago yo las tablas y no he tenido nunca ningún problema. Siempre coloco las tablas al principio del programa para que si modifico algo, no se vean afectados los valores que hay que cargar en el pclath