El documento describe varias soluciones para llenar las primeras 12 localidades de la memoria SRAM de un microcontrolador ATmega164P con los códigos ASCII del número 1, la letra A mayúscula y la letra a minúscula de forma alternada. La primera solución utiliza direccionamiento directo y valores hexadecimales, mientras que las siguientes variaciones emplean expresiones con valores numéricos o etiquetas.
AFICHE EL MANIERISMO HISTORIA DE LA ARQUITECTURA II
Ejercicio 01 Llenar
1. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 1
EJERCICIO PARA PRACTICAR EL USO DE LAS
INSTRUCCIONES DE TRANSFERENCIA
Desarrollar un programa para el microcontrolador ATmega164P, que
permita llenar las doce primeras localidades de la memoria de datos, con
los códigos ASCII del número 1, de la letra A mayúscula y de la letra a
minúscula en forma alternada, tal como se muestra en la siguiente figura;
donde 0x31 es el ASCII del 1, 0x41 es el ASCII de la A y 0x61 es el
ASCII de la a:
PRIMERA SOLUCIÓN
Esta solución utiliza direccionamiento directo y valores numéricos hexadecimales.
LDI R16,0x31
LDI R17,0x41
LDI R18,0x61
STS 0x100,R16
STS 0x101,R17
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
2. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 2
STS 0x102,R18
STS 0x103,R16
STS 0x104,R17
STS 0x105,R18
STS 0x106,R16
STS 0x107,R17
STS 0x108,R18
STS 0x109,R16
STS 0x10A,R17
STS 0x10B,R18
El Módulo Fuente contenido en el archivo .ASM es el que muestra a continuación:
; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CÓDIGOS ASCII DEL NÚMERO 1,
; DE LA LETRA A MAYÚSCULA Y DE LA LETRA a MINÚSCULA,
; ALTERNADAMENTE.
; LA SOLUCIÓN UTILIZA DIRECCIONAMIENTO DIRECTO
; Y VALORES NUMÉRICOS HEXADECIMALES
;
.DEVICE ATMEGA164P
;
.CSEG
LDI R16,0x31
LDI R17,0x41
LDI R18,0x61
STS 0x100,R16
STS 0x101,R17
STS 0x102,R18
STS 0x103,R16
STS 0x104,R17
STS 0x105,R18
STS 0x106,R16
STS 0x107,R17
STS 0x108,R18
STS 0x109,R16
STS 0x10A,R17
STS 0x10B,R18
;
FIN: RJMP FIN
;
.EXIT ; FIN DEL MODULO FUENTE
El resultado del ensamblado contenido en el archivo .LST es:
AVRASM ver. 2.1.12 C:Documents_and_SettingsAdministradorMis_documentos
AVRfilesLlenarATmega164Llenar01Llenar01.asm Sun Mar 22 10:35:41 2009
; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CÓDIGOS ASCII DEL NÚMERO 1,
; DE LA LETRA A MAYÚSCULA Y DE LA LETRA A MINÚSCULA,
; ALTERNADAMENTE.
; LA SOLUCIÓN UTILIZA DIRECCIONAMIENTO DIRECTO
; Y VALORES NUMÉRICOS HEXADECIMALES
;
.DEVICE ATMEGA164P
;
.CSEG
000000 e301 LDI R16,0x31
000001 e411 LDI R17,0x41
000002 e621 LDI R18,0x61
000003 9300 0100 STS 0x100,R16
000005 9310 0101 STS 0x101,R17
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
3. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 3
000007 9320 0102 STS 0x102,R18
000009 9300 0103 STS 0x103,R16
00000b 9310 0104 STS 0x104,R17
00000d 9320 0105 STS 0x105,R18
00000f 9300 0106 STS 0x106,R16
000011 9310 0107 STS 0x107,R17
000013 9320 0108 STS 0x108,R18
000015 9300 0109 STS 0x109,R16
000017 9310 010a STS 0x10A,R17
000019 9320 010b STS 0x10B,R18
;
00001b cfff FIN: RJMP FIN
;
RESOURCE USE INFORMATION
------------------------
Notice:
The register and instruction counts are symbol table hit counts,
and hence implicitly used resources are not counted, eg, the
'lpm' instruction without operands implicitly uses r0 and z,
none of which are counted.
x,y,z are separate entities in the symbol table and are
counted separately from r26..r31 here.
.dseg memory usage only counts static data declared with .byte
ATMEGA164P register use summary:
r0 : 0 r1 : 0 r2 : 0 r3 : 0 r4 : 0 r5 : 0 r6 : 0 r7 : 0
r8 : 0 r9 : 0 r10: 0 r11: 0 r12: 0 r13: 0 r14: 0 r15: 0
r16: 5 r17: 5 r18: 5 r19: 0 r20: 0 r21: 0 r22: 0 r23: 0
r24: 0 r25: 0 r26: 0 r27: 0 r28: 0 r29: 0 r30: 0 r31: 0
x : 0 y : 0 z : 0
Registers used: 3 out of 35 (8.6%)
ATMEGA164P instruction use summary:
adc : 0 add : 0 adiw : 0 and : 0 andi : 0 asr : 0
bclr : 0 bld : 0 brbc : 0 brbs : 0 brcc : 0 brcs : 0
break : 0 breq : 0 brge : 0 brhc : 0 brhs : 0 brid : 0
brie : 0 brlo : 0 brlt : 0 brmi : 0 brne : 0 brpl : 0
brsh : 0 brtc : 0 brts : 0 brvc : 0 brvs : 0 bset : 0
bst : 0 call : 0 cbi : 0 cbr : 0 clc : 0 clh : 0
cli : 0 cln : 0 clr : 0 cls : 0 clt : 0 clv : 0
clz : 0 com : 0 cp : 0 cpc : 0 cpi : 0 cpse : 0
dec : 0 eicall: 0 eijmp : 0 elpm : 0 eor : 0 fmul : 0
fmuls : 0 fmulsu: 0 icall : 0 ijmp : 0 in : 0 inc : 0
jmp : 0 ld : 0 ldd : 0 ldi : 3 lds : 0 lpm : 0
lsl : 0 lsr : 0 mov : 0 movw : 0 mul : 0 muls : 0
mulsu : 0 neg : 0 nop : 0 or : 0 ori : 0 out : 0
pop : 0 push : 0 rcall : 0 ret : 0 reti : 0 rjmp : 1
rol : 0 ror : 0 sbc : 0 sbci : 0 sbi : 0 sbic : 0
sbis : 0 sbiw : 0 sbr : 0 sbrc : 0 sbrs : 0 sec : 0
seh : 0 sei : 0 sen : 0 ser : 0 ses : 0 set : 0
sev : 0 sez : 0 sleep : 0 spm : 0 st : 0 std : 0
sts : 12 sub : 0 subi : 0 swap : 0 tst : 0 wdr : 0
Instructions used: 3 out of 114 (2.6%)
ATMEGA164P memory use summary [bytes]:
Segment Begin End Code Data Used Size Use%
---------------------------------------------------------------
[.cseg] 0x000000 0x000038 56 0 56 9999999 0.0%
[.dseg] 0x000060 0x000060 0 0 0 9999999 0.0%
[.eseg] 0x000000 0x000000 0 0 0 9999999 0.0%
Assembly complete, 0 errors, 0 warnings
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
4. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 4
El código de máquina contenido en el archivo .HEX es:
:020000020000FC
:1000000001E311E421E60093000110930101209324
:100010000201009303011093040120930501009352
:100020000601109307012093080100930901109322
:080030000A0120930B01FFCF30
:00000001FF
VARIACIÓN DE LA PRIMERA SOLUCIÓN
Esta solución utiliza direccionamiento directo y expresiones con valores numéricos.
LDI R16,0x31
LDI R17,0x41
LDI R18,0x61
STS 0x100+0,R16
STS 0x100+1,R17
STS 0x100+2,R18
STS 0x100+3,R16
STS 0x100+4,R17
STS 0x100+5,R18
STS 0x100+6,R16
STS 0x100+7,R17
STS 0x100+8,R18
STS 0x100+9,R16
STS 0x100+10,R17
STS 0x100+11,R18
VARIACIÓN DE LA PRIMERA SOLUCIÓN, PERO
QUE NO CUMPLE LO SOLICITADO
Esta solución utiliza también direccionamiento directo y expresiones con valores
numéricos. ATENCIÓN: esta solución llena otras localidades, con otros valores.
LDI R16,31
LDI R17,41
LDI R18,61
STS 100+0,R16
STS 100+1,R17
STS 100+2,R18
STS 100+3,R16
STS 100+4,R17
STS 100+5,R18
STS 100+6,R16
STS 100+7,R17
STS 100+8,R18
STS 100+9,R16
STS 100+10,R17
STS 100+11,R18
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
5. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 5
NUEVA VARIACIÓN DE LA PRIMERA SOLUCIÓN
Esta solución utiliza direccionamiento directo y expresiones con etiquetas.
LDI R16,NUMERO
LDI R17,MAYUSC
LDI R18,MINUSC
STS BLOQUE+0,R16
STS BLOQUE+1,R17
STS BLOQUE+2,R18
STS BLOQUE+3,R16
STS BLOQUE+4,R17
STS BLOQUE+5,R18
STS BLOQUE+6,R16
STS BLOQUE+7,R17
STS BLOQUE+8,R18
STS BLOQUE+9,R16
STS BLOQUE+10,R17
STS BLOQUE+11,R18
El Módulo Fuente contenido en el archivo .ASM es el que muestra a continuación:
; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CÓDIGOS ASCII DEL NÚMERO 1
; DE LA LETRA A MAYÚSCULA Y DE LA LETRA a MINÚSCULA,
; ALTERNADAMENTE.
; LA SOLUCIÓN UTILIZA DIRECCIONAMIENTO DIRECTO
; Y EXPRESIONES CON ETIQUETAS
;
.DEVICE ATMEGA164P
;
.EQU NLOC = 12
.EQU NUMERO = 0x31
.EQU MAYUSC = 0x41
.EQU MINUSC = 0x61
;
.DSEG
.ORG 0x100
BLOQUE: .BYTE NLOC
;
.CSEG
LDI R16,NUMERO
LDI R17,MAYUSC
LDI R18,MINUSC
STS BLOQUE+0,R16
STS BLOQUE+1,R17
STS BLOQUE+2,R18
STS BLOQUE+3,R16
STS BLOQUE+4,R17
STS BLOQUE+5,R18
STS BLOQUE+6,R16
STS BLOQUE+7,R17
STS BLOQUE+8,R18
STS BLOQUE+9,R16
STS BLOQUE+10,R17
STS BLOQUE+11,R18
;
FIN: RJMP FIN
;
.EXIT ; FIN DEL MODULO FUENTE
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
6. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 6
Para asignar los valores numéricos a las etiquetas, se utiliza la Directiva de
EQUIVALENCIA (.EQU)
Para asignar los valores de las direcciones de la SRAM a las etiquetas, se utilizan: la
Directiva de Reservación de zonas de memoria SRAM (.BYTE) y la Directiva de
Reubicación (.ORG), que permite establecer el origen del bloque de localidades de la
SRAM. Esta misma directiva, sirve para reubicar los programas cuando es necesario.
De esta manera se facilita al programador la actualización de los programas, porque es
más comprensible el algoritmo implementado y es más rápido de modificarlo, como se
ve en el siguiente Módulo Fuente.
; PROGRAMA PARA LLENAR LAS QUINCE LOCALIDADES A PARTIR DE LA 200 HEXADECIMAL
; DE LA MEMORIA DE DATOS, CON LOS CÓDIGOS ASCII DEL NÚMERO 0
; DE LA LETRA Z MAYÚSCULA Y DE LA LETRA t MINÚSCULA,
; ALTERNADAMENTE.
; LA SOLUCIÓN UTILIZA DIRECCIONAMIENTO DIRECTO
; Y EXPRESIONES CON ETIQUETAS
;
.DEVICE ATMEGA164P
;
.EQU NLOC = 15
.EQU NUMERO = '0'
.EQU MAYUSC = 'Z'
.EQU MINUSC = 't'
;
.DSEG
.ORG 0x200
BLOQUE: .BYTE NLOC
;
.CSEG
LDI R16,NUMERO
LDI R17,MAYUSC
LDI R18,MINUSC
STS BLOQUE+0,R16
STS BLOQUE+1,R17
STS BLOQUE+2,R18
STS BLOQUE+3,R16
STS BLOQUE+4,R17
STS BLOQUE+5,R18
STS BLOQUE+6,R16
STS BLOQUE+7,R17
STS BLOQUE+8,R18
STS BLOQUE+9,R16
STS BLOQUE+10,R17
STS BLOQUE+11,R18
STS BLOQUE+12,R16
STS BLOQUE+13,R17
STS BLOQUE+14,R18
;
FIN: RJMP FIN
;
.EXIT ; FIN DEL MODULO FUENTE
En esta solución, se ha incorporado la ayuda del ensamblador para obtener los códigos
ASCII de los símbolos, únicamente colocando al símbolo entre apóstrofes.
También, se ha utilizado de Directiva de Reubicación (.ORG)
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
7. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 7
SEGUNDA SOLUCIÓN
La solución utiliza direccionamiento indirecto, incrementos del puntero y etiquetas. El
puntero que se utiliza es el puntero X, que está conformado por los Registros R26 y
R27. Por lo que hace falta inicializar el puntero antes de utilizarlo.
LDI R16,NUMERO
LDI R17,MAYUSC
LDI R18,MINUSC
LDI R26,LOW(BLOQUE)
LDI R27,HIGH(BLOQUE)
ST X,R16
INC R26
ST X,R17
INC R26
ST X,R18
INC R26
ST X,R16
INC R26
ST X,R17
INC R26
ST X,R18
INC R26
ST X,R16
INC R26
ST X,R17
INC R26
ST X,R18
INC R26
ST X,R16
INC R26
ST X,R17
INC R26
ST X,R18
INC R26
Esta solución para inicializar el Puntero X de 16 bits, utiliza dos instrucciones de carga
inmediata de 8 bits a los registro R26 y R27 (LDI); donde el operando de origen que
utiliza direccionamiento inmediato es el resultado de las funciones LOW y HIGH, que
posee este ensamblador, para separar un número de 16 bits en dos bytes el menos
significativo con LOW y el más significativo con HIGH.
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
8. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 8
TERCERA SOLUCIÓN
Esta solución utiliza direccionamiento indirecto con post incremento, funciones y
etiquetas
LDI R16,NUMERO
LDI R17,MAYUSC
LDI R18,MINUSC
LDI R26,LOW(BLOQUE)
LDI R27,HIGH(BLOQUE)
ST X+,R16
ST X+,R17
ST X+,R18
ST X+,R16
ST X+,R17
ST X+,R18
ST X+,R16
ST X+,R17
ST X+,R18
ST X+,R16
ST X+,R17
ST X+,R18
La ventaja de esta solución, radica en que el código de máquina de todas las
instrucciones que llenan las localidades de la SRAM, es el mismo.
; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CÓDIGOS ASCII DEL NÚMERO 1
; DE LA LETRA A MAYÚSCULA Y DE LA LETRA a MINÚSCULA,
; ALTERNADAMENTE.
; LA SOLUCIÓN UTILIZA DIRECCIONAMIENTO INDIRECTO CON
; POST INCREMENTO, FUNCIONES Y ETIQUETAS
;
.DEVICE ATMEGA164P
;
.EQU NLOC = 12
.EQU NUMERO = '1'
.EQU MAYUSC = 'A'
.EQU MINUSC = 'a'
;
.DSEG
.ORG 0x100
000100 BLOQUE: .BYTE NLOC
;
.CSEG
000000 e301 LDI R16,NUMERO
000001 e411 LDI R17,MAYUSC
000002 e621 LDI R18,MINUSC
000003 e0a0 LDI R26,LOW(BLOQUE)
000004 e0b1 LDI R27,HIGH(BLOQUE)
000005 930d ST X+,R16
Códigos de Máquina
000006 931d iguales
ST X+,R17
000007 932d ST X+,R18
000008 930d Códigos de Máquina ST X+,R16
000009 931d iguales ST X+,R17
00000a 932d ST X+,R18
00000b 930d Códigos de Máquina ST X+,R16
00000c 931d iguales ST X+,R17
00000d 932d ST X+,R18
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
9. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 9
00000e 930d ST X+,R16
Códigos de Máquina
00000f 931d ST X+,R17
iguales
000010 932d ST X+,R18
;
000011 cfff FIN: RJMP FIN
;
.EXIT ; FIN DEL MODULO FUENTE
Por lo tanto, con este modo de direccionamiento se puede conseguir una solución
eficiente mediante el uso de LAZOS DE REPETICIÓN
CUARTA SOLUCIÓN
Esta solución utiliza direccionamiento indirecto con post incremento, expresiones con
funciones, etiquetas y un lazo de repetición controlado por el valor del puntero
LDI R16,NUMERO
LDI R17,MAYUSC
LDI R18,MINUSC
LDI R26,LOW(BLOQUE)
LDI R27,HIGH(BLOQUE)
REPITA: ST X+,R16
ST X+,R17
ST X+,R18
CPI R26,LOW(BLOQUE)+11
BRNE REPITA
Resultado del ensamblado de este Módulo Fuente:
; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CÓDIGOS ASCII DEL NÚMERO 1
; DE LA LETRA A MAYÚSCULA Y DE LA LETRA a MINÚSCULA,
; ALTERNADAMENTE.
; LA SOLUCIÓN UTILIZA DIRECCIONAMIENTO INDIRECTO CON
; POST INCREMENTO, EXPRESIONES CON FUNCIONES, ETIQUETAS Y
; UN LAZO DE REPETICIÓN CONTROLADO POR EL VALOR DEL PUNTERO
;
.DEVICE ATMEGA164P
;
.EQU NLOC = 12
.EQU NUMERO = '1'
.EQU MAYUSC = 'A'
.EQU MINUSC = 'a'
;
.DSEG
.ORG 0x100
000100 BLOQUE: .BYTE NLOC
;
.CSEG
000000 e301 LDI R16,NUMERO
000001 e411 LDI R17,MAYUSC
000002 e621 LDI R18,MINUSC
000003 e0a0 LDI R26,LOW(BLOQUE)
000004 e0b1 LDI R27,HIGH(BLOQUE)
000005 930d REPITA: ST X+,R16
000006 931d ST X+,R17
000007 932d ST X+,R18
000008 30ab CPI R26,LOW(BLOQUE)+11
000009 f7d9 BRNE REPITA
;
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
10. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 10
00000a cfff FIN: RJMP FIN
;
Lamentablemente esta solución no cumple con lo solicitado, “Llenar doce localidades”;
porque, el programa sigue llenando más localidades debido a una falla en el control del
lazo de repetición tal como se puede ver en la siguiente prueba de escritorio.
R16 R17 R18 R26 R27 Localidades de la SRAM Comparación Salto
0x31 0x41 0x61 0x00 0x01 (0x0100) = 0x31
0x01 0x01
(0x0101) = 0x41
0x02 0x01
(0x0102) = 0x61
0x03 0x01 0x03<>0x0B Si
(0x0103) = 0x31
0x04 0x01
(0x0104) = 0x41
0x05 0x01
(0x0105) = 0x61
0x06 0x01 0x06<>0x0B Si
(0x0106) = 0x31
0x07 0x01
(0x0107) = 0x41
0x08 0x01
(0x0108) = 0x61
0x09 0x01 0x09<>0x0B Si
(0x0109) = 0x31
0x0A 0x01
(0x010A) = 0x41
0x0B 0x01
(0x010B) = 0x61
0x0C 0x01 0x0C<>0x0B Si
(0x010C) = 0x31
0x0D 0x01
(0x010D) = 0x41
0x0E 0x01
(0x010E) = 0x61
0x0F 0x01 0x0F<>0x0B Si
(0x010F) = 0x31
0x10 0x01
(0x0110) = 0x41
0x11 0x01
(0x0111) = 0x61
0x12 0x01 0x12<>0x0B Si
La solución es modificar la instrucción de comparación por:
CPI R26,LOW(BLOQUE)+12
O, mejor:
CPI R26,LOW(BLOQUE)+NLOC
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
11. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 11
QUINTA SOLUCIÓN
Esta solución utiliza direccionamiento indirecto con post incremento, expresiones con
funciones, etiquetas y un lazo de repetición controlado por un contador descendente.
LDI R16,NUMERO
LDI R17,MAYUSC
LDI R18,MINUSC
LDI R19,NLOC/3
LDI R26,LOW(BLOQUE)
LDI R27,HIGH(BLOQUE)
REPITA: ST X+,R16
ST X+,R17
ST X+,R18
DEC R19
BRNE REPITA
VARIACIÓN A LA QUINTA SOLUCIÓN
Esta variación permite visualizar mejor el algoritmo, cuando al registro contador se
etiqueta precisamente como “CONTADOR”, mediante la Directiva que Define un
Nombre Simbólico para un Registro (.DEF)
; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CÓDIGOS ASCII DEL NÚMERO 1
; DE LA LETRA A MAYÚSCULA Y DE LA LETRA a MINÚSCULA,
; ALTERNADAMENTE.
; LA SOLUCIÓN UTILIZA DIRECCIONAMIENTO INDIRECTO CON
; POST INCREMENTO, EXPRESIONES CON FUNCIONES, ETIQUETAS Y
; UN LAZO DE REPETICIÓN CONTROLADO POR UN CONTADOR DESCENDENTE
; EL REGISTRO CONTADOR ESTA ETIQUETADO PRECISAMENTE COMO "CONTADOR"
;
.DEVICE ATMEGA164P
;
.EQU NLOC = 12
.EQU NUMERO = '1'
.EQU MAYUSC = 'A'
.EQU MINUSC = 'a'
;
.DEF CONTADOR = R19
;
.DSEG
.ORG 0x100
BLOQUE: .BYTE NLOC
;
.CSEG
LDI R16,NUMERO
LDI R17,MAYUSC
LDI R18,MINUSC
LDI CONTADOR,NLOC/3
LDI R26,LOW(BLOQUE)
LDI R27,HIGH(BLOQUE)
REPITA: ST X+,R16
ST X+,R17
ST X+,R18
DEC CONTADOR
BRNE REPITA
;
FIN: RJMP FIN
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
12. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 12
;
.EXIT ; FIN DEL MODULO FUENTE
La ventaja de elaborar lazos de repetición bajo este esquema, es que se pueden observar
en forma clara las tres partes que conforman el lazo de repetición:
• La inicialización de los registros, del contador de repeticiones y del o de los
punteros, que intervienen en el lazo.
• El cuerpo del lazo de repetición, que realiza la tarea repetitiva, y
• La disminución del contador y el correspondiente chequeo para determinar el
final de las repeticiones, mediante la instrucción de bifurcación.
A continuación se muestra el Módulo Fuente en el que se ha unido la solución a los dos
problemas que se resolvieron antes, en forma individual.
; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CÓDIGOS ASCII DEL NÚMERO 1
; DE LA LETRA A MAYÚSCULA Y DE LA LETRA a MINÚSCULA,
; ALTERNADAMENTE.
; TAMBIÉN, DEBE LLENAR QUINCE LOCALIDADES A PARTIR DE 200 HEXADECIMAL
; DE LA MEMORIA DE DATOS, CON LOS CÓDIGOS ASCII DEL NÚMERO 0
; DE LA LETRA Z MAYÚSCULA Y DE LA LETRA t MINÚSCULA,
; ALTERNADAMENTE.
; LA SOLUCIÓN UTILIZA DIRECCIONAMIENTO INDIRECTO CON
; POST INCREMENTO, EXPRESIONES CON FUNCIONES, ETIQUETAS Y
; DOS LAZOS DE REPETICIÓN CONTROLADO POR UN CONTADOR DESCENDENTE
; EL REGISTRO CONTADOR ESTA ETIQUETADO PRECISAMENTE COMO "CONTADOR"
;
.DEVICE ATMEGA164P
;
.EQU NLOC1 = 12
.EQU NUMERO1 = '1'
.EQU MAYUSC1 = 'A'
.EQU MINUSC1 = 'a'
.EQU NLOC2 = 15
.EQU NUMERO2 = '0'
.EQU MAYUSC2 = 'Z'
.EQU MINUSC2 = 't'
;
.DEF CONTADOR = R19
;
.DSEG
.ORG 0x100
BLQ1: .BYTE NLOC1
.ORG 0x200
BLQ2: .BYTE NLOC2
;
.CSEG
LDI R16,NUMERO1
LDI R17,MAYUSC1
LDI R18,MINUSC1
LDI CONTADOR,NLOC1/3
LDI R26,LOW(BLQ1)
LDI R27,HIGH(BLQ1)
LAZO1: ST X+,R16
ST X+,R17
ST X+,R18
DEC CONTADOR
BRNE LAZO1
;
LDI R16,NUMERO2
LDI R17,MAYUSC2
LDI R18,MINUSC2
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
13. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 13
LDI CONTADOR,NLOC2/3
LDI R26,LOW(BLQ2)
LDI R27,HIGH(BLQ2)
LAZO2: ST X+,R16
ST X+,R17
ST X+,R18
DEC CONTADOR
BRNE LAZO2
;
FIN: RJMP FIN
;
.EXIT ; FIN DEL MODULO FUENTE
Esta última solución al problema, permite al programador crear sus propias
MACROINSTRUCCIONES, que le faciliten aún más la elaboración de los programas.
INCLUSIÓN DE MACROINSTRUCCIONES EN LA
QUINTA SOLUCIÓN
La creación de Macroinstrucciones consiste en agrupar un bloque de instrucciones que
forman la nueva instrucción. La condición que deben cumplir es que se diferencien
únicamente en ciertos operandos como registros, localidades o valores entre las
instrucciones de los diferentes bloques.
Para construir la nueva instrucción: Se empieza por la Directiva de Encabezado de las
Macroinstrucciones (:MACRO), donde se define el nombre que le corresponde a la
nueva instrucción. A continuación sigue el bloque de instrucciones, donde los elementos
que cambian son reemplazados por @0, @1, @2 … hasta @9 y que constituyen los
parámetros que se especifican cuando se invoca a la nueva instrucción, dentro del
programa. Se termina la construcción de la nueva instrucción con la Directiva de
Finalización de las Macroinstrucciones (:ENDMACRO)
La invocación de la nueva instrucción se realiza utilizando el nombre que se estableció
en la construcción, seguido de los parámetros separados por comas y en el orden que se
los numeró.
A continuación esta ilustrado la creación de la Macroinstrucción para inicializar los
registros que se utilizan en los lazos de repetición de la solución, a la que se le nombra
como “INICIAR”.
.LISTMAC
.MACRO INICIAR
LDI R16,@0
LDI R17,@1
LDI R18,@2
LDI CONTADOR,@3/2
LDI R26,LOW(@4)
LDI R27,HIGH(@4)
.ENDMACRO
;
.CSEG
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
14. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 14
INICIAR NUMERO1,MAYUSC1,MINUSC1,NLOC1,BLQ1
LAZO1: ST X+,R16
ST X+,R17
ST X+,R18
DEC CONTADOR
BRNE LAZO1
;
INICIAR NUMERO2,MAYUSC2,MINUSC2,NLOC2,BLQ2
LAZO2: ST X+,R16
ST X+,R17
ST X+,R18
DEC CONTADOR
BRNE LAZO2
El uso de Macroinstrucciones no ahorra código de máquina, como se puede ver en el
resultado del ensamblado, que a continuación se muestra:
.DEVICE ATMEGA164P
;
.EQU NLOC1 = 12
.EQU NUMERO1 = '1'
.EQU MAYUSC1 = 'A'
.EQU MINUSC1 = 'a'
.EQU NLOC2 = 15
.EQU NUMERO2 = '0'
.EQU MAYUSC2 = 'Z'
.EQU MINUSC2 = 't'
;
.DEF CONTADOR = R19
;
.DSEG
.ORG 0x100
000100 BLQ1: .BYTE NLOC1
.ORG 0x200
000200 BLQ2: .BYTE NLOC2
;
.LISTMAC
.MACRO INICIAR
LDI R16,@0
LDI R17,@1
LDI R18,@2
LDI CONTADOR,@3/2
LDI R26,LOW(@4)
LDI R27,HIGH(@4)
.ENDMACRO
;
.CSEG
+
000000 e301 +LDI R16 , NUMERO1
000001 e411 +LDI R17 , MAYUSC1
000002 e621 +LDI R18 , MINUSC1
000003 e036 +LDI CONTADOR , NLOC1 / 2
000004 e0a0 +LDI R26 , LOW ( BLQ1 )
000005 e0b1 +LDI R27 , HIGH ( BLQ1 )
INICIAR NUMERO1,MAYUSC1,MINUSC1,NLOC1,BLQ1
000006 930d LAZO1: ST X+,R16
000007 931d ST X+,R17
Códigos de Máquina
000008 932d ST X+,R18
iguales
000009 953a DEC CONTADOR
00000a f7d9 BRNE LAZO1
;
+
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
15. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 15
00000b e300 +LDI R16 , NUMERO2
00000c e51a +LDI R17 , MAYUSC2
00000d e724 +LDI R18 , MINUSC2
00000e e037 +LDI CONTADOR , NLOC2 / 2
00000f e0a0 +LDI R26 , LOW ( BLQ2 )
000010 e0b2 +LDI R27 , HIGH ( BLQ2 )
INICIAR NUMERO2,MAYUSC2,MINUSC2,NLOC2,BLQ2
000011 930d LAZO2: ST X+,R16
000012 931d ST X+,R17
000013 932d Códigos de Máquina ST X+,R18
iguales
000014 953a DEC CONTADOR
000015 f7d9 BRNE LAZO2
;
000016 cfff FIN: RJMP FIN
; ;
Analizando el listado anterior, se puede observar que las instrucciones de los lazos de
repetición tienen el mismo código de máquina, lo que permite convertirles en
Subrutinas, como lo que si indica a continuación:
INICIAR NUMERO1,MAYUSC1,MINUSC1,NLOC1,BLQ1
CALL LAZO
INICIAR NUMERO2,MAYUSC2,MINUSC2,NLOC2,BLQ2
CALL LAZO
INCLUSIÓN DE MACROINSTRUCCIONES Y
SUBRUTINAS EN LA QUINTA SOLUCIÓN
Cuando se utilizan Subrutinas es necesario inicializar el Puntero del Stack (SP) que
generalmente se lo ubica al final de la SRAM. Además se ha eliminado la directiva que
lista completamente las macroinstrucciones.
.DEVICE ATMEGA164P
;
.EQU NLOC1 = 12
.EQU NUMERO1 = '1'
.EQU MAYUSC1 = 'A'
.EQU MINUSC1 = 'a'
.EQU NLOC2 = 15
.EQU NUMERO2 = '0'
.EQU MAYUSC2 = 'Z'
.EQU MINUSC2 = 't'
;
.DEF CONTADOR = R19
;
.DSEG
.ORG 0x100
000100 BLQ1: .BYTE NLOC1
.ORG 0x200
000200 BLQ2: .BYTE NLOC2
;
;.LISTMAC
.MACRO INICIAR
LDI R16,@0
LDI R17,@1
LDI R18,@2
LDI CONTADOR,@3/2
LDI R26,LOW(@4)
LDI R27,HIGH(@4)
.ENDMACRO
;
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
16. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 16
.CSEG
000000 ef0f LDI R16,LOW(0x04FF)
000001 9300 005e STS $5E,R16 Inicialización del
000003 e004 LDI R16,HIGH(0x04FF) Stack Pointer
000004 9300 005d STS $5D,R16
;
000006 e301
000007 e411
000008 e621
000009 e036
00000a e0a0
00000b e0b1 INICIAR NUMERO1,MAYUSC1,MINUSC1,NLOC1,BLQ1
00000c 940e 0017 CALL LAZO
;
00000e e300
00000f e51a
000010 e724
000011 e037
000012 e0a0
000013 e0b2 INICIAR NUMERO2,MAYUSC2,MINUSC2,NLOC2,BLQ2
000014 940e 0017 CALL LAZO
;
000016 cfff FIN: RJMP FIN
;
000017 930d LAZO: ST X+,R16
000018 931d ST X+,R17
000019 932d ST X+,R18
00001a 953a DEC CONTADOR
00001b f7d9 BRNE LAZO
00001c 9508 RET
;
INCLUSIÓN DEL ARCHIVO DE DEFINICIONES
PROPORCIONADO POR EL FABRICANTE
El fabricante proporciona el archivo “m164pdef.inc”, para facilitar la elaboración de los
programas; a fin de, reemplazar los valores numéricos de las direcciones de memoria
por las Etiquetas que se utilizan en las hojas de datos. En el siguiente listado se ha
reemplazado la definición del dispositivo (.DEVICE ATMEGA164P) por la inclusión
del archivo de definiciones y se han utilizado las directivas .NOLIST y .LIST para que
en el archivo de resultado del ensamblado no se listen las líneas que contiene el archivo
de definiciones.
.NOLIST
.INCLUDE "m164pdef.inc"
.LIST
;
.EQU NLOC1 = 12
.EQU NUMERO1 = '1'
.EQU MAYUSC1 = 'A'
.EQU MINUSC1 = 'a'
.EQU NLOC2 = 15
.EQU NUMERO2 = '0'
.EQU MAYUSC2 = 'Z'
.EQU MINUSC2 = 't'
;
.DEF CONTADOR = R19
;
.DSEG
.ORG 0x100
BLQ1: .BYTE NLOC1
.ORG 0x200
BLQ2: .BYTE NLOC2
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información
17. SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM
Pag. 17
;
;.LISTMAC
.MACRO INICIAR
LDI R16,@0
LDI R17,@1
LDI R18,@2
LDI CONTADOR,@3/2
LDI R26,LOW(@4)
LDI R27,HIGH(@4)
.ENDMACRO
;
.CSEG
LDI R16,LOW(RAMEND) Etiquetas que se
OUT SPH,R16 encuentran en el archivo
LDI R16,HIGH(RAMEND) de definiciones
OUT SPL,R16
;
INICIAR NUMERO1,MAYUSC1,MINUSC1,NLOC1,BLQ1
CALL LAZO
;
INICIAR NUMERO2,MAYUSC2,MINUSC2,NLOC2,BLQ2
CALL LAZO
;
FIN: RJMP FIN
;
LAZO: ST X+,R16
ST X+,R17
ST X+,R18
DEC CONTADOR
BRNE LAZO
RET
;
.EXIT ; FIN DEL MODULO FUENTE
La utilización de este archivo de definiciones permite escoger rápidamente el
microcontrolador con el cual se va ha trabajar, grabado el código de máquina que
resulta del proceso de ensamblado. Así por ejemplo, el último programa en una ocasión
se desea utilizarlo con el ATmega164P y en otra con el ATmega16; una de las
diferencias entre estos microcontroladores es la dirección final de la SRAM. en el
primer caso esta dirección es 0x04FF y en el segundo caso es 0x045F. Únicamente
cambiando el archivo de definiciones “m164pdef.inc” por “m16def.inc” y sin modificar
ninguna otra línea, se obtiene para cada caso los códigos de máquina correspondientes.
Para el ATmega164P
:020000020000FC
:100000000FEF0EBF04E00DBF01E311E421E636E07F
:10001000A0E0B1E00E94150000E31AE524E737E014
:10002000A0E0B2E00E941500FFCF0D931D932D9329
:060030003A95D9F708958E
:00000001FF Códigos de Máquina
diferentes, por el cambio de
microcontrolador
Para el ATmega16
:020000020000FC
:100000000FE50EBF04E00DBF01E311E421E636E089
:10001000A0E0B1E00E94150000E31AE524E737E014
:10002000A0E0B2E00E941500FFCF0D931D932D9329
:060030003A95D9F708958E
:00000001FF
Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información