Autor Tema: Liberia para TMP75/TMP175 (Digital Temperature Sensor with Two-Wire Interface)  (Leído 4122 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
En este caso comparto librería para control de sensor de temperatura TMP75/TMP175 que implementa interface I2C. Algunas características:

  • Salida digital
  • Resolución de 9,10,11 o 12 bits.
  • 1.5ºC de precisión
  • Rango de tensión 2.5 a 5V
  • Seteo de alerta para temperatura inferior y superior
  • Ect...
Datasheet

Liberia:
Código: C
  1. /*
  2.    \file TMP175.h
  3.    \version: 1.0
  4.    
  5.    \brief Este fichero contiene funciones para control de TMP175/75
  6.    
  7.    \web www.micros-designs.com.ar
  8.    \date 02/02/11
  9.    
  10.  *- Version Log --------------------------------------------------------------*
  11.  *   Fecha       Autor                Comentarios                             *
  12.  *----------------------------------------------------------------------------*
  13.  * 02/02/11      Suky        Original                                         *
  14.  *----------------------------------------------------------------------------*/
  15. ///////////////////////////////////////////////////////////////////////////
  16. ////                                                                   ////
  17. ////                                                                   ////
  18. ////        (C) Copyright 2011 www.micros-designs.com.ar               ////
  19. //// Este código puede ser usado, modificado y distribuido libremente  ////
  20. //// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
  21. ////                                                                   ////
  22. ////                                                                   ////
  23. ///////////////////////////////////////////////////////////////////////////
  24. #define SHUTDOWN_MODE_OFF  0x00
  25. #define SHUTDOWN_MODE_ON   0x01
  26. #define COMPARATOR_MODE    0x00
  27. #define INTERRUPT_MODE     0x02
  28. #define POLARITY_0         0x00
  29. #define POLARITY_1         0x04
  30. #define FAULT_QUEUE_1      0x00
  31. #define FAULT_QUEUE_2      0x08
  32. #define FAULT_QUEUE_4      0x10
  33. #define FAULT_QUEUE_6      0x18
  34. #define RESOLUTION_9       0x00
  35. #define RESOLUTION_10      0x20
  36. #define RESOLUTION_11      0x40
  37. #define RESOLUTION_12      0x60
  38. #define ONE_SHOT           0x80
  39.  
  40. char _Address;
  41. float Factor;
  42. long Mascara;
  43. char Rotar;
  44.  
  45.  
  46. void vSetConfigurationTMP175(char Config,char Address){
  47.    
  48.    _Address=Address<<1;
  49.    switch(Config&0x60){
  50.       case 0x00:
  51.          Factor=0.5;
  52.          Mascara=0x00FF;
  53.          Rotar=3;
  54.       break;
  55.       case 0x20:
  56.          Factor=0.25;
  57.          Mascara=0x01FF;
  58.          Rotar=2;
  59.       break;
  60.       case 0x40:
  61.          Factor=0.125;
  62.          Mascara=0x03FF;
  63.          Rotar=1;
  64.       break;
  65.       case 0x60:
  66.          Factor=0.0625;
  67.          Mascara=0x07FF;
  68.          Rotar=0;
  69.       break;
  70.    }
  71.  
  72.    i2c_start();
  73.    i2c_write(_Address&0xFE);
  74.    i2c_write(0x01);
  75.    i2c_write(Config);
  76.    i2c_stop();  
  77. }
  78.  
  79. void vSetTemperatureLowTMP175(float Value){
  80.    long Temp;
  81.    
  82.    if(Value>=0.0){
  83.       Temp=Value/0.0625;
  84.    }else{
  85.       Temp=(Value+128.0)/0.0625;
  86.       Temp!=0x0800;
  87.    }
  88.    Temp<<=4;
  89.  
  90.    i2c_start();
  91.    i2c_write(_Address&0xFE);
  92.    i2c_write(0x02);
  93.    i2c_write(*((char *)&Temp+1));
  94.    i2c_write(*((char *)&Temp));
  95.    i2c_stop();
  96. }
  97.  
  98. float fReadTemperatureLowTMP175(void){
  99.    long Temp;
  100.    float Cal;
  101.    
  102.    i2c_start();
  103.    i2c_write(_Address&0xFE);
  104.    i2c_write(0x02);
  105.    i2c_start();
  106.    i2c_write(_Address | 0x01);
  107.    *((char *)&Temp+1)=i2c_read();
  108.    *((char *)&Temp)=i2c_read(0);
  109.    i2c_stop();  
  110.    
  111.    Temp>>=4;
  112.    Cal=Temp*0.0625;
  113.    if((0x0800&Temp)!=0x0000){
  114.       Cal-=128.0;
  115.    }
  116.    
  117.    return(Cal);
  118. }
  119.  
  120. void vSetTemperatureHighTMP175(float Value){
  121.    long Temp;
  122.    
  123.    if(Value>=0.0){
  124.       Temp=Value/0.0625;
  125.    }else{
  126.       Temp=(Value+128.0)/0.0625;
  127.       Temp!=0x0800;
  128.    }
  129.    Temp<<=4;
  130.    
  131.    i2c_start();
  132.    i2c_write(_Address&0xFE);
  133.    i2c_write(0x03);
  134.    i2c_write(*((char *)&Temp+1));
  135.    i2c_write(*((char *)&Temp));
  136.    i2c_stop();
  137. }
  138.  
  139. float fReadTemperatureHighTMP175(void){
  140.    long Temp;
  141.    float Cal;
  142.    
  143.    i2c_start();
  144.    i2c_write(_Address&0xFE);
  145.    i2c_write(0x03);
  146.    i2c_start();
  147.    i2c_write(_Address | 0x01);
  148.    *((char *)&Temp+1)=i2c_read();
  149.    *((char *)&Temp)=i2c_read(0);
  150.    i2c_stop();  
  151.    
  152.    Temp>>=4;
  153.    Cal=Temp*0.0625;
  154.    if((0x0800&Temp)!=0x0000){
  155.       Cal-=128.0;
  156.    }
  157.    
  158.    return(Cal);
  159. }
  160.  
  161. float fReadTemperatureTMP175(void){
  162.    long Temp;
  163.    float Cal;
  164.    
  165.    i2c_start();
  166.    i2c_write(_Address&0xFE);
  167.    i2c_write(0x00);
  168.    i2c_start();
  169.    i2c_write(_Address | 0x01);
  170.    *((char *)&Temp+1)=i2c_read();
  171.    *((char *)&Temp)=i2c_read(0);
  172.    i2c_stop();  
  173.    
  174.    Temp>>=(Rotar+4);
  175.    Cal=((float)Factor*(Temp&Mascara));
  176.    if(((~Mascara)&Temp)!=0x0000){
  177.       Cal-=128.0;
  178.    }
  179.    
  180.    return(Cal);
  181. }
  182.  
  183. // Only SHUTDOWN MODE
  184. void vStartSingleConversionTMP175(void){
  185.    char Temp;
  186.  
  187.    i2c_start();
  188.    i2c_write(_Address&0xFE);
  189.    i2c_write(0x01);
  190.    i2c_start();
  191.    i2c_write(_Address | 0x01);
  192.    Temp=i2c_read(0);
  193.    i2c_stop();    
  194.    
  195.    i2c_start();
  196.    i2c_write(_Address&0xFE);
  197.    i2c_write(0x01);
  198.    i2c_write(Temp|0x80);
  199.    i2c_stop();
  200. }

Ejemplo:
Código: C
  1. #include <18F4620.h>
  2. #device adc=8
  3. #fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG
  4. #use delay(clock=20000000)
  5. #use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)
  6. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  7.  
  8. #include "TMP175.c"
  9.  
  10. void main(){
  11.    
  12.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  13.    setup_adc(ADC_OFF);
  14.    setup_psp(PSP_DISABLED);
  15.    setup_wdt(WDT_OFF);
  16.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  17.    setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
  18.    setup_timer_2(T2_DISABLED,0,1);
  19.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  20.    setup_comparator(NC_NC_NC_NC);
  21.    setup_vref(FALSE);
  22.  
  23.    vSetConfigurationTMP175(SHUTDOWN_MODE_OFF|COMPARATOR_MODE|POLARITY_0|FAULT_QUEUE_6|RESOLUTION_12,0x48); // Address -> A0,A1,A2=0
  24.    vSetTemperatureLowTMP175(25.0);
  25.    vSetTemperatureHighTMP175(35.0);
  26.    printf("Temp Low: %f\r\n",fReadTemperatureLowTMP175());
  27.    printf("Temp High: %f\r\n",fReadTemperatureHighTMP175());
  28.    
  29.    for(;;){
  30.       // Testeo de pin ALERT ->
  31.       if(input(PIN_B2)==1){
  32.          output_high(PIN_D7);
  33.       }else{
  34.          output_low(PIN_D7);
  35.       }
  36.       printf("Temp: %f\r\n",fReadTemperatureTMP175());
  37.       delay_ms(1000);      
  38.    }  
  39. }



Saludos!



No contesto mensajes privados, las consultas en el foro

Desconectado tinchomar

  • PIC10
  • *
  • Mensajes: 9
Re: Liberia para TMP75/TMP175 (Digital Temperature Sensor with Two-Wire Interface)
« Respuesta #1 en: 06 de Abril de 2011, 19:18:26 »
Me acaban de llegar los TMP 175 asi que me viene al pelo.

Gracias Suky

Desconectado leoelectronic

  • PIC10
  • *
  • Mensajes: 29
Buenas amigo suky yo estoy trabajando actualmente con sensor parecido el DS1621 y el PIC16f877A........ :?.........?
Bueno el problema es que utilizo la librería que trae CCS C (DS1621.c) pero solo leo temperaturas enteras y en grados Fahrenheit  :( y yo necesito leer temperaturas en grados centígrados y con lecturas de 0.5ºc porque esta es la resolución del ds1621………espero me puedas ayudar   ;-)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Seguramente tienes que leer el registro y realizar una regla de tres simple para determinar la temperatura en grados. Seguro los siguientes enlaces van a ser de ayuda:

http://www.wulfden.org/downloads/datasheets/DS1621.pdf

http://server-die.alc.upv.es/asignaturas/LSED/2003-04/0.Sens_Temp/ARCHIVOS/3_TERMOMETRO_DS1621.PDF


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Gracias como siempre Suky por compartir.
        Saludos.
        Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado leoelectronic

  • PIC10
  • *
  • Mensajes: 29
ummmm bueno voy a intentar, en un par de dias subo el codigo. muchas gracias  8)

Desconectado leoelectronic

  • PIC10
  • *
  • Mensajes: 29
Re: Liberia para TMP75/TMP175 (Digital Temperature Sensor with Two-Wire Interface)
« Respuesta #6 en: 03 de Agosto de 2011, 18:37:49 »
Buenas amigos aquí de nuevo pero en esta ocasión con otro problemilla con el ds1621 ya logre leer temperaturas con 0.5 grados de resolución  :P ahora el problema es configurar los registros TH y TL xq logro escribirlos pero resulta que la simulación en Proteus se dispara el TL 0.5 grados antes y además no puedo configurar para que TH y TL tengan valores decimales :5]
Bueno aquí les dejo el código de la librería que estoy utilizando gracias por la ayuda  :oops:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void init_temp(int address) {
   i2c_start();
   i2c_write(0x90|(address<<1)); //Genera primer byte (1001A2A1A0W)
   i2c_write(0xee); //Inicia conversión
   i2c_stop();   
}
 
float read_full_temp(int address) {
   signed int datah;
   int datal;
   float tura;
   
   i2c_start();
   i2c_write(0x90 |(address<<1)); //Genera primer byte (1001A2A1A0-W)
   i2c_write(0xaa);   //Leer temperatura
   i2c_start();
   i2c_write(0x91 |(address<<1)); //Genera primer byte (1001A2A1A0-R)
   datah=i2c_read();  //Lectura parte alta
   datal=i2c_read(0); //Lectura parte baja y NACK
   i2c_stop();

      tura=datah;    //Conversión a flotante
      if (datal==128) tura=tura+0.5;
      return(tura);     
}

void escribe_TH(signed int8 grados)// Escribir al registro de termostato "Temperatura Alta" (TH)
{
int real,decimal;

   i2c_start();
   i2c_write(0x90|(0x01<<1)); //Genera primer byte (1001A2A1A0W)
   i2c_write(0xA1);
   i2c_write(30);
   i2c_write(0x05);
   i2c_stop();
}


void escribe_TL(signed int8 grados)// Escribir al registro de termostato  "Temperatura Baja" (TL)
{

   i2c_start();
   i2c_write(0x90|(0x01<<1)); //Genera primer byte (1001A2A1A0W)
   i2c_write(0xA2);
   i2c_write(26);
   i2c_write(0x00);
   i2c_stop();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Desconectado Mando31

  • PIC10
  • *
  • Mensajes: 32
Re: Liberia para TMP75/TMP175 (Digital Temperature Sensor with Two-Wire Interface)
« Respuesta #7 en: 04 de Agosto de 2011, 04:31:45 »
No te fies de la simulacion, proteus es un simulador, pero como todo tiene sus fallos, si quieres corroborar que haces bien las cosas, tienes de dos, o usar un analizador de señales y en el pic revisar como lo mandas, o armar todo aunque sea en una protoboard y verificarlo en fisico, siempre que puedas intenta hacer las cosas en fisico, y más aun cuando sabes que haces bien las cosas y el simulador falla.  ;-)

Desconectado leoelectronic

  • PIC10
  • *
  • Mensajes: 29
Re: Liberia para TMP75/TMP175 (Digital Temperature Sensor with Two-Wire Interface)
« Respuesta #8 en: 14 de Agosto de 2011, 12:59:49 »
Umm nada amigos el ds1621 sigue con los mismos problemas tanto en la simulación como en la práctica se dispara 0.5 grados antes de TL y no logro escribir valores decimales en el registro TL y TH ayuda por favor

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Liberia para TMP75/TMP175 (Digital Temperature Sensor with Two-Wire Interface)
« Respuesta #9 en: 31 de Diciembre de 2011, 08:59:10 »
Hola Suky:

Esta pregunta es más técnica que otra cosa:

para utilizar estas opciones en una función de C

SHUTDOWN_MODE_OFF|COMPARATOR_MODE|POLARITY_0|FAULT_QUEUE_6|RESOLUTION_12

lo programaste asi:

void vSetConfigurationTMP175(char Config,char Address);

La pregunta es cómo hace C internamente para generar el char con todas las opciones ?.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Liberia para TMP75/TMP175 (Digital Temperature Sensor with Two-Wire Interface)
« Respuesta #10 en: 31 de Diciembre de 2011, 13:28:36 »
Son operaciones OR.

Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything