Está en la página 1de 10

ATMega 328P standalone (o sea sin la placa Arduino) (Enero 2020)

Referencias:
Qué es el bootloader y cómo cargarlo
Cómo grabar el Bootloader Arduino en un AtMega32P
Configurar el IDE Arduino para AtMega328P con reloj interno 8 MHz

1. Objetivos

El objetivo de esta práctica es mostrar el procedimiento a emplear cuando queremos usar el C ATMega 328P de
forma independiente (standalone), fuera de una placa Arduino Uno, pero empleando el entorno de desarrollo (IDE)
de Arduino. La práctica se realizará primero haciendo funcionar el C con un oscilador que emplea un xtal externo
de 16 MHz y, en segundo lugar, empleando sólo el oscilador interno del C que trabaja a 8 MHz.

Se presupone que el C se ha comprado y a la hora de adquirirlo se puede optar por dos opciones, la primera de
ellas pidiendo el C de forma que ya viene con un bootloader para una determinada placa Arduino, por ejemplo para
Arduino Uno, y la segunda pidiendo el C sin ningún tipo de bootloader. El bootloader es un archivo hexadecimal
que se ejecuta antes que el programa del C y que permite que podamos emplear el IDE de Arduino. En caso
contrario, para programar el C deberíamos usar un programador (AVR ISP – In System Programmer) para la
arquitectura AVR que es la que tiene el C.

Nota: Según wikipedia, Atmega 328P tiene arquitectura AVR – Alf and Vegard’s RISC (The AVR architecture was
conceived by two students at the Norwegian Institute of Technology (NTH), Alf-Egil Bogen and Vegard Wollan.)

A la hora de realizar el pedido hay que elegir bien las siglas para evitar errores. El C debe ser ATMega 328P-PU.
ATMega 328P que es el C que incorpora la placa Arduino Uno y PU que dice que el encapsulado es DIP (pines a dos
lador-dual in pin). Hay que saber que el ATMega 328 es diferente del ATMega 328P (el P tienen características
adicionales como por ejemplo pico power (ahorro de energía).

2. Programación del C

La programación con la aplicación IDE de Arduino se realiza seleccionando en la aplicación tres elementos dentro del
menú Herramientas:

1. La placa (pe. Arduino Uno) para la que se desarrolla el programa facilitándonos la identificación de sus
entradas/salidas sin que nos preocupemos de los pines del C.
2. El puerto (pe. COM7) en el que se ha instalado (automáticamente) el driver que emplea el puerto USB del PC
para comunicarse con el puerto USB de la placa Arduino.
3. El programador (pe.” AVRISP mkll“ o “Arduino as ISP”) que es la aplicación que gestiona la comunicación de
los bits con la memoria del C. Recuerda que las siglas ISP significan In System Programmer, o sea
progrmación del C directamente en la placa o sistema en el que está conectado.

Además de seleccionar la placa, puerto y programador adecuados a lo que queremos hacer, el método de carga de
bits en el C supone que esos bits entran por unas determinadas líneas del C. Antes de desarrollar un programa
con el IDE de Arduino y subirlo (upload) al C, tengo que tener el C el bootloader correspondiente a la placa
Arduino que estoy simulando y por ello, aunque en ambos casos lo que hacemos es transferir datos al C, vamos a
seguir procedimientos diferentes cuando lo que queremos hacer es enviar (quemar) un bootloader, o bien enviar un
programa a la EEPROM del C.

En la práctica vamos a emplear el C de forma independiente en dos posibles configuraciones, con reloj a 16 MHz
(implica xtal externo de 16 MHz) y con reloj a 8 MHz (con el oscilador interno del C). Para emplear el IDE Arduino,
con el reloj de 16 MHz seleccionaremos una placa “Arduino Uno” que trabaja también con xtal de 16 MHz, y para la
configuración con reloj a 8 MHz seleccionaremos una placa específica “ATMega 328 on a breadboard (8MHz internal
clock)” que previamente tendremos que instalar en el IDE. Cada una de estas configuraciones supone un bootloader
diferente que hace corresponder (mapea) los pines del C a líneas de entrada/salida de la placa diferentes y, por
ello, es conveniente tener siempre en mente cuál es el pinout del C y cómo esos pines se mapean con los pines o
líneas de entrada/salida de la placa correspondiente. En las siguientes imágenes aparecen el pin out del C y la
corresponencia (mapeo) con la placa Arduino Uno (configuración con reloj a 16 MHz).

De acuerdo a cómo se emplea el ATMega 328P en la placa Arduino Uno, por ejemplo las líneas digitales 0 a 7
corresponden al puerto PD. Así los pines 2 y 3 de la placa Arduino Uno se corresponden con los pines 4 y 5 del C,
respectivamente. Esto hay que tenerlo en cuenta a la hora de programar y realizar las conexiones externas.

Para programar el C (no para quemar el bootloader) empleando el IDE de Arduino puedo hacerlo de varias formas:

a) Pinchando el C sobre la placa Arduino Uno.


b) Pinchando el C sobre una breadboard y usando un AVR programmer.
https://www.arduino.cc/en/Main/Standalone
c) Pinchando el C sobre una breadboard que se une a la Arduino Uno
sin C. https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard
d) Usando un programador FTDI (Future Technology Device
International) https://www.youtube.com/watch?v=4-YA9dxVYBE.
Se pueden ver las diferencias entre AVR y FTDI en este enlace
https://learn.adafruit.com/ftdi-friend/ftdi-friend-vs-avr-programmer.
Para el ATMega 328P he usado un convertidor USB a TTL de forma que conecto las líneas DTR, RX y TX del
convertidor a una placa en la que tengo un zócalo para pinchar y extraer el C fácilmente (placa DIY). Hay
varios vídeos sobre este asunto https://www.youtube.com/watch?v=tiETAwkxnmw o bien
https://www.youtube.com/watch?v=JYPHBnDzM2E. Este método se basa en usar la UART de Arduino y para
entender cómo funciona la UART y el USB de Arduino podemos ver este enlace
https://aprendiendoarduino.wordpress.com/2016/11/09/uart-y-usb-en-arduino/
Nota: Cuando emplea la placa Arduino como
programador ISP, lo primero que hace es convertir
la placa en programador. Esto se consigue subiendo
a la placa Arduino Uno un programa que hace las
veces de programador ISP. El programa se llama
“Arduino como ISP” y está disponible en el menú
Archivo>Ejemplos. Se selecciona el programa y se
sube a la placa, haciendo que ésta se comporte
temporalmente como un programador.

Si se emplea otro tipo de placa como programador


(pe. un adaptador USB a TTL), este paso no es
necesario y bastará con seleccionar el programador en el menú Herramientas>programador.

3. Cargar (quemar) el bootloader en el AtMega 328P

Lo primero que tenemos que tener en el C es el


programa bootloader. Para ello, hay que elegir en el IDE
el tipo de programador adecuado.

- Si se emplea una placa Arduino Uno como enlace


entre el IDE y el C ATMega 328P, en el IDE
debemos seleccionar el programador “Arduino
como ISP” y después “Quemar bootloader”. El
programa “Arduino como ISP” emplea tres pines
del C (17, 18 y 19) para cargarle el bootloaderl.
https://www.youtube.com/watch?v=-9fBePlRgic

- Si se emplea otro tipo de programador para


quemar el bootloader, por ejemplo AVR, se tendrá
que seleccionar el que se emplee.

El programador es el sw encargado de cargar, descargar y modificar datos en la ROM y la EEPROM del C. Según el
bootloader que tengas en el C, así tendrás que seleccionar en el IDE el tipo de placa en el menú
Herramientas>Placa.

Además de los pines que emplea el programador, tendremos que proporcionar al C la tensión de alimentación y
señal del xtal (16 MHz) por lo que tendremos que realizar las siguientes conexiones:

AtMega 328P Conexión


- Pines 7 y 20 Vcc
- Pines 8 y 22 Gnd -Tierra
- Pines 9 y 10 XTAL externo 16 MHz (y 2 condensadores de 22 pF a masa)
- Pin 1 (reset) Placa Arduino Uno pin 10 (se coloca también una resistencia de 10K a Vcc)
- Pin 19 Placa Arduino Uno pin 13
- Pin 18 Placa Arduino Uno pin 12
- Pin 17 Placa Arduino Uno pin 11
Paso 1. Subes a la placa Arduino Uno el programa “ArduinoISP”

Paso 2. Quemas el bootloader de la placa Arduino Uno en el C que quieres inicializar. Para ello, antes tienes que
decir que el programador va a ser la placa Arduino Uno seleccionando Programador “Arduino como ISP”.
Además, si quieres funcionamiento con xtal externo de 16 MHz eliges placa “Arduino Uno” y si quieres
funcionamiento con reloj interno de 8 MHz eliges placa “
Mensaje de warning

Nota sobre fuses en AtMega 328P y cómo cambiarlos:


https://aprendiendoarduino.wordpress.com/tag/fuses/
https://www.instructables.com/id/How-to-change-fuse-bits-of-AVR-Atmega328p-8bit-mic/

4. Subir el programa que debe ejecutar el AtMega 328P

Para cargar el programa en el C empleo el IDE de Arduino y un adapatador USB a TTL (modelo CH340C) que tiene 5
líneas Vcc, Gnd, Rx,TX y DTR. Las conexiones para realizar la programación, además de las necesarias para el C de
acuerdo a su bootloader (xtal 16 MHz externo ó reloj 8 MHz interno), son:

CH340C AtMega 328P


- Vcc Vcc - pines 7 y 20
- Gnd Gnd - pines 8 y 22
- TX RX - pin 2
- RX TX - pin 3
- DTR Reset - pin 1, a través de un condensador cerámico de 100 nF que estrecha el pulso,
y en paralelo con la resistencia de 10K entre Vcc y Reset, necesaria para el Reset del C.
Una vez realizadas las conexiones, para subir el programa hay que seleccionar en el menú herramientas el tipo
de placa y el programador. El programador es el “AVRISP mkll” y el tipo de placa depende del bootloader del C
(“Arduino Uno”, “

5. Montaje completo del circuito de acuerdo al programa y prueba de funcionamiento


De acuerdo al datasheet el pinout del C es el de la imagen. Para funcionamiento con xtal externo las mínimas
conexiones son:

- Pines 7 y 20 Vcc
- Pines 8 y 22 Tierra
- Pines 9 y 10 XTAL externo
- Pin 1 RESET (a Vcc a través de una resistencia de 10K)
https://www.electroschematics.com/diy-arduino-making-your-own-arduino/

Para funcionamiento con oscilador interno de 8 MHz hay que descargarse un archivo
https://www.mediafire.com/file/yp6uf545hv4fbf7/breadboard-1-6-x.zip/file y las mínimas conexiones son:

- Pines 7 y 20 Vcc
- Pines 8 y 22 Tierra
- Pin 1 Reset (a Vcc a través de una resistencia de 10K)
https://www.youtube.com/watch?v=bzPkNGOYgx8
https://www.youtube.com/watch?v=sNIMCdVOHOM&feature=youtu.be
Ampliación.
Si quieres tener una señal de reloj externa debes modificar los fuses del C, en concreto el bit 6 del byte inferiro.
Para ello, desde una consola de comandos, leo con el programa avrdude (antes instalo en el PC la aplicación
WInAVR) los valores actuales de los bytes del C y modifico el bit ue me interesa. Al poner a 0 (programmed) el bit 6
del byte inferior lo que hago es que en el pin 14 del AtMega 328P esté presente la señal de reloj. Para comunicarme
con el C empleo la placa “Arduino Uno” como “Programador ISP” al igual que hice para grabar el bootloader. Las
conexiones entre la placa Arduino Uno y el C también son las mismas que para grabar el bootloader.

Leo los valores actuales (opción –v)


Puedo ver que el byte inferior (lfuse) tiene ahora el valor FF – los pulsos en PB0 – pin 14 están desactivados. Lo que
hago es meter un nuevo valor en este byte. Pongo BF que equivale a poner a 0 el bit 6.

Ahora compruebo si se ha escrito el valor y al final del detalle de la salida del comando veo que así ha sido
Ahora ya puedo medir la señal de reloj en el pin 14 empleando un analizador lógico

También podría gustarte