miércoles, 22 de septiembre de 2010

MSP-EXP430G2 Ejemplo en Ubuntu

En este capítulo se expondrá cómo emplear el compilador MSPGCC4 y la tarjeta de desarrollo MSP-EXP430G2 LaunchPad en Ubuntu mediante el Terminal.

Para poder hacerlo, previamente hemos tenido que instalar y configurar los programas necesarios tal y como se explica en la siguiente entrada: MSP-EXP430G2 en Ubuntu.

El programa que vamos a usar es el siguiente:

/*----------------------------------------------------------------------
AqueronteBlog@gmail.com

Este archivo es propiedad intelectual del blog Aqueronte,
cuya dirección web, es la siguiente:

http://unbarquero.blogspot.com/

Se permite cualquier modificación del archivo siempre y cuando
se mantenga la autoría del autor.

----------------------------------------------------------------------

Filename: Ejemplo1.c
Date: 21-Septiembre-10
File Version: vs0.0

Author: Manuel Caballero
Company: Hades

----------------------------------------------------------------------

Notes: Ejemplo de uso para la plataforma MSP-EX430G2,
donde los dos leds se enciende alternativamente
*/

#include <io.h>
#include <signal.h>

void retardo (volatile unsigned int); // Prototype function retardo

int main(void) {

WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL3 |= LFXT1S_2; // Set ACLK to use internal VLO (12 kHz clock)

P1DIR |= 0x41; // Set P1.0 & P1.6 to output direction

P1OUT &= 0x00; // Reset P1OUT
P1OUT |= 0x01; // P1.0 ON

while(1){

P1OUT ^= 0x01; // Toggle P1.0
P1OUT ^= 0x40; // Toggle P1.6
retardo (50000);
}
}

void retardo (volatile unsigned int i)
{
do (i--);
while (i != 0);
}

Como se puede apreciar, el código es bastante sencillito, simplemente vamos a hacer que los leds de la LaunchPad se enciendan simultáneamente. Yo os aconsejo que, en caso de seguir este mini tutorial, descarguéis el programa a vuestro ordenador:

Código Ejemplo para MSP430 LaunchPad
EjemploCarpeta con los dos archivos necesarios.

El archivo consta de una carpeta llamada Ejemplo con los siguientes elementos en su interior:

· main.c ≡ El programa que se ha mostrado anteriormente en código C.
· Makefile ≡ Archivo necesario para poder compilarse nuestro programa principal.

En este tutorial, se asumirá que el entorno de trabajo es desde el Escritorio, por lo tanto, abrimos el Terminal y nos posicionamos en la carpeta que hemos tenido que bajarnos y descomprimido en nuestro escritorio.

Para ello, emplearemos el comando cd, generalmente, tendremos que hacer algo tal como lo siguiente:
cd /home/xxx/Escritorio/Ejemplo

Donde xxx es el nombre de nuestro equipo.

Una vez que estamos posicionados dentro de la carpeta Ejemplo, compilamos con el siguiente comando:
make

El Terminal nos ofrecerá la siguiente información:
msp430-gcc -Os -Wall -g -mmcu=msp430x2012 -c main.c
msp430-gcc -Os -Wall -g -mmcu=msp430x2012 -o main.elf main.o

En términos generales, lo que nos quiere decir con dicha información es que se ha compilado nuestro archivo main.c teniendo en cuenta las etiquetas de preprocesado del microcontrolador MSP430x2012 y se han creado los archivos main.elf (el que programaremos en nuestra LaunchPad) y el main.o.

Lo que nos puede extrañar es que el microcontrolador seleccionado no sea el que tenemos en nuestra LaunchPad (En este tutorial se emplea en MSP430G2231), esto es así porque todavía, el compilador MSPGCC4 no presenta dicho micro, por ello se ha empleado MSP430x2012 que no es muy distinto al nuestro. Esperemos que en versiones próximas ya se soporte dicho micro y podremos poner la línea de preprocesado correcta.

Seguimos, ahora invocaremos al depurador con la siguiente instrucción:
mspdebug rf2500

En caso de que el Terminal nos responda con lo siguiente:
usbutil: unable to find a device matching 0451:f432
Significa que no tenemos nuestra placa LaunchPad conectada, por lo tanto, la enchufamos a nuestro ordenador y volvemos a llamar al depurador:
mspdebug rf2500
En caso de que el Terminal nos responda con un mensaje como el siguiente:
Trying to open interface 1 on 033 rf2500:
warning: can't detach kernel driver: Operation not permitted rf2500:
can't claim interface: Operation not permitted rf2500:
failed to open RF2500 device

Es que no tenemos los permisos adecuados para controlar nuestro dispositivo, esto se soluciona proporcionando dichos privilegios:
sudo mspdebug rf2500

Aunque yo recomiendo que configuremos nuestra sesión de usuario como Administrador:

· Sistema -> Administrador -> Usuarios y Grupos

Donde pone tipo de cuenta, cambiarla para que sea: Administrador.

Quizás se tenga que reiniciar el sistema, pero una vez realizado todo esto, ya podemos emplear nuestro depurador de manera normal.
mspdebug rf2500

Y el Terminal nos responderá con la siguiente información:
Trying to open interface 1 on 002
Initializing FET...
FET protocol version is 30066536
Configured for Spy-Bi-Wire
Sending initial reset...
Set Vcc: 3000 mV
Device ID: 0xf201
Device: MSP430F2013
Code memory starts at 0xf800
Number of breakpoints: 1

Available commands:
= dis hexout opt reset step
break erase isearch prog run sym
cgraph gdb md read set
delbreak help mw regs setbreak

Available options:
color gdb_loop quiet

Type "help " for more information.
Press Ctrl+D to quit.

(mspdebug)

En esta pantalla podemos sacar varias conclusiones y es bastante curiosa, pero profundizar en las funciones desde el Terminal con el depurador se sale de este capítulo.

Por lo tanto, vamos a lo que nos interesa: Programar nuestro código en el microcontrolador que está en la LaunchPad.

Escribimos el siguiente comando después de (mspdebug):
prog main.elf

Lo que hacemos es decir que programe nuestro código que nos generó el compilador. El Terminal nos responderá lo siguiente:
Erasing...
Programming...
Writing 124 bytes to f800...
Writing 32 bytes to ffe0...

Y en este momento, ya tenemos compilado nuestro código en el micro, para hacerlo funcionar introducimos el siguiente comando:
run

El Terminal nos responde:
Running. Press Ctrl+C to interrupt...

Y como ya podremos apreciar en nuestra LaunchPad que precisamente, se está ejecutando nuestro programa.

Hay que tener en cuenta, que en estos momentos el depurador está 'vigilando' lo que ejecuta nuestro micro en la placa, para interrumpirlo, presionamos las teclas:

· Ctrl+C

El Terminal nos responde:
  ( PC: 0f864)  ( R4: 0027a)  ( R8: 026ac)  (R12: 0c583)
( SP: 00280) ( R5: 0f1fb) ( R9: 0f8e6) (R13: 05ebf)
( SR: 00005) ( R6: 0def4) (R10: 0f83e) (R14: 0effd)
( R3: 00000) ( R7: 0dcbb) (R11: 037f7) (R15: 08c4a)
main+0x30:
0f864: 3f 53 ADD #0xffff, R15
0f866: fe 23 JNZ 0xf864
0f868: f6 3f JMP 0xf856
retardo:
0f86a: 21 83 DECD SP
0f86c: 81 4f 00 00 MOV R15, 0x0(SP)
0f870: b1 53 00 00 ADD #0xffff, 0x0(SP)
(mspdebug)

Desde aquí podemos observar los cambios que se están produciendo en nuestro microcontrolador, para interrumpir totalmente el contacto del depurador con nuestra placa, pulsamos las teclas:

· Ctrl+D

En estos momentos, en nuestra LaunchPad está grabado el programa anteriormente descrito y se ejecutará siempre que le demos tensión a nuestra placa de desarrollo.

Como se ha demostrado, ya es posible compilar, depurar y programar nuestra LaunchPad en Ubuntu.

Aunque quizás, por lo menos para mí, trabajar con mediante el Terminal me resulta fastidioso por diferentes motivos.

Es por ello que recomiendo integrar nuestro compilador, depurador y programador en un entorno de desarrollo cómo Eclipse, pero eso se tratará en otro capítulo.

2 comentarios:

Amid dijo...

Hola te felicito por la calidad de tus posts, está muy interesante la verdad esta herramienta, estoy arrancando con este launchpad, buscando independizarme de herramientas propietarias y poder programar y depurar todo en linux, tengo bastante experiencia en microcontroladores Freescale, ví que en otra entrada hiciste una reseña de los fabricantes de mi. Que opinión comparativa tenes entre los micros de freescale y los de texas instruments????

Manuel Caballero dijo...

Buenas Amid:

Cada empresa que se dedica a la fabricación de microcontroladores es un mundo, y ambas, tiene cosas buenas y menos buenas.

Respecto a Freescale, es un gigante y una apuesta segura, sobre todo con su relativa nueva familia Kinetis (basados en ARM) que lo podemos encontrar a un precio razonable.

Respecto a Texas Instruments, también es una apuesta segura, y sus micros de 16-bits, como la familia MSP430, tienen un comportamiento excelente para aplicaciones de bajo consumo.

No podría decir que uno es mejor que el otro, simplemente que atendiendo a tus necesidades y posibilidades de desarrollo, se deberá escoger aquella cuyo rendimiento respecto a precio/funcionalidad sea máximo.


Un saludo y muchas gracias por tú comentario.