Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Prctica #: _4_
Tema: Utilizacin de las herramientas de simulacin del PROTEUS con los microcontroladores
ATmega164P
Realizado por:
(Espacio Reservado)
Fecha de entrega: 2016 / 06 / 06 f. _________________________
Ao mes da Recibido por:
Sancin: ____________________________________________________
PERODO
2016 A
1) Realizar lo que el instructor solicite. Realizar un programa que nos muestre que
numero es mayor, intermedio o menor.
.include "m164pdef.inc"
.def cont = r16
.def tempo = r17
.def mayor = r18
.def intermedio = r19
.def menor = r20
.dseg
numeros: .byte 3
nummayor: .byte 1
nummedio: .byte 1
nummenor: .byte 1
.cseg
.org 0x00
ldi tempo,8
st x+,tempo
ldi tempo,15
st x+,tempo
Lazo:
ld tempo,-x
cp mayor,tempo ; compara los dos numeros
brcs cambio ; si se prende el carry tempo es mayor, si no se prende
sigue la siguiente lnea
cambio:
mov mayor,tempo; al ser mayor tempo se coloca en mayor
dec cont
breq salir
rjmp lazo
salir:
sts nummayor,mayor ; Guarda el numero mayor
; aqui se guarda el numero intermedio
ldi xh,high(numeros)
ldi xl,low(numeros)
ldi cont,2
ld intermedio,x+
lazo1:
ld tempo, x+
cp intermedio,tempo
brcc cambio2
brcs cambio3
cambio2:
mov intermedio,tempo
ld tempo,x+
cp tempo,intermedio
brcc medio
rjmp medio1
cambio3:
mov intermedio,tempo
ld tempo,x+
cp intermedio,tempo
brcs medio1
rjmp medio
medio:
sts nummedio,tempo
rjmp programa
medio1:
sts nummedio,intermedio
programa:
ldi cont,2
ld menor,x+
lazo2:
ld tempo,x+
cp menor,tempo
brcc cambio4
dec cont
brne lazo2
rjmp salir2
cambio4:
mov menor,tempo
dec cont
breq salir2 ; cuado el contador ha llegado a cero va a la etiqueta
salir2
rjmp lazo2
salir2:
sts nummenor,menor ; numero menor
fin:
rjmp fin
`
PARA MOISTRAR EN LOS DISPLAY ES NECESARIO REALIZAR
UN BARRIDO
.include "m164pdef.inc"
.def cont = r16
.def tempo = r17
.def mayor = r18
.def intermedio = r19
.def menor = r20
.def contador=r21
.dseg
numeros: .byte 3
nummayor: .byte 1
nummedio: .byte 1
nummenor: .byte 1
temph: .byte 1
templ: .byte 1
Binariol: .byte 1
Binarioh: .byte 1
Bcd0: .byte 1
Bcd1: .byte 1
Bcd2: .byte 1
Bcd3: .byte 1
Dig0: .byte 1
Dig1: .byte 1
Dig2: .byte 1
Dig3: .byte 1
.cseg
.org 0x0
//ddr
ldi tempo,0b00000000
out ddrb,tempo
ldi tempo,0b01111111
out ddra,tempo
ldi tempo,0b00001111
out ddrc,tempo
//port
ldi tempo,0b11111111
out portb,tempo
ldi tempo,0b10000000
out porta,tempo
ldi tempo,0b11110000
out portc,tempo
// ramend
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
fin:
ldi xh,high(numeros) ; inicilizamos el puntero x
ldi xl,low(numeros)
ldi tempo,8
st x+,tempo
ldi tempo,15
st x+,tempo
Lazo:
ld tempo,-x
cp mayor,tempo ; compara los dos numeros
brcs cambio ; si se prende el carry tempo es mayor, si no se prende
sigue la siguiente linea
dec cont ; analiza el siguiente numero
brne lazo ; si no son iguales va a lazo
rjmp salir
cambio:
mov mayor,tempo; al ser mayor tempo se coloca en mayor
dec cont
breq salir
rjmp lazo
salir:
sts nummayor,mayor ; Guarda el numero mayor
ldi cont,2
ld intermedio,x+
lazo1:
ld tempo, x+
cp intermedio,tempo
brcc cambio2
brcs cambio3
cambio2:
mov intermedio,tempo
ld tempo,x+
cp tempo,intermedio
brcc medio
rjmp medio1
cambio3:
mov intermedio,tempo
ld tempo,x+
cp intermedio,tempo
brcs medio1
rjmp medio
medio:
sts nummedio,tempo
rjmp programa
medio1:
sts nummedio,intermedio
programa:
ldi cont,2
ld menor,x+
lazo2:
ld tempo,x+
cp menor,tempo
brcc cambio4
dec cont
brne lazo2
rjmp salir2
cambio4:
mov menor,tempo
dec cont
breq salir2 ; cuado el contador ha llegado a cero va a la etiqueta
salir2
rjmp lazo2
salir2:
sts nummenor,menor ; numero menor
ldi xl,low(nummayor)
ldi xh,high(nummayor)
ldi contador,3
mostrar:
ld r16,x+
call Bin_bcd
call Bcd_7seg
call Barrido4
dec contador
brne mostrar
rjmp fin
Bin_bcd:
push r16
push r17
push r18
ldi r19,100
Centenas1:
sub r16,r19
brcs Decenas
inc r17; valor de centenas
rjmp Centenas1
Decenas:
add r16,r19; recupero el valor normal
sts Bcd2,r17
clr r17
Decenas1:
subi r16,10
brcs Unidades
inc r17
rjmp Decenas1
Unidades:
subi r16,-10
sts Bcd0,r16
sts Bcd1,r17
pop r18
pop r17
pop r16
ret
Bcd_7seg:
push r16
in r16,sreg // guardo variables de entrada
push r16
push r17
push zh
push zl
push xh
push xl
push yh
push yl
ldi r17,7
ldi xh,high(Bcd0)
ldi xl,low(Bcd0)
ldi yh,high(Dig0)
ldi yl,low(Dig0)
Bcd7seg_1:
ld r16,x+
ldi zh,high(Tabla_7seg<<1)
ldi zl,low(Tabla_7seg<<1)
add zl,r16
clr r16
adc zh,r16
lpm r16,z
st y+,r16
dec r17
brne Bcd7seg_1
pop yl
pop yh
pop xl
pop xh
pop zl
pop zh
pop r17
pop r16
out sreg,r16 // guardo variables de entrada
pop r16
ret
Barrido4:
push r16
in r16,sreg // guardo variables de entrada
push r16
push r17
push r18
push xh
push xl
Ldi r17,4
ldi r18,0b11111110
ldi xh,high(dig0)
ldi xl,low(dig0)
ldi r16,0b10000000
out porta,r16 //Eligo el puerto a salir
barrido_1:
ld r16,x+
out porta,r16
out portc,r18
rcall retardo
ldi r16,0b11111111
out portc,r16
sec
rol r18
dec r17
brne barrido_1
pop r18
pop xl
pop xh
pop r17
pop r16
out sreg,r16
pop r16
ret
retardo:
push r16
ldi r16,255
retardo_barrido:
dec r16
nop
brne retardo_barrido
pop r16
ret
2) Bibliografa
http://www.atmel.com/products/microcontrollers/avr/default.aspx?tab=documents