ds18b20 ile ısı ölçmede sorun

Başlatan POWER, 29 Nisan 2009, 22:44:42

POWER

Arkadaşlar,3 adet 7 digit dısplay ve ds18b20 kullanarak basik bir termometre yaptım.Eksradan bir buton ile ledi kontrol ediyorum.Fakat buton sanki çoğu zaman kaçırıyor yani ledi sağlıklı olarak yakıp söndürmüyor.Bu söylediklerim isis de olmuyor.gerçek devresinde oluyor.Denemek için ısı okuma bölümlerini iptal ettim o zaman gayet sağlıklı çalışıyor.Bu aşamada kodlarda nasıl iyileştirmeler yapabilirim? dosyalar linkte.
http://s1.dosya.tc/TERM.rar.html

Device = 16F628
XTAL = 4

Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,LVP_off,BODEN_OFF,MCLRE_OFF  
 
Symbol Comm_Pin = PORTA.4   ' One-wire Data-Pin "DQ" Porta.4 de
Dim Busy     As Word        ' Busy Status-Bit
Dim HAM      As Word        ' Sensör HAM okuma değeri
Dim ISI      As Word        ' Hesaplanmış ISI değeri
Dim X        As Word  
Dim Y        As Word 
Dim SAYI     As Word   
Dim TEMP     As Word        ' Div32 bit hesap için geçici değişken
Dim ISI_EKLE As Word
Dim SURE     As Word
Dim A        As Byte
Dim I        As Byte
Dim B        As Byte
ALL_DIGITAL = TRUE

CMCON=7               'komparatörler iptal hepsi giriş çıkış
OPTION_REG.7=0        'pull-up dirençleri aktif      
TRISB=%00000100   
TRISA=%00000000  
PORTA=0
PORTB=0
HAM=0
ISI=0
X=0
Y=0
SAYI=0
TEMP=0
SURE=0
A=0
I=0
B=0
Clear

BASLA: 


   GoSub SENSOROKU     
   GoSub EKRAN

'---------------------------------ON-OFF----------------------------------------
If PORTB.2=0 And A=0 Then  
             A   =1 
             SURE=0 
        While PORTB.2=0 And SURE <1
             SURE=SURE+1 
             DelayMS 1
        Wend 
     If SURE=1 Then  
            GoSub KONTROL
            GoSub ARK
     EndIf
EndIf
      If PORTB.2=1 And A=1 Then A=0
 
GoTo BASLA

KONTROL:
     If B=0 Then LED_ON
     If B=1 Then LED_OFF
     GoTo BASLA

LED_ON:
  PORTA.3=1
  B=1   
  GoTo BASLA  

LED_OFF:
  PORTA.3=0
  B=0
 GoTo BASLA

ARK:
 For I = 1 To 15
 DelayMS 10
 Next I
 Return    


AL:    LookUp X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI 
       Return

EKRAN:
       X=(ISI Dig 2)
       GoSub AL
       SHOut PORTB.0,PORTB.1,1,[SAYI]
       High PORTB.3
       DelayUS 2
       Low PORTB.3
       
       X=(ISI Dig 1)
       GoSub AL
       SHOut PORTB.0,PORTB.1,1,[SAYI]
       High PORTB.4
       DelayUS 2 
       Low PORTB.4
      
       X=(ISI Dig 0)
       GoSub AL
       SHOut PORTB.0,PORTB.1,1,[SAYI]
       High PORTB.5
       DelayUS 2
       Low PORTB.5
       Return

'-----------------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
SENSOROKU: 
           OWrite   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           ORead    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           If      Busy = 0 Then Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWrite   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           ORead    Comm_Pin, 2, [HAM.LowByte, HAM.HighByte]' İki byte oku ve okumayı bitir.
           GoSub   Hesapla
           Return
Hesapla:                
    TEMP = 625 * (HAM+1)        
    ISI = Div32 100   ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    Y = (ISI //100)/10
    ISI=ISI/100
    Return              

End
TB6BKG

Maxim

hocam senin bu bölümde bir mantık hatası var ,
bence gözden geçir iyice ,ben çözemedim tam ama ne yapmak istiyorsan daha kolay yapılırmış gibi geliyor .


'---------------------------------ON-OFF----------------------------------------
If PORTB.2=0 And A=0 Then  
             A   =1 
             SURE=0 
        While PORTB.2=0 And SURE <1
             SURE=SURE+1 
             DelayMS 1
        Wend 
     If SURE=1 Then  
            GoSub KONTROL
            GoSub ARK
     EndIf
EndIf
      If PORTB.2=1 And A=1 Then A=0
 
GoTo BASLA

KONTROL:
     If B=0 Then LED_ON
     If B=1 Then LED_OFF
     GoTo BASLA

LED_ON:
  PORTA.3=1
  B=1   
  GoTo BASLA  

LED_OFF:
  PORTA.3=0
  B=0
 GoTo BASLA

ARK:
 For I = 1 To 15
 DelayMS 10
 Next I
 Return

POWER

evet o bölüm toggle komutuyla yapılabilir.Fakat ben butona basılı tutulduğu zaman işlem yapmasınıistemiyorum.Yani butona ilk bastığımızda led yansın basılı tutulsa bile ledde her hangi bir değişiklik olmasın istiyorum taki butonu bırakıp tekrar basıncaya kadar.bırakıp tekrar basınca bu sefer led sönecek böyle devam edecek.Ben bu söylediklerime böyle çözüm bulabildim.Esasında senin kodunu verdiğin o kısım benim şu söylediklerimi yapıyor.Ayrıca bu bölüm ısı okuma işi devreye grmediği zaman çok kararlı çalışıyor.Bilmiyorum nederdir?
TB6BKG

Maxim

şimdi butona basınca led yanacak ,
bırakınca sönmeyecek ?
tekrar basınca led sönecek ,tekrar basınca yanacakmı ?
ben anlamadım tam , niyeki ?

POWER

hocam bir nevi on-off olarak düşünün.basınca yanacak bırakıp tekrar basınca sönecek,bırakıp tekrar basınca yanacak ve böyle devam edecek.
Device = 16F628
XTAL = 4

Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,LVP_off,BODEN_OFF,MCLRE_OFF  
 
Symbol Comm_Pin = PORTA.4   ' One-wire Data-Pin "DQ" Porta.4 de
Dim Busy     As Word        ' Busy Status-Bit
Dim HAM      As Word        ' Sensör HAM okuma değeri
Dim ISI      As Word        ' Hesaplanmış ISI değeri
Dim X        As Word  
Dim Y        As Word 
Dim SAYI     As Word   
Dim TEMP     As Word        ' Div32 bit hesap için geçici değişken
Dim ISI_EKLE As Word
Dim SURE     As Word
Dim A        As Byte
Dim I        As Byte
Dim B        As Byte
ALL_DIGITAL = TRUE

CMCON=7               'komparatörler iptal hepsi giriş çıkış
OPTION_REG.7=0        'pull-up dirençleri aktif      
TRISB=%00000100   
TRISA=%00000000  
PORTA=0
PORTB=0
HAM=0
ISI=0
X=0
Y=0
SAYI=0
TEMP=0
SURE=0
A=0
I=0
B=0
Clear

BASLA: 
   GoSub SENSOROKU     
   GoSub EKRAN

'---------------------------------ON-OFF----------------------------------------
If PORTB.2=0 And A=0 Then 
     Toggle PORTA.3
     GoSub ARK
     A=1 
     EndIf
If PORTB.2=1 Then A=0

GoTo BASLA
ARK:
 For I = 1 To 5
 DelayMS 10
 Next I
 Return    


AL:    LookUp X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI 
       Return

EKRAN:
       X=(ISI Dig 2)
       GoSub AL
       SHOut PORTB.0,PORTB.1,1,[SAYI]
       High PORTB.3
       DelayUS 2
       Low PORTB.3
       
       X=(ISI Dig 1)
       GoSub AL
       SHOut PORTB.0,PORTB.1,1,[SAYI]
       High PORTB.4
       DelayUS 2 
       Low PORTB.4
      
       X=(ISI Dig 0)
       GoSub AL
       SHOut PORTB.0,PORTB.1,1,[SAYI]
       High PORTB.5
       DelayUS 2
       Low PORTB.5
       Return

'-----------------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
SENSOROKU: 
           OWrite   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           ORead    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           If      Busy = 0 Then Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWrite   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           ORead    Comm_Pin, 2, [HAM.LowByte, HAM.HighByte]' İki byte oku ve okumayı bitir.
           GoSub   Hesapla
           Return
Hesapla:                
    TEMP = 625 * (HAM+1)        
    ISI = Div32 100   ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    Y = (ISI //100)/10
    ISI=(ISI/100)+ISI_EKLE
    Return              

End

kodları bu şekilde değiştirdim.sensörü devreden fiziki olarak ayırınca buton devresi çok güzel çalışıyor,sensörü devreye bağlayınca çok kötü çalışıyor yani yukarıda tarif ettiğim gibi düzenli çalışmıyor.Bu arada sesördede bir arıza görünmüyor ısı ölçmesi normal
TB6BKG