Mostrando entradas con la etiqueta CCS. Mostrar todas las entradas
Mostrando entradas con la etiqueta CCS. Mostrar todas las entradas

martes, 3 de enero de 2017

MSP432: Pulsadores + LED + RGB

Hacia tiempo que quería escribir y añadir al blog un capítulo ( y temática ) como esta, la de los microcontroladores de 32-bits, y que mejor forma que empezar con la familia MSP432 de Texas Instruments, quizás no sea el mejor microcontrolador de su categoría ( ARM Córtex M4 ) pero es la novedad de la empresa tejana. Pero a día de hoy, Texas Instruments parece ser que no está dando mucho soporte a esta familia, al parecer se está volcando en sus microcontroladores de 16-bits de memoria FRAM ( que por otro lado, son magníficos, todo hay que decirlo ).

Pero bueno, desde este blog Aqueronte, intentaremos exprimir y explicar como funcionan los periféricos internos de este microcontrolador y desarrollar drivers para dispositivos externos.

Así que lo primero que toca es presentar nuestro sistema de referencia de trabajo, en este caso, vamos a usar la placa de desarrollo MSP-EXP432P401R ( en nuestro caso, la versión negra, aunque la nueva de color rojo es la misma pero con los componentes mejor posicionados ), y el programa referente a este capítulo es sencillo, el hola mundo de la electrónica condimentado de algunos ingredientes extras.

El desarrollo será simple, tenemos dos pulsadores en la placa de desarrollo launchpad ( S1 y S2 etiquetados en la placa de desarrollo ), y un par de LED ( uno de ellos es un LED normal de color rojo, y el otro es un LED RGB ). Los pulsadores estarán asociados a cada LED, pulsador S1 estará asociado al LED rojo y el pulsador S2 estará asociado al LED RGB,

En el caso de que se pulse el botón S1, se cambiará el estado del LED rojo, y en caso de pulsar el botón S2, se iluminará o el rojo, o verde o el azul del LED RGB. Parece sencillo, y para qué vamos a decir lo contrario, lo es, pero cada vez que en nuestros proyectos aparecen botones, si el hardware no está bien diseñado, lamentablemente aparecerán molestos pulsos de rebote generados por el pulsador, los cuales pueden arruinar el propósito de nuestro proyecto.

Expuesto la finalidad de éste capítulo, este proyecto aparentemente simple ( y repito, ¡lo es! ) nos va a permitir aprender como jugar con diferentes periféricos internos de este microcontrolador, para los LEDs, configuraremos los pines de salida digital, para cada pulsador, entradas digital con interrupción externa, y para evitar, en la medida de lo posible, el efecto no deseado de rebote de los pulsadores, configuraremos un Timer para que genere un retardo y de esta manera evitar los rebotes de los pulsadores.

El firmware es el que se muestra a continuación:

/**
* @file       main.c
* @author     Manuel Caballero
* @date       10/9/2016
* @brief      Archivo principal.
* \copyright
*       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 autoria del autor.
*/


#include "msp.h"
#include "variables.h"
#include "functions.h"
#include "interrupts.h"


/**
 *  \brief     void main( void )
 *  \details   We are going to play with: MSP432P401R LaunchPad.
 *
 *          This firmware will change the state of the LED1 and LED2 ( RGB LED ) by using
 *          the switches SW1 ( LED1 ) and SW2 ( RGB LED2 ).
 *
 *        Every time that one of the switches is pressed, we will notice the case of bouncing,
 *        that is why we are going to use the TimerA0 to generate a short delay trying to
 *             get rid of this phenomenon.
 *
 *          The rest of the time, the uC will be in LPM0 low power.
 *
 *
 *  \author    Manuel Caballero
 *  \version   0.0
 *  \date      10/9/2016
 *  \pre       Code Composer Studio, Version: 6.1.3.00034.
 *  \pre       C Compiler, MSP432 TI v16.6.0.STS.
 */

void main(void)
{
    conf_CLK ();
    conf_WDT ();
    conf_IO  ();
    conf_TA ();

 
    __enable_irq();

    // Do not wake up on exit from ISR
    SCB->SCR |=  SCB_SCR_SLEEPONEXIT_Msk;

    while (1){
      __sleep ();
    }
}

Como vemos, el ejemplo es bastante simple, se recomienda bajar los archivos disponibles más abajo para indagar entre sus librerías y leer sus funciones de manera más detallada. Entre otras cosas, el firmware hace todo el trabajo en los servicios de interrupción, ya sea del cada pulsador o del Timer para evitar los rebotes no deseados, dicho retraso generado por el Timer, estará asociado al reloj auxiliar, en concreto al VLOCLK cuya frecuencia típica es de 9.4 kHz.

Un vídeo que demuestra lo explicado anteriormente se presenta a continuación:



Os pongo a vuestra disposición el programa en lenguaje C (TI y IAR) para que lo podáis descargar y probar:

MSP432: MSP432P401R + PULSADOR + TIMER + RGB + LEDs
Compilador TICompilador IAR
CC
MSP432: LEDs + TIMER + BOTÓN 
MSP432: LEDs + TIMER + BOTÓN
MSP432: LEDs + TIMER + BOTÓN
MSP432: LEDs + TIMER + BOTÓN


Podéis encontrar el código completo en nuestro repositorio GitHub:

·AqueronteBlog GitHub.


Como conclusión, si estamos acostumbrados a trabajar con otras familias como la MSP430 de Texas Instruments, los periféricos de este microcontrolador de 32-bits nos serán familiares, pero con ligeras diferencias a la hora de configurarlos, y no es de extrañar ya que su núcleo es un ARM, y la documentación está repartida entre el manual de referencia de la familia del MSP432 y el propio datasheet del dispositivo, algo que no está bien pulido todavía y que puede resultar un poco lioso al principio.

lunes, 25 de mayo de 2015

MSP430: DMA + LM35 + MSP430FR5739

Este capítulo volveremos a usar la placa de desarrollo MSP430-EXP430FR5739 de la empresa Texas Instruments. Dicha placa de desarrollo contiene el microcontrolador MSP430FR5739 cuya novedad es la memoria interna, ya que es del tipo FRAM.

La memoria o tecnología FRAM presenta ciertas ventajas a la inmunidad al ruido y a la escritura en memoria. Pero no debemos asustarnos, los periféricos se trabajan de forma similar a cualquier microcontrolador de la familia MSP430.

El hecho de usar esta placa de desarrollo es que el microcontrolador presente: MSP430FR5739, contiene el módulo DMA ( Direct Memory Address ) y de ese periférico concreto, va a tratar este capítulo.

Para aquellos que todavía no hayáis empleado el módulo DMA en vuestros proyectos, deciros que una vez que lo sepáis controlar, será un aliado que siempre usaréis, y esto es así ya que reduce el código de programa considerablemente y lo mejor de todo, nuestro microcontrolador, su CPU, estará en modo bajo consumo mientras el módulo DMA trabaja a sus anchas, maximizándose de esta forma el ahorro de energía.

Quizás me haya emocionado un poquito cuando he dicho eso de que será un aliado que siempre usaréis, lo admito, pero vamos con un ejemplo teórico que mostrará que mi afirmación no va muy mal encaminada.

[ Ejemplo ] Imaginemos que tenemos un vector con cinco datos de temperatura procedentes de un sensor externo y que queremos transmitirlos por la UART, bien, la forma ( vamos a llamarla tradicional ) de proceder sería algo como cargar el primer dato a transmitir en el registro de la UART y esperar a que el flag asociado al registro nos avise de que ya ha finalizado la transmisión del dato, posteriormente se cargaría el segundo dato en el registro y el procedimiento sería el mismo hasta haber enviado todos los datos del vector por la UART.

Dicho procedimiento de transmitir el vector de datos de temperaturas por la UART se podría gestionar mediante interrupciones para adecuar el siguiente dato a transmitir. En dicha interrupción, la CPU del microcontrolador saldrá de su estado de bajo consumo.

Pero, ¿qué pasaría si usamos el módulo DMA? Bien, el DMA se compone de canales que podremos usarlos para conectar porciones de memoria ( incluso registros del propio microcontrolador ), así que respondiendo a la pregunta, deberíamos configurar un canal y asociar su dirección de fuente a nuestro vector con los datos de temperatura y, asociar el destino al registro de transmisión de datos de la UART.

El siguiente paso será decirle al módulo DMA cuantos datos va a manejar, en nuestro caso, cinco datos que corresponden al número de datos de temperatura que tenemos almacenado en un vector. Y ahora, solo nos queda asociar como el módulo DMA gestionará dichos datos.

En este ejemplo teórico, el objetivo es transmitir por la UART cierto número de datos alojados en un vector, por lo tanto, la manera de proceder del DMA será saber cuando un dato ya haya sido transmitido, así que asociaremos el evento de la UART ( flag  UCxTXIFG ) de paquete transmitido al módulo DMA.

De esta forma, cuando se haya transmitido un paquete por la UART, el flag UCxTXIFG se activará y el módulo DMA pondrá otro paquete para que sea transmitido, así hasta los cinco elementos que hemos configurado, y todo esto, con el microcontrolador en bajo consumo.

Para terminar este ejemplo teórico, decir que por supuesto, se puede activar el servicio de interrupción de cualquier canal del módulo DMA para que nos indique cuando se haya transmitido todos los paquetes.


Y bien, hasta aquí el ejemplo teórico ( espero haber podido transmitir la idea de lo práctico que resulta el módulo DMA ), ahora vamos con el ejemplo práctico de éste capítulo, el programa que vamos a presentar consistirá en realizar tres lecturas consecutivas del sensor externo de temperatura LM35, almacenar dichos valores en un vector y cuando se obtengan dichas lecturas, transmitirlas por el puerto serie usando la UART para que una interfaz gráfica pueda realizar la media de dichos valores y exponer su valor por pantalla, todo ello mediante el módulo DMA.

La forma de proceder será la siguiente, primero emplearemos el Timer A0  para que realice una interrupción cada tres segundos, donde se activará el conversor analógico-digital para realizar las tres lecturas consecutivas del sensor externo de temperatura LM35.

Pero previamente a que el Timer A0 entre en acción, habremos configurado dos canales del módulo DMA para gestionar todo el proceso, el primer canal ( canal 0 ), se le asociará al módulo ADC10 ( fuente ), de tal manera que cada vez que haya un dato en el registro ADC10MEM0, el DMA realizará una lectura y almacenará su contenido en un vector ( destino ), así hasta realizar las tres lecturas consecutivas.

Una vez tengamos las tres lecturas almacenadas en el vector, se producirá una interrupción del módulo DMA ( canal 0 ) donde procederemos a activar el segundo canal del DMA ( canal 1 ). Dicho canal 1, estará asociado al vector de datos de temperaturas ( fuente ) con el registro de transmisión del módulo UART ( destino ), de tal manera que el canal 1 del DMA, gestionará la transmisión de datos a través de la UART.

Una vez transmitido todos los datos, se producirá una interrupción del módulo DMA en el canal 1, donde se volverá a activar el Timer A0 para volver a empezar el proceso.


Y para hacerlo más vistoso, dicha comunicación serie será a través de un par de módulos XBee de forma inalámbrica.



El material que vamos a necesitar y su función, es la que se muestra a continuación:

· MSP430 Launchpad FRAM: Evidentemente, nuestra placa de desarrollo con el microcontrolador MSP430FR5739.

· Módulos XBee: Un par de ellos, en este caso, el módulo XBee es el modelo: XB24-ZB.

· LM35: Dispositivo de temperatura analógico.

· Interfaz Gráfica: Software que se ejecuta en un ordenador con independencia del sistema operativo, solo es necesario tener instalada la máquina virtual de JAVA con al menos, la versión 7 Update 45 o superior. Dicha interfaz gráfica se puede descargar más adelante junto al Firmware..


El código del programa principal, es el siguiente:

/**
* @file       main.c
* @author     Manuel Caballero
* @date       11/5/2015
* @brief      Archivo principal.
* \copyright
*      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 autoria del autor.
*/

#include < msp430.h >
#include < stdint.h >
#include "variables.h"
#include "funciones.h"
#include "interrupciones.h"



/**
 *  \brief     void main( void )
 *  \details   Vamos a trabajar con la placa de desarrollo MSP-EXP430FR5739.
 *
 *             Este programa consiste en realizar tres lecturas consecutivas de datos del sensor externo
 *             de temperatura LM35 cada, aproximadamente 3 segundos, para posteriormente, mandarlas
 *             por la UART.
 *
 *             Pero en este caso, tanto la lectura de los tres valores del ADC10_B como la transferencia
 *             de datos, se realizará por el módulo DMA.
 *
 *             Se asignará dos canales DMA:
 *
 *                · Canal 0: Lectura del resultado del módulo ADC10_B.
 *                · Canal 1: Tranmitir dichos datos por la UART.
 *
 *
 *             Se envían al ordenador por medio de un par de dispositivos XBee usando la UART.
 *
 *             El resto del tiempo, el MCU permanecerá en estado bajo consumo LPM3.
 *
 *
 *  \author    Manuel Caballero
 *  \version   0.0
 *  \date      11/5/2015
 *  \pre       Se utilizarán un par de módulos XBee XB24-ZB ( uno Coordinator y el otro End Device )
 *             a 115200 Baudios.
 *  \pre       El software de ordenador utilizado es el llamado UART1_SW, proporcionado con todos los
 *             archivos necesarios del éste proyecto.
 *  \pre       Code Composer Studio, Version: 6.0.1.00104.
 *  \pre       C Compiler, MSP430 GCC GNU v4.9.1 ( Red Hat ).
 */
void main( void )
{
   conf_WDT    ();           // Configura WDT del sistema
   conf_CLK    ();           // Configura CLK del sistema
   conf_IO     ();           // Configura Entradas/Salidas
   conf_ADC10  ();           // Configura ADC10
   conf_UART   ();           // Configura UART
   conf_TA0    ();           // Configura Timer A0
   conf_DMA    ();           // Configura DMA

   __enable_interrupt();     // Interrupciones ON.


   while(1)
   {
      LPM3;
      // __nop();            // Solo para DEBUG
   }
}

Como vemos, el ejemplo es bastante simple, se recomienda bajar los archivos disponibles más abajo para indagar entre sus librerías y leer sus funciones de manera más detallada.

Un vídeo que demuestra lo explicado anteriormente se presenta a continuación:



Os pongo a vuestra disposición el programa en lenguaje C (IAR y MSPGCC) para que lo podáis descargar y probar:

MSP430FR5739: LM35 + ADC10 + UART + DMA
Compilador IARCompilador MSPGCC
CC
MSP430FR5739: LM35 + DMA
MSP430FR5739: LM35 + DMA
MSP430FR5739: LM35 + DMA
MSP430FR5739: LM35 + DMA


Podéis encontrar el código completo en nuestro repositorio GitHub:

·AqueronteBlog GitHub.


· NOTA 1: En caso de ejecutar el software UART.jar y no inicializarse, es debido a que las librerías no están instaladas debidamente. El software utiliza librerías externas como por ejemplo, para el manejo del puerto serie, dicha librería debe instalarse a mano. En el siguiente enlace hay una breve guía de como hacerlo: Instalar librerías RXTX.

jueves, 7 de mayo de 2015

MSP430: ADXL335 + MSP430FR5739

Este capítulo usaremos la placa de desarrollo MSP430-EXP430FR5739 de la empresa Texas Instruments. Dicha placa de desarrollo contiene el microcontrolador MSP430FR5739 cuya novedad es la memoria interna, ya que es del tipo FRAM.

La memoria o tecnología FRAM presenta ciertas ventajas a la inmunidad al ruido y a la escritura en memoria. Pero no debemos asustarnos, los periféricos se trabajan de forma similar a cualquier microcontrolador de la familia MSP430.

El hecho de emplear esta placa, es que trae incorporado ciertos sensores que pueden ser útiles en nuestros proyectos personales, en este caso, el ejemplo que traemos consistirá obtener lecturas del dispositivo externo ADXL335 ( acelerómetro de tres ejes ) y la enviaremos por la UART para que pueda ser representado los tres ejes en una interfaz gráfica.

Y para hacerlo más vistoso, dicha comunicación serie será a través de un par de módulos XBee de forma inalámbrica.


Pero antes pasar al firmware, vamos a explicar brevemente, como manipular los datos leídos procedentes del dispositivo externo ADXL335. Y creo que merece la pena pararse en este punto ya que el acelerómetro ADXL335, nos entrega las aceleraciones siguientes: Eje X, Eje Y y Eje Z, en valor analógico.

Teniendo en cuenta la hoja de características del dispositivo ADXL335, en el apartado de especificaciones, tenemos los siguientes datos de interés:

· Sensibilidad ( Sensitivity ): Este es un dato muy importante ya que nos indica la sensibilidad del sensor y, está relacionada con el valor de alimentación del dispositivo. En la hoja de características del dispositivo ADXL335, nos encontramos la siguiente tabla:

SENSITIVITY
Parameter
Conditions
Min
Typ
Max
Unit
Sensitivity at XOUT, YOUT, ZOUT
( Each Axis ) VS = 3 V
270
300
330
mV/g


Donde podemos interpretar que para los tres ejes, la sensibilidad cuando el sensor está alimentado a 3 V, es de 300 mV/g ( valor nominal ).


· NOTA: ¡Ojo!, el valor está dado en mV.



· Valor 0 g: Cuando medimos aceleraciones, es normal representarlas en la unidad g, y por supuesto, es imprescindible saber, cuando no hay aceleración ( 0 g ). Fijándonos en la hoja de características del dispositivo, nos encontramos con la siguiente tabla:

ZERO g BIAS LEVEL
Parameter
Conditions
Min
Typ
Max
Unit
0 g Voltage at XOUT, YOUT
VS = 3 V
1.35
1.5
1.65
V
g Voltage at ZOUT
VS = 3 V
1.2
1.5
1.8
V


Es fácil reconocer que no tendremos aceleraciones cuando el valor de salida analógico del dispositivo ADXL335 sea la mitad del valor de su alimentación. En el ejemplo que encontramos en la hoja de característica, nos dice que el valor de alimentación es de 3 V, por lo tanto, no tendremos aceleración cuando:

· 0 g ≡  VS/2 = 3/2 = 1.5 V


Y bueno, existen más datos, pero con estos, ya tenemos los suficientes para realizar lecturas de aceleración procedentes del dispositivo ADXL335. Ahora la siguiente cuestión a resolver, sería la siguiente:

· Cuando realizo una lectura del dispositivo ADXL335, dicha lectura están en Voltios, ¿cómo las represento en las unidades de aceleración g?


Bien, la expresión matemática que deberemos usar es la siguiente:


· [ ValorLeídoADC - VADXL335/2 ]/Sensivity


Donde:

· ValorLeídoADCEs el valor obtenido de cada eje por nuestro microcontrolador
· VADXL335/2Es el valor 0 g
· SensivityParámetro de sensibilidad del dispositivo ADXL335


Muy bien, ¿pero como se usa esa expresión? Pongamos un par de ejemplos prácticos, supongamos que nuestro microcontrolador posee un módulo ADC de 10-bits y su expresión es la siguiente:


· N = 1023·[ ( Vin - VR- )/( VR+ - VR- ) ]


Donde:

· NValor digital obtenido por el módulo ADC de nuestro microcontrolador.
· VinValor analógico correspondiente al valor digital leído.
· VR-Valor de referencia R-
· VR+Valor de referencia R+


Por lo tanto, el valor que nos interesa es Vin, despejamos para obtenerlo:

· Vin = VR- + N·( VR+ - VR- )/1023


Ahora si, vamos con el primer ejemplo: [ Ejemplo 1 ] Supongamos que realizamos una lectura del Eje X del dispositivo ADXL335 con nuestro microcontrolador mediante el módulo ADC 10-bits, obteniendo un resultado de 511.

Teniendo en cuenta que el acelerómetro está alimentado a 3 V, y el valor de referencia positivo es de 3 V y el negativo es de 0 V, obtener la aceleración del Eje X en unidad g.


Realizamos una recopilación de datos:

· N=511.
· VADXL335=3 V.
· VR-=0 V
· VR+=3 V

Lo primero que debemos obtener, es el valor leído en Voltios:

· Vin = VR- + N·( VR+ - VR- )/1023 = 0 + 511·( 3 - 0 )/1023 ≈ 1.498534 ≈ 1.5 V

El otro dato que necesitamos en la sensibilidad que debemos aplicar, como ya se ha explicado, dicho parámetro depende del valor de alimentación del acelerómetro ADXL335, en este ejemplo, está alimentado a 3 V, por lo tanto, el valor de sensibilidad será de 300 mV ( valor nominal ).

Así que ya disponemos de todos los valores necesarios para obtener el valor de aceleración del Eje X, sustituimos valores en la expresión:


· Aceleración Eje X: [ ValorLeídoADC - VADXL335/2 ]/Sensivity = [ 1.5 - 3/2 ]/( 300·10-3 ) = 0 g.


Por lo tanto, la aceleración del Eje X leído es de 0 g.



Ejemplo 2 ] Supongamos que realizamos una lectura del Eje Z del dispositivo ADXL335 con nuestro microcontrolador mediante el módulo ADC 10-bits, obteniendo un resultado de 735.

Teniendo en cuenta que el acelerómetro está alimentado a 3.6 V, y el valor de referencia positivo es de 3 V y el negativo es de 0 V, obtener la aceleración del Eje Z en unidad g.


Realizamos una recopilación de datos:

· N=735.
· VADXL335=3.6 V.
· VR-=0 V
· VR+=3 V

Lo primero que debemos obtener, es el valor leído en Voltios:

· Vin = VR- + N·( VR+ - VR- )/1023 = 0 + 735·( 3 - 0 )/1023 ≈ 2.155425 ≈ 2.16 V

El otro dato que necesitamos en la sensibilidad que debemos aplicar, como ya se ha explicado, dicho parámetro depende del valor de alimentación del acelerómetro ADXL335, en este ejemplo, está alimentado a 3.6 V, por lo tanto, el valor de sensibilidad será de 360 mV ( valor nominal ).

Así que ya disponemos de todos los valores necesarios para obtener el valor de aceleración del Eje Z, sustituimos valores en la expresión:


· Aceleración Eje Z: [ ValorLeídoADC - VADXL335/2 ]/Sensivity = [ 2.16 - 3.6/2 ]/( 360·10-3 ) ≈ 1 g.


Por lo tanto, la aceleración del Eje Z leído es de g.



Y bien, hasta aquí la parte teórica, vamos con la parte práctica. Nuestro firmware consistirá en que un microcontrolador con un módulo ADC 10-bits obtenga lecturas de los tres ejes procedentes del acelerómetro ADXL335 y los mande por la UART para que pueda ser representado por pantalla de forma gráfica.


El material que vamos a necesitar y su función, es la que se muestra a continuación:

· MSP430 Launchpad FRAM: Evidentemente, nuestra placa de desarrollo con el microcontrolador MSP430FR5739 y el dispositivo externo ADXL335.

· Módulos XBee: Un par de ellos, en este caso, el módulo XBee es el modelo: XB24-ZB.

· Interfaz Gráfica: Software que se ejecuta en un ordenador con independencia del sistema operativo, solo es necesario tener instalada la máquina virtual de JAVA con al menos, la versión 7 Update 45 o superior. Dicha interfaz gráfica se puede descargar más adelante junto al Firmware..


El código del programa principal, es el siguiente:

/**
* @file       main.c
* @author     Manuel Caballero
* @date       27/4/2015
* @brief      Archivo principal.
* \copyright
*      AqueronteBlog@gmail.com
*
* Este archivo es propiedad intelectual del blog Aqueronte,
* cuya direccion web, es la siguiente:
*
*     http://unbarquero.blogspot.com/
*
* Se permite cualquier modificacion del archivo siempre y cuando
* se mantenga la autoria del autor.
*/

#include < msp430.h >
#include < stdint.h >
#include "variables.h"
#include "funciones.h"
#include "interrupciones.h"



/**
 *  \brief    void main( void )
 *  \details  Vamos a trabajar con la placa de desarrollo MSP-EXP430FR5739 y los
 *            periféricos disponibles externos e internos.
 *
 *            Este programa consiste en realizar una lectura de datos del sensor externo
 *            ADXL335 ( acelerómetro de 3 ejes ), aproximadamente 0.1 segundos ( 10 Hz ).
 *
 *            Una vez obtenidos los datos, se envían al ordenador por medio de un par de
 *            dispositivos XBee usando la UART. El resto del tiempo, el MCU permanecerá
 *            en estado bajo consumo LPM3.
 *
 *
 *
 *  \author    Manuel Caballero
 *  \version   0.0
 *  \date      27/4/2015
 *  \pre       Se utilizarán un par de módulos XBee XB24-ZB ( uno Coordinator y el otro End Device )
 *             a 115200 Baudios.
 *  \pre       El software de ordenador utilizado es el llamado UART1_SW, proporcionado con todos los
 *             archivos necesarios del éste proyecto.
 *  \pre       Code Composer Studio, Version: 6.0.1.00104.
 *  \pre       C Compiler, MSP430 GCC GNU v4.9.1.
 */
void main( void )
{
   conf_WDT    ();           // Configura WDT del sistema
   conf_CLK    ();           // Configura CLK del sistema
   conf_IO     ();           // Configura Entradas/Salidas
   conf_ADC10  ();           // Configura ADC10
   conf_UART   ();           // Configura UART
   conf_TA0    ();           // Configura Timer A0


   __enable_interrupt();     // Interrupciones ON.


   while(1)
   {
      LPM3;
      // __nop();            // Solo para DEBUG
   }
}

Como vemos, el ejemplo es bastante simple, se recomienda bajar los archivos disponibles más abajo para indagar entre sus librerías y leer sus funciones de manera más detallada.

Un vídeo que demuestra lo explicado anteriormente se presenta a continuación:



Os pongo a vuestra disposición el programa en lenguaje C (IAR y MSPGCC) para que lo podáis descargar y probar:

MSP430FR5739: ADXL335+ LEDs
Compilador IARCompilador MSPGCC
CC
MSP430FR5739: ADXL335+ LEDs
MSP430FR5739: ADXL335+ LEDs
MSP430FR5739: ADXL335+ LEDs
MSP430FR5739: ADXL335+ LEDs


Podéis encontrar el código completo en nuestro repositorio GitHub:

·AqueronteBlog GitHub.


· NOTA 1: En caso de ejecutar el software UART.jar y no inicializarse, es debido a que las librerías no están instaladas debidamente. El software utiliza librerías externas como por ejemplo, para el manejo del puerto serie, dicha librería debe instalarse a mano. En el siguiente enlace hay una breve guía de como hacerlo: Instalar librerías RXTX.

miércoles, 25 de marzo de 2015

MSP430: NTC + MSP430FR5739

Este capítulo es diferente a los anteriores ya que vamos a usar la placa de desarrollo MSP430-EXP430FR5739 de la empresa Texas Instruments. Dicha placa de desarrollo contiene el microcontrolador MSP430FR5739 cuya novedad es la memoria interna, ya que es del tipo FRAM.

La memoria o tecnología FRAM presenta ciertas ventajas a la inmunidad al ruido y a la escritura en memoria. Pero no debemos asustarnos, los periféricos se trabajan de forma similar a cualquier microcontrolador de la familia MSP430.

El hecho de emplear esta placa, es que trae incorporado ciertos sensores que pueden ser útiles en nuestros proyectos personales, en este caso, el ejemplo que traemos consistirá en leer la temperatura obtenida por medio del dispositivo externo NTC ( termistor ) y la enviaremos por la UART cada aproximadamente 3 segundos.

Del mismo modo, por medio de la interfaz gráfica, podremos cambiar el estado de los 8 LEDs que dispone la placa de desarrollo.

Y para hacerlo un poco más vistoso, dicha comunicación serie será a través de un par de módulos XBee de forma inalámbrica.

Antes de seguir, decir que un termistor ( NTC ) es dispositivo que cambia su resistencia dependiendo de la temperatura. El dato clave que deberíamos saber acerca de este dispositivo es su parámetro BETA, que es el que necesitaremos para calcular la temperatura incidente.

Pero desgraciadamente, Texas Instruments no ha ofrecido ningún tipo de información acerca de este NTC, solo que su valor nominal es de 100 kΩ y su conexión en el circuito ( recomiendo mirar las conexiones en la guía que pone a disposición Texas Instruments: MSP430FR5739 ).

Así que para este ejemplo, he puesto unos valores nominales del parámetro BETA que se podrá escoger desde la interfaz gráfica.



 El material que vamos a necesitar y su función, es la que se muestra a continuación:

· MSP430 Launchpad FRAM: Evidentemente, nuestra placa de desarrollo con el microcontrolador MSP430FR5739 y el dispositivo externo NTC.

· Módulos XBee: Un par de ellos, en este caso, el módulo XBee es el modelo: XB24-ZB.

· Interfaz Gráfica: Software que se ejecuta en un ordenador con sistema operativo Windows con al menos, la versión .NET Framework 4.0. Dicha interfaz gráfica se puede descargar más adelante junto al Firmware.


El código del programa principal, es el siguiente:

/**
* @file      main.c
* @author    Manuel Caballero
* @date      20/3/2015
* @brief     Archivo principal.
* \copyright
*      AqueronteBlog@gmail.com
*
* Este archivo es propiedad intelectual del blog Aqueronte,
* cuya direccion web, es la siguiente:
*
*     http://unbarquero.blogspot.com/
*
* Se permite cualquier modificacion del archivo siempre y cuando
* se mantenga la autoria del autor.
*/

#include < msp430.h >
#include < stdint.h >
#include "variables.h"
#include "funciones.h"
#include "interrupciones.h"



/**
 *  \brief     void main( void )
 *  \details   Vamos a trabajar con la placa de desarrollo MSP-EXP430FR5739 y los
 *             periféricos disponibles externos e internos.
 *
 *             Este programa consiste en realizar una lectura de datos del sensor externo
 *             NTC cada, aproximadamente 3 segundos.
 *
 *             Así mismo, desde la interfaz gráfica se podrá cambiar el estado de los 8
 *             LEDs.
 *
 *             Una vez obtenidos los datos, se envían al ordenador por medio de un par de
 *             dispositivos XBee usando la UART. El resto del tiempo, el MCU permanecerá
 *             en estado bajo consumo LPM3.
 *
 *
 *
 *  \author    Manuel Caballero
 *  \version   0.0
 *  \date      20/3/2015
 *  \pre       La NTC disponible, TI no ha dado ningún dato técnico sobre la misma.
 *  \pre       Se utilizarán un par de módulos XBee XB24-ZB ( uno Coordinator y el otro End Device )
 *             a 9600 Baudios.
 *  \pre       El software de ordenador utilizado es el llamado UART1_SW, proporcionado con todos los
 *             archivos necesarios del éste proyecto.
 *  \pre       Code Composer Studio, Version: 6.0.1.00040.
 *  \pre       C Compiler, MSP430 GCC GNU v4.9.1.
 */
void main( void )
{
   conf_WDT    ();           // Configura WDT del sistema
   conf_CLK    ();           // Configura CLK del sistema
   conf_IO     ();           // Configura Entradas/Salidas
   conf_ADC10  ();           // Configura ADC10
   conf_UART   ();           // Configura UART
   conf_TA0    ();           // Configura Timer A0


   __enable_interrupt();     // Interrupciones ON.


   while(1)
   {
      LPM3;
      // __nop();            // Solo para DEBUG
   }
}

Como vemos, el ejemplo es bastante simple, se recomienda bajar los archivos disponibles más abajo para indagar entre sus librerías y leer sus funciones de manera más detallada.

Un vídeo que demuestra lo explicado anteriormente se presenta a continuación:



Os pongo a vuestra disposición el programa en lenguaje C (IAR y MSPGCC) para que lo podáis descargar y probar:

MSP430FR5739: NTC + LEDs
Compilador IARCompilador MSPGCC
CC
MSP430FR5739: NTC + LEDs
MSP430FR5739: NTC + LEDs
MSP430FR5739: NTC + LEDs
MSP430FR5739: NTC + LEDs

Ahora, en el archivo a descargar, a parte del programa con todas las librerías necesarias empleadas para este programa, se han añadido toda la documentación en formato doxygen.