Académique Documents
Professionnel Documents
Culture Documents
Pgina 1
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
;
FIN:
;
.EXIT
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
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
RJMP
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
.DB
.DB
.DB
.DB
.DB
.DB
;
.EXIT
0x43
0x49
0x4F
0x4E
0x41
0x4C
ZL,LOW(TABLA<<1)
ZH,HIGH(TABLA<<1)
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
Para Byte
Par
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
Byte Par
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
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
.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
.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:
.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
00000b
00000c
00000d
00000e
00000f
000010
000011
000012
000013
000014
000015
000016
000017
.DB
.DB
.DB
5345
5543
4c45
2041
4f50
494c
4554
4e43
4349
2041
414e
4943
4e4f
4c41
ESCUELA
POLITECNICA
NACIONAL
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
.DB
5345
5543
4c45
2041
4f50
494c
4554
4e43
4349
2041
414e
4943
4e4f
4c41
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
.DEF
;
.DSEG
DATOS:
;
.CSEG
LAZO:
;
FIN:
;
TABLA:
CONTADOR = R17
.BYTE
NCOD
LDI
LDI
LDI
LDI
LDI
LPM
ST
DEC
BRNE
XL,LOW(DATOS)
XH,HIGH(DATOS)
ZL,LOW(TABLA<<1)
ZH,HIGH(TABLA<<1)
CONTADOR,NCOD
AUX,Z+
X+,AUX
CONTADOR
LAZO
RJMP
FIN
.DB
MODIFICACIN AL
SEGUNDA SOLUCIN
MDULO
FUENTE
DE
LA
.EQU
.DEF
.DEF
;
.DSEG
DATOS:
;
.CSEG
LAZO:
;
FIN:
;
TABLA:
FINTBL:
.BYTE
NCOD
LDI
LDI
LDI
LDI
LDI
LPM
ST
DEC
BRNE
XL,LOW(DATOS)
XH,HIGH(DATOS)
ZL,LOW(TABLA<<1)
ZH,HIGH(TABLA<<1)
CONTADOR,NCOD
AUX,Z+
X+,AUX
CONTADOR
LAZO
RJMP
FIN
.DB
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
Reservar 100
localidades
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
LAZO1:
LDI
LDI
LDI
LDI
LDI
LPM
ST
DEC
BRNE
XL,LOW(DATOS1)
XH,HIGH(DATOS1)
ZL,LOW(TBL1<<1)
ZH,HIGH(TBL1<<1)
CONTADOR,NCOD1
AUX,Z+
X+,AUX
CONTADOR
LAZO1
LDI
LDI
LDI
LDI
LDI
LPM
ST
DEC
BRNE
XL,LOW(DATOS2)
XH,HIGH(DATOS2)
ZL,LOW(TBL2<<1)
ZH,HIGH(TBL2<<1)
CONTADOR,NCOD2
AUX,Z+
X+,AUX
CONTADOR
LAZO2
LDI
LDI
LDI
LDI
LDI
LPM
ST
DEC
BRNE
RJMP
XL,LOW(DATOS3)
XH,HIGH(DATOS3)
ZL,LOW(TBL3<<1)
ZH,HIGH(TBL3<<1)
CONTADOR,NCOD3
AUX,Z+
X+,AUX
CONTADOR
LAZO3
FIN
.DB
.DB
.DB
LAZO2:
LAZO3:
FIN:
;
TBL1:
TBL2:
TBL3:
FINTBL:
;
.EQU
.EQU
.EQU
;
.DSEG
DATOS1:
SEPAR1:
DATOS2:
SEPAR2:
DATOS3:
;
.EXIT
NCOD1
20
NCOD2
17
NCOD3
;
LAZO:
;
TBL1:
TBL2:
TBL3:
FINTBL:
;
.EQU
.EQU
.EQU
;
.DSEG
DATOS1:
SEPAR1:
DATOS2:
SEPAR2:
DATOS3:
;
.EXIT
LPM
ST
DEC
BRNE
RET
AUX,Z+
X+,AUX
CONTADOR
LAZO
.DB
.DB
.DB
NCOD1
20
NCOD2
17
NCOD3