DS18B20 Sıcaklık Ölçme Sorunum Var

Başlatan conqueror3, 13 Mart 2009, 19:54:52

conqueror3

Merhaba arkadaşlar bugün gittim şirin mi şirin bir DS18B20 sıcaklık sensörü aldım. Ancak CCS derleyicim de bu entegrenin driver dosyası olmadığı için internetten hazır bulduğum aşağıdaki kodu kullandım.


//Bu kodu ds18b20.c olarak kaydettim

#define ONE_WIRE_PIN PIN_A1
void onewire_reset()

{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 ); // sensörün hazırlanması için beklenir.
output_float(ONE_WIRE_PIN);
}

void onewire_write(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // Sensöre yazma işlemine başlamak için 1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,
delay_us( 2 ); // 1us'den fazla beklenir.
}
}

int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
return( data );
}

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;
delay_ms(200);
return(result);
}



Sonra ccs de sıcaklık ölçümü için de şöyle basit bir program kullandım :

#include <16f877A.h>
#fuses XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#include <ds18b20.c>

float temp;

void main()
{
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_CCP1(CCP_OFF);
  setup_CCP2(CCP_OFF);
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  lcd_init();

  while(1)
  {
  temp= ds1820_read();
 
  printf(lcd_putc,"\fSicaklik:%5.1f'C",temp);
  delay_ms(1000);
  }

}


Ancak ne olduysa oldu sıcaklık olması gereken değerden farklı değerler gösteriyor. Resimde gördüğünüz gibi entegreden sıcaklık 20 dereceye ayarlanmasına rağmen ekranda 160 gösteriyor.



Bunun sebebi ne olabilir acaba?

Sensörün driver dosyasında problem olabilir mi? Elinizde sağlam bir driver dosyası var mı acaba?

Ayrıca, 1-wire haberleşmesi için kullanmak zorunda kaldığım A1 pinini değiştirip kendi istediğim başka bir pinden iletişim sağlamayı nasıl becerebilirim?

Yardımlarınızı rica ediyorum. Saygılar.

kostebek

Bende de öyleydi. Aldığın değeri 10 a böl :):F:D valla öyle yaptım niye bilmiyorum

conqueror3

Aldığımız değeri 10 a bölelim de bu sefer de,

16 derece için 20 derece gösterecek, arada 4 derece fark var onu napıcaz?


conqueror3

Ama sen DS18S20 kullanmışsın DS18B20 de hatalı oluyor.  Ulan yine karaköye gidicez DS18S20 almaya anlaşılan :@

İyi de 18B20 de neden sorun oluyor ya bunu çözebilecek kimse yokmu?

tnen

hocam okudugun degeri 8 e bol.DS18S20 DS18B20 ve DS1820 nin hasasiyetleri fabrika çıkışı farklıdır. Mesela birine 0.5 C adımlarla giderken digerinde 0.125 C ardımlarla gider.Data sheetde bahsediyordur sanırım bundan

conqueror3

tnen işe yaradı süpersin ya karaköye gitmekten kurtuldum :)

Allah razı olsun kardeşim :)

conqueror3

Şimdi de şöyle bir sorun var, sıcaklık ilk başta 85 i gösteriyor sonra normal değerine dönüyor. Bu neden olabilir?

Programa sıcaklık okudunduktan sonra bir kaç saniye delay koyarak bunu da hallettim gibi ama arada bekleme süresi oluyor o zaman da.

mucit07

yardım almak isteyenler   arkadaşlar msn adresim marvelm@w.cn

gevv

 

kara_kalem

ARkadaşlar merhaba, bende aynı seriden bir sensör kullanıyorum yeni bir başlık açmak istemedim.
Kullandığım sensör ds18s20 P

kullandığım program ds18b20 ile sorunsuz çalışıyor

P oldugundan dolayı 3 pinden besleme pini boşta bırakılıyor. bağlantıları data  shetine göre yaptım fakat sadece 85 gösteriyor. çeşitli forumlarda pullup direncini yükseltmekten bahediliyordu bende 4.7k olan direnci 10k denedim yine bi ihtimal diyerek 2.2k denedim sonuç aynı...
programda 18s20 okunurken 750us lik gecikme yapılması öneriliyor, onuda denedim ama sonuç aynı. Sanırım donanımla ilgili biryerde hata yapıyorum.
kullandığım program;

void onewire_reset()

{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 ); // sensörün hazırlanması için beklenir.
output_float(ONE_WIRE_PIN);
}

void onewire_write(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // Sensöre yazma işlemine başlamak için  1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,
delay_us( 2 ); // 1us'den fazla beklenir.
}
}

int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
return( data );
}

ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);

delay_us(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;

printf("%f\n\r",result);
}