Está en la página 1de 15

ESCUELA POLITÉCNICA NACIONAL

FACULTAD DE INGENIERÍA ELÉCTRICA


Y ELECTRÓNICA

LABORATORIO DE
SISTEMAS MICROPROCESADOS

TRABAJO PREPARATORIO

Práctica No: 10
Tema: Sistemas de numeración, conversiones
y aritmética binaria
LSM-11

Realizado por: Priscila Flores Carrera

Fecha de Entrega: 17/01/2019

Semestre 2018B
LABORATORIO DE SISTEMAS MICROPROCESADOS

PRÁCTICA Nº 10

1. TEMA : CONVERSOR ANALOGO/DIGITAL

2. OBJETIVO: Implementar un sistema micro controlado que funcione simultáneamente como


voltímetro digital o termómetro utilizando conversor A/D del micro controlador ATMega164p.

3. PREPARATORIO
.def tempo=r16
.def tempo1=r17
.def aux=r18
.def conta=r19
.def uni_de=r20
.def cen_mil=r21
.def aux2=r22
.def conta1=r23
.def aux1=r24

.dseg
selec: .byte 1
selec2: .byte 1
medida_l: .byte 1
medida_h: .byte 1
volt_l: .byte 1
volt_h: .byte 1
c1: .byte 1
c2: .byte 1
c3: .byte 1
c4: .byte 1
binariol: .byte 1
binarioh: .byte 1
BCD0: .byte 1 ;valor binario M,D,C,U
BCD1: .byte 1
BCD2: .byte 1
BCD3: .byte 1
SEG0: .byte 1 ;valores que debo visualizar
SEG1: .byte 1
SEG2: .byte 1
SEG3: .byte 1
led: .byte 1

.cseg
.org 0x00
rjmp inicio
.org 0x02
rjmp tipo
.org 0x04
rjmp tipo2

inicio:
//config puertos
ldi tempo,0b00111100
out ddra,tempo
ldi tempo,0b11000000
out porta,tempo

ldi tempo,255
out ddrb,tempo
ldi tempo,0b10000011
out ddrd,tempo
ldi tempo,0
out portb,tempo
ldi tempo,0b01111100
out portd,tempo
ldi tempo,255
out ddrc,tempo
com tempo
out portc,tempo
in tempo,MCUCR
andi tempo,0b11101111
out mcucr,tempo

//inicializar el StackPointer
ldi tempo,high(RAMEND)
out sph,tempo
ldi tempo,low(RAMEND)
out spl,tempo

//config INT0 y int1


ldi tempo,0b00001010
sts EICRA,tempo
ldi tempo,0b00000011 ;no habilito la interrupcion
out EIMSK,tempo
ldi tempo,0b11111111 ;banderas en bajo
out EIFR,tempo

sei
ldi tempo,0b00000011
sts didr0,tempo

lazo: lds tempo,selec


cpi tempo,0
breq voltimetro
cpi tempo,255
breq termometro
rjmp lazo

tipo: lds tempo,selec


com tempo
sts selec,tempo
reti

tipo2:
lds tempo1,selec2
com tempo1
sts selec2,tempo1
reti

voltimetro:
//config ADC
ldi tempo,0b01000000
sts admux,tempo

ldi tempo,0b11000100
sts adcsra,tempo

espera: lds tempo,ADCSRA


sbrc tempo,6
rjmp espera

//leer los valores de la conversion ADCH y ADCL


lds tempo,ADCL
sts medida_l,tempo
out portb,tempo

lds tempo,ADCH
sts medida_h,tempo
out portd,tempo

;coeficiente a multiplicar para el voltaje


ldi tempo,low(5000)
sts volt_l,tempo
ldi tempo,high(5000)
sts volt_h,tempo
;multiplicacion para el valor del display
rcall multiplicar
rcall desplazar
rcall bin_bcd3
rcall bcd_7seg
rcall barrido
rjmp lazo
farenheit3:
rjmp farenheit2

termometro: lds tempo1,selec2


cpi tempo1,255
breq farenheit3
ldi tempo,0b10000001
sts admux,tempo
ldi tempo,0b11000100
sts adcsra,tempo

espera1: lds tempo,ADCSRA


sbrc tempo,6
rjmp espera1

//leer los valores de la conversion ADCH y ADCL


lds tempo,ADCL
sts medida_l,tempo

lds tempo,ADCH
sts medida_h,tempo

;coeficiente a multiplicar para el voltaje


ldi tempo,low(11000)
sts volt_l,tempo
ldi tempo,high(11000)
sts volt_h,tempo
;multiplicacion para el valor del display
rcall multiplicar
rcall desplazar
rcall bin_bcd3
rcall maximo
rcall bcd_7seg
rcall barrido2
rcall condicional
rjmp lazo
maximo: lds tempo,binarioh
cpi tempo,39
brsh uno
reti
uno: lds tempo,binariol
cpi tempo,6
brsh maxi
reti
maxi: ldi tempo,9
sts bcd0,tempo
sts bcd1,tempo
sts bcd2,tempo
sts bcd3,tempo
reti
multiplicar: push tempo
in tempo,sreg
push tempo

lds tempo,medida_l
lds r17,volt_l
mul tempo,r17
sts c1,r0 ;parte baja 1_0 de 32 bits
mov r2,r1 ;coef suma para C2

lds tempo,medida_l
lds r17,volt_h
mul tempo,r17
mov r3,r0 ;coef suma para c2
mov r4,r1 ;coef suma para c3

lds tempo,medida_h
lds r17,volt_l
mul tempo,r17
mov r5,r0 ;coef suma para c2
mov r6,r1 ;coef suma para c3

lds tempo,medida_h
lds r17,volt_h
mul tempo,r17
mov r7,r0 ;coef suma para c3
mov r8,r1 ;coef suma para c4

;para c2
add r2,r3
adc r2,r5
sts c2,r2 ;parte baja1_1
;para c3
adc r4,r6
adc r4,r7
sts c3,r4 ;parte alta2_0
;para c4
clr tempo
adc r8,tempo
sts c4,r8 ;parte alta2_0

pop tempo
out sreg,tempo
pop tempo
reti

desplazar: push tempo


in tempo,sreg
push tempo
push r17
push r18
push r19
push r23

clr r23
ldi r23,10

lds r19,c4
lds r18,c3
lds r17,c2
lds r16,c1
/*ldi r19,0
ldi r18,0b00100110
ldi r17,0b01011011
ldi r16,0b00100100
*/
lazo2: clc
ror r19
ror r18
ror r17
ror r16
dec r23
cpi r23,0
breq salida
rjmp lazo2

salida: sts binariol,r16


sts binarioh,r17

pop r23
pop r19
pop r18
pop r17
pop tempo
out sreg,tempo
pop tempo

reti

//conversion de binario a bcd


bin_bcd3:
push r16 ;guardo estados
in r16,sreg
in r17,sreg
push r16
push r17
push r19

lds r16,binarioh ;retomo los valores guardados en la


sram
lds r17,binariol
clr uni_de ;limpio registros
clr cen_mil
clr conta1
clr r18
clr r19
clr aux1
clr conta1
ldi conta,3 ;defino una valor constante
lazo_1:
lsl r17 ;desplazamientos
rol r16
rol uni_de
rol cen_mil
cpi aux1,15
breq salir1
call comprobar1 ;compruebo los valores desplazados
mov uni_de,aux
call comprobar2
mov cen_mil,aux

condicion: inc conta1 ;utilizo el algoritmo del


prepa 3
inc aux1
cpi conta1,16
breq salir1
rjmp lazo_1
comprobar1:
call parte_baja
call parte_alta
ret
parte_baja: mov aux,uni_de
andi aux,0b00001111
call sumar1
ret
sumar1: add aux,conta
cpi
aux,8
brsh
sumar11
sub
aux,conta
ret

sumar11: ret
parte_alta: mov aux2,uni_de
andi aux2,0b11110000
swap aux2
call sumar2
ret
sumar2: add aux2,conta
cpi
aux2,8
brsh
sumar_22
sub
aux2,conta
swap
aux2
add
aux,aux2
ret

sumar_22: swap aux2

add aux,aux2

ret
salir1: rjmp salir ;se utiliza debido a que el salto es muy largo
comprobar2:
call parte_baja2
call parte_alta2
ret
parte_baja2: mov aux,cen_mil
andi aux,0b00001111
call sumar3
ret
sumar3: add
aux,conta

cpi aux,8

brsh sumar33

sub aux,conta

ret

sumar33: ret
parte_alta2: mov aux2,cen_mil
andi aux2,0b11110000
swap aux2
call sumar4
ret
sumar4: add
aux2,conta

cpi aux2,8
brsh sumar_44

sub aux2,conta

swap aux2

add aux,aux2

ret

sumar_44: swap aux2

add aux,aux2

ret
salir: mov aux,uni_de ;guardo valores conertidos
andi aux,0b00001111 ;mascara para sacar el valor bajo
sts BCD0,aux ;paso el valor bajo a la sram
mov aux,uni_de
andi aux,0b11110000 ;mascara para sacar el valor alto
swap aux ;cambio alto por bajo
sts BCD1,aux ;paso el valor a la sram
mov aux,cen_mil
andi aux,0b00001111 ;mascara para sacar el valor bajo
sts BCD2,aux ;paso el valor a la sram
mov aux,cen_mil
andi aux,0b11110000 ;mascara para sacar el valor alto
swap aux ;cambio alto por bajo
sts BCD3,aux ;paso el valor a la sram
pop r19
pop r17
pop r16
out sreg,r17
out sreg,r16
pop r16
ret

//subrutina bcd_7seg
bcd_7seg:
push tempo //salvar estados
in tempo,SREG
push tempo
push conta

//subrutina bcd_7seg
ldi conta,4 ;numero de barridos que se hace
ldi zh,high(TABLA<<1)
ldi zl,low(TABLA<<1) ;apuntar a la tabla con Z
ldi xh,high(BCD0)
ldi xl,low(BCD0)
ldi yh,high(SEG0)
ldi yl,low(SEG0)

otro_valor: ld tempo,x+
ldi zh,high(TABLA<<1)
ldi zl,low(TABLA<<1) ;apuntar a la tabla con Z

add zl,tempo ;suma en 16 bits


clr tempo
adc zh,tempo

lpm tempo,z
st y+,tempo

dec conta
cpi conta,0
brne otro_valor

pop conta //recuperar estados


pop tempo
out SREG,tempo
pop tempo

ret ;regreso al programa principal para que no


se desborde el stack pointer

farenheit2:
rjmp farenheit
//subrutina barrido
barrido:
push tempo
in tempo,SREG
push tempo
push conta
push aux

//subrutina del barrido de 4 diplays


;primer diplay unidades
lds tempo,seg0
out portc,tempo
cbi porta,2
sbi porta,3
sbi porta,4
sbi porta,5
call esperar5
sbi porta,2
sbi porta,3
sbi porta,4
sbi porta,5
;segundo diplay decena
lds tempo,seg1
out portc,tempo
sbi porta,2
cbi porta,3
sbi porta,4
sbi porta,5
call esperar5
sbi porta,2
sbi porta,3
sbi porta,4
sbi porta,5
;tercer diplay centena
lds tempo,seg2
out portc,tempo
sbi porta,2
sbi porta,3
cbi porta,4
sbi porta,5
call esperar5
sbi porta,2
sbi porta,3
sbi porta,4
sbi porta,5
;tercer diplay centena
lds tempo,seg3
ori tempo,0b10000000
out portc,tempo
sbi porta,2
sbi porta,3
sbi porta,4
cbi porta,5
call esperar5
sbi porta,2
sbi porta,3
sbi porta,4
sbi porta,5
pop aux
pop conta
pop tempo
out SREG,tempo
pop tempo

reti
esperar5: push tempo

//rutina de esperar
ldi tempo,175
laz: dec tempo
call esp
cpi tempo,0
brne laz
pop tempo
ret
esp: push tempo

ldi tempo,100
lap: dec tempo
cpi tempo,0
brne lap
pop tempo
ret
//subrutina barrido para el termometro
barrido2:
push tempo
in tempo,SREG
push tempo
push conta
push aux

//subrutina del barrido de 4 diplays


;primer diplay unidades
lds tempo,seg0
out portc,tempo
cbi porta,2
sbi porta,3
sbi porta,4
sbi porta,5
call esperar4
sbi porta,2
sbi porta,3
sbi porta,4
sbi porta,5
;segundo diplay decena
lds tempo,seg1
out portc,tempo
sbi porta,2
cbi porta,3
sbi porta,4
sbi porta,5
call esperar4
sbi porta,2
sbi porta,3
sbi porta,4
sbi porta,5
;tercer diplay centena
lds tempo,seg2
ori tempo,0b10000000
out portc,tempo
sbi porta,2
sbi porta,3
cbi porta,4
sbi porta,5
call esperar4
sbi porta,2
sbi porta,3
sbi porta,4
sbi porta,5
;tercer diplay centena
lds tempo,seg3
out portc,tempo
sbi porta,2
sbi porta,3
sbi porta,4
cbi porta,5
call esperar4
sbi porta,2
sbi porta,3
sbi porta,4
sbi porta,5
pop aux
pop conta
pop tempo
out SREG,tempo
pop tempo

reti
esperar4: push tempo

//rutina de esperar
ldi tempo,175
laz1: dec tempo
call esp1
cpi tempo,0
brne laz1
pop tempo
ret
esp1: push tempo

ldi tempo,100
lap1: dec tempo
cpi tempo,0
brne lap1
pop tempo
ret
condicional: push tempo
in tempo,sreg
push tempo
push r17

ldi tempo,10
lds r17,bcd3
;ldi r17,4
mul tempo,r17
lds tempo,bcd2
;ldi tempo,5
add tempo,r0

cpi tempo,40
brsh excede
cpi tempo,30
brlo bajo
rjmp sald
excede: ldi tempo,0b10000000
sts led,tempo
rjmp sald
bajo: ldi tempo,0b00000000
sts led,tempo
rjmp sald

sald: lds r16,medida_l


out portb,r16
lds r16,medida_h
lds r17,led
or r16,r17 // or para el encendido del led
out portd,r16

pop r17
pop tempo
out sreg,tempo
pop tempo
reti

farenheit:
ldi tempo,0b10000001
sts admux,tempo
ldi tempo,0b11000100
sts adcsra,tempo

espera3: lds tempo,ADCSRA


sbrc tempo,6
rjmp espera3

//leer los valores de la conversion ADCH y ADCL


lds tempo,ADCL
sts medida_l,tempo

lds tempo,ADCH
sts medida_h,tempo

;coeficiente a multiplicar para el voltaje


ldi tempo,low(11000)
sts volt_l,tempo
ldi tempo,high(11000)
sts volt_h,tempo
;multiplicacion para el valor del display
rcall multiplicar
rcall desplazar
rcall transformar
rcall desplazar
rcall transformar2
rcall desplazar1
;rcall desplazar

rcall bin_bcd3
rcall maximo
rcall bcd_7seg
rcall barrido2
rcall condicional
rjmp lazo

transformar:
push tempo
in tempo,sreg
push tempo

ldi tempo1,low(18000)
sts volt_l,tempo1
ldi tempo1,high(18000)
sts volt_h,tempo1

lds tempo,binariol
lds r17,volt_l
mul tempo,r17
sts c1,r0 ;parte baja 1_0 de 32 bits
mov r2,r1 ;coef suma para C2

lds tempo,binariol
lds r17,volt_h
mul tempo,r17
mov r3,r0 ;coef suma para c2
mov r4,r1 ;coef suma para c3

lds tempo,binarioh
lds r17,volt_l
mul tempo,r17
mov r5,r0 ;coef suma para c2
mov r6,r1 ;coef suma para c3

lds tempo,binarioh
lds r17,volt_h
mul tempo,r17
mov r7,r0 ;coef suma para c3
mov r8,r1 ;coef suma para c4

;para c2
add r2,r3
adc r2,r5
sts c2,r2 ;parte baja1_1
;para c3
adc r4,r6
adc r4,r7
sts c3,r4 ;parte alta2_0
;para c4
clr tempo
adc r8,tempo
sts c4,r8 ;parte alta2_0

pop tempo
out sreg,tempo
pop tempo
reti

transformar2:

push tempo
in tempo,sreg
push tempo

ldi tempo1,low(320000)
sts volt_l,tempo1
ldi tempo1,high(320000)
sts volt_h,tempo1

lds tempo,binariol
lds r17,volt_l
add tempo,r17
mov r2,tempo
sts c1,r2 ;parte baja 1_0 de 32 bits
;coef suma para C2

lds tempo,binarioh
lds r17,volt_h
adc tempo,r17
mov r3,tempo ;coef suma para c2
sts c2,r3 ;coef suma para c3

ldi tempo,0
ldi r17,0
adc tempo,r17
mov r5,tempo ;coef suma para c2
sts c3,r5 ;coef suma para c3

ldi tempo,0
ldi r17,0
adc tempo,r17
mov r5,tempo ;coef suma para c2
sts c4,r5

pop tempo
out sreg,tempo
pop tempo
reti

desplazar1: push tempo


in tempo,sreg
push tempo
push r17
push r18
push r19
push r23

clr r23
ldi r23,4

lds r19,c4
lds r18,c3
lds r17,c2
lds r16,c1
/*ldi r19,0
ldi r18,0b00100110
ldi r17,0b01011011
ldi r16,0b00100100
*/
lazo21: clc
ror r19
ror r18
ror r17
ror r16
dec r23
cpi r23,0
breq salida1
rjmp lazo21

salida1: sts binariol,r16


sts binarioh,r17

pop r23
pop r19
pop r18
pop r17
pop tempo
out sreg,tempo
pop tempo

reti
//tabla
TABLA: .db 0b00111111,0b00000110 ;catodo comun
.db 0b01011011,0b01001111
.db 0b01100110,0b01101101
.db 0b01111101,0b00000111
.db 0b01111111,0b01101111

También podría gustarte