You are on page 1of 90

Problemas AVR

2016
¿Qué hace este programa?

$100 DATO 0
$101 DATO 1
$102 DATO 2
LDI R29,$01
LDI R28,$10
LDI R31,$01
LDI R30,$00
$10F DATO 15
LDI R20,8

SALTO: LD R1,-Y
LD R0,Z
ST Y,R0
ST Z+,R1
DEC R20
BREQ FIN
JMP SALTO
FIN: RJMP FIN
$100 DATO 0
$101 DATO 1
$102 DATO 2
LDI R29,$01
LDI R28,$10 Y = $110
LDI R31,$01
LDI R30,$00
$10F DATO 15
LDI R20,8

SALTO: LD R1,-Y
LD R0,Z
ST Y,R0
ST Z+,R1
DEC R20
BREQ FIN
JMP SALTO
FIN: RJMP FIN
$100 DATO 0
$101 DATO 1
$102 DATO 2
LDI R29,$01
LDI R28,$10 Y = $110
LDI R31,$01
LDI R30,$00 Z = $100
$10F DATO 15
LDI R20,8 R20 = 8

SALTO: LD R1,-Y
LD R0,Z
ST Y,R0
ST Z+,R1
DEC R20
BREQ FIN
JMP SALTO
FIN: RJMP FIN
$100 DATO 0
$101 DATO 1
$102 DATO 2
LDI R29,$01
LDI R28,$10 Y = $110
LDI R31,$01
LDI R30,$00 Z = $100
$10F DATO 15
LDI R20,8 R20 = 8

SALTO: LD R1,-Y Y = $10F ; R1 = DATO 15


LD R0,Z R0 = DATO 0
ST Y,R0
ST Z+,R1
DEC R20
BREQ FIN
JMP SALTO
FIN: RJMP FIN
$100 DATO 15
$101 DATO 1
$102 DATO 2
LDI R29,$01
LDI R28,$10 Y = $110
LDI R31,$01
LDI R30,$00 Z = $100
$10F DATO 0
LDI R20,8 R20 = 8

SALTO: LD R1,-Y Y = $10F ; R1 = DATO 15


LD R0,Z R0 = DATO 0
ST Y,R0 MEM($10F) = DATO 0
ST Z+,R1 MEM($100) = DATO 15 ; Z = $101
DEC R20 R20 = 7
BREQ FIN
JMP SALTO
FIN: RJMP FIN
$100 DATO 15
$101 DATO 1
$102 DATO 2
LDI R29,$01
LDI R28,$10 Y = $110
LDI R31,$01
LDI R30,$00 Z = $100
$10F DATO 0
LDI R20,8 R20 = 8

SALTO: LD R1,-Y Y = $10F ; R1 = DATO 15


LD R0,Z R0 = DATO 0
ST Y,R0 MEM($10F) = DATO 0
ST Z+,R1 MEM($100) = DATO 15 ; Z = $101
DEC R20 R20 = 7
BREQ FIN Salta a FIN si R20 = 0
JMP SALTO Salta a SALTO
FIN: RJMP FIN Acaba
$100 DATO 15
$101 DATO 1
$102 DATO 2
LDI R29,$01
LDI R28,$10 Y = $110
LDI R31,$01
LDI R30,$00 Z = $100
$10F DATO 0
LDI R20,8 R20 = 8

SALTO: LD R1,-Y Y = $10E ; R1 = DATO 14


LD R0,Z R0 = DATO 1
ST Y,R0
ST Z+,R1
DEC R20
BREQ FIN
JMP SALTO
FIN: RJMP FIN
$100 DATO 15
$101 DATO 14
$102 DATO 2
LDI R29,$01
LDI R28,$10 Y = $110
LDI R31,$01
LDI R30,$00 Z = $100 $10E DATO 1
$10F DATO 0
LDI R20,8 R20 = 8

SALTO: LD R1,-Y Y = $10E ; R1 = DATO 14


LD R0,Z R0 = DATO 1
ST Y,R0 MEM($10E) = DATO 1
ST Z+,R1 MEM($101) = DATO 14 ; Z = $102
DEC R20
BREQ FIN
JMP SALTO
FIN: RJMP FIN
$100 DATO 15
$101 DATO 14
$102 DATO 2
LDI R29,$01
LDI R28,$10 Y = $110
LDI R31,$01
LDI R30,$00 Z = $100 $10E DATO 1
$10F DATO 0
LDI R20,8 R20 = 8

SALTO: LD R1,-Y Y = $10E ; R1 = DATO 14


LD R0,Z R0 = DATO 1
ST Y,R0 MEM($10F) = DATO 0
ST Z+,R1 MEM($100) = DATO 15 ; Z = $101
DEC R20 R20 = 6
BREQ FIN Salta a FIN si R20 = 0
JMP SALTO Salta a SALTO
FIN: RJMP FIN Acaba
Dada una tabla, con
16 datos, invierte el
orden de la misma. $100 DATO 15
$101 DATO 14
$102 DATO 13
LDI R29,$01
LDI R28,$10 Y = $110
LDI R31,$01
LDI R30,$00 Z = $100 $10E DATO 1
$10F DATO 0
LDI R20,8 R20 = 8

