Sistemas Embebidos FreeBSD
De BSD Chile
Autor: Ricardo Albarracin B. [ralbab arroba gmail.com]
Fecha: 24 de Abril del 2007
Plataforma: FreeBSD 6.2-RELEASE-p2
Este documento solo pretende entregar los pasos iniciales para que los usuarios de BSD, entusiastas y amantes de la electrónica digital, sepan como inciarse en este apasionante mundo del desarrollo de sistemas embebidos, a propósito de esto, he visto nombres mas curiosos tales como "empotrados", "enclautrados", pero el más idóneo en mi forma de ver es "embebidos", ya que vienen de la palabra "embedded" en inglés.
Espero que este documento le evite a más de algunos andar vagabuendeando por la red en busca de información decente y puedan ahorrar un montón de tiempo en su busca..... si yo lo perdí, ya no hay como recuperarlo. Como siempre quedo atento a sus comentarios y si hay usuarios que puedan colaborar con este documento, estare gustoso de recibir sus críticas y observaciones de su contenido.
En la medida de lo posible trataré de incluir otros documentos futuros que puedan ayudar aún más a este apasionate mundo del desarrollo de sistemas embebidos. Así mismo invito a los usuarios que quieran ayudar a ponerse en contacto y poder incluir más documentación en nuestra lengua.
Supondré que tenemos nuestro FreeBSD-6.2 ya instalado en nuestra máquina, con ambiente X perfectamente configurado y funcionando. No es importante si usa KDE, Gnome, XFce4 u otro sistema de ventanas o ambiente de escritorio, sólo basta que funcione. Pero bueno basta de palabrería y pongamonos manos a la obra.
Tabla de contenidos |
Veamos primero las áreas de desarrollo
Existen 3 áreas definidas en el desarrollo de sistemas embebidos, las que podremos indicar como la plataforma que se usará es decir el hardware, la inteligencia que usaremos en ese hw, es decir el software embebido y como realizaremos la carga del código sobre ese hw, es decir la programación de Microcontrolador, las que indicaremos a continuación:
Desarrollo de Hardware
Se refiere al desarrollo que soportara al µC-AVR que en este ejemplo es el ATmega8, lo cual requiere sin duda de conocimientos de electrónica digital. Sin perjuicio de lo anterior hay muchos lugares y tiendas que proveen de kits de desarrollo con todo lo necesario. Los µC-AVR permiten usar muy pocos elementos (componentes pasivos), para tener un sistema funcionando perfectamente basado en un µC-AVR.
Desarrollo del Software
Aquí hay muchos más entusiastas, hay personas que sin saber mucho de electrónica pueden programar Microcontroladores en aplicaciones a veces no tan sencillas, muchas veces sin saber demasiado de arquitectura de computadores, solo empíricamente, pero el saber electrónica en más bien fundamental si queremos sacarle el jugo a nuestros desarrollos.
Programación del uC
Muchas veces nos hemos preguntado como programar un Microcontrolador... no es tan difícil, después que se sabe como cierto?... A lo largo de este documento indicaremos como hacerlo.
Para empezar, que ports debemos instalar ?
Bueno antes de ponernos a instalar software sobre nuestro sistema, debemos saber cuales son nuestras fortalezas y debilidades, ya que los ports nos proveen de todas las herramientas de desarrollo necesarias para las 3 áreas indicadas, de acuerdo a esto, indicaremos las instalación para ellas.
Desarrollo de hardware
Hay varios ports que son posibles de usar y con alcances definidos, que nos permiten realizar desde los esquemáticos hasta el circuito impreso, es decir todo lo necesario, por ejemplo se encuentran unas excelentes herramientas de desarrollo de uso libre como [gEDA http://www.geda.seul.org/], [Kicad http://www.lis.inpg.fr/realise_au_lis/kicad/], [PCB http://pcb.sourceforge.net/obtaining.html], todas en un constante desarrollo y con una activa y fuerte comunidad, las que no he usado pero se que funcionan bién.
Personalmente uso por años una excelente herramienta integrada que tiene esquemático, ruteo automático y pcb, todo en una misma aplicación ella es Eagle V4.16 http://www.cadsoft.de/, además dispone de extensas bibliotecas de componentes que son de acceso libre, aportadas por los mismos usuarios, para instalarla nos vamos a su port /usr/ports/cad/linux-eagle, tiene una versión comercial y una freeware, esta nos permite hacer placas de hasta 8x10cm, lo que es más que suficiente para muchas aplicaciones del mundo real.
Para instalar ejecutamos el comando siguiente como root:
# cd /usr/ports/cad/linux-eagle && make install clean
Desarrollo de Software
Para los µC-AVR que es una extensa y poderosa familia de Microcontroladores RISC, uso "casi" exclusivamente el lenguaje C, por su portabilidad, su excelente compilador disponible y porque además me permite mezclar Assembler y 'C'. Para disponer de la gamma de herramientas de desarrollo de software instalaremos los siguientes paquetes:
Para instalar, siempre como root:
# cd /usr/ports/devel/avr-binutils && make install clean # cd /usr/ports/devel/avr-gcc && make install clean # cd /usr/ports/devel/avr-libc && make install clean # cd /usr/ports/devel/avra && make install clean
Si existiese algún problema con los ports o dependencias (cosa muy poco frecuente), siempre esta la alternativa de poder instalarlo como package...
# pkg_add -r package_name
Con lo anterior tendremos instalados en nuestra máquina los siguientes paquetes de software:
avr-binutils-2.17_2
avr-gcc-4.1.1_1
avr-libc-1.4.5_1
avra-1.0.1_1
Las versiones de estos paquetes corresponden a las oficiales de los ports al momento de realizar este documento y son de la versión FreeBSD-6.2. Si existen versiones superiores, no deberia haber problemas.
Programacion del µC-AVR
Tal vez esta es la parte más oscura para muchos, ya que hay una amplia variedad de programadores y de los cuales gran número de ellos están desarrollados por un Sistema casi Operativo que no voy a nombrar por respecto a los lectores.
Personalmente he probado varios de ellos, entre los cuales los que proporciona la misma Atmel, como el STK500 y el AVRISP, ambos los he usado bajo Linux y BSD, operan bastante bien, pero sin perjuicio de ello también he probado el http://www.captain.at/electronics/atmel-programmer/ que es de una fácil construcción para los aficionados, el cual opera sobre el puerto paralelo /dev/ppi0 este funciona bastante bien para ser un programador de muy bajo costo.
Bueno ahora procederemos a instalar el software que nos permitira grabar nuestro código binario sobre el Microcontrolador, supondré que tenemos un grabador http://www.captain.at/electronics/atmel-programmer/, debido a su bajo costo de construcción y esta al alcance de todos. Sin perjuicio de eso, igual podremos usar otro tipo de programadores con mejores características, este software maneja muchos tipos.
# cd /usr/ports/devel/avrdude && make install clean
Esto instalará avrdude-5.2
Bueno con lo anterior, ya tenemos instalado en nuestra máquina BSD, todo lo necesario para poner a nuestras neuronas a trabajar y desarrollar nuestra imaginación, con esto podemos hacer robótica, domótica, mecatrónica y muchos otros proyectos muy interesantes.
Nuestro primer programa
Una de las cosas bellas de la vida es divertirse desarrollando (no sólo leer/escribir un libro, tener un hijo y plantar un árbol), sobretodo para los que trabajamos en desarrollo, es que funcionen... si, simplemente que "funcionen", al menos en una primera etapa en donde solo pretendemos eso, después vendrán las optimizaciones del código o los algoritmos que usemos, pero por ahora nuestra misión en más simple, programar algo simple, compilarlo y grabarlo en la memoria flash del AVR.
Para lograr esto nos basaremos en una PCB que tiene el http://www.atmel.com/dyn/products/datasheets.asp?family_id=607, un pequeño gran gigante de los µC-AVR el ATmega8, he desarrollado bastante sobre él y su comportamiento ha sido excepcional, es un computadorcito que le tengo gran aprecio.
No propondré ninguna PCB en especial al menos por ahora, sólo mencionar que hay una amplia variedad de PCB desarrolladas con este Microcontrolador, lo único realmente importante que es la palca que usemos, tenga un puerto ISP para ser programado.
Código de ejemplo
El código siguiente es un ejemplo muy simple que enciende y apaga un led con un pequeño delay de 250mS, la idea es mostrar algo muy simple pero que funcione, si aprendemos bien este procedimiento completo, nos servirá como base para realizar posteriormente muchas aplicaciones con Microcontroladores.
Como se puede apreciar en este código se ha definido como salida PC2 (pin 25 en formato dip) del Microcontrolador ATmega8, este pin tiene conectado el negativo de un led y el positivo de este a una resistencia en serie entre los 390 ohms a 470 ohms, la conectamos a +5Vdc, suponiendo que lo alimentamos con esa tensión. Si disponemos de una resistencia distinta, esta no debe ser menor que 390 ohms y no mayor que 1,2k ohms.
#include <avr/io.h>
#include <util/delay.h>
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED_PIN2 2
#define led_on() LED_PORT &=~(1<<LED_PIN2)
#define led_off() LED_PORT |= (1<<LED_PIN2)
void main( void ) {
LED_DDR |= (1<<LED_PIN2);
while(1) {
led_on();
_delay_ms(250);
led_off();
_delay_ms(250);
}
}
Compilando el programa
Para compilar usaremos el comando siguiente:
avr-gcc -c -mmcu=atmega8 -I. -g -DF_CPU=16000000UL \ -Os -funsigned-char -funsigned-bitfields -fpack-struct \ -fshort-enums -Wall -Wstrict-prototypes \ -Wa,-adhlns=main.lst -std=gnu99 -MD -MP \ -MF .dep/main.o.d main.c -o main.o
Donde el codigo fuente anterior se llama main.c, el procesador tiene un clock de 16MHz, usamos el ATmega8 y lo compilamos con el avr-gcc. Los archivos que se generan después de esta compilación son:
main.elf
main.hex
main.lss
main.lst
main.map
main.o
main.sym
Claramente este comando de compilación no debemos aprenderlo de memoria, lo usual es usar un mecanismo de programación Unix como lo es el Makefile para poder incluir todas las opciones de compilacion en el archivo make, lo cual se encuentra fuera del alcance de este documento.
Ahora ya tenemos nuestro código binario listo para ser grabado en el Microcontrolador.
Como grabamos y que grabamos en la Memoria Flash del Microcontrolador
Bueno como no puedo pretender que todos sepan, me tomare la libertad de explicar algunas cosas básicas, primero que es la flash?, es la memoria en donde se almacenará el programa que hemos compilado en código binario, es decir se define como la memoria de programa, la cual sólo podemos escribir mediante un programador y es distinta a la memoria de datos (1024 Byte de RAM para este ATmega8).
Para grabar usaremos el programador DAPA, el cual ya lo hemos indicado, pero que archivo de los generados "escribiremos en la flash?", el formato más usado habitualmente es el HEX y es el que se genera en la compilación realizada, ahora para programar usaremos el siguiente comando:
# sudo avrdude -c dapa -p m8 -e -U flash:w:main.hex
Como podemos apreciar, nada del otro mundo.... los comandos se ejecutan desde un terminal en forma simple.
Como una breve explicación del comando diremos que la opción -c le indicamos al avrdude que el programador usado es el dapa, la opción -p m8, le indicamos que usaremos un microcontrolador ATmega8, con -e le indicamos que borre la flash antes de grabar el nuevo código y por último en la opción -U flash:w:main.hex, le indicamos que escriba el código main.hex en la memoria flash.
Comentarios finales
Espero haber logrado que ustedes puedan programar un Microcontrolador AVR, que les haya gustado y que este documento les sea de utilidad y que les ahorre tiempo a muchos, ya que a mi no me sobra y creo que a ustedes tampoco.
Espero haber contribuido a que más personas se atreban a realizar desarrollos de electrónica y además usen este estupendo sistema operativo , confiable, robusto, seguro, escalable.... realmente una roca.
Para aquellas personas que deseen contribuir, colaborar con sus comentarios o críticas a este documento, estaré encantado de poder contar con su ayuda, así mismo si desean desarrollar en conjunto otros temas afines, bueno estoy disponible en mi correo electrónico.
Un saludo a todos y en especial a los que se atreven a probar nuevas tecnologías.
Para cualquier duda, comentario o sugeréncia, contactarse con el autor.
