Programación de microcontroladores AVR en GNU/Linux

embedded
Los microcontroladores AVR de ATMEL son una familia bastante potente y asequible. Son RISC y ofrecen características como la programación ISP (en el propio circuito), temporizadores, comparadores analógicos, PWM, RS232 y un largo etcétera. Aquí se explica qué se necesita para poder escribir programas en C y C++

Ingredientes

Lo primero que necesitas instalar son las librerias:

  • avr-libc
  • binutils

Además necesitas algunas otras cosas como:

  • avr-gcc
  • avr-gdb

Para instalarlos, si usas Debian ya sabes:

# apt-get -f install avr-libc gcc-avr binutils-avr gdb-avr

Compilando un programa

El siguiente ejemplo de Makefile sería para poder compilar un programa dividido en varios ficheros fuente para un AT90S8515. Se trata de un micro con 512 Bytes de RAM, 8 K de Flash y 512 Bytes de EEPROM. Éste modelo ya está un poco obsoleto y ha sido sustituido por el ATMEGA8515, que es totalmente compatible pero ofrece varias mejoras. Aunque este ejemplo servirá para ilustrar la creación de un Makefile:

MCU=at90s8515
CC=avr-gcc
OBJCOPY=avr-objcopy
CFLAGS=-g mmcu=$(MCU) -Wall -Wstrict-prototypes 
#—————————
all: prueba.hex
#—————————-
prueba.hex : prueba.out 
	$(OBJCOPY) -R .eeprom -O ihex prueba.out prueba.hex 
 
prueba.out : prueba.o williams_8515.o potencia.o
	$(CC) $(CFLAGS) -o prueba.out -Wl,-Map,prueba.map\
                       prueba.o williams_8515.o potencia.o
	avr-objdump -S prueba.out > prueba.des
 
prueba.o : prueba.c 
	$(CC) $(CFLAGS) -Os -c prueba.c
 
potencia.o : potencia.c 
	$(CC) $(CFLAGS) -Os -c potencia.c
 
williams_8515.o: williams_8515.c
	$(CC) $(CFLAGS) -Os -c williams_8515.c

Esto genera un fichero, prueba.hex con el contenido del código máquina para el microcontrolador. El código está en formato de INTEL HEXADECIMAL. También obtendrás otro archivo prueba.dsm en el que puedes ver el desensamblado del código generado.
Los ficheros fuente de los que se parte son prueba.c, potencia.c y williams_8515.c

Otras cosas interesantes

Algunas cosas interesantes que nos ofrecen las binutils son por ejemplo:

$ avr-objdump -h prueba.out

prueba.out fue generado por el Makefile y contiene información diversa sobre la compilación. En éste ejemplo, la salida mostrará el tamaño de las diferentes secciones del programa.

$ avr-size prueba.out

Hace lo mismo que el comando mostrado anteriormente, pero de forma mas resumida.

Por último, el comando mostrado en el Makefile:

$ avr-objdump -S prueba.out

Devuelve el desensamblado del código.

Enlaces interesantes