Circuito con el que se va a trabajar
* Created: 09/07/2015 17:39:41
*
Author: cdtoap
*/
;variables que vamos a usar en el programa
.def unol=r15
.def unoh=r16
.def dosl=r17
.def dosh=r18
.def tresl=r19
.def tresh=r20
.def cuatrol=r21
.def cuatroh=r22
.def auxl=r23
.def auxh=r24
.def tempo=r25
;----------------------------------------------
.cseg
.org 0x00
/*configurar puertos*/
ldi tempo,$00
out ddra,tempo
out ddrc,tempo
ldi tempo,$FF
out ddrb,tempo
ldi tempo,0b00001111
out ddrd,tempo
ldi tempo,$FF
out
portc,tempo
ldi tempo,0
out
portb,tempo
ldi
tempo,0b11110000
out
portd,tempo
ldi tempo,0b11110000; apagamos los
pull-up de los conversores
out porta,tempo
ldi tempo,0b00001111;convertimos
en entrada análoga
sts didr0,tempo
in tempo,mcucr
andi tempo,$EF
out
mcucr,tempo
;Encendemos
el stack pointer
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
/*Fin configurar puertos*/
inicio:
ldi
tempo,0b01000000; configuramos el admux para
referencia el AVCC, ajuste a la derecha, y escogemos el ADC0
sts
admux,tempo
ldi
tempo,0b11000110; prendemos la conversion y
activamos para que empiece a convertir
sts
adcsra,tempo; preescalador 1:64
call lazo; llamamos a la
subrutina que comprueba si la conversion ha terminado
lds tempo,adcl; cargamos lo del valor bajo del adc
mov unol,tempo; guardamos ese valor en un registro
lds tempo,adch; cargamos lo del valor alto del adc
andi tempo,0b00000011; hacemos
una and para asegurar que solo trabajemos con 10 bits
mov unoh,tempo; guardamos en el registro del primer conversor
ldi
tempo,0b00000110; apagamos el conversor
sts
adcsra,tempo
conver2:
ldi
tempo,0b01000001; encendemos el segundo
conversor
sts
admux,tempo
ldi
tempo,0b11000110; empieza a convertir
sts
adcsra,tempo
call lazo; comprueba si
acabo de convertir
lds tempo,adcl
mov dosl,tempo; guardamos en registros
lds tempo,adch
andi tempo,0b00000011
mov dosh,tempo; guardamos en registro del segundo conversor
ldi
tempo,0b00000110; apgamos el conversor
sts
adcsra,tempo
conver3:
ldi
tempo,0b01000010; obtenemos datos del tercer
conversor
sts
admux,tempo
ldi
tempo,0b11000110
sts
adcsra,tempo
call lazo
lds tempo,adcl
mov
tresl,tempo
lds tempo,adch
andi tempo,0b00000011
mov
tresh,tempo
ldi
tempo,0b00000110
sts
adcsra,tempo
conver4:
ldi
tempo,0b01000011; obtenemos datos del
conversor 4
sts
admux,tempo
ldi
tempo,0b11000110
sts adcsra,tempo
call lazo
lds tempo,adcl
mov
cuatrol,tempo
lds tempo,adch
andi tempo,0b00000011
mov
cuatroh,tempo
ldi
tempo,0b00000110; apagamos las conversiones
sts
adcsra,tempo
call operacion; llamamos a
la subrutina que realiza la operacion de sumar
rjmp inicio; realizamos el
programa infinitamente
lazo:
lds
tempo,adcsra; carga el valor del adcsra en
tempo
sbrc tempo,6; comprueba el
pin que dice si se acabo de convertir
rjmp lazo; si es que no
acaba quedese repitiendo
ret; si acabo de convertir
continue el programa
operacion:
clr tempo; borramos el
tempo
mov auxl,unol; guardamos en
auxiliar lo del primer conversor
mov auxh,unoh
add auxl,dosl; sumamos 1 y
2 y guardamos en el auxiliar el resultado
adc auxh,dosh
add auxl,tresl; la suma de
1 y 2 sumamos con 3
adc auxh,tresh
add auxl,cuatrol; la suma
de 1,2 y 3 sumamos con 4
adc auxh,cuatroh
out portb,auxl; sacamos por
el puerto b los 8 bits menos significativos
ori auxh,0b11110000; para
asegurar pull-up hacemos una or
out portd,auxh; sacamos por
el puerto d los 4 bits mas significativos
ret; regresamos al programa
Circuito Funcionando:
No hay comentarios.:
Publicar un comentario