200 likes | 405 Views
Tablas de datos en ensamblador de microcontroladores PIC. Memoria. instrucciones. Carga inicial. Programa + Datos. datos. ejecución. Procesador. Modelo von Neumann. Datos Iniciales. En el modelo de von Neumann hay una única memoria
E N D
Memoria instrucciones Carga inicial Programa + Datos datos ejecución Procesador Modelo von Neumann Datos Iniciales 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
Memoria Programa Memoria Datos instrucciones Carga inicial ejecución datos Datos Iniciales Procesador Modelo Harvard 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.
Memoria Programa Memoria Datos instrucciones Carga inicial ejecución datos Datos Iniciales Procesador PIC’s movlw addlw retlw … Cualquier ensamblador ofrece instrucciones con parámetro inmediato. Los pic ofrecen además una instrucción especialmente orientada para construir tablas
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 retlw 30h … movlw 5 call CodigoAscii (w con valor 35h) 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.
PCL y PCLATH PCLATH PCL Org 0 Goto inicio (0000000000000) Org4 Inicio movlw 5h (0000000000100) Addwf PCL (0000000000101) Nop (0000000000110) Nop (0000000000111) Nop (0000000001000) Nop (0000000001001) Nop (0000000001010) Goto inicio (0000000001011) 0000 0000 0000 0001 00 000 0000 0001 Contador de programa PCL y PCLATH “representan” al contador de programa. El contador de programa siempre apunta a la SIGUIENTE instrucción a ejecutar
PCL y PCLATH PCLATH PCL Org 0 Goto inicio (0000000000000) Org4 Inicio movlw 5h (0000000000100) Addwf PCL (0000000000101) Nop (0000000000110) Nop (0000000000111) Nop (0000000001000) Nop (0000000001001) Nop (0000000001010) Goto inicio (0000000001011) 0000 0000 0000 0101 00 000 0000 0101 Contador de programa Al cambiar el contador de programa PCL se ve modificado. No así PCLATH
PCL y PCLATH PCLATH PCL Org 0 Goto inicio (0000000000000) Org4 Inicio movlw 5h (0000000000100) Addwf PCL (0000000000101) Nop (0000000000110) Nop (0000000000111) Nop (0000000001000) Nop (0000000001001) Nop (0000000001010) Goto inicio (0000000001011) 0000 0000 0000 0110 00 000 0000 0110 Contador de programa PCLATH debe ser modificado explícitamente por el programador
PCL y PCLATH PCLATH PCL Org 0 Goto inicio (0000000000000) Org4 Inicio movlw 5h (0000000000100) Addwf PCL (0000000000101) Nop (0000000000110) Nop (0000000000111) Nop (0000000001000) Nop (0000000001001) Nop (0000000001010) Goto inicio (0000000001011) 0000 0000 0000 1011 00 000 0000 0110 Contador de programa Cuando se modifica PCL, el contador de programa se carga con el contenido de PCL y PCLATH
PCL y PCLATH PCLATH PCL Org 0 Goto inicio (0000000000000) Org4 Inicio movlw 5h (0000000000100) Addwf PCL (0000000000101) Nop (0000000000110) Nop (0000000000111) Nop (0000000001000) Nop (0000000001001) Nop (0000000001010) Goto inicio (0000000001011) 0000 0000 0000 1011 00 000 0000 1011 Contador de programa Lo que equivale a un salto o goto
PCL y PCLATH PCLATH PCL Org 0 Goto inicio (0000000000000) Org4 Inicio movlw 5h (0000000000100) Addwf PCLATH (0000000000101) Nop (0000000000110) Nop (0000000000111) Nop (0000000001000) Nop (0000000001001) Nop (0000000001010) Goto inicio (0000000001011) 0000 0101 0000 0110 00 000 0000 0110 Contador de programa !!NO OCURRE LO MISMO¡¡ si se modifica el PCLATH
PCL y PCLATH PCLATH PCL Org 0 Goto inicio (0000000000000) Org4 Inicio movlw 5h (0000000000100) Addwf PCLATH (0000000000101) Addwf PCL (0000000000110) Nop (0000000000111) Nop (0000000001000) Nop (0000000001001) Nop (0000000001010) Goto inicio (0000000001011) 0000 0101 0000 0111 00 000 0000 0111 Contador de programa Modificar el PCLATH no afecta al control de ejecución si no viene seguido de una modificación del PCL.
PCL y PCLATH PCLATH PCL nop (0010100001001) nop (0010100001010) nop (0010100001011) nop (0010100001100) nop (0010100001101) nop (0010100001110) nop (0010100001111) 0000 0101 0000 1100 00 101 0000 1100 Contador de programa Al modificar PCL: PCLATH+PCL se cargan en el contador de programa
PCL PCLATH 0000 0000 0000 0001 0000 0010 0000 0011 0..255 0..255 0..255 0..255 Memoria de Programa PCL,PCLATH: Páginas 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.
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:
Tablas y páginas [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:
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:
Tablas y páginas: [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:
Tablas y páginas: [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:
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.