Avr Problem Ab
Avr Problem Ab
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
ADD R16,R18
STS $102,R16
BRCC FIN
LDI R17,1
STS $103,R17
STS $102,R0
STS $103,R1
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
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
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
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
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.
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
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
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.
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.
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
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
.include “m328pdef.inc”
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
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:
¡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)
.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
STS $200,R25
STOP: RJMP STOP
.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
.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