Saludos, en respuesta a algunos compañeros del foro que han tenido algunos problemas en cuanto al direccionamiento de tablas extensas (más de 256 bytes), les aporto otra alternativa (creo ya se ha hablado de este método en el foro pero no hay una especie de tutorial.
Cuando recién empezamos con esto de los PICs y nos vemos en la necesidad de acceder a datos en tablas ya sea para mostrar texto en un LCD, tablas de búsqueda, conversiónes y un largo etc., solemos recurrir al método conocido como salto indexado; (AN556) y más de uno le dan dolores de cabeza por no saber porqué razón el PIC se la pasa brincoleando de aquí allá o se desparrama la pila y demás linduras semejantes.
Sin embargo, algunos PICs que tienen la posibilidad de leer su propia memoria FLASH nos brindan una muy buena alternativa a este problema.
Para explicarlo recurriré a la sección Reading the FLASH Program Memory de la hoja de datos del PIC16F8XX donde se explican los pasos a seguir para poder un dato en memoria FLASH. Procederé a traducirlo y redactarlo:
1-Escribir en los registros EEADRH:EEADR la dirección de memoria FLASH donde se quiere leer el dato
2-Poner a 1 el bit EEPGD del registro EECON1 para indicarle al PIC que se harán operaciones con su memoria FLASH
3-Poner a 1 el bit RD para iniciar operación de lectura de la memoria
4-Ejecutar dos operaciónes NOP para darle tiempo al micro de transferir el dato de FLASH a RAM
5-Finalmente, leer el dato de los registros EEDATH:EEDATA, aquí aclaro que en realidad lo que se lee es una palabra de 14 bits. Para la mayoría de las veces nos basta con obtener el byte bajo de la lectura
Esto se traduce al ensamblador en la siguiente rutina de lectura:
Como se puede observar, basta con tener el control de solo dos registros: FLPuntH:FLPuntL para accesar a los datos, con lo que se elimina cualquier problema de desbordamiento de pila por utilizar saltos indexados.
Ahora un ejemplo que suelo utilizar para el envío de datos a un LCD:
De esta forma nos dejamos de preocupar por la dirección de colocación de la tabla ya que las instrucción de actualización del puntero FLPunt corrigen cualquier posible salto de 256 bytes.
Y bueno, eso es todo, quizá a más de uno lo saque de apuros. En lo personal con esté método ya jamás he vuelto a utilizar el salto indexado. La desventaja es que la lectura de FLASH no está disponible en antiguas matrícula de PICs. ...
Cuando recién empezamos con esto de los PICs y nos vemos en la necesidad de acceder a datos en tablas ya sea para mostrar texto en un LCD, tablas de búsqueda, conversiónes y un largo etc., solemos recurrir al método conocido como salto indexado; (AN556) y más de uno le dan dolores de cabeza por no saber porqué razón el PIC se la pasa brincoleando de aquí allá o se desparrama la pila y demás linduras semejantes.
Sin embargo, algunos PICs que tienen la posibilidad de leer su propia memoria FLASH nos brindan una muy buena alternativa a este problema.
Para explicarlo recurriré a la sección Reading the FLASH Program Memory de la hoja de datos del PIC16F8XX donde se explican los pasos a seguir para poder un dato en memoria FLASH. Procederé a traducirlo y redactarlo:
1-Escribir en los registros EEADRH:EEADR la dirección de memoria FLASH donde se quiere leer el dato
2-Poner a 1 el bit EEPGD del registro EECON1 para indicarle al PIC que se harán operaciones con su memoria FLASH
3-Poner a 1 el bit RD para iniciar operación de lectura de la memoria
4-Ejecutar dos operaciónes NOP para darle tiempo al micro de transferir el dato de FLASH a RAM
5-Finalmente, leer el dato de los registros EEDATH:EEDATA, aquí aclaro que en realidad lo que se lee es una palabra de 14 bits. Para la mayoría de las veces nos basta con obtener el byte bajo de la lectura
Esto se traduce al ensamblador en la siguiente rutina de lectura:
Código:
Lee_FLASH ;Obtiene el byte direccionado por FLpuntL y FLPuntH y devuelve el resultado en W
movf FLPuntH,W ;Obtiene byte alto de la dirección de lectura
bsf STATUS,RP1 ;Acceso a banco 2 de RAM
movwf EEADRH^0x100 ;Carga dirección superior
bcf STATUS,RP1 ;Acceso a banco 0 de RAM
movf FLPuntL,W ;Obtiene byte bajo de la dirección de lectura
bsf STATUS,RP1 ;Acceso a banco 2 de RAM
movwf EEADR^0x100 ;Carga dirección inferior
bsf STATUS,RP0 ;Acceso al banco 3 de RAM
bsf STATUS,RP1
bsf EECON1^0x180,EEPGD ;Selecciona operaciónes en la memoria FLASH del MCU
bsf EECON1^0x180,RD ;Se efectua operación de lectura de la memoria
nop
nop ;Ciclos de espera
bcf STATUS,RP0 ;Acceso al banco 2 de RAM
movf EEDATA^0x100,W ;Obtiene byte leido
bcf STATUS,RP1 ;Acceso al banco 0 de RAM
return ;Devuelve el dato leído en W
Como se puede observar, basta con tener el control de solo dos registros: FLPuntH:FLPuntL para accesar a los datos, con lo que se elimina cualquier problema de desbordamiento de pila por utilizar saltos indexados.
Ahora un ejemplo que suelo utilizar para el envío de datos a un LCD:
Código:
***Se supone que el LCD ya ha sido configurado y el cursor está en la posición 0 (LCD de 2X16 caracteres)***
movlw LOW LCD_Txt
movwf FLPuntL ;Carga el byte bajo de la dirección de la tabla de caracteres
movlw HIGH LCD_Txt
movwf FLPuntH ;Carga el byte alto de la dirección de la tabla de caracteres
movlw .16
movwf Contador ;Se enviarán 16 caracteres al LCD
Lazo_Envio
call Lee_FLASH ;Se lee el dato de la tabla y devuelve el resultado en W
call LCD_Car ;El caracter leído (W) es enviado al LCD
incf FLPuntL,F ;Actualiza apuntador de 16 bits de memoria
btfsc STATUS,Z ;Si se desborda byte bajo del apuntador, incrementa byte alto
incf FLPuntH,F
decfsz Contador,F
goto Lazo_Envio ;El proceso se repite hasta enviar los 16 caracteres
.... ;Continua programa
LCD_Txt ;16 Caracteres a mostrar en la primera fila del LCD
DT " Mensaje prueba"
De esta forma nos dejamos de preocupar por la dirección de colocación de la tabla ya que las instrucción de actualización del puntero FLPunt corrigen cualquier posible salto de 256 bytes.
Y bueno, eso es todo, quizá a más de uno lo saque de apuros. En lo personal con esté método ya jamás he vuelto a utilizar el salto indexado. La desventaja es que la lectura de FLASH no está disponible en antiguas matrícula de PICs. ...
Última edición: