Hacemos Envíos a Todo el País

Para cotizaciones y pedidos mándanos un mensaje en este enlace. En Cochabamba visítanos en nuestras oficinas, estamos a tu servicio, tu consulta no nos molesta.

Imprimir

Experimentando con Microcontroladores Atmel USB

Escrito por Raúl Alvarez.

 

Atmel logoEn este tutorial hacemos una introducción a la experimentación con microcontroladores Atmel con capacidad USB, los cuales ofrecen  ventajas interesantes:

  • Vienen grabados de fábrica con un "bootloader" (cargador de arranque), lo cual hace posible programarlos mediante su módulo de comunicaciones USB, sin necesidad de un programador especial, sólo con un cable USB y un circuito mínimo.
  • Permiten mediante el uso de librerías "open source" correr aplicaciones USB de manera mucho más simple, entre las se pueden mencionar: teclado, mouse y joystick con puerto USB, HID genérico, interfaz UART a USB con puerto COM virtual, etc.

En este tutorial introductorio utilizamos el ATmega32U2 para correr un programa sencillo que parpadea un LED, explicando las conexiones de hardware y el software necesario para grabar el programa al microcontrolador, sin la necesidad de contar con un programador especial. La misma información de este tutorial puede ser aplicada con mínimos cambios a otros microcontroladores USB como el ATmega8U2, ATmega 16U2, ATmega16U4, ATmega32U4, AT90USB162, etc.

La principal desvantaja de los microcontroladores Atmel con USB para proyectos caseros es que no se fabrican en empaque DIP, sólo en empaques SMD de pinout estrecho como el TQFP, sin embargo debido a que el circuito básico para su funcionamiento es muy sencillo, incluso esto se presenta como una buena oportunidad para iniciarse en el prototipado con empaques de montaje superficial, lo cual tarde o temprano uno debe llegar a hacer debido a que siempre habrá una tendencia futura a la miniaturización y al uso de empaques pequeños.

Circuito Básico Para el ATmega32U2

Dado que el ATmega32u2, así como otros modelos similares en la misma categoría, vienen preprogramados de fábrica con un bootloader (cargador de arranque) USB, el circuito para programarlo es muy simple:

Circuito básico para el ATmega32U2

NOTA: Es posible alimentar el circuito desde el pin VBUS (5VDC) del conector USB, directamente desde la PC y eliminar la fuente de alimentación externa para este ejemplo y en casos donde no se requiera más de 500 mA de consumo total de corriente, sin embargo se debe tener mucha precaución con las conexiones a fin de no provocar un corto circuito o una sobrecarga que pudiera dañar el puerto USB de la PC, o incluso la misma PC. Para los principiantes es más seguro utilizar una fuente externa tal y cual se muestra en el circuito.
Adicionalmente, debido a que las resistencias de 22 ohms son menos comunes, se ha probado el circuito reemplazando ambas resistencias de 22 ohmnios por resistencias de 100 ohmnios y funciona sin problemas, aunque quizás esto no sea lo más indicado para diseños permanentes, debido a que la hoja de datos del microcontrolador recomienda el uso de resistencias de 22 ohmnios.

Para que el prototipado sea más sencillo es muy recomendable fabricar primeramente una placa de desglose de los pines en empaque TQFP a DIP para el ATmega32U2, como la siguiente:
Placa de desglose de pines para el ATmega32U2

La imagen de la placa de circuito lista está disponible para los interesados en este enlace.

La siguiente es una fotografía del prototipo con el ATmega32u2 soldado en la placa de desglose y el circuito armado en breadboard:
Circuito básico para el ATmega32U2

Instalación del Driver USB y Software FLIP

Administrador de DispositivosPara poder programar el ATmega32U2 conectándolo directamente al puerto USB de la PC y sin necesidad de un programador adicional es necesarios primeramente instalar el driver USB para el dispositivo y el software denominado "Flip" (Flexible In-system Programmer) siguiendo estos pasos:

  1. Bajar el instalador de "Flip" desde el enlace: http://www.atmel.com/tools/FLIP.aspx Existen versiones del software tanto para Windows como para Linux; los usuarios pueden elegir la versión "FLIP x.x.x for Windows (Java Runtime Environement included)" que incluye Java (necesario para su funcionamiento) o al versión sin Java si ya tienen Java instalado previamente en su PC.
  2. Instalar Flip corriendo el instalador y siguiendo las indicaciones que se presentan en la pantalla. Al instalarlo, se instalan también automáticamente los archivos del driver USB necesarios para conectar el dispositivo a la PC.
  3. Conectar el circuito ATmega32U2 a un puerto USB libre en la PC, la cual reconocerá automáticamente el dispositivo y procederá a instalar automáticamente el driver USB.
  4. Verificar que el driver haya sido instalado correctamente. En el Administrador de Dispositivos de Windows deberá aparecer listado el dispositivo USB como se muestra en la figura adyacente.

Herramientas Para la Compilación de Programas

Para compilar programas en ensamblador, C o C++ es necesario contar con la cadena de herramientas "Atmel AVR Toolchain", la cual cuenta a su vez con las aplicaciones necesarias: compilador C/C++, assembler, linker, debugger e incluso librerías en C para el desarrollo de programas. Todas estas aplicaciones son tipo "command line", es decir que deben ejecutarse desde una ventana de comando MSDOS, sin embargo su uso se simplifica con el uso de un Entorno de Desarrollo Integrado, el cual permite escribir el código de programa y compilarlo desde la misma interfaz gráfica. Para ello dos de las alternativas más populares son:

  • AVR Studio 5: Es el Entorno de Desarrollo Integrado (EDI) oficial de Atmel, cuenta con todas las herramientas necesarias para escribir, compilar, depurar y programar microcontroladores AVR, todo desde la misma interfaz gráfica; el instalador completo tiene un tamaño de un poco más de 600MB y puede ser bajado gratuitamente de este enlace,  previo llenado de un formulario de registro.
  • WinAVR: Es un conjunto de aplicaciones que permiten escribir, compilar, depurar y programar microcontroladores AVR, incluye los ejecutables del "Atmel AVR Toolchain" los cuales son ejecutados de manera transparente. Este EDI no es tan completo ni sofisticado como el anterior, sin embargo posee las herramientas necesarias y su tamaño de descarga es menor (menos de 30MB). Pude ser descargado gratuitamente del enlace respectivo en el sitio oficial del proyecto WinAVR: http://winavr.sourceforge.net/

En este tutorial introductorio utilizamos el WinAVR por ser más pequeño y más fácil de descargar.

Compilando un Programa Ejemplo con WinAVR

Una vez que se ha descargado e instalado el WinAVR, lo cual es muy facil y no reviste mayores complicaciones, los pasos para compilar el programa ejemplo de este tutorial son los siguientes:

1. Abrir el editor de código "Programmer's Notepad" ubicado en la carpeta de instalación de WinAVR (se lo puede encontrar mediante el menú de Inicio de Windows) y crear un nuevo proyecto (Menu->File->New->Project). Salvar el nuevo proyecto en una carpeta a elección con un nombre también a elección, en este caso lo hemos denominado "LED_blink". A continuación se podrá visualizar la carpeta del nuevo proyecto creado en la ventana izquierda "Projects" del editor de texto "Programmer's Notepad".

Proyecto de WinAVR

2. Crear un nuevo archivo llamado "main.c" y guardarlo en la misma carpeta del proyecto. Copiar el siguiente código de ejemplo en este archivo y salvarlo. El ejemplo simplemente parpadea un LED conectado a uno de los pines de salida del puerto D del microcontrolador, el código contiene comentarios detallados que explican cada línea de programa.

#include "avr\io.h"    //Incluye las declaraciones de funciones de entrada/salida, técnicamente no es necesario para este ejemplo
#include <avr/wdt.h> //Necesario para usar la función wdt_disable()

int main(void)
{    
     PORTD = 0b00000000;    //Limpiar todo el Puerto D
     DDRD = 0b00100000;        //Configurar el pin 5 del Puerto D como salida

     MCUSR= ~(1<<WDRF);        //Limpiar la bandera del "Perro Guardian" (Watchdog)
     wdt_disable();             //Deshabilitar el "Perro Guardian" (Watchdog)

     while (1)    //Bucle infinito
     {

         PORTD = 0b00100000;                //Encender el LED (pin 5)
         for (int i = 25000; i; i--);    //Generar un retardo de tiempo
 
         PORTD = 0b11011111;                //Apagar el LED (pin 5)
         for (int i = 25000; i; i--);    //Generar un retardo de tiempo

     }
 
}

Nota: La lectura de la hoja de datos del microcontrolador para cualquier nueva arquitectura que uno aprende es irremplazable. No está demás entonces reclacar la importancia de leer los detalles más relevantes de la arquitectura interna del ATmega32u2 en su hoja de datos, la cual puede ser descargada de este enlace.

3. Crear un archivo "Makefile" de compilación para el proyecto, para ello arrancamos la utilidad llamada "MFile" la cual está también ubicada en la carpeta de instalación de WinAVR. Al abrir la utilidad se muestra en su ventana principal un archivo  de texto con instrucciones en un lenguaje especial, las cuales determinan los parámetros de compilación para nuestro programa. Por el momento realmente no interesa mucho entender en detalle estas instrucciones, así que simplemente salvamos la copia de este archivo generado automáticamente a la misma carpeta de nuestro proyecto (Menu->File->Save as). IMPORTANTE: no se debe modificar el nombre de este archivo, el cual debe ser siempre "Makefile".

Utilidad MFile

¿Que es un archivo Makefile?
Los archivos Makefile son ejecutados por la utilidad "Make", la cual compila automáticamente y construye los ejecutables y librerías desde el código fuente, en función a los parámetros fijados en el archivo Makefile, el cual le indica a la utilidad cómo derivar el programa destino final.

Make es una utilidad ampliamente usada en el ambiente de sistemas operativos UNIX y sus derivados (Linux, FreBSD, etc.). Tuvo sus orígenes también en el mundo UNIX décadas atrás y se usa hoy en día no sólo para la compilación de código en ambientes Unix/Linux con procesadores Intel/AMD de 32 y 64 bits, sino también para la compilación cruzada (cross compiling) de código fuente para microcontroladores de 32, 16 y 8 bits que utilizan herramientas derivadas de la cadena denominada "GNU Toolchain", cual es el caso del "Atmel AVR Toolchain".

4. Añadir los archivos 'main.c' y "Makefile" al proyecto:

  • En la ventana izquierda "Projects" del editor de texto "Programmer's notepad' hacer click derecho en la carpeta del proyecto (en este caso, click derecho en la carpeta "LED_blink").
  • En el menú contextual desplegado a continuación elegir la opcion "Add Files" y elegir los archivos "main.c" y "Makefile"; luego hacer click en el botón "Open" para añadirlos al proyecto. Podrá verse a continuación ambos archivos añadidos en la carpeta del proyecto.

Archivos añadidos al proyecto WinAVR

5. Adecuar el archivo de compilación Makefile según las necesidades del proyecto.

  • Hacer doble click en el Archivo "Makefile" añadido recientemente al proyecto, en la ventana izquierda "Project" del editor de texto.
  • En el archivo Makefile se deben realizar los siguientes cambios:
    • Cambiar la línea: MCU = 'xxxxxx' (donde 'xxxxxx' es el código de cualquier otro microcontrolador) por: MCU = atmega32u2 para indicarle al compilador el tipo de microcontrolador que estamos usando.
    • Cambiar: F_CPU = 'xxxxxxxx' por F_CPU = 16000000 para indicarle al compilador la velocidad del cristal que se está usando. Si estuviéramos usando un cristal de 8MHz por ejemplo, se debe cambiar dicho valor a: 8000000
    • En el caso de que nuestro archivo principal de programa tuviera otro nombre, se debe cambiar la línea: TARGET = main por TARGET = 'xxxxxx' (sin la extensión .c) para indicarle al compilador el archivo que contiene nuestro código de programa. En este ejemplo no cambiamos nada porque ambos nombres coinciden.
    • Cambiar la línea OPT = 'x' por OPT = 0 para deshabilitar las optimizaciones del código assembler generado por el compilador. (Al menos hasta entender cómo funciona la optimización y qué efectos secundarios puede provocar). Los principiantes pueden ignorar sin problema la optimización y deshabilitarla.

# MCU name
MCU = atmega32u2
.....

