Está en la página 1de 6

Puertos analógicos de microcontrolador ATMEGA32

Descripción.-

Este laboratorio propone desarrollar un conversor análogo digital y así conocer los registros
del controlador ATMEGA32 encargados de controlar los puertos analógicos.

Para ello el microcontrolador Atmega posee 8 pines habilitados para la conversión análogo-
digital, su método de conversión es por aproximaciones sucesivas y su resolución es de 10 bits.

El conversor ADC del microcontrolador ATMEGA32 convierte un voltaje de entrada analógico a


un número digital de 10 bits, el valor mínimo es tomado como tierra y el máximo voltaje se
obtiene en el pin AREF. El ADC se habilita colocando el bit de habilitación del registro en 1
lógico, el resultado de la conversión se almacena en los registros de ADCH y ADCL.

Para realizar la conversión análogo-digital realizamos los siguientes pasos:

 En el registro ADMUX:
o Configuramos los bits REFS1 y REFS0 para seleccionar el voltaje de referencia
o Determinamos el ajuste del resultado de la conversión a la izquierda o a la
derecha
o Elegimos el canal de entrada analógica
 En el registro ADCSRA:
o Para la conversión colocamos el bit ADEN a 1
o Para la conversión el módulo de conversión necesita una frecuencia de reloj
que nosotros tomamos de la base de frecuencia del oscilador del
microcontrolador.
 En el registro SFIOR
o Determina el evento de conversión análogo-digital en modo auto disparo,
algunos eventos que disparan la conversión son:
 Comparador analógico
 Interrupciones externas
 Temporizadores

Con los pasos anteriormente detallados procedimos a realizar el laboratorio correspondiente


poniendo en práctica los conceptos adquiridos logrando codificar y ejecutar las practicas
correspondientes las cuales en un principio fueron un poco difíciles de comprender pero en el
transcurso del desarrollo se fueron aclarando las ideas para su funcionamiento, la primera
practica fue el desarrollo de un conversor análogo-digital de dos entradas seleccionables por
un switch digital. La segunda práctica fue el desarrollo del conversor análogo digital de cuatro
entradas seleccionables es de un selector digital combinable.

Firmas.-

Para este laboratorio logramos conseguir una firma, la segunda, por falta de tiempo para la
presentación ya que el código ya estaba en funcionamiento en la simulación, no se logró
hacer.
Implementación y resultados.-

DFD:

Firma 1:

Inicio

NO SI
Switch = 1

Entrada 2 Entrada 1

Conversor
Analogo-digital

Salida Puertos
DyB

FIN
Firma 2:

Inicio

NO SI
Switch1 = 1

NO SI NO SI
Switch2 = 1 Switch2 = 1

Entrada 2 Entrada 1 Entrada 2 Entrada 1

Conversor
Analogo-digital

Salida Puertos
DyB

FIN
Código:

Firma 1:

rjmp start ; va al programa Principal


start:
ldi r16,$04 ; cargamos r16 con $04
out sph,r16
ldi r16,$5F
out spl,r16 ; la pila : stack: $045F = RAMEND
ser r16 ; cargamos r16 con $FF
out ddrd,r16 ; Puerto D como salidas
ldi r17,0b00111111 ;
out ddrb,r17; Puerto B(0-5) como salidas y B(6-7)como entradas
rjmp programa ; vamos al programa
programa:
SBIC PINB,7 ; preguntamos si el pin 7 del puerto b esta en uno
RJMP dos ; si esta en uno saltamos a dos
RJMP uno ; si esta en cero saltamos a uno
uno:
ldi r16,$40
out admux,r16 ; configuramos ADC a canal 0; con ajuste a la derecha
RJMP convertir
dos:
ldi r16,$41
out admux,r16; configuramos ADC a canal 1; con ajuste a la derecha
RJMP convertir
convertir:
ldi r16,$85
out adcsra,r16 ; habilito ADC, interrupción y free running desactivados, divisor 32
call delay200u; retardo para iniciar conversor
sbi adcsra,adsc ; iniciamos conversor A/D, seteando el bit ADSC
sbis adcsra,adsc; pregunto por el bit de conversión terminada
rjmp leer ; si termino la conversión voy a leerla
rjmp convertir ; sino sigue esperando hasta que termine
leer:
in r16,adcl ; carga el valor ADCL en R16
out portd,r16 ; Muestra por el puerto D
in r16,adch ; carga el valor ADCH en R16
out portb,r16 ; Muestra por el puerto B
call delay25m ; retardo para visualizar
rjmp programa ; bucle infinito
; programa para el retardo
delay25m:
ldi r17,$A5
WGOOP0: ldi r18,$C9
WGOOP1: dec r18
brne WGOOP1
dec r17
brne WGOOP0
ldi r17,$03
WGOOP2: dec r17
brne WGOOP2
nop
ret
delay200u:
ldi r17,$02
WGOOP3:ldi r18,$84
WGOOP4: dec r18
brne WGOOP4
dec r17
brne WGOOP3
nop
nop
ret

FIRMA 2:
rjmp start ; va al programa Principal
start:
ldi r16,$04 ; cargamos r16 con $04
out sph,r16
ldi r16,$5F
out spl,r16 ; la pila : stack: $045F = RAMEND
ser r16 ; cargamos r16 con $FF
out ddrd,r16 ; Puerto D como salidas
ldi r17,0b00111111 ;
out ddrb,r17; Puerto B(0-5) como salidas y B(6-7)como entradas
rjmp programa ; vamos al programa
programa:
SBIC PINB,7 ; preguntamos si el pin 7 del puerto b esta en uno
RJMP btn ; si esta en uno saltamos a btn
RJMP ben1 ; si esta en cero saltamos a btn1
btn:
SBIC PINB,6; preguntamos si el pin 6 del puerto b esta en uno
RJMP uno ; si esta en uno saltamos a uno
RJMP dos ; si esta en uno saltamos a dos
btn1:
SBIC PINB,6 ; preguntamos si el pin 6 del puerto b esta en uno
RJMP tres ; si esta en uno saltamos a tres
RJMP cuatro ; si esta en uno saltamos a cuatro
uno:
ldi r16,$40
out admux,r16 ; configuramos ADC a canal 0; con ajuste a la derecha
RJMP convertir
dos:
ldi r16,$42
out admux,r16; configuramos ADC a canal 2; con ajuste a la derecha
RJMP convertir
uno:
ldi r16,$44
out admux,r16 ; configuramos ADC a canal 4; con ajuste a la derecha
RJMP convertir
dos:
ldi r16,$46
out admux,r16; configuramos ADC a canal 6; con ajuste a la derecha
RJMP convertir
convertir:
ldi r16,$85
out adcsra,r16 ; habilito ADC, interrupción y free running desactivados, divisor 32
call delay200u; retardo para iniciar conversor
sbi adcsra,adsc ; iniciamos conversor A/D, seteando el bit ADSC
sbis adcsra,adsc; pregunto por el bit de conversión terminada
rjmp leer ; si termino la conversión voy a leerla
rjmp convertir ; sino sigue esperando hasta que termine
leer:
in r16,adcl ; carga el valor ADCL en R16
out portd,r16 ; Muestra por el puerto D
in r16,adch ; carga el valor ADCH en R16
out portb,r16 ; Muestra por el puerto B
call delay25m ; retardo para visualizar
rjmp programa ; bucle infinito
; programa para el retardo
delay25m:
ldi r17,$A5
WGOOP0: ldi r18,$C9
WGOOP1: dec r18
brne WGOOP1
dec r17
brne WGOOP0
ldi r17,$03
WGOOP2: dec r17
brne WGOOP2
nop
ret
delay200u:
ldi r17,$02
WGOOP3:ldi r18,$84
WGOOP4: dec r18
brne WGOOP4
dec r17
brne WGOOP3
nop
nop
ret
Esquematico:
Firma 1:

Firma 2;

Bibliografía.-

1) Umesh Lokhande, ADC in AVR ATmega32A Microcontroller,


http://binaryupdates.com/adc-in-avr-atmega32a-microcontroller/, 26/09/2018
2) Avinash Gupta, ADC (Analog To Digital Converter) of AVR Microcontroller,
http://extremeelectronics.co.in/avr-tutorials/using-adc-of-avr-microcontroller/,
26/09/2018

También podría gustarte