DS1820'de ölçüm hatası

Başlatan efe1409, 04 Temmuz 2006, 20:52:28

efe1409

Arkadaşlar DS1820 ile ölçüm yaparken sıcaklığı +3.31 derece olarak okuyorum.Forum'daki linkleri incelediğimde bu tip sensörlerin  ROM kodlarında 28h bilgisinin sıcaklık sensörü tipi olduğu yazıyor.Fakat elimdeki sensörlerin ROM kodlarındaki tip bilgisini 10h olarak okuyorum.Sensör tiplerinin farklı olması bu hataya sebep olabilirmi?Okuma hatasını nasıl düzeltebilirim.Teşekkürler.
Vatanın bağrına düşman dayamış hançerini, Yok mudur kurtaracak bahtı kara maderini (Anasını)                                                                       Namık Kemal

PhD

Selam arkadaşım,

DS1820 mi yoksa DS18B20 mi? Eğer DS18B20 ise sıcaklık bilgisini direk ekrana aktaramazsın. Şimdi hatırlamıyorum ama datasheet e bakarsan bir kaydırma işlemi vardı sanırım ondan sonra gerçek sıcaklık bilgisini elde edebiliyordun. Sorunun bunla alakalı olabilir...

Kolay gelsin.
...hiç...

efe1409

Kullandığım sensör DS1820
Vatanın bağrına düşman dayamış hançerini, Yok mudur kurtaracak bahtı kara maderini (Anasını)                                                                       Namık Kemal

PhD

Eğer bu yanlış haliyle bile sıcaklık değişimleri görüyorsanız büyük bir ihtimalle DS1820 sağlam demektir. Ve DS1820, DS18S20 bu modellerden sıcaklık bilgisini direk alabilirsiniz ekstra bir işleme gerek yok.

Sanırım sizin programla ilgili bir hatanız var gibi görünüyor. Yani bilgiyi elde ettikten sonra yaptığınız işlemlerde bir sorun var gibi...
...hiç...

efe1409

Bu kodlarla sıcaklığı okuttum ama birden fazla sensör kullanmam gerekiyor.İşlemei bu kodlarla nasıl yapabilirim.
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1
DEFINE LCD_LINES 4
DEFINE      osc 4         ' Kullanılan kristal 4 Mhz.
ADCON1=7

i       var     byte            ' Loop sayacı
temp    var     word            ' Storage for temperature
DQ      var     PORTE.2        ' DS1820'nin okunacağı pin ve port numarası
DQ_DIR  var     TRISE.2         'DS1820'nin haberleşme pin ve port numarası
command var byte
derece con 223
ID VAR BYTE[8]
ADCON1 = 7              ' PORTA ve PORTE portlarını digital giriş veya çıkış yap
Pause 100              ' LCD'nin çalışma gecikmesi
'*********** SICAKLIK OKUMA PROGRAMI*********************************
mainloop:
       Gosub init1820          'Ds1820'yi ayarla
       command = $cc           ' Issue Skip ROM command
       Gosub write1820
       command = $44           ' Start temperature conversion
       Gosub write1820
       Pause 2000      ' Wait 2 seconds for conversion to complete
       Gosub init1820          ' Do another init
       command = $cc           ' Issue Skip ROM command
       Gosub write1820
       command = $be           ' Read the temperature
       Gosub write1820
       Gosub read1820
'        gosub romkod
' Display the decimal temperature
       Lcdout $fe, 1,"   ODA SICAKLIGI    "
       LCDOUT $FE,$C6,dec (temp >> 1),".",dec(temp.0 * 5),derece,"C"
       LCDOUT $FE,$94,"0",command.0," ",hex command.1," ",HEX COMMAND.2," ",HEX COMMAND.3," ",HEX COMMAND.4," ",DEC COMMAND
        gosub romkod
       Goto mainloop           ' Do it forever
' Initialize DS1820 and check for presence
init1820:
       Low DQ                  ' Set the data pin low to init
       Pauseus 500             ' Wait > 480us
       DQ_DIR = 1       ' Release data pin (set to input for high)
       Pauseus 100             ' Wait > 60us
       If DQ = 1 Then
          gosub sensoralarmi
'        Lcdout $fe, 1, "ISI SENSORU KOPUK"
       Pause 500
       Goto mainloop   ' Başa Dön
       Endif
       Pauseus 400     ' Wait for end of presence pulse
       Return
'DS1820 'yi yazma byte gönder
write1820:
 For i = 1 to 8          ' Byte'ın 8 biti
   If command.0 = 0 Then
       Gosub write0      ' 0.bite yaz.
         Else
          Gosub write1    ' 1.bite yaz.
            Endif
               command = command >> 1  ' Command değişkenini gelecek bite kaydır.
       Next i
       Return
'Ds1820 nin 0.bitine yaz.
write0:
       Low DQ
       Pauseus 60         ' 60us bekle
       DQ_DIR = 1         'Data pini bilgi almaya hazır yani INPUT oldu.
       Return
'Ds1820 nin 1.bitine yaz.
write1:
       Low DQ                  ' 15us bekle
@       nop                     ' Gecikme 1us 4MHz için
       DQ_DIR = 1        'Data pini bilgi almaya hazır yani INPUT oldu.
       Pauseus 60             ' Use up rest of time slot
       Return
' DS1820'den sıcaklık oku.
read1820:
       For i = 1 to 16         ' 1 word'ün 16 biti
               temp = temp >> 1   'Bitleri aşağıya kaydır
               Gosub readbit   ' Şimdi sıcaklığı oku
       Next i
       Return
'DS1820'den sıcaklığı oku
readbit:
       temp.15 = 1             ' Sıcaklık durumunu oku (-)veya(+)
       Low DQ                  ' Start the time slot
@       nop                     ' Delay 1us at 4MHz
       DQ_DIR = 1        ' Release data pin (set to input for high)
       If DQ = 0 Then
         temp.15 = 0     ' 15.biti 0 yap
       Endif
       Pauseus 60              ' Wait out rest of time slot
       Return
       End
'********************************************************
'     ROM KODUNU OKU
'********************************************************
romkod:
      OWOUT DQ, 1, [$33]  ' Issue Read ROM command
ID_Loop:
   OWIN DQ,0, [STR ID \ 8]' Read 64-bit device data into the 8-byte array "ID"
   LCDOUT $FE,$D4,HEX ID[0],HEX2 ID[1],HEX2 ID[2],HEX2 ID[3],HEX2 ID[4],HEX2 ID[5],HEX2 ID[6],HEX2 ID[7]
   RETURN
'*********************************************************
'      SENSÖR KOPU ALARM MESAJI
'********************************************************            
sensoralarmi:
Lcdout $fe, 1, "ISI SENSORU KOPUK"
return
Vatanın bağrına düşman dayamış hançerini, Yok mudur kurtaracak bahtı kara maderini (Anasını)                                                                       Namık Kemal

efe1409

Arkadaşlar sorunu çözdüm ilgilenen herkese teşekkürler.
Vatanın bağrına düşman dayamış hançerini, Yok mudur kurtaracak bahtı kara maderini (Anasını)                                                                       Namık Kemal

PhD

Alıntı yapılan: "efe1409"Arkadaşlar sorunu çözdüm ilgilenen herkese teşekkürler.

Selam arkadaşım sorunu çözdüğüne sevindim. Ama sorun neymiş nasıl çözdün bizimle paylaşırsan aynı hataya düşen arkadaşlar açısından iyi olur sanırım.

Kolay gelsin. :)
...hiç...

efe1409

Aşağıdaki kodlarla sıcaklık bilgisi DS1820 için doğru olarak okunur.Isı artışı 0.5 derecedir.Yalnız öncelikle DS1820'nin ROM kodları okunmalıdır.Her sensör için bu kodlar ayrıdır.
sensor1:    
   OWOUT DQ,1, [$55,$10,$F7,$45,$8F,$00,$08,$00,$02,$44]  'İlgili adresi resetle sonra dataları aç($10,$F7,$45,$8F,$00,$08,$00,$02 ROM kodlarıdır.)
calis:
   owin dq,4,[start]
    if start=0 then calis
    owout dq,1,[$55,$10,$F7,$45,$8F,$00,$08,$00,$02,$BE]  'Sıcaklık bilgisini oku sonra reset($10,$F7,$45,$8F,$00,$08,$00,$02 ROM Kodlarıdır.)
    owin dq,2, [temp.lowbyte,temp.highbyte]
Lcdout $fe, $C0 ,"PV=" ,dec (temp>>1),".",dec(temp.0*5),derece,"C"
    return
Vatanın bağrına düşman dayamış hançerini, Yok mudur kurtaracak bahtı kara maderini (Anasını)                                                                       Namık Kemal

nonstradam

Alıntı YapArkadaşlar DS1820 ile ölçüm yaparken sıcaklığı +3.31 derece olarak okuyorum.Forum'daki linkleri incelediğimde bu tip sensörlerin ROM kodlarında 28h bilgisinin sıcaklık sensörü tipi olduğu yazıyor.Fakat elimdeki sensörlerin ROM kodlarındaki tip bilgisini 10h olarak okuyorum.Sensör tiplerinin farklı olması bu hataya sebep olabilirmi?Okuma hatasını nasıl düzeltebilirim.Teşekkürler.

efe1409 aynı dert benimde başımda iki gündür uyuyamıyorum. bende sıcaklığı +3.31 civarında bişey okuyorum. sigaramı ds1820 ye değdirdim 12 dereceden yukarı çıkmadı. ben hi-tech te yazıyorum progoramı. sen sorunu buldum demişsin neredeydi sorun hocam. çalışmalarında başarılar.

ise

ds1820, ds18s20, ds18b20   hepsi birbirinden farklı aile kodlu sensörlerdir.
ds18b20  kontrol registerinden 9-12 bit arasında ayarlanabilir.   ds 1820 göre yazılmış bir programda derecenin çok yukarı çıkması gözlenemez. derece değeri  msb -lsb registerinde ortak tutulur.  derece 4 bit daha ilerdedir. ds18b20 pdf içerisinde çok daha detaylı açıklamalar yapılmıştır...  

   
#ifdef  ds18b20
 unsigned char Temp;
 Temp=(Msb<<4) | (Lsb>>4);
#endif

#if  defined(ds18s20) | defined(ds1820)
 unsigned char Temp;
 Temp=(Lsb>>1);
#endif

alidinckan

Arkadaşlar DS18B20 sıcaklık sensörü kullanarak bir datalogger yaptım. Oda sıcaklığını ölçerken sorun yok fakat sensörü buzdolabının buzluğuna yerleştirdiğimde -14 -16 gibi dereceleri görüyorum. Fakat her ne hikmetse bir süre sonra -2 -1 gibi dereceler görmeye başlıyorum. Bu neden olabilir?

Benim fikrim. Sonuçta sıcaklık sensörü üzerinden de akım geçiyor. Kendisini az da olsa ısıtıyordur. Bu nedenle hava sirkulasyonu olmadığında yanlış ölçüyordur. Bu arada dolabın kapağını açıp kapadığımda yine doğru ölçmeye başlıyor.

Ne önerirsiniz?