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 command
OWIN 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=0
TRISA=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.0
TEMP1        VAR WORD
TEMP2        VAR WORD
FLOAT1       VAR WORD
FLOAT2       VAR WORD 
ISI1L        VAR byte
ISI1H        VAR BYTE
ISI2L        VAR byte 
ISI2H        VAR BYTE     
DERECE       CON 223       

'-----------------------------------------------------------------------------
CLEAR
PAUSE 300
LCDOUT $FE,1

BASLA:
  GOSUB SENSOR1_OKU
  GOSUB SENSOR2_OKU
  GOSUB EKRAN
GOTO BASLA

SENSOR1_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 HESAP1
RETURN

SENSOR2_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 HESAP2
GOTO BASLA

HESAP1:  ;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"
RETURN
END




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