La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Tablas de datos en ensamblador de microcontroladores PIC

Presentaciones similares


Presentación del tema: "Tablas de datos en ensamblador de microcontroladores PIC"— Transcripción de la presentación:

1 Tablas de datos en ensamblador de microcontroladores PIC

2 Modelo von Neumann Memoria ejecución Procesador
Programa + Datos instrucciones datos Carga inicial ejecución Datos Iniciales En el modelo de procesador basado en la arquitectura Hardvard la memoria de programa está separada de la memoria de datos. En cambio en el modelo que conocemos más de von Neumann hay una única memoria de donde el procesador extrae tanto datos como instrucciones. En el modelo de von Neumann hay una única memoria de donde el procesador extrae tanto datos como instrucciones. El programa se carga en la memoria junto con los datos iniciales

3 Modelo Harvard Programa Memoria Datos ejecución Procesador
instrucciones datos Carga inicial ejecución Programa Datos Iniciales Todo programa necesita un conjunto de datos iniciales para poder comenzar a operar. En el modelo de von Neuman esos datos pueden estar inicialmente en la memoria y el código del programa puede acceder a la zona de datos para obtenerlos. En el modelo de Harvard el programa depende estrictamente de las instrucciones con parámetro inmediato (en los pic las instrucciones que tienen una l en su especificación. movlw, addlw, etc) –También en el modelo von Neuman se incluyen siempre instrucciones de tipo inmediato para dar más versatilidad a la programción. En el modelo de procesador basado en la arquitectura Harvard la memoria de programa está separada de la memoria de datos. El programa se carga en la memoria de programa. Y los datos iniciales deben cargarse como valores inmediatos de las instrucciones.

4 PIC’s retlw Programa Memoria Datos movlw addlw … ejecución Procesador
instrucciones datos Carga inicial ejecución Programa Datos Iniciales movlw addlw retlw Una facilidad que proporcionan los procesadores pic para introducir listas de datos en el programa son las instrucciones retlw, especialmente orientadas para construir tablas. Cualquier ensamblador ofrece instrucciones con parámetro inmediato. Los pic ofrecen además una instrucción especialmente orientada para construir tablas

5 Tablas ; rutina CodigoAscii. Parámetro en w CodigoAscii: addwf PCL
retlw 30h retlw 31h retlw 32h retlw 33h retlw 34h retlw 35h retlw 36h retlw 37h retlw 38h movlw 5 call CodigoAscii (w con valor 35h) Una tabla de datos es una estructura organizada dentro del programa como una rutina a la que se invoca con un parámetro y al retorno de la rutina se obtiene un dato dependiente del parámetro. ; rutina CodigoAscii. Parámetro en w CodigoAscii: addwf PCL retlw 30h retlw 31h retlw 32h retlw 33h retlw 34h retlw 35h retlw 36h retlw 37h retlw 38h El uso de esta rutina sería el siguiente, Inicializo el registro w a un valor entre 0 y 9 y llamo a la rutina, al retorno de esta el w contiene la representación ascii del valor suministrado. movlw 5 call CodigoAscii (w con valor 35h) El modo de funcionamiento de la rutina es el siguiente. Al escribir un valor en el registro PCL este registro es volcado directamente en el contador de programa más concretamente es la parta inferior del contador de programa.(El contador de programa tiene 13 bits de los cuales sólo 8 están representados en PCL el resto están en otro registro llamado PCLATH). Como el contador de programa es el registro que apunta a la siguiente instrucción que se va a ejecutar, este acto equivale a un salto (algo parecido a un goto). El programa salta entonces a ejecutar una nueva instrucción. Veamos lo que pasa en nuesta rutina CódigoAsccii. 1º Invocamos la rutina con un 5 en el w. 2º Dentro de la rutina sumamos el contenido de w al contenido actual de PCL. (El contenido actual de PCL apunta a la instrucción siguiente a la addwf PCL,F, es decir a retlw 30h.) 3º Ahora el contador de programa apuntará a la instrucción retlw 35h. 4º Al ejecutarse la instrucción se retorna de la rutina CodigoAscii y w contiene el valor 35h. Esta es la forma simplificada de implementar una tabla de datos en un programa ensamblador de microcontroladores PIC. Una tabla viene a ser una estructura de datos programada que devuelve un valor u otro dependiendo del parámetro. Hace uso de PCL y de las instrucciones retlw.

6 PCL y PCLATH “representan” al contador de programa.
Org 0 Goto inicio ( ) Org4 Inicio movlw 5h ( ) Addwf PCL ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Goto inicio ( ) Contador de programa El contador de programa está respresentado por PCL y PCLATH. PCL es un registro de 8 bits y representa los bits de 0 a 7 del contador de programa. PCLATH es también un registro de 8 bits y representa los bits 8 a 12 del contador de programa (5 bits, el resto de bits de pclath son irrelevantes en el microcontrolador 16F84A). Cada vez que se modifica el contenido del registro PCL el registro del contador de programa queda modificado igualmente tanto con el valor de PCL como con el valor de PCLATH. Veámoslo gráficamente. PCL y PCLATH “representan” al contador de programa. El contador de programa siempre apunta a la SIGUIENTE instrucción a ejecutar

7 Al cambiar el contador de programa PCL se ve modificado. No así PCLATH
PCL y PCLATH PCLATH PCL Org 0 Goto inicio ( ) Org4 Inicio movlw 5h ( ) Addwf PCL ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Goto inicio ( ) Contador de programa Al cambiar el contador de programa PCL se ve modificado. No así PCLATH

8 PCLATH debe ser modificado explícitamente por el programador
PCL y PCLATH PCLATH PCL Org 0 Goto inicio ( ) Org4 Inicio movlw 5h ( ) Addwf PCL ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Goto inicio ( ) Contador de programa PCLATH debe ser modificado explícitamente por el programador

9 PCL y PCLATH PCLATH PCL 0000 0000 0000 1011 Contador de programa
Org 0 Goto inicio ( ) Org4 Inicio movlw 5h ( ) Addwf PCL ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Goto inicio ( ) Contador de programa Cuando se modifica PCL, el contador de programa se carga con el contenido de PCL y PCLATH

10 Lo que equivale a un salto o goto
PCL y PCLATH PCLATH PCL Org 0 Goto inicio ( ) Org4 Inicio movlw 5h ( ) Addwf PCL ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Goto inicio ( ) Contador de programa Lo que equivale a un salto o goto

11 !!NO OCURRE LO MISMO¡¡ si se modifica el PCLATH
PCL y PCLATH PCLATH PCL Org 0 Goto inicio ( ) Org4 Inicio movlw 5h ( ) Addwf PCLATH ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Goto inicio ( ) Contador de programa !!NO OCURRE LO MISMO¡¡ si se modifica el PCLATH

12 de una modificación del PCL.
PCL y PCLATH PCLATH PCL Org 0 Goto inicio ( ) Org4 Inicio movlw 5h ( ) Addwf PCLATH ( ) Addwf PCL ( ) Nop ( ) Nop ( ) Nop ( ) Nop ( ) Goto inicio ( ) Contador de programa Modificar el PCLATH no afecta al control de ejecución si no viene seguido de una modificación del PCL.

13 Al modificar PCL: PCLATH+PCL se cargan en el contador de programa
PCL y PCLATH PCLATH PCL nop ( ) nop ( ) nop ( ) nop ( ) nop ( ) nop ( ) nop ( ) Contador de programa Al modificar PCL: PCLATH+PCL se cargan en el contador de programa

14 PCL,PCLATH: Páginas PCL PCLATH 0000 0000
PCL 0..255 Memoria de Programa Dado este comportamiento de PCL-PCLATH. La memoria de programa puede considerarse dividida en páginas: En los 16F84 solo 10 de los 13 bits del contador de programa son útiles (sólo 1K de memoria de programa): 8 en PCL y 2 en PCLATH. Por lo tanto 4 páginas.

15 Tablas y páginas: problemas
[0005]:movlw 5 [0006]:call CodigoAscii [0007]:… (w con valor 35h) [0008]:… [000B]:… [000C]:… Pagina 0: ¡NO FUNCIONA COMO ESPERAMOS! ; rutina CodigoAscii. Parámetro en w CodigoAscii: [0105]: addwf PCL [0106]: retlw 30h [0107]: retlw 31h [0108]: retlw 32h [0109]: retlw 33h [010A]: retlw 34h [010B]: retlw 35h [010C]: retlw 36h [010D]: retlw 37h [010E]: retlw 38h [010F]: retlw 30h En este momento PCLATH==0. Al modificar PCL; PCLATH |PCL se cargan en el contador de Programa. Pagina 1:

16 Tablas y páginas Modificamos primer PCLATH=01. Pagina 0:
[0005]mvlw HIGH CodigoAscii [0006]movwf PCLATH [0007]:movlw 5 [0008]:call CodigoAscii [0009]:… (w con valor 35h) [ Modificamos primer PCLATH=01. Al modificar PCL; PCLATH |PCL se cargan en el contador de Programa. Pagina 0: ; rutina CodigoAscii. Parámetro en w CodigoAscii: [0105]: addwf PCL [0106]: retlw 30h [0107]: retlw 31h [0108]: retlw 32h [0109]: retlw 33h [010A]: retlw 34h [010B]: retlw 35h [010C]: retlw 36h [010D]: retlw 37h [010E]: retlw 38h [010F]: retlw 30h ¡SOLUCION! Pagina 1:

17 Tablas y páginas: Tabla entre dos páginas: otro problema
[0005]mvlw HIGH CodigoAscii [0006]movwf PCLATH [0007]:movlw 5 [0008]:call CodigoAscii [0009]:… (w con valor 35h) [ Pagina 0: ; rutina CodigoAscii. Parámetro en w CodigoAscii: [00FB]: addwf PCL [00FC]: retlw 30h [00FD]: retlw 31h [00FE]: retlw 32h [00FF]: retlw 33h [0100]: retlw 34h [0102]: retlw 35h [0103]: retlw 36h [0104]: retlw 37h [0105]: retlw 38h [0106]: retlw 30h Mientras PCL no se desborde, funciona como esperamos Pagina 1:

18 Tablas y páginas: Pagina 0: Pero si PCL desborda: PCL=0FFh ¡NO!
[0005]mvlw HIGH CodigoAscii [0006]movwf PCLATH [0007]:movlw 5 [0008]:call CodigoAscii [0009]:… (w con valor 35h) [ Pagina 0: ; rutina CodigoAscii. Parámetro en w CodigoAscii: [00FB]: addwf PCL [00FC]: retlw 30h [00FD]: retlw 31h [00FE]: retlw 32h [00FF]: retlw 33h [0100]: retlw 34h [0102]: retlw 35h [0103]: retlw 36h [0104]: retlw 37h [0105]: retlw 38h [0106]: retlw 30h Pero si PCL desborda: PCL=0FFh PCL+1=00 Como PCLATH permanece a 00, al cargarse PCLATH|PCL en el contador de programa, salta a la dirección 0 de la página 0 ¡NO! Pagina 1:

19 Tablas y páginas: ¡SOLUCION! Pagina 0:
[0005] [0006] [0007]:movlw 5 [0008]:call CodigoAscii [0009]:… (w con valor 35h) [ ¡SOLUCION! Pagina 0: ; rutina CodigoAscii. Parámetro en w CodigoAscii: [00F5] mvlw HIGH Salto [00F6] movwf PCLATH [00F7] addlw 3 [00F8]: addwf PCL,W [00F9]: btfsc STATUS,C [00FA]: incf PCLATH Salto: [00FB]: movwf PCL [00FC]: retlw 30h [00FD]: retlw 31h [00FE]: retlw 32h [00FF]: retlw 33h [0100]: retlw 34h [0102]: retlw 35h Realizar primer una SUMA FICTICIA (addwf PCL,W) y comprobar el carry. Si hay desbordamiento sumar 1 a PCLATH Pagina 1: Darse cuenta de que la suma ficticia de w a PCL se hace antes de donde verdaderamente se va a efectuar para que se produzca el salto, por lo que para obtener las mismas conclusiones que se van a obtener allí habría que sumarle previamente a w 3, pero luego en la posición real habría que restárselos Para afinar, habría que mover a pclath, no la parte alta de la dirección de la rutina sino la parte alta de la dirección de la instrucción que mueve el w a PCL.

20 Conclusión Las tablas son unas estructuras de datos muy útiles para cargar datos iniciales en el programa Algunos problemas pueden surgir si no localizamos adecuadamente la tabla en la memoria de programa Es necesario tener en cuenta tales problemas y resolverlos de manera que la funcionalidad de la tabla se vuelva independiente de la localización en la memoria de programa.


Descargar ppt "Tablas de datos en ensamblador de microcontroladores PIC"

Presentaciones similares


Anuncios Google