HOME

PRODUCTOS

PROYECTOS

TUTORIALES

VIDEOS

FREEWARE

PROGRAMAS

FUNCIONES C

EMPRESA

ENGLISH

                   

 Manejo de tablas de datos en microcontroladores con arquitectura Harvard, como el 16F84/F628/F88

 

 

TABLAS.jpg (14212 bytes)

 

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. Es decir que el registro W debe inicializarse, antes de la instrucción de “call”, con el desplazamiento (offset) deseado sobre la dirección de inicio de la tabla.  Dado que W es un registro de 8 bits, podemos accesar hasta 256 elementos en la tabla.

USO DEL REGISTRO ESPECIAL PCLATH PARA SELECCIONAR LA PAGINA

El 16F84 cuenta con 4 páginas de 256 localidades cada una en su memoria de código. El 16F628 cuenta con 8 páginas. El 16F88 con 16. Para el manejo de tablas, el número de página debe almacenarse en el registro PCLATH antes de accesar la tabla. Si este registro no se inicializa, por default el valor será 0.

NUMERO DE PAGINA DIRECCIONES DE MEMORIA
0 000-0FF
1 100-1FF
2 200-2FF
3 300-3FF

Durante la ejecución de  la instrucción addwf   PCL,f se modifica la parte baja PCL (8 bits) y también la alta PCH (2 bits en el 16F84, 3 bits en el 16F628 y 4 bits para el 16F88) del contador del programa, la cual se carga con el contenido de PCLATH. De esta forma podemos manejar tablas en toda la zona de la memoria de código de los microcontroladores mencionados.

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’                        ;regresa de la subrutina con el código ASCII de la “A” en W.

 

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:

tablaF88TINY.asm.

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:

fsrF88TINYasm.

Use el simulador de MPLAB y ejecútelo paso a paso.