Cómo Programar micros AVR

Si siempre quisiste programar los chips AVR de Atmel y nunca supiste cómo o simplemente los tutoriales eran demasiado dificiles de seguir, este post es tu oportunidad para lograrlo.
Hay momentos en que nuestros proyectos requieren implementar un algortimo complicado y disponemos de poco espacio o poco presupuesto o simplemente no queremos ocupar tantos chips. Es en este momento cuando pasamos al mundo de los microcontroladores. Existen 2 grandes familias de microcontroladores en el mundo DIY, la primera son los PIC y son mayoritariamente usados en un mercado más profesional, sobretodo en universidades e institutos. La otra familia de micros son los AVR y esta será la que nosotros ocuparemos.

La razón de por qué AVR y no PIC es debido a la naturalidad con que se pueden programar y su gran similitud con "Arduino", no es ningún secreto que desde que Arduino llegó al mercado ha habido un auge en lo que AVR se trata.


Lo primero es conseguir un programador de AVR, para eso tienes muchas opciones, te recomiendo visitar las tiendas (Olimex, Riab, Adafruit, etc) en donde encontrarás las distintas variedades disponibles y sus distintos precios. Lo importante es que sea compatible con nuestro software y para eso es conveniente ver la lista de programadores compatibles aquí antes de comprar alguno.
Yo ocupo el programador USBtiny ya que es muy barato, y está muy bien documentado debido a su gran popularidad.


Una vez con programador en mano instala sus respectivos drivers en tu computador (el proceso de instalación será muy variado y dependerá completamente del dispositivo que hayas comprado, en general, cada tienda posee la respectiva documentación para cada dispositivo).

Ahora descarga e instala los siguientes archivos

Descargar WinAVR para Windows  (si tienes Ubuntu o Mac te recomiendo seguir este tutorial)

Descargar MikroC para AVR 2011

Una vez instalado tanto los drivers, WinAVR y MikroC, estamos listos. Asegúrate de que el programador esté funcionando con sus respectivos drivers, para eso ve a panel de control y luego a administrador de dispositivos y asegúrate de que bajo tu dispositivo no haya ninguna advertencia.




Ahora debes elegir el chip que quieres programar, la variedad es grande y el rango de precios también. Por ejemplo, en este tutorial ocuparemos el Attiny13.



Este chip tiene 8 pines
  • Vcc es el voltaje de alimentación, lo recomendable son 5 volts, pero hay cierto margen de error, no superior a 2 volts
  • GND es el neutro
El resto (PB1,PB2,PB3...PB4) es el puerto B y lo importante de estos pines es que pueden ser modificados, es decir, según nuestro programa que escribiremos, pueden cambiar de LOW a HIGH a nuestra voluntad, es decir, pueden hacer lo que nosotros les pidamos...interesante...
Ahora que ya conocemos algo el chip, es hora de escribir el código. Ojo, hay otros chips algo más grandes, que poseen más puertos además del puerto B, tienen puerto A y D también, pero eso lo cubriremos en otros posts, por ahora sólo hablaremos del puerto B.

Abre MikroC, una vez abierto ve a File > New > New Project > Next

Aparece la siguiente ventana


  • Project Name: Es el nombre del proyecto
  • Project Folder: Es la dirección de la carpeta donde se guardará tu proyecto
  • Device Name: Es el nombre del chip que ocuparemos, en nuestro caso Attiny13
  • Device Clock: Es la velocidad del clock a la que funciona nuestro dispositivo y requiere una pequeña explicación.
Device Clock es muy importante por lo siguiente, le indica a MikroC a que velocidad está funcionando nuestro chip. A qué velocidad está funcionando? Nuevamente, depende de tu Chip, por ejemplo, El Attiny13 funciona a 1,2 mhz sin la necesidad de cristal externo. Sin embargo, si deseas aumentar la velocidad es posible agregando un cristal externo y quemando los fusibles internos, pero eso lo cubriremos en otra entrada, por ahora nos conformaremos con los 1,2 mhz del cristal interno y con eso será suficiente.

Continúa apretando Next cuantas veces sea necesario y al terminar aparecerá la ventana principal.

deberá aparecer un texto como el siguiente

void main() {
}

 El código como todo programa posee 2 partes, una en que definimos las variables y otra en que definimos lo que hacen estas variables.

Pues bien, para definir las variables se sigue el siguiente formato

  DDRX.BY = Z 

donde X es el puerto, Y es el número de pin bajo este puerto y Z la define como input o output. Complicado? Por ejemplo. Supón que queremos definir el pin  2 cómo un LED que se prende y apaga. Entonces, cómo vemos en la imagén de nuestro chip Attiny13, el pin 1 corresponde a PB3, entonces...
  • X = B ya que estamos hablando del puerto B
  • Y = 3 ya que este es el quinto pin del puerto B
  • Z = 1 ya que queremos que este pin sea una salida o "output", es decir que exprese algo. Si quisiesemos que este pin capture algo, como un sensor, entonces sería una entrada y por lo mismo sería un "input"en cuyo caso sería Z = 0.

 Para definir el comportamiento de las variables a través del tiempo seguimos un formato algo distinto, primero definiremos un loop donde podremos ejecutar nuestro programa, así

while(1){
}

 De esta manera nos aseguramos que siempre se estará ejecutando lo que este dentro de este "while"

Ahora, para prender el pin diremos

 PORTX.BY=1;
nuevamente, si quisiesemos prender el pin 1, entonces haremos

 PORTB.B3=1;
y si quisiesemos apagarlo sería

 PORTB.B3=0;

para lograr una demora dentro del loop hacemos

delay_ms(tiempo);

donde tiempo es un número de tiempo pero medido en milisegudos, por ejemplo, si quisiésemos detenernos 1 segundo entonces serían 1000 milisegundos

delay_ms(1000);

También existe la opción de hacer una demora en microsegundos, en cuyo caso el comando es

delay_us(tiempo');

Perfecto, hora de escribir nuestro código, lo que queremos hacer es el efecto cartelera de cine, ese típico efecto en que las luces se van prendiendo y apagando una después de otra haciendo parecer que la luz va saltando de LED en LED.

El código está aquí, copialo y pégalo o escribe tu propio código, pero conserva la idea. Ahora haz click en "Build" en la barra de "Build" o simplementa aprieta Ctrl+F9

Ve a la carpeta donde habiamos guardado nuestro proyecto (Project folder) y fijate que tenemos varios archivos con el nombre Blink, pero hay uno en especial que se llama Blink.hex. Es este archivo el cual queremos cargar en nuestro chip, para ello, haremos lo siguiente

Abre el bloc de notas y escribe la siguiente línea

avrdude -c programador -p chip -u -U flash:w:blink.hex
pause


programador = es el nombre de tu programador
chip = es el nombre del chip

para revisar que parámetros van en cada lugar revisa este link. En mi caso la línea sería

avrdude -c usbtiny -p t13 -u -U flash:w:blink.hex
pause

Ahora ve a "guardar como" y pon por nombre "run.bat" y guárdalo en la misma carpeta en la que se encuentra nuestro proyecto.

Perfecto, suficiente software, ahora es hora del hardware, toma tu programador y fíjate en los cables de salida, deberían ser de distintos terminales, pero en verdad son iguales.




Elige uno de los 2 y une cada pin del programador a su respectivo pin en el microcontrolador, para ello fijate que cada pin en la imagen del microcontrolador tiene un respectivo nombre ISP (MOSI,MISO,SCK,RESET). Por ejemplo, el pin 5 (Attiny13) es el MOSI, por lo tanto ese debe ir conectado el pin MOSI del programador, lo mismo con MISO,SCK,VCC,GND y RESET. Una vez hecho esto revisa una vez más las conexiones y haz click sobre run.bat, deberías ver algo como la siguiente ventana.






Si no lograste ver el mensaje anterior seguramente se debe a algún error, lo más probable es que las conexiones entre el chip y el controlador están mal hechas, revísalas una vez más.
Otro problema se puede deber a que el programador no fue encontrado, desconéctalo y conéctalo una nueva vez. Esta vez, debería funcionar.





Perfecto, si ya estamos listos hasta aquí, felicidades! Ya estamos listos para el wiring final, arma el siguiente circuito en tu protoboard y estamos listos.



El resultado se muestra en este breve video



Felicidades, acabas de programar un chip AVR con éxito, desde ahora tienes una nueva herramienta para aplicar en tus próximos proyectos.
Te recomiendo ver la segunda parte, donde aprenderemos a hacer lecturas analógicas y ocuparemos la consola para debuggear nuestros proyectos, aquí 

9 comentarios:

  1. Justamente the iba a pedir un post como estos! lo tomare como referencia para manipular puertos desde la IDE Arduino saludos!

    ResponderEliminar
  2. si sabes como hacer lecturas análogas de la misma forma también te lo agradecería.

    ResponderEliminar
    Respuestas
    1. consulta has hecho PWM a mas de 20Khz?

      Eliminar
    2. Hecho, escribi un pequeño post explicando cómo hacer lecturas analógicas y como mostrar los resultados en consola.

      http://555riente.blogspot.com/2012/03/programando-avr-lecturas-analogicas-e.html

      y no, no he intentado hacer PWM a alta frecuencia. Saludos

      Eliminar
  3. al fin tengo mi programador , compre un pack en dealextreme y funciona la raja!! saludos compa sirve de mucho la info para iniciarse nos vemos.

    ResponderEliminar
  4. Buenos dias
    Tengo el siguiente problema
    Estoy usando un avr328p, que saque de mi arduino, programando con el mikroc avr y cargando los programas con el avrdude.

    Los porgraas se compilan y ejecutan muy bien cuando lo programo, pero despues de que desconecto el voltaje en el avr, y lo vuelvo a conectar no funciona, hasta que lo vuelvo a reprogramar.

    Los fuses estna intactos:
    Fuses hFuse: D6, Ifuse: FF, eFuse: 05

    Gracias

    ulix_fenix@hotmail.com

    ResponderEliminar
  5. Hola, me descargue el mikroc de tu link, pero cuando hago códigos mas complejos me sale el "demo limit", tienes un crack o sabes como activarlo a la versión completa?

    Gracias por la ayuda
    heyho-letsgo12@msn.com

    ResponderEliminar

Comenta aquí...