TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micro_pepe en 15 de Diciembre de 2007, 10:46:35

Título: Libreria DS1820
Publicado por: micro_pepe en 15 de Diciembre de 2007, 10:46:35
Hola, aqui os dejo una libreria en CCS para el sensor de temperatura DS1820, la pega es que consume mucha memoria, si alguien conoce una libreria mejor que la pegue.

Código: [Seleccionar]
////////////////////////////////////////////////////////////////////////////
////   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);
}

Aqui un ejemplo de uso:

Código: [Seleccionar]
#include <16F876.h> //Standard header file
#fuses NOWDT,HS, NOPUT, NOPROTECT,NOLVP,BROWNOUT //Oscillator mode HS
#use delay(clock=20000000) //Clock speed HZ = 20MHZ
#define use_portd_lcd //define for use port d lcd
#define DS1820_PIN  PIN_A2
#define use_portb_lcd TRUE
#include "lcd.c"
#include "ds1820.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);


}
Título: Re: Libreria DS1820
Publicado por: Nocturno en 16 de Diciembre de 2007, 07:39:42
Gracias micropepe
Título: Re: Libreria DS1820
Publicado por: maxluis en 16 de Diciembre de 2007, 09:47:13
Estimado nocturno: Yo use en un proyecto que "estaba armando" estas dos y funcionaba.
en la 1wire defines el pin.( fueron posteadas en este gran foro )
Saludos.
Maxluis.
Título: Re: Libreria DS1820
Publicado por: Cryn en 16 de Diciembre de 2007, 21:11:14
he probado tu libreria y tu codigo micro_pepe, esta muy bueno, funciano mbien, dentro mi cuarto ahora estoy en 22ºC jeje
por afuera ya va 18.56ºC ... .36 ta muy bueno :mrgreen:

mas o menos en cuanto tiempo toma la temperatura del ambiente?? tiene que ver con las clases de termodinamica a las que no atendi? :oops:

sigue bajando, ya van como 5 minutos, jeje

ahora me toca probar el otro codiog que dejo maxluis :mrgreen:
Título: Re: Libreria DS1820
Publicado por: Cryn en 16 de Diciembre de 2007, 21:38:57
he utilizado las otras dos librerias, en mi 16f648a y he visto estas diferencias:

para en de maxluis:
1. ocupa menor cantidad de memoria, compilado con el 4.058 de ccs, en ROM me ocupa 27% y en RAM 4%
2. siempre va decrementando o incrementando de .5 en .5

para el de micro_pepe:
1. ocupa mayor cantidad de memoria, compilado con la misma version: ROM=40% y RAM=5%
2. incrementa y decrementa con valores a veces muy pequeños .12 .6 .7, osea, creo que es mas exacto, claro considerando el error del ds1820, pero lo hace muy bien

un comentario, me parece que el de micro_pepe esta mejor diseñado, a costa de memoria, pero es el mejor diseño :mrgreen:
claro que sin desmeritar al otro q tb funciona mbien :)

un saludo y gracias a ambos por los aportes!!! justo lo que buscaba :mrgreen:
Título: Re: Libreria DS1820
Publicado por: maxluis en 16 de Diciembre de 2007, 22:28:27
Estimado Cryn:Revisa en la libreria ds1820 ( 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 ) y ahi le activas, a mi me resulto bien en la tarjeta real (0.1 grados de resolucion), aun que al simular en el proteus solamente se movia de .5 en .5...
saludos.
Maxluis.
Título: Re: Libreria DS1820
Publicado por: Cryn en 16 de Diciembre de 2007, 23:43:55
si maxluis, me he fijado ahi, y he cambiado al linea comentada por la otra, osea prove ambos, y con el DS1820 que tengo asi sin ninguna letra mas, el unico que funciona es el de .5 de resolucion, y el otro no funciona correctamente con el ds qeu tengo, ya que el valor de temperatura leido se va como a 2 y algo grados, seguramente funcionara con otro integrado pero beuno ahi ya viste los resultados que obtuve con ambas librerias y con el mismo integrado :mrgreen:

un saludo
Título: Re: Libreria DS1820
Publicado por: micro_pepe en 17 de Diciembre de 2007, 20:25:51
Yo aun estoy esperando el pedido de los DS1820, pero en el proteus funciona de lujo.

