Programación de microcontroladores AVR en GNU/Linux
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.