ds18b20 negatif sıcaklık küsüratı hesaplama

Başlatan yamak, 29 Mayıs 2011, 16:28:22

yamak

Merhaba arkadaşlar ds18b20 de negatif sıcaklıkların küsüratının hesaplanması nasıl bilen varsa anlatabilir mi?Pozitif sıcaklıklar düzgün çalışıyo ama negatif sıcaklıklara inince küsürat kısmında hata oluyo datasheetinde bir kaç örnek vermiş ama mantığını tam anlayamadım.

The Gariban

Data sheetin linkini ekleyin anlayamadığınız bölümü burada  izah edin yardımcı olmaya çalışayım.

yamak

Ben aslında bi mantık oluşturdum am doğruluğundan tam emin değilim.Mantık şöyle:
küsürat kısmına ait olan 4 biti alıyorum pozitif değerler için olanın sol tarafındaki bitlerin komplementini alıyorum.Örneğin 0.125 için olan bit 3.bit olduğundan 0010 i 1110 yapıyorum.farkettiyseniz 1. bitin sol tarafındaki bitler 0 olduğu için 1 e dönüştü. Biraz karışık oldu ama ancak böyle anlatabildim:)Bu mantık biraz tuhaf olduğundan kafama tam yatmadı siz  daha güzel bir hesaplama yöntemi bulabilirseniz sevinirim.datasheet in linki aşağıdadır.
www.wulfden.org/downloads/datasheets/DS18B20.pdf

The Gariban

#3
Ben pdf de anlamadığınız yeri sormuştum.
Ayrıca sıcaklık değerini okumanın bir mantığı ve algoritması varken ne yapmaya çalıştığınızı anlayamadım doğrusu.Yani sistemin nasıl çalıştığını henüz bende bilmiyorum ama birkaç gün içinde benzer bir uygulama yapmam gerektiği için benimde öğrenmem gerekiyor


yamak

#4
Pozitif değer için ds18b20 içindeki registerların aldığı değerlerin algoritması farklı negatif değerler için farklı.datasheet in 3. sayfasına bakarsanız ne demek istediğimi daha iyi anlarsınız.örneğin +10.125 derece için TH ve TL register larının değerleri "0000 0000 1010 0010" iken -10.125 derece için "1111 1111 0101 1110".Burada  ilk 4 bit virgülden sonraki kısmı hesaplama için daha sonraki 8  bit  tam kısmı hesaplama için, yüksek değerlikli 4 bit ise sıcaklığın negatif mi pozitif mi olduğu belirtmek için.Negatif değerlerin tam kısmı için registerların komlementini alıp 4 bit sağa kaydırınca doğru sonuç çıkıyo ama negatif değerlerde virgülden sonraki kısmın hesaplanması nasıl anlayamadım.
Ayrıca sıcaklık değerini okumanın bir mantığı ve algoritması varken ne yapmaya çalıştığınızı anlayamadım doğrusu.
demişsiniz. Eğer datasheet de algoritamayı belirten bir yer varsa söyler misiniz?Ben bulamadım da.

omereliusuk

#5
If TERM>60000 Then 'sıcaklık - değerde ise
TERM_ONDA=(TERM.LowByte//16)
TERM_ONDA=(TERM_ONDA*10)/16 
TERM_TAM= TERM>>4
TERM_TAM =((4096-TERM_TAM)*10) - TERM_ONDA
Else
TERM_ONDA=(TERM.LowByte//16) 'sıcaklık + değerlikli ise
TERM_ONDA=(TERM_ONDA*10)/16 
TERM_TAM= TERM>>4
TERM_TAM =(TERM_TAM*10) + TERM_ONDA
EndIf

if (bit_test(data[1],7)){
sicaklik=(((4096-((make16(data [1],data [0]))>>4)))*10)-(((data[0]%16)*10)/16);}
else{sicaklik=(((make16(data [1],data [0]))>>4)*10)+(((data[0]%16)*10)/16)  ;}

Klein

floating point işlem yapabiliyorsan  lsb ve msb verilerini int sayıya çevir. sonra 0.0625 ile çarp. elde edeceğin değer sıcaklık olacaktır. negatif ya da pozitif farketmez. 

temp=(ow_lsb+(ow_msb << 8))*0.0625;


OG edit, kod da smile problemi düzeltmesi

yamak

#7

Negatif veya pozitif farketme diyosunuz ama yukarıda verdiğim örnekte negatif için farklı pozitif için farklı sonuç çıkıyo.
Alıntı Yapörneğin +10.125 derece için TH ve TL register larının değerleri "0000 0000 1010 0010" iken -10.125 derece için "1111 1111 0101 1110"

Klein

#8
eğer th ve tl değerlerini unsigned int olarak toplarsan  olmaz. int olarak toplayacaksın.  DS1820 nin sistemi bildiğimiz işaretli sayı sistemi. 
işaretli sayı sisteminde  değer şöyle bulunur.
elimizde 16 bit sayı olsun.
eğer sayı işaretsiz ise  0x00 = 0  ,  0xFFFF = 65535 olur.  Ama işaretli ise  0x00=0  , 0xFFFF = -1 olur.  0xFFFE = -2 olur.  bu durmda sayımızın en yüksek değeri artık 65535 değil +32767dir.

şöyle anlaman daha basit olur.
8 bitlik bir sayın olsun.  bu ayının değeri 0 olsun. sen bu ayının değerini 1 azaltırsan sayı 255  = 0xFF olur , bir daha azaltırsan 254 = 0xFE olur. Sayının gerçek değeri budur. Ama eşer sayıyı işaretli olarak görmek istersen  0 değerini 1 azalttığında -1 olur.  bu da 255'e eşittir. 

ekleme: Toplamı 0.0625 ile çarpmak yerine değeri 16 ya bölebilirsin.  Float yaparsan küsuratlı , int yaparsan tamsayı alırsın.

yamak

Alıntı Yapeğer th ve tl değerlerini unsigned int olarak toplarsan  olmaz. int olarak toplayacaksın.  DS1820 nin sistemi bildiğimiz işaretli sayı sistemi. 
işaretli sayı sisteminde  değer şöyle bulunur.
elimizde 16 bit sayı olsun.
eğer sayı işaretsiz ise  0x00 = 0  ,  0xFFFF = 65535 olur.  Ama işaretli ise  0x00=0  , 0xFFFF = -1 olur.  0xFFFE = -2 olur.  bu durmda sayımızın en yüksek değeri artık 65535 değil +32767dir.

şöyle anlaman daha basit olur.
8 bitlik bir sayın olsun.  bu ayının değeri 0 olsun. sen bu ayının değerini 1 azaltırsan sayı 255  = 0xFF olur , bir daha azaltırsan 254 = 0xFE olur. Sayının gerçek değeri budur. Ama eşer sayıyı işaretli olarak görmek istersen  0 değerini 1 azalttığında -1 olur.  bu da 255'e eşittir. 

ekleme: Toplamı 0.0625 ile çarpmak yerine değeri 16 ya bölebilirsin.  Float yaparsan küsuratlı , int yaparsan tamsayı alırsın.
Teşekkür ederim olayın böyle olduğunu bilmiyodum.

The Gariban

#10
Teşekkürler Klein
Bu konu ile ilgili daha fazla yardım istemiştim ama aşağıdaki adreste yeteri kadar açıklama var
http://www.elektronikmagazin.com/page.php?id=42
Tekrar teşekkürler