 | Elektrotekno.com Elektronik ve Teknoloji Merkezi
| | Yazar | Mesaj | onurbilke | | Tarih: 15.12.2007, 19:38 Mesaj konusu: ds18b20 yardım? | |
| ds18b20 ile sıcaklık okuması yaptırıyorum fakat değişkeni word tanımlamama ramen ekrandan okuduğum en yüksek sıcaklık değeri 64 c daha yukarısını gösteremiyorum. 18b20 nin kataloğunda max 125 c gösterir diyo tahminim değişkenin kapasitesi yetmiyo 65535 te kalıyo oda 64 c ye karşılık geliyo. pic basic pro kullanıyorum.
sensor_oku: 'sıcaklığı oku ve ekrana yaz
owout comm_pin, 1, [$cc, $44]' ısı değerini oku
bekle:
owın comm_pin, 4, [busy] ' busy değerini oku
ıf busy = 0 then bekle ' hala meşgulmü? , evet ise goto bekle..!
owout comm_pin, 1, [$cc, $be]' scratchpad memory oku
owın comm_pin, 2, [ham.lowbyte, ham.highbyte]' iki byte oku ve okumayı bitir.
gosub hesapla
return
hesapla: ' ham değerden santigrat derece hesabı
sign = "+"
ıf sıgn_bıtı = negat_ısı then
sign = "-"
temp=($ffff-ham+1)*625
ısı = dıv32 10
goto gec
endif
temp = 625 * (ham+1) '
ısı = dıv32 10 ' div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
gec:
float = (ısı //1000)/100
ısı=(ısı/1000)-1
sicaklik=ısı
lcdout $fe,$80," "
lcdout $fe,$80, "sıcaklık :", #sicaklik,0,"c"
|
|
|
|
ete | | Tarih: 15.12.2007, 23:57 Mesaj konusu: | |
| Onurbilke,
Ortada bir yanlışlık var. Sıcaklığın 64 derece yada (64-1)=63 derece çıkması için ham değişkeninin 1024 olması gerek. 65535 değil. Zaten verilen hesabı (bir yerlerden hatırlıyorum) tersten yaparsan göreceksin.
ISI=ISI/1000 hesabında ISI 1000 e bölündüğü için 64000 imiş diye düşünmek lazım. Önceki satırda ISI=DIV32 10 satırı ile ısı değeri 10 bölünmüş o halde 10 ile çarpmak lazım. değerimiz oldu 640.000 . Ondan öncede temp=625 x (ham+1) olduğuna göre ham+1= 640000/625 eşitliğinden ham+1=1024 ve HAM=1023 olarak bulunur.
Burada sorun yalnızca hesap hatası başka bir şey değil. Aslında buna hesap hatasıda denmez işlem hatası demek daha doğru olur. 625 x (HAM+1) çarpım değerinin büyük bir sayı olup bu geçici bir bellek te tutulacak ve DIV32 ?? sayısına 32 bit olarak bölünerek sayı küçültülecektir. Sayı şayet 16 bit den daha büyük çıkarsa senin gördüğün hata meydana gelir. Halbuki burada 32 bit olarak 10 yerine 100'e bölsen sorun ortadan kalkacak idi. Şöyleki;
TEMP = 625 * (HAM+1)
ISI = DIV32 100
GEC:
FLOAT = (ISI //100)/10
ISI=ISI/100
RETURN
Yukarıdaki satırları düzelt işlemde düzelecek ve sıcaklık doğru okunacaktır.
ETE
|
|
|
|