Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

DS18B20 Sıcaklik okuma sorunu

Başlatan electro22, 22 Nisan 2008, 15:09:48

electro22

Merhaba,

CCS C ve PIC16F877 kullaniyorum. DS18B20 den one wire haberlesme yolu ile sicaklik bilgisi okumaya calisiyorum, fakat basarili olamadim kodlarim asagidaki gibi,
one wire haberlesme icin
/*-------1-wire definitions-------*/
#define ONE_WIRE_PIN PIN_C0

/*******************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 );
}


Ds18B20 den sicaklik okumak icin

float ds1820_read()
{
  int8 busy, lsb, msb;
  signed int16 temp3;
  float result;


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

  do
  {
    busy = onewire_read();
printf(lcd_putc, "\fBusy = %X", busy);
delay_ms(400);
  } while (busy == 0xFF);

  onewire_reset();
  onewire_write(0xCC);
  onewire_write(0xBE);

  lsb = onewire_read();  
  msb = onewire_read();
printf(lcd_putc, "\f%X, %X", lsb, msb);
delay_ms(1000);



  temp3 = make16(msb, lsb);


  result = (float) temp3 / 16.0; //0.1 deg C resolution
printf(lcd_putc, "\f%f", result);
delay_ms(1000);


  return result;
}


main cod ise:

void oku()
{
  float temperature;

 
  while (1)
  {
    lcd_init();
    lcd_gotoxy(1,1);
    delay_ms(750);        
    temperature = ds1820_read();
    printf(lcd_putc,"TEMP: %3.1f ", temperature);
    lcd_putc(223);
    lcd_putc("C    ");


  }
}



Nerede yanlislik oldugunu bulabilecek arkadaslar lutfen bi bakin

iyonosfer

Bu kodu derleyebildin mi CCS'te? Sorunu biraz daha ayrıntılı yazarsan daha iyi yardımcı oluruz.
void oku()
{
  float temperature;

c de main() fonksiyonu olmadan program olmaz.

void main()
{
  float temperature;

seklinde düzeltilmezse derlenemez kod. ama sen bunu buraya yazarken değiştirip yazdıysan ayrı mevzu.
Blog Sayfam: www.teknobakis.com

electro22

main kısmı cok uzun oldugu icin gondermedim. Yolladigim senin nasil derleniyor dedigin kisim fonksiyon kismi.
main kısmında switch case yapisi kullaniyorum. Program derleniyor, sorun surekli FF okumam ;
float ds1820_read()
{
  int16 busy;
  int8 lsb, msb;
  signed int16 temp3;
  float result;
  onewire_reset();
  onewire_write(0xCC);
  onewire_write(0x44);
  delay_ms(400);
  do
  {
    busy = onewire_read();
printf(lcd_putc, "\fBusy = %X", busy);
delay_ms(400);
  } while (busy == 0xFF);

  onewire_reset();
  onewire_write(0xCC);
  onewire_write(0xBE);

  lsb = onewire_read();
  msb = onewire_read();
printf(lcd_putc, "\f%X, %X", lsb, msb);
delay_ms(1000);

  temp3 = make16(msb, lsb);
  result = (float) temp3; /// 16.0; //0.1 deg C resolution
printf(lcd_putc, "\f%f", result);
delay_ms(1000);

  return result;
}


burada busy FF de takili kaliyor anladigim kadariyla cunku LCD de sadece BUSY FF yaziyor ve bekliyor.

MURSEL

ds1820 nin  data ucunu pulp ile + ver  muhtemelen cözülür ilk okumada  gercekleşiyor sanırım 85  degeri fakat 2 cikez okutursan  arkaya arkaya gercek degeri alırsın  proteus simalasyonlarında  belirtttigin şekilde sorunlar oluşuyor ben yazılımda  1kereligine  ilk başta 2 kez okuyorum sonraları   1kez okuyup sıcaklık degerini alarak çözmüştüm   neden öyle oluyor sorusunada  bilgim yok arkadasşım ;) kolay gelsin

aliveli

Dediğin programı gerçek dervede mi kurdun proteustamı denedin?
Aynı kodlarla yaptığım saat/termometre devresi hatasız çalışmıştı