avatar_POWER

DS18B20 ile ısı okumada problem

Başlatan POWER, 05 Kasım 2011, 12:55:16

POWER

DS18B20 ile ısı okumadaki  problemi çözemedi.problem şu.sensör 10.0 ile 10.4'de iken ekran 10.0 gösteriyor. 10.5 ile 10.9 arasında ekran 10.5  gösteriyor ve bu şekilde devam ediyor.tüm dosyaları yüklüyorum.
PORTA=0
portb=0
TRISB=0   
TRISA=%00010000 
'-----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628                               
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000       'Kesmeler aktif ve TMR0 kesmesi aktif
'TMR0=0
CMCON=7 
'----------------------------------------------------------------------------
Comm_Pin    VAR   PortA.4  ' One-wire Data-Pin "DQ" PortB.0 da
Busy        VAR BIT      ' Busy Status-Bit
HAM         VAR   WORD     ' Sensör HAM okuma değeri
ISI         VAR WORD     ' Hesaplanmış ISI değeri
Float       VAR WORD     ' Holds remainder for + temp C display
X           VAR WORD 
SAYI        VAR BYTE   
SIGN_BITI   VAR HAM.Bit11'   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1        ' Negatif_Cold = 1
Deg         CON 223      ' ° işareti
SIGN        VAR BYTE     '  ISI değeri için  +/-  işaret
TEMP        VAR BYTE     ' Div32 bit hesap için geçici değişken
'-------------------------------------------------------------------------------
SYMBOL  DTA=PortB.0
SYMBOL  CLK=PORTB.1
symbol  ST=PORTB.2
'-------------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
gosub sensoryaz
gosub sensoroku
'-------------------------------------------------------------------------------
HIGH PORTA.0
BASLA:
         GOSUB SENSOROKU
         GOSUB TERM
    GOTO BASLA
''-----------------------alt programlar-------------------------------------------       
TEKRAR:
       SHIFTOUT DTA,CLK,1,[SAYI]
       RETURN
       
AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,120],SAYI     
       RETURN
     
TERM:
       X=10
       GOSUB AL
       GOSUB TEKRAR
       X=11
       GOSUB AL
       GOSUB TEKRAR
       
       x=(FLOAT DIG 0)
       GOSUB AL
       GOSUB TEKRAR
       
       x=(ISI DIG 0)
       GOSUB AL
       GOSUB TEKRAR
     
       x=(ISI DIG 1)
       GOSUB AL
       GOSUB TEKRAR
   
       IF SIGN_BITI = NEGAT_ISI THEN
       SAYI=64
       else
       SAYI=0
       endif
       GOSUB TEKRAR
STYAZ:     
        HIGH st
        PAUSEUS 2
        LOW st
        RETURN         
'-----------------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
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
           
SENSORYAZ:
          OWOUT   COMM_Pin, 1, [$CC, $4E, $00,$00,$31]
          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          ' GEC:
    FLOAT = (ISI //1000)/100
    ISI=ISI/1000
    RETURN             

END
         

Mucit23

Sanırım bunun sebebi ısı çözünürlüğünün 10Bit olarak ayarlanmış olması

SENSORYAZ kısmını aşağıdaki gibi değiştirirsen aorun büyük ihtimalle çözülecektir.

SENSORYAZ: 'okumaya hazırlan..          
OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]  ;Hassasiyet 12 bit olarak ayarlanıyor
OWOUT   Comm_Pin, 1, [$CC,$48]         
OWOUT   Comm_Pin, 1, [$CC,$B8]         
OWOUT   Comm_Pin, 1, [$CC,$BE]         
return


Çözünürlüğü 12 bit (0.1C) hassasiyetinde ayarlamış olursun.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

POWER

kısmen bir düzelme oldu fakat yine sensörle ekran senkron olarak değişmiyor. 

POWER

#3
Alıntı yapılan: POWER - 05 Kasım 2011, 12:55:16
        TEMP = 625 * (HAM+1)
 
doğrusu 
TEMP = 625 * HAM

hata bu satırdan kaynaklanıyormuş.proğram normal çalışıyor.

ete

Hesap kısmını aşağıdaki şekilde yaparsan dahada uygun olur.

Ete

Hesapla:                
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
       ham=~ham+2
    endif
    float = (HAM*10)/16        '
    eski=ISI
    ISI=FLOAT/10
    RETURN


