lunes, 19 de mayo de 2014

MSP430: DS1624

En este capítulo, vamos a trabajar con el dispositivo externo DS1624 de la empresa Maxim Integrated. Dicho dispositivo consiste en un sensor de temperatura digital con una memoria no volátil de poca capacidad.


DESCRIPCIÓN PATITAS:
· SDA:Dato I/O
· A0:Dirección DS1624
· SCL:Reloj CLK
· A1:Dirección DS1624
· GND:Tierra
· A2:Dirección DS1624
· VDD:Alimentación
· NC:Sin conexión

Las principales características del dispositivo DS1624 son las que se muestran a continuación:

CARACTERÍSTICAS DS1624
· Intervalo de temperatura:
[-55, +125]ºC, incremento de 0.03125ºC.

· Bus I2C (Solo 2 patitas)
· Temperatura almacenada en 13-bit.
· Mínimos elementos externos para funcionar.
· Conversión de temperatura en 1s (máximo)
· 256-bytes de EEPROM

Como se puede comprobar en la tabla anterior, el dispositivo DS1624 es un elemento bastante útil y eficaz a la hora de obtener medidas de temperatura tanto por su precisión como por el número de elementos necesarios que se necesitan para trabajar con él (al ser el bus I2C, solo es necesario 2 patitas del microcontrolador con un par de resistores Pull-Up).

Aunque dicho dispositivo también contiene un pequeño espacio de memoria no volátil disponible (generalmente usado para almacenar datos de calibración), en este capítulo solo vamos a centrarnos en su principal característica: lectura de temperatura.

El DS1624 se puede configurar para que esté realizando conversiones de temperatura de manera constante o, en modo bajo consumo, éste último modo, bajo consumo, consiste en que el dispositivo DS1624 solo ofrecerá una medida de temperatura si previamente ha habido una petición de conversión de temperatura.

Éste modo de bajo consumo es el que se va a exponer en este capítulo y para ello, vamos a presentar los elementos que vamos a necesitar para trabajar conjuntamente con el dispositivo DS1624.

Vamos a trabajar sobre la placa MSP430 Launchpad y en este caso, usaremos el microcontrolador MSP430G2553. Dicho microcontrolador dispone del periférico interno USCI I2C Mode encargado de controlar el bus I2C de manera automática mediante hardware.

El programa que vamos a emplear para tal propósito, consistirá en obtener una lectura del sensor externo de temperatura DS1624 cada dos segundos (primero realiza una petición de conversión de temperatura y después, la lectura de la misma), y una vez obtenida la temperatura, enviarla por la UART para que se muestre por pantalla en un software PC. El microcontrolador estará en modo bajo consumo LPM3, y será el Timer TA0 el encargado de despertar al microcontrolador para que ejecute o bien una petición de conversión de temperatura o una lectura de la misma.

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.

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

· DS1624: Dispositivo externo que realiza conversiones de temperatura de manera digital mediante el bus I2C. Enlace del dispositivo en la web del fabricante: DS1624.


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:           14-May-14                                
File Version:   vs0.0                                     
Compiler:       IAR 5.60.1 [Kickstart]   

Author:         Manuel Caballero                           
Company:        Hades                          
                       
----------------------------------------------------------------------
                                                      
Notes:  Este programa tiene el propósito de enviar mediante el módulo
        interno UART el dato recogido por el sensor externo de 
        temperatura DS1624.

        Dicho sensor trabaja con el bus I2C que será implementado
        mediante hardware (USCI I2C). El dispositivo DS1624 será 
        configurado de tal manera que para obtener una lectura de
        la temperatura previamente debe ser enviada la orden de
        petición de conversión de temperatura.
  
        Tanto la petición de conversión de temperatura así como la
        lectura de temperatura se realizará por hardware mediante
        la técnica denominada polling (sin interrupciones).
                  
        Se utilizará el módulo conversor B75937 USB <---> RS-232 basado
        en el dispositivo CP2102 a 115200 Baudios.

        El microcontrolador estará en modo bajo consumo LPM3 hasta
        que reciba una orden de petición de conversión de temperatura
        o lectura de temperatura.   

        La actualización de la temperatura es cada ~ 2 s.
*/

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



void main( void )
{   
  conf_WDT    ();                // Configura WDT del sistema
  conf_CLK    ();                // Configura CLK del sistema
  conf_IO     ();                // Configura Entradas/Salidas
  conf_I2C    ();                // Configura I2C
  conf_DS1624 (D1624_CPU_1SHOT); // Configura el dispositivo DS1624
  conf_UART   ();                // Configura UART  
  conf_TimerA ();                // Configura TimerA
  
  
  __enable_interrupt();          // Interrupciones ON.
  
  
  while (1){
    LPM3;                        // Modo bajo consumo: LPM3
    
    if (seleAccion == 1)
    {
    // Conversión de Temperatura
      UCB0CTL1    |=      UCTR + UCTXSTT;
      UCB0TXBUF    =      D1624_StartConvertT;   
      while ((UCB0CTL1 & UCTXSTT) != 0);

      UCB0CTL1    |=      UCTXSTP;      // I2C stop condition
      IFG2        &=     ~UCB0TXIFG;    // Clear USCI_B0 TX int flag
      while ((UCB0CTL1 & UCTXSTP) != 0);
      
      TA0CTL  |=  TAIE;                 // Servicio de interrupción TA0 ON
    }
    else
    {
    // Lectura de Temperatura
      UCB0CTL1        |=      UCTR + UCTXSTT;
      UCB0TXBUF        =      D1624_ReadTemperature;
      while ((UCB0CTL1 & UCTXSTT) != 0);
    
      IFG2            &=     ~UCB0TXIFG;      // Clear USCI_B0 TX int flag        
      UCB0CTL1        &=     ~UCTR;           // I2C RX
      UCB0CTL1        |=      UCTXSTT;        // I2C restart condition
      while ((UCB0CTL1 & UCTXSTT) != 0);
      
      for (unsigned char i = 0; i > 2; i++)
      {
      // Almacenamos el dato ofrecido por el dispositivo DS1624
        while ((IFG2 & UCB0RXIFG) == 0);
        Aux_DataIn[i]    =      UCB0RXBUF;
        IFG2            &=     ~UCB0RXIFG;    // Clear USCI_B0 TX int flag       
      }
      
      UCB0CTL1        |=      UCTXSTP;        // I2C stop condition
      while ((UCB0CTL1 & UCTXSTP) != 0); 

      TX_Buff          =      2;              // Se va a transmitir 2-Byte
      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: DS1624 + UART
Compilador IARCompilador MSPGCC
CC
MSP430: DS1624
MSP430: DS1624
MSP430: DS1624
MSP430: DS1624

· NOTA 1: En caso de que en el Software empleado para la lectura de temperatura del sensor DS1624 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: Este ejemplo es una forma muy simple de controlar y trabajar con el bus I2C mediante el periférico interno del microcontrolador USCI I2C Mode, aunque para mayor seguridad, se debería implementar un temporizador de manera que supervise los tiempos de ejecución y espera del bus, ya que si por un casual, algo mal pasase, el ejemplo aquí expuesto no tendría las herramientas necesarias para evitar un cuelgue. Dicho temporizador no se ha implementado para mostrar con claridad como de fácil es trabajar con el bus I2C.

8 comentarios:

Jorgr Lombardo dijo...

Me parece perfecto que compartas esta información. Lo que me parece horrible (y de hecho lo es) es que imprimas la temperatura con tantos dígitos decimales, cuando a lo sumo la décima es válida. Los sensores de temperatura a lo sumo tienen una precisión de 0.1 ºC, y la mayoría tienen una precisión de medio grado (0.5 ºC) centígrado. Hacer esta aberración demuestra que tienes conocimiento de las cifras verdaderas y que desconoces el tema de error en la medida. Te recomiendo que quites esa aberración de dígitos decimales y leas el tema de errores. También leé el datasheet del integrado. Ah! y corregí tus faltas de ortografía.

AqueronteBlog dijo...

Buenas Jorgr Lombardo:

Antes que nada decirte que, cualquiera crítica es constructiva, pero por favor, antes de opinar y decir algo, deberías estar informado sobre dicho tema.

Me parece perfecto que me recomiendes leerme el datasheet del dispositivo, es más, es lo que hice, y es por ello que se impriman tantos decimales, porque el propio dispositivo te ofrece dicha precisión (página 8 del datasheet).

¿Que en la vida real se hace (imprimir tantos decimales)? Pues depende de la aplicación, lo que está claro es que en este blog se exponen los temas de manera didáctica.

¿Qué desconozco el tema de errores? Bien, te invito a que te pases por el curso de estadística que ofrecemos en este blog.

Respecto a las faltas de ortografía, simplemente tienes que mencionarlas para que sean corregidas, así me ayudas a que el blog sea mejor.

Créeme que cuando leo comentarios como el tuyo, me da pena y vergüenza ajena.


Un saludo.

Anónimo dijo...

Hola. ¿En dónde haces la interfaz del microprocesador? ¿Hay algún tutorial en tu blog?

AqueronteBlog dijo...

Buenas:

La interfaz gráfica está incluida en el archivo de descarga.

Los archivos fuentes no están incluidos. En este caso, la interfaz está realizada en C# usando el IDE llamado Sharpdevelop.

En estos momentos estamos desarrollando interfaces gráficas en Java, y posiblemente hagamos un tutorial tanto en C# como en Java.


Un saludo.

Trabajo de Quimica dijo...

hola disculpa, queria pedirte ayuda a configurar mi micro, me base en tu ejemplo para intentar hacer comunicacion i2c entre la launchpad msp430g2553 y un sensor de luz bh1750, el problema es que no puedo hacer que funcione, no entiendo la parte en la que tengo que mandar informacion y recibirla, con tu ejemplo se ve que solo colocas la direccion en el registro UCB0I2CSA y despeus ya no haces cambio de nada, espero me puedas ayudar gracias y buen dia.

AqueronteBlog dijo...

Buenas:

Tenemos una librería para ese sensor: BH1750, pero es para los microcontroladores de la empresa Microchip, aquí te dejo el enlace:

· http://unbarquero.blogspot.com.es/2015/04/microchip-pic-i2c-bh1750-pic24f32ka301.html

Trabajar con el módulo I2C del MSP430, es relativamente sencillo, te puedes guiar con el ejemplo que ponemos a disposición en este capítulo.


Un saludo.

P a l o m a dijo...

Hola!

me estoy fijando en tu ejemplo para implementar el sensor HDC1050 via I2C con la placa de desarrollo msp430g2553 pero no consigo que funcione, igual tú lo has utilizado o me podrías ayudar.

Gracias y un saludo!
Paloma

AqueronteBlog dijo...

Buenas Paloma:

No he usado dicho sensor que mencionas pero te doy unas guías rápidas, a nivel hardware, que deberás tener en cuenta y comprobar ( y a ser posible, volver a comprobar ), estas son dos:

· Asegúrate de que envías la correcta dirección del dispositivo, en tú caso, según la hoja de características del dispositivo, es 1000000.

· Y la segunda es, comprobar que tienes las resistencias de pull-up en ambas líneas del I2C.

Un saludo.