Problemas AVR 2016
¿Qué hace este programa?
LDI LDI LDI LDI LDI SALTO: SALTO:
FIN:
$100 $10 0 $101 $10 1 $102 $10 2
DATO DATO 0 DATO DATO 1 DATO DATO 2
$10F
DATO DATO 15
R29,$01 R28,$10 R31,$01 R30,$00 R20,8
LD R1,-Y LD R0,Z ST Y,R0 ST Z+,R1 DEC R20 BREQ FIN JMP SALTO RJMP FIN
LDI LDI LDI LDI LDI SALTO: SALTO:
FIN:
R29,$01 R28,$10 R31,$01 R30,$00 R20,8
LD R1,-Y LD R0,Z ST Y,R0 ST Z+,R1 DEC R20 BREQ FIN JMP SALTO RJMP FIN
$100 $10 0 $101 $10 1 $102 $10 2
DATO DATO 0 DATO DATO 1 DATO DATO 2
$10F
DATO DATO 15
Y = $110
LDI LDI LDI LDI LDI SALTO:
FIN:
R29,$01 R28,$10 R31,$01 R30,$00 R20,8
LD R1,-Y LD R0,Z ST Y,R0 ST Z+,R1 DEC R20 BREQ FIN JMP SALTO RJMP FIN
$100 $101 $102
DATO 0 DATO 1 DATO 2
$10F
DATO 15
Y = $110 Z = $100 R20 = 8
LDI LDI LDI LDI LDI SALTO:
FIN:
R29,$01 R28,$10 R31,$01 R30,$00 R20,8
LD R1,-Y LD R0,Z ST Y,R0 ST Z+,R1 DEC R20 BREQ FIN JMP SALTO RJMP FIN
$100 $101 $102
DATO 0 DATO 1 DATO 2
$10F
DATO 15
Y = $110 Z = $100 R20 = 8 Y = $10F ; R1 = DATO 15 R0 = DATO 0
LDI LDI LDI LDI LDI SALTO:
FIN:
R29,$01 R28,$10 R31,$01 R30,$00 R20,8
LD R1,-Y LD R0,Z ST Y,R0 ST Z+,R1 DEC R20 BREQ FIN JMP SALTO RJMP FIN
$100 $101 $102
DATO 15 DATO 1 DATO 2
$10F
DATO 0
Y = $110 Z = $100 R20 = 8 Y = $10F ; R1 = DATO 15 R0 = DATO 0 MEM($10F) = DATO 0 MEM($100) = DATO 15 ; Z = $101 R20 = 7
LDI LDI LDI LDI LDI SALTO:
FIN:
R29,$01 R28,$10 R31,$01 R30,$00 R20,8
LD R1,-Y LD R0,Z ST Y,R0 ST Z+,R1 DEC R20 BREQ FIN JMP SALTO RJMP FIN
$100 $101 $102
DATO 15 DATO 1 DATO 2
$10F
DATO 0
Y = $110 Z = $100 R20 = 8 Y = $10F ; R1 = DATO 15 R0 = DATO 0 MEM($10F) = DATO 0 MEM($100) = DATO 15 ; Z = $101 R20 = 7 Salta a FIN si R20 = 0 Salta a SALTO Acaba
LDI LDI LDI LDI LDI SALTO:
FIN:
R29,$01 R28,$10 R31,$01 R30,$00 R20,8
LD R1,-Y LD R0,Z ST Y,R0 ST Z+,R1 DEC R20 BREQ FIN JMP SALTO RJMP FIN
$100 $101 $102
DATO 15 DATO 1 DATO 2
$10F
DATO 0
Y = $110 Z = $100 R20 = 8 Y = $10E ; R1 = DATO 14 R0 = DATO 1
SALTO:
FIN:
LDI LDI LDI LDI
R29,$01 R28,$10 R31,$01 R30,$00
LDI
R20,8
LD R1,-Y LD R0,Z ST Y,R0 ST Z+,R1 DEC R20 BREQ FIN JMP SALTO RJMP FIN
$100 $101 $102
DATO 15 DATO 14 DATO 2
$10E $10F
DATO 1 DATO 0
Y = $110 Z = $100 R20 = 8 Y = $10E ; R1 = DATO 14 R0 = DATO 1 MEM($10E) = DATO 1 MEM($101) = DATO 14 ; Z = $102
SALTO:
FIN:
LDI LDI LDI LDI
R29,$01 R28,$10 R31,$01 R30,$00
LDI
R20,8
LD R1,-Y LD R0,Z ST Y,R0 ST Z+,R1 DEC R20 BREQ FIN JMP SALTO RJMP FIN
$100 $101 $102
DATO 15 DATO 14 DATO 2
$10E $10F
DATO 1 DATO 0
Y = $110 Z = $100 R20 = 8 Y = $10E ; R1 = DATO 14 R0 = DATO 1 MEM($10F) = DATO 0 MEM($100) = DATO 15 ; Z = $101 R20 = 6 Salta a FIN si R20 = 0 Salta a SALTO Acaba
Dada una tabla, con 16 datos, invierte el orden de la misma.
SALTO:
FIN:
$100 $101 $102
DATO 15 DATO 14 DATO 13
$10E $10F
DATO 1 DATO 0
LDI LDI LDI LDI
R29,$01 R28,$10 R31,$01 R30,$00
LDI
R20,8
R20 = 8
LD LD ST ST DEC BREQ JMP RJMP
R1,-Y R0,Z Y,R0 Z+,R1 R20 FIN SALTO FIN
Y = $10E ; R1 = DATO 14 R0 = DATO 1 MEM($10F) = DATO 0 MEM($100) = DATO 15 ; Z = $101 R20 = 6 Salta a FIN si R20 = 0 Salta a SALTO Acaba
Y = $110 Z = $100
ETC…
LDI LDI LDI LD LD SALTO: LD CP BRSH MOV SALTO2: CP BRLO MOV SALTO3: INC CPI BREQ JMP FIN: STS STS STOP: RJMP
R20,1 R27,$02 R26,$00 R2,X R0,X+ R1,X+ R1,R0 SALTO2 RO,R1 R1,R2 SALTO3 R2,R1 R20 R20,63 FIN SALTO $300,R2 $301,R0 STOP
X = $200
$200 $201 $202
DATO 0 DATO 1 DATO 2
$23E $23F
DATO 62 DATO 63
¿Qué hace este programa?
LDI LDI LDI LD LD SALTO: LD CP BRSH MOV SALTO2: CP BRLO MOV SALTO3: INC CPI BREQ JMP FIN: STS STS STOP: RJMP
R20,1 R27,$02 R26,$00 R2,X R0,X+ R1,X+ R1,R0 SALTO2 RO,R1 R1,R2 SALTO3 R2,R1 R20 R20,63 FIN SALTO $300,R2 $301,R0 STOP
X = $200
(salta si R1>R0) (guarda en R0 el menor)
$200 $201 $202
DATO 0 DATO 1 DATO 2
$23E $23F
DATO 62 DATO 63
(salta si R1
Dada una tabla, con 64 datos sin signo, almacena en $300 el mayor de todos y en $301 el menor de todos.
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
FIN
LDI STS LDI STS LDI STS
R16,30 $100,R16 R16,128 $101,R16 R17,0 $103,R17
LDS LDS
R16,$100 R18,$101
ADD STS BRCC LDI STS
R16,R18 $102,R16 FIN R17,1 $103,R17
RJMP
FIN
; R16 ; R18
A B
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.
FIN
LDI STS LDI STS
R16,128 $100,R16 R16,3 $101,R16
LDS LDS MUL
R16,$100 R17,$101 R16,R17
STS STS
$102,R0 $103,R1
RJMP
FIN
; R16 ; R17
A B
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 STS LDI STS LDI STS LDI STS ADD STS BRCC LDI STS SALTO LDS ADD STS BRCC INC FIN RJMP
R16,30 $100,R16 R16,128 $101,R16 R18,5 $102,R18 R17,0 $201,R17 R16,R18 $200,R16 SALTO R17,1 $201,R17 R18,$100 R16,R18 $200,R16 FIN R17 FIN
;dato A ;dato B ;dato C
;B + C
;dato A ;B + C + A
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
…………………….
FIN
LDI LDI LD LDI SBRC LDI LD LDI SBRC LDI ADD ADC LD LDI SBRC LDI ADD ADC
R26,0 R27,1 R18,X+ R19,0 R18,7 R19,$FF R16,X+ R17,0 R16,7 R17,$FF R18,R16 R19,R17 R16,X+ R17,0 R16,7 R17,$FF R18,R16 ; R19,R17
STS STS RJMP
$0200,R18 $0201,R19 FIN
; X = $100 ; R18, parte baja de la suma ; R19, parte alta de la suma
; Extensión de signo ; R16, parte baja registro temporal ; R17, parte alta registro temporal
FIN
LDI LDI LD LDI SBRC LDI LD LDI SBRC LDI ADD ADC LD LDI SBRC LDI ADD ADC
XL,0 XH,1 SUMAL,X+ SUMAH,0 SUMAL,7 SUMAH,$FF TEMPL,X+ TEMPH,0 TEMPL,7 TEMPH,$FF SUMAL,TEMPL SUMAH,TEMPH TEMPL,X+ TEMPH,0 TEMPL,7 TEMPH,$FF SUMAL,TEMPL SUMAH,TEMPH
STS STS RJMP
$0200,SUMAL $0201,SUMAH FIN
; X = $100 ; SUMAL, parte baja de la suma ; SUMAH, parte alta de la suma
; Extensión de signo ; TEMPL, parte baja registro temporal ; TEMPH, parte alta registro temporal
FIN
LDI LDI LD LDI SBRC LDI LD LDI SBRC LDI ADD ADC LD LDI SBRC LDI ADD ADC
XL,0 XH,1 SUMAL,X+ SUMAH,0 SUMAL,7 SUMAH,$FF TEMPL,X+ TEMPH,0 TEMPL,7 TEMPH,$FF SUMAL,TEMPL SUMAH,TEMPH TEMPL,X+ TEMPH,0 TEMPL,7 TEMPH,$FF SUMAL,TEMPL SUMAH,TEMPH
STS STS RJMP
$0200,SUMAL $0201,SUMAH FIN
; X = $100 ; SUMAL, parte baja de la suma ; SUMAH, parte alta de la suma ; Extensión de signo ; TEMPL, parte baja registro temporal ; TEMPH, parte alta registro temporal
.include “m328pdef.inc”
.DEF .DEF .DEF .DEF
FIN
TEMPL=R16 TEMPH=R17 SUMAL=R18 SUMAH=R19 LDI LDI LD LDI SBRC LDI LD LDI SBRC LDI ADD ADC LD LDI SBRC LDI ADD ADC
XL,0 XH,1 SUMAL,X+ SUMAH,0 SUMAL,7 SUMAH,$FF TEMPL,X+ TEMPH,0 TEMPL,7 TEMPH,$FF SUMAL,TEMPL SUMAH,TEMPH TEMPL,X+ TEMPH,0 TEMPL,7 TEMPH,$FF SUMAL,TEMPL SUMAH,TEMPH
STS STS RJMP
$0200,SUMAL $0201,SUMAH FIN
; X = $100 ; SUMAL, parte baja de la suma ; SUMAH, parte alta de la suma ; Extensión de signo ; TEMPL, parte baja registro temporal ; TEMPH, parte alta registro temporal
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 .DEF .DEF .DEF .DEF
TEMPL=R16 TEMPH=R17 SUMAL=R18 SUMAH=R19 CONT=R20
BUCLE
LDI LDI LD LDI SBRC LDI LDI LD LDI SBRC LDI ADD ADC DEC BRNE
XL,0 XH,1 SUMAL,X+ SUMAH,0 SUMAL,7 SUMAH,$FF CONT,9 TEMPL,X+ TEMPH,0 TEMPL,7 TEMPH,$FF SUMAL,TEMPL SUMAH,TEMPH CONT BUCLE
STS STS RJMP
$0200,SUMAL $0201,SUMAH FIN
FIN
; X = $100 ; SUMAL, parte baja de la suma ; SUMAH, parte alta de la suma ; Extensión de signo ; TEMPL, parte baja registro temporal ; TEMPH, parte alta registro temporal
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
$100
$101
CHECKSUM
$102
$103
NOTA: no tener en cuenta overflow
ETC.
$ULTIMO
LDI LDI CLR LDS LD
R26,$00 R27,$01 R16 R17,$101 R16,X+
BUCLE LD ADD DEC CPI BRNE
R18,X+ R16,R18 R17 R17,2 BUCLE
LD CP BREQ LDI MOV RET
R18,X R16,R18 OK R18,$FF R0,R18
CLR RET
R0
OK
Se suman todos menos el último
Con directivas:
BUCLE
OK
LDI LDI CLR LDS LD
R26,$00 R27,$01 R16 R17,$101 R16,X+
LD ADD DEC CPI BRNE
R18,X+ R16,R18 R17 R17,2 BUCLE
LD CP BREQ LDI MOV RET
R18,X R16,R18 OK R18,$FF R0,R18
CLR RET
R0
BUCLE
OK
.DEF .DEF .DEF
SUMA=R16 CONTADOR=R17 TEMP=R18
LDI LDI CLR LDS LD
R26,$00 R27,$01 SUMA CONTADOR,$101 SUMA,X+
LD ADD DEC CPI BRNE
TEMP,X+ SUMA,TEMP CONTADOR CONTADOR,2 BUCLE
LD CP BREQ LDI MOV RET
TEMP,X SUMA,TEMP OK TEMP,$FF R0,TEMP
CLR RET
R0
Problema 6 Escriba un programa que traslade una tabla de 16 bytes almacenada en la dirección $100 a la posición $200.
BUCLE
FIN
.EQU .DEF .DEF
NUMDATOS=16 TEMP=R17 CONTADOR=R16
LDI LDI LDI LDI LDI LD ST DEC CPI BRNE
CONTADOR,NUMDATOS R26,$00 R27,$01 R28,$00 R29,$02 TEMP,X+ Y+,TEMP CONTADOR CONTADOR,0 BUCLE
RJMP
FIN
P r oblema oblema 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 .DEF
TEMP=R17 CONTADOR=R16
MAIN FIN
CALL RJMP
MUEVE TABLA MUEVET FIN
MUEVETABLA MUEVETABLA
PUSH
TEMP
BUCLE
LD ST DEC CPI BRNE
TEMP,X+ TEMP,X+ Y+,TEMP CONTADOR CONTADOR,0 BUCLE
POP RET
TEMP
; Por si guarda un valor interesante
b) .INCLUDE .DEF .DEF
“m328pdef.inc”
FIN
LDI LDI LDI LDI CALL RJMP
XL,$00 XH,$01 YL,$00 YH,$02 MUEVETABLA FIN
MUEVETABLA MUEVETABLA
PUSH
TEMP
BUCLE
LD ST DEC CPI BRNE
TEMP,X+ TEMP,X+ Y+,TEMP CONTADOR CONTADOR,0 BUCLE
POP RET
TEMP
MAIN
TEMP=R17 CONTADOR=R16
P roblema 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)
main
sigue
esmenor stop
.include .equ .def .def .def
tamtabla=16 contador=r16 temp=r17 menor=r0
ldi ldi ldi subi ld
contador,tamtabla contador,tamtabla xl,$00 xh,$01 contador,1 menor,x+
ld cp brlo mov dec brne rjmp
temp,x+ menor,temp esmenor menor,temp contador sigue stop
“m328pdef.inc”
$100 $10 0 $101 $10 1 $102 $10 2
DATO DATO 0 DATO DATO 1 DATO DATO 2
$10E $10F
DATO DATO 14 DATO DATO 15
P roblema 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 .equ .def .def .def
tamtabla=16 contador=r16 temp=r17 menor=r0
main fin
call rjmp
buscamenor fin
buscamenor
ldi ldi ldi subi ld
contador,tamtabla xl,$00 xh,$01 contador,1 menor,x+
sigue
ld cp brlt mov dec brne ret
temp,x+ menor,temp esmenor menor,temp contador sigue
esmenor
“m328pdef.inc”
$100 $101 $102
DATO 0 DATO 1 DATO 2
$10E $10F
DATO 14 DATO 15
P roblema 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 ldi ldi ldi
xl,$00 xh,$01 dato,1 intervalo,2
bucle
st add cpi breq rjmp st rjmp
x+,dato dato,intervalo dato,255 ultimo bucle x,dato fin
ultimo fin
;(el 255 también)
P roblema 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.
P roblema 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
SALTO:
NEGATIVO: SIGO:
FIN:
LDI R19,100 LDI XL,$00 LDI XH,$01 CLR R0 CLR R1 LD TEMP,X+ LSL TEMP BRCS NEGATIVO INC R0 RJMP SIGO INC R1 DEC R19 BRNE SALTO RJMP FIN
;bit de signo C ;si C=1 negativo
P roblema 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)
P roblema 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.
P roblema 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. 1A 2A 3A 1B 2B 3B 1C 2C 3C
MEM
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
main bucle1
bucle2
sigue
fin
.include .equ .def .def .def .def
numdatos=10 numvueltas=r20 cont=r17 a=r1 b=r2
ldi subi ldi ldi ldi ldi ldi subi
cont,numdatos cont,1 xl,$00 xh,$02 yl,$01 yh,$02 numvueltas,numdatos numvueltas,1
ld ld cp brge st st adiw adiw subi brne subi brne rjmp
a,x b,y a,b sigue x,b y,a xh:xl,1 yh:yl,1 numvueltas,1 bucle2 cont,1 bucle1 fin
“m328pdef.inc”
;(datos -1)
;(datos-1)
;(x ;(y
x + 1) y + 1)
P roblema 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.
ORDENA bucle1
bucle2
sigue
fin
.include .equ .equ .def .def .def
“m328pdef.inc”
mov subi ldi ldi mov mov adiw mov subi ld ld cp brge st st adiw adiw subi brne subi brne ldi ldi
cont,numdatos cont,1 xl,dirdato1L xh,dirdato1H yl,xl yh,xh yh:yl,1 numvueltas,numdatos numvueltas,1 r1,x r2,y r1,r2 sigue x,r2 y,r1 xh:xl,1 yh:yl,1 numvueltas,1 bucle2 cont,1 bucle1 xl,dirdato1L xh,dirdato1H
dirdato1tablaL=$00 dirdato1tablaH=$02 numdatos=r16 numvueltas=r20 cont=r17
;(datos -1)
;(y
y+1)
;(datos-1)
;(x ;(y
x + 1) y + 1)
P roblema 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
SALTO
CALL ASR ADD BRCC INC LD STS RET
ORDENA R16 XL,R16 SALTO XH R2,X $200,R2
R16 = Nºdatos/2
Paso la mediana a R2 Almaceno la mediana en $200
P roblema 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 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
R1
R16
R17
R28
R29 SP
MEM
[MEM]
P roblema 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 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
R1
R16 15
R17
R28
R29 SP
MEM
[MEM]
P roblema 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 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
R1
R16
R17
15 19
R28
R29 SP
MEM
[MEM]
P roblema 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 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
R1
R16
R17
R28
R29 SP
MEM
[MEM]
$4FF
15
15 19 $4FE
P roblema 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 LDI R16,15
R1
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
R29 SP
MEM
[MEM]
$4FF
15
19
PUSH R16 STS $100,R16
R28
15
LDI R17,19 INC R16
R17
$4FE 16
P roblema 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 LDI R16,15
R1
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
R29 SP
MEM
[MEM]
$4FF
15
$100
16
19
PUSH R16 STS $100,R16
R28
15
LDI R17,19 INC R16
R17
$4FE 16
P roblema 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
MEM
[MEM]
$4FF
15
STS $100,R16
$100
16
STS $105,R17
$105
19
LDI R16,15
R1
R16
LDI R28,$00 LD R0,Y+ LDD R1,Y+4 MUL R16,R17 POP R28 MOV R29,R16
R29 SP
19
PUSH R16
LDI R29,$01
R28
15
LDI R17,19 INC R16
R17
$4FE 16
P roblema 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
MEM
[MEM]
$4FF
15
STS $100,R16
$100
16
STS $105,R17
$105
19
LDI R16,15
R1
R16
R17
R28
R29 SP
15
LDI R17,19
19
PUSH R16 INC R16
LDI R29,$01 LDI R28,$00 LD R0,Y+ LDD R1,Y+4 MUL R16,R17 POP R28 MOV R29,R16
$4FE 16
$01
P roblema 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
MEM
[MEM]
$4FF
15
STS $100,R16
$100
16
STS $105,R17
$105
19
LDI R16,15
R1
R16
R17
R28
R29 SP
15
LDI R17,19
19
PUSH R16 INC R16
$4FE 16
LDI R29,$01 LDI R28,$00 LD R0,Y+ LDD R1,Y+4 MUL R16,R17 POP R28 MOV R29,R16
$01 $00
P roblema 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
MEM
[MEM]
$4FF
15
STS $100,R16
$100
16
STS $105,R17
$105
19
LDI R16,15
R1
R16
R17
R28
R29 SP
15
LDI R17,19
19
PUSH R16
$4FE
INC R16
16
LDI R29,$01
$01
LDI R28,$00 LD R0,Y+ LDD R1,Y+4 MUL R16,R17 POP R28 MOV R29,R16
$00 16
$01
P roblema 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
MEM
[MEM]
$4FF
15
STS $100,R16
$100
16
STS $105,R17
$105
19
LDI R16,15
R16
R17
R28
R29 SP
15
LDI R17,19
19
PUSH R16
$4FE
INC R16
16
LDI R29,$01
$01
LDI R28,$00 LD R0,Y+ LDD R1,Y+4 MUL R16,R17 POP R28 MOV R29,R16
$00 16
$01 19
P roblema 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
MEM
[MEM]
$4FF
15
STS $100,R16
$100
16
STS $105,R17
$105
19
LDI R16,15
R16
R17
R28
R29 SP
15
LDI R17,19
19
PUSH R16
$4FE
INC R16
16
LDI R29,$01
$01
LDI R28,$00 LD R0,Y+
$00 16
LDD R1,Y+4 MUL R16,R17 POP R28 MOV R29,R16
$01 19
$30
$1
P roblema 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
MEM
[MEM]
$4FF
15
STS $100,R16
$100
16
STS $105,R17
$105
19
LDI R16,15
R16
R17
R28
R29 SP
15
LDI R17,19
19
PUSH R16
$4FE
INC R16
16
LDI R29,$01
$01
LDI R28,$00 LD R0,Y+
$00 16
LDD R1,Y+4 MUL R16,R17 POP R28 MOV R29,R16
$01 19
$30
$1 15
$4FF
P roblema 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
MEM
[MEM]
$4FF
15
STS $100,R16
$100
16
STS $105,R17
$105
19
LDI R16,15
R16
R17
R28
R29 SP
15
LDI R17,19
19
PUSH R16
$4FE
INC R16
16
LDI R29,$01
$01
LDI R28,$00 LD R0,Y+
$00 16
LDD R1,Y+4 MUL R16,R17 POP R28 MOV R29,R16
$01 19
$30
$1 15
$4FF 16
P roblema 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.
P roblema 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
no:
si1:
si2: fin:
ldi r16,$56 mov r17,r16 mov r18,r16 andi r18,$0F cpi r18,$A brlo si1 ser r20 mov r0,r20 rjmp fin andi r17,$F0 cpi r17,$A0 brlo si2 rjmp no clr r0 ret
P roblema 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
fin:
push r16 push r17 push r18 push r20 .......... .......... pop r20 pop r18 pop r17 pop r16 ret
no:
si1:
si2:
ldi r16,$56 mov r17,r16 mov r18,r16 andi r18,$0F cpi r18,$A brlo si1 ser r20 mov r0,r20 rjmp fin andi r17,$F0 cpi r17,$A0 brlo si2 rjmp no clr r0
P roblema 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.
P roblema 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: FIN:
SUB R11,R10 MOV R0,R11 RJMP FIN
P roblema 20 Escriba una subrutina POTENCIA que calcule 2 n (con n < 16). El exponente se pasa a la subrutina en el registro R16. La subrutina devuelve en R1:R0 el resultado.
P roblema 20 Escriba una subrutina POTENCIA que calcule 2 n (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:
SIGO:
FIN:
PUSH R20 PUSH R21 LDI R20,1 LDI R21,0 MOV R1,R21 MOV R0,R20 CPI R16,0 BREQ FIN CLC ROL R0 ROL R1 DEC R16 BRNE SIGO POP R21 POP R20 RET
P roblema 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+
P roblema 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 LDI R30,$0F ADIW Z,2 LDI R16,1 MOV R17,R16 INC R17 LD R0,Z+
$00
P roblema 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 LDI R30,$0F ADIW Z,2 LDI R16,1 MOV R17,R16 INC R17 LD R0,Z+
R30
$00 $0F
P roblema 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+
R30 $0F
$00
$11
P roblema 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
LDI R16,1 MOV R17,R16 INC R17 LD R0,Z+
R16
$00
LDI R30,$0F ADIW Z,2
R30 $0F
$00
$11 $01
P roblema 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
LDI R16,1 MOV R17,R16 INC R17 LD R0,Z+
R16
R17
$00
LDI R30,$0F ADIW Z,2
R30 $0F
$00
$11 $01 $01
P roblema 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
LDI R16,1
R16
R17
$00
LDI R30,$0F ADIW Z,2
R30 $0F
$00
$11 $01
MOV R17,R16
$01
INC R17
$02
LD R0,Z+
P roblema 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
R16
R17
$0F $00
$11
LDI R16,1
$01
MOV R17,R16
$01
INC R17
$02
LD R0,Z+
R0
$00
LDI R30,$0F ADIW Z,2
R30
$00
$12
$02
¡ OJ O! 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.
P roblema 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.
P roblema 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 SBI PORTB,6 SALTO:
SBIC PINB,6 RJMP SALTO INC R20
SALTO2:
SBIS PINB,6 RJMP SALTO2 RJMP SALTO
;pin6 (B) como entrada ;activo “pull-up” del pin 6 (B)
; por si el pulsador sigue ; pulsado
P roblema 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.
P roblema 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
FIN:
DIVISION:
SIGUE:
FIN:
LDI DIVIDENDO,22 LDI DIVISOR,5 CALL DIVISION RJMP FIN
CLR COCIENTE MOV RESTO,DIVIDENDO CP RESTO,DIVISOR BRSH SIGUE RJMP FIN SUB RESTO,DIVISOR INC COCIENTE CP RESTO,DIVISOR BRSH SIGUE RET
P roblema 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.
.include"m328pdef.inc" .def DIVIDENDO=R20 .def DIVISOR=R21 .def COCIENTE=R0 .def RESTO=R1 .equ NUMDATOS=32
LDI R25,0 LDI R24,NUMDATOS LDI XH,$01 LDI XL,$00 LDI DIVISOR,5 ARRIBA:
NOMULTIPLO:
STOP: DIVISION:
SIGUE:
FIN:
LD DIVIDENDO,X+ CALL DIVISION MOV R23,RESTO CPI R23,0 BRNE NOMULTIPLO INC R25 DEC R24 BRNE ARRIBA STS $200,R25 RJMP STOP CLR COCIENTE MOV RESTO,DIVIDENDO CP RESTO,DIVISOR BRSH SIGUE RJMP FIN SUB RESTO,DIVISOR INC COCIENTE CP RESTO,DIVISOR BRSH SIGUE 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.
SOL: FIN:
LDI LDI MUL SBRS JMP LDI OUT OUT JMP STS STS RJMP
R20,N1 R19,N2 R19,R20 R1,7 SOL R18,$FF DDRB,R18 PORTB,R18 FIN $301,R1 $300,R0 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"
SALTO:
FIN:
LDI LDI
R20,29 ; N1 R19,14 ; N2
SUB BRLT LDI OUT OUT RJMP CLR OUT
R20,R19 SALTO R18,$FF DDRB,R18 PORTB,R20 FIN R5 DDRD,R5
RJMP
FIN