¿Qué es un oscilador?

Tienes el LED parpadeando en tu ATMega168, ¡felicitaciones! Es un gran paso. ¡Ahora hay que hacerlo parpadear más rápido!

Cargaste el código en el chip y el ATMega168 está corriendo ese código, pero ¿cómo esta corriendo? y ¿qué tan rápido? Cualquier micro necesita una fuente de reloj. Píenselo como un tipo de “ritmo musical” que el micro usa para ejecutar el código en cierta manera. Sin un reloj, el micro no sabe como correr el código, y con un reloj irregular (uno que varíe mucho) el código correrá con un paso indeterminado. Tienes que tener un reloj de algún tipo y algunas veces necesitarás uno preciso.

Hay varias maneras de generar un ritmo para el micro. El Atmega168 da varias opciones. Acá hay una lista de varios tipos de generadores de ritmos:

• RC Externo – generalmente usado para aplicaciones de bajo costo. Usando un resistor y un capacitor, la razón de carga/descarga puede ser usada como un reloj de entrada. Nunca lo he usado.

• RC Interno – Un muy buen oscilador. Encontrable en los nuevos micros, Puedes pedirle al ATmega168 que genere su propio reloj. El chip tiene incorporado un oscilador. Desafortunadamente no es muy preciso.

• Oscilador Externo – este es el modo por defecto y es usado de forma estándar. Conecta un cristal de cuarzo (abreviado como cristal o XTAL) a los dos pines OSC y el código se ejecutará a la frecuencia entregada.

• Resonador Externo – Un resonador es un poco más barato que un oscilador pero tiene peores tolerancias.

• Reloj Externo – En vez de un oscilador, puedes ocupar un generador de pulsos de reloj, el cual es ocupado cuando se necesita que múltiples componentes corran con la misma frecuencia. Tampoco he ocupado esta opción.

Sólo he usado 3 de estas 5 opciones así que esas describiré más profundamente:

RC Interno

Atmel es muy inteligente. Ellos preconfiguran el ATMega168 para usar un oscilador interno de 1MHZ. El ATMega168 (y los AVRs en general) pueden operar con una instrucción por ciclo de reloj. Esto significa que cada vez que el oscilador entra a un ciclo, una instrucción es completada (esto es casi verdad ya que hay algunas instrucciones que necesitan más de un ciclo de reloj). Como estamos usando el típico ATMega168, corremos el código que parpadea a 1MHz o 1MIPS (millón de instrucciones por segundo). Si, leíste bien, ¡un millón de instrucciones por segundo!. Bastante impresionante. ¿Cuál es el problema con el oscilador interno? La tolerancia de +-5% y una velocidad máxima de 8MHz. +/- 5% de tolerancia significa que tu ATMega168 puede correr a 1000000 * 1,05 = 1050000 IPS cuando el de tu vecino está corriendo a 1000000 * 0,95 = 950000 IPS. Esto puede sonar a que no es mucha diferencia, pero en el mundo digital es inmensa. Además Atmega168 tiene una velocidad máxima de 20MHz (el oscilador interno corre como máximo a 8MHz), entonces si realmente quieres llevar al IC al máximo, necesitarás un oscilador externo.

Oscilador Externo

Este es el tipo más común de generador para señal de reloj.

image001

Los osciladores de cristal de cuarzo vienen para diferentes gustos y frecuencias. Algunas de las frecuencias más típicas son de 20MHz, 16MHz, 10MHz y 4MHz. También hay frecuencias como 14,7456MHz, 9,216MHz y 32,768MHz que están disponibles porque estas frecuencias son múltiplos de velocidades usadas para comunicación serial y coordinación de tiempos. Por ejemplo, si necesitas lograr 9600bps precisos en comunicación serial, 9.126MHz dividido por 960 = 9600. No hay entero que divida 16MHz para obtener 9600 exactamente. Entonces la comunicación serial a 9,216MHz será bien precisa mientras la serial a 16MHz siempre tendrá una pequeña cantidad de error.

Dentro de la carcasa de metal hay un pequeño pedazo de cristal de cuarzo que está cortado con precisión para que la pieza de cristal vibre a una frecuencia específica. El oscilador interno del ATMega168 tiene una tolerancia de +/- 5%. Por otro lado, un cristal es normalmente “+/- 20ppm”. Esto quiere decir que la frecuencia tiene una precisión de “+/- 20 partes por millón”. Luego, puedes tener un cristal de 16,000020MHz mientras tu vecino tenga uno de 15,999980MHz, lo que es equivalente a +/- 0.00000125%. El cristal es 4 millones de veces más preciso que el oscilador interno.

