jueves, 22 de marzo de 2012

MSP430: DS1620 + LCD HD44780

En esta entrada mostraremos cómo funciona la librería para controlar el dispositivo DS1620 Digital Thermometer and Thermostat, tal y cómo describimos en el anterior capítulo: MSP430: DS1620.

Vamos a trabajar sobre la placa MSP430 Launchpad y esta vez, vamos a cambiar de microcontrolador, el elegido será el MSP430G2452 (hemos cambiado para mostrar que trabajar con los distintos microcontroladores que nos ofrece Texas Instruments es igual de sencillo). Tendremos conectado nuestra sensor DS1620 en configuración de termómetro y el resultado se mostrará por un display LCD Hitachi 44780.

La secuencia mostrada por el LCD será la siguiente:

  1. Aviso de configuración: DS1620 controlado por el micro y sin conversión continua.
  2. Aviso de que vamos a leer los valores de Thigh y Tlow del dispositivo DS1620.
  3. Nos muestra por pantalla dichos valores.
  4. Aviso de que vamos a cambiar dichos valores.
  5. Aviso de que vamos a leer de nuevo, los valores anteriores para cerciorarnos de que todo ha ido bien.
  6. No muestra los nuevos valores de Thigh y Tlow.
  7. Aviso de lectura de temperatura.
  8. Y por último, nos muestra la temperatura por pantalla.

Tanto la conexión con el display cómo con el DS1620, se muestran en la parte de comentarios del programa que veremos más abajo.

La manera de gestionar el tiempo se hará mediante el TimerA configurado al reloj ACLK (que se le asociará el VLOCLK y mediante la técnica de polling), el código del programa 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: 21-March-12
File Version: vs0.0
Compiler: IAR 5.40.3 [Kickstart]

Author: Manuel Caballero
Company: Hades

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

Notes: En este programa vamos a mostrar como trabajar con la librería
ds1620 que nos permitirá el manejo del dispositivo DS1620.
Primero, leeremos el dispositivo para obtener los valores
de fábrica, posteriormente, redifiniremos las temperaturas
mínima (Tlow) y máxima (Thigh), y finalmente, realizaremos
lectura de temperatura cada segundo (aproximadamente).
Todos los datos se mostrarán por pantalla LCD Hitachi 44780.

· Configuración del Sistema:
· MCLK: DCLOCK ~8 MHz
· ACLK: VLOCLK ~12 kHz
· Timer A: Para generar retardos

· Conexión al DS1620
· 1. DQ: P2.0
· 2. CLK/#CONV: P2.1
· 3. #RST: P2.2
· 4. GND: GND
· 5. Tcom: NA
· 6. Tlow: NA
· 7. Thigh: NA
· 8. Vdd: +3V

· Conexión al LCD
· 1. Vss: GND
· 2. Vdd: +3V
· 3. Vo: GND
· 4. RS: P1.0
· 5. R/#W: GND
· 6. E: P1.2
· 7. DB0: NA
· 8. DB1: NA
· 9. DB2: NA
· 10. DB3: NA
· 11. DB4: P1.3
· 12. DB5: P1.4
· 13. DB6: P1.5
· 14. DB7: P1.6
*/

#include "io430.h"

// #define BusyFlag_ON
#define fosc 8000000 // 8 MHz
#include "LCD4bits.c"

#define DS1620_DIR P2DIR
#define DS1620_OUT P2OUT
#define DS1620_IN P2IN
#include "ds1620.c"

// Prototipos de funciones
void conf_CLK (void);
void conf_TimerA (void);
void BCD_to_LCD (unsigned int );

void main( void )
{
unsigned int temp = 0;

conf_CLK ();

LCD_INI (ONE_Line_5x7, NoShift_Increment); // Inicializa LCD
LCD_Control (DisON_CurOFF_BliOFF);

conf_TimerA();

LCD_printf ("DS1620: 1SHOT");
while (TA0CTL_bit.TAIFG == 0);
TA0CTL_bit.TAIFG = 0; // Reset flag TAIFG

DS1620_Conf (D1620_CPU_1SHOT); // DS1620: 1SHOT & CPU

LCD_Control (ClearDisplay);
LCD_printf ("Read DS1620");
while (TA0CTL_bit.TAIFG == 0);
TA0CTL_bit.TAIFG = 0; // Reset flag TAIFG

LCD_Control (ClearDisplay);
LCD_printf ("Th=");
temp = DS1620_Read (D1620_ReadTH); // Leemos valor Th
temp = DS1620_BCDTemp (temp); // compactamos a BCD
BCD_to_LCD (temp); // Thigh -> Por Display HD44780

LCD_printf (" Tl=");
temp = DS1620_Read (D1620_ReadTL); // Leemos valor Tlow
temp = DS1620_BCDTemp (temp); // compactamos a BCD
BCD_to_LCD (temp); // Tlow -> Por Display HD44780

while (TA0CTL_bit.TAIFG == 0);
TA0CTL_bit.TAIFG = 0; // Reset flag TAIFG

LCD_Control (ClearDisplay);
LCD_printf ("Let's write!");

DS1620_Write (D1620_WriteTH, 0x0032); // Thigh <- +25ºC
DS1620_Write (D1620_WriteTL, 0x001E); // Thigh <- +14ºC

while (TA0CTL_bit.TAIFG == 0);
TA0CTL_bit.TAIFG = 0; // Reset flag TAIFG

LCD_Control (ClearDisplay);
LCD_printf ("Read again!");
while (TA0CTL_bit.TAIFG == 0);
TA0CTL_bit.TAIFG = 0; // Reset flag TAIFG

LCD_Control (ClearDisplay);
LCD_printf ("Th="); // Volvemos a leer Th y Tl...
temp = DS1620_Read (D1620_ReadTH);
temp = DS1620_BCDTemp (temp);
BCD_to_LCD (temp);
LCD_printf (" Tl=");
temp = DS1620_Read (D1620_ReadTL);
temp = DS1620_BCDTemp (temp);
BCD_to_LCD (temp); // ... para comprobar la escritura.

while (TA0CTL_bit.TAIFG == 0);
TA0CTL_bit.TAIFG = 0;

LCD_Control (ClearDisplay);
LCD_printf ("Let's read Temp!");
while (TA0CTL_bit.TAIFG == 0);

TA0CCR0 = 12000; // TAIFG on around ~1s

while (1){
DS1620_StartConvert_T (); // ¡Empieza a convertir Temp!
while (TA0CTL_bit.TAIFG == 0);

temp = DS1620_Read (D1620_ReadTemperature); // Leemos la temperatura
LCD_Control (ClearDisplay);

if (DS1620_T_is_Pos(temp) == 0)
LCD_printf ("T = +"); // temp > 0
else
LCD_printf ("T = -"); // temp < 0

temp = DS1620_PutT_Pos (temp); // Para compactarla a BCD..
temp = DS1620_BCDTemp (temp); // ...la convertimos en positivo!
BCD_to_LCD (temp); // temp -> Por display HD44780

LCD_putc (0xDF); // º
LCD_putc ('C'); // Grados centígrado
TA0CTL_bit.TAIFG = 0; // Reset flag TAIFG
}
}

/*
Function: conf_CLK (void)

Version: vs0.0 (6/03/2012)
Compiler: IAR 5.40.3 [Kickstart]

Description: Configura reloj del sistema (~8 MHz) y ACLK (~12 kHz).
Notes:
*/
void conf_CLK (void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT

DCOCTL = CALDCO_8MHZ;
BCSCTL1 = CALBC1_8MHZ;

BCSCTL3 = LFXT1S1; // ACLK = VLOCLK
}

/*
Function: conf_TimerA (void)

Version: vs0.0 (6/03/2012)
Compiler: IAR 5.40.3 [Kickstart]

Description: TimerA para generar retardos mediante polling.
Notes:
*/
void conf_TimerA (void)
{
TA0CCR0 = 36000; // TAIFG on around ~3s
TA0CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, upmode
TA0CTL_bit.TAIFG = 0; // Reset flag TAIFG
}

/*
Function: BCD_to_LCD (unsigned int )

Version: vs0.0 (6/03/2012)
Compiler: IAR 5.40.3 [Kickstart]

Data in:
· cmd: La temperatura compactada en BCD.
Data out:
· Representa la temperatura por HD44780 en valor absoluto.

Description: Representa la temperatura por display HD44780.
Notes: La temperatura debe estar compactada en BCD.
*/
void BCD_to_LCD (unsigned int cmd)
{
unsigned char m = 0, i = 3;
unsigned char cont = 3;
unsigned char num[] = "0123456789";
unsigned char aux = 0;

if (cmd == 0)
LCD_printf ("0.0");
else
{
do{
aux = (cmd >> (4*cont)) & 0x000F;
cont--;
i--;
}while (aux == 0);

if (i == 0xFF)
{
LCD_putc ('0');
i = 0;
}
else
i++;

cont++;

for (unsigned char b = 0; b < i; b++)
{
while (aux - m != 0)
m++;

LCD_putc (num[m]);
cont--;
aux = (cmd >> (4*cont)) & 0x000F;
m = 0;
}

if (cmd & 0x0001)
LCD_printf(".5");
else
LCD_printf(".0");
}
}

Hay que tener en cuenta, que para este programa es necesaria la librería de manejo del LCD. Y aparte, se han aportado una función más, un valor empaquetado en BCD poder ser representado por el LCD HD44780 directamente.

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



· NOTA: Esa cosa blanca que pongo encima del DS1620 es una piedra que recogí de la playa y que suele (o para esta ocasión fue así) estar encima del transformador del portátil, por lo que está caliente y dicho calor es el que transmite al sensor. Por eso cambia de temperatura.

Hice la prueba a temperatura ambiente con datos satisfactorios, pero cambiaba más lentamente el valor de temperatura, por lo que utilizar la piedra para el caso, me pareció una buena idea.

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

MSP430: DS1620 + LCD 44780
Compilador IARCompilador MSPGCC
CC
DS1620 + HD44780
DS1620 + HD44780
DS1620 + HD44780
DS1620 + HD44780
DS1620 + HD44780
DS1620 + HD44780

Como se ha podido ver en el transcurso de esta entrada, el manejo del dispositivo DS1620 es fácil de adaptar y usar para nuestras necesidades mediante los microcontroladores MSP430 que pone a nuestra disposición Texas Instruments.

Lo más interesante de esta librería, es su alta capacidad de ser configurada a gusto del diseñador en lo referente a patitas del microcontrolador para que se pueda adaptar, lo mejor posible, a las necesidades del proyecto y que es capaz de manejar el decimal que nos ofrece éste dispositivo.

0 comentarios: