HOME

PRODUCTOS

PROYECTOS

TUTORIALES

VIDEOS

FREEWARE

PROGRAMAS

FUNCIONES C

EMPRESA

ENGLISH

                   

 Manejo de tablas de datos en lenguaje ensamblador en el microcontrolador 18F2550 utilizando la instrucción retlw.

 

 

 

Descripción:

Es importante recordar que los microcontroladores PIC de las familias 16/ y 18/ , y en particular el microcontrolador 18F2550, poseen una arquitectura HARVARD, cuya particularidad consiste en operar la memoria de código (programa) y de datos a través de 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 canal (bus) de comunicación y, a través de instrucciones con direccionamiento indirecto, es posible accesar a los elementos de una tabla.

En el caso de la arquitectura Harvard, los datos de la la tabla deben almacenarse en la memoria de código 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 listado abajo. La tabla forma parte de una subrutina que en este ejemplo lleva la etiqueta "tabla".

 

MANEJO DE TABLAS DE DATOS EN EL 18F2550 CON LA INSTRUCCIÓN RETLW:

El 18F2550 cuenta con una instrucción especial para el manejo de tablas de datos almacenadas en la memoria de código (instrucción tblrd). Sin embargo, también es compatible con la instrucción retlw utilizada para el mismo fin por los microcontroladores Midrange de la familia 16/. 

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 6, 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.

EL DIRECCIONAMIENTO DE LA TABLA ES POR BYTES EN EL MICROCONTROLADOR 18F2550

Debe considerarse que en la familia 18/, el Program Counter –PC-, (a diferencia de la familia 16/), direcciona la memoria de código por bytes y no por palabras. Dado que cada palabra de la memoria de código está consituída por 2 bytes, el PC avanza 2 unidades para realizar el ciclo fetch de la siguiente instrucción. Al trabajar con tablas de datos con la instrucción retlw deberán entonces realizarse incrementos de PC+2 para direccionar correctamente a cada elemento consecutivo en la tabla (ver abajo el programa ejemplo).

Dado que el registro w contiene el offset que referencia al elemento deseado en la tabla, su valor deberá ser consistente con lo descrito en el párrafo de arriba, es decir, por ejemplo, si w=6, el elemento referenciado en la tabla es el w/2= 3.

Ahora, mediante la instrucción retlw (return from subroutine with literal in w), regresamos al programa principal. El registro w, contiene el dato que aparece a la derecha de la instrucción (alguno de los códigos ASCII de '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 128 elementos en la tabla.

USO DEL REGISTRO ESPECIAL PCLATH PARA SELECCIONAR LA PAGINA

En sus 32 Kbytes de memoria de código, el 18F2550 cuenta con 128 páginas de 256 localidades cada una. 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.

EJEMPLO DE NUMERO DE PAGINA DIRECCIONES DE MEMORIA
8 800-8FF
9 900-9FF
A A00-AFF
B B00-BFF

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 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 del microcontrolador 18F2550.

EJEMPLO DE CODIGO PARA PREPARAR EL ACCESO A LA TABLA:

               movlw         9                         ;en este ejemplo, la tabla se encuentra en la página 9.

               movwf         PCLATH           ;carga el número de página en PCLATH

                      movlw         6                         ;debe de inicializarse w con el número de elemento de la tabla. w debe ser par.

                                                                    ;el elemento referenciado es el w/2, en este ejemplo es el 3.

               call               tabla                   ;aquí se llama a la tabla para regresar con elemento deseado en w

               ..............                                ;en ésta línea regresa de la tabla con el dato en w.

               ..............

         

ORG 900H                                           ;DIRECCION DEL INICIO DE LA TABLA QUE SE ENCUENTRA EN PÁGINA 9.

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’                        ;éste es el elemento 0 de la tabla

               retlw         ‘O’

               retlw         ‘L’

               retlw         ‘A’                        ;éste es el elemento 3. Regresa de la subrutina con el código ASCII de la “A” en w.

  Vea aquí un ejemplo completo de un programa realizado para el sistema Bolt 18F2550:

 BOLT-MANEJO-DE-TABLAS-LEDS.asm