ds18b20 ile ısı ölçümü

Başlatan POWER, 23 Nisan 2009, 17:16:16

POWER

Arkadaşlar normalde pbp ile yazarım.Fakat proton'geçmeye karar verdim ve bir uygulama yapmaya çalıştım.Bu uygulama ds18b20 ile ısı ölçümü.Bunun  pbp ile yapılmış halini çok kullandım.Aynı uygulamayı protonda denemeye çalıştım ama olmadı.sensördeki ısı değeri ile dısplay daki ısı değeri çok farklı çıkıyor.Devrenin pcb side var.isis ve bas dosyaları linkte var arkadaşlar.Yardımcı olabilirmisiniz?
http://www.dosya.tc/ISI_2760.rar.html
Device 16F628A

Dim Comm_Pin As PORTA.4     ' One-wire Data-Pin "DQ" PortB.0 da
Dim Busy     As Bit         ' Busy Status-Bit
Dim HAM      As Word        ' Sensör HAM okuma değeri
Dim ISI      As Word        ' Hesaplanmış ISI değeri
Dim Y        As Word        ' Holds remainder for + temp C display
Dim X        As Word  
Dim SAYI     As Byte   
Dim TEMP     As Byte        ' Div32 bit hesap için geçici değişken

CMCON=7               'komparatörler iptal hepsi giriş çıkış
OPTION_REG.7=0        'pull-up dirençleri aktif      

TRISB=%00000000   
TRISA=%00000000  
PORTA=0
PORTB=0

BASLA: 
       GoSub SENSOROKU     
       GoSub EKRAN
       goto basla
AL:    LookUp X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI 
       Return

EKRAN:
       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

Murat Mert

'One-wire temperature for PROTON Board and DS1820 

        Include "PROTON_4.INC" 
         
        Dim Temperature As    Word            ' Temperature storage 
        Dim Count_remain As Byte            ' Count remaining 
        Dim Count_per_c As    Byte            ' Count per degree C 
        Dim Dum            As Byte                ' Dummy variable to pad OWIN 

        Symbol DQ = PORTA.1                    ' One-wire data pin 

        DelayMS 500                            ' Wait for PICmicro to stabilise 
        Cls 
Mainloop: 
        OWrite DQ, 1, [$CC, $44]               ' Start temperature conversion 

        While ORead DQ, 4 = 0 : Wend        ' Check for still busy converting 

        OWrite DQ, 1, [$CC, $BE]            ' Read the temperature 
        ORead DQ, 0, [Temperature.LowByte, Temperature.HighByte] 

' Calculate temperature in degrees C to 2 decimal places (not valid for negative temperature) 
         Temperature = ((Temperature >> 1)*100) 
        Print $FE, 1, Dec Temperature


        DelayMS 1000                          ' Display once a second 

        GoTo Mainloop                        ' Do it forever


biraz çalışma yaparak istediğin gibi kullanırsın.
mert07

POWER

ekranda hep sıfır değerini gösteriyor.içinden çıkamadım arkadaşlar linkte verdiğim proğrama adapte edebilirmiyiz?
TB6BKG

Murat Mert

S.A.
Arkadaşım ben bunların hepsini deneme kartında denedim arkadaşım linktede uyarladığım -55 +128 derece arası bir termomertre devresi var.İşine yarayacağını umuyorum. Kolay gelsin. :)

Pic 16F628 ve DS1820 termometre
mert07

POWER

Kod Etiketini Unutmayalım, Özellikle kodlar uzun olunca

verilen bilgiler doğrultusunda proğramı çalıştırdım.fakat garib çalışmaya başladı.Önce şunu belirteyim bu proğramı ilk  pbp yazdım ve gerçek devresini yaptım en ufak bir problem olmadan defalarca çalıştırdım.Daha sonra protonuda öğrenmek adına protonda yazdım ve gerekli değişiklikleri yaptım.Bu sefer simülasyonda problem görünmüyor.Fakat gerçek devrede belirli aralıklarla d2 ledi yanıp sönüyor ve u4 bağlı dısplayda yanması gereken sayının dışında aynı şekilde başka rakamlarda yanıp sönüyor.Proğramda bir mantık hatası olsa pbp olarak yazdığımda problem olurdu.Protona uyarlarkenmi bir hata yaptım acaba? Yada başka bir hatamı. Şimdiden teşekkürler.Gerekli dosyalar linkte.

http://rapidshare.com/files/225034020/YeniKlas_r_2_7472.rar
http://s1.dosya.tc/YeniKlas_r_2_7472.rar.html

Device = 16F628
XTAL = 4
Config INTRC_OSC_NOCLKOUT,WDT_ON,PWRTE_ON,MCLRE_OFF,BODEN_ON,LVP_OFF,CP_OFF 'CP_ALL 


Dim Comm_Pin As 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 Y        As Word        ' Holds remainder for + temp C display
Dim X        As Word  
Dim SAYI     As Word   
Dim TEMP     As Word        ' Div32 bit hesap için geçici değişken
Dim SURE     As Word 
Dim A        As Word 
Dim I        As Word 
Dim B        As Word 

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

A=0
B=0
SURE=0

BASLA: 
              
       GoSub SENSOROKU     
       GoSub EKRAN

     If ISI>99 Then 
         PORTA.2=1
     Else 
         PORTA.2=0
     EndIf  
'------------------------------------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       
'----------------------------------------------------------------------------------------------       
   If PORTA.3=0 Then 
          GoSub MOD1
   Else
          GoSub MOD2
   EndIf      
      
       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


MOD1:
If ISI>=101 Then 
     PORTB.7=0
EndIf

If ISI<=98 Then
     PORTB.7=1
EndIf
     GoTo BASLA

MOD2:
If ISI>=93 Then 
     PORTB.7=0
EndIf

If ISI<=90 Then
     PORTB.7=1
EndIf 
     GoTo BASLA

ARK:
 For I = 1 To 5
 DelayMS 10
 Next I       

       GoTo BASLA

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

EKRAN:
       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

POWER

WDT açık olmasından kaynaklanıyormuş.Sağolsun sezgin hocam yardımcı oldu.
TB6BKG