Autor Tema: [LIBRERIA CCS] DS1620  (Leído 5334 veces)

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

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
[LIBRERIA CCS] DS1620
« en: 26 de Mayo de 2006, 06:54:40 »
Bueno pues como bien dice el post, es la libreria del dispositivo ds1620 de Dallas Semiconductor, es un termostato y termometo digital y la comunicacion con el mismo es via 3-wire, aqui la libreria:
Código: C
  1. ///////////////////////////////////////////////////////////////////////////////////
  2. ///             VsZeNeR'06                                                      ///
  3. ///            23/Mayo/06                                                       ///
  4. ///        vszener@gmail.com                                                    ///
  5. ///                                                                             ///
  6. ///     Libreria: vs_DS1620.C   Compilador: CCS                                 ///
  7. ///     Version:  1.0                                                           ///
  8. ///                                                                             ///
  9. ///     Notas: Controlador para temperatura del dispositivo ds1620              ///
  10. ///            de Dallas Instruments                                            ///
  11. ///                                                                             ///
  12. ///     Funciones:      temp= read_ds1620(); -> lee la temperatura (float)      ///            
  13. ///                                                                             ///
  14. ///                                                                             ///
  15. ///     ·Libreria solamente provada en simulador PROTEUS                       ///
  16. ///////////////////////////////////////////////////////////////////////////////////
  17.  
  18.  
  19. #ifndef DS1620_DQ                      
  20.  
  21. #define DS1620_DQ               PIN_B5  //declaracion...
  22. #define DS1620_CLK              PIN_B6 
  23. #define DS1620_RST              PIN_B7  //...de pines por defecto
  24.  
  25. #endif
  26.  
  27.  
  28. ///FUNCION QUE ESCRIBE LOS COMANDO EN EL DS1620/////////////////////////
  29. void write_ds1620_byte(BYTE cmd) {
  30.    BYTE i;
  31.  
  32.    for(i=0;i<8;++i) {           //se escribe siempre...
  33.       output_bit(DS1620_DQ, shift_right(&cmd,1,0) );            //mando el comando al ds1620
  34.       output_high(DS1620_CLK);                                  //los datos se escriben...
  35.       output_low(DS1620_CLK);                                   //...en el flanco descendente de CLK
  36.    }                            //...8bits para la escritura
  37. }
  38.  
  39.  
  40. ///FUNCION QUE DEVUELVE LA TEMPERATURA DEL DS1620 FORMATO FLOAT/////////
  41. float read_ds1620() {
  42.    float temp;                                          //dato donde se almacena la temperatura
  43.    BYTE i,data_lsb;                                     //i contador; data_lsb dato leido ds1620
  44.    boolean bit_sig;                                     //solo interesa el bit menos significativo del byte msb
  45.  
  46.    output_high(DS1620_RST);                             //activo RST para la transmision/recepcion de datos
  47.    write_ds1620_byte(0xAA);                             //mando el comando de leer temp
  48.  
  49. //////BYTE LSB DE TEMPERATURA///////////////////////
  50.    for(i=0;i<8;++i) {           //nos dara lsb byte
  51.       shift_right(&data_lsb,1,input(DS1620_DQ));        //almaceno el estado pin DQ en la variable data_lsb
  52.       output_high(DS1620_CLK);                          //el dato se da...
  53.     //  delay_us(1);
  54.       output_low(DS1620_CLK);                           //...en el flanco de bajada del CLK
  55.     //  delay_us(1);
  56.    }
  57. //////BYTE MSB DE SIGNO////////////////////////////
  58.    for(i=0;i<7;++i) {                                   //los 7bits mas significativos de msb...
  59.       output_high(DS1620_CLK);                         
  60.     //  delay_us(1);
  61.       output_low(DS1620_CLK);                           //...no interesan, solo interesa el bit menos significativo
  62.     //  delay_us(1);
  63.    }
  64.  
  65.    bit_sig=input(DS1620_DQ);                            //bit menos significativo de MSB[1=negativo ; 0=positivo]
  66.  
  67.    output_low(DS1620_RST);                              //fin de la comunicacion!
  68.  
  69. ////EL ULTIMO BIT DE LSB NOS DICE SI ES NUMERO ENTERO o X.5//////////  
  70.    if(bit_test(data_lsb,0)==0)                          //¿es numero entero?
  71.         i=0;                                            //SI -> flag que indica numero es entero
  72.    else
  73.         i=1;                                            //NO -> flag que indica numero decimal X,5
  74.  
  75. ////LA VARIABLE bit_sig NOS DICE SI ES POSITIVA O NEGATIVA LA TEMP////////////
  76.    if(bit_sig==0){                                      //¿es positivo? bit_sig=0 -> temp positiva
  77.         data_lsb>>=1;                                   //SI -> tratamiento del dato
  78.         if(i==0)                                        //¿es temperatura entera?
  79.                 temp=data_lsb+0.0;                      //SI -> temp= x.0
  80.         else
  81.                 temp=data_lsb+0.5;                      //NO -> temp= x.5  
  82.    }                   
  83.    else{                                                //NO -> temp negativa: tratamiento de la informacion:
  84.         data_lsb>>=1;                                   //desplazo el dato hacia la derecha 1bit
  85.         data_lsb|=0x80;                                 //el bit mas significativo lo pongo a 1 (por bit_sig)
  86.         data_lsb-=1;                                    //complemento a 2
  87.         data_lsb=(~data_lsb);                           //complemento a 1
  88.         if(i==0)                                        //¿es temperatura entera?
  89.                 temp=-(data_lsb+0.0);                   //SI -> temp= -x.0
  90.         else
  91.                 temp=-(data_lsb+0.5);                   //NO -> temp= -x.5
  92.         }
  93.  
  94.    return temp;                                         //devuelve temperatura
  95. }

Bueno la verdad que he tardado en realizar la libreria ya que actualmente en el mercado existen dispositivos similares controlados por el bus i2c e incluso por el bus 1-wire....pero como veia que por privados utilizabais la libreria BETA que puse de este dispositivo pues me he animado a realizar una libreria ya en condiciones del mismo!!!jeje


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: [LIBRERIA CCS] DS1620
« Respuesta #1 en: 26 de Mayo de 2006, 07:05:13 »
En el post de Ejemplitos en C para 16F648A , concretamente el numero 58, se basa en el uso de la libreria vs_ds1620.c, quedando asi explicada la libreria y probada!!!

PD: El modelo que trae consigo PROTEUS del dispositivo ds1620 no asume numero decimal, pero la libreria si lo asume para su funcionamiento real.


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: [LIBRERIA CCS] DS1620
« Respuesta #2 en: 01 de Noviembre de 2009, 15:40:16 »
Esta libreria aun sigue siendo Beta o ya hay alguna nueva vercion ?

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: [LIBRERIA CCS] DS1620
« Respuesta #3 en: 03 de Noviembre de 2009, 10:09:12 »
La librería que te descargas "es tal cual está", no he realizado ningún cambio ni revisión.


Un saludo.
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte