DS18B20 hatası

Başlatan enrique_iglesias, 24 Kasım 2008, 19:21:47

enrique_iglesias

Arkadaşlar 18b20 ile yapılmış bir sürü örnek var ve hesabı aşağıdaki gibi verilmiş :
'----------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
SICAKLIKOKU: 
'-----------------DİKKAT İSİS'de BU SATIR AKTİF EDİLECEK----------------------
'           ham=$ff5e:Gosub hesapla:return 'NORMAL ÇALIŞMADA BU SATIR SİLİNECEK
'------------------------------------------------------------------------------
           OWOUT   sicaklik, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    sicaklik, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   sicaklik, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    sicaklik, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
             
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"  
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10 
       GOTO GEC   
    endif
    TEMP = 625 * (HAM+1)        '  
    ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    FLOAT = (ISI //1000)/100
    ISI=ISI/1000
RETURN


şimdi bir şey sormak istiyorum biz LCDOUT $FE,1,#ISI,".",#float dediğimizde ekranımızda ISI'yı görüyoruz...

Anlamadığım bir şey var yukarıdaki hesapta ISI değişkenine hiç bir hesaplanmış veri atanmıyor veya ben göremiyorum TEMP ve HAM değişkenleri dışında bir herde hesap yapılmıyor..

yani en azından ISI=TEMP falan olmalı değilmi ama yinede sıcaklığı ekranda görebiliyoruz bu nasıl iş anlamadım :)

ete

Formülde 32 bitlik bir hesap ver ve gerçek ısı orda hesaplanıyor,
TEMP = 625 * (HAM+1)    'bu işlemin sonucu ara bir hafızada tutuluyor    '
ISI = DIV32 10    'sonra ara hafızadaki değer DIV32 10 komutu ile 10'a bölünüp sonuç ISI isimli değişkene atılıyor.

Bu iki satırın anlamınıda yazmak gerekir ise,
Ham değerini bir artırıp 625 ile çarpıyoruz ve çıkan sonucu TEMP değişkenine atıyoruz.
Sonra  ISI = TEMP/10 diyor ve 32 bitlik bir sayıyı 10'a bölüp sonucu ISI değişkenine veriyoruz.
Senin göremediğin bu olsa gerek.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

hatmeto

Şunuda kullanabilirsin.

'******* sensor Okuma ***************
ds18b20yi_oku:
   owout dq, 1,[$CC, $44]
   pause 750
   owout dq, 1,[$CC, $BE]
   owin DQ, 0, [deger.LowByte, deger.HighByte]
   DERECE=DEGER/16
   'LCDOUT $FE ,$C0, DEC DERECE
   Return
:oops: baya işe yaramıştı. işlem hızı biraz daha hızlı... :roll:
Bir admin ataasözü derki: "biliyorsan paylaş mod yapsınlar. bilmiyorsan sus banlamasınlar"

enrique_iglesias

çookk teşekkür ederim şimdi daha iyi anladım kaç gündür onu düşünüyordum ama ara hafıza diye bir şey bilmiyordum yani bu 65536 dan büyük bir veri ve ara hafızada tutuluyor ve ordaki veriyi div32 10 ile işlem yapıp yazılabilir bir değişkene atıyoruz :)

sayın ete çok teşekkür ederim verdiğiniz bilgi için

sayın hatmeto dostum ayrıca hesap için teşekkür ederim...