ATmega328P Esenciales: Comenzando sin Arduino

Ari Mahpour
|  Creado: Mayo 29, 2024
ATmega328P Esenciales: Cómo Empezar Sin Arduino

He estado usando la placa Arduino Uno durante bastante tiempo, incluyéndola como ejemplos en muchos de mis artículos. Siempre me he preguntado qué se necesitaría para hacer funcionar completamente por su cuenta al ATmega328P (el chip original utilizado en las placas Uno más antiguas). Con Arduino haciéndolo tan accesible a través de su bootloader, su agradable software GUI y la abstracción en C++, te preguntarías por qué en el mundo querría intentar esto. A veces, para apreciar lo que otros han hecho, es importante intentar hacerlo uno mismo. Este proyecto realmente demostró cuánto trabajo pusieron las personas de Arduino en esto y cambiaron el mundo con ese pequeño producto amigable.

En este artículo, vamos a explicar cómo iniciar el chip completamente por su cuenta usando solo una fuente de alimentación externa y un programador Atmel-ICE. Demostraremos cómo comunicarse con el chip a través de la interfaz serial incorporada y también cómo hacer parpadear un LED o dos.

Configuración del Entorno

Hay varias formas de configurar un ATmega328P. Una de ellas, intencionalmente no cubierta como puedes decir por el título, es insertando tu chip ATmega328P en un Arduino Uno, programándolo y luego trasladándolo a una protoboard. Basado en comentarios en foros, algunas personas quieren saltarse el proceso de Arduino y usar un enfoque más tradicional con programadores como el Atmel-ICE de Microchip. La forma más directa de empezar con un microprocesador de Microchip (anteriormente Atmel) es instalar Microchip Studio. Al momento de escribir este artículo, el conjunto completo de Microchip Studio solo es compatible con Windows. Dado que me gusta tener todos mis entornos de compilación ejecutándose en CI (Integración Continua), opté por un enfoque alternativo.

La Colección de Compiladores GNU (GCC) es uno de los compiladores más populares para el lenguaje C. Compila ciertas plataformas y arquitecturas pero no para la familia de chips AVR (ATmega). Sin embargo, hay un conjunto de compiladores para la AVR y otras familias de Microchip alojados en su sitio web. Afortunadamente, algunas personas amables incluso han empaquetado estos compiladores en agradables paquetes Debian que pueden instalarse fácilmente en Debian o Ubuntu de esta manera:

$ apt-get install gcc-avr binutils-avr avr-libc avrdude

Con estas herramientas instaladas, ahora somos capaces de compilar y programar el ATmega328P solo con un programador Atmel-ICE y una fuente de alimentación externa (ajustada a 5V). Usaremos la versión AVR de GCC para compilar el código y AVRDUDE para flashear el chip ATmega328P.

El Proyecto

Para este proyecto, mi objetivo era demostrar algunas capacidades básicas, pero funcionales, del ATmega328P. Un simple LED externo parpadeante y algunos comandos seriales de ida y vuelta fueron todo lo que necesité para probar que este chip podría sostenerse por sí mismo. En el repositorio del proyecto he creado algunas carpetas además del código fuente (llamado “src”) que asisten con el desarrollo de este proyecto.

Un componente importante para el desarrollo de software (incluso el software que se implementa en hardware) es la prueba unitaria. La prueba unitaria valida que las funciones o piezas del sistema más grande estén funcionando como se espera. Si alguien llega y modifica una pieza de esa funcionalidad, la prueba unitaria evitará que ocurran regresiones (es decir, que involuntariamente rompas algo más al introducir una nueva característica). En este ejemplo, he escrito una prueba unitaria básica que simula el hardware y ejecuta el esquema de inicialización de la biblioteca de comunicación serial (USART).

Además de las pruebas unitarias (ubicadas en la carpeta “tests”), también hay una carpeta llamada “hil” que significa Hardware in the Loop. Esta carpeta contiene los scripts necesarios para ejecutar pruebas con hardware real en el bucle (como se discutió en muchos de mis artículos anteriores). Esto asegura que mi código es funcional no solo en el mundo virtual (usando simulaciones) sino también en el mundo real al ejecutar pruebas en hardware real.

Consultar el README.md te proporcionará un diagrama de conexión para conectar el programador Atmel-ICE al chip ATmega328P:

Diagrama de pines de Atmel ICE

Figura 1: Diagrama de pines de Atmel ICE

Agregando algunos LEDs, conectando el puerto de comunicación serial a una Raspberry Pi, y tomando la línea de +5V de la Raspberry Pi, ahora tienes un ensamblaje completo listo para funcionar:

Placa de expansión para Raspberry Pi

Figura 2: ATmega328P usando una placa de expansión con la Raspberry Pi y el programador Atmel-ICE

Pruebas, Compilación y Más Pruebas

A medida que desarrollas nuevas características, usa el Makefile para ejecutar pruebas unitarias y compilar el código. Después de validar que tu código deseado hace lo que se supone que debe hacer (a través de la validación de pruebas unitarias), construye el binario, flashealo en el dispositivo (también a través del Makefile) y ejecuta pruebas de Hardware in the Loop (HIL) usando el puerto de comunicación serial de la Raspberry Pi.

Una de las piezas más importantes es flashear correctamente los bits de fusible para habilitar el reloj interno de 8 MHz. Esto está documentado en el README pero también se añade al comando de flasheo en el Makefile:

avrdude -c atmelice_isp -p m328p -B 32 -U lfuse:w:0xe2:m

Después de eso, deberías ser capaz de usar la interfaz serial del chip con la suposición de que el reloj a bordo funciona a 8 MHz (como se define en la parte superior de main.c). Desde aquí deberías ser capaz de añadir más funcionalidad como soporte para comandos seriales adicionales, interfaces para componentes y sensores externos, y cualquier cosa que puedas pensar con este divertido pequeño microcontrolador.

Conclusión

En este artículo, aprendiste cómo empezar con el chip ATmega328P sin necesidad de circuitos externos como se ve comúnmente con los Arduino Unos originales y las placas de evaluación de Microchip. Ahora conoces el concepto de pruebas unitarias, compilaciones binarias, programación del chip y ejecución de pruebas de hardware en el bucle. Además, hubo un detalle importante, a menudo pasado por alto, sobre la programación de los bits de fusible para configurar el reloj interno a 8 MHz. En este punto, deberías ser capaz de añadir más funcionalidad con pruebas unitarias y HIL adicionales y ejecutar todo con solo un programador Atmel-ICE y una fuente de alimentación externa de 5V. Por simplicidad, utilizar un Raspberry Pi por su fuente de alimentación y capacidades de comunicación serial sería la manera más fácil de controlar el proceso de principio a fin.

El código fuente del proyecto se puede encontrar aquí:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.

Sobre el autor / Sobre la autora

Sobre el autor / Sobre la autora

Ari es un ingeniero con una amplia experiencia en diseño, fabricación, pruebas e integración de sistemas eléctricos, mecánicos y de software. Le apasiona integrar a los ingenieros de diseño, de verificación y de pruebas para que trabajen juntos como una unidad cohesiva.

Recursos Relacionados

Documentación técnica relacionada

Volver a la Pàgina de Inicio
Thank you, you are now subscribed to updates.