avatar_Mucit23

DS1820 İle 18B20 arasındaki okuma farkı nedir

Başlatan Mucit23, 05 Kasım 2011, 11:09:02

Mucit23

Merhabalar Ete hocam
Eski malzemelerimi karıştırırken birden elimde 3-4 tane Ds1820 birikti. Bu sensörlerin sağlamlığına bakmak istiyorum.
   18B20 ile 1820 arasında okuma arasında farklılıklar var. Bu farklılıklar nelerdir.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

DS18B20 nin nasıl okunduğu ve ham değerden sıcaklığın nasıl hesaplandığını biliyorsun ona hiç değinmeyeceğim.
DS1820 biraz farklı bir sensör. Fark okuma kısmında çok az ama hesap kısmı tamamen farklı. Aşağıda bir örnek veriyorum.

Ete


SENSOROKU:                 OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini okuBekle:           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, 0, [HAM.LOWBYTE, HAM.HIGHBYTE, Skip 4, Kalan, Sayac]  'fark bu satırda iki parametre ilave ediliyor.           GOSUB   Hesapla           RETURN    Hesapla:                 ' Ham değerden Santigrat derece hesabı    Sign  = "+"    IF SIGN_BITI = NEGAT_ISI THEN       Sign   = "-"         HAM=~HAM+1    endif        ISI = (((HAM) * 50) - 25) + (((Sayac - Kalan) * 100) / Sayac)    ISI2 = (ISI //100)/10    ISI1=ISI/100    RETURN

Mucit23

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Hocam Sizin displayli saat ve termometre devrenize bu sensörü eklemeye çalışıyorum.
Verdiğiniz örnek kodu programa ekledim.

PORTA=0:portb=0 'bu versiyonda saat sürekli okunuyor. Orta ledlerde hiç sorun yok.    TRISB=0         'buda güzel çalışıyor bence  hemde en güzeli  TRISA=%11100000  '-----------------------------------------------------------------@ 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 '-----------------------------------------------------------------DEFINE OSC 4'-------------------------------------------------------------------------ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktifTMR0=0CMCON=7  '----------------------------------------------------------------------------Comm_Pin    VAR PortA.4     ' One-wire Data-Pin "DQ" PortB.0 daBusy        VAR BIT         ' Busy Status-BitPOZ         VAR BITZ           VAR BITW           VAR BITU           VAR BITT           VAR BITGOR         VAR BYTESYC         VAR BYTEKALAN       VAR BYTEHAM         VAR WORD        ' Sensör HAM okuma değeriISI         VAR WORD        ' Hesaplanmış ISI değeriISI2        VAR WORD        ' ISI2 DeğeriFloat       VAR WORD        ' Holds remainder for + temp C displayX           VAR WORD  Y           VAR BYTE  SAYI        VAR BYTE   SIGN_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklıkNEGAT_ISI   CON 1           ' Negatif_Cold = 1Deg         CON 223         ' ° işaretiSIGN        VAR BYTE        '  ISI değeri için  +/-  işaretTEMP        VAR BYTE         ' Div32 bit hesap için geçici değişkenSAYAC       VAR BYTE 80SN          VAR BYTEDAK         VAR BYTESAAT        VAR BYTEGUN         VAR BYTEAY          VAR BYTEYIL         VAR BYTEMEM         var byte ' EKRAN_ZAM   var byte ' SUM         VAR BYTEEKRAN_ISI   VAR BYTEONLAR       VAR BYTEBIRLER      VAR BYTEESN         VAR BYTE'---------------------------------------------SYMBOL  DTA=PortB.0SYMBOL  CLK=PORTB.1symbol  ST=PORTB.2SYMBOL  RTC_DTA=PORTA.0SYMBOL  RTC_CLK=PORTA.1SYMBOL  RTC_RST=PORTA.2symbol  SEC   =PORTA.5  SYMBOL  ASAGI =PORTA.6 SYMBOL  YUKARI=PORTA.7 '-----------------------------------------------------------------------------CLEAR  'tüm değişkenler sıfırlandıEKRAN_ZAM=10  'saat EKRANDA KALMA SÜRESİEKRAN_ISI=5   'sıcaklık EKRANDA KALMA SÜRESİ BUNLARI DEĞİŞTİREBİLİRSİNİZ.SUM=EKRAN_ZAM+EKRAN_ISIIF sec=0 then ZAM_AYARILK:gosub ekran0gosub sensorokulow RTC_RSTlow RTC_CLK GOSUB GECIKME'-----------------------------------------------------------------------------HIGH PORTA.3 gosub ZAMAN_OKU:esn=SNBASLA:         GOSUB ZAMAN_OKU        IF SAYAC=30 THEN LOW porta.3                IF Y=SUM THEN Y=0        IF Y>(EKRAN_ZAM) AND Y<SUM THEN         if y=(EKRAN_ZAM+1) then GOSUB SENSOROKU         GOSUB EKRAN1        ENDIF                 if esn=sn then atla        Y=Y+1 : ESN=SN : SAYAC=0        IF Y<=EKRAN_ZAM THEN            HIGH porta.3           GOSUB EKRAN0        ENDIF                 ATLA:  if SEC=0 THEN AYAR  'MODE TUŞUNA BASILMIŞ İSE AYAR'A GİT              GOTO BASLA'-----------------------alt programlar-------------------------------------------       TEKRAR:       SHIFTOUT DTA,CLK,1,[SAYI]        RETURNBAK_0:       GOSUB AL       IF Z=1 AND W=1 THEN SAYI=0         RETURNBAK_1:       GOSUB AL       IF Z=1 AND U=1 THEN SAYI=0                    RETURNBAK_2:       GOSUB AL       IF Z=1 AND T=1 THEN SAYI=0                    RETURN     EKRAN0:                         X= DAK DIG 0:GOSUB BAK_1:GOSUB TEKRAR        X= DAK DIG 1 :GOSUB BAK_1:GOSUB TEKRAR        u=0        X= SAAT DIG 0 :GOSUB BAK_0:GOSUB TEKRAR        X= SAAT DIG 1:GOSUB BAK_0:GOSUB TEKRAR        w=0       HIGH st:PAUSEUS 2:LOW st       RETURN       AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN     EKRAN1:LOW PORTA.3       X=11:GOSUB AL:GOSUB TEKRAR       X=10:GOSUB AL:GOSUB TEKRAR              x=(ISI DIG 0):GOSUB AL:GOSUB TEKRAR       x=(ISI DIG 1):GOSUB AL:GOSUB TEKRAR       HIGH st:PAUSEUS 2:LOW st       RETURN       EKRAN2:IF POZ=0 THEN HIGH porta.3       X= YIL DIG 0:GOSUB BAK_2:GOSUB TEKRAR       X= YIL DIG 1:GOSUB BAK_2:GOSUB TEKRAR       T=0       X= AY DIG 0:GOSUB BAK_1:GOSUB TEKRAR              X= AY DIG 1:GOSUB BAK_1:GOSUB TEKRAR        U=0             X= GUN DIG 0:GOSUB BAK_0:GOSUB TEKRAR       X= GUN DIG 1:GOSUB BAK_0:GOSUB TEKRAR       w=0        HIGH st:PAUSEUS 2:LOW st           RETURN         EKRAN_3:         X= SN DIG 0:GOSUB BAK_1:GOSUB TEKRAR        X= SN DIG 1 :GOSUB BAK_1:GOSUB TEKRAR        u=0        SAYI=0:GOSUB TEKRAR        SAYI=SUM:GOSUB TEKRAR        w=0       HIGH st:PAUSEUS 2:LOW st       RETURN            '-----------------------------------------------------  ZAM_AYAR:        LOW PORTA.3:SN=0:POZ=1:SUM=6         SN=EKRAN_ZAM:GOSUB EKRAN_3        WHILE SEC=0:WEND        ZAM_BIR:        W=1        IF SEC=0 THEN ZAM_IKI        IF YUKARI=0 THEN          IF Z=0 THEN sn=SN+1          IF SN=31 THEN SN=0               ENDIF                     IF ASAGI=0 THEN           IF Z=0 THEN SN=SN-1           IF SN=255 THEN SN=30        ENDIF        Z=1-Z        GOSUB EKRAN_3               GOSUB GECIKME        GOTO ZAM_BIR        ZAM_IKI:         EKRAN_ZAM=SN:SUM=91        SN=EKRAN_ISI:GOSUB EKRAN_3        WHILE SEC=0:WEND        ZAM_UC:        W=1        IF SEC=0 THEN ZAM_DORT        IF YUKARI=0 THEN          IF Z=0 THEN sn=SN+1          IF SN=31 THEN SN=0               ENDIF                     IF ASAGI=0 THEN           IF Z=0 THEN SN=SN-1           IF SN=255 THEN SN=30        ENDIF        Z=1-Z        GOSUB EKRAN_3               GOSUB GECIKME        GOTO ZAM_UC                ZAM_DORT:         EKRAN_ISI=SN         SUM=EKRAN_ZAM+EKRAN_ISI         Z=0:W=0:POZ=0         GOTO ILK        AYAR:         LOW PORTA.3:SN=0:POZ=1       gosub ekran0       WHILE SEC=0:WENDHOUR:  W=1       LOW PORTA.3       IF SEC=0 THEN MINBIR       IF YUKARI=0 THEN          IF Z=0 THEN SAAT=SAAT+1          IF SAAT=24 THEN SAAT=0               ENDIF           IF ASAGI=0 THEN           IF Z=0 THEN SAAT=SAAT-1           IF SAAT=255 THEN SAAT=23        ENDIF        Z=1-Z        GOSUB EKRAN0           GOSUB GECIKME        GOTO HOUR        MINBIR: W=0:Z=0        GOSUB EKRAN0        WHILE SEC=0        WEND        MINUTE: U=1               LOW PORTA.3       IF SEC=0 THEN ara        IF YUKARI=0 THEN           IF Z=0 THEN  DAK=DAK+1           IF DAK=60 THEN DAK=0        ENDIF        IF ASAGI=0 THEN           IF Z=0 THEN  DAK=DAK-1           IF DAK=255 THEN DAK=59                      ENDIF        Z=Z-1        GOSUB EKRAN0        GOSUB GECIKME        GOTO MINUTE        SECBIR: WHILE SEC=0        WEND        U=0GECIKME:        FOR X=0 TO 3500        PAUSEUS 5        NEXT        RETURNDELAY:        FOR X=0 TO 1900        PAUSEUS 10        NEXT        RETURN      ARA:    W=0:u=0:T=0:Z=0        GOSUB FLASH        Gosub EKRAN0        HIGH PORTA.3        WHILE SEC=0          wend        MEM=SN:GOSUB TERSCEVIR:SN=SAYI        MEM=DAK:GOSUB TERSCEVIR:DAK=SAYI        MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI        MEM=GUN:GOSUB TERSCEVIR:GUN=SAYI        MEM=AY:GOSUB TERSCEVIR:AY=SAYI        MEM=YIL:GOSUB TERSCEVIR:YIL=SAYI         GOSUB ZAMAN_YAZ        GOSUB ZAMAN_OKU        y=0:POZ=0        goto BASLA        FLASH:      TOGGLE PORTA.3:GOSUB DELAY:TOGGLE PORTA.3:GOSUB DELAY      TOGGLE PORTA.3:GOSUB DELAY:TOGGLE PORTA.3:GOSUB DELAY      return '-------------------------------------------------------------------------------                                              SENSOROKU:                 OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini okuBekle:           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, 0, [HAM.LOWBYTE, HAM.HIGHBYTE, Skip 4, Kalan, Syc]  'fark bu satırda iki parametre ilave ediliyor.           GOSUB   Hesapla           RETURN    Hesapla:                 ' Ham değerden Santigrat derece hesabı    Sign  = "+"    IF SIGN_BITI = NEGAT_ISI THEN       Sign   = "-"         HAM=~HAM+1    endif        FLOAT = (((HAM) * 50) - 25) + (((Syc - Kalan) * 100) / Syc)    ISI=FLOAT/100    ISI2 = (ISI //100)/10RETURNZAMAN_OKU:          high RTC_RST:OUTPUT rtc_dta         shiftout RTC_DTA, RTC_CLK, 0, [$BF]:INPUT RTC_DTA         SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, MEM, YIL, MEM]  'OKU         MEM=SN:GOSUB CEVIR:SN=SAYI         MEM=DAK:GOSUB CEVIR:DAK=SAYI         MEM=SAAT:GOSUB CEVIR:SAAT=SAYI         MEM=GUN:GOSUB CEVIR:GUN=SAYI         MEM=AY:GOSUB CEVIR:AY=SAYI         MEM=YIL:GOSUB CEVIR:YIL=SAYI         low RTC_RST          returnZAMAN_YAZ:               high  RTC_RST:OUTPUT RTC_DTA          SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]    'WRT Protek açıldı         low RTC_RST:PAUSEUS 10          high RTC_RST                   SHIFTOUT  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, 0, YIL, 128]  'YAZ         low RTC_RST         PAUSEUS 10         return               CEVIR:         ONLAR=MEM & %01110000         ONLAR=ONLAR>>4         BIRLER=MEM & %00001111         SAYI=ONLAR*10+BIRLER         RETURN  TERSCEVIR:                         ONLAR=MEM DIG 1         ONLAR=ONLAR<<4         BIRLER=MEM DIG 0         SAYI=ONLAR+BIRLER         RETURN         DISABLEKESME:IF POZ=1 then CIK         SAYAC=SAYAC+1  'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)CIK:     INTCON.2=0  'TMR0 Kesme bayrağı sıfırlanıyor         RESUME         ENABLE                           END


Hocam program kısmen çalıştı fakat değerler çok tutarsız geliyor. Sensörü ilk okuduğunda 85 değeri geliyor. Birdahaki okumada düzeliyor. Bazen bakıyorsun çok farklı bir değer geliyor. Simülasyonda DS18S20 kullandım. Acaba program ilk açıldığında sensörün Set edildiği bölümü kullanmadık. Bu böyle bir sonuç çıkarabilirmi.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Gerçek devrede deneme yapıyorsan sensör set satırlarınıda kullan istersen.
Bu sensörü bir kere kullandım ve sorunla karşılaşmamıştım.
iki okuma arasına biraz gecikme koymayıda deneyebilirsin. Pullup direncide etkili olabilir.

Ete

Mucit23

Hocam Bayramdı felan derken ilgilenemedim konuyla.İlk başta Simülasyonda deneme yapıyordum. Az önce gerçek devrede denedim gözüme takılan birşey olmadı. İyi çalışıyor yani.
Teşekkür ederim
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

#6
Hocam ds18b20 ve 1820 sensörlerinde arıza tespiti yapmaya çalışıyorum. Buna yapabilmek için bana sensörün reset sinyaline cevap verip vermediğine bakmak gerekir diye söylediler. Eğer sensör reset sinyaline cevap vermiyorsa sensör arızalı demektir. Anlamadığım nokta bunu manuel olarak nasıl yapabileceğim. PBPde Owın ve Owout komutu reset işlemini otomatik olarak yapıyor.

Birde Sensörün takılı olup olmadığını veya hattın kopuk olup olmadığını anlamak için ben Data hattını low konumuna çekip çekip sonra bellirli bir süre bekleyip data hattının konumuna bakıyorum. Eğer 1 okursam hat kopuk demekdir. Sensör yerinde ise data hattı yine 0 konumunda oluyor.

Siz bu konuda nasıl bir yol izliyorsunuz.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Mucit23,
Bu gibi soruların cevabı nerede yazıyor biliyorsun ama nedense sen hep kesitrmeden gitmeye çalışıyorsun.
Data sheete açıp bir baksan her şeyi görebileceksin. İllaki lisan bilmeye gerek yok. Adamlar anlaşılsın diye kos koca resim koymuşlar.
Data sheet'i aç ve 15. ci sayfada yer alan "INITALIZATION TIMING Figure 13" isimli şekle bir bak lütfen.
Bu şekilde Master (Pic) in sensöre nasıl yada ne kadar süre ile reset pulsi yolladığını buna karşılık Sensöründe ben burdayım varım demek için ne yaptığını göstermişler.
Bu resimde Koyu kalın çizgi ile gösterilen çizgi MASTER yani Pic tarafından verilen sinyal şeklini,  Kalın Gri renk ile belirlenen çizginin ise Sensör tarafından verilen sinyal şeklini arada yer alan inca siyah çizgilerinde pullup direnci nedeni ile oluşan sinyal şeklini ifade etmektedir.
Sorunun cevabı burada. Ancak ben bu defa yalnızca cevabın yerini göstermiş olacağım. İncele bakalım içinden çıkıp anlayabilecekmisin.
Bu şekle bakıpta olayı anlamak için lisan bilmek gerekmiyor. Biraz kafayı çalıştırmak yeterli bence. Ufak tefek tercüme işlerini zaten google yada başka kaynaklar sana yapbiliyor. O halde geriye biraz çalışmak  kalıyor. Hadi bakalım çöz şu işi.
Yindede çözemez isen ben açıklayacağım .
Hemen şunu belirteyim. Bu işlem sonucunda sensörün varlığı anlaşılabilmektedir. Var ise sıcaklık ölçümüne geçilebilir yok ise ekrana sensor yok yazılıp sıcaklık okumasından vaz geçilebilir.
Ben şimdiye kadar kullanmadım. Bana kalırsa artistik bi iş. Sensör bağlamaz isen yok olur elbette. Çokmu gerekli sence?
Bu işlem data hattının kopukluğunuda sana bildirebilir. Oda çok gerekli değil bana göre çalışmıyorsa bakar tamir edersin sonuçta. BU sensörle yazdığım programlar genelde hafıza limitlerinde kalıyor. Bu nedenle bu tür artistik konuları hep es geçmişimdir. Yalnızca SHT sensörleri ile uğraşırken sensörün varlığını yokluğunu test edip ekrana yazdırmıştım.
Elbette bu benim görüşüm ve seçimim sen farklı düşünüyor isen kendi programlarına koyabilirsin. Bence zor bir iş değil.

Ete

Mucit23

Hocam bazı denemeler yaptım.

hosting images
Datasheettteki açıklamaya göre Data hattını MCU tarafından low konumuna çekip yaklaşık 480us beklemek gerekiyor.(ben 500 yaptım) Sonra Data hattını giriş yapıp bi 100uS kadar daha bekleyip data hattını okumak gerekiyor. Eğer hala 1 okursak sensör terkrar hattı low konumuna çekmemiş demektir. Sensörün yerinde olmadığı anlamına gelir. Teoride böyle olması lazım. Ben bu anladıklarıma göre birşeyler yaptım. Çevremdede buna benzer örnekler var. Hepsi aynı şekilde.

DS_Check:          Comm_Pin=0            ;PortA.7          pauseus 500          Data_Pin=1               ;TRISA.7          PAUSEUS 100            IF Comm_Pin=1 THEN             HATA=1                ;Sensör Yok          ELSE            HATA=0          ENDIF          pauseus 400return


Her sensör okumadan önce bu işlemi yapıyorum ama herseferinde Hata değerini 1 olarak okuyorum. Sebebi ne olabilir.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Hocam kusura bakmayın Sanırım çözdüm sorunu. Birazdan açıklayacağım
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#10
Pullup direncinin fonksiyonunu ihmal ediyorsun. Oradaki islem sırasına dikkat et.
Bir şeye daha dikkat etmen gerek. Comm_Pin hem giriş hem çıkış çalışan bir pin.
Dolayısıyla giriş çalışacağı zaman o pinin Giriş yapılması , çıkış çalışacağı zaman ise çıkış yapılması gerekir.
Bazı komutlar bu işi otomatik olarak yapıyor. AYrıca Data_Pin diye bir şey tanılamışsın ama programın tamamını görmeyince bir şey söyleyemiyorum. Yalnızca dikkat etmeni öneriyorum o kadar.

Ete

Mucit23

Hocam sorunun sebebi yine benden kaynaklanıyor

İlk başta Data hattını sıfıra çekiyordum Ama data hattını sıfıra çekerken Data hattını çıkış olarak ayarlamayı unutmuştum. Bu yüzden Data hattı hiç sıfır konumuna inmiyordu. Şimdi çözdüm sorunu.

DS_Check:          Data_Pin=0          Comm_Pin=0          pauseus 500          Data_Pin=1          PAUSEUS 100            IF Comm_Pin=1 THEN             HATA=1               ;Sensör Yok          ELSE            HATA=0          ENDIF          pauseus 400return


Doğrusu bu şekilde olması gerekiyor.

  Yaptığım değişiklikleri dün akşam sitede paylaştığım Pic16F88 & Ds18B20 Multi Termostat Devresine uyguladım. Oradan inceleyebilirsiniz.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Tebrik ederim.
Çok da zor değilmiş değilmi?

Ete

Mucit23

Hocam zor değil elbet. Ben daha önce sensör olup olmadığını anlamakla sensörün arızalı olup olmadığını anlamak için farklı işlemler yapmam gerektiğini düşünmüştüm. Halbuki Öyle değilmiş
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal