Tek hattan birden fazla DS18B20 kullanmak

Başlatan MS_59, 12 Şubat 2015, 11:44:07

MS_59

hocam merhaba
DS18B20 ile merak ettiklerim var net'e ve datasheet'te baktımda pek anlamadım
üretilen herbir sensörün benzersiz 64 bitlik ROM kodu var bunu biliyorum fakat sensörü devreye bağladığımda  bunu nasıl okuyacağım
netten bulduğum bu kodu sensörden nasıl okumuşlar
OWOUT DQ , 1, [$55,$28,$30,$C5,$B8,$00,$00,$00,$8E,$44]
burada $55 rom okuma komutu, kırmızıyla yazılan rom kodu, $44 ise sıcaklık çevrimine başla komutu oluyor değilmi
pbp helpine baktığımda OWIN mod numaraları 0-1-2 var sadece ama bakıyorum programlarda OWIN    Comm_Pin, 4, [Busy] buradaki 4 nedir busy datasheette hangi registerdir  yada nedir bildiğim sıcaklık okumamın bittiğidir ama bunu datasheetten bulamadım
aslında RTC gibi DS18B20 ile ilgili bi yazı hazırlayabilirmisiniz hocam
mehmet

Mucit23

ID[8] şeklinde bir dizin olsun. Bu dizi 64 bitlik rom kodunu temsil edecek.

Sensörün kendi ID sini okumak için ilk önce 0x33 yani READ_ROM komutunu göndermek gerekir. Ardından doğrudan okuma yapacaksın. Sensör sıra ile 64 bitlik ID sini gönderecektir.

Aşağıdaki kodlar sensörün 64 bitlik rom kodunu okumak için yeterlidir.

OWOUT DQ, 1, [$33' Issue Read ROM commandOWIN DQ, 0, [STR ID\8]' Read 64-bit device data into the 8-byte array "ID"


Bu işlem yapılırken Hatta sadece tek bir sensör olacağı unutulmamalıdır.

Diyelimki sensörlerin ID lerini okuduk. Hafızada eepromda yani unutulmayacak bir yerde saklıyoruz. Bundan sonra sensörlerden ayrı ayrı sıcaklık bilgisini okumamız gerekiyor. Nasıl yapacağız?

Şöyle;
Normalde tek bir sensör okunacaksa Sıcaklık dönüşümü yapılması için sensöre ilk önce 0xCC yani SKIP_ROM komutunu gönderiririz. Ardından 0x44 yani COVERT_TEMPERATURE komutunu göndererek sıcaklık dönüşümünü başlatırız. Dönüşüm işlemi tamamlanınca yine 0xCC ile birlikte 0xBE yani READ SCRATCHPAD komutunu gönderip ardından 16 bitlik sıcaklık okumasını yaparız.

Eğer birden fazla sensör okuması yapılacaksa Tüm işlemlerden 0xCC yerine 0x55 yani  MATCH ROM komutunu göndeririz. Ardından okuyacağımız sensöre ait 64 bitlik ROM kodunu ve yine Sıcaklık dönüşümünü başlatmak için 0x44 komutunu göndeririz.
Sonrasında dönüşüm işlemini tamamlanmasını bekliyoruz. Dönüşüm işlemi tamamlandıktan sonra 0x55+64Bit Rom+0xBE  komutlarını gönderip yine 16 bitlik sıcaklık okuması yaparız. Hepsi bundan ibaret.

Çoklu sensör okumalarında unutulmaması gereken şey sensöre hangi komut verilecekse ilk önce 0x55+64Bit ROM gönderilmelidir.

Aşağıdaki kodlarda iki sensör okuması yapılıyor.
'****************************************************************'*  Name    : WiRE.BAS                                          *'*  Author  : [FERHAT YOL]                                      *'*  Notice  : TEK KABLO İLE İKİ ADET SENSÖR OKUMA İŞLEMİ        *'*          :                                                   *'*  Date    : 19.12.2010                                        *'*  Version : 1.0                                               *'*  Notes   : Her bir Sensör 64 Bitlik Rom koduna sahiptir.     *'*          : Her cihazın özel bir kodu var. Bu kod sayesinde   *'*          : Aynı hattan one wire ile çalışan birden fazla     *'*          : cihaz kontrol edilip okunabilir.                  *'****************************************************************PORTA=0:PORTB=0TRISA=0     TRISB=%00000001 '-----------------------------------------------------------------@ 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ılmıyor.@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak '-----------------------------------------------------------------DEFINE LCD_DREG PORTB 'LCD data bacakları hangi porta bağlı?DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?DEFINE LCD_EREG PORTB 'LCD Enable Bacağı Hangi Porta bağlı?DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?define LCD RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?define LCD_RWBIT    2       'LCD R/W Bacağı Hangi bite bağlı ?DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?DEFINE LCD_RSBIT 1 'LCD RS bacağı Hangi Bite bağlı  ?DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor'-------------------------------------------------------------------------CMCON=7    'comparatör iptal'----------------------------------------------------------------------------DQ           VAR PORTB.0TEMP1        VAR WORDTEMP2        VAR WORDFLOAT1       VAR WORDFLOAT2       VAR WORD  ISI1L        VAR byteISI1H        VAR BYTE ISI2L        VAR byte  ISI2H        VAR BYTE     DERECE       CON 223        '-----------------------------------------------------------------------------CLEAR PAUSE 300LCDOUT $FE,1BASLA:  GOSUB SENSOR1_OKU  GOSUB SENSOR2_OKU  GOSUB EKRANGOTO BASLASENSOR1_OKU:  ;1. Sensör Rom kodu = $28,$6E,$D7,$B8,$00,$00,$00,$4C    OWOUT DQ, 1, [$55,$28,$6E,$D7,$B8,$00,$00,$00,$4C,$44] ;Sıcaklık Dönüşümünü Başlat    OWOUT DQ, 1, [$55,$28,$6E,$D7,$B8,$00,$00,$00,$4C,$BE] ;Scratchpad'i okuyacağımızı sensöre bildir.    OWIN DQ, 2, [Temp1.LOWBYTE,Temp1.HIGHBYTE]             ;Sıcaklık Değerini oku    GOSUB HESAP1RETURNSENSOR2_OKU:  ;2. Sensör Rom kodu = $28,$30,$C5,$B8,$00,$00,$00,$8E    OWOUT DQ, 1, [$55,$28,$30,$C5,$B8,$00,$00,$00,$8E,$44] ;Sıcaklık Dönüşümünü Başlat    OWOUT DQ, 1, [$55,$28,$30,$C5,$B8,$00,$00,$00,$8E,$BE] ;Scratchpad'i okuyacağımızı sensöre bildir.    OWIN DQ, 2, [Temp2.LOWBYTE,Temp2.HIGHBYTE]             ;Sıcaklık Değerini oku    GOSUB HESAP2GOTO BASLAHESAP1:  ;1. Sensörden okunan sıcaklık değeri hesaplanıyor                 FLOAT1 = (TEMP1*10)/16            ISI1H=FLOAT1/10     ISI1L=FLOAT1//10 RETURN  HESAP2:  ;2. Sensörden okunan sıcaklık değeri hesaplanıyor     FLOAT2 = (TEMP2*10)/16            ISI2H=FLOAT2/10     ISI2L=FLOAT2//10 RETURN   EKRAN:    LCDOUT $FE,$80,"1.SENSOR=",DEC2 ISI1H,",",DEC1 ISI1L,DERECE,"C"    LCDOUT $FE,$C0,"2.SENSOR=",DEC2 ISI2H,",",DEC1 ISI2L,DERECE,"C"RETURNEND


Yukarıdaki kodları ben gerçekte denemedim. Sadece isiste deneyip çalıştırdım. Yukarıdaki kodlarda gördüğünüz üzere ROM kodlarını programda sabit olarak vermişim.

iyi çalışmalar.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

MS_59

çok teşekkür ederim
olayı çözdüm ama anlamadığım yerler var STR komutu nasıl çalışıyor
birde sıcaklık ölçümü bittiğini bu aletin neresinden [busy] okuyup ta anlıyoruz
şuan 3 sensörü ayrı ayrı ölçebiliyorum isiste birde gerçekte deneyeceğim
mehmet

sonmoikan

#3
Faydalı bilgilerinden dolayı Mücit arkadaşımıza çok teşekkür ediyorum.
ABDULLAH

Mucit23

Alıntı yapılan: proteus - 12 Şubat 2015, 15:31:01
çok teşekkür ederim
olayı çözdüm ama anlamadığım yerler var STR komutu nasıl çalışıyor
birde sıcaklık ölçümü bittiğini bu aletin neresinden [busy] okuyup ta anlıyoruz
şuan 3 sensörü ayrı ayrı ölçebiliyorum isiste birde gerçekte deneyeceğim

Sensöre sıcaklık dönüşümü için start verdiğimiz anda hat sensör tarafından lojik 0 yapılır. Dönüşüm işlemi tamamlanınca hat lojik 1 olur. Biz buradan dönüşüm işleminin tamamlandığını anlıyoruz.

STR komutu ise genellikle dizilerle birlikte veya Sıralı göndermelerde ve okumalarda kullanılıyor. STR komutuyla Dizi gönderilirken dizi isminin yanında ters eğik çizgi ile gönderilecek byte sayısı verilir. Aynı şekilde sıralı okumalarda da yapılır. Kaç byte okunacaksa ters eğik çizgi ile dizinin yanında belirtilir.

Aslında ETE hoca anlatsa daha iyi olcak. Verdiğim bilgiler eksik veya yanlış olabilir.



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

www.arectron.com/

MS_59

#5
mucit verdiğin bilgiler için çok teşekkür ederim şimdi daha iyi anladım
birde STR yi ete hocam biraz açarsanız güzel olur
mehmet

ete

STR yi nerede gördünüz? ona göre anlatayım. Yerine göre değişir ama asıl amacı dizi değişkenlerini bir döngü kurmadan alıp vermeye yarayan bir komut dur.
Mesela SEROUT2 komutunda kullanılırsa;
STR ArrayVar{\n} şeklinde kullanılıyor ve dizinin n elemanını tek bir komut ile yollayabiliyor.
Değişken ile örneklersek,

VERI VAR BYTE[10] şeklinde bir dizi değişkeni tanımladınız.
Program içinde VERI değişkenlerine index'e bağlı olarak değerler verdiniz ve şimdi bunları yollamak istiyorsunuz diyelim,
SEROUT Data_pin,[STR VERI \10] komutunu verdinizmi 10 adet dizi elemanı bir komutla karşıya yollanmış olur.

Benzer şekilde HSERIN [STR VER\5\"Z"] şeklinde bir komut yazarsanız,
Gelen 5 ayrı karekte VER isimli dizi değişkeninin ilk 5 elemanına yerleştirilir ve işlem de Z karekteri alınınca sona erer. Z isteğe bağlı bir işlem olup yazılırsa program Z yi bekler değilse ilk gelen 5 karakter diziye aktarılı.

Başka bir şekilde, WAITSTR ArrayVar{\n} şeklinde HSERIN komutu içinde de kullanılır.

HSEROUT ile STR ArrayVar{\n}  şeklinde kullanılır.

Çok kullanıldığı yerlerden bir başkasıda harici epromlara veya epromlardan bir dizinin tek bir komutla aktarılması şeklindedir.
I2CREAD Data,CLK,CONTROL,ADRES,[STR VERI\10] şeklinde veya tersi olarak I2CWRITE ilede benzer iş yapılabilir.

Yine benzer şekilde LCDOUT komutu ile bir dizi elemanları tek bir komutla yazdırılabilir.
LCDOUT $FE,$80, STR VERI veya STR VERI\5 gibi. \n parametresi kullanılmaz ise dizininbütün elemanı yazdırılıyor sanırım.

Aynı şekilde OWIN ve OWOUT komutları içinde de kullanılabiliyor fakat 12bit denetleyicilerde bu komut desteklenmiyor. Yalnızca 14 bit ve yukarısı işlemciler için geçerli bu komut.

Ete



MS_59

hocam çok teşekkür ederim hepsini çok güzel açıklamışsınız
mehmet

Powered by EzPortal