Programar ATtiny2313 con Arduino

Hoy toca µControladores y Arduino, específicamente, de la gama ATtiny, los pequeños de Atmel, y como programarlos mediante la plataforma Arduino de un modo sencillo y rápido.

Los ATtiny son pequeños µControladores de 8 bits con poca memoria flash y EEPROM, limitados en comunicaciones y encapsulados que van desde los 6 pines el más pequeño hasta los 32 pines el más grande, lo que los convierte en los cerebritos ideales para pequeños proyectos de pocas características y cuyo objetivo sea ser de bajo coste y pequeño tamaño.

Podemos ver toda la gama de ATtinys en la web oficial: ATmel tinyAVR

Pero para poder utilizarlos, necesitaremos de una forma de poder programarlos.
Tenemos dos opciones:
– Comprar un programador ISP y programarlos mediante el software AVR Studio.
Convertir un Arduino en programador ISP (In-System Programmer).

Esta última opción, es la que voy a intentar explicar paso a paso para poder programar uno de estos pequeños mediante una placa Arduino.

Antes de ver como programar un ATtiny con un Arduino, debemos conocer en qué vamos a convertir el Arduino, es decir, el programador ISP y el método de programación «In-System Programming».

Un poco de historia
Este método ISP utilizado por Atmel para la programación de los dispositivos AVR se diseñó para poder programar los µControladores y demás dispositivos programables una vez instalados en un sistema completo, es decir, poder programar los chips sin la necesidad de tener que retirarlos de la placa de circuito donde se encuentren.

La ventaja de este sistema, es que permite a los fabricantes, poder integrar el proceso de instalación y programación en una misma fase dentro de la producción de dispositivos, en lugar de necesitar una etapa de programación de los circuitos integrados antes de la instalación en las placas.

Esto ahorra muchos costes ya que permite a los desarrolladores tanto programar los circuitos integrados en lugar de tener que comprarlos pre-programados por otras partes, como realizar cambios en el código durante la fase de producción.

¿Cómo funciona?
El método «In-System Programming» utiliza el protocolo de comunicación SPI «Serial Peripheral Interface».

Este bus SPI (Explicado en este post anteriormente) consiste en 3 líneas de datos:
– Serial Clock (SCK)
– MasterIn-SlaveOut (MISO)
– MasterOut-SlaveIn (MOSI)

Al programar un dispositivo AVR, el programador funcionará como dispositivo «maestro» y el circuito integrado a programar, como dispositivo «esclavo», por lo que en nuestro caso, el Arduino será el «maestro» y el ATtiny será el «esclavo» .

El programador ISP (Nuestro Arduino) provee una señal de reloj a través de la linea SCK. En cada pulso de reloj, se transmite un bit de comunicación desde el maestro al esclavo, a través de la línea MOSI y simultáneamente en cada pulso de reloj, se transmite un bit de comunicación desde el esclavo al maestro, a través de la línea MISO. De este modo se realiza la comunicación.

En el siguiente esquema podemos ver las distintas partes del sistema:

Donde el «PC 9-PIN Serial Port» se corresponde al puerto serie del PC (USB en nuestro caso) conectado al «In-System Programmer» que será nuestra placa Arduino y conectado a este último el «Target AVR MCU» que corresponderá al microcontrolador que queramos programar, en nuestro caso, el ATtiny.

Como se ve en el esquema, programador y programado, deben tener masa común.

En este documento AVR910: In-System Programming, se explica detalladamente todo el método de programación ISP así como el protocolo de comunicación SPI y un esquema electrónico para la realización de un programador ISP de bajo coste.

Convertir un Arduino en programador ISP
Podríamos realizar el programador ISP de bajo coste que viene en el PDF del link anterior, pero pudiendo convertir el Arduino en un programador ISP, todo eso que nos ahorramos.

Vamos por pasos:

1.- Para empezar, vamos a realizar un pequeño esquema para poder visualizar el estado del programador ISP, añadimos 3 leds con sus respectivas resistencias (220 Ω/270 Ω) a los pines digitales 7, 8 y 9.

2.- Acto seguido, debemos descargar los archivos correspondientes a los «núcleos» de los microcontroladores ATtiny para poder trabajar con Arduino. Procedemos a descargar estos archivos desde el siguiente repositorio: Arduino-tiny.

Descargado, descomprimimos, y tendremos dos carpetas llamadas «tiny» y «tools».
Dentro de la carpeta por defecto que Arduino establece para los sketchs, (en Windows suele ser Mis Documentos>Arduino) crearemos una carpeta llamada «hardware», y dentro de esta carpeta, colocaremos las carpetas «tiny» y «tools», de modo que las rutas queden así:
– Mis Documentos>Arduino>hardware>tiny
– Mis Documentos>Arduino>hardware>tools  

3.-  Conectamos nuestro Arduino al PC y arrancamos el IDE de Arduino 1.0.
Vamos a Files>Examples>ArduinoISP y abrimos dicho sketch.

En la web de Arduino, nos recomiendan que busquemos la función «heartbeat()» dentro del skech y cambiemos el delay(40); que tiene dicha función por un delay(20);.
Finalmente, cargamos el sketch en la placa Arduino.

Una vez cargado el sketch, se encenderán los leds uno a uno parpadeando varias veces, para terminar manteniendo en parpadeo suave el led conectado al pin 9, el led verde en mi caso, como se puede observar en el vídeo siguiente:

4.- Una vez que tengamos el Arduino en modo programador ISP y el led verde parpadeando suavemente, ya podemos conectar el ATtiny para programarlo, utilizando las líneas de datos vistas anteriormente.

SCK —–> Pin digital 13 de Arduino
MISO —> Pin digital 12 de Arduino
MOSI —> Pin digital 11 de Arduino
RESET —> Pin digital 10 de Arduino

Si observamos el pinout del ATtiny2313, veremos cuales son dichos pines y procedemos a conectarlos:

Por último debemos añadir 2 elementos más, importantes, que son, una resistencia de 10 kΩ en el Pin Nº1 del ATtiny hacia Vcc y un condensador de 10 uF entre GND y el pin de RESET del Arduino. Este condensador es muy importante, ya que evitará que se reinicie el Arduino al cargar el sketch correspondiente a la programación del ATtiny, por lo que debemos conectarlo después de cargar el sketch ArduinoISP, es posterior al Paso 3.

Así quedará el esquema completo:

En el esquema anterior, he añadido un led conectado al pin PB4 del ATtiny, ya que para comprobar el funcionamiento, cargaremos el sketch «blink» de Arduino, y el pin PB3 del ATtiny2313 se corresponde con el pin digital 12 de Arduino.

5.- Con todo conectado, nos queda la programación del ATtiny, pero debemos realizar un último paso, que es seleccionar en el IDE de Arduino, el ATtiny que vayamos a programar, en nuestro caso, el ATtiny2313 a 1MHz interno, es decir, no necesitará cristal externo.
Por tanto, abrimos el ejemplo «Blink» y nos vamos a Tools>Board>ATtiny2313 @ 1MHz 

Y seleccionamos el método de programación del ATtiny, por lo que nos vamos a Tools>Programmer>Arduino as ISP

6.- Hecho esto, solo nos resta darle a «UPLOAD» como si de cualquier sketch de Arduino se tratase, y veremos como, si todo está correcto, se enciende el led conectado al Pin digital 7 durante el tiempo que el Arduino esté programando al ATtiny. Y Fin! 
El ATtiny se programará y comenzará a funcionar!

Ya solo nos queda conocer los correspondientes pines del ATtiny para poder realizar la programación de todos ellos. Aún siendo uno de los pequeños de Atmel, el ATtiny2313 dispone de puerto serie, bus I2C, bus SPI, 18 pines de entrada/salida programables.

En la siguiente imagen de Akafugu.jp podemos ver todos los pines de todos los ATtiny y los correspondientes al ATtiny2313 que corresponden con la programación para los núcleos anteriormente descargados del projecto Arduino-tiny.
En letra pequeña podemos leer que los pines con PWM son los que están marcados con un asterisco.

Un vídeo de funcionamiento!

😀

96 comentarios en “Programar ATtiny2313 con Arduino

  1. Gracias por tu inestimable trabajo, muy claro.
    Mi consulta es un poco problemática ya que necesito utilizar una LCD de 20×4 y me es necesario disponer de los dos puertos Analógicos que dispone el Attiny2313.
    He rebuscado por todas partes y no encuentro una solución que me sirva, la más socorrida es:
    http://www.instructables.com/id/How-to-control-a-16×2-LCD-using-an-AVR-ATtiny2313/
    o esta otra
    http://www.instructables.com/id/AVR-LCD-Namebadge/
    Que no me sirven por que usan todo el puerto PB0-PB7 (que incluye los 2 AN0 y AN1)

    Si tienes tiempo me podrías ayudar, Gracias.

  2. Hola, super interesante y muy clara la explicación del trabajo. ¿se podrán usar aunque sea dos pines como PWM?

  3. Hola, gracias por tu aportación, me gustaría preguntarte si has conseguido programar el attiny 2313A, he seguido todos tus pasos pero no soy capaz, creo que el 2313 si pero el 2313a no, sabrias buscar una solución?
    Muchas gracias.

Deja un comentario!