SALTO: LD R1,-Y Y = $10E ; R1 = DATO 14


LD R0,Z R0 = DATO 1
ST Y,R0 MEM($10F) = DATO 0
ST Z+,R1 MEM($100) = DATO 15 ; Z = $101
DEC R20 R20 = 6
BREQ FIN Salta a FIN si R20 = 0
JMP SALTO Salta a SALTO
FIN: RJMP FIN Acaba
ETC…
LDI R20,1
LDI R27,$02 $200 DATO 0
LDI R26,$00 X = $200 $201 DATO 1
LD R2,X $202 DATO 2
LD R0,X+
SALTO: LD R1,X+
CP R1,R0
BRSH SALTO2
MOV RO,R1 $23E DATO 62
SALTO2: CP R1,R2 $23F DATO 63
BRLO SALTO3
MOV R2,R1
SALTO3: INC R20
CPI R20,63
¿Qué hace este programa?
BREQ FIN
JMP SALTO
FIN: STS $300,R2
STS $301,R0
STOP: RJMP STOP
LDI R20,1
LDI R27,$02 $200 DATO 0
LDI R26,$00 X = $200 $201 DATO 1
LD R2,X $202 DATO 2
LD R0,X+
SALTO: LD R1,X+
CP R1,R0
BRSH SALTO2 (salta si R1>R0)
MOV RO,R1 (guarda en R0 el menor) $23E DATO 62
SALTO2: CP R1,R2 $23F DATO 63
BRLO SALTO3 (salta si R1<R2)
MOV R2,R1 (guarda en R2 el mayor)
SALTO3: INC R20
CPI R20,63 Dada una tabla, con 64
BREQ FIN datos sin signo, almacena en
JMP SALTO $300 el mayor de todos y en
FIN: STS $300,R2 $301 el menor de todos.
STS $301,R0
STOP: RJMP STOP
Problema 1
Sean A y B dos números sin signo de un byte, almacenados en las direcciones
$0100 y $0101 respectivamente. Escriba un fragmento de programa que obtenga
la suma de ambos números y almacene el resultado (16 bits) en las dos siguientes
posiciones de memoria
LDI R16,30
STS $100,R16
LDI R16,128
STS $101,R16
LDI R17,0
STS $103,R17

LDS R16,$100 ; R16  A


LDS R18,$101 ; R18  B

ADD R16,R18
STS $102,R16
BRCC FIN
LDI R17,1
STS $103,R17

FIN RJMP FIN


Problema 2
Sean A y B dos números sin signo de un byte, almacenados en las direcciones
$0100 y $0101 respectivamente. Escriba un fragmento de programa que obtenga
la multiplicación de ambos números y almacene el resultado (16 bits) en las dos
siguientes posiciones de memoria.
LDI R16,128
STS $100,R16
LDI R16,3
STS $101,R16

LDS R16,$100 ; R16  A


LDS R17,$101 ; R17  B
MUL R16,R17

STS $102,R0
STS $103,R1

FIN RJMP FIN


Problema 3
Escriba un fragmento de programa que sume tres números sin signo de 1 byte,
almacenados consecutivamente a partir de la posición $0100 de la SRAM, y
guarde el resultado (16bits) a partir de la dirección $0200.
LDI R16,30 ;dato A
STS $100,R16
LDI R16,128 ;dato B
STS $101,R16
LDI R18,5 ;dato C
STS $102,R18
LDI R17,0
STS $201,R17

ADD R16,R18 ;B + C
STS $200,R16
BRCC SALTO
LDI R17,1
STS $201,R17
SALTO LDS R18,$100 ;dato A
ADD R16,R18 ;B + C + A
STS $200,R16
BRCC FIN
INC R17
FIN RJMP FIN
Problema 4
Escriba un fragmento de programa que sume tres números con signo de 1 byte,
almacenados consecutivamente a partir de la posición $0100 de la SRAM, y
guarde el resultado (16bits) a partir de la dirección $0200.
IDEA: En los números con signo hay que extender el signo

DATO (8 bits)

Signo

0 0 0 0 0 0 0 0 0 …………………….
Signo

1 1 1 1 1 1 1 1 1 …………………….
Signo
LDI R26,0
LDI R27,1 ; X = $100
LD R18,X+ ; R18, parte baja de la suma
LDI R19,0 ; R19, parte alta de la suma
SBRC R18,7
LDI R19,$FF ; Extensión de signo
LD R16,X+ ; R16, parte baja registro temporal
LDI R17,0 ; R17, parte alta registro temporal
SBRC R16,7
LDI R17,$FF
ADD R18,R16
ADC R19,R17
LD R16,X+
LDI R17,0
SBRC R16,7
LDI R17,$FF
ADD R18,R16 ;
ADC R19,R17

STS $0200,R18
STS $0201,R19
FIN RJMP FIN
LDI XL,0
LDI XH,1 ; X = $100
LD SUMAL,X+ ; SUMAL, parte baja de la suma
LDI SUMAH,0 ; SUMAH, parte alta de la suma
SBRC SUMAL,7
LDI SUMAH,$FF ; Extensión de signo
LD TEMPL,X+ ; TEMPL, parte baja registro temporal
LDI TEMPH,0 ; TEMPH, parte alta registro temporal
SBRC TEMPL,7
LDI TEMPH,$FF
ADD SUMAL,TEMPL
ADC SUMAH,TEMPH
LD TEMPL,X+
LDI TEMPH,0
SBRC TEMPL,7
LDI TEMPH,$FF
ADD SUMAL,TEMPL
ADC SUMAH,TEMPH

STS $0200,SUMAL
STS $0201,SUMAH
FIN RJMP FIN
LDI XL,0
LDI XH,1 ; X = $100
LD SUMAL,X+ ; SUMAL, parte baja de la suma
LDI SUMAH,0 ; SUMAH, parte alta de la suma
SBRC SUMAL,7
LDI SUMAH,$FF ; Extensión de signo
LD TEMPL,X+ ; TEMPL, parte baja registro temporal
LDI TEMPH,0 ; TEMPH, parte alta registro temporal
SBRC TEMPL,7
LDI TEMPH,$FF
ADD SUMAL,TEMPL
ADC SUMAH,TEMPH
LD TEMPL,X+
LDI TEMPH,0
SBRC TEMPL,7
LDI TEMPH,$FF
ADD SUMAL,TEMPL
ADC SUMAH,TEMPH

STS $0200,SUMAL
STS $0201,SUMAH
FIN RJMP FIN
.include “m328pdef.inc”
.DEF TEMPL=R16
.DEF TEMPH=R17
.DEF SUMAL=R18
.DEF SUMAH=R19

LDI XL,0
LDI XH,1 ; X = $100
LD SUMAL,X+ ; SUMAL, parte baja de la suma
LDI SUMAH,0 ; SUMAH, parte alta de la suma
SBRC SUMAL,7
LDI SUMAH,$FF ; Extensión de signo
LD TEMPL,X+ ; TEMPL, parte baja registro temporal
LDI TEMPH,0 ; TEMPH, parte alta registro temporal
SBRC TEMPL,7
LDI TEMPH,$FF
ADD SUMAL,TEMPL
ADC SUMAH,TEMPH
LD TEMPL,X+
LDI TEMPH,0
SBRC TEMPL,7
LDI TEMPH,$FF
ADD SUMAL,TEMPL
ADC SUMAH,TEMPH

STS $0200,SUMAL
STS $0201,SUMAH
FIN RJMP FIN
Problema 4 B
Modifica el programa del problema 4 para sumar ahora los datos de una tabla de
10 números con signo de 1 byte, almacenados consecutivamente a partir de la
posición $0100 de la SRAM, y guarde el resultado (16bits) a partir de la dirección
$0200.
.include “m328pdef.inc”
.DEF TEMPL=R16
.DEF TEMPH=R17
.DEF SUMAL=R18
.DEF SUMAH=R19
.DEF CONT=R20

LDI XL,0
LDI XH,1 ; X = $100
LD SUMAL,X+ ; SUMAL, parte baja de la suma
LDI SUMAH,0 ; SUMAH, parte alta de la suma
SBRC SUMAL,7
LDI SUMAH,$FF ; Extensión de signo
LDI CONT,9
BUCLE LD TEMPL,X+ ; TEMPL, parte baja registro temporal
LDI TEMPH,0 ; TEMPH, parte alta registro temporal
SBRC TEMPL,7
LDI TEMPH,$FF
ADD SUMAL,TEMPL
ADC SUMAH,TEMPH
DEC CONT
BRNE BUCLE

STS $0200,SUMAL
STS $0201,SUMAH
FIN RJMP FIN
Problema 5
A partir de la dirección $0100 de la SRAM se encuentra almacenado un mensaje
de comunicaciones que se ha recibido por el puerto serie. La longitud del mensaje
viene indicado en el segundo byte de dicho mensaje (máx. 255 bytes). El último
byte del mensaje es una suma de comprobación (CHECKSUM) del mensaje
completo. Programe una subrutina que devuelva en R0=$00 si el mensaje recibido
es correcto, o R0=$FF si se ha detectado un error (suma de comprobación
incorrecta).

LONGITUD CHECKSUM

$100 $101 $102 $103 ETC. $ULTIMO

NOTA: no tener en cuenta overflow


