Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas

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.

miércoles, 4 de febrero de 2015

MSP430: DHT11 + UART

Este capítulo tiene el propósito de mostrar como trabajar con el dispositivo digital DHT11 mediante la librería que hemos creado y explicado en el siguiente capítulo: MSP430: DHT11.

Vamos a trabajar sobre la placa MSP430 Launchpad y en este caso, usaremos el microcontrolador MSP430G2553.

El programa que vamos a emplear para tal propósito, consistirá en obtener una lectura del sensor externo DHT11 cada tres segundos, y una vez obtenida, enviarla por la UART para que se muestre por pantalla en un software PC.

El conversor USB <---> RS-232 que vamos a usar, es uno externo, concretamente el CP2102 (enlace del fabricante).

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

· MSP430 Launchpad: Evidentemente, nuestra placa de desarrollo con el microcontrolador MSP430G2553.
· Módulo B75937: Conversor USB <---> RS-232 externo basado en el dispositivo CP2102.
· DHT11: Dispositivo digital de temperatura/humedad relativa.
· 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 módulo B75937, es un conversor USB <---> RS-232 que actuará de puente entre el módulo interno UART del microcontrolador y el puerto USB del ordenador (creando un puerto COM virtual en el ordenador).

Pero antes de presentar el código, debemos tener en cuenta algunas consideraciones:

· Preparación placa MSP430 Launchpad: La placa MSP430 Launchpad dispone de un conversor incorporado, para no causar conflictos, se recomienda desconectar las patitas TXD y RXD del conector J3.


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

/**
* @file     main.c
* @author   Manuel Caballero
* @date     2/2/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 "variables.h"
#include "funciones.h"
#include "interrupciones.h"
#include "DHT11.h"



/**
 *  \brief     void main( void )
 *  \details   Este programa consiste en realizar una lectura de datos del sensor externo
 *             DHT11 cada, aproximadamente 3 segundos.
 *
 *             Una vez obtenidos los datos, se envían al ordenador por medio del puerto serie
 *             usando la UART. El resto del tiempo, el MCU permanecerá en estado bajo consumo.
 *
 *  \author    Manuel Caballero
 *  \version   0.0
 *  \date      2/2/2015
 *  \pre       Asegurarse de que el dispositivo DHT11 está conectado en el pin P1.5.
 *  \pre       Se utilizará el módulo conversor B75937 USB <---> RS-232 basado
 *             en el dispositivo CP2102 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_UART     ();                // Configura UART
  conf_TA0      ();                // Configura TimerA TA0


  __enable_interrupt();            // Interrupciones ON.


  while(1)
  {
    LPM3;                          // Modo bajo consumo: LPM3

    DHT11_ini ();                  // Lectura datos del sensor externo DHT11
    // __nop();                    // Solo para DEBUG
    IE2     |=  UCA0TXIE;          // Interrupción Tx ON (Transmite datos)
  }
}

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:

MSP430: DHT11
Compilador IARCompilador MSPGCC
CC
MSP430: DHT11
MSP430: DHT11
MSP430: DHT11
MSP430: DHT11

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.

martes, 3 de febrero de 2015

MSP430: DHT11

En esta entrada, vamos a explicar el funcionamiento del dispositivo DHT11. Para tal fin, hemos diseñado una librería que es capaz de obtener el valor de temperatura, humedad relativa y el checksum.


Para tal tarea, como venimos haciendo, vamos a emplear la placa MSP430 Launchpad. Para empezar, vamos a mostrar algunas características técnicas de éste dispositivo:


Características DHT11
· No requiere de componentes externos· Periodo mínimo de muestreo de 1 segundo
· Alimentación desde 3V a 5.5V· Bus propio, solo se necesita un pin
· Medición de Temperatura: 0°C a +50°C (±2°C de precisión)· Medición de Humedad Relativa: 20%RH a +90%RH (±5%RH de precisión)


Tanto la descripción de los pines como la conexión con un microcontrolador, se muestran en las siguientes imágenes:


Sensor DHT11


El sensor DHT11, destaca por ofrecernos tanto la temperatura como la humedad relativa, más 1-Byte llamado checksum (suma de los valores: temperatura + humedad relativa), que nos alertará si la lectura es correcta. Y a parte de ser un dispositivo bastante completo para obtener la información de temperatura y humedad relativa, además es bastante barato y fácil de usar.

Para usarlo, deberemos implementar un su bus por software, cuya morfología es la que se muestra a continuación:



Donde la línea roja es la que deberemos implementar mediante el microcontrolador (señal de comienzo) y la azul, es la señal propia del dispositivo DHT11. El bus se puede desglosar en tres partes:


· 1.-  Señal de Comienzo (Start signal): Es la que está dibujada en colo rojo de la figura anterior. Consiste en lanzar la señal de comienzo para la lectura de datos. Es el microcontrolador el que debe realizarla.

· 2.-  Señal de Respuesta (Response signal): Una vez transmitida la señal de comienzo, el dispositivo DHT11 emite un pulso (80 μs señal baja y 80 μs señal alta) que determina que está presente.

· 3.-  Datos (Data): Se empieza a transmitir los datos (40-bit).


Pero en este capítulo no pretendemos hacer una explicación exhaustiva de este periférico, nuestro propósito es mostrar cómo controlarlo mediante la librería que hemos diseñado para tal fin. Esta librería contiene dos archivos:

· DHT11.c : Dónde se alojan todas las funciones necesarias para el control del DHT11.
· DHT11.h : Dónde se alojan todas las definiciones, constantes y declaraciones necesarias del DHT11.

Librería: DHT11
· Lo que podemos hacer:
· Realizar una lectura completa del sensor DHT11.

La configuración del microcontrolador para trabajar con este dispositivo externo es la siguiente:

Configuración por defecto: DHT11
· Puerto a usar:
· P1

Pin Launchpad
Pin DHT11
P1.5--->DQ

La función que nos permite obtener una lectura completa del dispositivo DHT11 es la que se muestra a continuación:

Leer desde el DHT11
· Función:
void DHT11_ini (void)
· Ejemplos:Descripción
DHT11_ini ();Almacena en una variable vector global una lectura completa.


Y llegados a este punto, ya se han presentado todas las funciones fundamentales y necesarias para controlar el dispositivo DHT11.


Os pongo a vuestra disposición, los archivos que componen la librería para el manejo y control del dispositivo DHT11:

MSP430: Librería DHT11
Compilador IARCompilador MSPGCC
CC
DHT11
DHT11
DHT11
DHT11


Para poner en práctica los conceptos y el control del dispositivo DHT11, os dejo un ejemplo:

Ejemplo: MSP430 + DHT11 + UART
1. ProgramaLectura de temperatura y humedad relativa del dispositivo DHT11.


· NOTA: Esta librería no está optimizada. Emplea el Timer A TA0 como recurso para generar retardos o tiempo de seguridad (Timeout).

Una lectura completa suele durar aproximadamente 23 ms.

En este capítulo, se han usado imágenes de terceros.

viernes, 6 de junio de 2014

MSP430: Timer TA0 PWM Piano

En este capítulo vamos a trabajar con el módulo interno TimerA, en realidad, ya hay varios ejemplos de como trabajar con dicho periférico y es más, lo hemos estado usando como temporizador (una de sus funciones). Pero la causa de dedicarle un capítulo en exclusiva no es por la configuración que puede adoptar de temporizador, más bien es por otro tipo de configuración la cual, suele ser interesante a la hora de generar señales con una frecuencia determinada o dicho de otra manera más formal, generar una señal de salida modulada, en sus siglas anglosajonas: PWM.

Por lo tanto, este capítulo se basa en generar señales de salida con una anchura de pulso determinada usando para ello, el TimerA.

Y para ello, tenemos a nuestra disposición dos registros fundamentales:


  • TAxCCR0: Determina la anchura de la señal de salida.
  • TAxCCR1: Determina la modulación de dicha señal: 0%, 50%, ...., 100%


Con el par de registros arriba mencionados, podremos obtener bastantes tipos de señal de salida dependiendo de como configuremos los bits: OUTMODx.

Para ampliar y ver los tipos de señales de salida dependiendo de dichos bits y de la configuración del TimerA, aconsejo que se vea el apartado: 12.2.5 Output Unit del documento: slau144j.

El ejemplo que va tener el propósito de ilustrar como configurar el TimerA en modo PWM y generar las señales de salidas deseadas, consiste en simular las notas musicales de un piano. Se sabe que cada nota musical tiene asociada una frecuencia determinada tal y como se muestra en la siguiente tabla:

Frecuencias de Notas Musicales
Nomenclatura Latina
Nomenclatura Alfabética
Frecuencia, Hz
· Do · C
261.63
· Reb (Do#) · C#
277.18
· Re · D
293.66
· Mib (Re#) · D#
311.13
· Mi · E
329.63
· Fa · F
349.23
· Solb (Fa#) · F#
369.99
· Sol · G
392.00
· Lab (Sol#) · G#
415.30
· La · A
440.00
· Sib (La#) · A#
466.16
· Si · B
493.88

Pues bien, nuestro ejemplo consistirá en un software PC que simule las teclas de un piano, y al ser pulsada una de ellas, se enviará la información de que tecla (nota musical) se ha pulsado para ser reproducida por nuestro microcontrolador. Para tal fin, configuraremos el TimerA en modo PWM y generaremos una señal de salida a la frecuencia de dicha nota pulsada.

Y para darle un poco más de realismo, es decir, intentar que nuestra placa de desarrollo se parezca un poco más a un piano, se va a emplear el TimerA TA1 como controlador o mejor dicho, como la duración máxima que será reproducida una nota musical (siempre y cuando no se pulse ninguna otra tecla más).

La idea es transformar nuestra placa de desarrollo MSP430 LaunchPad en un piano (simplemente con las notas principales).

Para conectar el PC a nuestra placa usaremos el conversor USB <---> RS-232, es uno externo, concretamente el CP2102 (enlace del fabricante). Y hay que tener en cuenta algo muy importante, y es que al ser la familia MS430G, microcontroladores de bajo consumo, la señal que se genera también lo serán y esto a la hora de generar sonidos es un problema, ya que no tendrá la suficiente potencia para que el sonido sea audible (el volumen sea lo suficientemente alto para ser escuchado).

Es por ello que necesitaremos una etapa amplificadora externa para adaptar nuestra señal PWM del microcontrolador a las necesidades de un altavoz (speaker). En mi caso, he conectado directamente la señal de salida PWM ofrecida por el microcontrolador a una radio convencional (radio cassette) por su entrada de micrófono. Dicha radio realizará o se usará como etapa amplificadora.

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

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

· Módulo B75937: Conversor USB <---> RS-232 externo basado en el dispositivo CP2102.

· 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.

· Radio Convencional (Radio Cassette): Será tanto la etapa amplificadora como el altavoz (speaker).


El código del programa principal 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:      main.c                              
Date:          3-June-14                                
File Version:  vs0.0                                     
Compiler:      IAR 5.60.2 

Author:        Manuel Caballero                           
Company:       Hades                          
                       
----------------------------------------------------------------------
                                                      
Notes:  Este programa tiene el propósito de emplear el Timer TA0 como
        modulación de anchura de pulso (PWM).

        Para tal propósito, se ha diseñado un programa que emula las
        notas principales de un piano.

        Mediante un software de PC que emula a un piano, se le enviará
        al MSP430 LaunchPad que configure el PWM de tal manera que 
        genere una onda que coincida en frecuencia a la nota musical
        enviada por el software del PC.

        Dicha onda generada por el PWM tendrá una duración máxima de 
        1s, a no ser que se vuelva o se pulse otra tecla del software
        del PC.

        El microcontrolador estará en modo bajo consumo LPM1 hasta
        que reciba una orden desde el ordenador.

        Es importante destacar que al ser la familia MSP430 de bajo 
        consumo, su salida va acorde a dicha filosofía por lo que 
        generar sonidos directamente sin una etapa amplificadora tendrá
        como consecuencia que dicho sonido generado, su volumen será muy
        flojito.

        Para este ejemplo, se ha conectado directamente la salida del
        PWM del microcontrolador a una radio convencional por la entrada
        del micrófono. Consiguiéndose, amplificar la señal PWM y que ésta
        sea audible.
*/

#include "io430.h"
#include "variables.h"
#include "funciones.c"
#include "interrupciones.c"


void main( void )
{ 
  unsigned char error = 0;      // Variable que indica lo siguiente:
                                //      · error = 1: Se ha producido un error. Apaga todo.
                                //      · error = 0: Todo correcto.
  
  conf_WDT    ();                // Configura WDT del sistema
  conf_CLK    ();                // Configura CLK del sistema  
  conf_TimerA ();                // Configura TimerA  
  conf_IO     ();                // Configura Entradas/Salidas
  conf_UART   ();                // Configura UART 
  
  __enable_interrupt();          // Interrupciones ON.
  
  
  while(1)
  {     
    LPM1;
    
    error      = 0;                     // Reset variable: error
    
    TA0CTL     = MC_0 + TACLR;          // Timer TA0 OFF: No hay sonido
    
    
    switch (datoUART)
    {
      case Si:
      // Nota musical: Si  ~ 493.88 kHz
        TA0CCR0        = 24297;  
        TA0CCR1        = 12149;
        break;

      case Sib:
      // Nota musical: Sib ~ 466.16 kHz
        TA0CCR0        = 25742;  
        TA0CCR1        = 12871;
        break;

      case La:
      // Nota musical: La  ~ 440.00 kHz
        TA0CCR0        = 27273;  
        TA0CCR1        = 13637;
        break;

      case Lab:
      // Nota musical: Lab ~ 415.30 kHz
        TA0CCR0        = 28895;  
        TA0CCR1        = 14448;
        break;

      case Sol:
      // Nota musical: Sol ~ 392.00 kHz
        TA0CCR0        = 30612;  
        TA0CCR1        = 15306;
        break;

      case Solb:
      // Nota musical: Solb ~ 369.99 kHz
        TA0CCR0        = 32433;  
        TA0CCR1        = 16217;
        break;

      case Fa:
      // Nota musical: Fa   ~ 349.23 kHz
        TA0CCR0        = 34361;  
        TA0CCR1        = 17181;
        break;

      case Mi:
      // Nota musical: Mi   ~ 329.63 kHz
        TA0CCR0        = 36404;  
        TA0CCR1        = 18202;
        break;

      case Mib:
      // Nota musical: Mib  ~ 311.13 kHz
        TA0CCR0        = 38569;  
        TA0CCR1        = 19285;
        break;

      case Re:
      // Nota musical: Re   ~ 293.66 kHz
        TA0CCR0        = 40864;  
        TA0CCR1        = 20432;
        break;

      case Reb:
      // Nota musical: Reb  ~ 277.18 kHz
        TA0CCR0        = 43293;  
        TA0CCR1        = 21647;
        break;

      case Do:
      // Nota musical: Do   ~ 261.63 kHz
        TA0CCR0        = 45866;  
        TA0CCR1        = 22933;
        break;

      default:
      // Ha habido un error
        error = 1;
        break;        
    }
    
    if (error == 0)
    {
    // Ningún Error: Activa TA0 y TA1
      TA0CTL     = TASSEL_2 + MC_1 + TACLR;      // SMCLK, TA0 Up Mode
      TA1CTL     = TASSEL_1 + MC_1 + TACLR + TAIE;      // ACLK, TA1 Up Mode y TA1 Produce interrupción
    }
  }
}

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, donde se interpretará la canción de Feliz Cumpleaños (Happy Birthday):



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

MSP430: DS1624 + UART
Compilador IARCompilador MSPGCC
CC
MSP430: Timer TA0 PWM Piano
MSP430: Timer TA0 PWM Piano
MSP430: Timer TA0 PWM Piano
MSP430: Timer TA0 PWM Piano

· NOTA 1: En caso de que en el Software empleado para simular un piano no reconozca ningún puerto COM, es síntoma de que no se tiene los drivers necesarios del dispositivo CP2102, por lo que se deberán instalar para un uso correcto, ya que el ordenador no lo reconoce.

· NOTA 2: El PWM se suele usar mucho para controlar la velocidad de motores, entre otras cosas.

· NOTA 3: En este ejemplo se ha usado como etapa amplificadora una radio convencional (radio cassette) para adaptar la señal de salida generada PWM a un sonido audible. En caso de conectar dicha salida PWM al altavoz, el sonido será muy débil.

· NOTA 4: Tengo que reconocer que la canción: Feliz Cumpleaños (Happy Birthday) que se escucha en el vídeo, la he interpretado de manera muy modesta (mi nivel de piano es nulo, aunque espero mejorar).