[Aporte] Otra forma de manejar tablas en algunos PIC16F

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:

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:
Atrás
Arriba