1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...
Nis
22nd

DS18B20 Sürücü Programı

ds18b20.jpg

Maxim/Dallas firması tarafından üretilen DS18B20 sıcaklık algılayıcısı en fazla 0.5 derecelik hata ile -55 ile +125 dereceler arası ölçüm yapabilmekte ve sıcaklık bilgisini sayısal olarak vermektedir. DS18B20 gibi sayısal çıkış veren sıcaklık algılayıcılarının kullanımı ile analog/sayısal dönüştürücü kullanımına gerek kalmamaktadır.

ds18b20bag.jpg

Ayrıca parazit besleme özelliÄŸi sayesinde harici besleme kaynağına gerek almadan sıcaklık bilgisi okunabilmektedir. Sensörün Pic’e baÄŸlantısı apılırken yapılacak tek ÅŸey DQ data hattına 4.7 k’lık bir pull up direnciyle +5 volta baÄŸlanması olacaktır. AÅŸağıda verilen sürücü programı devrede sadece bir Ds18B20 varken çalışacaktır. Ayrıca buradan kablosuz sıcaklık ölçümünün nasıl yapılacağına dair bilgi edinebileceÄŸiniz dökümana ulaÅŸabilirsiniz.

//Bu kodu ds18b20.c olarak kaydediniz

// (C) copyright 2003 j.d.sandoz / jds-pic !at! losdos.dyndns.org #define ONE_WIRE_PIN PIN_C7 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); }

Örnek uygulama Progamı:


#include <16F877A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000) 

#include
#include 

void main()
{
float temperature; 

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC); 

lcd_init();
lcd_putc(”\f”); 

while (1)
{
  temperature = ds1820_read(); 

   printf(lcd_putc,”Sicaklik:\n %3.1f derece”, temperature);
   delay_ms(250;)
 } 

}


Benzer Yazılar


10 Yorum “DS18B20 Sürücü Programı”

  1. Erhan Kas 11, 2008

    Merhaba ben aynı uygulamayı yaptım. Yalnız şöyle bir problem var

    Simulasyonda çalışıyor ama derece olarak 187 derece gibi gösteriyor. Sebebi ne olabilir.

  2. oguz Ara 17, 2008

    bekleme zamani ds18b20 icin yetereli degil kataloguna bakarsaniz 8 bit cozunurluk icin en az 750 ms bekleme suresi gerektigini gorursunuz. bence 187 gostermesnin sebebi budur.

  3. Ali Oca 5, 2009

    örnek programda hatalar var include satırı boş bırakılmış

    #include
    #include

    şeklinde olmalı

    ayrıca keslemer karakter hatası veriyor ” ÅŸeklinde deÄŸiÅŸtirin

    en sondaki bekleme satırınıda noktalı virgülü parantez den sonra koyup derleyebilirsiniz

    alttaki satırıda görüldüğü şekilde düzeltin 187 yi 18.7 göreceksiniz

    temperature = ds1820_read()/10,0; yapınız

  4. osman Åžub 23, 2009

    iki tane DS18B20 den değer alacaksak program nasıl olmalıdır..

  5. admin Åžub 23, 2009

    http://www.ccsinfo.com/forum/viewtopic.php?t=37746&postdays=0&postorder=asc&highlight=ds18b20&start=0

    birden fazla kullanacaksan aynı hat üstünden sensörün içindeki numaraya göre bilgi göndermen gerekecektir bu da işleri oldukça karıştırmakta.
    Eğer sadece iki tane kullanacaksan ve hafıza prolemin yoksa aynı fonksiyonları isimlerini değiştirerek kopyala ve sensöre farklı bir pin ata bence daha kolay olur

  6. Nur Nis 7, 2009

    Merhaba benim anlamadığım DS18B20′yi hangi pine baÄŸlayarak iletiÅŸim saÄŸladığımız. (pic16f877 için)

  7. admin Nis 7, 2009

    programda ilk başta aşağıdaki satır yer almakta

    #define ONE_WIRE_PIN PIN_C7

    burada pin_c7 yerine istediÄŸinizi kullanabilirsiniz

  8. Nur Nis 7, 2009

    Bende 0.5 göstermesinin sebebi ne olabilir acaba?

  9. admin Nis 7, 2009

    sonuçmu 0.5 derece gözüküyor?
    aşağıdaki örneği inceleyiniz
    http://ccspic.com/projeler/ds18b20-ve-ds1302-ile-lcd-termometre-saat.html

  10. Ali Gökşin Haz 14, 2009

    ds18b20.c sürücü programında yapılan hata:
    sensorun kataloğu incelendiğinde, temp1 yazmacının LSB tarafındaki 4 bitinin sıcaklık değerinin ondalık kısmına karşılık geldiği görülür. Ancak, temp1 ve temp2 int8 olarak tanımlandığından;
    temp3=make16(temp2,temp1); satırında temp1′in LSB 4biti tam sayı deÄŸermiÅŸ gibi temp3′e aktarılır. Bu da temp3′ün olması gereken deÄŸerden 16 kat fazla olduÄŸu anlamına gelir(yani 2′nin 4. kuvveti kadar). Bu problemin düzeltilmesi için sürücü kodunda
    result = (float) temp3 / 2.0; satırının yerine
    result = (float) temp3 / 16.0; yazılmalı ve
    uygulama programındaki
    temperature = ds1820_read(); satırında herhangi bir manipülasyon yapılmamalıdır.
    Aksi takdirde, 16 ya bölünmesi gereken deÄŸerin sürücüde 2′ye bölünüp uygulama programında tekrar 10′a bölünerek, toplam 20′ye bölünmesi ile sıcaklık deÄŸeri olması gerekenden eksik okunacaktır.

    Ali Gökşin
    Elektronik Müh.

Yorum yapın