Programando el microcontrolador AVR con GCC usando libc 1.0.4

ArticleCategory: [Categor�a del art�culo, no lo traduzcas]

Hardware

AuthorImage:[Una peque�a imagen del autor]

[Photo of the Author]

TranslationInfo:[Informaci�n sobre autor e historia de la traducci�n]

original in en Guido Socher

en to es Alberto Pardo

AboutTheAuthor:[Peque�a biograf�a del autor]

A Guido le gusta Linux porque es un buen sistema donde desarrollar uno mismo su propio hardware.

Abstract:[Peque�o sumario del art�culo]

El microcontrolador de 8 bits AVR de tecnologia RISC de Atmel es un microcontrolador muy popular. Este microcontrolador es un chip con EPROM, Ram, un conversor Anal�gico-Digital, unas cuantas entradas y salidas digitales, timers, una UART para comunici�n RS 232 y muchas otras cosas.

Sin embargo, lo mejor es su entorno de programaci�n disponible en Linux: Se puede programar este microcontrolador in C usando GCC.

Ya escrib� en Marzo del 2002 un art�culo sobre el mismo tema. Han canbiado muchas cosas en el desarrollo de avr-libc y Atmel ha dejado de fabricar el microcontrolador AT90S4433 que use en el 2002 . Por lo que este art�culo es una actualizaci�n del publicado en Marzo del 2002. Utilizar� la libc-1.0.4 y el microcontrolador ATmega8.

Este art�culo s�lo es una introducci�n. En posteriores art�culos construiremos interesantes montajes basados en este microcontrolador. Pero ahora vamos a conocer al ATmega8.

ArticleIllustration:[Ilustraci�n para la cabecera del art�culo]

[Illustration]

ArticleBody:[El contenido del art�culo]

Introducci�n

Mucha gente se interes� por la programaci�n de microcontroladores despues del art�culo que escrib� en el 2002.Sin embargo tener el sistema de desarrollo listo y funcionando es el proceso m�s complicado. Si algo falla y no tienes pistas de por donde puede fallar, entonces es el momento de planterase una serie de posibilidades como causantes del fallo : �El cable esta mal? �Es un fallo del circuito? �Es correcta la instalaci�n? �Esta desactivado el puerto paralelo en la Bios?.

Para facilitar la entrada al excitante mundo de los microcontroladores la empresa shop.tuxgraphics.org ofrece un CD botable con el manual y el hardware de programaci�n. Todo lo que necesitas es arrancar con este CD. No hace falta instalar el software, por lo que no se modificara nada en tu ordenador.

Particularmente, el uso de este CD autoarrancable me presenta la ventaja de no preocuparme por todas las actualizaciones del kernel o instalaciones de software en mi PC. Si tengo que actualizar el software del microcontrolador, arranco desde el CD y todo lo tengo listo y funcionando.

Independientemente de este CD, esplicar� a continuaci�n la instalaci�n del entorno de desarrollo de avr en GCC. Si tienes el CD de tuxgraphics continua en el cap�tulo "Un peque�o proyecto de test".

Instalaci�n del software : Todo lo que necesitas

Para usar el entorno de desarrollo GNU C necesitaras el siguiente software:

binutils-2.15.tar.bz2 Disponible en:
ftp://ftp.gnu.org/gnu/binutils/
o cualquier mirror. Ejemplo:
ftp://gatekeeper.dec.com/pub/GNU/binutils/
gcc-core-3.4.2.tar.bz2 Disponible en: ftp://ftp.gnu.org/gnu/gcc/
o cualquier mirror. Ejemplo:
ftp://gatekeeper.dec.com/pub/GNU/gcc/
avr-libc-1.0.4.tar.bz2 La libreria AVR C disponible en: http://savannah.nongnu.org/projects/avr-libc/
uisp-20040311.tar.bz2 El software de programaci�n AVR disponible en: http://savannah.nongnu.org/projects/uisp


Instalaremos todos los programas en /usr/local/avr. De esta manera los mantendremos separados del compilador de C de Linux. Crea este directorio con el comando:
    mkdir /usr/local/avr 

A�ades el camino en el PATH:
    mkdir /usr/local/avr/bin
    export PATH=/usr/local/avr/bin:${PATH}

Instalacion del Software : las bintuils de GNU

El paquete de las binutils proporciona todas la utilidades necesarias a bajo nivel para construir los fichero objeto. Estas utilidades incluyen: Un ensamblador AVR (avs-asm),un enlazador o linkador (avr-ld),la libreria "handling tools" (avr-ranlib,avr-ar), los programas para generar los ficheros objeto para poder ser cargados a la EEPROM del microcontrolador (avr-objcopy), el desensamblador (avr-objdump) y las utilidades avr-strip y avr-size.

Ejecuta las siguientes instruciones para construir e instalar las binuitls:
tar jxvf binutils-2.15.tar.bz2
cd binutils-2.15/
mkdir obj-avr
cd obj-avr
../configure --target=avr --prefix=/usr/local/avr --disable-nls
make

# as root:
make install


A�ade la linea /usr/local/avr/lib al fichero /etc/ld.so.conf y ejecuta el comando /sbin/ldconfig para reconstruir la cache del enlazador o linkador.

Instalaci�n del Software : AVR gcc

avr-gcc ser� nuestro compilador de C.

Ejecuta el siguiente comando para construirlo e instalarlo:
tar jxvf gcc-core-3.4.2.tar.bz2
cd gcc-3.4.2

mkdir obj-avr
cd obj-avr
../configure --target=avr --prefix=/usr/local/avr --disable-nls --enable-language=c

make

# as root:
make install
   

Instalaci�n del Software : La libreria de C de AVR

La actual libreria de C es lo suficientemente estable comparada con la que presente en Marzo del 2002.
Ejecuta el siguiente comando para construirlo e instalarlo
tar jxvf avr-libc-1.0.4.tar.bz2
cd avr-libc-1.0.4
PREFIX=/usr/local/avr
export PREFIX
sh -x ./doconf
./domake

cd build
#as root:
make install
   

Instalaci�n del Software : El Programador

El software de programaci�n carga el codigo objeto en la EEPROM de nuestro microcontrolador.

El programador uisp para Linux es un buen programador. Se puede usar desde el "Makefile". Tan solo con a�adir la regla "make load", podras compilar y cargar el software en un paso.

Ver como se instala uisp:
tar jxvf uisp-20040311.tar.bz2.tar
cd uisp-20040311
./configure --prefix=/usr/local/avr
make

# as root:
make install
   

Un peque�o proyecto de test

Empezaremos con un circuito sencillo de test, el cual ampliaremos m�s adelante.

Este circuito lo podremos usar como un test sencillo de entorno para desarrollos m�s complejos de hardware. Podr�s cargar facilmente el software en el microcontroloador y comprobar los sensores conectados o el equipo de medida.

El siguiente programa de test har� parpadear a un led.

Hardware necesario

[test circuit]
Necesitaras los componentes que aparecen en el listado de la tabla. Aunque se trata de un microcontrolador muy com�n,te resultar� m�s facil localizarlo en un gran distribuidor de componentes electr�nicos : www.conrad.de (germany), www.selectronic.fr (france), digikey.com (US, CA), etc...
Tambi�n puedes adquirir todo el kit o s�lo el microcontrolador en shop.tuxgraphics.org
1 x ATmega8 versi�n DIP , procesador Atmel 8 bit Avr risc.
Zocalo 1 x 28 pins 7.5mm
Los zocalos de 28 pins son dificiles de localizar.Tener en cuenta que suelen ser de 14 mm de ancho , pero para el montaje necesitamos un zocalo de 7.5mm.
1 x resistencia de 10K (c�digo de color : marr�n,negro, naranja)
1 x resistencia de 1K (c�digo de color : marr�n,negro,rojo)
1 x 10uF condensador electrol�tico
Algunos cables
1 x LED
matrix board (protoboard o placa perforada con pads soldables)
El siguiente material se necesita para el programador (no es necesario si se tiene el "Kit AVR de programaci�n en Linux" de tuxgraphics):
1 x conector DB25 para conectar al puerto paralelo.
Cualquier tipo de conector/zocalo de 5 pins para conectar al programador. Recomiendo el uso de conectores de precisi�n strip (similares a los zocalos).
1 x Resistencia de 220 Ohm (c�digo de color : rojo,rojo,marr�n)
2 x Resitencia de 470 Ohm (c�digo de color : amarillo,violeta,marr�n)
Adem�s de una fuente electr�nica de 5V o en su defecto , una bateria de 4,5V.

Habr�s observado que no es necesario un cristal. Actualmente el ATmega8 tiene incorporado un oscilador. Se puede usar este oscilador cuando no se necesite un alta precisi�n de reloj. Por contra, si necesitas construir un equipo de medida o usar el interface UART/RS232 necesitaras el cristal. El tipo de oscilardo usado se puede modificar con el programa. Por defecto (selecci�n de fabrica) esta ativo el oscilador interno de 1MHz.

Construyendo el hardware del programador

Los microcontroladores AVR permiten la programaci�n "in circuit". (ISP). [Linux AVR programmer]
Esto significa que no es necesario extraer el microcontrolador de la placa de circuito impreso para reprogramarlo. Encontraras varios tipos de programadores desde 50 hasta 150 euros. De cualquier forma, ejecutando Linux es posible tener un programador sencillo. Necesitar�s un puerto paralelo libre y el siguiente cable.

Notar que se trata de un programador mejorado respecto al presentado en el art�culo presentado en Marzo del 2002. Las resistencias protectoras se construyen en el interior del programador. Esto ahorra espacio y componentes en la placa del cirucuito impreso. A continuaci�n se puede ver como se cablea:
pin sobre la pcb pin sobre el AVR resistencia de proteci�n Pin sobre el puerto paralelo
5 Reset (1) -- Init (16)
4 MOSI (17) 470 Ohm D0 (2)
3 MISO (18) 220 Ohm Busy (11)
2 SCK (19) 470 Ohm Strobe (1)
1 GND -- GND (18)

El cable no ha de ser m�s largo de 70cm.

La resistencia de protecci�n se puede montar dentro del mismo conector. Tal como se muesta en la foto de la derecha.

Esribiendo el software

El ATmega 8 se puede programar en C standard con la ayuda de gcc. Puede ser �til conocer algo de ensamblador del AVR , pero no es necesario.

El libc de AVR libc viene con un manual avr-libc-user-manual-1.0.4.pdf (1139921 bytes) que documenta todas las librerias disponibles en C. En la web de Atmel (www.atmel.com, ir a: avr products -> 8 bit risc-> Datasheets), podr�s descargar la "data sheet" completa. En ella se describen todos los registros y como usarlos.

Una cosa a tener en cuenta cuando se usa el microcontrolador es que s�lo dispone de pocos bytes de RAM. Esto significa que no puedes declarar estructuras largas de datos o strings. Los programas no deben contener demasiadas llamadas anidadas o de recursi�n.

Pasemos a la pr�ctica. Vamos a escribir un programa que haga parpadear nuestro led a intervalos de 0.5 segundos. No es muy �til, pero ya esta bien para empezar.

La avr-libc ha cambiado bastante. Antes se activaba un bit en el puerto con sbi y lo desactivabas cbi. Ahora estas fuciones se han eliminado. No obstante, presento un programa usando estas funciones eliminadas:
    /* Definici�n de "defines" para una compatibilidad futura */
    #ifndef cbi
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #endif
    #ifndef sbi
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    #endif

    void main(void)
    {
          /* INICIALIZACION */
          /* activa PC5 como salida */
          sbi(DDRC,PC5);

          
          /* Parpadeo, Parpadeo ... */
          while (1) {
                /* led on, pin=0 */
                cbi(PORTC,PC5);
                delay_ms(500);
                /* Activa la salida a 5V, LED apagado */
                sbi(PORTC,PC5);
                delay_ms(500);
          }
    }
   
El siguiente ejemplo hace exactamente lo mismo, pero usando la nueva sintaxis:
    void main(void)
    {
          /* INICIALIZACION */
          /* activa PC5 como salida */
          DDRC|= _BV(PC5);

          
          /* Parpadeo, Parpadeo ... */

          /* PC5 esta a 5 (ver el fichero include/avr/iom8.h) y _BV(PC5) es 00100000 */
          while (1) {
                /* led on, pin=0 */
                PORTC&= ~_BV(PC5);
                delay_ms(500);
                /* Activa la salida a 5V, LED desactivado */
                PORTC|= _BV(PC5);
                delay_ms(500);
          }
    }
   
El c�digo superior muestra lo simple que es escribir un programa. Mirando s�lo el programa principal, la funci�n delay_ms esta incluida en el listado completo (avrm8ledtest.c). Para usar el pin PC5 como salida se de activar el bit PC5 en el registro de direcci�n de datos del port C(DDR). Despues puedes activar PC5 a 0V con la funci�n cbi(PORT,PC5) (Desactiva el bit PC5) o a 5V con sbi(PORTC,PC5) )(activa el bit PC5).El valor de "PC5" se define en iom8.h que se incluye via io.h. No hace falta que te preocupes por ello. Si has escrito programas para sistemas multiusuario / multitarea como Linux, sabr�s que no se ha de programar un bucle infinito.Esto consumir� tiempo de CPU y enlentecer� el sistema mucho.Pero el caso de AVR es diferente.No tenemos varias tareas y no hay ning�n otro programa ejecutandose. Aqu� no hay un sistema operativo. Es normal tener un bucle infinito.

La compilaci�n y la Carga

Antes de nada, asegurate que tienes /usr/local/avr/bin en el PATH. Si es necesario edita tu fichero .bash_profile o .tcshrc y a�adelo:

export PATH=/usr/local/avr/bin:${PATH} (para bash)
setenv PATH /usr/local/atmel/bin:${PATH} (para tcsh)

Utilizamos el puerto paralelo u el uisp para programar el AVR. Uisp usa el interface ppdev del kernel. Por lo tanto necesitaras tener los siguientes modulos del kernel cargados:
    # /sbin/lsmod
    parport_pc
    ppdev
    parport
Verifica con el siguiente comando : /sbin/lsmod , que est�n cargados. En otro caso, cargalos (como root) con:
    modprobe parport
    modprobe parport_pc
    modprobe ppdev
   
Ser�a buena idea que se ejecuten autom�ticamente durante el startup. Puedes a�adirlos en un script rc (ejemplo para Redhat /etc/rc.d/rc.local).
Para poder acceder al interface ppdev como usuario, el root te ha de dar permiso de acceso mediante el comando:

chmod 666 /dev/parport0

Asegurate que el daemon de la impresora no est� ejecutandose ya que utiliza el puerto paralelo. Si esta ejecutandose es mejor desactivar este daemon antes de conectar el cable paralelo. Ahora ya esta todo listo para compilar y programar nuestro microcontrolador.

El paquete para nuestro programa test (avrm8ledtest-0.1.tar.gz) incluye un fichero make. Tan s�lo tienes que teclear:

make
make load

Esto compilar� y cargar� el software.No te explicar� los detalles de todas las instruciones. Las puedes ver en Makefile y son siempre las mismas. No puedo recordarlas todas. Si quieres escribir un programa diferente,entoces reemplaza en los lugares pertinentes de avrm8ledtest en el Makefile con el nombre de tu programa.

Algunas binutils interesantes

Hay algunas binutils que resultan m�s interesantes que el propio proceso de compilaci�n.
Esta utilidades no han cambiado desde Marzo del 2002. Revisa el cap�tulo "Algunas binutils interesantes" en article231, March 2002.

Ideas y sugerencias

Para muchos casos el ATmega8 es compatible con el AT90S4433.Tendr�s que programar el microcontrolador para usar el oscilador externo y podr�s utilizar con pocos cambios todo el hardware que present� en articulos anteriores. Desgraciadamente no he tenido tiempo de probar todos los circuitos con el ATmega8. Para evitar problemas, ser�a mejor usar el viejo AT90S4433. Pero si no te importa los problemas y deseas solventarlos entonces prueba el ATmega8 con los art�culos y montajes previos.

A continuaci�n tienes una lista de los art�culos realizados con el hardware antiguo:

Nota: El programador presentado el este art�culo, ya incorpora las resistencias protectoras que se montaban en los circuitos propuestos en pasados art�culos. Para poder usar las placas propuestas en esos art�culos, se han de sustituir las resistencias protectoras por un cable o puente.

Atmel suministra una nota de aplicaci�n "AVR081: Replacing AT90S4433 by ATmega8" donde se indican todas las incompatibilidades : at90s4433_to_atmega8.pdf (101343 bytes)

Referencias