# Processor frequency.
#     This will define a symbol, F_CPU, in all source code files equal to the 
#     processor frequency. You can then use this symbol in your source code to 
#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
#     automatically to create a 32-bit value in your source code.
#     Typical values are:
#         F_CPU =  1000000
#         F_CPU =  1843200
#         F_CPU =  2000000
#         F_CPU =  3686400
#         F_CPU =  4000000
#         F_CPU =  7372800
#         F_CPU =  8000000
#         F_CPU = 11059200
#         F_CPU = 14745600
#         F_CPU = 16000000
#         F_CPU = 18432000
#         F_CPU = 20000000
F_CPU = 16000000
.....

# Target file name (without extension).
TARGET = main
......

# Optimization level, can be [0, 1, 2, 3, s]. 
#     0 = turn off optimization. s = optimize for size.
#     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = 0

Aprender a utilizar el lenguaje de Make parece dificil al principio, sin embargo se hace más fácil entenderlo con el tiempo. En la explicación anterior vimos cómo modificar los parámetros más importantes del archivo Makefile y en la mayoría de los casos es lo único que necesitaremos modificar, así que entender con detalle los archivos Makefile por ahora no es requisito indispensable.

6. Salvar todos los archivos (Menu->File->Save All) en el editor de texto y compilar el programa (Menu->Tools->[Win AVR] Make All).
Nota: Si se hacen cambios posteriormente a cualquiera de los archivos del proyecto se deben salvar todos los archivos modificados (Menu->File->SaveAll), limpiar la carpeta del proyecto (Menu->Tools->[Win AVR] Make Clean) y compilar todo nuevamente (Menu->Tools->[Win AVR] Make All).

El proyecto WinAVR de este ejemplo con todos los archivos compilados están disponibles para su descarga en este enlace.

Grabando el Programa Compilado a la Memoria del Microcontrolador

Como ya inslatamos el programa grabador "Flip" al principio del tutorial, podemos proceder directamente con la grabación siguiendo estos pasos:

  1. Conectar el circuito a un puerto USB de la PC.
  2. Abrir el programa grabador Flip.
  3. Seleccionar el tipo de dispositivo a programar (Menu->Device->Select...->Atmega32U2)
  4. Seleccionar y abrir el puerto USB para la comunicación con el circuito (Menu->Settings->Communication->USB -hacer click en Open-).
  5. Cargar el archivo hexadecimal resultante de la compilación del programa. En nuestro caso será el archivo "main.hex" localizado en la misma carpeta de nuestro proyecto WinAVR.
  6. En la columna "Operations Flow" de la ventana principal de Flip cerciorarse que todas las operaciones estén seleccionadas (Erase, Blank Check, Program y Verify). A continuación hacer click en el botón "Run" para programar el microcontrolador.
  7. Una vez programado el microcontrolador, hacer click en el botón "Start Application" para correr el programa en el microcontrolador. Una vez que empieza a correr el programa se podrá ver el parpadeo del LED en el circuito.

Programador FLIP

Para volver a programar el microcontrolador nuevamente, se debe poner al mismo en "estado de programación", es decir activar el boorloader, para ello se deben seguir estos pasos:

  1. Pulsar primero el botón RESET y a continuación pulsar el botón HWR, pero sin soltar el botón de RESET.
  2. Soltar el botón RESET y a continuación soltar recién el botón HWR. El booloader del ATmega32U2 está nuevamente activo y en estado de programación.

Para verificar que el bootloader se haya activado nuevamente, abrir el Administrador de Dispositivos en el cual deberá aparecer listado el nombre del dispositivo, tal como la primera vez después de la instalación del driver USB. Una vez activado el bootloader se puede grabar nuevamente el dispositivo siguiendo el mismo procedimiento listado anteriormente, desde el paso 3 en adelante, suponiendo que no se haya cerrado el programador Flip (Paso 1.) ni se haya cambiado de tipo de microcontrolador (Paso 2.)

Librería Para Aplicaciones USB

Los beneficios de contar con un microcontrolador con tranceptor USB como el ATmega32U2, no se limitan solamente a grabar programas sin la necesidad de programador dedicado, sino que esta característica nos permite también desarrollar aplicaciones que utilicen el puerto USB para comunicarse con la PC como parte integral de la aplicación, por ejemplo para enviar y recibir datos hacia y desde la PC. Para ello es necesario generar todo el código de programa necesario para el manejo de la comuniación USB, lo cual no es una tarea trivial; sin embargo tranquiliza saber que ese trabajo ya ha sido realizados por nosotros.

LUFA

LUFA (Lightweight USB For Atmel) es una librería de funciones para el desarrollo de aplicaciones que utilizan comunicación mediante USB y fue desarrollada por Dean Camera para los microcontroladores Atmel, particularmente todos los mencionados al inicio de este tutorial e incluyendo por supuesto el ATmega32U2. Con LUFA es posible realizar con poco esfuerzo aplicaciones USB con microcontroladores, como por ejemplo: teclado, mouse y joystick con puerto USB, HID genérico, interfaz UART a USB con puerto COM virtual, etc.  En un próximo tutorial utilizaremos LUFA junto con el ATmega32U2 para correr uno de los ejemplos provistos con la librería para una interfaz UART a USB mediante puerto COM Virtual.

Conclusiones

Los microcontroladores Atmel USB son una excelente alternativa para empezar a experimentar con productos de este fabricante, sobre todo si uno no cuenta con un grabador para microcontroladores Atmel. La desventaja principal de los chips es el tipo de empaque, pues estos microcontroladores no se fabrican en empaques DIP los cuales son más convenientes para el prototipado en breadboard, sin embargo el reto que representa fabricar una placa y soldar un empaque SMD de montaje superficial puede llegar a ser un beneficio adicional como se lo vea, porque al mismo tiempo representa una manera relativamente sencilla de iniciar la experimentación con empaques SMD.

A esto se añade también el hecho de que uno debe aprender a manejar un nuevo entorno de desarrollo como el WinAVR o el AVR Studio, sin embargo ésa es también una realidad inescapable con cualquier nueva arquitectura que uno desee aprender, y con el tiempo después del segundo o tercer entorno de desarrollo que uno aprende, uno se da cuenta que finalmente todos los entornos de desarrollo y todas las arquitecturas funcionan escencialmente de la misma manera. En ese punto es precisamente cuando uno le pierde definitivamente el miedo a aprender nuevas arquitecturas, nuevos entornos, nuevas tecnologías y nuevas aplicaciones, lo cual obviamente no pasa de inmediato sino después de un buen tiempo de experimentación y con una buena dote de esfuerzo y constancia.

En estas circunstancias es cuando realmente saber programar en lenguaje C paga sus dividendos. El lenguaje C tiene la capacidad de abstraer los detalles de bajo nivel en las diversas arquitecturas al punto de hacer a éstas muchísimo más similares de lo que en realidad son. Para eso fue creado justamente el lenguaje C, para hacer los programas más portables de una arquitectura a otra, a tal punto de que uno puede escribir en lenguaje C un determinado programa para una determinada arquitectura y transportar el mismo programa a otra arquitectura con mínimas modificaciones, lo cual es muy dificil con el assembler, pues para transportar un programa en assembler de una arquitectura a otra, se debe reescribir prácticamente todo el código para readecuarlo a la nueva arquitectura con sus propias instrucciones, registros, uso particular de memoria, etc.

Finalmente, aprender una nueva arquitectura es siempre una nueva satisfacción que añade al mismo tiempo experiencia y mayor flexibilidad al trabajo personal o a la afición por la experimentación electrónica.

Raúl Alvarez Torrico
www.TecBolivia.com

Suscríbete a Nuestro Boletín de Noticias

Y te notificaremos de la publicación de otros artículos similares.

Pregunta anti spam: Cuanto es 2+3?
Nombre:
Email:

Productos Relacionados en Nuestra Tienda Virtual

Microcontrolador ATMEGA32U4-AU

Microcontrolador_4f7b2d36ea830.jpg

Detalles del Producto



Microcontrolador ATMEGA32U2-AU

Microcontrolador_4f7b2b1dd6afa.jpg

Detalles del Producto



Microcontrolador ATtiny2313

Microcontrolador_4e414bf520e5e.jpg

Detalles del Producto



Microcontrolador ATMEGA324PA-PU-ND

453-40-dip_sml

Detalles del Producto



Programador En Sistema Atmel ATAVRISP2 USB 2.0

atavrisp2

Detalles del Producto