Autor Tema: Libreria DS1820  (Leído 39494 veces)

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

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Libreria DS1820
« Respuesta #30 en: 16 de Noviembre de 2010, 02:04:23 »
Hola!

Posteo la librería modificada, para los siguientes modelos/modos: DS1820 o DS18S20 con alimentación desde pin Vdd o bien alimentación desde pin DQ(alimentación parásita).

También cambié la búsqueda del archivo touch.c a la carpeta de drivers del CCS, y no a la carpeta del proyecto.

* Si NO se utiliza alimentación parásita, no hace falta modificar nada más que el PIN donde se conectará el sensor. Modifiqué la rutina para que una vez comenzada la petición de conversión realice "read-time slots" hasta que el sensor indique que ha finalizado la conversión. Esto asegura que la demora sea mínima al querer leer el resultado de una conversión.

* Si se utiliza alimentación parásita, hace falta declararlo. Esto se realiza decomentando la línea:
//#define   PARASITE

y a continuación, hace falta declarar qué modelo se esta utilizando, esto puede hacerse decomentando alguna de las dos lineas segun corresponda:
   //#define     DS1820
   //#define     DS18S20

En este tipo de alimentación, se espera mediante un delay_ms() el tiempo correcto según el modelo elegido. No puede realizarse un polling del estado de la conversión como en el caso de alimentación NO parásita.

Espero que sirva.

Código: C#
  1. ////////////////////////////////////////////////////////////////////////////
  2. ////   Library for a Dallas 1820/18S20 Temperature chip                 ////
  3. ////                                                                    ////
  4. ////   init_temp();          Call before the other functions are used   ////
  5. ////                                                                    ////
  6. ////                                                                    ////
  7. ////   d = read_full_temp(); Read the temp in degrees C (0 to 125)      ////
  8. ////                                                                    ////
  9. ////////////////////////////////////////////////////////////////////////////
  10.  
  11.  
  12. #ifndef DS1820_PIN
  13.    #define DS1820_PIN  PIN_A2
  14. #endif
  15.  
  16. #define TOUCH_PIN  DS1820_PIN
  17. #include <touch.c>
  18.  
  19. //uncomment if your using parasite power
  20. //#define   PARASITE
  21.    //if your using parasite power, you must specify the model you're using.
  22.    //#define     DS1820
  23.    //#define     DS18S20
  24.  
  25. #ifdef   PARASITE
  26.    #ifdef   DS1820
  27.       #define      waitForConversion()        delay_ms(500);       //check http://www.maxim-ic.com/datasheet/index.mvp/id/3021 to see why this value...
  28.    #else  
  29.       #ifdef   DS18S20
  30.          #define      waitForConversion()        delay_ms(750);    //check http://www.maxim-ic.com/datasheet/index.mvp/id/3021 to see why this value...
  31.       #endif
  32.    #endif
  33. #else
  34.    #define        waitForConversion()         while(!touch_read_bit());
  35. #endif
  36.  
  37. void init_temp() {
  38.  
  39. }
  40.  
  41. float read_full_temp()
  42. {
  43.     BYTE i, buffer[9];
  44.     float minstep;
  45.  
  46.     if (touch_present()) {         // get present (reset)                    (2)
  47.         touch_write_byte(0xCC);    // Skip ROM                               (3)
  48.         touch_write_byte (0x44);   // Start Conversion
  49.        
  50.         waitForConversion();
  51.        
  52.         touch_present();           // get present (reset)                    (5)
  53.         touch_write_byte(0xCC);    // Skip ROM                               (6)
  54.         touch_write_byte (0xBE);   // Read Scratch Pad
  55.  
  56.         for(i=0; i<9;i++)          // read 9 bytes                           (7)
  57.             buffer[i] = touch_read_byte();
  58.     }
  59.  
  60. //minstep = (float)(buffer[0]/2)-0.25+((float)( buffer[7]-buffer[6])/buffer[7]);
  61.      if(buffer[1]){
  62.       minstep = (float)(-1)*(~make16(buffer[1],buffer[0])+1)/2;
  63.      }else{
  64.       minstep = (float)(make16(buffer[1],buffer[0])/2);
  65.      }
  66.       minstep = minstep - 0.25 + ((float)( buffer[7] - buffer[6])/buffer[7]);
  67.       return (minstep);
  68. }

Saludos.
« Última modificación: 16 de Noviembre de 2010, 02:08:41 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado blackburne44

  • PIC10
  • *
  • Mensajes: 13
Re: Libreria DS1820
« Respuesta #31 en: 08 de Noviembre de 2011, 18:45:49 »
Hola amigos de todopic! Yo he utilizado la librería aportada por Maxluis, en la simulación del proteus me funciona perfecto ( vale aclarar que la temperatura la muestro en un lcd gráfico), pero a la hora de hacerlo en hardware real, al principio solo me mostraba "85.0 °C" ( pero me di cuenta que en el código faltaba darle los "750 uS" necesarios para que convierta la temperatura, ya que estoy utilizando un DS18B20). Al agregarle este valor, lo volvi a probar, pero me encontre con que muestra "127.9 °C", y se queda "atorado" en esa temperatura, sin variación alguna  :oops: . Ya no se con que probar jajaja. Si a alguien le sirve, le dejo el código:

Citar
#include <termometro.h>
#include <HDM64GS12.c>
#include <graphics_1.c>
#include <1wire.c>
#include <ds1820.c>
#include <eeprom.c>


int8 Pro[]= "PROYECTO";
int8 Ter[]= "TERMOMETRO";
float temperatura_antigua ;
float temperatura_nueva ;
char palabra [16],palabra2 [16];
int8 guar[]= "Guardando";
int8 tempe[]= "Temperatura";
int8 trans[]= "Transmitiendo...";
float resultado;


void main()
{
  setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
 
  glcd_init(ON);
  delay_ms(20);
  glcd_rect(10,10,110,58,no,on);
  glcd_rect(18,18,68,28,no,on);
  glcd_rect(38,38,100,48,no,on);
  glcd_text57(20,20,Pro,1,on);
  glcd_text57(40,40,Ter,1,on);
  delay_ms(1500);
  glcd_fillScreen(0);
  glcd_rect(10,25,110,42,no,on);
 
while (1) {

  temperatura_nueva = ds1820_read ();                      // Se vuelve a leer el sensor y este valor se escribe
                                                           // en una nueva variable

if (temperatura_nueva != temperatura_antigua){             // Se compara la temperatura vieja con la nueva
  glcd_rect(50,30,105,40,yes,OFF);                          // Se borra la temperatura vieja
  sprintf(palabra,"TEMP = %3.1f &C",temperatura_nueva);    // Se vuelve a crear un array de valores
  glcd_text57(15, 30,palabra, 1, ON);
  temperatura_antigua = temperatura_nueva ;
  }

if (input(PIN_A0)){
  glcd_text57(2, 10,guar, 1, ON);
  glcd_text57(60, 10,tempe, 1, ON);
  guardar(temperatura_nueva,0);
  delay_ms(1500);
  glcd_rect(2,10,126,20,yes,off);
  }

if (input(PIN_A1)){
  glcd_text57(10,50,trans,1,on);
  delay_ms(1500);
  leer(resultado,0);
  sprintf(palabra2,"Temperatura = %f",resultado);
  printf (palabra2);
  glcd_rect(10,50,110,60,yes,off);
  }
}
}

1wire:

Citar
// (C) copyright 2003 j.d.sandoz / jds-pic !at! losdos.dyndns.org

// released under the GNU GENERAL PUBLIC LICENSE (GPL)
// refer to http://www.gnu.org/licenses/gpl.txt

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

/***********************1Wire Class***********************/
/*Description: This class handles all communication */
/* between the processor and the 1wire */
/* sensors.
/*********************************************************/

/*-------1-wire definitions-------*/
#define ONE_WIRE_PIN PIN_C2

/*******************1-wire communication functions********************/

/************onewire_reset*************************************************/
/*This function initiates the 1wire bus */
/* */
/*PARAMETERS: */
/*RETURNS: */
/*********************************************************************/

