Diferencia entre revisiones de «ADC (Conversor Analógico-Digital) - MC9S08QE128»

De Wikitronica
Saltar a: navegación, buscar
(Asignación de canales)
 
(No se muestran 68 ediciones intermedias de 14 usuarios)
Línea 1: Línea 1:
El módulo ADC del microcontrolador Freescale MC9S08QE128 toma como entrada analógica la señal que resulta al variar el potenciómetro y la convierte en un valor binario ajustable a 12, 10 y 8 bits
+
[[Categoría:MC9S08QE128]]
 +
Un convertidor analógico digital (ADC) es un dispositivo que convierte una cantidad física contínua (generalmente voltaje) a un número digital que representan la amplitud de dicha cantidad. La conversión implica un cuantización de la entrada por lo que se produce un pequeño error al realizar la conversión.
  
El conversor posee dos señales de referencia llamadas Voltage Reference High (V REFH) y Voltage Reference Low (V REFL) y podrá convertir muestras entre V SSAD (Tierra Analógica) y V DDAD (conectada a V REFH) que va entre 1.8 y 3.6 Volts
+
La salida digital que produce un módulo ADC es generalmente un número binario en complemento a 2 el cual es proporcional a la entrada.
  
[[Archivo:potenciometro2.jpg|700px|right|thumb|Potenciometro ADC]]
+
La resolución del convertidor ADC indica la cantidad de valores discretos que puede producir para representar el rango analógico de interés. Por ejemplo, una ADC de 8bits puede representar 256 niveles de una señal analógica. Para mas información ver el [http://en.wikipedia.org/wiki/Analog-to-digital_converter#Resolution artículo del ADC en Wikipedia].
  
==Características==
+
El conversor ADC necesita una referencia que le indique cuales son los valores máximos y mínimos de voltaje para realizar la conversión. El módulo ADC posee dos señales de referencia llamadas Voltage Reference High (V REFH) y Voltage Reference Low (V REFL) y podrá convertir muestras entre V SSAD (Tierra Analógica) y V DDAD (conectada a V REFH) que va entre 1.8 y 3.6 Volts.
 +
 
 +
[[Archivo:diagramabloques.jpg|400px|thumb|Diagrama de bloques ADC.]]
 +
 
 +
== Características ==
  
 
El módulo ADC posee:
 
El módulo ADC posee:
  
* ''Algoritmo de aproximación lineal de 12 bits de resolución''
+
* ''Algoritmo de aproximación lineal de 12 bits de resolución.''
* ''32 canales que permiten hasta 28 entradas analógicas''
+
* ''24 canales.''
* ''Formato de salida digital en 12, 10 u 8 bits''
+
* ''Formato de salida digital seleccionable (12, 10 u 8 bits).''
* ''Modo de conversion simple o continua''
+
* ''Modo de conversión simple o continua.''
* ''Interrupción y bandera para conversiones completadas''
+
* ''Interrupción y bandera para conversiones completadas.''
* ''Tiempo de muestreo configurable para el dato de salida''
+
* ''Tiempo de muestreo configurable para el dato de salida.''
* ''Reloj para la entrada seleccionable de entre 4 fuentes''
+
* ''Reloj para la entrada seleccionable de entre 4 fuentes.''
* ''Modos wait y stop3 para operaciones con menos ruido''
+
* ''Modos wait y stop3 para operaciones con menos ruido.''
* ''Trigger de conversión por hardware seleccionable''
+
* ''Trigger de conversión por hardware seleccionable.''
* ''Comparador automatico (mayor que, menor que, igual a) con interrupcion para un valor programable''
+
* ''Comparador automático (mayor que, menor que, igual a) con interrupción para un valor programable.''
  
===Asignación de canales===
+
== Asignación de canales ==
  
[[Archivo:canales.jpg|700px|center|thumb|canales ADC]]
+
El módulo ADC del microcontrolador Freescale [[MC9S08QE128]] cuenta con 24 canales de conversión cada uno a 12bits de resolución. La lista completa de pines asignados para cada canal se describe en el Manual de Referencia [[Archivo:MC9S08QE128RM Reference Manual.pdf]]y en la tabla a continuación.
  
El ADC permite hacer las conversiones para cualquier canal entre AD0 y AD23.
+
[[Archivo:canales.jpg|700px|center|thumb|Canales ADC.]]
Si el registro que guarda el canal en el que se quiere trabajar ADCSC1_ADCH(4:0) es igual a 11111, entonces el subsistema que se encarga de convertir será apagado
+
  
====Sensor de Temperatura====
+
 
 +
La [[Tarjeta_de_Desarrollo_-_DEMOQE128|tarjeta de desarrollo DEMOQE128]] cuenta con un potenciómetro de 10Kohm cuya salida puede ser conectada al pin PTC6 y/o al pin PTA0. Esta conexión se puede seleccionar por medio del [[Configuración_Jumpers_Demoqe128_rev._C#Potenciometro_Anal.C3.B3gico_de_Entrada_.28Analog_Input_Potentiometer.29|Jumper J21]]. Si se conecta el potenciómetro a PTA0 se puede utilizar el Canal 0 del ADC para realizar la adquisición del valor del voltaje del potenciómetro.
 +
 
 +
El ADC permite hacer las conversiones para cualquiera de los 24 canales entre AD0 y AD23.
 +
Si el registro que guarda el canal en el que se quiere trabajar ADCSC1_ADCH(4:0) es igual a 11111, entonces el subsistema que se encarga de convertir será apagado.
 +
 
 +
==== Sensor de Temperatura ====
  
 
El ADC posee un sensor de temperatura cuya salida esta conectada al canal analógico AD26 y está definida por:
 
El ADC posee un sensor de temperatura cuya salida esta conectada al canal analógico AD26 y está definida por:
  
[[Archivo:temperatura.jpg|700px|center|thumb|Temperatura_ADC]]
+
[[Archivo:temperatura.jpg|700px|center|thumb|Temperatura_ADC.]]
  
 
De donde ''Vtemp'' es el voltaje del AD26 a la temperatura del ambiente, ''Vtemp25'' es el voltaje del AD26 a 25°C que por datasheet del micro se sabe que es 701.2 mV y ''m'' es la pendiente del voltaje vs temperatura que se sabe por datasheet que es 1.646mV desde -40°C hasta 25°C y 1.769 mV desde 25°C hasta 85°C.
 
De donde ''Vtemp'' es el voltaje del AD26 a la temperatura del ambiente, ''Vtemp25'' es el voltaje del AD26 a 25°C que por datasheet del micro se sabe que es 701.2 mV y ''m'' es la pendiente del voltaje vs temperatura que se sabe por datasheet que es 1.646mV desde -40°C hasta 25°C y 1.769 mV desde 25°C hasta 85°C.
  
Para usar el sensor de temperatura será necesario llenar los 5 bits menos significativos del registro ADCSC1 que corresponden al canal que se usará, con el número decimal 26 en binario (11010)
+
Para usar el sensor de temperatura será necesario llenar los 5 bits menos significativos del registro ADCSC1 que corresponden al canal que se usará, con el número decimal 26 en binario (11010).
  
===Hardware Trigger===
+
=== Hardware Trigger ===
  
 
El trigger que inicia una conversión en el ADC puede ser vía software activándolo en un instante de tiempo programable o también puede ser vía hardware. Para esto, el Real Time Counter ([[RTC (Real-timer counter) - MC9S08QE128|RTC]]) puede ser habilitado como el trigger para cada conversión que se vaya a hacer con el ADC.
 
El trigger que inicia una conversión en el ADC puede ser vía software activándolo en un instante de tiempo programable o también puede ser vía hardware. Para esto, el Real Time Counter ([[RTC (Real-timer counter) - MC9S08QE128|RTC]]) puede ser habilitado como el trigger para cada conversión que se vaya a hacer con el ADC.
 
Basta con configurar el ADCSC2_ADTRG = 1 y asi el ADC hará la conversión cada vez que haya un flanco de subida en el ADHWT que sucederá cuando el RTCINT coincida con RTCMOD
 
  
===Selección del Clock===
+
Basta con configurar el ADCSC2_ADTRG = 1 y asi el ADC hará la conversión cada vez que haya un flanco de subida en el ADHWT que sucederá cuando el RTCINT coincida con RTCMOD.
 +
 
 +
=== Selección del Clock ===
  
 
Una de las características del ADC es que tiene 4 relojes como fuente para escoger.
 
Una de las características del ADC es que tiene 4 relojes como fuente para escoger.
[[Archivo:adcclocks.jpg|700px|right|thumb|Bloques_Clocks_ADC]]
 
El primero es el bus clock, este se selecciona por defecto después de cada reset y trabajará a la misma frecuencia que esté trabajando el micro
 
  
La segunda opción es tomar como fuente el mismo bus clock pero el módulo del ADC nos permite dividirlo por 2, 4 y 8 para variar la velocidad de conversión
+
[[Archivo:adcclocks.jpg|700px|right|thumb|Bloques Clocks ADC.]]
  
El tercero es el ALTCLK (alternate clock) que se establece como el ICSERCLK del micro y funciona como el external reference clock
+
El primero es el bus clock, este se selecciona por defecto después de cada reset y trabajará a la misma frecuencia que esté trabajando el micro.
La última opción para escoger el clock con el que se quiere trabajar es el ADACK que es un reloj asíncrono que se genera por otro reloj fuente del ADC y se mantiene activo cuando el micro esta en modo stop3 o wait permietiendo conversiones en ambos modos para operaciones con menor ruido
+
  
Sin importar el reloj que se haya escogido como fuente, es necesario que la frecuencia con la que se vaya a trabajar esté dentro del rango de frecuencia para el ADCK. Dicho rango esta entre 0.4 Mhz y 8.0 Mhz para conversiones rápidas (High Speed Conversion, bit ADLPC =0) y entre 0.4 Mhz y 4.0 Mhz para conversiones que permiten ahorrar potencia (Low power conversión, bit ADLPC =1).
 
  
===Modos de conversión===
+
La segunda opción es tomar como fuente el mismo bus clock pero el módulo del ADC nos permite dividirlo por 2, 4 y 8 para variar la velocidad de conversión.
  
El módulo del ADC permite dos modos de conversión, estas son conversión continua y conversión simple. Estas se pueden configurar con el bit ADC0 del registro de estatus y control ADCSC1 (ver Registros de Control).
 
  
*Si fue seleccionado el '''Hardware trigger''' y se configura el ADC0 para '''conversión continua''', cada vez que le llegue un flanco de subida a ADHWT el módulo hará la conversión. Si el ADC0 se configura para '''conversión simple''' el módulo hará una conversión cuando le llegue un flanco de subida a ADHWT y no iniciará otra si no que se mantendrá ocioso
+
El tercero es el ALTCLK (alternate clock) que se establece como el [[ICS (Configuración Reloj Interno) - MC9S08QE128|ICSERCLK]] del micro y funciona como el external reference clock
 +
La última opción para escoger el clock con el que se quiere trabajar es el ADACK que es un reloj asíncrono que se genera por otro reloj fuente del ADC y se mantiene activo cuando el micro esta en modo stop3 o wait permitiendo conversiones en ambos modos para operaciones con menor ruido.
  
*Si fue seleccionado '''Software trigger''' y se configura configura el ADC0 para '''conversión continua''', cada vez que se escriba en el registro de control ADCSC1 el módulo hará la conversión. Si el ADC0 se configura para '''conversión simple''' el módulo hará una conversión cada vez que se escriba en el registro de control ADCSC1 y no iniciará otra si no que se mantendrá ocioso
 
  
==Registros==
+
Sin importar el reloj que se haya escogido como fuente, es necesario que la frecuencia con la que se vaya a trabajar esté dentro del rango de frecuencia para el ADCK. Dicho rango esta entre 0.4 Mhz y 8.0 Mhz para conversiones rápidas (High Speed Conversion, bit ADLPC =0) y entre 0.4 Mhz y 4.0 Mhz para conversiones que permiten ahorrar potencia (Low Power Conversión, bit ADLPC =1).
 +
 
 +
=== Modos de conversión ===
 +
 
 +
El módulo del ADC permite dos modos de conversión, estos son: el modo de conversión continua y el modo de conversión simple, los cuales pueden configurarse con el bit ADC0 del registro de estatus y control ADCSC1 (ver Registros de Control).
 +
 
 +
 
 +
* Si fue seleccionado el '''Hardware trigger''' y se configura el ADC0 para '''conversión continua''', cada vez que le llegue un flanco de subida a ADHWT el módulo hará la conversión. Si el ADC0 se configura para '''conversión simple''' el módulo hará una conversión cuando le llegue un flanco de subida a ADHWT y no iniciará otra si no que se mantendrá ocioso.
 +
 
 +
 
 +
* Si fue seleccionado '''Software trigger''' y se configura el ADC0 para '''conversión continua''', cuando se escriba en el registro de control ADCSC1 el módulo iniciará la primera conversión y una vez que finalice iniciará otra conversión hasta que se detenga. Si el ADC0 se configura para '''conversión simple''' el módulo hará una conversión cada vez que se escriba en el registro de control ADCSC1 y no iniciará otra si no que se mantendrá ocioso.
 +
 
 +
== Registros ==
 +
 
 +
===Inicialización del Micro (MCU Init)===
 +
 
 +
====SCIGC1 Control del bus clock====
 +
 
 +
En este registro, se habilita y deshabilita el bus clock para diferentes módulos
 +
 +
[[Archivo:scigc1adc.jpg|500px|center|thumb|Registro SCGC1.]]
 +
 
 +
* PARA HABILITAR EL BUS CLOCK PARA EL ADC EL BIT 4 DEBE ESTAR EN 1 !!
  
===Estatus y Control===
+
=== Estatus y Control ===
  
====ADCSC1 Estatus y Control 1====
+
==== ADCSC1 Estatus y Control 1 ====
  
 
Cada vez que se escriba en este registro, se abortará la conversión en curso y se iniciará otra nueva.
 
Cada vez que se escriba en este registro, se abortará la conversión en curso y se iniciará otra nueva.
  
[[Archivo:adcsc1.jpg|700px|center|thumb|Registro ADCSC1]]
+
[[Archivo:adcsc1.jpg|500px|center|thumb|Registro ADCSC1.]]
  
*BIT 7 – '''COCO (Conversion Complete Flag)'''  
+
* BIT 7 – '''COCO (Conversion Complete Flag)'''
Cuando la función de comparar está deshabilitada (''ACFE =0''), se establecerá la bandera '''COCO=1''' cada vez que que se complete una conversión, de lo contrario será igual a cero ('''COCO =0''').
+
  
Cuando la función de comparar está habilitada (''ACFE =1''), se establecerá la bandera '''COCO =1''' cada vez que se haya completado una conversión y el resultado de ésta sea TRUE, de lo contrario '''COCO =0'''.
+
Cuando la función de comparar esté inhabilitada (''ACFE =0''), se establecerá la bandera '''COCO=1''' cada vez que se complete una conversión, de lo contrario será igual a cero ('''COCO =0''').
  
El bit COCO se borra cada vez que se escriba en ADCSC1 o cada vez que se lea el registro ADCRL.
+
Cuando la función de comparar esté habilitada (''ACFE =1''), se establecerá la bandera '''COCO =1''' cada vez que se haya completado una conversión y el resultado de ésta sea TRUE, de lo contrario '''COCO =0'''.
 +
 
 +
El bit COCO se borra cada vez que se escribe en ADCSC1 o cada vez que se lee el registro ADCRL.
 +
 
 +
 
 +
* BIT 6 – '''AIEN (Interrupt Enable)'''
  
*BIT 6 – '''AIEN (Interrupt Enable)'''
 
 
Este bit habilita las interrupciones que se establecen cuando se ha completado una conversión.
 
Este bit habilita las interrupciones que se establecen cuando se ha completado una conversión.
  
Si '''AIEN =0''' se deshabilitan las interrupciones al completar una conversión.
+
Si '''AIEN =0''' se inhabilitan las interrupciones al completar una conversión.
  
 
Si '''AIEN =1''' se habilitarán las interrupciones cada vez que la bandera COCO se establezca.
 
Si '''AIEN =1''' se habilitarán las interrupciones cada vez que la bandera COCO se establezca.
  
*BIT 5 –'''ADCO (Continuous Conversion Enable)'''
 
  
Si '''ADCO =0''' se selecciona el modo de conversion simple (ver Modos de Conversion).
+
* BIT 5 –'''ADCO (Continuous Conversion Enable)'''
  
Si '''ADCO =1''' se selecciona el modo de conversión continuo  (ver Modos de Conversion).
+
Si '''ADCO =0''' se selecciona el modo de conversión simple (ver Modos de Conversión).
 +
 
 +
Si '''ADCO =1''' se selecciona el modo de conversión continuo  (ver Modos de Conversión).
 +
 
 +
 
 +
* BITS 4:0 –'''ADCH Input cannel select'''
  
*BITS 4:0 –'''ADCH Input cannel select'''
 
 
En estos 5 bits mas bajos del registro ADCSC1 se coloca el valor en binario del canal en el que se quiere trabajar, si el modo de conversión continuo fue seleccionado, se pueden poner estos 5 bits en 1 al finalizar las conversiones para prevenir que otra sea ejecutada, si fue escogido el modo de conversión simple esto no es necesario.
 
En estos 5 bits mas bajos del registro ADCSC1 se coloca el valor en binario del canal en el que se quiere trabajar, si el modo de conversión continuo fue seleccionado, se pueden poner estos 5 bits en 1 al finalizar las conversiones para prevenir que otra sea ejecutada, si fue escogido el modo de conversión simple esto no es necesario.
(ver Asignacion de Canales)
+
(ver Asignación de Canales)
  
====ADCSC2 Estatus y Control 2====
+
==== ADCSC2 Estatus y Control 2 ====
  
 
Este registro controla la función de comparar, el trigger a usar para la conversión y el indicador de conversión activa
 
Este registro controla la función de comparar, el trigger a usar para la conversión y el indicador de conversión activa
  
[[Archivo:adcsc2.jpg|700px|center|thumb|Registro ADCSC2]]
+
[[Archivo:adcsc2.jpg|500px|center|thumb|Registro ADCSC2.]]
  
*BIT 7 – '''ADACT (Conversion Active)'''
+
 
Este bit indica cuando una conversion se esta ejecutando, se establece cuando se inicia una conversión y se borra cuando la misma conversión se completa o se aborta.
+
* BIT 7 – '''ADACT (Conversion Active)'''
 +
 
 +
Este bit indica cuando una conversión se esta ejecutando, se establece cuando se inicia una conversión y se borra cuando la misma conversión se completa o se aborta.
  
 
Si ADACT =0 no se esta ejecutando ninguna conversión.
 
Si ADACT =0 no se esta ejecutando ninguna conversión.
Línea 111: Línea 146:
 
Si ADACT =1 hay una conversión ejecutándose.
 
Si ADACT =1 hay una conversión ejecutándose.
  
*BIT 6 – '''ADTRG (Conversion Trigger Select)'''
+
 
 +
* BIT 6 – '''ADTRG (Conversion Trigger Select)'''
 +
 
 
Este bit se usa para seleccionar qué tipo de trigger se va a usar para inciar una conversión.
 
Este bit se usa para seleccionar qué tipo de trigger se va a usar para inciar una conversión.
  
Línea 118: Línea 155:
 
Si ADTRG = 1 se selecciona hardware trigger, la conversión se hará cada vez que le llegue un flanco de subida a ADHWT (ver Hardware Trigger y Modos de Operacion).
 
Si ADTRG = 1 se selecciona hardware trigger, la conversión se hará cada vez que le llegue un flanco de subida a ADHWT (ver Hardware Trigger y Modos de Operacion).
  
*BIT 5 - '''ACFE (Compare Function Enable)'''
+
 
 +
* BIT 5 - '''ACFE (Compare Function Enable)'''
 +
 
 
Habilita la función de comparar (ver ADCSC1_COCO).
 
Habilita la función de comparar (ver ADCSC1_COCO).
  
Si ACFE =0 se deshabilita la funcion comparar.  
+
Si ACFE =0 se inhabilita la función comparar.
  
Si ACFE =1 se habilita la funcion comparar.
+
Si ACFE =1 se habilita la función comparar.
  
*BIT 4 - '''ACFGT (Compare Function Greater Than Enable)'''
+
 
Cuando el resultado de la conversión es mayor o igual que el valor de comparación la función de comparación hace el trigger.
+
* BIT 4 - '''ACFGT (Compare Function Greater Than Enable)'''
 +
 
 +
Cuando el resultado de la conversión es mayor o igual que el valor de comparación la función de comparación hace el Trigger.
  
 
Si ACFGT=0 se hace el trigger si la entrada es menor que el valor de comparación.
 
Si ACFGT=0 se hace el trigger si la entrada es menor que el valor de comparación.
Línea 132: Línea 173:
 
Si ACFGT=1 se hace el trigger si la entrada es mayor o igual que el valor de comparación.
 
Si ACFGT=1 se hace el trigger si la entrada es mayor o igual que el valor de comparación.
  
*'''Los bits 3 y 2''' son solo de lectura y son siempre cero, '''los bits 1 y 2''' son de lectura y escritura pero están reservados y su valor '''siempre deberá ser cero'''
+
* '''Los bits 3 y 2''' son solo de lectura y son siempre cero, '''los bits 1 y 2''' son de lectura y escritura pero están reservados y su valor '''siempre deberá ser cero'''
  
  
===Data Convertida===
+
=== Data Convertida ===
  
 
Al relizar cada conversión, el resultado se guarda en los registros ADCRH Y ADCRL. el módulo tiene un mecanismo de bloqueo que previene que la data de ADCRH y
 
Al relizar cada conversión, el resultado se guarda en los registros ADCRH Y ADCRL. el módulo tiene un mecanismo de bloqueo que previene que la data de ADCRH y
 
ADCRL sea sobreescrita con una data nueva si la anterior se está leyendo mientras se esté en modo de 12 o 10 bits. Cuando se activa este bloqueo COCO no se
 
ADCRL sea sobreescrita con una data nueva si la anterior se está leyendo mientras se esté en modo de 12 o 10 bits. Cuando se activa este bloqueo COCO no se
establece para la nueva data bloqueada y esta se pierde. En caso de estar usando el modo de conversión simple con la funcion de comparación habilitada
+
establece para la nueva data bloqueada y esta se pierde. En caso de estar usando el modo de conversión simple con la función de comparación habilitada
este bloqueo no tiene efecto alguno sobre las conversiones del ADC, para los demás casos cuando una nueva data es bloqueada y perdida se inicia otra conversión  
+
este bloqueo no tiene efecto alguno sobre las conversiones del ADC, para los demás casos cuando una nueva data es bloqueada y perdida se inicia otra conversión
sin importar el modo de conversión en el que se esté trabajando.  
+
sin importar el modo de conversión en el que se esté trabajando.
 +
 
  
 
Al trabajar con el modo de operación simple se debe tener cuidado con que los registros de data
 
Al trabajar con el modo de operación simple se debe tener cuidado con que los registros de data
 
no se lean hasta que la conversión anterior se haya completado.
 
no se lean hasta que la conversión anterior se haya completado.
  
====ADCRH Data Result High Register====
+
 
 +
==== ADCRH Data Result High Register ====
  
 
En modo de operación de 12 bits, ADCRH guarda los 4 bits mas significativos de la conversión.
 
En modo de operación de 12 bits, ADCRH guarda los 4 bits mas significativos de la conversión.
[[Archivo:adcrh.jpg|700px|center|thumb|Registro ADCRH]]
+
 
 +
 
 +
[[Archivo:adcrh.jpg|500px|center|thumb|Registro ADCRH.]]
 +
 
 +
 
 
Si se trabaja con el modo de operación de 8bit los bits 0, 1, 2 y 3 del registro ADCRH serán iguales a cero. Si se trabaja con el modo de 10bits, los bits 2 y 3
 
Si se trabaja con el modo de operación de 8bit los bits 0, 1, 2 y 3 del registro ADCRH serán iguales a cero. Si se trabaja con el modo de 10bits, los bits 2 y 3
 
del ADCRH serán iguales a cero. En caso de cambiar el modo de operación, cualquier dato guardado en ADCRH será borrado
 
del ADCRH serán iguales a cero. En caso de cambiar el modo de operación, cualquier dato guardado en ADCRH será borrado
  
====ADCRL Data Result Low Register====
+
==== ADCRL Data Result Low Register ====
  
 
En este registro se guardan los 8 bits mas bajos de la conversión.
 
En este registro se guardan los 8 bits mas bajos de la conversión.
[[Archivo:adcrl.jpg|700px|center|thumb|Registro ADCRL]]
+
 
 +
 
 +
[[Archivo:adcrl.jpg|500px|center|thumb|Registro ADCRL.]]
 +
 
  
 
Cuando ADCRL es leído, COCO bit se borra. si ADCRL no es leído antes de que la siguiente conversión se haga entonces el dato se perderá.
 
Cuando ADCRL es leído, COCO bit se borra. si ADCRL no es leído antes de que la siguiente conversión se haga entonces el dato se perderá.
 
En caso de cambiar el modo de operación, cualquier dato guardado en ADCRH será borrado.
 
En caso de cambiar el modo de operación, cualquier dato guardado en ADCRH será borrado.
  
===Valor del Dato de Comparación===
+
=== Valor del Dato de Comparación ===
  
 
Estos registros guardan el valor del dato con el que se quiere comparar el resultado de la conversión que vaya a ejecutar.
 
Estos registros guardan el valor del dato con el que se quiere comparar el resultado de la conversión que vaya a ejecutar.
 +
  
 
Si se trabaja en modo de operación de 12bits, se compararan los 4 bits mas altos almacenados en ADCCVH (3:0) directamente con los mismos bits del registro
 
Si se trabaja en modo de operación de 12bits, se compararan los 4 bits mas altos almacenados en ADCCVH (3:0) directamente con los mismos bits del registro
ADCRH. Si se trabaja con modo de operación 10 bits se compararan los 2 bits mas altos almacenados en ADCCVH (1:0) directamente con los mismos bits del registro
+
ADCRH.  
ADCRH. Si se trabaja con modo de operación 8 bits se compararan los 8 bits mas bajos de la conversión almacenados en ADCCVL (7:0) directamente con los mismos bits del registro
+
ADCRL
+
  
====ADCCVH Compare Value High Register====
 
[[Archivo:adccvh.jpg|700px|center|thumb|Registro ADCCVH]]
 
  
ADCCVH guarda los bits 8, 9, 10 y 11 del valor de comparación, en caso de trabajar en modo de operación menor a 12 bits, el resto del registro se llenará con ceros
+
Si se trabaja con modo de operación 10 bits se compararan los 2 bits mas altos almacenados en ADCCVH (1:0) directamente con los mismos bits del registro
 +
ADCRH.
  
====ADCCVL Compare Value Low Register====
+
Si se trabaja con modo de operación 8 bits se compararan los 8 bits mas bajos de la conversión almacenados en ADCCVL (7:0) directamente con los mismos bits del registro
[[Archivo:adccvl.jpg|700px|center|thumb|Registro ADCCVL]]
+
ADCRL.
  
ADCCVL guarda los 8 bits mas bajos del valor de comparación.
+
==== ADCCVH Compare Value High Register ====
  
===ADCCFG Registro de Configuracion===
 
  
ADCCFG es usado para seleccionar el modo de operación, la fuente del clock y configurar el módulo para ahorro de energía o tiempo de muestreo largo
+
[[Archivo:adccvh.jpg|500px|center|thumb|Registro ADCCVH.]]
  
[[Archivo:ADCCFG.jpg|700px|center|thumb|Registro ADCCFG]]
 
  
*BIT 7 - '''ADLPC (Low Power Configuration)'''
+
ADCCVH guarda los bits 8, 9, 10 y 11 del valor de comparación, en caso de trabajar en modo de operación menor a 12 bits, el resto del registro se llenará con ceros
Cuando el módulo no se ha configurado para obtener tiempos de muestreo largos en las conversiones, este bit se usa para ahorrar energía
+
  
Si '''ADLPC =0''' se configura el módulo para alta velocidad
 
  
Si '''ADLPC =1''' Se configura el módulo para ahorro de energía pero se usa la máxima velocidad del clock
+
==== ADCCVL Compare Value Low Register ====
  
*BITS 6:5 - '''ADIV (Clock Divide Select)'''
 
ADIV selecciona la relación de división usada por el ADC para generar el clock interno ADCK
 
[[Archivo:clkdivide.jpg|700px|center|thumb|Tabla de relaciones de división]]
 
  
*BIT 4 - '''ADLSMP (Long Sample Time configuration)'''
+
[[Archivo:adccvl.jpg|500px|center|thumb|Registro ADCCVL.]]
  
ADLSMP escoge entre Long Sample Time y Short Sample time, en long sample time el periodo de la muestra de la señal de entrada que se escoge es mayor y se obtienen
 
medidas o resultados mas precisos, en short sample time sucede lo contrario pero la conversión se hace más rapido
 
  
Si '''ADLSMP =0''' se escoge short sample time
+
ADCCVL guarda los 8 bits mas bajos del valor de comparación.
  
Si '''ADLSMP =1''' se selecciona long sample time
 
  
*BITS 3:2 - '''MODE (Conversion Mode Selection)'''
+
=== ADCCFG Registro de Configuración ===
  
Estos bits se usan para seleccionar el modo de operación que tendrá la conversión puede ser de 12bits, 10bits u 8bits
 
  
[[Archivo:conversionmodes.jpg|700px|center|thumb|Modos De Operación]]
+
ADCCFG es usado para seleccionar el modo de operación, la fuente del clock y configurar el módulo para ahorro de energía o tiempo de muestreo largo
  
*BITS 1:0 - '''ADICLK (Input Clock Select)'''
 
Estos bits se usan para seleccionar de entre las 4 posibles fuentes de clocks para generar el ADCK
 
  
[[Archivo:clkselect.jpg|700px|center|thumb|Input Clock Select]]
+
[[Archivo:ADCCFG.jpg|500px|center|thumb|Registro ADCCFG.]]
  
  
===Control de Pines===
+
* BIT 7 - '''ADLPC (Low Power Configuration)'''
  
Estos 3 registros APCTL1, APCTL2 y APCTL3 se encargan de deshabilitar los puertos de entrada/salida del micro que estén siendo usados como entradas analógicas.
+
Cuando el módulo no se ha configurado para obtener tiempos de muestreo largos en las conversiones, este bit se usa para ahorrar energía
  
'''APTCLY_ADPCX =0''' deshabilita el puerto X del registro APTCLY
+
Si '''ADLPC =0''' se configura el módulo para alta velocidad
  
'''APTCLY_ADPCX =1''' habilita el puerto X del registro APTCLY
+
Si '''ADLPC =1''' Se configura el módulo para ahorro de energía pero se usa la máxima velocidad del clock
  
*APTCL1 controla los pines asociados a los canales del 0 al 7
 
*APTCL2 controla los pines asociados a los canales del 8 al 15
 
*APTCL3 controla los pines asociados a los canales del 16 al 23
 
  
==Wait y Modo Stop3==
+
* BITS 6:5 - '''ADIV (Clock Divide Select)'''
  
===Operación Wait===
+
ADIV selecciona la relación de división usada por el ADC para generar el clock interno ADCK
  
La instrucción WAIT pone al micro en Low-power consumption standby mode, consumiendo poca energía y entrando en modo de espera del cual se recupera muy rápido
+
[[Archivo:clkdivide.jpg|500px|center|thumb|Tabla de relaciones de división.]]
ya que los clocks fuentes se mantienen activos. Si se está ejecutando una conversión cuando el micro entra en modo WAIT la conversión de todas formas se completará.
+
Si se trabaja con el hardware trigger el micro podrá estar en wait mode y cuando llegue el flanco de subida a ADTWH se hará la conversión
+
  
Cuando se establece COCO se genera una interrupción por haber completado la conversión (si AIEN=1) que despierta al módulo ADC del modo WAIT
 
  
===Modo Stop3===
+
* BIT 4 - '''ADLSMP (Long Sample Time configuration)'''
  
Esta instrucción se usa cuando la mayoria de las fuentes de clocks están deshabilitadas y se encarga de poner al micro en Low-power consumption standby mode
+
ADLSMP escoge entre Long Sample Time y Short Sample time, en long sample time el periodo de la muestra de la señal de entrada que se escoge es mayor y se obtienen
 +
medidas o resultados mas precisos, en short sample time sucede lo contrario pero la conversión se hace más rápido.
  
====Modo Stop3 con ADACK deshabilitado====
+
Si '''ADLSMP =0''' se escoge short sample time.
  
Si el clock asíncrono ADACK no fue seleccionado como el clock para la conversión, al ejecutar la instruccion Stop3 la conversión se abortará y el módulo entrara
 
en estado ocioso. Los contenidos de los registros ADCRH y ADCRL no se verán afectados por esta instrucción. Al salir del Stop3 mode, se necesitará de un hardare trigger
 
para continuar con las conversiones
 
  
====Modo Stop3 con ADACK habilitado====
+
Si '''ADLSMP =1''' se selecciona long sample time
  
Si el clock asíncrono ADACK fue seleccionado como el clock para la conversión, al ejecutar la instruccion Stop3 la conversión se realizará. Las conversiones se
 
podrán iniciar estando en Stop3 mode por hardware trigger o si se trabaja en modo de conversión continua (ADCO =0). Cuando se establece COCO se genera una
 
interrupción por haber completado la conversión (si AIEN=1) que despierta al módulo ADC del modo Stop3
 
  
==Ejemplos==
+
* BITS 3:2 - '''MODE (Conversion Mode Selection)'''
  
===Ejemplo de uso del ADC en assembler===
+
Estos bits se usan para seleccionar el modo de operación que tendrá la conversión puede ser de 12bits, 10bits u 8bits
  
 +
[[Archivo:conversionmodes.jpg|600px|center|thumb|Modos De Operación.]]
  
NOLIST
+
'''Calculo del tiempo de conversión:'''
  
INCLUDE 'derivative.inc'
+
Para efectos del cálculo del tiempo que toma una conversión en ejecutarse, en la siguiente tabla se  relaciona el tiempo dependiendo del reloj elegido (ADCLK = ADICLK/ADIV) y el bit ADSMP.  
  
LIST                ; ..storage and THIS is it's place
 
; -------------------------------------------------------------------
 
  
;DEFINES
 
  
ram:           SET    Z_RAMStart  ; $80
+
[[Archivo:Tiempos de conversión.jpg|400px|center|thumb|Tiempos de conversión.]]
  
rom:          SET    ROMStart    ; $2080
 
  
initStack:     EQU    RAMEnd + 1  ; $1800=$17FF+1. SP = $17FF
+
* BITS 1:0 - '''ADICLK (Input Clock Select)'''
  
COP_Disable:  EQU    $42
+
Estos bits se usan para seleccionar de entre las 4 posibles fuentes de clocks para generar el ADCK
  
;---------------------------------------------------------------------
 
; MAIN PROGRAM HEADER:
 
  
ABSENTRY Main
+
[[Archivo:clkselect.jpg|600px|center|thumb|Input Clock Select.]]
  
ORG rom
+
=== Control de Pines ===
  
Main: 
+
Estos 3 registros APCTL1, APCTL2 y APCTL3 se encargan de deshabilitar los puertos de entrada/salida del micro que estén siendo usados como entradas analógicas.
  
lda    #COP_Disable ; Se deshabilita el WatchDog
+
'''APCTLY_ADPCX =0''' deshabilita el puerto X del registro APTCLY
  
sta    SOPT1      ; ..System Options 1
+
'''APCTLY_ADPCX =1''' habilita el puerto X del registro APTCLY
  
ldhx  #initStack  ; Set up SP
+
* APCTL1 controla los pines asociados a los canales del 0 al 7.
 +
* APCTL2 controla los pines asociados a los canales del 8 al 15.
 +
* APCTL3 controla los pines asociados a los canales del 16 al 23.
  
txs                ; ...
+
== Wait y Modo Stop3 ==
+
;-------------------------------
+
; MCU_Init
+
  
lda    #$10        ; Habilita el Bus Clock para el módulo ADC
+
=== Operación Wait ===
sta    SCGC1
+
clra                ; Se deshabilitan los periféricos que no se usan para Bus clock
+
sta    SCGC2
+
;-------------------------------
+
  
; Init LEDs PORTs PTCD (bits 0-5) and PTED (bits 6-7)
+
La instrucción WAIT pone al micro en Low-power consumption standby mode, consumiendo poca energía y entrando en modo de espera del cual se recupera muy rápido
 +
ya que los clocks fuentes se mantienen activos.
  
mov    #%11110000, PTCD ; Se prenden 4 LEDs para verificar
 
  
mov    #%11111111, PTED ; Los Leds de PTED tienen lógicas negada, se apagan
+
Si se está ejecutando una conversión cuando el micro entra en modo WAIT la conversión de todas formas se completará.
  
mov    #$FF, PTCDD ; Se seleccionan los PTCD como salida
 
  
mov    #$FF, PTEDD ; Se colocan los PTED como salidas
+
Si se trabaja con el hardware trigger el micro podrá estar en wait mode y cuando llegue el flanco de subida a ADTWH se hará la conversión.
  
;------------------------------------------------------------------
+
Cuando se establece COCO se genera una interrupción por haber completado la conversión (si AIEN=1) que despierta al módulo ADC del modo WAIT
; ADC_configuration
+
  
mov    #$20, ADCSC1 ; Modo de conversion continuo seleccionado, Canal ADC0 seleccionado,
+
=== Modo Stop3 ===
clr    ADCSC2      ; Software trigger selected
+
mov    #$30, ADCCFG ; Input clock/2. Long Sample time, modo de operacion 8-bit conversion
+
clr    APCTL1      ; Se deshabilita el puerto asociado al canal 0
+
bset    APCTL1_ADPC0, APCTL1  ; Select channel for ADC input
+
bset    ADCSC1_AIEN, ADCSC1    ; Se habilitan las interrupciones del AIEN
+
bra    *
+
  
; ------------------------------------------------------------------
+
Esta instrucción se usa cuando la mayoría de las fuentes de clocks están deshabilitadas y se encarga de poner al micro en Low-power consumption standby mode
ADC_ISR:
+
  
lda    ADCRL      ;Se lee la data de ADCRL, COCO se borra!
+
==== Modo Stop3 con ADACK deshabilitado ====
sta    ~PTCD        ; Move ADC value to port C, los Leds se prenden con 0's
+
sta    ~PTED        ; ..and to port E
+
rti
+
  
;-------------------------------------------------------------
+
Si el clock asíncrono ADACK no fue seleccionado como el clock para la conversión, al ejecutar la instrucción Stop3 la conversión se abortará y el módulo entrara
nop ; <<<NEEDED by CodeWarrior 10.1&2 (not 6.3).<<<
+
en estado ocioso. Los contenidos de los registros ADCRH y ADCRL no se verán afectados por esta instrucción. Al salir del Stop3 mode, se necesitará de un hardware trigger
;--------------------------------------------------------------------
+
para continuar con las conversiones
; Interrupt Vectors
+
  
ORG    Vadc
+
==== Modo Stop3 con ADACK habilitado ====
DC.W  ADC_ISR
+
ORG    Vreset
+
DC.W  Main        ; RESET
+
  
END
+
Si el clock asíncrono ADACK fue seleccionado como el clock para la conversión, al ejecutar la instruccion Stop3 la conversión se realizará. Las conversiones se
 +
podrán iniciar estando en Stop3 mode por hardware trigger o si se trabaja en modo de conversión continua (ADCO =0). Cuando se establece COCO se genera una
 +
interrupción por haber completado la conversión (si AIEN=1) que despierta al módulo ADC del modo Stop3
  
 +
== Ejemplos ==
  
===Ejemplo del uso del ADC en C===
+
=== Inicialización general del ADC en Assembler===
  
====Ejemplo por encuesta====
+
<syntaxhighlight lang="asm">
 +
ram:          SET    Z_RAMStart  ; $80
 +
rom:          SET    ROMStart    ; $2080
  
;''#'' include <hidef.h> /* for EnableInterrupts macro */
+
lda    $111 ; WatchDog Disable
 +
sta    SOPT1      ; ..System Options 1
 +
ldhx  RAMEnd + 1  ; $1800=$17FF+1. SP = $17FF
 +
txs
 +
 +
lda    #$23       
 +
sta    SCGC1 ; Habilita Bus Clock para el módulo ADC
 +
mov    #$20, ADCSC1 ; Modo de conversion continuo seleccionado, se selecciona el canal 0
 +
clr    ADCSC2_ADTRG ; Software trigger seleccionado
 +
mov    #$30, ADCCFG ; Input clock/2. Long Sample time, modo de operacion 8-bit
 +
clr    APCTL1     
 +
bset  APCTL1_ADPC0, APCTL1  ; Se deshabilita el puerto asociado al canal 0 (Ver registro APTCL1)
 +
bset  ADCSC1_AIEN, ADCSC1    ; Se habilitan las interrupciones del AIEN
 +
</syntaxhighlight>
  
;''#'' include "derivative.h" /* include peripheral declarations */
+
===Inicialización general del Módulo en C===
  
 +
<syntaxhighlight lang="c">
 +
SOPT1 = 0x23;          /* Watchdog deshabilitado. Stop Mode Habilitado. RESET pin habilitado */ 
 +
SCGC1 = 0x11;          /* Se habilita el Bus Clock para el módulo ADC!!! */
  
 +
ADCSC1 = 0x60;        /* Se selecciona el canal ADCH0, Se selecciona modo de conversion continua y se habilitan las interrupciones
 +
                          Ver Registro ADCSC1*/
 +
ADCSC2 = 0x00;        // Se deshabilita la funcion de comparación y se selecciona el software trigger
 +
ADCCFG = 0x40;        // Se selecciona Long Sample time y se divide el Bus Clock entre 2
 +
APCTL1 = 0x00;        // Se deshabilita el puerto asociado al canal ADCH0 ya que esta siendo usado como entrada analogica
 +
</syntaxhighlight>
  
void main(void) {
 
  
;//Configuracion_ADC
 
 
ADCSC1 = 0x60; // Se selecciona el canal ADCH0, Se selecciona modo de conversion continua y se habilitan las interrupciones
 
ADCSC2 = 0x00; // Se deshabilita la funcion de comparacion y se selecciona el software trigger
 
ADCCFG = 0x40; // Se selecciona Long Sample time y se divide el Bus Clock entre 2
 
APCTL1 = 0x00; // Se deshabilita el puerto asociado al canal ADCH0 ya que esta siendo usado como entrada analogica
 
 
 
EnableInterrupts; /* enable interrupts */
 
  
/* include your code here */
+
=== Ejemplo de uso del ADC en assembler ===
  
 
+
<syntaxhighlight lang="asm">
;while(ADCSC1_COCO==0); // Esperar que la conversion se ejecute
+
;*******************************************************************
 +
;* This stationery serves as the framework for a user application. *
 +
;* For a more comprehensive program that demonstrates the more    *
 +
;* advanced functionality of this processor, please see the        *
 +
;* demonstration applications, located in the examples            *
 +
;* subdirectory of the "Freescale CodeWarrior for HC08" program    *
 +
;* directory.                                                      *
 +
;*******************************************************************
  
;PTCD= ~(ADCRL);         // Muestra el resultado NEGADO de la conversion en los leds de PTCD
+
; Include derivative-specific definitions
 +
            INCLUDE 'derivative.inc'
 +
;
 +
; export symbols
 +
;
 +
            XDEF _Startup
 +
            ABSENTRY _Startup
  
for(;;) {
+
;
 +
; variable/data section
 +
;
  
__RESET_WATCHDOG(); /* feeds the dog */
+
COP_Disable:  EQU    $42
  
/* loop forever */
+
            ORG    RAMStart        ; Insert your data definition here
 +
ExampleVar: DS.B  1
  
}  /* please make sure that you never leave main */
+
;
 +
; code section
 +
;
 +
            ORG    ROMStart
  
}
+
_Startup:
 +
            LDHX  #RAMEnd+1        ; initialize the stack pointer
 +
            TXS
 +
            LDA    #COP_Disable  ; Se deshabilita el WatchDog
 +
            STA    SOPT1        ; ..System Options 1
 +
            ; -------------------------------
 +
            ; MCU_Init
 +
            LDA    #$10        ; Habilita el Bus Clock para el módulo ADC
 +
            STA    SCGC1
 +
            CLRA              ; Se deshabilitan los periféricos que no se usan para Bus clock
 +
            STA    SCGC2
 +
           
 +
            ; Init LEDs PORTs PTCD (bits 0-5) and PTED (bits 6-7)
 +
 +
            MOV    #%11110000, PTCD ; Se prenden 4 LEDs para verificar
 +
            MOV    #%11111111, PTED ; Los Leds de PTED tienen lógicas negada, se apagan
 +
            MOV    #$FF, PTCDD      ; Se seleccionan los PTCD como salida
 +
            MOV    #$FF, PTEDD      ; Se colocan los PTED como salidas
 +
           
 +
           
 +
            ;------------------------------------------------------------------
 +
            ; ADC_configuration
 +
           
 +
            MOV    #$20, ADCSC1 ; Modo de conversion continuo seleccionado, Canal ADC0 seleccionado,
 +
            CLR    ADCSC2      ; Software trigger selected
 +
            MOV    #$30, ADCCFG ; Input clock/2. Long Sample time, modo de operacion 8-bit conversion
 +
            CLR    APCTL1      ; Se deshabilita el puerto asociado al canal 0
 +
           
 +
            ;------------------------------------------------------------------
 +
 +
            BSET    APCTL1_ADPC0, APCTL1  ; Select channel for ADC input
 +
            BSET    ADCSC1_AIEN, ADCSC1    ; Se habilitan las interrupciones del AIEN         
 +
            CLI                    ; enable interrupts
  
====Ejemplo con vector de interrupcion====
+
mainLoop:
 +
            ; Insert your code here
 +
            NOP 
 +
            feed_watchdog
 +
            BRA    mainLoop
 +
           
 +
           
 +
           
 +
; ------------------------------------------------------------------
 +
ADC_ISR:
 +
 +
            LDA    ADCRL      ;Se lee la data de ADCRL, COCO se borra!..(LEDs turn on with 0's)
 +
            COMA              ; Se niega el valor del ADCRL almacenado en el acumulador para que los LEDs
 +
                              ; prendan cuando hay voltaje y esten apagados cuando no
 +
            STA    PTCD        ; Move ADC value to port C
 +
            STA    PTED        ; ..and to port E
 +
            RTI
  
''#''include <hidef.h> /* for EnableInterrupts macro */
+
;**************************************************************
 +
;* spurious - Spurious Interrupt Service Routine.             *
 +
;*             (unwanted interrupt)                          *
 +
;**************************************************************
 +
spurious:                          ; placed here so that security value
 +
            NOP                    ; does not change all the time.
 +
            RTI
  
''#''include "derivative.h" /* include peripheral declarations */
+
;**************************************************************
+
;*                 Interrupt Vectors                          *
void MCU_Init(void) {
+
;**************************************************************
 
+
            ORG    Vadc
SOPT1 = 0x23;          /* Watchdog disable. Stop Mode Enable. Background Pin enable. RESET pin enable *
+
            DC.W  ADC_ISR
SCGC1 = 0x10;         /* Bus Clock to the ADC module is enable */
+
            ORG    Vreset
SCGC2 = 0x00;         /* Disable Bus clock to unused peripherals */
+
            DC.W  _Startup        ; RESET
}
+
            END
 +
</syntaxhighlight>
  
void ADC_config(void) {
+
===Ejemplo del uso del ADC en C===
  
ADCSC1 = 0x60; // Se selecciona el canal ADCH0, Se selecciona modo de conversion continua y se habilitan las interrupciones
+
<syntaxhighlight lang="asm">
ADCSC2 = 0x00; // Se deshabilita la funcion de comparacion y se selecciona el software trigger
+
#include <hidef.h> /* for EnableInterrupts macro */
ADCCFG = 0x40; // Se selecciona Long Sample time y se divide el Bus Clock entre 2
+
#include "derivative.h" /* include peripheral declarations */
APCTL1 = 0x00; // Se deshabilita el puerto asociado al canal ADCH0 ya que esta siendo usado como entrada analogica
+
  
}
 
  
byte bandera;
 
  
 
void main(void) {
 
void main(void) {
  
;void MCU_Init();
+
 
+
ADCSC1 = 0x60; // Se selecciona el canal ADCH0, Se selecciona modo de conversion continua y se habilitan las interrupciones
;void ADC_config();
+
ADCSC2 = 0x00; // Se deshabilita la funcion de comparacion y se selecciona el software trigger
 
+
ADCCFG = 0x40; // Se selecciona Long Sample time y se divide el Bus Clock entre 2
 
+
APCTL1 = 0x00; // Se deshabilita el puerto asociado al canal ADCH0 ya que esta siendo usado como entrada analogica
 
+
 
+
 
EnableInterrupts; /* enable interrupts */
 
EnableInterrupts; /* enable interrupts */
  
 
/* include your code here */
 
/* include your code here */
  
 
+
ADCSC1_ADCH = 0;  // Al usar 8bit mode ADCRH siempre sera cero 
while(ADCSC1_COCO==0){ // Esperar que la conversion se ejecute
+
while(ADCSC1_COCO==0); // Esperar que la conversion se ejecute
 
+
PTCD= ~(ADCRL);         // Muestra el resultado de la conversion en los leds de PTCD
PTCD= ~(ADCRL);  
+
 
+
bandera =0;        // Muestra el resultado de la conversion en los leds de PTCD
+
 
+
}
+
  
 
for(;;) {
 
for(;;) {
  
 
__RESET_WATCHDOG(); /* feeds the dog */
 
__RESET_WATCHDOG(); /* feeds the dog */
 
+
/* loop forever */
/* loop forever */
+
  
 
}  /* please make sure that you never leave main */
 
}  /* please make sure that you never leave main */
  
 
}
 
}
 +
</syntaxhighlight>
  
void interrupt VectorNumber_Vadc ADC() {
+
==GLOSARIO ASSEMBLER==
 
+
while(ADCSC1_COCO==0);  // Esperar que la conversion se ejecute
+
 
+
bandera =1;
+
}
+
 
+
==Diagrama de Bloques Modulo ADC==
+
 
+
[[Archivo:diagramabloques.jpg|700px|center|thumb|Diagrama De Bloques ADC]]
+
 
+
== Referencias ==
+
  
*[http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf '''Reference Manual.''' ''Freescale'']
+
El profesor Ing. Luis Uribe hizo este glosario de instrucciones de assembler que usa el HC08
  
[[Categoría: MC9S08QE128]]
+
[https://www.dropbox.com/s/1wkjd9u1g8asnbk/%60HC8Glossary1.2.pdf?m '''HC08 Glossary Prof. Uribe'''],

Revisión actual del 11:50 19 jul 2013

Un convertidor analógico digital (ADC) es un dispositivo que convierte una cantidad física contínua (generalmente voltaje) a un número digital que representan la amplitud de dicha cantidad. La conversión implica un cuantización de la entrada por lo que se produce un pequeño error al realizar la conversión.

La salida digital que produce un módulo ADC es generalmente un número binario en complemento a 2 el cual es proporcional a la entrada.

La resolución del convertidor ADC indica la cantidad de valores discretos que puede producir para representar el rango analógico de interés. Por ejemplo, una ADC de 8bits puede representar 256 niveles de una señal analógica. Para mas información ver el artículo del ADC en Wikipedia.

El conversor ADC necesita una referencia que le indique cuales son los valores máximos y mínimos de voltaje para realizar la conversión. El módulo ADC posee dos señales de referencia llamadas Voltage Reference High (V REFH) y Voltage Reference Low (V REFL) y podrá convertir muestras entre V SSAD (Tierra Analógica) y V DDAD (conectada a V REFH) que va entre 1.8 y 3.6 Volts.

Diagrama de bloques ADC.

Características

El módulo ADC posee:

  • Algoritmo de aproximación lineal de 12 bits de resolución.
  • 24 canales.
  • Formato de salida digital seleccionable (12, 10 u 8 bits).
  • Modo de conversión simple o continua.
  • Interrupción y bandera para conversiones completadas.
  • Tiempo de muestreo configurable para el dato de salida.
  • Reloj para la entrada seleccionable de entre 4 fuentes.
  • Modos wait y stop3 para operaciones con menos ruido.
  • Trigger de conversión por hardware seleccionable.
  • Comparador automático (mayor que, menor que, igual a) con interrupción para un valor programable.

Asignación de canales

El módulo ADC del microcontrolador Freescale MC9S08QE128 cuenta con 24 canales de conversión cada uno a 12bits de resolución. La lista completa de pines asignados para cada canal se describe en el Manual de Referencia Archivo:MC9S08QE128RM Reference Manual.pdfy en la tabla a continuación.

Canales ADC.


La tarjeta de desarrollo DEMOQE128 cuenta con un potenciómetro de 10Kohm cuya salida puede ser conectada al pin PTC6 y/o al pin PTA0. Esta conexión se puede seleccionar por medio del Jumper J21. Si se conecta el potenciómetro a PTA0 se puede utilizar el Canal 0 del ADC para realizar la adquisición del valor del voltaje del potenciómetro.

El ADC permite hacer las conversiones para cualquiera de los 24 canales entre AD0 y AD23. Si el registro que guarda el canal en el que se quiere trabajar ADCSC1_ADCH(4:0) es igual a 11111, entonces el subsistema que se encarga de convertir será apagado.

Sensor de Temperatura

El ADC posee un sensor de temperatura cuya salida esta conectada al canal analógico AD26 y está definida por:

Temperatura_ADC.

De donde Vtemp es el voltaje del AD26 a la temperatura del ambiente, Vtemp25 es el voltaje del AD26 a 25°C que por datasheet del micro se sabe que es 701.2 mV y m es la pendiente del voltaje vs temperatura que se sabe por datasheet que es 1.646mV desde -40°C hasta 25°C y 1.769 mV desde 25°C hasta 85°C.

Para usar el sensor de temperatura será necesario llenar los 5 bits menos significativos del registro ADCSC1 que corresponden al canal que se usará, con el número decimal 26 en binario (11010).

Hardware Trigger

El trigger que inicia una conversión en el ADC puede ser vía software activándolo en un instante de tiempo programable o también puede ser vía hardware. Para esto, el Real Time Counter (RTC) puede ser habilitado como el trigger para cada conversión que se vaya a hacer con el ADC.

Basta con configurar el ADCSC2_ADTRG = 1 y asi el ADC hará la conversión cada vez que haya un flanco de subida en el ADHWT que sucederá cuando el RTCINT coincida con RTCMOD.

Selección del Clock

Una de las características del ADC es que tiene 4 relojes como fuente para escoger.

Bloques Clocks ADC.

El primero es el bus clock, este se selecciona por defecto después de cada reset y trabajará a la misma frecuencia que esté trabajando el micro.


La segunda opción es tomar como fuente el mismo bus clock pero el módulo del ADC nos permite dividirlo por 2, 4 y 8 para variar la velocidad de conversión.


El tercero es el ALTCLK (alternate clock) que se establece como el ICSERCLK del micro y funciona como el external reference clock La última opción para escoger el clock con el que se quiere trabajar es el ADACK que es un reloj asíncrono que se genera por otro reloj fuente del ADC y se mantiene activo cuando el micro esta en modo stop3 o wait permitiendo conversiones en ambos modos para operaciones con menor ruido.


Sin importar el reloj que se haya escogido como fuente, es necesario que la frecuencia con la que se vaya a trabajar esté dentro del rango de frecuencia para el ADCK. Dicho rango esta entre 0.4 Mhz y 8.0 Mhz para conversiones rápidas (High Speed Conversion, bit ADLPC =0) y entre 0.4 Mhz y 4.0 Mhz para conversiones que permiten ahorrar potencia (Low Power Conversión, bit ADLPC =1).

Modos de conversión

El módulo del ADC permite dos modos de conversión, estos son: el modo de conversión continua y el modo de conversión simple, los cuales pueden configurarse con el bit ADC0 del registro de estatus y control ADCSC1 (ver Registros de Control).


  • Si fue seleccionado el Hardware trigger y se configura el ADC0 para conversión continua, cada vez que le llegue un flanco de subida a ADHWT el módulo hará la conversión. Si el ADC0 se configura para conversión simple el módulo hará una conversión cuando le llegue un flanco de subida a ADHWT y no iniciará otra si no que se mantendrá ocioso.


  • Si fue seleccionado Software trigger y se configura el ADC0 para conversión continua, cuando se escriba en el registro de control ADCSC1 el módulo iniciará la primera conversión y una vez que finalice iniciará otra conversión hasta que se detenga. Si el ADC0 se configura para conversión simple el módulo hará una conversión cada vez que se escriba en el registro de control ADCSC1 y no iniciará otra si no que se mantendrá ocioso.

Registros

Inicialización del Micro (MCU Init)

SCIGC1 Control del bus clock

En este registro, se habilita y deshabilita el bus clock para diferentes módulos

Registro SCGC1.
  • PARA HABILITAR EL BUS CLOCK PARA EL ADC EL BIT 4 DEBE ESTAR EN 1 !!

Estatus y Control

ADCSC1 Estatus y Control 1

Cada vez que se escriba en este registro, se abortará la conversión en curso y se iniciará otra nueva.

Registro ADCSC1.
  • BIT 7 – COCO (Conversion Complete Flag)

Cuando la función de comparar esté inhabilitada (ACFE =0), se establecerá la bandera COCO=1 cada vez que se complete una conversión, de lo contrario será igual a cero (COCO =0).

Cuando la función de comparar esté habilitada (ACFE =1), se establecerá la bandera COCO =1 cada vez que se haya completado una conversión y el resultado de ésta sea TRUE, de lo contrario COCO =0.

El bit COCO se borra cada vez que se escribe en ADCSC1 o cada vez que se lee el registro ADCRL.


  • BIT 6 – AIEN (Interrupt Enable)

Este bit habilita las interrupciones que se establecen cuando se ha completado una conversión.

Si AIEN =0 se inhabilitan las interrupciones al completar una conversión.

Si AIEN =1 se habilitarán las interrupciones cada vez que la bandera COCO se establezca.


  • BIT 5 –ADCO (Continuous Conversion Enable)

Si ADCO =0 se selecciona el modo de conversión simple (ver Modos de Conversión).

Si ADCO =1 se selecciona el modo de conversión continuo (ver Modos de Conversión).


  • BITS 4:0 –ADCH Input cannel select

En estos 5 bits mas bajos del registro ADCSC1 se coloca el valor en binario del canal en el que se quiere trabajar, si el modo de conversión continuo fue seleccionado, se pueden poner estos 5 bits en 1 al finalizar las conversiones para prevenir que otra sea ejecutada, si fue escogido el modo de conversión simple esto no es necesario. (ver Asignación de Canales)

ADCSC2 Estatus y Control 2

Este registro controla la función de comparar, el trigger a usar para la conversión y el indicador de conversión activa

Registro ADCSC2.


  • BIT 7 – ADACT (Conversion Active)

Este bit indica cuando una conversión se esta ejecutando, se establece cuando se inicia una conversión y se borra cuando la misma conversión se completa o se aborta.

Si ADACT =0 no se esta ejecutando ninguna conversión.

Si ADACT =1 hay una conversión ejecutándose.


  • BIT 6 – ADTRG (Conversion Trigger Select)

Este bit se usa para seleccionar qué tipo de trigger se va a usar para inciar una conversión.

Si ADTRG = 0 se selecciona software trigger, la conversión se hará cada vez que se escriba en el registro ADCSC1 (ver Modos de Operación).

Si ADTRG = 1 se selecciona hardware trigger, la conversión se hará cada vez que le llegue un flanco de subida a ADHWT (ver Hardware Trigger y Modos de Operacion).


  • BIT 5 - ACFE (Compare Function Enable)

Habilita la función de comparar (ver ADCSC1_COCO).

Si ACFE =0 se inhabilita la función comparar.

Si ACFE =1 se habilita la función comparar.


  • BIT 4 - ACFGT (Compare Function Greater Than Enable)

Cuando el resultado de la conversión es mayor o igual que el valor de comparación la función de comparación hace el Trigger.

Si ACFGT=0 se hace el trigger si la entrada es menor que el valor de comparación.

Si ACFGT=1 se hace el trigger si la entrada es mayor o igual que el valor de comparación.

  • Los bits 3 y 2 son solo de lectura y son siempre cero, los bits 1 y 2 son de lectura y escritura pero están reservados y su valor siempre deberá ser cero


Data Convertida

Al relizar cada conversión, el resultado se guarda en los registros ADCRH Y ADCRL. el módulo tiene un mecanismo de bloqueo que previene que la data de ADCRH y ADCRL sea sobreescrita con una data nueva si la anterior se está leyendo mientras se esté en modo de 12 o 10 bits. Cuando se activa este bloqueo COCO no se establece para la nueva data bloqueada y esta se pierde. En caso de estar usando el modo de conversión simple con la función de comparación habilitada este bloqueo no tiene efecto alguno sobre las conversiones del ADC, para los demás casos cuando una nueva data es bloqueada y perdida se inicia otra conversión sin importar el modo de conversión en el que se esté trabajando.


Al trabajar con el modo de operación simple se debe tener cuidado con que los registros de data no se lean hasta que la conversión anterior se haya completado.


ADCRH Data Result High Register

En modo de operación de 12 bits, ADCRH guarda los 4 bits mas significativos de la conversión.


Registro ADCRH.


Si se trabaja con el modo de operación de 8bit los bits 0, 1, 2 y 3 del registro ADCRH serán iguales a cero. Si se trabaja con el modo de 10bits, los bits 2 y 3 del ADCRH serán iguales a cero. En caso de cambiar el modo de operación, cualquier dato guardado en ADCRH será borrado

ADCRL Data Result Low Register

En este registro se guardan los 8 bits mas bajos de la conversión.


Registro ADCRL.


Cuando ADCRL es leído, COCO bit se borra. si ADCRL no es leído antes de que la siguiente conversión se haga entonces el dato se perderá. En caso de cambiar el modo de operación, cualquier dato guardado en ADCRH será borrado.

Valor del Dato de Comparación

Estos registros guardan el valor del dato con el que se quiere comparar el resultado de la conversión que vaya a ejecutar.


Si se trabaja en modo de operación de 12bits, se compararan los 4 bits mas altos almacenados en ADCCVH (3:0) directamente con los mismos bits del registro ADCRH.


Si se trabaja con modo de operación 10 bits se compararan los 2 bits mas altos almacenados en ADCCVH (1:0) directamente con los mismos bits del registro ADCRH.

Si se trabaja con modo de operación 8 bits se compararan los 8 bits mas bajos de la conversión almacenados en ADCCVL (7:0) directamente con los mismos bits del registro ADCRL.

ADCCVH Compare Value High Register

Registro ADCCVH.


ADCCVH guarda los bits 8, 9, 10 y 11 del valor de comparación, en caso de trabajar en modo de operación menor a 12 bits, el resto del registro se llenará con ceros


ADCCVL Compare Value Low Register

Registro ADCCVL.


ADCCVL guarda los 8 bits mas bajos del valor de comparación.


ADCCFG Registro de Configuración

ADCCFG es usado para seleccionar el modo de operación, la fuente del clock y configurar el módulo para ahorro de energía o tiempo de muestreo largo


Registro ADCCFG.


  • BIT 7 - ADLPC (Low Power Configuration)

Cuando el módulo no se ha configurado para obtener tiempos de muestreo largos en las conversiones, este bit se usa para ahorrar energía

Si ADLPC =0 se configura el módulo para alta velocidad

Si ADLPC =1 Se configura el módulo para ahorro de energía pero se usa la máxima velocidad del clock


  • BITS 6:5 - ADIV (Clock Divide Select)

ADIV selecciona la relación de división usada por el ADC para generar el clock interno ADCK

Tabla de relaciones de división.


  • BIT 4 - ADLSMP (Long Sample Time configuration)

ADLSMP escoge entre Long Sample Time y Short Sample time, en long sample time el periodo de la muestra de la señal de entrada que se escoge es mayor y se obtienen medidas o resultados mas precisos, en short sample time sucede lo contrario pero la conversión se hace más rápido.

Si ADLSMP =0 se escoge short sample time.


Si ADLSMP =1 se selecciona long sample time


  • BITS 3:2 - MODE (Conversion Mode Selection)

Estos bits se usan para seleccionar el modo de operación que tendrá la conversión puede ser de 12bits, 10bits u 8bits

Modos De Operación.

Calculo del tiempo de conversión:

Para efectos del cálculo del tiempo que toma una conversión en ejecutarse, en la siguiente tabla se relaciona el tiempo dependiendo del reloj elegido (ADCLK = ADICLK/ADIV) y el bit ADSMP.


Tiempos de conversión.


  • BITS 1:0 - ADICLK (Input Clock Select)

Estos bits se usan para seleccionar de entre las 4 posibles fuentes de clocks para generar el ADCK


Input Clock Select.

Control de Pines

Estos 3 registros APCTL1, APCTL2 y APCTL3 se encargan de deshabilitar los puertos de entrada/salida del micro que estén siendo usados como entradas analógicas.

APCTLY_ADPCX =0 deshabilita el puerto X del registro APTCLY

APCTLY_ADPCX =1 habilita el puerto X del registro APTCLY

  • APCTL1 controla los pines asociados a los canales del 0 al 7.
  • APCTL2 controla los pines asociados a los canales del 8 al 15.
  • APCTL3 controla los pines asociados a los canales del 16 al 23.

Wait y Modo Stop3

Operación Wait

La instrucción WAIT pone al micro en Low-power consumption standby mode, consumiendo poca energía y entrando en modo de espera del cual se recupera muy rápido ya que los clocks fuentes se mantienen activos.


Si se está ejecutando una conversión cuando el micro entra en modo WAIT la conversión de todas formas se completará.


Si se trabaja con el hardware trigger el micro podrá estar en wait mode y cuando llegue el flanco de subida a ADTWH se hará la conversión.

Cuando se establece COCO se genera una interrupción por haber completado la conversión (si AIEN=1) que despierta al módulo ADC del modo WAIT

Modo Stop3

Esta instrucción se usa cuando la mayoría de las fuentes de clocks están deshabilitadas y se encarga de poner al micro en Low-power consumption standby mode

Modo Stop3 con ADACK deshabilitado

Si el clock asíncrono ADACK no fue seleccionado como el clock para la conversión, al ejecutar la instrucción Stop3 la conversión se abortará y el módulo entrara en estado ocioso. Los contenidos de los registros ADCRH y ADCRL no se verán afectados por esta instrucción. Al salir del Stop3 mode, se necesitará de un hardware trigger para continuar con las conversiones

Modo Stop3 con ADACK habilitado

Si el clock asíncrono ADACK fue seleccionado como el clock para la conversión, al ejecutar la instruccion Stop3 la conversión se realizará. Las conversiones se podrán iniciar estando en Stop3 mode por hardware trigger o si se trabaja en modo de conversión continua (ADCO =0). Cuando se establece COCO se genera una interrupción por haber completado la conversión (si AIEN=1) que despierta al módulo ADC del modo Stop3

Ejemplos

Inicialización general del ADC en Assembler

ram:           SET     Z_RAMStart  ; $80
rom:           SET     ROMStart    ; $2080

lda    $111 			; WatchDog Disable
sta    SOPT1       		; ..System Options 1
ldhx   RAMEnd + 1   		; $1800=$17FF+1. SP = $17FF
txs
		
lda    #$23         
sta    SCGC1			; Habilita Bus Clock para el módulo ADC
mov    #$20, ADCSC1 		; Modo de conversion continuo seleccionado, se selecciona el canal 0
clr    ADCSC2_ADTRG 		; Software trigger seleccionado
mov    #$30, ADCCFG 		; Input clock/2. Long Sample time, modo de operacion 8-bit 
clr    APCTL1      
bset   APCTL1_ADPC0, APCTL1   	; Se deshabilita el puerto asociado al canal 0 (Ver registro APTCL1)
bset   ADCSC1_AIEN, ADCSC1    	; Se habilitan las interrupciones del AIEN

Inicialización general del Módulo en C

 
SOPT1 = 0x23;          /* Watchdog deshabilitado. Stop Mode Habilitado. RESET pin habilitado */  
SCGC1 = 0x11;          /* Se habilita el Bus Clock para el módulo ADC!!! */

ADCSC1 = 0x60;         /* Se selecciona el canal ADCH0, Se selecciona modo de conversion continua y se habilitan las interrupciones 
                          Ver Registro ADCSC1*/
ADCSC2 = 0x00;         // Se deshabilita la funcion de comparación y se selecciona el software trigger
ADCCFG = 0x40;         // Se selecciona Long Sample time y se divide el Bus Clock entre 2
APCTL1 = 0x00;         // Se deshabilita el puerto asociado al canal ADCH0 ya que esta siendo usado como entrada analogica


Ejemplo de uso del ADC en assembler

;*******************************************************************
;* This stationery serves as the framework for a user application. *
;* For a more comprehensive program that demonstrates the more     *
;* advanced functionality of this processor, please see the        *
;* demonstration applications, located in the examples             *
;* subdirectory of the "Freescale CodeWarrior for HC08" program    *
;* directory.                                                      *
;*******************************************************************

; Include derivative-specific definitions
            INCLUDE 'derivative.inc'
;
; export symbols
;
            XDEF _Startup
            ABSENTRY _Startup

;
; variable/data section
;

COP_Disable:   EQU     $42

            ORG    RAMStart         ; Insert your data definition here
ExampleVar: DS.B   1

;
; code section
;
            ORG    ROMStart

_Startup:
            LDHX   #RAMEnd+1        ; initialize the stack pointer
            TXS
            LDA    #COP_Disable  ; Se deshabilita el WatchDog
            STA    SOPT1         ; ..System Options 1
            ; -------------------------------
            ; MCU_Init
            LDA    #$10        ; Habilita el Bus Clock para el módulo ADC
            STA    SCGC1
            CLRA               ; Se deshabilitan los periféricos que no se usan para Bus clock
            STA    SCGC2
            
            ; Init LEDs PORTs PTCD (bits 0-5) and PTED (bits 6-7)
 
            MOV    #%11110000, PTCD ; Se prenden 4 LEDs para verificar
            MOV    #%11111111, PTED ; Los Leds de PTED tienen lógicas negada, se apagan
            MOV    #$FF, PTCDD      ; Se seleccionan los PTCD como salida 
            MOV    #$FF, PTEDD      ; Se colocan los PTED como salidas
            
            
            ;------------------------------------------------------------------
            ; ADC_configuration 
             
            MOV    #$20, ADCSC1 ; Modo de conversion continuo seleccionado, Canal ADC0 seleccionado,
            CLR     ADCSC2      ; Software trigger selected
            MOV    #$30, ADCCFG ; Input clock/2. Long Sample time, modo de operacion 8-bit conversion 
            CLR     APCTL1      ; Se deshabilita el puerto asociado al canal 0 
            
            ;------------------------------------------------------------------
 
            BSET    APCTL1_ADPC0, APCTL1   ; Select channel for ADC input
            BSET    ADCSC1_AIEN, ADCSC1    ; Se habilitan las interrupciones del AIEN           
            CLI                     ; enable interrupts

mainLoop:
            ; Insert your code here
            NOP  
            feed_watchdog
            BRA    mainLoop
            
            
            
 ; ------------------------------------------------------------------
ADC_ISR:
 
            LDA    ADCRL       ;Se lee la data de ADCRL, COCO se borra!..(LEDs turn on with 0's)
            COMA               ; Se niega el valor del ADCRL almacenado en el acumulador para que los LEDs
                               ; prendan cuando hay voltaje y esten apagados cuando no
            STA    PTCD        ; Move ADC value to port C
            STA    PTED        ; ..and to port E
            RTI 

;**************************************************************
;* spurious - Spurious Interrupt Service Routine.             *
;*             (unwanted interrupt)                           *
;**************************************************************
spurious:                           ; placed here so that security value
            NOP                     ; does not change all the time.
            RTI

;**************************************************************
;*                 Interrupt Vectors                          *
;**************************************************************
            ORG     Vadc
            DC.W   ADC_ISR
            ORG     Vreset
            DC.W   _Startup        ; RESET
            END

Ejemplo del uso del ADC en C

#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */



void main(void) {

 
ADCSC1 = 0x60; // Se selecciona el canal ADCH0, Se selecciona modo de conversion continua y se habilitan las interrupciones 
ADCSC2 = 0x00; // Se deshabilita la funcion de comparacion y se selecciona el software trigger
ADCCFG = 0x40; // Se selecciona Long Sample time y se divide el Bus Clock entre 2
APCTL1 = 0x00; // Se deshabilita el puerto asociado al canal ADCH0 ya que esta siendo usado como entrada analogica 
 
 
EnableInterrupts; /* enable interrupts */

/* include your code here */

ADCSC1_ADCH = 0;  // Al usar 8bit mode ADCRH siempre sera cero  
while(ADCSC1_COCO==0);  // Esperar que la conversion se ejecute
PTCD= ~(ADCRL);         // Muestra el resultado de la conversion en los leds de PTCD

for(;;) {

__RESET_WATCHDOG(); /* feeds the dog */
 /* loop forever */

}  /* please make sure that you never leave main */

}

GLOSARIO ASSEMBLER

El profesor Ing. Luis Uribe hizo este glosario de instrucciones de assembler que usa el HC08

HC08 Glossary Prof. Uribe,