|
Descripción: Es importante recordar que los microcontroladores 16F84/F628/F88 operan con una arquitectura HARVARD, cuya particularidad consiste en poseer una memoria de datos y de código (programa) con buses o canales de comunicación separados. Lo anterior hace que el manejo de tablas de datos sea distinto al de procesadores con arquitectura VON NEUMANN, en donde la memoria de código y datos es compartida por el mismo bus de datos y, a través de instrucciones con direccionamiento indirecto, es posible accesar a los elementos de la tabla. En el
caso de la arquitectura Harvard, los datos de la la tabla deben almacenarse en la memoria
de código (programa) y por tanto son parte del programa ejecutable. La instrucción RETLW
incluída en el set de instrucciones de todos los microcontroladores de Microchip, está
precisamente diseñada para almacenar datos en la memoria de código. La forma de manejar
tablas de datos es como se indica en el EJEMPLO 1 listado abajo. La tabla forma parte de
una subrutina que en este ejemplo lleva la etiqueta "tabla". |
Supongamos que deseamos crear una tabla de 4 elementos. Y que
estos 4 datos son los caracteres ASCII de las letras H,O,L y A. Para recuperar algún
elemento de la tabla, dentro del programa principal existirá una instrucción de
call que llama a la etiqueta que está al inicio de la tabla, como se muestra
en el listado de abajo.
Una vez que el el contador del programa
queda posicionado al inicio de la tabla, usamos la instrucción addwf PCL,f
para sumar a la parte baja del contador del programa, PCL, un número del 0 al 3, que debe
de estar almacenado en el registro W desde antes de la ejecución de la instrucción
call. Como consecuencia de la ejecución de esta misma instrucción (addwf
PCL,f), la parte alta del contador del programa PCH, se carga con el contenido del
registro PCLATH, según se describe con detalle más abajo, de tal forma que, al final de
la ejecución de la instrucción, el contador del programa queda posicionado apuntando al
elemento deseado de la tabla.
Ahora,
mediante la instrucción RETLW (return from subroutine with literal in w),
regresamos al programa principal. Ahora el registro W, contiene el dato que aparece a la
derecha de la instrucción (alguno de los códigos ASCII de la H,O,L ó A), y los cuales
forman parte de la tabla.
|
NUMERO DE PAGINA | DIRECCIONES DE MEMORIA |
0 | 000-0FF |
1 | 100-1FF |
2 | 200-2FF |
3 | 300-3FF |
EJEMPLO
movlw 1
;en este ejemplo, la tabla se encuentra en la página 1.
movwf
PCLATH
;carga el número de página en PCLATH
movlw 3
;en esta zona del programa, debe de inicializarse W con el offset.
call tabla
..............
;en ésta línea regresa la subrutina con el dato del elemento de la tabla en W.
..............
ORG 100H ;DIRECCION DEL INICIO DE LA TABLA QUE SE ENCUENTRA EN PÁGINA 1.
tabla:
addwf PCL,f ;ésta instrucción suma a PCL el contenido de W, y carga PCLATH en la parte
;alta del contador del programa.
retlw H ;este es el elemento 0 de la tabla
retlw
O
retlw
L
retlw
A
EJEMPLO DE USO DE TABLAS
Finalmente se ofrece un ejemplo de manejo de tablas y arreglos de datos: en este archivo se muestra un programa de ejemplo que accesa y transfiere a RAM los elementos de una tabla de 16 datos en la página 0 de la memoria de código:
Se recomienda ejecutar el programa desde MPLAB, usando el simulador para observar paso a paso la transferencia del contenido de la tabla a la memoria de datos. Siga las instrucciones que se dan en el propio programa fuente.
EJEMPLO DE USO DEL REGISTRO FSR
En este otro ejemplo se muestra el uso del registro FSR para direccionamiento indirecto dentro un arreglo en la memoria de datos:
Use el simulador de MPLAB y ejecútelo paso a paso.