LDI R26,$00
LDI R27,$01
CLR R16
LDS R17,$101
LD R16,X+

BUCLE LD R18,X+
ADD R16,R18
DEC R17
CPI R17,2
BRNE BUCLE

LD R18,X
CP R16,R18
BREQ OK
LDI R18,$FF
MOV R0,R18
RET

OK CLR R0
RET
Se suman todos menos el último
Con directivas:           .DEF SUMA=R16
.DEF CONTADOR=R17
.DEF TEMP=R18

LDI R26,$00 LDI R26,$00


LDI R27,$01 LDI R27,$01
CLR R16 CLR SUMA
LDS R17,$101 LDS CONTADOR,$101
LD R16,X+ LD SUMA,X+

BUCLE LD R18,X+ BUCLE LD TEMP,X+


ADD R16,R18 ADD SUMA,TEMP
DEC R17 DEC CONTADOR
CPI R17,2 CPI CONTADOR,2
BRNE BUCLE BRNE BUCLE

LD R18,X LD TEMP,X
CP R16,R18 CP SUMA,TEMP
BREQ OK BREQ OK
LDI R18,$FF LDI TEMP,$FF
MOV R0,R18 MOV R0,TEMP
RET RET

OK CLR R0 OK CLR R0
RET RET
Problema 6
Escriba un programa que traslade una tabla de 16 bytes almacenada en la
dirección $100 a la posición $200.
.EQU NUMDATOS=16
.DEF TEMP=R17
.DEF CONTADOR=R16

LDI CONTADOR,NUMDATOS
LDI R26,$00
LDI R27,$01
LDI R28,$00
LDI R29,$02
BUCLE LD TEMP,X+
ST Y+,TEMP
DEC CONTADOR
CPI CONTADOR,0
BRNE BUCLE

FIN RJMP FIN


Problema 7
a) Escriba una subrutina que traslade una tabla de datos de una posición a otra de
memoria. El número de datos a trasladar se indica en R16, y los registros X e Y
indican las direcciones fuente y destino respectivamente.
b) Resuelva el problema 6 utilizando la subrutina del apartado a.
a)
.DEF TEMP=R17
.DEF CONTADOR=R16

MAIN CALL MUEVETABLA


FIN RJMP FIN

MUEVETABLA PUSH TEMP ; Por si guarda un valor interesante

BUCLE LD TEMP,X+
ST Y+,TEMP
DEC CONTADOR
CPI CONTADOR,0
BRNE BUCLE

POP TEMP
RET
b)
.INCLUDE “m328pdef.inc”
.DEF TEMP=R17
.DEF CONTADOR=R16

MAIN LDI XL,$00


LDI XH,$01
LDI YL,$00
LDI YH,$02
CALL MUEVETABLA
FIN RJMP FIN

MUEVETABLA PUSH TEMP

BUCLE LD TEMP,X+
ST Y+,TEMP
DEC CONTADOR
CPI CONTADOR,0
BRNE BUCLE

POP TEMP
RET
Problema 8
Escriba un fragmento de programa que cargue en R0 el elemento menor de una
tabla de 16 números sin signo de 1 byte almacenados a partir de la dirección
$0100.

Ver resuelto el segundo problema del principio de esta presentación.


(No el Problema 2)
.include “m328pdef.inc”
.equ tamtabla=16 $100 DATO 0
.def contador=r16 $101 DATO 1
.def temp=r17 $102 DATO 2
.def menor=r0

main ldi contador,tamtabla


ldi xl,$00
ldi xh,$01 $10E DATO 14
subi contador,1 $10F DATO 15
ld menor,x+

sigue ld temp,x+
cp menor,temp
brlo esmenor
mov menor,temp
esmenor dec contador
brne sigue
stop rjmp stop
Problema 9
Escriba una subrutina que devuelva en R0 el elemento menor de una tabla de
números con signo de 1 byte. La dirección de comienzo de la tabla se indica en el
registro X, y el número de datos en R16. Utilice esta subrutina para resolver el
problema 8.
.include “m328pdef.inc”
.equ tamtabla=16
.def contador=r16 $100 DATO 0
.def temp=r17 $101 DATO 1
.def menor=r0 $102 DATO 2

main call buscamenor


fin rjmp fin

buscamenor ldi contador,tamtabla $10E DATO 14


ldi xl,$00 $10F DATO 15
ldi xh,$01
subi contador,1
ld menor,x+

sigue ld temp,x+
cp menor,temp
brlt esmenor
mov menor,temp
esmenor dec contador
brne sigue
ret
Problema 10
Haga un programa que escriba a partir de la dirección $0100, todos los números
impares existentes entre el 0 y el 255.
.include “m328pdef.inc”
.def dato=r16
.def intervalo=r17

main ldi xl,$00


ldi xh,$01
ldi dato,1
ldi intervalo,2

bucle st x+,dato
add dato,intervalo
cpi dato,255
breq ultimo
rjmp bucle
ultimo st x,dato ;(el 255 también)
fin rjmp fin
Problema 11
Una tabla con 100 datos de 1 byte con signo está almacenada a partir de la
dirección $0100. Escriba un programa que almacene en R0 el número de datos
positivos que hay en dicha tabla, y en R1 el número de datos negativos.
Problema 11
Una tabla con 100 datos de 1 byte con signo está almacenada a partir de la
dirección $0100. Escriba un programa que almacene en R0 el número de datos
positivos que hay en dicha tabla, y en R1 el número de datos negativos.

include "m328pdef.inc "


.def TEMP=R20

LDI R19,100
LDI XL,$00
LDI XH,$01
CLR R0
CLR R1
SALTO: LD TEMP,X+
LSL TEMP ;bit de signo  C
BRCS NEGATIVO ;si C=1  negativo
INC R0
RJMP SIGO
NEGATIVO: INC R1
SIGO: DEC R19
BRNE SALTO
FIN: RJMP FIN
Problema 12
Una tabla con 16 datos de 1 byte está almacenada a partir de la dirección $0100.
Escriba un programa que invierta el orden de la misma.

IDEA: Ver resuelto el primer problema del principio de esta presentación.


(No el Problema 1)
Problema 13
Escriba una subrutina que invierta el orden de datos de una tabla. El número de
datos (de 1 byte) se indica en R16, y la dirección de comienzo de la tabla en X.
Problema 14
Se tiene una tabla de 10 números con signo de 1 byte almacenados a partir de la
dirección $0200. Escriba un fragmento de programa que ordene la tabla de mayor
a menor (algoritmo de la burbuja).
Usaremos el método de la burbuja: comparamos dos valores
adyacentes y el mayor de ellos se coloca en la posición de memoria
más baja de los dos.

El número total de comparaciones será para N datos:


N-1 comparaciones, N-1 de veces, es decir, un total de (N-1)2
comparaciones

Ejemplo con N=4

DATO Comp. Comp. Comp. Comp. Comp. Comp. Comp. Comp. Comp. MEM
1A 2A 3A 1B 2B 3B 1C 2C 3C
1 5 5 5 5 5 5 6 6 6 $34

5 1 2 2 2 6 6 5 5 5 $35

2 2 1 6 6 2 2 2 2 2 $36

6 6 6 1 1 1 1 1 1 1 $37
.include “m328pdef.inc”
.equ numdatos=10
.def numvueltas=r20
.def cont=r17
.def a=r1
.def b=r2

main ldi cont,numdatos


subi cont,1 ;(datos -1)
bucle1 ldi xl,$00
ldi xh,$02
ldi yl,$01
ldi yh,$02
ldi numvueltas,numdatos
subi numvueltas,1 ;(datos-1)

bucle2 ld a,x
ld b,y
cp a,b
brge sigue
st x,b
st y,a
sigue adiw xh:xl,1 ;(x  x + 1)
adiw yh:yl,1 ;(y  y + 1)
subi numvueltas,1
brne bucle2
subi cont,1
brne bucle1
fin rjmp fin
Problema 15
Programe una subrutina que ordene, por el método de la burbuja, una tabla de
números con signo de 1 byte. El número de datos se indica con R16, y la dirección
de la tabla con el registro X.
.include “m328pdef.inc”
.equ dirdato1tablaL=$00
.equ dirdato1tablaH=$02
.def numdatos=r16
.def numvueltas=r20
.def cont=r17

ORDENA mov cont,numdatos


subi cont,1 ;(datos -1)
bucle1 ldi xl,dirdato1L
ldi xh,dirdato1H
mov yl,xl
mov yh,xh
adiw yh:yl,1 ;(y  y+1)
mov numvueltas,numdatos
subi numvueltas,1 ;(datos-1)
bucle2 ld r1,x
ld r2,y
cp r1,r2
brge sigue
st x,r2
st y,r1
sigue adiw xh:xl,1 ;(x  x + 1)
adiw yh:yl,1 ;(y  y + 1)
subi numvueltas,1
brne bucle2
subi cont,1
brne bucle1
fin ldi xl,dirdato1L
ldi xh,dirdato1H
ret
Problema 16
Programe una subrutina que obtenga la mediana de una tabla de datos de 1 byte.
El número de datos se indica con R16, y la dirección de la tabla con el registro X.
Si llamamos ORDENA a la subrutina del problema anterior, tendremos en R16 el nº
de datos y en X la dirección de memoria del primer dato de la tabla ya ordenada.

.include “m328pdef.inc”

mediana CALL ORDENA