Nota técnica: Perdón por inundar tu cerebro con detalles esenciales, pero es algo razonablemente importante. El dispositivo metálico cromado mostrado arriba es un cristal. No es técnicamente un oscilador. Los cristales son baratos. Realmente los osciladores son caros. ¿Cuál es la diferencia? Un oscilador usa energía y crea verdaderos pulsos de reloj. Estos pulsos pueden ser usados para hacer funcionar cualquier tipo de dispositivo. Un cristal es un elemento absolutamente pasivo que requiere algún mecanismo externo para volverse un “oscilador”. Afortunadamente para nosotros y para los propósitos de este tutorial, 99% de todos los microcontroladores traen la circuitería interna necesaria como para conectar estos cristales a un par de pines, un mecanismo interno hará funcionar el cristal creando un oscilador como para que el micro tenga un buen generador de reloj. Así que por favor perdónennos y también a otros documentos técnicos que usen incorrectamente el término oscilador cuando se trate de un cristal.

Algunos contras de los cristales.

No pueden fabricarse tan pequeños como los resonadores (los cristales ocupan más área PCB).

• Los cristales requieren condensadores de carga. Los condensadores de carga inician la oscilación del cristal. Sin estos condensadores tu cristal puede funcionar ahora, pero en algún momento ya no lo hará más. Los condensadores de carga son baratos pero ocupan más espacio en la PCB.

Resonador Externo

Los resonadores externos son el término medio entre los RC internos y los cristales.

image002

Un resonador es una pieza de cerámica que es fabricada de tal forma que oscile a cierta frecuencia. Desafortunadamente este proceso es difícil de hacer bien. Los resonadores tiene una tolerancia estándar de +/- 0.5%. Por lo tanto las resonancias son 10 veces más precisas que los osciladores internos pero todavía un poco lejos de los cristales.

Los resonadores tienden a ser más baratos que los cristales. Y los resonadores tienden a tener menor frecuencia que los cristales. Pero los resonadores son muy buenos, ¡ya que tienen incorporados los capacitores de carga en el dispositivo de 3 pines! Los resonadores pueden ser construidos bien pequeños y pueden minimizar tu área de PCB.

Ahora elige. Para muchas aplicaciones el oscilador interno estará bien. Pero si tratas de hacer comunicación serial, 5% es bastante pobre (la tolerancia serial va entre 1 a 2%). He usado cristales para la mayoría de mis proyectos. Pero para los dispositivos que son realmente pequeños, ocupo resonadores. Cualquier cosa que trabaje con señales RF, requiere cristales de baja tolerancia. Además cualquier oscilador cambiará su frecuencia al crecer su tiempo de operación (llamado comúnmente “aging”, envejecimiento en ingles) y cualquier reloj variará con la temperatura.

Como mencioné antes, el ATMega168 viene configurado con un oscilador interno de 1MHz. ¡Pero lo podemos presionar a ser más rápido y mejor!. Configuremos el ATMega168 para que corra a 16MHz con un cristal externo.

¿Cuáles son los efectos colaterales de correr el ATMega168 con una frecuencia más alta? No podrás hacer correr el IC a esta frecuencia con voltajes bajos (como 3,3V o 2,8V). Como estamos trabajando con voltajes de 5V no es problema. A 20MHz el micro consumirá más poder que con 1MHz. Estas cosas las deberás considerar cuando desarrolles tu propio sistema.

¿Cuan rápido lo puedes hacer trabajar?

¡La velocidad máxima para el ATMega168 es de 20MHz o 20MIPS! ¡Deslumbrantemente rápido!

Toma tu cristal de 16MHz y busca los pines PB6/7.

image003

Conecta las patas del cristal en estos dos pines y conecta estos pines a tierra a través de dos condensadores de 22pf.

Esto completa el hardware necesario, ahora hay que decirle al ATMega168 que use el cristal externo.

Bit de configuración (Fuse bits)

Esta es una de las cosas más difíciles de usar con las AVRs. Los Fuse bit son un sistema de configuración de muy bajo nivel. Activando o borrando estos bits puedes cambiar completamente las funciones de la AVR. Los bits de configuración de los Pics son más fáciles de usar. Sólo haces clic en una ventana de windows o los programas directamente en tu código C, sin problemas. Las AVRs son muy diferentes y literalmente puedes estropear tu AVR si programas mal tus bits de configuración.

