Autor Tema: problema con sensor ds1820  (Leído 2044 veces)

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

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
problema con sensor ds1820
« en: 07 de Octubre de 2012, 21:33:57 »
Hola estoy tratando de convertir mi rutina en assembler a C para hacer un termometro con el ds1820 y unos displays de 7 segmentos pero al simularlo en proteus no me muestra nada. Si fijo la temperatura y la muestro, si funciona pero al tratar de leer el dato del termometro no me muestra la temperatura del sensor, yo adapte una libreria:

Código: [Seleccionar]
// (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_A4

/*******************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 );
}
y esta:
Código: [Seleccionar]
float ds1820_read()
{
 int8 busy=0, temp1, temp2;
 signed int16 temp3;
 float result;

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

 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);
}
para que me de solo la parte entera de la temperatura:

Código: [Seleccionar]
int8 ds1820_read()
{
 int8 busy=0, temp1, temp2,result;

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

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

 onewire_reset();
 onewire_write(0xCC);
 onewire_write(0xBE);
 temp1 = onewire_read();
 temp2 = onewire_read();
 result=temp1;
 delay_ms(200);
 return(result);

no se cual sera el problema, me ayudan, les paso los archivos.

https://dl.dropbox.com/u/50978562/termometroC%20dallas.rar

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: problema con sensor ds1820
« Respuesta #1 en: 08 de Octubre de 2012, 11:51:41 »
Hola Soymoe:
             Encontré este post que quizá te pueda ayudar.
http://www.todopic.com.ar/foros/index.php?topic=19691
                 Saludos.
                     Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problema con sensor ds1820
« Respuesta #2 en: 08 de Octubre de 2012, 12:21:21 »
Pero para que muestre solo la parte entera, en el original, solo declara result como int8  ;-)


Saludos!

No contesto mensajes privados, las consultas en el foro

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: problema con sensor ds1820
« Respuesta #3 en: 08 de Octubre de 2012, 19:13:11 »
el problema que tengo ahora es que el digito de la unidad parpadea y no queda fijo, el valor de la temperatura la actualizo cada 1 seg mediante interrupcion de timer 0, alguien me da la solucion?Adjunto un video.

Archivos proyecto:
https://dl.dropbox.com/u/50978562/termometro3%20dallas.rar
« Última modificación: 10 de Octubre de 2012, 17:00:08 por soymoe »

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: problema con sensor ds1820
« Respuesta #4 en: 28 de Julio de 2013, 20:52:33 »
Hola Gracias a todos ya solucione el problema, era por la velocidad de refresco del display, le agrege llamadas a la rutina de display entre las lineas de la rutina de lectura de la temperatura