ASR R16 R16 = Nºdatos/2
ADD XL,R16
BRCC SALTO
INC XH
SALTO LD R2,X Paso la mediana a R2
STS $200,R2 Almaceno la mediana en $200
RET
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15
LDI R17,19
PUSH R16
INC R16
STS $100,R16
STS $105,R17
LDI R29,$01
LDI R28,$00
LD R0,Y+
LDD R1,Y+4
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19
PUSH R16
INC R16
STS $100,R16
STS $105,R17
LDI R29,$01
LDI R28,$00
LD R0,Y+
LDD R1,Y+4
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16
INC R16
STS $100,R16
STS $105,R17
LDI R29,$01
LDI R28,$00
LD R0,Y+
LDD R1,Y+4
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16
STS $100,R16
STS $105,R17
LDI R29,$01
LDI R28,$00
LD R0,Y+
LDD R1,Y+4
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16 16
STS $100,R16
STS $105,R17
LDI R29,$01
LDI R28,$00
LD R0,Y+
LDD R1,Y+4
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16 16
STS $100,R16 $100 16
STS $105,R17
LDI R29,$01
LDI R28,$00
LD R0,Y+
LDD R1,Y+4
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16 16
STS $100,R16 $100 16
STS $105,R17 $105 19
LDI R29,$01
LDI R28,$00
LD R0,Y+
LDD R1,Y+4
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16 16
STS $100,R16 $100 16
STS $105,R17 $105 19
LDI R29,$01 $01
LDI R28,$00
LD R0,Y+
LDD R1,Y+4
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16 16
STS $100,R16 $100 16
STS $105,R17 $105 19
LDI R29,$01 $01
LDI R28,$00 $00
LD R0,Y+
LDD R1,Y+4
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16 16
STS $100,R16 $100 16
STS $105,R17 $105 19
LDI R29,$01 $01
LDI R28,$00 $00
LD R0,Y+ 16 $01
LDD R1,Y+4
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16 16
STS $100,R16 $100 16
STS $105,R17 $105 19
LDI R29,$01 $01
LDI R28,$00 $00
LD R0,Y+ 16 $01
LDD R1,Y+4 19
MUL R16,R17
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16 16
STS $100,R16 $100 16
STS $105,R17 $105 19
LDI R29,$01 $01
LDI R28,$00 $00
LD R0,Y+ 16 $01
LDD R1,Y+4 19
MUL R16,R17 $30 $1
POP R28
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16 16
STS $100,R16 $100 16
STS $105,R17 $105 19
LDI R29,$01 $01
LDI R28,$00 $00
LD R0,Y+ 16 $01
LDD R1,Y+4 19
MUL R16,R17 $30 $1
POP R28 15 $4FF
MOV R29,R16
Problema 17
Para el siguiente fragmento de programa de AVR, indique los registros y posiciones
de memoria que se ven afectados por el siguiente fragmento de código, sabiendo
que el valor inicial del registro SP es $04FF.

R0 R1 R16 R17 R28 R29 SP MEM [MEM]


LDI R16,15 15
LDI R17,19 19
PUSH R16 $4FE $4FF 15
INC R16 16
STS $100,R16 $100 16
STS $105,R17 $105 19
LDI R29,$01 $01
LDI R28,$00 $00
LD R0,Y+ 16 $01
LDD R1,Y+4 19
MUL R16,R17 $30 $1
POP R28 15 $4FF
MOV R29,R16 16
Problema 18
Escriba una subrutina que permita saber si un dato de 8 bits corresponde o no a un
número BCD de dos dígitos. La subrutina analiza el dato suministrado en el
registro R16 y devuelve R0=$00 si el dato es BCD y R0=$FF si no es BCD.
Ningún registro, salvo R0 debe verse modificado tras la ejecución de la subrutina.
Problema 18
Escriba una subrutina que permita saber si un dato de 8 bits corresponde o no a un
número BCD de dos dígitos. La subrutina analiza el dato suministrado en el
registro R16 y devuelve R0=$00 si el dato es BCD y R0=$FF si no es BCD.
Ningún registro, salvo R0 debe verse modificado tras la ejecución de la subrutina.

BCD ldi r16,$56


mov r17,r16
mov r18,r16
andi r18,$0F
cpi r18,$A
brlo si1
no: ser r20
mov r0,r20
rjmp fin
si1: andi r17,$F0
cpi r17,$A0
brlo si2
rjmp no
si2: clr r0
fin: ret
Problema 18
Escriba una subrutina que permita saber si un dato de 8 bits corresponde o no a un
número BCD de dos dígitos. La subrutina analiza el dato suministrado en el
registro R16 y devuelve R0=$00 si el dato es BCD y R0=$FF si no es BCD.
Ningún registro, salvo R0 debe verse modificado tras la ejecución de la subrutina.

ldi r16,$56
mov r17,r16
BCD push r16 mov r18,r16
push r17 andi r18,$0F
push r18 cpi r18,$A
push r20 brlo si1
.......... no: ser r20
.......... mov r0,r20
fin: pop r20 rjmp fin
pop r18 si1: andi r17,$F0
pop r17 cpi r17,$A0
pop r16 brlo si2
ret rjmp no
si2: clr r0
Problema 19
En las direcciones $100 Y $101 se encuentran almacenados dos números sin
signo de 1 byte. Escriba un programa para el AVR que almacene en R0 el valor
absoluto de la resta de ambos números.
Problema 19
En las direcciones $100 Y $101 se encuentran almacenados dos números sin
signo de 1 byte. Escriba un programa para el AVR que almacene en R0 el valor
absoluto de la resta de ambos números.

LDS R10,$100
LDS R11,$101

CP R10,R11
BRLO SALTO

SUB R10,R11
MOV R0,R10
RJMP FIN

SALTO: SUB R11,R10


MOV R0,R11
FIN: RJMP FIN
Problema 20
Escriba una subrutina POTENCIA que calcule 2n (con n < 16). El exponente se
pasa a la subrutina en el registro R16. La subrutina devuelve en R1:R0 el
resultado.
Problema 20
Escriba una subrutina POTENCIA que calcule 2n (con n < 16). El exponente se
pasa a la subrutina en el registro R16. La subrutina devuelve en R1:R0 el
resultado.
LDI R16,n
CALL POTENCIA
FIN: RJMP FIN

POTENCIA: PUSH R20


PUSH R21
LDI R20,1
LDI R21,0
MOV R1,R21
MOV R0,R20
CPI R16,0
BREQ FIN
SIGO: CLC
ROL R0
ROL R1
DEC R16
BRNE SIGO
FIN: POP R21
POP R20
RET
Problema 21
Indique el contenido final de los registros de propósito general que se modifican al
ejecutar el código siguiente:

LDI R31,0
LDI R30,$0F
ADIW Z,2
LDI R16,1
MOV R17,R16
INC R17
LD R0,Z+
Problema 21
Indique el contenido final de los registros de propósito general que se modifican al
ejecutar el código siguiente:

R31
LDI R31,0 $00
LDI R30,$0F
ADIW Z,2
LDI R16,1
MOV R17,R16
INC R17
LD R0,Z+
Problema 21
Indique el contenido final de los registros de propósito general que se modifican al
ejecutar el código siguiente:

R31 R30
LDI R31,0 $00
LDI R30,$0F $0F
ADIW Z,2
LDI R16,1
MOV R17,R16
INC R17
LD R0,Z+
Problema 21
Indique el contenido final de los registros de propósito general que se modifican al
ejecutar el código siguiente:

R31 R30
LDI R31,0 $00
LDI R30,$0F $0F
ADIW Z,2 $00 $11
LDI R16,1
MOV R17,R16
INC R17
LD R0,Z+
Problema 21
Indique el contenido final de los registros de propósito general que se modifican al
ejecutar el código siguiente:

R31 R30 R16


LDI R31,0 $00
LDI R30,$0F $0F
ADIW Z,2 $00 $11
LDI R16,1 $01
MOV R17,R16
INC R17
LD R0,Z+
Problema 21
Indique el contenido final de los registros de propósito general que se modifican al
ejecutar el código siguiente:

R31 R30 R16 R17


LDI R31,0 $00
LDI R30,$0F $0F
ADIW Z,2 $00 $11
LDI R16,1 $01
MOV R17,R16 $01
INC R17
LD R0,Z+
Problema 21
Indique el contenido final de los registros de propósito general que se modifican al
ejecutar el código siguiente:

R31 R30 R16 R17


LDI R31,0 $00
LDI R30,$0F $0F
ADIW Z,2 $00 $11
LDI R16,1 $01
MOV R17,R16 $01
INC R17 $02
LD R0,Z+
Problema 21
Indique el contenido final de los registros de propósito general que se modifican al
ejecutar el código siguiente:

R31 R30 R16 R17 R0


LDI R31,0 $00
LDI R30,$0F $0F
ADIW Z,2 $00 $11
LDI R16,1 $01
MOV R17,R16 $01
INC R17 $02
LD R0,Z+ $00 $12 $02

¡OJO!
Se carga en R0 lo que hay en memoria direccionado por el registro Z. El contenido
de Z es $0011 que en el mapa de memoria corresponde con el registro R17.
Problema 22
Se conecta un pulsador al pin 6 del puerto B. Hacer un programa para el AVR que
establezca el pin 6 del puerto B como entrada. Que active la resistencia de “pull-
up” de ese pin y que cuente en un registro R20 cuántas veces se ha pulsado dicho
pulsador. IMPORTANTE: Si el pulsador sigue pulsado sólo debe contar una vez.
Problema 22
Se conecta un pulsador al pin 6 del puerto B. Hacer un programa para el AVR que
establezca el pin 6 del puerto B como entrada. Que active la resistencia de “pull-
up” de ese pin y que cuente en un registro R20 cuántas veces se ha pulsado dicho
pulsador. IMPORTANTE: Si el pulsador sigue pulsado sólo debe contar una vez.