La libreria no la hice yo, la saque de otro foro, pero me pareció buena idea colgarla aqui.

1 saludo.
Título: Re: Libreria DS1820
Publicado por: Cryn en 18 de Diciembre de 2007, 00:10:53
valga la aclaracion :mrgreen: jeje

si muy buena idea colocarlo aquie, jeje porque talvez ni lo hubiera intentado buscar en otrso lados, jeje
todo lo busco por aca y si no encuentro ni modo, jejeje, si es muy urgente lo busco pòr el san google, jeje

un saludo, gracias por el aporte
Título: Re: Libreria DS1820
Publicado por: pelusac en 25 de Diciembre de 2007, 16:35:57
Es posible que esta librería sólo funcione con el DS1820  y no en el DS18S20 ??????
Tengo un DALLAS 18S20p, he probado esta librería y a mi no me funciona, me da una temperatura disparatada -0.25.
Ni que decir tiene que tiene conectada su resitencia de 4K7 a Vdd en su linea de datos como dice el datasheet .

Gracias de antemano, saludos y felices fiestas.
Título: Re: Libreria DS1820
Publicado por: Cryn en 26 de Diciembre de 2007, 16:35:23
probaste tambien con la libreria que dejo maxluis??

ya que hay una linea en la libreria que dice:

// Calculation for DS18B20 with 0.1 deg C resolution (se que no es tu integrado pero, nose talvez sean compatibles)

que esta comentada, dependiendo de cual uses cambias la linea comentada, talvez te sirva, nose, prueba y nos avisas
Título: Re: Libreria DS1820
Publicado por: pelusac en 27 de Diciembre de 2007, 14:07:56
Sí que la probé pero nada de nada empiezo a pensar que el sensor está defectuoso.
He probado con todas las recomendaciones de este hilo con sus respectivos códigos:

 http://www.todopic.com.ar/foros/index.php?topic=17216.msg115490#msg115490

Sigue mostrándome temperaturas disparatadas . Tengo otro DS18S20 por ahí, así que voy a buscarlo primero y después a probarlo a ver si consigo algo.
Saludos.
Título: Re: Libreria DS1820
Publicado por: micro_pepe en 02 de Enero de 2008, 21:09:23
Hola pelusac: ¿Estas usando interrupciones en tu programa? el DS1820 no puede ser interrumpido mientras esta realizando la conversión.

1 saludo.
Título: Re: Libreria DS1820
Publicado por: Cryn en 03 de Enero de 2008, 00:03:59
caray, eso no lo habria pensado, entonces a deshabilitar interrupciones cuando se lea el ds1820 :mrgreen:
Título: Re: Libreria DS1820
Publicado por: pelusac en 03 de Enero de 2008, 17:44:16
Hola, no he utilizado ninguna interrupción. He usado el código de ejemplo propuesto por Micro_pepe unos post más arriba.
Todavía no he encontrado el otro DS18S20 así que no he podido probar con otro sensor.
Saludos
Título: Re: Libreria DS1820
Publicado por: duarfel en 11 de Abril de 2008, 22:55:14
Hola he estado probando la libreria para el ds1820 y no me ha funconado, lo unico que cambie respecto al prog de micro_pepe fue el pic ya q estoy usando el 877A y tbm los pines de la lcd pero siempre me esta mostrando  -0.25ºC o 2,75º.. queria saber si por utilizar otro pic deberia cambiar algo mas de la libreria o cual podria ser el problema.. Gracias
Título: Re: Libreria DS1820
Publicado por: Cryn en 12 de Abril de 2008, 11:11:42
raro raro, yo hasta use un 16f648a y un 16f684 hasta use flex_lcd y me ha funcionado muy bien, revisa el codigo quiza haya alguna linea o algun fuse colado por ahi.

de todas maneras en cunato llegue a casa puedo colgar el codigo que yo hice, qeu es muy similar al que dejaron por aqui :mrgreen:

un saludo
Título: Re: Libreria DS1820
Publicado por: Cryn en 13 de Abril de 2008, 11:22:23
siempre me esta mostrando  -0.25ºC o 2,75º..

ahora que recuerdo, me paso lo mismo una vez, y era por falta de la resistencia de pullup, porque el codigo está muy bien, el que mehas pasado por privado.

creo que la falla debe ir en la resistencia de pullup de 4.7k del pin 2 a vcc

(http://embedded-system.net/embedded-system/images/dallas-ds1820-circuit.gif)

espero sea eso, un saludo
Título: Re: Libreria DS1820
Publicado por: duarfel en 13 de Abril de 2008, 16:22:25
 Sii.. era eso.. Ya me funciona.. Gracias de nuevo... :-)
Título: Re: Libreria DS1820
Publicado por: Cryn en 14 de Abril de 2008, 00:05:06
que bueno que era eso, proqeu si no era eso era para tirar todo por la ventana :D :D

enhorabuena, un saludo :mrgreen:
Título: Re: Libreria DS1820
Publicado por: MLO__ en 15 de Mayo de 2008, 15:50:09
Hola amigos del foro.

He probado la libreria posteada aqui, pero al simularla en proteus con el DS18S20, se demora casi un segundo en actualizar el dato!!!!!
Es normal eso??? Ojeando el datasheet encontre un tiempo por ahi, que es de 10mS???? Ademas, dice que no debe haber actividad mientras se convierte el valor de temperatura, entonces el micro queda deshabilitado para atender otras rutinas????

Gracias de antemano por la ayuda.

Saludos
Título: Re: Libreria DS1820
Publicado por: Cryn en 17 de Mayo de 2008, 00:11:59
que raro, yo tenia un 1820 sin la 'S' y me funcionaba muy bien, quiza haya q ver un poquito sobre eso, aunque proteus es una tontera, quiza por la velocidad no se aprecie nada bien, yo lo probe directo en real y dio perfecto, asi q intenta armarlo y a ver como se ve

si no debe haber actividad, debes deshabilitar las interrupciones (si es q usas alguna) para q realice una buena conversión

Título: Re: Libreria DS1820
Publicado por: MLO__ en 20 de Mayo de 2008, 11:26:52
Hola.

Pues nada, que han sido varias cosillas las que he modificado para que fucionara.

1. Cambie el sensor!!! parece que el que tenia era de un lote viejo y me leia una absurda temperatura de -96C !!!!!!!
2. La conexion HW la puse en Parasity Power
3. El delay que aparece en la libreria debe ser de como minimo 750mS y no 200mS

Lo he puesto a adquirir la temperatura mientras tengo activa la interrupcion del Timer0 haciendo parapadear un led y funciona bien.... voy a hacer mas pruebas a ver que pasa.

Saludos
Título: Re: Libreria DS1820
Publicado por: kcire en 23 de Mayo de 2008, 17:20:40
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


(http://img185.imageshack.us/img185/151/ds1820xa7.png)
Título: Re: Libreria DS1820
Publicado por: MLO__ en 23 de Mayo de 2008, 19:55:52
Hola kcire

Bienvenido al foro.  :mrgreen: :mrgreen:

Yo probe el sensor DS18S20 montado en Hardware con 3 interrupciones, una con el Timer0, otra con el Timer1 y con RDA, y ma he funcionado bien. Utilice la libreria del CCS para el 1920 y no me ha dado ningun problema.

Como comente antes, la forma de conectarlo ha sido en "Parasity Power" es decir con Vdd y GND del sensor conectados a tierra y la inmodificable resistencia de pull up. La modificacion que necesitan las librerias anteriores para que funcionen en hardware real es el tiempo de espera para la conversion, no debe ser de 200mS si no de 750mS como minimo, de no hacerlo asi, solo despliega en el Hyperterminal el valor de 85C ( para el DS18S20, porque creo que el amigo Cryn lo probo con el DS1820 y le funciono bien).

En la simulacion, este tiempo no afecta en nada, de hecho lo que hacia era poner la simulacion al 100% del procesador, pero entregaba la temperatura ( proteus tiene sus cosas  :-) ).

