Documentos de Académico
Documentos de Profesional
Documentos de Cultura
EJERCICIO PARA LLENAR LOCALIDADES DE LA SRAM, MEDIANTE TABLAS QUE SE CREAN EN LA MEMORIA DEL PROGRAMA
ENUNCIADO: Desarrollar un programa que permita llenar las primeras localidades de la SRAM con los cdigos ASCII correspondiente a las letras del siguiente texto: ESCUELA POLITECNICA NACIONAL
PRIMERA SOLUCIN
Esta solucin implica que el programa genere los cdigos ASCII del texto, mediante el direccionamiento inmediato y luego almacene en la SRAM mediante direccionamiento indirecto con post incremento. Para implementar el programa, el Puntero X (registros R26 y R27) es inicializado con la primera direccin de la SRAM, a la que se la etiqueta como DATOS. Y el registro R16 se lo utiliza para generar los cdigos, al que se lo etiqueta como AUX. .NOLIST .INCLUDE m164pdef.inc .LIST ; .EQU NCOD = 28 .DEF AUX = R16 ; .DSEG DATOS: .BYTE ; .CSEG LDI LDI LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST
NCOD XL,LOW(DATOS) XH,HIGH(DATOS) AUX,'E' X+,AUX AUX,'S' X+,AUX AUX,'C' X+,AUX AUX,'U' X+,AUX AUX,'E' X+,AUX AUX,'L' X+,AUX AUX,'A' X+,AUX AUX,' ' X+,AUX AUX,'P' X+,AUX AUX,'O' X+,AUX AUX,'L' X+,AUX AUX,'I' X+,AUX AUX,'T' X+,AUX AUX,'E' X+,AUX
LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST LDI ST ; FIN: ; .EXIT RJMP
AUX,'C' X+,AUX AUX,'N' X+,AUX AUX,'I' X+,AUX AUX,'C' X+,AUX AUX,'A' X+,AUX AUX,' ' X+,AUX AUX,'N' X+,AUX AUX,'A' X+,AUX AUX,'C' X+,AUX AUX,'I' X+,AUX AUX,'O' X+,AUX AUX,'N' X+,AUX AUX,'A' X+,AUX AUX,'L' X+,AUX FIN
SEGUNDA SOLUCIN
Como se puede apreciar la primera solucin no es una solucin eficiente. Lo que lleva al desarrollo de la segunda solucin, que consiste en un lazo de repeticin donde el programa no es el que genera los cdigos, sino que los lee desde la memoria del programa y los almacena en la SRAM. Al implementar el algoritmo de esta solucin, se utiliza al Puntero X para almacenar los cdigos en la SRAM y al Puntero Z (registros R30 y R31) para leerlos desde la memoria del programa. La inicializacin de este ltimo puntero debe considerar que los contenidos de la memoria del programa son de 16 bits, es decir que contienen dos cdigos en cada localidad, uno en el byte par y otro en el bytes impar. El registro R16 se lo utiliza para la transferencia del cdigo ASCII de la memoria del programa hacia la SRAM y R17 es el contador para controlar el lazo de repeticin; es por eso, que se los etiqueta como AUX y CONTADOR.
Byte Impar
Byte Par
La tabla de cdigos ASCII se crea en la memoria del programa utilizando en el Mdulo Fuente la Directiva .DB que Define Bytes Constantes que ocupan localidades de la
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
FLASH o de la EEPROM. Adems, a la primera lnea de estas directivas se la etiqueta para que el Assembler la utilice como la direccin de inicio de la tabla cuando inicialice el Puntero Z. .NOLIST .INCLUDE m164pdef.inc .LIST ; .EQU NCOD = 28 .DEF AUX = R16 .DEF CONTADOR = R17 ; .DSEG DATOS: .BYTE NCOD ; .CSEG LDI XL,LOW(DATOS) LDI XH,HIGH(DATOS) LDI ZL,LOW(TABLA<<1) LDI ZH,HIGH(TABLA<<1) LDI CONTADOR,NCOD LAZO: LPM AUX,Z+ ST X+,AUX DEC CONTADOR BRNE LAZO ; FIN: RJMP FIN ; .ORG $50 TABLA: .DB 0x45 .DB 0x53 .DB 0x43 .DB 0x55 .DB 0x45 .DB 0x4C .DB 0x41 .DB 0x20 .DB 0x51 .DB 0x4F .DB 0x4C .DB 0x49 .DB 0x54 .DB 0x45 .DB 0x43 .DB 0x4E .DB 0x49 .DB 0x43 .DB 0x41 .DB 0x20 .DB 0x4E .DB 0x41
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
Para inicializar el Puntero Z se utilizan las instrucciones: LDI LDI ZL,LOW(TABLA<<1) ZH,HIGH(TABLA<<1)
Donde los smbolos <<1, corresponde al operador de desplazamiento binario de una posicin, hacia la izquierda. Esta forma de iniciar al Puntero Z se justifica por lo siguiente: Las instrucciones para leer desde la memoria del programa son LPM (Load Program Memory), en las que la direccin del operando de origen en forma explcita o implcita es el contenido del Puntero Z. Los contenidos de la memoria de programa son de una palabra, 16 bits o 2 bytes, el byte par y el impar; es decir que, para leer se necesita ejecutar 2 instrucciones LPM. El Puntero Z contiene la direccin de la localidad de la FLASH y un indicador para establecer si la lectura es del byte par (0) o del byte impar (1). El indicador del byte que se lee, es el bit menos significativo del Puntero Z. La primera lectura dentro del lazo de repeticin corresponde al byte par de localidad inicial de la tabla.
Por lo tanto, el valor del Puntero Z (ZH y ZL) antes de ingresar en el lazo de repeticin es igual al valor de la etiqueta TABLA desplazado una posicin a la izquierda. Tambin se suele utilizar las siguientes instrucciones con el operador de multiplicacin, que tienen el mismo efecto anterior: LDI LDI ZL,LOW(TABLA*2) ZH,HIGH(TABLA*2)
Para el presente ejemplo, con el valor de la etiqueta TABLA igual a $0050, el valor inicial del Puntero Z ser $00A0. $0050 = 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 Un desplazamiento a la izquierda. $00A0 = 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
Direccin de la FLASH
Finalmente, el resultado del ensamblado no tiene errores, por lo que si se crea el Mdulo Objeto; pero existen 28 mensajes de advertencia (WARNING) en las 28 lneas DB que crean la tabla de datos en la FLASH y que pueden influenciar en el mal funcionamiento del programa. Precisamente ese es el caso, el programa no cumple lo solicitado. VENTANA DE LA MEMORIA DESPUS DE LA EJECUCIN DE LA SEGUNDA SOLUCIN QUE NO CUMPLE CON LO SOLICITADO
28 Localidades llenas
No es lo solicitado
Esto significa que con la Directiva DB al crear el byte de la constante lo rellena con un byte de ceros, para no perder el alineamiento de palabras que tiene la memoria de programa. Es decir, que no solo se han creado los 28 bytes de los cdigos ASCII sino 28 palabras con los cdigos ASCII acompaados de un byte de ceros; tal como se observa en la ventana de la memoria del programa del simulador.
Tabla de 28 palabras
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
Para solucionar este inconveniente, es necesario incluir dentro del lazo de repeticin, un incremento adicional del Puntero Z mediante la ejecucin de la lectura del byte impar que no se almacena, como se indica a continuacin: Lectura del byte par LAZO: LPM AUX,Z+ ST X+,AUX LPM AUX,Z+ Lectura del byte impar DEC CONTADOR BRNE LAZO
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
TERCERA SOLUCIN
Para no desperdiciar espacios de memoria de programa al crear tablas, se utiliza la Directiva .DW que Define Word o Palabras Constantes que ocupan localidades de la Memoria del Programa o de la EEPROM, quedando la codificacin de la siguiente forma: .NOLIST .INCLUDE m164pdef.inc .LIST ; .EQU NCOD = 28 .DEF AUX = R16 .DEF CONTADOR = R17 ; .DSEG DATOS: .BYTE NCOD ; .CSEG LDI XL,LOW(DATOS) LDI XH,HIGH(DATOS) LDI ZL,LOW(TABLA<<1) LDI ZH,HIGH(TABLA<<1) LDI CONTADOR,NCOD LAZO: LPM AUX,Z+ ST X+,AUX DEC CONTADOR BRNE LAZO ; FIN: RJMP FIN ; .ORG $50 TABLA: .DW 0x4553 .DW 0x4355 .DW 0x454C .DW 0x4120 .DW 0x514F .DW 0x4C49 .DW 0x5445 .DW 0x434E .DW 0x4943 .DW 0x4120 .DW 0x4E41 .DW 0x4349 .DW 0x4F4E .DW 0x414C ; .EXIT ; FIN DEL MODULO FUENTE El ensamblado de este Mdulo Fuente no tiene mensajes de advertencia ni de errores, pero no resuelve el problema. Porque en el lazo de repeticin se lee primero el byte par
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
y luego el impar; es decir primero se lee el cdigo ASCII de la S y luego el de la E y as sucesivamente. VENTANA DE LA MEMORIA DESPUS DE LA EJECUCIN DE LA TERCERA SOLUCIN QUE NO CUMPLE CON LO SOLICITADO
La solucin ser intercambiar los bytes en las palabras, como se muestra a continuacin: TABLA: .DW .DW .DW .DW .DW .DW .DW .DW .DW .DW .DW .DW .DW .DW 0x5345 0x5543 0x4C45 0x2041 0x4F51 0x494C 0x4554 0x4E43 0x4349 0x2041 0x414E 0x4943 0x4E4F 0x4C41
Tambin se puede crear la tabla con menos lneas de cdigo, separando las constantes por comas. TABLA: .DW .DW .DW 0x5345, 0x5543, 0x4C45, 0x2041 0x4F51, 0x494C, 0x4554, 0x4E43, 0x4349, 0x2041 0x414E, 0x4943, 0x4E4F, 0x4C41
Regresando a la segunda solucin, la creacin de la tabla se puede apreciar en forma ms explcita si se usa los mismos smbolos ASCII entre comillas. TABLA: .DB .DB .DB .DB .DB .DB .DB E S C U E L A
.DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB .DB
P O L I T E C N I C A N A C I O N A L
Pero, se mantienen los mensajes de advertencia ya analizados. Tambin se puede disminuir el nmero de lneas para crear la tabla, donde se mantienen los mensajes de advertencia en las dos primeras de esas lneas y se elimina en la ltima. Esto se debe, a que la ltima tiene un nmero par de constantes y las otras no. TABLA: .DB .DB .DB
E, S, C, U, E, L, A , P, O, L, I, T, E, C, N, I, C, A, N, A, C, I, O, N, A, L
00000a 5345 00000b 5543 00000c 4c45 C:\Users\JVelarde\Documents\ATmega\AVRStudio\Tablas\Tabla07\Tabla07.as m(25): warning: .cseg .db misalignment - padding zero byte 00000d 0041 TABLA: .DB "E","S","C","U","E","L","A" 00000e 5020 00000f 4c4f 000010 5449 000011 4345 000012 494e 000013 4143 C:\Users\JVelarde\Documents\ATmega\AVRStudio\Tablas\Tabla07\Tabla07.as m(26): warning: .cseg .db misalignment - padding zero byte 000014 0020 .DB " ","P","O","L","I","T","E","C","N","I","C","A"," " 000015 414e 000016 4943 000017 4e4f 000018 4c41 .DB "N","A","C","I","O","N","A","L"
Por eso, se debe tener cuidado de crear tablas de bytes en un nmero par de constantes, para evitar que se rellenen con bytes de ceros debido al alineamiento.
TABLA:
E, S, C, U, E, L, A, P, O, L, I, T, E, C, N, I, C, A, N, A, C, I, O, N, A, L
Tambin se puede agrupar los caracteres dentro de las comillas y mejorar la presentacin. TABLA: .DB .DB .DB ESCUELA POLITECNICA NACIONAL
00000a 00000b 00000c 00000d 00000e 00000f 000010 000011 000012 000013 000014 000015 000016 000017
5345 5543 4c45 2041 4f50 494c 4554 4e43 4349 2041 414e 4943 4e4f 4c41
TABLA: .DB
"ESCUELA "
.DB
"POLITECNICA "
.DB
"NACIONAL"
Por ltimo, para este caso se puede tener una solo lnea con la que se crea toda la tabla. TABLA:
00000a 00000b 00000c 00000d 00000e 00000f 000010 000011 000012 000013 000014 000015 000016 000017 5345 5543 4c45 2041 4f50 494c 4554 4e43 4349 2041 414e 4943 4e4f 4c41
.DB
TABLA: .DB
nicamente cambiando la lnea que contiene el texto en comillas y el valor inicial del contador, este mdulo fuente sirve para llenar las primeras localidades de la SRAM con los cdigos ASCII del texto: FACULTAD DE INGENIERIA ELECTRICA Y ELECTRONICAS .NOLIST .INCLUDE m164pdef.inc .LIST ; .EQU NCOD = 47 .DEF AUX = R16
CONTADOR = R17 .BYTE LDI LDI LDI LDI LDI LPM ST DEC BRNE RJMP .DB NCOD XL,LOW(DATOS) XH,HIGH(DATOS) ZL,LOW(TABLA<<1) ZH,HIGH(TABLA<<1) CONTADOR,NCOD AUX,Z+ X+,AUX CONTADOR LAZO FIN
FACULTAD DE INGENIERIA ELECTRICA Y ELECTRONICAS,0
LAZO:
; FIN: ; TABLA:
VENTANA DE LA MEMORIA DESPUS DE LA EJECUCIN DE LA SEGUNDA SOLUCIN, CON LA MODIFICACIN DEL TEXTO Y DEL CONTADOR
MDULO
FUENTE
DE
LA
Con esta modificacin se consigue que el ensamblador se encargue de obtener el nmero de caracteres que conforman el texto. Esto se realiza mediante con una etiqueta que determine donde termina la tabla, a la que se le resta la etiqueta del inicio para conocer cuantas localidades del programa ocupa la tabla. Este resultado multiplicado por dos ser el nmero de caracteres, que es el valor inicial del contador para control del lazo de repeticin. .NOLIST .INCLUDE m164pdef.inc .LIST ;
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
NCOD = (FINTBL TABLA) * 2 AUX = R16 CONTADOR = R17 .BYTE LDI LDI LDI LDI LDI LPM ST DEC BRNE RJMP .DB NCOD Clculo del valor inicial del contador
LAZO:
XL,LOW(DATOS) XH,HIGH(DATOS) ZL,LOW(TABLA<<1) ZH,HIGH(TABLA<<1) CONTADOR,NCOD AUX,Z+ X+,AUX CONTADOR LAZO FIN
ESTE CURSO ES EL MAS CHEVERE DE TODAS LAS CARRERAS
El ensamblador emite un solo mensaje de advertencia, que no afecta al funcionamiento del programa; porque nicamente indica que la etiqueta FINTBL utilizada para calcular el nmero de caracteres no est definida o est referida ms adelante. VENTANA DE LA MEMORIA DESPUS DE LA EJECUCIN DE LA SEGUNDA SOLUCIN, CON LA MODIFICACIN DEL TEXTO Y LA INCLUSIN DEL CLCULO DEL CONTADOR
CUARTA SOLUCIN
La modificacin anterior necesita que la tabla de datos sea de un nmero par de bytes. En caso de que el texto este conformado de un nmero impar de caracteres, se puede utilizar esta nueva solucin que no se realiza a base a un lazo de repeticin controlado por un contador; sino, a base a un lazo de repeticin que termina cuando se identifica un
carcter especial que se ubica al final del texto. El carcter especial escogido para este ejemplo es el smbolo $. .NOLIST .INCLUDE m164pdef.inc .LIST ; .DEF AUX = R16 ; .DSEG DATOS: .BYTE ; .CSEG LDI LDI LDI LDI LAZO: LPM CPI BREQ ST RJMP ; FIN: RJMP ; TABLA: .DB
100
XL,LOW(DATOS) XH,HIGH(DATOS) ZL,LOW(TABLA<<1) ZH,HIGH(TABLA<<1) AUX,Z+ AUX,`$ FIN X+,AUX LAZO FIN
FACULTAD DE INGENIERIA ELECTRICA Y ELECTRONICAS$
.CSEG LDI LDI LDI LDI LDI LPM ST DEC BRNE LDI LDI LDI LDI LDI LPM ST DEC BRNE LDI LDI LDI LDI LDI LPM ST DEC BRNE RJMP .DB .DB .DB XL,LOW(DATOS1) XH,HIGH(DATOS1) ZL,LOW(TBL1<<1) ZH,HIGH(TBL1<<1) CONTADOR,NCOD1 AUX,Z+ X+,AUX CONTADOR LAZO1 XL,LOW(DATOS2) XH,HIGH(DATOS2) ZL,LOW(TBL2<<1) ZH,HIGH(TBL2<<1) CONTADOR,NCOD2 AUX,Z+ X+,AUX CONTADOR LAZO2 XL,LOW(DATOS3) XH,HIGH(DATOS3) ZL,LOW(TBL3<<1) ZH,HIGH(TBL3<<1) CONTADOR,NCOD3 AUX,Z+ X+,AUX CONTADOR LAZO3 FIN ESCUELA POLITECNICA NACIONAL
FACULTAD DE INGENIERIA ELECTRICA Y ELECTRONICAS,0 ESTE CURSO ES EL MAS CHEVERE DE TODAS LAS CARRERAS
LAZO1:
LAZO2:
LAZO3:
FIN: ; TBL1: TBL2: TBL3: FINTBL: ; .EQU .EQU .EQU ; .DSEG DATOS1: SEPAR1: DATOS2: SEPAR2: DATOS3: ; .EXIT
NCOD1 = (FINTBL TBL3) * 2 NCOD2 = (TBL3 TBL2) * 2 - 1 NCOD3 = (FINTBL TBL3) * 2 .BYTE .BYTE .BYTE .BYTE .BYTE NCOD1 20 NCOD2 17 NCOD3
VENTANA DE LA MEMORIA DESPUS DE LA EJECUCIN DEL PROGRAMA QUE CREA TRES TABLAS DE DATOS
Tambin se puede codificar este programa utilizando macroinstrucciones y subrutinas. .NOLIST .INCLUDE m164pdef.inc .LIST ; .DEF AUX = R16 .DEF CONTADOR = R17 ; .CSEG .MACRO INICIAR LDI XL,LOW(@0) LDI XH,HIGH(@0) LDI ZL,LOW(@1<<1) LDI ZH,HIGH(@1<<1) LDI CONTADOR,@2 .ENDMACRO ; LDI AUX,LOW(RAMEND) OUT SPL,AUX LDI AUX,HIGH(RAMEND) OUT SPH,AUX ; INICIAR DATOS1,TBL1,NCOD1 RCALL LAZO ; INICIAR DATOS2,TBL2,NCOD2 RCALL LAZO ; INICIAR DATOS3,TBL3,NCOD3 RCALL LAZO ; FIN: RJMP FIN
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
; LAZO:
; TBL1: TBL2: TBL3: FINTBL: ; .EQU .EQU .EQU ; .DSEG DATOS1: SEPAR1: DATOS2: SEPAR2: DATOS3: ; .EXIT
NCOD1 = (FINTBL TBL3) * 2 NCOD2 = (TBL3 TBL2) * 2 - 1 NCOD3 = (FINTBL TBL3) * 2 .BYTE .BYTE .BYTE .BYTE .BYTE NCOD1 20 NCOD2 17 NCOD3