lunes, 10 de agosto de 2015

Circuito de aplicación del conversor análogo digital 1

En esta ocasión se presenta un circuito que realiza la operación de 4 diferentes conversores análogos-digitales y muestra el resultado de la suma de los 4. Para realizar esto es obligatorio trabajar solo con un conversor a la vez ya que no nos permite otra opción el microcontrolador Atmega164P, por lo tanto se prende cada conversor, se realiza la lectura, se apaga ese conversor y se prende el siguiente y asi lo realizamos hasta que acabe las 4 conversiones y despues realizamos la suma. Como el conversor es de 10 bits, debemos realizar una suma de 16 bits para poder mostrar el resultado en leds. El resultado se va a mostrar en 12 leds porque con 12 bits es el número mayor que se puede obtener con la suma de 4 números de 10 bits.

Circuito con el que se va a trabajar

Código:

*  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