.INCLUDE "m328pdef.inc"

LDI R20,0
CBI DDRB,6 ;pin6 (B) como entrada
SBI PORTB,6 ;activo “pull-up” del pin 6 (B)

SALTO: SBIC PINB,6


RJMP SALTO
INC R20

SALTO2: SBIS PINB,6 ; por si el pulsador sigue


RJMP SALTO2 ; pulsado
RJMP SALTO
Problema 23
a) Hacer una subrutina, llamada DIVISION, que divida el DIVIDENDO (que debe
estar en R20) entre el DIVISOR (que debe estar en R21). El resultado de la
división será el COCIENTE en R0 y el RESTO en R1. Hacer la división por el
método de “restas sucesivas”, para números sin signo.
b) Dada una tabla de 32 datos de 8 bits, situados en la SRAM a prtir de la posición
$100, calcular, usando la subrutina DIVISION, cuántos de ellos son múltiplos de
5. Guardar el resultado en la dirección $200 de la SRAM.
Problema 23
a) Hacer una subrutina, llamada DIVISION, que divida el DIVIDENDO (que debe
estar en R20) entre el DIVISOR (que debe estar en R21). El resultado de la
división será el COCIENTE en R0 y el RESTO en R1. Hacer la división por el
método de “restas sucesivas”, para números sin signo.

.include"m328pdef.inc"
.def DIVIDENDO=R20
.def DIVISOR=R21
.def COCIENTE=R0
.def RESTO=R1

LDI DIVIDENDO,22
LDI DIVISOR,5
CALL DIVISION
FIN: RJMP FIN

DIVISION: CLR COCIENTE


MOV RESTO,DIVIDENDO
CP RESTO,DIVISOR
BRSH SIGUE
RJMP FIN
SIGUE: SUB RESTO,DIVISOR
INC COCIENTE
CP RESTO,DIVISOR
BRSH SIGUE
FIN: RET
Problema 23
b) Dada una tabla de 32 datos de 8 bits, situados en la SRAM a partir de la posición
$100, calcular, usando la subrutina DIVISION, cuántos de ellos son múltiplos de 5.
Guardar el resultado en la dirección $200 de la SRAM.
LDI R25,0
LDI R24,NUMDATOS
LDI XH,$01
.include"m328pdef.inc" LDI XL,$00
.def DIVIDENDO=R20 LDI DIVISOR,5
.def DIVISOR=R21
.def COCIENTE=R0 ARRIBA: LD DIVIDENDO,X+
.def RESTO=R1
.equ NUMDATOS=32 CALL DIVISION
MOV R23,RESTO
CPI R23,0
BRNE NOMULTIPLO
INC R25
NOMULTIPLO: DEC R24
BRNE ARRIBA

STS $200,R25
STOP: RJMP STOP

DIVISION: CLR COCIENTE


MOV RESTO,DIVIDENDO
CP RESTO,DIVISOR
BRSH SIGUE
RJMP FIN
SIGUE: SUB RESTO,DIVISOR
INC COCIENTE
CP RESTO,DIVISOR
BRSH SIGUE
FIN: RET
Dados dos números de 8 bits sin signo, N1 y N2 (por LDI),
obtener su multiplicación. Si el bit más significativo del
resultado es “1” colocar todos los pines del puerto B a “1”.
En caso contrario almacenar el resultado de la
multiplicación a partir de la posición $300 de la memoria de
datos.
LDI R20,N1
LDI R19,N2
MUL R19,R20
SBRS R1,7
JMP SOL
LDI R18,$FF
OUT DDRB,R18
OUT PORTB,R18
JMP FIN
SOL: STS $301,R1
STS $300,R0
FIN: RJMP FIN

Dados dos números de 8 bits sin signo, N1 y N2 (por LDI),


obtener su multiplicación. Si el bit más significativo del
resultado es “1” colocar todos los pines del puerto B a “1”.
En caso contrario almacenar el resultado de la
multiplicación a partir de la posición $300 de la memoria de
datos.
; prueba PORT

.include "m328pdef.inc"

LDI R20,29 ; N1
LDI R19,14 ; N2

SUB R20,R19
BRLT SALTO
LDI R18,$FF
OUT DDRB,R18
OUT PORTB,R20
RJMP FIN
SALTO: CLR R5
OUT DDRD,R5

FIN: RJMP FIN


; prueba PORT

.include "m328pdef.inc"

LDI R20,29 ; N1
LDI R19,14 ; N2

SUB R20,R19
BRLT SALTO
LDI R18,$FF
OUT DDRB,R18
OUT PORTB,R20
RJMP FIN
SALTO: CLR R5
OUT DDRD,R5

FIN: RJMP FIN


Si N1 < N2 el puerto D se configura como entrada
Si N1 >= N2 el puerto B se configura como salida y muestra el valor de la diferencia (N1 – N2)

You might also like