Para el cambio de resolucion hay que tener en cuenta que sensor se va a utilizar, ya que el DS18B20 es el que tiene el byte de configuracion de resolucion hasta los 12 bits ( para el cual hay que esperar como minimo 750mS tambien ). Ese no lo he probado en HW  :( :( no lo he encontrado.

Saludos
Título: Re: Libreria DS1820
Publicado por: Cryn en 24 de Mayo de 2008, 18:40:14
hola kcire, que bueno es saber q gente paisana tb ronda por acá a veces, bienvenido compatriota ojala te veamos seguido por aca en el foro :mrgreen:

en efecto como dice MLO_ yo utilicé el ds1820 sin ninguna letra mas y ambas librerias sin modificar nada me dieron resultado y no tengo el q tiene la B o la S y por ello no he hecho otra prueba :(

pero como menciona MLO_ y le ha funcionado muy bien pues asi creo q se va completando más la libreria

ahora creo q queda arreglar la libreria, osea q la seleccion del sensor sea configurado al comienzo tb con un #define DS1820 true
ó #define DS18S20 true
ó #define DS18B20 true

eso creo q va en la libreria con un #IF DEFINE o algo asi, pero no es tan complicado, recuerdo haberlo visto aca por el foro, me deje entender?

bueno de todas maneras lo veré e intentaré hacer la "mejora" a la librería

vale, un saludo para todos y en especial para mi paisano kcire
Título: Re: Libreria DS1820
Publicado por: kcire en 24 de Mayo de 2008, 21:53:01
Gracias  por la bienvenida MLO y Cryn.......espero participar activamente y llegar algun dia a niveles como los suyus compartiendo conocimientos............. :-/

Saludos
Título: Re: Libreria DS1820
Publicado por: alexysar en 15 de Julio de 2009, 01:41:42
Estoy intentando hacer funcionar un sensor ds18S20 y después de romperme la cabeza un buen rato me dí cuenta que mi modelo de proteus es esquemático nada más, me falta el modelo de simulación.
Como veo que hay gente que lo pudo simular en Proteus, quería preguntarles de donde sacaron el modelo de simulación del sensor?


PD: tengo la version Profesional ISIS 7.4 SP3
Título: Re: Libreria DS1820
Publicado por: MLO__ en 15 de Julio de 2009, 15:00:02
Hola.

En la version que yo tengo: 7.4 SP3, ya lo tiene incluido.

Saludos
Título: Re: Libreria DS1820
Publicado por: alexysar en 15 de Julio de 2009, 15:59:21
Si, que raro que mi Proteus no lo traiga :!:. De todas formas ya cosegui la libreria. Gracias
Ahora a programarlo!!!
Título: Re: Libreria DS1820
Publicado por: BrunoF 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.
Título: Re: Libreria DS1820
Publicado por: blackburne44 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);
}
Título: Re: Libreria DS1820
Publicado por: Strepto 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:


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!
Título: Re: Libreria DS1820
Publicado por: alexysar 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í ?
Título: Re: Libreria DS1820
Publicado por: XAVING 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


(http://img185.imageshack.us/img185/151/ds1820xa7.png)


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....
Título: Re: Libreria DS1820
Publicado por: luisjavi27 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
Título: Re: Libreria DS1820
Publicado por: solapower 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
Título: Re: Libreria DS1820
Publicado por: luisjavi27 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 ?
Título: Re: Libreria DS1820
Publicado por: hayn 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:
Título: Re: Libreria DS1820
Publicado por: hayn 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????
Título: Re: Libreria DS1820
Publicado por: dlgomez 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.
Título: Re:Libreria DS1820
Publicado por: josefe 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
Título: Re:Libreria DS1820
Publicado por: josefe 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

 - Tienes que ingresar para ver archivos adjuntos -
Título: Re:Libreria DS1820
Publicado por: martinchd en 04 de Diciembre de 2018, 18:57:12
Alguno pudo rehacer el código para el DS18B20 ??
Título: Re:Libreria DS1820
Publicado por: AleSergi 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.
Título: Re:Libreria DS1820
Publicado por: sebaso97 en 25 de Febrero de 2020, 19:07:11
Hola a todos, he estado leyendo un poco y me ha sido de gran utilidad las librerías y los comentarios de los compañeros para mi proyecto..
pero en mi caso trabajo con un DS18B20, por lo que he leído, aun así modificando el tiempo de lectura de 750 ms en dicha librería no se corrige el error de medición de este sensor.

¿Alguien pudo implementarlo en algún circuito o pudo probar físicamente la funcionalidad del DS18B20? Si es del caso modificar la librería o algo en el programa les agradezco si me ilustran, me imagino que cambia debido a que este es configurable de 9 a 12 bits.

Les agradezco mucho por su ayuda!!