Hay dos Bytes (8 bits = 1 Byte) en la ATMega168 que maquillan los bits de configuración. Si no lo has hecho, descarga el datasheet del ATMega168 (son 309 páginas) y guárdalo en tu escritorio. Si nunca lees los datasheet, no te preocupes, no necesitas leer las 309 páginas, sólo necesitas saber como absorber información útil de esta … ¡y no es trivial!.

Busquemos rápidamente “bits de configuración” (fuse bits). Esto nos llevará directamente a la sección de “Fuentes de reloj”. ¡Que coincidencia! (asegúrate que tengas los bookmarks o la barra de secciones abierta para que puedas ver las diferentes secciones del datasheet). Hay muchas opciones para las fuentes de reloj en el ATmega168. Comencemos con cambiar el oscilador interno de 1MHz a 8MHz.

image004

Traducido de la página 34 (sección 8.6): “Por defecto, el oscilador RC interno provee un reloj de aproximadamente 8MHz. Aunque es dependiente del voltaje y la temperatura, este reloj puede ser calibrado con precisión por el usuario. Este dispositivo viene con el Fuse bit CKDIV8 programado por defecto. Ver “System Clock Prescaler” en la página 37 para más detalles.”

Entonces para lograr que el oscilador opere más rápido debemos cambiar el Fuse bit CKDIV8.

image005

Acá vemos como el ATMega168 trabaja recién sacado de la caja. Atmel envía estos micros para usarlos con el “oscilador RC interno calibrado” (8MHz) con el “divisor de reloj en 8” configurado inicialmente (1MHz). Muy bien, ahora sólo necesitamos cambiar el bit CKDIV8.

Low Fuse Byte por defecto: 0b.0110.0010
(Byte inferior de configuración por defecto)
Nuevo Low Fuse Byte: 0b.1110.0010

Usando estos nuevos bits de configuración, el ATMega168 debería comenzar a correr con el oscilador interno en 8MHz y ¡deberíamos ver el LED parpadear 8 veces mas rápido!. Hay un par de formas de hacer esto, pero la forma más directa de hacerlo que he encontrado es usar intensamente la línea de comandos. Abre la ventana de línea de comandos y escribe avrdude. Deberás obtener un texto de ayuda. Si estas usando un programador PG1 (serial) o PG2 (paralelo), deberás escoger la cadena de caracteres correcta:

Para leer la configuración del ATMega168:

• PG1 (serial):

avrdude -p m168 -P COM1 -c ponyser -U lfuse:r:-:h -U hfuse:r:-:h

• PG2 (paralelo):

avrdude -p m168 -P lpt1 -c stk200 -U lfuse:r:-:h -U hfuse:r:-:h

De nuevo, asumiré que estás ocupando un PG2, pero puedes modificar los comandos para usar un programador serial. Estos comandos básicamente deberían hacer que avrdude reporte la configuración para la ATMega168 – Fuses superiores = 0xDF, Fuses inferiores = 0x62

¿Cómo se crea una nueva configuración?. Busca nuevamente por los bits de configuración (fuse bits) hasta la página 223. Aquí se muestran las dos configuraciones con sus valores por defecto. Todo lo que necesitas hacer es cambiar la configuración inferior de 0x62 (0b.0110.0010) a 0xE2 (0b.1110.0010). Ahora ponemos esto en el comando anterior y cambiamos de lectura a escritura.

 8MHz Internos:

avrdude -p atmega168 -P lpt1 -c stk200 -U lfuse:w:0xE2:m

Ejecuta este comando en la ventana y listo, tu AVR debería estar corriendo a 8MHz. Algunas veces avrdude me ha mostrado algunos errores al leer la configuración y luego pregunta si se quiere recuperar la configuración o algún error por el estilo. No estoy seguro cual es el error. Puedes decir si o no (no importa), y luego enviar el mismo comando. Después del segundo intento debería quedar satisfactoriamente configurado. Bien, el LED debería parpadear intensamente, ahora llevémoslo al siguiente paso, los 16MHz.

image006

¿Notas como no tengo los capacitores de 22pf en mi cristal de 16MHz? ¡Mal, Mal ingeniero!

Necesitarás tener el cristal de 16MHz adjuntado a lo pines del oscilador, como se muestra en el esquema. Busca la categoría de “fuentes de reloj” en el datasheet y investiga un poco sobre la opción del oscilador de cristal externo. Te doy una pista, se vera algo así:

• CKDIV8 = 1
• CKOUT = 1
• SUT1 = 1
• SUT0 = 0
• CKSEL3 = 0
• CKSEL2 = 1
• CKSEL1 = 1
• CKSEL0 = 0

Oscilador externo de 16MHz:

avrdude -p atmega168 -P lpt1 -c stk200 -U lfuse:w:0xE6:m

Una ves que tengas esto programado, el atmega168 debería utilizar el oscilador externo de 16MHz y hacer parpadear el LED muy rápido. Si no es así, revisa tus capacitores de carga y las conexiones externas. El ATmega168 tiene un máximo de velocidad de 20MHz (¡20 MIPS!). Trata de sobrecargar el reloj de tu micro algún día con 30MHz o 40MHz. Probablemente funcione bien, pero no querrás diseñar un sistema real con una velocidad de reloj fuera de las especificaciones.

Tarea para la casa. Necesitarás aprender a usar tu multímetro para medir el consumo de corriente. Como la corriente es medida en serie (el voltaje se mide en paralelo) necesitarás encontrar un espacio en tu protoboard en que la corriente pueda ser interrumpida y medida. Mide lo siguiente.

• Cuando la ATMega168 está en reset.

 Cuando esta corriendo con oscilador interno de 1MHz<

 8MHz

• 16MHz

Durante cada uno de estos experimentos, haz una rápida medición de temperatura a tu regulador de voltaje. En general el regulador debería estar lo suficientemente frío para tocarlo. Si esta al rojo vivo (ten cuidado) deberías desconectar la protoboard y buscar cortos.

¿Por qué se calientan los reguladores? Estamos usando un regulador lineal muy básico. Este tipo de regulador tiene un voltaje alto de entrada (9V en mi caso) y entrega un voltaje bajo (5V). La diferencia de voltaje es liberada como calor a través de la pestaña de metal. El calor es medido como potencia perdida o Watts. Si la entrada es de 9V y la salida 5V, y tu sistema ocupa 50mA:

(9 – 5) * 0,050 = 0,2W or 200mW

200mW hará que el regulador se caliente un poco. ¿Qué ocurrirá con un ampere?

(9 – 5) * 1,000 = 4W!

¡Bastante calor! el regulador estará muy caliente y seguramente será dañado permanentemente si se le hace funcionar a temperaturas muy altas por periodos extendidos de tiempo.

Deberás haber notado, que si bajas el voltaje de entrada puedes reducir la cantidad de calor emanado. ¿Porque no entregar 5V y estamos listos? Estos reguladores de voltaje lineales baratos requieren algo llamado “voltaje de caída”. Este es un nombre poco técnico para un voltaje extra que el regulado necesita para entregar el voltaje requerido. Cualquier cosa bajo este voltaje y el regulador entregará un voltaje menor al requerido. Para el LM7805 es un mandamiento que debas tener 1,5V o más, o sea que necesitas al menos 6,5V para entregar 5V. Si alimentas con menos de 6,5V (4 pilas AA), no tendrás garantizado los 5V de salida. Cada regulador de voltaje es diferente así que revisa el datasheet del elemento que tengas en tus manos. Algunos reguladores de voltaje están específicamente diseñados para tener pequeñas caídas de voltaje. ¡Algunos pequeños llegan hasta 50mV!. Algunos reguladores estándar de 3,3V requieren un mínimo de 3,35V para entregar buenos 3,3V.

Muchos reguladores tienen una función de apagado que previene que el regulador se destruya si hay un corto en la salida. Si cambias el interruptor de poder en tu protoboard a ON y el LED no prende, curiosamente tu regulador de voltaje está tratando de entregar tanta corriente (porque conectaste algo mal) que se apagará y el LED no tendrá poder para iluminar. Si ese es el caso, apaga tu protoboard rápidamente.

En general, los reguladores de voltaje corren en caliente. Está bien. Pero si alguna vez hueles algo raro o puedes sentir una onda de calor desde tu protoboard, apaga las cosas y dales una segunda mirada.

Para armar el circuito de esta lectura necesitarás los mismos elementos de las lecturas anteriores e incluir un cristal de 20MHz mas un par de condensadores de 22 pF que puedes adquirirlos en nuestra tienda www.mcielectronics.cl

Estas lecturas son una traducción al español del tutorial “Beginning Embedded Electronics Tutorials” desarrollado por SparkFun Electronics. Traducido para Ingeniería MCI por Julián Aguayo. Revisado y corregido por Iván Sarmiento y Paul Aguayo.

¡Estamos abiertos a comentarios! Reporta tus tips, comentarios o recomendaciones a info@mcielectronics.cl.