ejercicio 01 llenar

17

Click here to load reader

Upload: jaime-e-velarde

Post on 01-Jul-2015

2.142 views

Category:

Education


3 download

DESCRIPTION

Ejercicio para llenar varias localidades de SRAM, utilizando las instrucciones de transferencia con distintos Modos de direccionamiento

TRANSCRIPT

Page 1: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 1

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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

Page 2: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 2

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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_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 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

Page 3: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 3

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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

Page 4: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 4

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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

Page 5: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 5

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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

Page 6: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 6

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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)

Page 7: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 7

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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.

Page 8: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 8

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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 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

Códigos de Máquina iguales

Códigos de Máquina iguales

Códigos de Máquina iguales

Page 9: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 9

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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 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 ;

Códigos de Máquina iguales

Page 10: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 10

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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

Page 11: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 11

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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

Page 12: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 12

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

; .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

Page 13: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 13

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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

Page 14: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 14

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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 000008 932d ST X+,R18 000009 953a DEC CONTADOR 00000a f7d9 BRNE LAZO1 ; +

Códigos de Máquina iguales

Page 15: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 15

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

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 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 ;

Códigos de Máquina iguales

Page 16: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 16

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

.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 ;

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

Inicialización del Stack Pointer

Page 17: Ejercicio 01 Llenar

SISTEMAS MICROPROCESADOS – Ejercicio para llenar localidades de la SRAM Pag. 17

Ing. Jaime E. Velarde – Departamento de Electrónica, Telecomunicaciones y Redes de Información

; ;.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 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

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

Etiquetas que se encuentran en el archivo

de definiciones

Códigos de Máquina diferentes, por el cambio de

microcontrolador