void onewire_reset()  // OK if just using a single permanently connected device
{
 output_low(ONE_WIRE_PIN);
 delay_us( 500 ); // pull 1-wire low for reset pulse
 output_float(ONE_WIRE_PIN); // float 1-wire high
 delay_us( 500 ); // wait-out remaining initialisation window.
 output_float(ONE_WIRE_PIN);
}

/*********************** onewire_write() ********************************/
/*This function writes a byte to the sensor.*/
/* */
/*Parameters: byte - the byte to be written to the 1-wire */
/*Returns: */
/*********************************************************************/

void onewire_write(int data)
{
 int count;

 for (count=0; count<8; ++count)
 {
  output_low(ONE_WIRE_PIN);
  delay_us( 2 ); // pull 1-wire low to initiate write time-slot.
  output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // set output bit on 1-wire
  delay_us( 60 ); // wait until end of write slot.
  output_float(ONE_WIRE_PIN); // set 1-wire high again,
  delay_us( 2 ); // for more than 1us minimum.
 }
}

/*********************** read1wire() *********************************/
/*This function reads the 8 -bit data via the 1-wire sensor. */
/* */
/*Parameters: */
/*Returns: 8-bit (1-byte) data from sensor */
/*********************************************************************/

int onewire_read()
{
 int count, data;

 for (count=0; count<8; ++count)
 {
  output_low(ONE_WIRE_PIN);
  delay_us( 2 ); // pull 1-wire low to initiate read time-slot.
  output_float(ONE_WIRE_PIN); // now let 1-wire float high,
  delay_us( 8 ); // let device state stabilise,
  shift_right(&data,1,input(ONE_WIRE_PIN)); // and load result.
  delay_us( 120 ); // wait until end of read slot.
 }

 return( data );
}

ds1820:

Citar
float ds1820_read()
{
 int8 busy=0, temp1, temp2;
 signed int16 temp3;
 float result;

 onewire_reset();
 onewire_write(0xCC);
 onewire_write(0x44);
 delay_ms (750);

 while (busy == 0)
  busy = onewire_read();

 onewire_reset();
 onewire_write(0xCC);
 onewire_write(0xBE);
 temp1 = onewire_read();
 temp2 = onewire_read();
 temp3 = make16(temp2, temp1);
 
//result = (float) temp3 / 2.0;   //Calculation for DS18S20 with 0.5 deg C resolution
 result = (float) temp3 / 16.0;  //Calculation for DS18B20 with 0.1 deg C resolution
 
 delay_ms(200);
 return(result);
}

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: Libreria DS1820
« Respuesta #32 en: 11 de Noviembre de 2011, 19:06:55 »
Aupa!

Solo queria dar las gracias por el gran aporte que habeis hecho y comentaros las experiencias que he tenido por si a alguien le sirven de ayuda:

  • He probado tanto el DS18B20 como el DS18S20.
  • He probado ambas librerias, tanto la de Micro_Pepe[/b] como la de Maxluis.
  • La unica combinacion satisfactoria que he conseguido ha sido con el DS18S20 usando la libreria de Micro_pepe.
  • El resto de combinaciones me devuelven o valores negativos (-3041.00) o valores como 0.25 o 10.63

De todas formas, habiendo conseguido funcionar uno, me quedo mas que contento por el momento, otro dia espero tener mas tiempo para conseguir una buena respuesta por parte de los DS18B20 y a poder ser tambien a la libreria de Maxluis.

Un saludo!

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: Libreria DS1820
« Respuesta #33 en: 07 de Abril de 2012, 20:41:03 »
Quería comentar que yo programe mi librería del sensor para un micro 8051 que viene en la librería de Proteus. Una vez que quedo funcionando perfectamente armé el hardware y cuando le cargue el código  no funcionaba.  Había pequñas diferencias en los tiempos con respecto al Proteus que impedia que el circuito real funcione. Entonces agarre un osciloscopio digital y pude ajustar el código. Es decir, la logica del código era la correcta pero había una diferencia entre el simulador y la practica.
¿ A alguien le sucedio algo similar ó sera problema de la libreri del sensor ds18s20 que conseguí ?

Desconectado XAVING

  • PIC10
  • *
  • Mensajes: 1
Re: Libreria DS1820
« Respuesta #34 en: 03 de Mayo de 2012, 03:18:38 »
Hola a todos, bueno estube viendo este hilo y me parecio muy interesante, aunque lamentablemente
no cuento con este sensor pero bueno no interesa la idea es aprender como funciona, ademas cuento
con Proteus y sobra decir que es mucha ayuda. Asi que me puse a simular ambos codigos y pude notar
las siguientes diferencias:

- El codigo que compartio micro pepe tiene una respueta mas corta.
- El segundo codigo de maxluis posee un error de conversión que lo hace menos preciso.

Ademas introducion una interrupción en funcion a TMR1 como lo comento MLO y funciona correctamente
eso para comprobar lo que comentaron antes.

Quiero recalcar que todo esto lo comento en función a los resultados obtenidos en simulación.
No obstante como comento el amigo Cryn o alguien quien posea este sensor podria confirmar o no
lo dicho anteriormente.

Adjunto la simulación en Proteus para que alguno pueda verla y comente.

Gracias a todos por compartir conocimientos.....KCIRE

NOTA.- Utilizo la versión 7.2 SP6 de Proteus





buenos dias a todos lo ingenieros y estudiante de electronica..


les comparto este proyecto basado en este post la modificacion del termometro de ds18s20 full programado  en pic16f877A.

Aqui se los dejo

gracias a todos....

Desconectado luisjavi27

  • PIC10
  • *
  • Mensajes: 2
Re: Libreria DS1820
« Respuesta #35 en: 02 de Julio de 2013, 20:24:48 »
hola,

se que el tema es algo antiguo pero alguien me puede ayudar con 2 cosas.

Primera: el DS1820 es igual al DS18S20

Segunda: donde puedo encontrar el modelo de estos que se pueda simular en
proteus por que solo me aparece el esquematico del DS18S20.


Gracias

Desconectado solapower

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 209
Re: Libreria DS1820
« Respuesta #36 en: 03 de Julio de 2013, 04:02:00 »
El DS1820 y el DS18S20 son iguales, los dos hacen la conversión a 9 bits.
El DS18B20 es diferente porque es configurable la conversión a 9 ó 12 bits.

Para simular en  Proteus te sirve el DS18S20.

Saludos

Desconectado luisjavi27

  • PIC10
  • *
  • Mensajes: 2
Re: Libreria DS1820
« Respuesta #37 en: 03 de Julio de 2013, 12:30:31 »
Muchas gracias, ya pude simularlo, ahora viendo las caracteristicas del DS18S20 veo que tiene alarmas configurables por el usuario, pero no hay nada de eso ni en la libreria ni en el foro  :(  alguien sabe como hacerlo ?

Desconectado hayn

  • PIC10
  • *
  • Mensajes: 39
Re: Libreria DS1820
« Respuesta #38 en: 30 de Septiembre de 2013, 23:09:05 »
buenas noches a todos los compañeros de este prestigioso foro, estoy tratando se hacer en proteus una simulación con el ds18b20, utilizo el pic16f628a y lo que quiero hacer es que me envié por el puerto virtual del proteus  la temperatura, todo esto es para implementar de manera física un cultivo hidroponico de ambiente controlado. cuando lo eche a andar muestro fotos etc. aquí esta el código de ante mano gracias a todos :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Desconectado hayn

  • PIC10
  • *
  • Mensajes: 39
Re: Libreria DS1820
« Respuesta #39 en: 01 de Octubre de 2013, 15:18:41 »
buenas tardes a todos, mi pregunta es puede alguien revisar el codigo y darme su opinion????

Desconectado dlgomez

  • PIC10
  • *
  • Mensajes: 1
Re: Libreria DS1820
« Respuesta #40 en: 11 de Mayo de 2014, 12:07:39 »
Hola buenas, alguien podría mostrar una imagen del proteus, tengo dudas a que patas hay que conectar el DS18b20 y la lcd, gracias por adelantado.

Desconectado josefe

  • PIC12
  • **
  • Mensajes: 68
    • mi blog http://freespacejd.blogspot.com
Re:Libreria DS1820
« Respuesta #41 en: 27 de Octubre de 2015, 14:27:29 »
.......

Estoy usando el  codigo de micro_pepe para leer un ds18b20 pero me arroja solo valor negativo, lei aca mismo que faltaba una resistencia entre la salida del ds18b20 y el pin pero sigue igual.

Estoy usando un 16f887

Dejo el codigo y como lo tengo en proteus

Código: [Seleccionar]
#include "D:\Proyectos electronica\DS18B20 2015\codigo_0_0_0_0_3\main.h"

////////////////////////////////////////////////////////////////////////////
////   Library for a Dallas 1820 Temperature chip                       ////
////                                                                    ////
////   init_temp();          Call before the other functions are used   ////
////                                                                    ////
////                                                                    ////
////   d = read_full_temp(); Read the temp in degrees C (0 to 125)      ////
////                                                                    ////
////////////////////////////////////////////////////////////////////////////


#ifndef DS1820_PIN
   #define DS1820_PIN  PIN_B0
#endif

#define TOUCH_PIN  DS1820_PIN
#include "touch.c"
void init_temp() {

}

float read_full_temp()
{
    byte i, buffer[9];
    float minstep;

    if (touch_present()) {         // get present (reset)                    (2)
        touch_write_byte(0xCC);    // Skip ROM                               (3)
        touch_write_byte (0x44);   // Start Conversion
        delay_ms(200);             // delay 200 ms                           (4)
        touch_present();           // get present (reset)                    (5)
        touch_write_byte(0xCC);    // Skip ROM                               (6)
        touch_write_byte (0xBE);   // Read Scratch Pad

        for(i=0; i<9;i++)          // read 9 bytes                           (7)
            buffer[i] = touch_read_byte();
    }


//minstep = (float)(buffer[0]/2)-0.25+((float)( buffer[7]-buffer[6])/buffer[7]);
     if(buffer[1]){
      minstep = (float)(-1)*(~make16(buffer[1],buffer[0])+1)/2;
     }else{
      minstep = (float)(make16(buffer[1],buffer[0])/2);
     }
      minstep = minstep - 0.25 + ((float)( buffer[7] - buffer[6])/buffer[7]);
      return (minstep);
}


#fuses NOWDT,HS, NOPUT, NOPROTECT,NOLVP,BROWNOUT //Oscillator mode HS
//#use delay(clock=40000000) //Clock speed HZ = 20MHZ
#define use_portd_lcd //define for use port d lcd
#define DS1820_PIN  PIN_A2
#define use_portd_lcd TRUE
#include "lcd.c"


void main() {
   float minstep;
   int16 a;
   int b;
   lcd_init();
   do {
         minstep = read_full_temp();
         printf (lcd_putc,"\fTemp :%3.2f C", minstep);
         delay_ms(1000);
   } while (TRUE);


}


PD: Los parchos blancos son para ahorrar tamaño en el JPG  :P

Desconectado josefe

  • PIC12
  • **
  • Mensajes: 68
    • mi blog http://freespacejd.blogspot.com
Re:Libreria DS1820
« Respuesta #42 en: 27 de Octubre de 2015, 17:46:38 »
Adjunto Codigo C (Proyecto en CCS y Diseño de Proteus)

Adjunto nueva imagen de Proteus con el resultado


* todopic.jpg
(139.35 kB, 790x610 - visto 1003 veces)

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Libreria DS1820
« Respuesta #43 en: 04 de Diciembre de 2018, 18:57:12 »
Alguno pudo rehacer el código para el DS18B20 ??

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 214
Re:Libreria DS1820
« Respuesta #44 en: 07 de Diciembre de 2018, 18:56:11 »
la respuesta a tu pregunta,  está en el mensaje número cinco de ésta conversación,  y solo tenés que retocar el delay,  dejarlo en 750mS, segun hoja de datos.