clase_adc_y_timer0

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 y continuo, 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 Multiplexe r 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 configuraciones para 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:

Upload: dapuma

Post on 08-Jul-2015

334 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Clase_ADC_y_Timer0

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:

Page 2: Clase_ADC_y_Timer0

5/9/2018 Clase_ADC_y_Timer0 - slidepdf.com

http://slidepdf.com/reader/full/claseadcytimer0 2/12

 

Page 3: Clase_ADC_y_Timer0

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:

Page 4: Clase_ADC_y_Timer0

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:

Page 5: Clase_ADC_y_Timer0

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

Page 6: Clase_ADC_y_Timer0

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

Page 7: Clase_ADC_y_Timer0

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

Page 8: Clase_ADC_y_Timer0

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.

Page 9: Clase_ADC_y_Timer0

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í:

Page 10: Clase_ADC_y_Timer0

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

Page 11: Clase_ADC_y_Timer0

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

Page 12: Clase_ADC_y_Timer0

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.