You are on page 1of 17

SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM

Pag. 1
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
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 cdigos ASCII del nmero 1, de la letra A mayscula y de la letra a
minscula 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 SOLUCIN

Esta solucin utiliza direccionamiento directo y valores numricos hexadecimales.

LDI R16,0x31
LDI R17,0x41
LDI R18,0x61
STS 0x100,R16
STS 0x101,R17
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 2
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
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 Mdulo Fuente contenido en el archivo .ASM es el que muestra a continuacin:

; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CDIGOS ASCII DEL NMERO 1,
; DE LA LETRA A MAYSCULA Y DE LA LETRA a MINSCULA,
; ALTERNADAMENTE.
; LA SOLUCIN UTILIZA DIRECCIONAMIENTO DIRECTO
; Y VALORES NUMRICOS 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_Settings\Administrador\Mis_documentos\
AVRfiles\Llenar\ATmega164\Llenar01\Llenar01.asm Sun Mar 22 10:35:41 2009

; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CDIGOS ASCII DEL NMERO 1,
; DE LA LETRA A MAYSCULA Y DE LA LETRA A MINSCULA,
; ALTERNADAMENTE.
; LA SOLUCIN UTILIZA DIRECCIONAMIENTO DIRECTO
; Y VALORES NUMRICOS 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
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 3
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
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

SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 4
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
El cdigo de mquina contenido en el archivo .HEX es:

:020000020000FC
:1000000001E311E421E60093000110930101209324
:100010000201009303011093040120930501009352
:100020000601109307012093080100930901109322
:080030000A0120930B01FFCF30
:00000001FF

VARIACIN DE LA PRIMERA SOLUCIN

Esta solucin utiliza direccionamiento directo y expresiones con valores numricos.

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

VARIACIN DE LA PRIMERA SOLUCIN, PERO
QUE NO CUMPLE LO SOLICITADO

Esta solucin utiliza tambin direccionamiento directo y expresiones con valores
numricos. ATENCIN: esta solucin 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
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 5
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
NUEVA VARIACIN DE LA PRIMERA SOLUCIN

Esta solucin 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 Mdulo Fuente contenido en el archivo .ASM es el que muestra a continuacin:

; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CDIGOS ASCII DEL NMERO 1
; DE LA LETRA A MAYSCULA Y DE LA LETRA a MINSCULA,
; ALTERNADAMENTE.
; LA SOLUCIN 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
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 6
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
Para asignar los valores numricos 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 Reservacin de zonas de memoria SRAM (.BYTE) y la Directiva de
Reubicacin (.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 actualizacin de los programas, porque es
ms comprensible el algoritmo implementado y es ms rpido de modificarlo, como se
ve en el siguiente Mdulo Fuente.


; PROGRAMA PARA LLENAR LAS QUINCE LOCALIDADES A PARTIR DE LA 200 HEXADECIMAL
; DE LA MEMORIA DE DATOS, CON LOS CDIGOS ASCII DEL NMERO 0
; DE LA LETRA Z MAYSCULA Y DE LA LETRA t MINSCULA,
; ALTERNADAMENTE.
; LA SOLUCIN 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 solucin, se ha incorporado la ayuda del ensamblador para obtener los cdigos
ASCII de los smbolos, nicamente colocando al smbolo entre apstrofes.

Tambin, se ha utilizado de Directiva de Reubicacin (.ORG)

SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 7
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
SEGUNDA SOLUCIN

La solucin 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 solucin 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 nmero de 16 bits en dos bytes el menos
significativo con LOW y el ms significativo con HIGH.








SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 8
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
TERCERA SOLUCIN

Esta solucin 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 solucin, radica en que el cdigo de mquina 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 CDIGOS ASCII DEL NMERO 1
; DE LA LETRA A MAYSCULA Y DE LA LETRA a MINSCULA,
; ALTERNADAMENTE.
; LA SOLUCIN 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
000006 931d ST X+,R17
000007 932d ST X+,R18
000008 930d ST X+,R16
000009 931d ST X+,R17
00000a 932d ST X+,R18
00000b 930d ST X+,R16
00000c 931d ST X+,R17
00000d 932d ST X+,R18
Cdigos de Mquina
iguales
Cdigos de Mquina
iguales
Cdigos de Mquina
iguales
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 9
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
00000e 930d ST X+,R16
00000f 931d ST X+,R17
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 solucin
eficiente mediante el uso de LAZOS DE REPETICIN

CUARTA SOLUCIN

Esta solucin utiliza direccionamiento indirecto con post incremento, expresiones con
funciones, etiquetas y un lazo de repeticin 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 Mdulo Fuente:

; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CDIGOS ASCII DEL NMERO 1
; DE LA LETRA A MAYSCULA Y DE LA LETRA a MINSCULA,
; ALTERNADAMENTE.
; LA SOLUCIN UTILIZA DIRECCIONAMIENTO INDIRECTO CON
; POST INCREMENTO, EXPRESIONES CON FUNCIONES, ETIQUETAS Y
; UN LAZO DE REPETICIN 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
;
Cdigos de Mquina
iguales
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 10
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
00000a cfff FIN: RJMP FIN
;

Lamentablemente esta solucin no cumple con lo solicitado, Llenar doce localidades;
porque, el programa sigue llenando ms localidades debido a una falla en el control del
lazo de repeticin tal como se puede ver en la siguiente prueba de escritorio.

R16 R17 R18 R26 R27 Localidades de la SRAM Comparacin 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 solucin es modificar la instruccin de comparacin por:

CPI R26,LOW(BLOQUE)+12

O, mejor:

CPI R26,LOW(BLOQUE)+NLOC



SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 11
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
QUINTA SOLUCIN

Esta solucin utiliza direccionamiento indirecto con post incremento, expresiones con
funciones, etiquetas y un lazo de repeticin 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

VARIACIN A LA QUINTA SOLUCIN

Esta variacin permite visualizar mejor el algoritmo, cuando al registro contador se
etiqueta precisamente como CONTADOR, mediante la Directiva que Define un
Nombre Simblico para un Registro (.DEF)

; PROGRAMA PARA LLENAR LAS DOCE PRIMERAS LOCALIDADES
; DE LA MEMORIA DE DATOS, CON LOS CDIGOS ASCII DEL NMERO 1
; DE LA LETRA A MAYSCULA Y DE LA LETRA a MINSCULA,
; ALTERNADAMENTE.
; LA SOLUCIN UTILIZA DIRECCIONAMIENTO INDIRECTO CON
; POST INCREMENTO, EXPRESIONES CON FUNCIONES, ETIQUETAS Y
; UN LAZO DE REPETICIN 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
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 12
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
;
.EXIT ; FIN DEL MODULO FUENTE

La ventaja de elaborar lazos de repeticin bajo este esquema, es que se pueden observar
en forma clara las tres partes que conforman el lazo de repeticin:

La inicializacin de los registros, del contador de repeticiones y del o de los
punteros, que intervienen en el lazo.
El cuerpo del lazo de repeticin, que realiza la tarea repetitiva, y
La disminucin del contador y el correspondiente chequeo para determinar el
final de las repeticiones, mediante la instruccin de bifurcacin.

A continuacin se muestra el Mdulo Fuente en el que se ha unido la solucin 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 CDIGOS ASCII DEL NMERO 1
; DE LA LETRA A MAYSCULA Y DE LA LETRA a MINSCULA,
; ALTERNADAMENTE.
; TAMBIN, DEBE LLENAR QUINCE LOCALIDADES A PARTIR DE 200 HEXADECIMAL
; DE LA MEMORIA DE DATOS, CON LOS CDIGOS ASCII DEL NMERO 0
; DE LA LETRA Z MAYSCULA Y DE LA LETRA t MINSCULA,
; ALTERNADAMENTE.
; LA SOLUCIN UTILIZA DIRECCIONAMIENTO INDIRECTO CON
; POST INCREMENTO, EXPRESIONES CON FUNCIONES, ETIQUETAS Y
; DOS LAZOS DE REPETICIN 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
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 13
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
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 solucin al problema, permite al programador crear sus propias
MACROINSTRUCCIONES, que le faciliten an ms la elaboracin de los programas.


INCLUSIN DE MACROINSTRUCCIONES EN LA
QUINTA SOLUCIN

La creacin de Macroinstrucciones consiste en agrupar un bloque de instrucciones que
forman la nueva instruccin. La condicin 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 instruccin: Se empieza por la Directiva de Encabezado de las
Macroinstrucciones (:MACRO), donde se define el nombre que le corresponde a la
nueva instruccin. A continuacin sigue el bloque de instrucciones, donde los elementos
que cambian son reemplazados por @0, @1, @2 hasta @9 y que constituyen los
parmetros que se especifican cuando se invoca a la nueva instruccin, dentro del
programa. Se termina la construccin de la nueva instruccin con la Directiva de
Finalizacin de las Macroinstrucciones (:ENDMACRO)

La invocacin de la nueva instruccin se realiza utilizando el nombre que se estableci
en la construccin, seguido de los parmetros separados por comas y en el orden que se
los numer.

A continuacin esta ilustrado la creacin de la Macroinstruccin para inicializar los
registros que se utilizan en los lazos de repeticin de la solucin, 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
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 14
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
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 cdigo de mquina, como se puede ver en el
resultado del ensamblado, que a continuacin 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
000008 932d ST X+,R18
000009 953a DEC CONTADOR
00000a f7d9 BRNE LAZO1
;
+
Cdigos de Mquina
iguales
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 15
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
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 ST X+,R18
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
repeticin tienen el mismo cdigo de mquina, lo que permite convertirles en
Subrutinas, como lo que si indica a continuacin:

INICIAR NUMERO1,MAYUSC1,MINUSC1,NLOC1,BLQ1
CALL LAZO
INICIAR NUMERO2,MAYUSC2,MINUSC2,NLOC2,BLQ2
CALL LAZO

INCLUSIN DE MACROINSTRUCCIONES Y
SUBRUTINAS EN LA QUINTA SOLUCIN

Cuando se utilizan Subrutinas es necesario inicializar el Puntero del Stack (SP) que
generalmente se lo ubica al final de la SRAM. Adems 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
;
Cdigos de Mquina
iguales
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 16
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
.CSEG
000000 ef0f LDI R16,LOW(0x04FF)
000001 9300 005e STS $5E,R16
000003 e004 LDI R16,HIGH(0x04FF)
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
;

INCLUSIN DEL ARCHIVO DE DEFINICIONES
PROPORCIONADO POR EL FABRICANTE

El fabricante proporciona el archivo m164pdef.inc, para facilitar la elaboracin de los
programas; a fin de, reemplazar los valores numricos de las direcciones de memoria
por las Etiquetas que se utilizan en las hojas de datos. En el siguiente listado se ha
reemplazado la definicin del dispositivo (.DEVICE ATMEGA164P) por la inclusin
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 lneas 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
Inicializacin del
Stack Pointer
SISTEMAS MICROPROCESADOS Ejercicio para llenar localidades de la SRAM
Pag. 17
Ing. Jaime E. Velarde Departamento de Electrnica, Telecomunicaciones y Redes de Informacin
;
;.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)
OUT SPH,R16
LDI R16,HIGH(RAMEND)
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 utilizacin de este archivo de definiciones permite escoger rpidamente el
microcontrolador con el cual se va ha trabajar, grabado el cdigo de mquina que
resulta del proceso de ensamblado. As por ejemplo, el ltimo programa en una ocasin
se desea utilizarlo con el ATmega164P y en otra con el ATmega16; una de las
diferencias entre estos microcontroladores es la direccin final de la SRAM. en el
primer caso esta direccin 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 lnea, se obtiene para cada caso los cdigos de mquina correspondientes.

Para el ATmega164P

:020000020000FC
:100000000FEF0EBF04E00DBF01E311E421E636E07F
:10001000A0E0B1E00E94150000E31AE524E737E014
:10002000A0E0B2E00E941500FFCF0D931D932D9329
:060030003A95D9F708958E
:00000001FF

Para el ATmega16

:020000020000FC
:100000000FE50EBF04E00DBF01E311E421E636E089
:10001000A0E0B1E00E94150000E31AE524E737E014
:10002000A0E0B2E00E941500FFCF0D931D932D9329
:060030003A95D9F708958E
:00000001FF

Etiquetas que se
encuentran en el archivo
de definiciones
Cdigos de Mquina
diferentes, por el cambio de
microcontrolador