necdet_77

Kardeş öncelikle benim de sorunuma parmak bastığın için teşekkürler. PIC konusunda çok yeniyim. Asıl mesleğim bilgisayar programcılığı olduğundan PIC benim için çok eğlenceli bir hobi niteliği taşıyor.

Yukarıda belirttiğin tarzda 18b20 kullanarak 7 Segment display e çıkış veren bir devre üzerinde çalışıyorum (Yaklaşık 2 aydır :) )

Şöyle bir sorunum var: Kodları kendim yazmayı denedim fakat başarılı olamadığımdan sizlerin paylaştığı kodları kullanmaya karar verdim . Lakin displayler ve PIC arasında kullandığım ( Kullanamadığım ) 74hc595 leri bir türlü doğru bağlayamadımı düşünüyorum.

Kodlardan anladığım kadarıyla ;
DTA pini yani DS PORTB.0 ,
CLK pini yani SH_CP PORTB.1
STCP pini ise PortB.2 de
ayrıca Sensör PORTA.4 üzerinde.

bu yapıya göre kurduğum isis simulasyonunda displaylerden anlamsız cevaplar alıyorum .

Sizin bildiğiniz ve Bilmediğim yada atladığım bir kritik nokta var mıdır ? yardımcı olabilir misiniz ?

Mucit23

Devre şemasını göstermelisin.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

necdet_77


ete

Kusur -1 , 74HC595 lerin Q0 pinlerini kullanmamışsın. Bu dataların displeylerde yanlış çıkmasına sebebp olacaktır.
Q0-Q6 arası pinleri (Q7 ler boş kalacak) displeylerin sırası ile a-b-c-d-e-f-g pinlerine bağlanacaktır.

Her bir displayin Q'7 pini bir sonraki 74HC595'in data girişine bağlanacaktır. Buna kaskad bağlantı deniliyor. Bu sayede ilk verilen byte ilk displayi sürere. İkinci verilen birincide kalır ilk verilen ikinciye geçer. Kaç display varsa o kadar byte bilgi vermen gerekir.

Şimdilik bunları düzelt sonra yeniden dene bakalım ne aksaklık çıkacak.

Ete

necdet_77

Hocam öncelikle ilginize teşekkürler. Şu anda saçma bir değer de olsa -65 değerini alabildim. Yeni  bir problem daha var 18b20nin geçerli değerini değiştirdiğim zaman displayler değişmiyor. simülasyon esnasında normalmidir ?

birde :

Alıntı yapılan: ete - 05 Kasım 2011, 20:01:36
Hesap kısmını aşağıdaki şekilde yaparsan dahada uygun olur.

Ete

Hesapla:                
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
       ham=~ham+2
    endif
    float = (HAM*10)/16        '
    eski=ISI
    ISI=FLOAT/10
    RETURN



   Bu kod bloğunda "eski" isimli bir değişken kullanmışsınız fakat yukarıdaki kodlar içerisinde böyle bir değişken yok . O değişkenin nereden geldiğini yada yukarıdaki hangi değişkene karşılık geldiğini anlamadım.
O konuda da yardım ederseniz mutlu olurum. Çok soru sorarak kafanızı şişirdiğimin farkındayım ama acemilik işte kusura bakmayın , Hakkınızı helal edin.

ete

Başka bir programdan alındığı için ESKI isimli değişken başka bir amaçla oraya konulmuştur. Onu oradan silin.
Verdiğiniz formülde zaten ISI=FLOAT/10 şeklinde heseplanıyor. Bu tam sayı kısmıdır. Ondalık kısmıda lazım ise
ONADALIK=FLOAT//10 şeklinde hesaplanır. (Mod alma işlemidir)

Şemanızdan açık gözükmüyor. Ama sanki Sıcaklık sensörünün data bacağında pullup direnci yokmuş gibi geldi bana. Bu direncik yokluğu genelde 65 gibi bir değer okunmasına sebep olabilr.
Şayet pullup direnci var ise o zaman okuma programınıda buraya koyarsanız oraya da bakıp bir sorun olup olmadığını gözlemleyebiliriz.

Ete

est32

Ben de bu şekilde okuyorum ve sistem güzel işliyor;
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [ESAT METİN ERDOĞAN]                              *
'*  Notice  : Copyright (c) 2011 [İZİNSİZ KULLANMAK HARAMDIR]   *
'*          : All Rights Reserved                               *
'*  Date    : 16.11.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEVICE=16F628A
CONFIG CP_OFF,DATA_CP_OFF,WDT_OFF,INTRC_OSC_NOCLKOUT,MCLRE_OFF,LVP_OFF,BODEN_OFF,PWRTE_ON
XTAL=4
CMCON=7

DIM MESGUL AS BYTE,HAM AS WORD,ISRT AS BYTE,ISI AS WORD,KSRT AS WORD

SYMBOL DQ=PORTA.4

DECLARE LCD_DTPIN PORTB.4 ' Used for 4-line interface.
DECLARE LCD_ENPIN PORTA.1
DECLARE LCD_RSPIN PORTA.0
DECLARE LCD_INTERFACE 4
DECLARE LCD_LINES 2

PRINT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0 'Derece İşareti

'******************************************************************************************
BASLA:
       
        GOSUB DS_OKU
        CLS
        IF ISRT=0 THEN
        PRINT AT 1,1,"+"
        ELSE
        PRINT AT 1,1,"-"
        ENDIF
       
        PRINT AT 1,2,DEC ISI,",",DEC1 KSRT,0,"C"
       
        DELAYMS 1000
GOTO BASLA
'******************************************************************************************
DS_OKU:
        OWRITE   DQ, 1, [$CC, $44]
        DELAYMS 750
OYALAN:
        OREAD    DQ, 4, [MESGUL]
        IF      MESGUL = 0 THEN OYALAN
        OWRITE   DQ, 1, [$CC, $BE]
        OREAD    DQ, 2, [HAM.LOWBYTE, HAM.HIGHBYTE]
        ISRT=HAM.11'  SICAKLIK İŞARET BİTİ,EĞER 1 OLURSA SICAKLIK NEGATİFTİR
        IF ISRT=1 THEN GOTO NEGATIF
        ISI=HAM/16
        KSRT=ISI*16
        KSRT=((HAM-KSRT)*10)/16
        RETURN
       
NEGATIF:
        ISI=(65537-HAM)/16
        KSRT=ISI*16
        KSRT=((65537-HAM-KSRT)*10)/16
        RETURN
       
        END

necdet_77

Değerli hocam
söylediğiniz gibi kodda değişiklik yaptım .Kendim yazmayı bir türlü başaramadığım için Kullandığım kod @power arkadaşın gonderdiği kod bloğu. Lakin yinede hesaplama sorunu olduğu için buraya koymak istedim.

'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000       'Kesmeler aktif ve TMR0 kesmesi aktif
'TMR0=0
CMCON=7 
'----------------------------------------------------------------------------
Comm_Pin    VAR   PortA.4  ' One-wire Data-Pin "DQ" PortB.0 da
Busy        VAR BIT      ' Busy Status-Bit
HAM         VAR   WORD     ' Sensör HAM okuma değeri
ISI         VAR WORD     ' Hesaplanmış ISI değeri
Float       VAR WORD     ' Holds remainder for + temp C display
X           VAR WORD 
SAYI        VAR BYTE   
SIGN_BITI   VAR HAM.Bit11'   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1        ' Negatif_Cold = 1
Deg         CON 223      ' ° işareti
SIGN        VAR BYTE     '  ISI değeri için  +/-  işaret
TEMP        VAR BYTE     ' Div32 bit hesap için geçici değişken
ondalik     var byte
'-------------------------------------------------------------------------------
SYMBOL  DTA=PortB.0
SYMBOL  CLK=PORTB.1
symbol  ST=PORTB.2

PORTA=0
portb=0
TRISB=0   
TRISA=%00010000
'-------------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
gosub sensoryaz
gosub sensoroku
'-------------------------------------------------------------------------------

HIGH PORTA.0
BASLA:
         GOSUB SENSOROKU
         GOSUB TERM
    GOTO BASLA
''-----------------------alt programlar-------------------------------------------       
TEKRAR:
       SHIFTOUT DTA,CLK,1,[SAYI]
       RETURN
       
AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,120],SAYI     
       RETURN
     
TERM:
       X=10
       GOSUB AL
       GOSUB TEKRAR
       X=11
       GOSUB AL
       GOSUB TEKRAR
       
       x=(FLOAT DIG 0)
       GOSUB AL
       GOSUB TEKRAR
       
       x=(ISI DIG 0)
       GOSUB AL
       GOSUB TEKRAR
     
       x=(ISI DIG 1)
       GOSUB AL
       GOSUB TEKRAR
   
       IF SIGN_BITI = NEGAT_ISI THEN
       SAYI=64
       else
       SAYI=0
       endif
       GOSUB TEKRAR
STYAZ:     
        HIGH st
        PAUSEUS 2
        LOW st
        RETURN         
'-----------------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
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
           

SENSORYAZ: 'okumaya hazırlan..         
OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]  ;Hassasiyet 12 bit olarak ayarlanıyor
OWOUT   Comm_Pin, 1, [$CC,$48]         
OWOUT   Comm_Pin, 1, [$CC,$B8]         
OWOUT   Comm_Pin, 1, [$CC,$BE]         
return         
             
Hesapla:                 ' Ham değerden Santigrat derece hesabı
  Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
       ham=~ham+2
    endif
    float = (HAM*10)/16        ' 
    ISI=FLOAT/10
   
   
    RETURN
END


Aşağıdaki ek üzerinde de görebileceğiniz gibi sıcaklık sürekli 00 derece olarak görünmekte. Hesapla kısmında ısı değişkenine sabit değer verdiğimde isis üzerinde verdiğim değeri görebiliyorum fakat programa hesaplatmak isteyince 00 sonucunu veriyor. Birde pullup direncinden kastınız sanırım DQ portuna bağlı olan 4.7K direnç ve power bağlantısı. Devremde mevcuttur. Hesaplamadaki hata için kodu inceleyebilirseniz sevinirim.

necdet_77

Alıntı yapılan: est32 - 16 Ocak 2012, 21:25:13
Ben de bu şekilde okuyorum ve sistem güzel işliyor;
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [ESAT METİN ERDOĞAN]                              *
'*  Notice  : Copyright (c) 2011 [İZİNSİZ KULLANMAK HARAMDIR]   *
'*          : All Rights Reserved                               *
'*  Date    : 16.11.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEVICE=16F628A
CONFIG CP_OFF,DATA_CP_OFF,WDT_OFF,INTRC_OSC_NOCLKOUT,MCLRE_OFF,LVP_OFF,BODEN_OFF,PWRTE_ON
XTAL=4
CMCON=7

DIM MESGUL AS BYTE,HAM AS WORD,ISRT AS BYTE,ISI AS WORD,KSRT AS WORD

SYMBOL DQ=PORTA.4

DECLARE LCD_DTPIN PORTB.4 ' Used for 4-line interface.
DECLARE LCD_ENPIN PORTA.1
DECLARE LCD_RSPIN PORTA.0
DECLARE LCD_INTERFACE 4
DECLARE LCD_LINES 2

PRINT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0 'Derece İşareti

'******************************************************************************************
BASLA:
       
        GOSUB DS_OKU
        CLS
        IF ISRT=0 THEN
        PRINT AT 1,1,"+"
        ELSE
        PRINT AT 1,1,"-"
        ENDIF
       
        PRINT AT 1,2,DEC ISI,",",DEC1 KSRT,0,"C"
       
        DELAYMS 1000
GOTO BASLA
'******************************************************************************************
DS_OKU:
        OWRITE   DQ, 1, [$CC, $44]
        DELAYMS 750
OYALAN:
        OREAD    DQ, 4, [MESGUL]
        IF      MESGUL = 0 THEN OYALAN
        OWRITE   DQ, 1, [$CC, $BE]
        OREAD    DQ, 2, [HAM.LOWBYTE, HAM.HIGHBYTE]
        ISRT=HAM.11'  SICAKLIK İŞARET BİTİ,EĞER 1 OLURSA SICAKLIK NEGATİFTİR
        IF ISRT=1 THEN GOTO NEGATIF
        ISI=HAM/16
        KSRT=ISI*16
        KSRT=((HAM-KSRT)*10)/16
        RETURN
       
NEGATIF:
        ISI=(65537-HAM)/16
        KSRT=ISI*16
        KSRT=((65537-HAM-KSRT)*10)/16
        RETURN
       
        END


Kardeşim ilgine çok teşekkür ederim. En kısa zamanda deneyip kendimce çalıştırmaya ve geliştirmeye çalışacağım.

Powered by EzPortal