Hola.
Bueno, nada facil lo que pedis, pero acepto el desafío
.
Como podras saber, los PIC contienen paginas.No se que modelo de PIC estas usando. Supuse que es un 16F84A, aunque es facil migrar el codigo a otro modelo de PIC.
Aqui te muestro la estructura de las sub-páginas del 16F84A:
Sub-página: | Rango memoria: |
0 | 0x000-0x0FF |
1 | 0x100-0x1FF |
2 | 0x200-0x2FF |
3 | 0x300-0x3FF |
La subrutina "bucle" es ahora un gestor de mensajes. Es el que selecciona la tabla de la cual tomar los datos y hace el resto de las operaciones necesarias. El maximo numero de mensajes que puede llamar son 124 aprox.(no he sacado las cuentas, pero por ahi anda).
¿Como funciona? Pues basicamente he hecho una tabla que selecciona una de las tablas de los mensajes.
Como deseabas que el bucle se encargara de todo, lo que hice, fue multiplicar nro_mensaje por 2.
¿Para que?
Para que una vez que se haya llamado a la tabla correspondiente y vuelva, poder redireccionarla a la rutina de analisis: sale.
Entonces, aqui tienes una rutina que controla hasta 124 tablas de mensajes.
Con respecto a los limites y precauciones con las tablas de mensajes:
Debes asegurarte que ninguna tabla cruce dos sub-paginas. Las sub-paginas son porciones de memoria de programa y su tamaño es 256 words.
¿Que pasa si una tabla cruza dos sub-paginas?
El programa se desviara de su curso, y saltara a zonas erroneas, produciendo que el programa falle.
¿Cómo darse cuenta que una tabla esta cruzando dos sub-paginas?
Pues lo mas simple es usando la opcion "Disassembly Listing" del MPLAB. una vez ensamblado tu archivo en el MPLAB, te vas a esta opcion, y veras el codigo. A la izquierda mostrara la posicion de memoria en la cual se encuentra cada linea.
La primer imagen adjunta muestra una tabla de mensaje que cruza dos sub-paginas.
Fijate que es facil detectarla, ya que el 2XX pasa a valer 3XX. Esto significa que esta cruzando una sub-pagina.
¿Cómo lo solucionas?
Pues en la imagen, puedes ver que la tabla que cruza es la tabla46.Para evitarlo, reacomodas la tabla al inicio de la proxima sub-pagina. ¿Cómo? Agregando la directiva ORG 0x300 antes de declarar la tabla.Al hacerlo podras ver que una vez ensamblado nuevamente, y dirigiendote al Disassembly Listing, veras que la tabla ya no cruza mas dos sub-paginas. Mira la otra imagen y te daras cuenta.
He aquí un resumen de cómo quedaría organizada la memoria tal cual yo hice el programa:
Sub-página: | Rango memoria: |
0 | 0x000-0x0FF |
1 | 0x100-0x1FF | reservado para gestor de tablas |
2 | 0x200-0x2FF | las tablas aquí |
3 | 0x300-0x3FF | posibles futuras tablas aquí |
Las imágenes del "Disassembly Listing":
El código:
movlw .0 ;selecciona mensaje 0
call bucle
movlw .1 ;selecciona mensaje 1
call bucle
movlw .2 ;selecciona mensaje 2
call bucle
movlw .n ;selecciona mensaje "n"
call bucle
ORG 0x100
bucle
movwf nro_mensaje
clrf contador
mini_loop
PAGESELW $
movwf PCLATH
bcf STATUS,C
rlf nro_mensaje,0
addwf PCL,F
call tabla0
goto sale
call tabla1
goto sale
call tabla2
goto sale
call tablan
sale
btfsc contador,7 ;si el bit 7 es 0 continúa el bucle
return
incf contador,1
call caracter
goto mini_loop
ORG 0x200
tabla0
PAGESELW $
movwf PCLATH
movf contador,w
addwf PCL,1
DT "horario"
bsf contador,7 ;avisa el fin de la tabla
return
tabla1
PAGESELW $
movwf PCLATH
movf contador,w
addwf PCL,1
DT "entrada"
bsf contador,7
return
tabla2
PAGESELW $
movwf PCLATH
movf contador,w
addwf PCL,1
DT "adios"
bsf contador,7
return
tablan
PAGESELW $
movwf PCLATH
movf contador,w
addwf PCL,1
DT "TABLAN"
bsf contador,7
return
caracter
;W contiene el dato a enviar
;rutina envio dato al LCD aqui!
return
Adjunto el programa listo para simular con MPLAB SIM.
Saludos.