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 :)
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
Ş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:
ç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...