clase_adc_y_timer0
TRANSCRIPT
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 1/12
CONVERSOR ANÁLOGO DIGITAL Y TEMPORIZADORES
ADC DE 10 BITS.
Es el turno de estudiar algo del Conversor Analógico a Digital, este tiene una resolución de
conversión de 10bits de hasta 15kSPS, 6 canales Analógicos, Ajuste a derecha e izquierda
del resultado de la conversión, Voltajes de referencia, 2 modos de conversión: simple ycontinuo, Interrupción en el momento de la conversión completada, cancelación de ruido
activando modo Sleep, y algunas características más que se pueden ver en la hoja de datos.
El método de conversión que usa el micro es de aproximaciones sucesivas. Los registros
involucrados con el Conversor A/D son:
• ADMUX – ADC Multiplexer Selection Register – ADMUX
• ADCSRA – ADC Control and Status Register A• ADCL and ADCH – The ADC Data Register
ADMUX – ADC Multiplexer Selection Register – ADMUX
Este registro es muy importante ya que en él se realizan la mayoría de las configuracionespara el ADC:
Bit 7:6 – REFS1:0: Reference Selection Bits: Se utilizan para seleccionar el tipo de
voltaje de referencia que se usará, si interno, externo o deshabilitado, según la tabla:
Bit 5 – ADLAR: ADC Left Adjust Result: Configurado con 1, ajustará el resultado de la
conversión en los registros ADCH y ADCL a la Izquierda, caso contrario con un 0 lo hará a
la derecha, esto se verá más adelante con unas imágenes.
Bits 4:0 – MUX4:0: Analog Channel Selection Bits: Estos bits seleccionarán el canal
analógico que se usará en la presente conversión, de acuerdo a la siguiente tabla:
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 2/12
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 3/12
ADCSRA – ADC Control and Status Register A
En este registro se hacen las demás configuraciones y también se tiene los bits de control de
inicio/fin de conversión.
Bit 7 – ADEN: ADC Enable: Es la habilitación del ADC para su uso (1), caso contrario el
ADC estará apagado (0).
Bit 6 – ADSC: ADC Start Conversion: Colocando un 1 en este bit se inicia la conversión
analógica, ya sea en modo normal o en modo continuo, salvo que en el continuo no hará
falta volverlo a colocar a 1 cuando se necesite otra conversión, lo que si se debe hacer en
modo normal, ya que el conversor en este modo coloca a cero por hardware a este bit
cuando la conversión AD se ha terminado.
Bit 5 – ADFR: ADC Free Running Select: Con 1 se habilita el modo contínuo (freerunning), y el ADC muestreará y actualizará los registros de datos de la conversióncontinuamente, colocando un 0 el modo continuo, se detiene.
Bit 4 – ADIF: ADC Interrupt Flag: Este bit se coloca a 1 cuando la conversión AD es
completada y los registros de datos de la conversión son actualizados. Se ejecutará la rutina
de interrupción si esta implementada y se tiene configurada las máscaras correspondientes
para esta interrupción y el bit de Interrupciones globales, y se pondrá a 0 por hardware al
terminar la rutina de interrupción.
Bit 3 – ADIE: ADC Interrupt Enable: Es la máscara de habilitación para la interrupción
por Conversión AD completada, se la habilita colocando un 1.
Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits: Estos bits determinan el divisor entre la
frecuencia del Osilador principal y la entrada de reloj del ADC, es según la tabla:
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 4/12
ADCL and ADCH – The ADC Data Register
Por último los registros de datos donde se almacena el resultado de 10bits de la conversión
AD, que son de dos formas según la justificación configurada en ADLAR.
ADLAR=0
ADLAR=1
Cuando la conversión AD ha sido completada, el resultado puede ser encontrado en éstos 2
registros, en el formato que ADLAR indique, primero se debe leer ADCL y posteriormente
ADCH. Si no más de 8 bits de resolución son necesarios se puede usar ADLAR=1 y leerdirectamente ADCH.
Por último queda indicar que el resultado de la conversión será aproximadamente:
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 5/12
A continuación se muestra cómo funciona el ADC de 10bits de resolución del micro,mediante un potenciómetro conectado en el canal 0 el cual nos dará los diferentes valores
de tensión analógica entre 0 y 5V. El dato convertido se visualiza en 10 LEDs conectados
en el puertoD y los restantes 2 en los bits menos significativos del puerto B.
El código:;--------------------------------------------------------------------------------
; Programa: Conversor A/D de 10bits
; Version: 0.0
; Autor: Lewin Lopez
;
; Dispositivo: ATmega16 Compilador: AVRASM2
; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3;
; Notas: Este programa realiza una conversión de una tensión analógica a
; valores digitales de 10bits.
;
; Registros: r16 para configuraciones de los puertos, del ADC.
; r20 para lectura de la conversión.
; r17 y r18 para retardos.
;
; Conexiones: ADC0/PA0 -> Potenciometro a Vcc y Gnd
; D0-D7 -> Led's
; B0 y B1 -> Led's
;--------------------------------------------------------------------------------
;DIRECTIVAS EN ENSAMBLADOR
.include "m16def.inc" ;ATmega16
.device ATMEGA16
;reset-vector address $0000
.org $0000
jmp inicio ;va al inicio
;PROGRAMA PRINCIPAL
;Cargar el puntero de pila
inicio:
ldi r16,high(ramend) ;Configuracion de...
out sph,r16
ldi r16,low(ramend)
out spl,r16 ;...la pila: Stack: $045F=RAMEND
;Configuracion de Puertos
ldi r16,$FE ;r16 <- $FE
out ddra,r16 ;portA entrada por A0
ser r16 ;r16 <- $ff
out ddrd,r16 ;portD salidas
out ddrb,r16 ;portB salidas
;Configuracion del Conversor
ldi r16,$40 ;r16 <- $40
out admux,r16 ;configuro ADC a canal0, ajuste a derecha y referencia en Vref con
capacitor
ldi r16,$85 ;r16 <- $85
out adcsra,r16 ;habilito ADC, interrupcion y modo continuo desactivados, divisor 32
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 6/12
call delay200u ;retardo para inicializar el conversor A/D
;se necesita 25 ciclos del clock ADC, el clock ADC esta puesto a 4MHz/32=125kHz
;25 ciclos de 125Khz, es 200us que se debe esperar para la configuración de todo el
;circuito interno del conversor A/D del micro
;Conversion
ciclo:
sbi adcsra,adsc ;se inicia conversion A/D, seteando el bit adsc (en uno)
convertir:
sbis adcsra,adsc ;pregunto por el bit de conversión terminada
jmp leer ;si termina la conversión, voy a leer el resultado de la conversión
jmp convertir ;si no se sigue esperando hasta que termine
;Lectura de los datos convertidos
leer:
in r16,adcl ;carga el valor de ADCL en r16 los 8 de menor peso
out portd,r16 ;muestra por el puertoD
in r16,adch ;carga el valor de ADCH en r16
out portb,r16 ;muestra por el puertoBcall delay25m ;retardo para visualizar, puede no ser necesario
jmp ciclo ;ciclo infinito
; =============================
; delay loop generator
; 100000 cycles:
; -----------------------------
; delaying 99990 cycles:
delay25m:
ldi R17, $A5
WGLOOP0: ldi R18, $C9
WGLOOP1: dec R18
brne WGLOOP1
dec R17brne WGLOOP0
; -----------------------------
; delaying 9 cycles:
ldi R17, $03
WGLOOP2: dec R17
brne WGLOOP2
; -----------------------------
; delaying 1 cycle:
nop
ret
; =============================
; =============================
; delay loop generator; 800 cycles:
; -----------------------------
; delaying 798 cycles:
delay200u:
ldi R17, $02
WGLOOP3: ldi R18, $84
WGLOOP4: dec R18
brne WGLOOP4
dec R17
brne WGLOOP3
; -----------------------------
; delaying 2 cycles:
nop
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 7/12
nop
ret
; =============================
El esquema del circuito:
TIMER O TEMPORIZADOR CERO.
Es turno del Timer/Counter0, este es un módulo interno del microcontrolador que sirve para
realizar temporizaciones internas en el micro o bien, conteo de pulsos externos, es unregistro de 8 bits del micro que puede leerse y escribirse. El conteo o temporización serásiempre ascendente.
El Timer/Counter0 posee un preescaler que sirve de divisor de frecuencia, para retardar o
mantener el incremento de este registro a la velocidad del Oscilador/Cristal usado para elmicro, cuando el timer/counter0 trabaja con reloj interno.
Dependiendo el valor que necesitemos temporizar en segundos, ms ó us se usará uno u otro
valor de preescaler para llegar a nuestro objetivo.
Usando el temporizador con reloj externo, pasa a modo contador ya que contará los pulsos
que le ingresen, en este caso el preescaler siempre estará en 1:1 ya que no existe división dela frecuencia cuando el timer/counter0 está configurado de esta manera.
Teniendo estos conceptos claros, podemos ver a detalle los registros involucrados con el
manejo del timer/counter0, que son 4, de los cuales en algunos registros no se usan todos
los bits para configuraciones del timer/counter0 sino sirven también para configuraciones
de los otros timer/counter, estos registros para el Timer/Counter0 son:
• TCCR0 – Timer/Counter Control Register
• TCNT0 – Timer/Counter Register
• TIMSK – Timer/Counter Interrupt Mask Register
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 8/12
• TIFR – Timer/Counter Interrupt Flag Register
TCCR0 – Timer/Counter Control Register
En este registro los bits de mayor peso (7:3) se utilizan para configurar el PWM. La
atención debe centrarse primero en los últimos 3 bits que permiten configurar el Preescaler.
De acuerdo a la tabla:
Si por ejemplo seleccionamos la segunda opción, clk I/O /(No prescaling), significa que eltimer/counter0 se incrementará a la velocidad del oscilador que se tiene para el micro, si
por el contrario configuramos con otro valor como clk I/O /256 (From prescaler), significa
que cada 256 pulsos del oscilador que tenemos configurado al micro incrementarán solo en
1 al valor del Timer/Counter0. De esta manera encontramos ese retardo o división de
frecuencia para el conteo del Timer.
La primera opción sirve para desactivar el funcionamiento del Timer/Counter0, es decir
éste no se incrementará, permanecerá detenido.
TCNT0 – Timer/Counter Register
Este es el registro de lectura y escritura de 8 bits que lleva la cuenta del
temporizador/Contador, puede comenzar la cuenta en cualquier valor que se le cargue ypuede ser leído en cualquier momento.
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 9/12
TIMSK – Timer/Counter Interrupt Mask Register
Como el timer/counter0 es un registro de 8 bits que se irá incrementando a una frecuencia
determinada, sucederá un caso muy particular y este es cuando el temporizador llegue a su
valor máximo que es 255, como más allá de 255 en un registro de 8 bits no se puede hacer
nuestro timer volverá a 0 para continuar su conteo indefinido hasta que el micro se quede
sin energía. Este paso de 255 a 0 se llama desborde o en inglés overflow, este desborde
puede generar una interrupción al micro.
Mediante el Bit 0 de este registro, TOIE0, podemos activar o desactivar esta interrupción
por desborde de nuestro Timer/Counter0. Con un 1 queda activada la interrupción y con un
0 desactivada.
TIFR – Timer/Counter Interrupt Flag Register
El bit0, TOV0, es el que interesa para el timer/counter0. Es una bandera que indica que ha
sucedido el desborde el timer/counter0, se coloca a 1 en ese caso, y se vuelve a 0
automáticamente cuando el timer/counter0 toma el valor de 1. El bit de bandera de
desborde se coloca a 1 en el momento que el timer/counter está en 0 previamente de habervenido de 255.
Si se usa la interrupción por desborde del timer, no se debe olvidar colocar en 1 la bandera
de interrupciones globales.
Ahora el ejemplo, Se va a configurar el timer0 para contar 1 seg, ya que a un segundo
encenderemos un led, y al siguiente lo apagaremos, un parpadeo hecho al inicio del curso,pero esta vez utilizando el Timer/Counter0.
Para ello se configura el preescaler en 256 con reloj interno, se usa la interrupción por
desborde, y siempre se inicializa al timer0 con el valor de 130 para solamente contar 125
estados del timer y a la vez se cuentan 125 interrupciones para poder recién contar el
segundo que buscamos. Eso salió del siguiente cálculo:
Se usa una frecuencia de 4MHz de Oscilador, entonces el periodo es 0.25us, por esta razónse necesitarán 4'000.000 de incrementos en el timer0 si el preescaler se ajusta en 1, pero
como se trabaja con un preescaler de 256 por tanto los incrementos se modifican así:
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 10/12
4'000.000/256=15625 de incrementos en el timer0.
Si contamos los 256 valores (incrementos de 0 a 255 con 8 bits) del registro del timer0, seobtiene: 15625/256=61.03515625 interrupciones que contar, lo que no es "exacto" para este
caso, se podría quizá adoptar directamente ese número ya que sería aproximado el valortemporizado al valor necesitado; pero como se busca una buena precisión, se selecciona un
número divisible entre 15625 (y este número debe ser entre 0 y 255).
El número puede ser 15625/ 125=125, por tanto debemos contar 125 interrupciones y
además debemos reducir la resolución de los 8 bits del timer, por tanto debemos precargaral timer con un valor para que solamente se cuente 125 incrementos antes de desbordarse.
El valor de precarga será: 255-125=130.
Con este análisis se obtiene una fórmula:
Tiempo=Preescaler*(255-Precarga)*interrupciones*Tosc
donde Tosc es el periodo de nuestro Oscilador
Aplicado al ejemplo para 1 segundo:
Tiempo = 256*125*125*0.25u = 1seg.
Ahora el programa:;--------------------------------------------------------------------------------
; Programa: Led on/off con Timer/Counter0
; Version: 0.0
; Autor: Lewin Lopez
;
; Dispositivo: ATmega16 Compilador: AVRASM2
; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3
;
; Notas: Este programa hace parpadear un led conectado al pin PB0 del puerto B
; durante aprox. 1seg. utilizando el timer0 con su interrupcion por desborde
;
; Registros: r0 -> sirve para el parpadeo del led al aplicarle un eor
; r16 -> On/Off led,
; r17 -> para precargar al timer/counter0,
; r18 -> contador de interrupciones,
; r19 -> flag indicación de que paso un segundo
;
; Conexiones: B1 -> Led
;--------------------------------------------------------------------------------
;DIRECTIVAS EN ENSAMBLADOR
.include "m16def.inc" ;ATmega16
.device ATMEGA16
;DEFINICION DE REGISTROS
.def cambio=r0 ;registro para parpadeo del led
.def conteo=r18
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 11/12
.def flag=r19
;reset-vector address $0000
.org 0000
jmp inicio ;va al inicio
.org $012
jmp int_tmr0 ;va a la interrupcion por desborde del timer0
;PROGRAMA PRINCIPAL
inicio:
;Cargar el puntero de pila
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
;Configuración de puertosser r16 ;r16 <- $FF
out ddrb,r16 ;portB salida
;Configuracion del temporizador 0
ldi r16,4 ;r16 <- 4
out tccr0,r16 ;configuramos el Timer/Counter0 con reloj interno preescaler 256
ldi r16,130 ;r16 <- 130
out tcnt0,r16 ;valor de precarga para contar solamente 125 estados del timer
ldi r16,1 ;r16 <- 1
out timsk,r16 ;se habilita la interrupción por desborde del Timer/Counter0
;inicialización de registros
clr flag ;ponemos a cero la bandera que indica que ha pasado 1seg.
clr conteo ;ponemos a cero el contador de interrupciones.ldi r16,$01 ;r16 <- $01 -> Iluminar led conectado pin RB0
mov cambio,r16 ;r0 <- r16 :variable para el parpadeo
sei ;se habilitan las interrupciones globales
ciclo:
cpi flag,255 ;pasó 1seg?
breq cambie ;saltamos a cambiar estado
jmp ciclo ;ciclo infinito
cambie:
out portb,r16 ;actuamos sobre el led(conectado al pin RB0)
eor r16,cambio ;cambiamos estado on/off
clr flag ;limpiamos la bandera de indicación de 1seg pasado
jmp ciclo ;repite el ciclo
;RUTINA DE INTERRUPCIONint_tmr0:
inc conteo ;incrementar contador de interrupciones
cpi conteo,125 ;se han producido 125 interrupciones
brne salir ;si no han pasado 125 interrupciones, salimos de la rutina
ser flag ;pasaron las 125 interrupciones = 1 seg, activamos bandera
clr conteo ;reiniciamos contador de interrupciones
salir:
ldi r17,130 ;r17 <- 130
out tcnt0,r17 ;valor de precarga para contar solamente 125 estados del timer
reti ;fin de rutina de interrupción
5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com
http://slidepdf.com/reader/full/claseadcytimer0 12/12
El esquema del circuito:
Ejercicio en Clase 10.
a) Realice un programa para el microcontrolador ATMEGA16 que mediante la interrupció por
desborde del timer0 realice un conteo de 0 a 255 por un puerto cualquiera.
b) Realice un programa para el microcontrolador ATMEGA16 que permita configurar el
conversor análogo a digital con bit de referencia AVcc con capacitor externo en ARef.
Ajuste de resultado a la derecha y frecuencia de muestreo del conversor igual a Fosc / 8.
Lea el pin A3 y muestre el resultado de la conversión en un puerto cualquiera.
NOTA: cada programa debe estar basado en los ejemplos de clase.