ejercicos en atmega 164p uso de conversor a/d y comunicacion serial
TRANSCRIPT
ESCUELA POLITECNICA NACIONALSISTEMAS MICROPROCESADOS
NOMBRES: Wilmer VillegasFECHA: 22 – 05 – 2012
1. Diseñar un programa util izando el conversor A/D que lea un sensor a la vez y que me muestre con leds el valor del ADCH util izando justificación izquierda con 8 bits de resolución, en el PORTC muestro el menor de las conversiones y en el PORTD el valor máximo de las tres.
PROGRAMA EN AVR:
. include"m164pdef.inc"; Declaración de mis variables.def tempo=r17.def aux=r18.def aux1=r19.def valor1=r20.def valor2=r21.def valor3=r22
.org 0x00; declaro mis pórticos como entrada y salidas
ldi tempo,0b00000000out ddra,tempo
ser tempoout ddrc,tempoout ddrd,tempo
; inicializo el SPldi tempo,high(ramend)out sph,tempoldi tempo,low(ramend)out spl , tempo
clr tempoout portc, tempoout portd,tempo
lazo: ; configuro mis bits específicos para el conversor primero codifico el voltaje de referencia, la justif icación y el canal que voy a usar
ldi tempo,0b01100000sts admux,tempo
;habil i to ADC, inicio de la conversión, modo manual, y el factor de division
ldi tempo,0b11000011sts adcsra,tempo
; salto a la subrutina para ver si la conversión a finalizado
rcall espera; encero el canal y paro el conversor
clr temposts admux,temposts adcsra,temposts adch,tempo
;inicializo los registros pero para usar el siguiente canal
ldi tempo,0b01100001sts admux,tempoldi tempo,0b11000011sts adcsra,temporcall espera1
clr temposts admux,temposts adcsra,temposts adch,tempo
ldi tempo,0b01100010sts admux,tempoldi tempo,0b11000011sts adcsra,temporcall espera2
; realizo la comparación de los tres datos para ver cuál es el mayor y menor de los 3
cp valor1,valor2brsh comp1brlo comp2rjmp fin
comp1:
cp valor1,valor3brlo comp4cp valor2,valor3
brlo comp5out portc,valor1out portd,valor3rjmp fin
comp5:out portc,valor1out portd,valor2rjmp fin
comp4:out portc,valor3out portd,valor2rjmp fin
comp2:cp valor2,valor3brlo comp6cp valor1,valor3brlo comp7out portc,valor2out portd,valor3rjmp fin
comp6:out portc,valor3out portd,valor1rjmp fin
comp7:cp valor2,valor3brsh comp8rjmp fin
comp8:out portc,valor2out portd,valor1
; realizo un lazo infinito para cuando ingrese un nuevo valor este sea comparado continuamente
fin:rjmp lazo
espera:; chequeo si la conversión a finalizado caso contrario espero
lds aux,adcsrasbrc aux,6
rjmp espera
lds valor1,adchret
espera1:
lds aux1,adcsrasbrc aux1,6rjmp espera1
lds valor2,adchret
espera2:
lds aux1,adcsrasbrc aux1,6rjmp espera2
lds valor3,adchret
SIMULACION EN PROTEUS:
DIAGRAMA DE FLUJO:
2. Al programa anterior implementar lo siguiente:Calcular el promedio de las dos medidas, a ese le envió a la computadora y como confirmación me envía otra vez al micro.
PROGRAMA EN AVR:
. include"m164pdef.inc"
.def tempo=r17
.def aux=r18
.def aux1=r19
.def valor1=r20
.def valor2=r21
.def valor3=r22
.def guardar=r23
.def promedio=r24
.org 0x00rjmp inicio
;modo de recepción serial para ver si mi dato ya ha sido recibido.org 0x28
rjmp recepcion
inicio:
ldi tempo,0b00000000out ddra,tempo
ldi tempo,0b10000010out ddrd,tempo
ser tempoout ddrc,tempoout ddrb,tempo
ldi tempo,high(ramend)out sph,tempoldi tempo,low(ramend)out spl , tempo
;configure lo que corresponde a la comunicacion serial con un cristal
1MHz y calculamos para 9600 baudios
ldi tempo,high(6) ;cristal 1MHz, 9600baudios
sts ubrr0h,tempoldi tempo,low(6)sts ubrr0l , tempo
ldi tempo,0b00000000sts ucsr0a,tempoldi tempo,0b10011000sts ucsr0b,tempoldi tempo,0b00000110sts ucsr0c,tempo
sei
clr tempoout portc, tempoout portb,tempoclr promedio
lazo:
ldi tempo,0b01100000sts admux,tempoldi tempo,0b11000011sts adcsra,temporcall espera
clr temposts admux,temposts adcsra,temposts adch,tempo
ldi tempo,0b01100001
sts admux,tempoldi tempo,0b11000011sts adcsra,temporcall espera1
clr temposts admux,temposts adcsra,temposts adch,tempo
ldi tempo,0b01100010sts admux,tempoldi tempo,0b11000011sts adcsra,temporcall espera2
cp valor1,valor2brsh comp1brlo comp2rjmp fin
comp1:
cp valor1,valor3brlo comp4cp valor2,valor3brlo comp5out portc,valor1out portb,valor3
rjmp fincomp5:
out portc,valor1out portb,valor2
rjmp fincomp4:
out portc,valor3out portb,valor2
rjmp fin
comp2:cp valor2,valor3
brlo comp6cp valor1,valor3brlo comp7out portc,valor2out portb,valor3
rjmp fincomp6:
out portc,valor3out portb,valor1
rjmp fincomp7:
cp valor2,valor3brsh comp8rjmp fin
comp8:out portc,valor2out portb,valor1
fin:
add valor1,valor2lsr valor1add valor1,valor3lsr valor1mov promedio,valor1
verifico:
lds guardar,ucsr0asbrc guardar,5rjmp verificosts udr0,promedio
rjmp lazo
espera:
lds aux,adcsrasbrc aux,6rjmp espera
lds valor1,adchret
espera1:
lds aux1,adcsrasbrc aux1,6rjmp espera1
lds valor2,adchret
espera2:
lds aux1,adcsrasbrc aux1,6rjmp espera2
lds valor3,adchret
recepcion:
push tempoin tempo,sregpush tempo
lds promedio,udr0sbi portd,7sts udr0,promedio
control:lds guardar,ucsr0asbrc guardar,5rjmp control
pop tempoout sreg,tempopop temporeti
SIMULACION EN PROTEUS: