Ynt: DS18B20 ile okuduğum sıcaklık +65.5 Derecede Kalıyor

Başlatan ceyhun.topcuoglu, 27 Aralık 2013, 23:21:05

ceyhun.topcuoglu

Öncelikle merhabalar...
LCD ve ds18b20 ile termostat devresi yaptım devreyi iside kurdum başka örnekleri inceledim vs. sonunda başarılı şekilde çalıştırdım ve devreyi bastım
ilk çalıştırmamda sıcaklık değerini okudum sonra ne olduysa +65.5 derecede kalıyor programda karşılaştırma alt programını devre dışı bıraktım yine aynı sorun başka bir boş porta bağladım DS18b20'yi yine aynı durup dururken çalışmaması kafamı oldukça karıştırdı. İsisde çalışıyor hatasız fakat reelde çalışmıyor. Sensörün DQ ve VCC pinlerine paralel 10k direnç bağlı gnd ucu da direk gndye bağlı.


Sensörü okuduğum ve hesapladığım program bu. Hazır bir kod olarak buldum.

Not: Hesaplamada hep 1 Derece Eksik hesaplıyor bende Isı değişkenini +1 yaparak gerçek değere yükseltiyorum onu sildiğimdede aynı sorun yani hesaba göre hep +64.5 Derece gösteriyor.

SENSOROKU1: 
           
           OWOUT   Comm_Pin1, 1, [$CC, $44]' ISI değerini oku
Bekle1:
           OWIN    Comm_Pin1, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle1  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin1, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin1, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOto   Hesapla1
           RETURN
    
Hesapla1:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"  
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10 
       GOTO GEC1   
    endif
    TEMP = 625 * (HAM+1)        ' 
    ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
    
GEC1:
    FLOAT = (ISI //1000)/100
    ISI=(ISI/1000)-1
    
    
    LCDOUT $fe,1,"SICAKLIK:",Sign,DEC ISI,".",DEC1 (Float),0,"C " '2. satırda ısı
    if ISI=65535 then 
        
        lcdout $FE,$80,"  OKUMA HATASI  "
        pause 1000
    
    endif
    
    return



değişkenlerimi de yazıyorum bunlardan da şüphelenmiyor değilim:

Comm_Pin1   VAR	Portb.0
Busy        VAR BIT
HAM         VAR	WORD
ISI         VAR word
SIGN        VAR BYTE
SIGN_BITI   VAR HAM.Bit11
NEGAT_ISI   CON 1
TEMP        VAR BYTE
Float       VAR WORD



yardımlarınızı bekliyorum. DS18B20 bozuldu desem neden bana bilgi gönderiyor ayrıca durup dururken bozulacak bir şey de değil.
şimdiden teşekkürler.

Çizimin Şemasını da atıyorum:


Selametle....

mesaj birleştirme:: 28 Aralık 2013, 00:10:01

Sensörden Okuduğum HAM değer sabit olarak 2047 yani hesaplamada bir sıkıntı yok sıkıntı sensörü okumada

engerex


ceyhun.topcuoglu


Kabil ATICI

ambar7

ceyhun.topcuoglu

#4
Alıntı yapılan: ambar7 - 28 Aralık 2013, 00:33:41
R4 : 4k7 direnç ile dene.

şu anda elimde yok 4k7 yok paralel bir 10k daha ekliyip 5k olarak denedim sonuç yine aynı

selimkoc

#5
Alıntı yapılan: ambar7 - 28 Aralık 2013, 00:33:41
R4 : 4k7 direnç ile dene.

R4 direncini 4k7 veya daha düşük tut. İkincisi sensörün hemen dibine 100nF kond koy (Vdd ve GND arasına)

mesaj birleştirme:: 28 Aralık 2013, 00:51:21

Ayrıca PIC'in alttan tam ortasına (Vdd ile GND arasına )100nF kon. koymağı unutma.

ceyhun.topcuoglu

#6
Alıntı yapılan: selimkoc - 28 Aralık 2013, 00:49:54
R4 direncini 4k7 veya daha düşük tut. İkincisi sensörün hemen dibine 100nF kond koy (Vdd ve GND arasına)

mesaj birleştirme:: 28 Aralık 2013, 00:51:21

Ayrıca PIC'in alttan tam ortasına (Vdd ile GND arasına )100nF kon. koymağı unutma.

elimdeki dirençlerle 4k6 yaptım paralel seri bağlantılarla şu anda kafasına göre değer atıyor - derecelere iniyor + derecelere çıkıyor bazende sabit 64.5 de kalıyor sensöre 100 nf koydum sonuç yine aynı kafasına göre. devrede c3 kondansatörü vdd ve gnd arasında mevcut onu koyuyorum her devrede

teşekkürler.

mesaj birleştirme:: 28 Aralık 2013, 01:15:52

kondansatörü değiştirdim şu anda değişken değerler yok başladığım yere döndüm +64.5 de sabit kalıyor ölçüm

Maxim

kodun alıntı olduğu belli çünkü tuhaf duruyor
bence kod yanlış tam bakamadım ama bu saatte
şu goto hesapla1 satırı gosub olmasın ?
veya aşağılardaki goto ları takip etmek lazım sanki biryerlerde ipin ucu kopuyor gibi

Bekle1:
           OWIN    Comm_Pin1, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle1  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin1, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin1, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOto   Hesapla1
           RETURN

ceyhun.topcuoglu

Alıntı yapılan: Maxim - 28 Aralık 2013, 01:27:08
kodun alıntı olduğu belli çünkü tuhaf duruyor
bence kod yanlış tam bakamadım ama bu saatte
şu goto hesapla1 satırı gosub olmasın ?
veya aşağılardaki goto ları takip etmek lazım sanki biryerlerde ipin ucu kopuyor gibi

Bekle1:
           OWIN    Comm_Pin1, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle1  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin1, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin1, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOto   Hesapla1
           RETURN



evet kod alıntı fakat ilk başta çalışıyordu yani devreyi kurdum çalıştırdım uzun süre sonra kapadım tekrar açtım yine normal çalışıyor tekrar kapatıp açtığımda bu sorun ortaya çıktı


farklı bi okuma kodu buldum bunuda denedim yine aynı
SENSOROKU: 
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
    
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    ISARET  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-"  
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10 
       GOTO GEC   
    endif
    TEMP = 625 * HAM        ' 
    ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    FLOAT = (ISI //1000)/100
    ISI=ISI/1000
    LCDOUT $FE,$80,"SICAKLIK:",ISARET,DEC ISI,".",DEC1 (Float),Derece,"C " '2. satırda ısı
    RETURN

ceyhun.topcuoglu

ayrıca 0.1 hassasiyette başka bir program daha buldum bunu da denedim


değişkenleri farklı onları da değiştirerek denedim sonuç yine aynı fakat burada tek değişen ekranımda 64.5 yerine 127.9 gördüm ki buda hesaplamalardan ve değişkenlerden sanırım ama sonuç aynı
SENSOROKU: 
ISARET="+"
OWOUT SENSOR,1,[$CC,$44] 'Sensöre sıcaklığı okumasını söyle.
BEKLE: 'Sensör hazır olana kadar bekle.
OWIN SENSOR,4,[MESGUL]
IF MESGUL=0 THEN
GOTO BEKLE
ENDIF
OWOUT SENSOR,1,[$CC,$BE] 'Sensöre okuduğu değeri göndermesini söyle.
'OWIN SENSOR,2,[BILGI] 'Gelen 16 bitlik bilgiyi al.
OWIN SENSOR,2,[BILGI.LOWBYTE,BILGI.HIGHBYTE] 'Gelen 16 bitlik bilgiyi al.
IF BILGI.BIT13=1 THEN 'Sıcaklık negatif ise
ISARET="-" 'İşaret artık + değil -
BILGI=~BILGI 'Gelen bilgideki bitleri tersle, 1->0, 0->1
BILGI=BILGI+1 'Bilgiyi 1 arttır.
ENDIF
ARA=BILGI*625 '12 bit hassasiyet kullandığımız için her değer 0.0625 santigrat dereceye denk geliyor.
DEGER=DIV32 10000
ARA=BILGI*625
ONDA1= DIV32 1000
ARA=BILGI*625
ONDA2= DIV32 100
ONDA1=ONDA1-(DEGER*10)
ONDA2=ONDA2-((dEGER*100)+(ONDA1*10))
LCDOUT $FE,$C0,"          " 'LCD ekranın alt satırını temizle
LCDOUT $FE,$C0,"SIC. = ",ISARET,#DEGER,",",dec1 ONDA1," ",0,"C"
RETURN


ceyhun.topcuoglu

ete hocanın hesaplama formulünü kullanıyorum o da inceledi farklı bir hesaplama programı verdi onunla da aynı sonuç oldu. Sensör bozuk diye ümit ediyorum bugün değiştiricem sonucu buraya yazıcam

ceyhun.topcuoglu

Evet Sorun ETE hocanın da dediği gibi sensörden kaynaklanıyormuş. Sensörü değiştirdim ve hiç bir sıkıntı kalmadı Yardımlarınız için teşekkürler.