İsmail VarıĢlı
Transkript
İsmail VarıĢlı
2010 DS18B20 İsmail VarıĢlı 16.05.2010 DS18B20-1WIRE İLETİŞİM Sizlerle bu yazımda çok kullanıĢlı ve pek çok özelliği içerisinde barındıran maalesef yeterli Türkçe kaynak bulunmayan DS18B20 sıcaklık sensörü hakkında bilgi vermeye çalıĢacağım. Katalog bilgilerini diğer kaynaklar ve örnek kodlar ile birleĢtirerek anlaĢılmasını kolaylıĢtırmayı hedefledim. Gerekli mikrodenetleyici kod ve rutinlerini de ekledim. Buradaki bilgiler ve kodlarla gerekli geliĢtirmeleri yapabileceğinizi umuyorum. Herkese faydalı olmasını dilerim. Ġsmail VarıĢlı İSMAİL VARIŞLI Sayfa 2 DS18B20-1WIRE İLETİŞİM DS18B20-PROGRAMLANABĠLEN 1 WIRE DĠJĠTAL TERMOMETRE ÖZELLĠKLERĠ: Mikrodenetleyici ile 1Wire arayüzünü kullanarak tek hat üzerinden haberleşme. Her aygıt ROM hafızasında üretim esnasında belirlenen ve tek olan 64 bitlik seri koda sahiptir. Bu kod sayesinde aynı hat üzerinden birden fazla aygıt ile haberleşme. Harici bir donanım gerektirmeme. Besleme voltajı veri hattı üzerinden sağlanabilme (voltaj değeri 3.0V ile 5.5V arasındadır) -55 °C ‘den +125 °C ’ye kadar olan sıcaklık derecelerini ölçebilme. -10 °C ‘den +85 °C ‘ye kadar hassasiyeti ±0.5°C ‘dir. 9-12 bit arası kullanıcı tanımlı hassasiyet. Sıcaklık değerinin 12 bitlik koda dönüştürülmesi maksimum 750ms’dir. Kullanıcı tanımlı ve kalıcı (NV) alarm ayarı. Şekilde görülen 8-pin SO (150mil), 8-pin _SOP, and 3-pin TO-92 paket tiplerine sahip olma. DS18B20 1wire protokolünü kullanan,12bit çözünürlüğe sahip sıcaklık sensörüdür. İletişim için sadece tek port gerektirmesi, düşük enerji gereksinimi ve yüksek çözünürlüğü ile pek çok uygulamada kullanılabilecek gelişmiş bir sıcaklık sensörüdür. Her DS18B20 entegresi yalnızca kendisine has ,üretim esnasında belirlenen ve ROM belleğinde saklı olan 48bitlik(8 bit CRC kodu+48 bit seri no+8 bit aile kodu) seri koda sahiptir. Bu sayede aynı hat üzerinden birden fazla DS18B20 entegresi ile haberleşmeyi mümkün kılmaktadır.DS18B20 entegresinden sıcaklık değerlerini okumak için sadece 1WIRE protokolünü bilmek yetmez bunun yanında sensörün anlayacağı kendine özel kodlarında bilinmesi gerekir. Bu komutlar ileriki bölümlerde ROM ve fonksiyon komutları başlıkları altında açıklanacaktır. İSMAİL VARIŞLI Sayfa 3 DS18B20-1WIRE İLETİŞİM BAĞLANTI ġEKĠLLERĠ DS18B20’nin iki adet bağlantı şekli vardır. Bazı uygulamalarda sensörün bağlantı şekli birincil aygıt tarafından tanımlanması gerekir. Read Power Supply [B4h] komutu ile bunu öğrenebiliriz. Bu komutun ardından eğer sensör hattı 0 yaparsa parazit güç bağlantısı, 1 yaparsa harici kaynak bağlantısı yapılmış demektir. Read Power Supply [B4h] komutunun kullanımı ilerde fonksiyon komutları bölümünde daha ayrıntılı açıklanacaktır. 1. PARAZĠT GÜÇ BAĞLANTISI ġekil 1:Parazit-Güç Bağlantısı Bu bağlantı mikrodenetleyiciden uzaktaki sıcaklık ölçümü uygulamalarında oldukça kullanışlıdır. DQ pini 1 konumunda iken sensör gerekli olan gücünü bu pinden alır ve kendi içindeki Cpp kondansatörü şarj eder. DQ pini 0 konumunda iken şarj kondansatörü (Cpp) gerekli enerjiyi sağlar. DS18B20 sıcaklık iletişimini yaparken ve EEPROM kopyalama işlemlerinde maksimum 1.5mA akım çeker. +100 °C üzeri sıcaklıklarda bu bağlantı tipini kullanmak tavsiye edilmez. Yüksek sıcaklıklarda meydana gelen daha yüksek sızıntı akımları sıcaklık ölçümlerinde yanlışlıklara neden olabilir. Bu nedenle bu tip uygulamalarda harici güç kaynağı bağlantısını kullanmak daha doğru olacaktır. 2. HARĠCĠ GÜÇ KAYNAĞI BAĞLANTISI ġekil 2:Harici Güç Kaynağı Bağlantısı Bu bağlantının avantajı pull up mosfetinin kullanılmasının gerekmemesi ve +100 °C üzeri sıcaklıklardaki kararlı ölçümleridir. Not:Eğer mikrodenetleyici ile sensör arasındaki mesafe uzun veya hatta çok fazla sensör var ise ve iletişimde sorun yaşıyorsanız pull up direncini küçültmeyi deneyin. İSMAİL VARIŞLI Sayfa 4 DS18B20-1WIRE İLETİŞİM HAFIZA ġekil 3:DS18B20 Hafıza Haritası DS18B20 şekil3’de ayrıntıları ile görülen 8 byte’lık bir belleğe sahiptir.Bu bellek bloklarının her biri farklı işlevler için kullanılır.Sıcaklık değeri ölçülüp dönüşüm tamamlandıktan sonra belleğin byte 0-1 bölümünde saklanır. Sıcaklık değeri bu iki hafıza bloğundan alınarak mikrodenetleyici tarafından çevrimi yapılır. Sıcaklık değerinin belirli noktaları aşmaması gereken uygulamalarda sensörün alarm özelliğini kullanabiliriz. Sensörün alarm özelliği bir çeşit kesme gibidir.Böylece yazılımsal olarak sıcaklık değerini sürekli kontrol etmemiz gerekmez. Byte 2 alarm derecesinin üst sınırını ve byte 3 ise alarm derecesinin alt sınırını tutan EEPROM hafıza bloklarıdır. Yani sıcaklık byte 2’de tanımlı değere eşit yada üstüne çıkmışsa veya byte 3’de tanımlı olan değere eşit yada altına inmişse alarm bayrağı set edilir. Konfigürasyon kaydedicisi bazı ayarlamaları yapacağımız bitlere sahip bir kaydedicidir ve ilerde daha açık bir şekilde bahsedilecektir. EEPROM bellekler elektriksel olarak yazılıp silinebilen ve flash belleklere nazaran bilgileri bloklar halinde değil byte’lar şeklinde yazıp okunan bellek türüdür. DS18B20’nin hem okunup hem yazılabilen tek kaydedicileri bu 3 kaydedicidir. Diğerleri sadece okunabilir.5,6,7’nci byte’lar sadece dahili işlemler için kullanılan üzerinde yazma yada okuma yapılamayan kaydedicilerdir. Sekizinci byte sadece okunabilen ve sensörün CRC jeneratörü tarafından üretilen kodu saklayan kaydedicidir. KONFĠGÜRASYON KAYDEDĠCĠSĠ Konfigürasyon kaydedicisi sıcaklık ölçümünün çözünürlük ayarlarını yapabileceğimiz kaydedicidir. Şekil4’de kaydedicinin içeriği verilmiştir. Sıcaklık çözünürlüğünü ayarlamak için konfigürasyon kaydedicisinin bit 5 ve bit 6 değerleri olan R1-R2’ye gerekli değerleri vermemiz gerekir. Her bir çözünürlük değeri için R1 ve R2 nin değerinin ne olması gerektiği, her bir çözünürlükte sıcaklık ölçümünün süresi aşağıdaki Tablo1’de verilmiştir. DS18B20 4 farklı çözünürlükte ölçüm yapabilir. Bunlar 9,10,11 ve 12 bit çözünürlüklerdir. Sıcaklık ölçümündeki çözünürlüğe göre artış miktarı değişikliği sıcaklığın ondalık değerinde olmaktadır. Yani 12 bit çözünürlükte sıcaklık değeri 0,0625°C, 11 bit çözünürlükte 0,125°C, İSMAİL VARIŞLI Sayfa 5 DS18B20-1WIRE İLETİŞİM 10 bit çözünürlükte 0,25°C ve 9 bit çözünürlükte 0,5°C artar.Yada diğer bir deyişle bu kadar duyarlılıkta diyebiliriz. Sıcaklık hassasiyeti azaldıkça sıcaklık ölçüm süresi de azalmaktadır. Hafıza haritasında byte 0 değeri olan LS kaydedicisini tekrar inceleyecek olursanız eksilen bitlerin LS byte’ının sırasıyla 0,1 ve 2. Bitleri olduğu açıkça görülecek ve çözünürlük konusu daha iyi anlaşılacaktır. Bit 5 ve 6 haricindeki diğer bitler dahili işlemler için kullanılan bitlerdir. Yazılamazlar ve okunduklarında ise sadece 1 değerini gösterirler. ġekil 4:Konfigürasyon Kaydedicisi R1 0 0 1 1 R0 0 1 0 1 Çözünürlük 9-bit 10-bit 11-bit 12-bit Maksimum DönüĢüm Süresi 93,75ms 187,5ms 375ms 750ms Sıcaklık ArtıĢı 0,5°C 0,25°C 0,125°C 0,0625°C Tablo 1: Sıcaklık Çözünürlük Konfigürasyonu ALARM KURULUMU DS18B20 sıcaklık ölçüp, dönüşümü tamamladıktan sonra sıcaklık değeri TH ve TL kaydedicisindeki değerler ile karşılaştırılır. TH ve TL kaydedicisinin yapısı şekil5’de verilmişti. 6 bitlik sayısal bir değer ve sıcaklığın işareti içinde bir bit ayrılmıştır. S olarak gösterilen bit7 eğer 0 ise sıcaklık negatif,1 ise sıcaklık pozitif anlamına gelir. TH ve TL kaydedicisi kalıcı EEPROM bellek olduğundan enerji kesildiğinde silinmezler. ġekil 5 :TH-TL Kaydedicileri Ölçülen sıcaklık değeri TH kaydedicisindeki sıcaklık değerine eşit yada yüksek veya TL kaydedicisindeki değere eşit yada yüksek ise DS18B20 içerisindeki alarm bayrağı set edilir. Alarm bayrağı her sıcaklık ölçümünden sonra güncellenir. Eğer set edilen bir bayraktan sonra tekrar sıcaklık değeri ölçüldüğünde sıcaklık değeri alarm seviyesinin üzerinde değilse bayrak yeniden 0 yapılır. İSMAİL VARIŞLI Sayfa 6 DS18B20-1WIRE İLETİŞİM Alarmı kurmak için Write Scratchpad[4Eh] komutu kullanılır. Bu komuttan sonra TH,TL ve konfigürasyon byte’ları sırası ile yollanır. Bu yollanan veriler sırası DS18B20’nin TH,TL ve konfigürasyon kaydedicilerine kaydedilir. Alarm durumu Alarm Search [ECh] komutu ile kontrol edilir. Alarm Search [ECh] komutunun kullanımı ilerde fonksiyon komutları bölümünde daha ayrıntılı açıklanacaktır. CRC(Cyclic Redundancy Check) KODUNUN OLUġTURULMASI CRC, verilerin doğruluğunu kontrol eden bir sistemdir. Gelen veriler ile alınan verilerin aynı olup olmadığı kontrol edilir. Böylece iletişimin sağlaması yapılarak daha güvenli bir iletişim sağlanır. CRC byte’ı DS18B20’nin 64bitlik ROM kodunun bir parçasıdır ve daha önce bahsedilen hafızanın dokuzuncu byte’ında bulunmaktadır. CRC kodu ROM kodun diğer 56 bitinden hesaplanır. Birincil aygıt sensörden aldığı verileri kullanarak CRC kodunu tekrar hesaplar ve sensörden gelen CRC kod ile karşılaştırır. Eğer kodlar aynı ise veri doğru bir şekilde alınmış demektir. Aksi takdirde alınan veri hatalıdır ve iletişim tekrarlanır. ġekil 6: CRC Kod Üretici Devresi A B Q 0 0 0 0 1 1 1 0 1 1 1 0 Tablo 2: XOR Doğruluk Tablosu Aşağıda Hitech C ile yazılmış kod ile DS18B20’nin hafızası okunmakta ve LCD’de gösterilmektedir. Şekil 7’de proteus ile simülasyonu yapılan kod çalıştırıldıktan sonraki görüntü verilmiştir. Kırmızı içerisindeki kod sensörden okunan CRC kodudur. Ve bu CRC kodu LCD’de görünen diğer 8 byte’dan üretilmiştir. İSMAİL VARIŞLI Sayfa 7 DS18B20-1WIRE İLETİŞİM void bloknot_okuma(void) { unsigned char i,seri_no; DisplayClear(); while(hat_reset()); hat_byte_yaz(0xCC); hat_byte_yaz(0x44); while(hat_reset()); hat_byte_yaz(0xCC); hat_byte_yaz(0xBE); for(i=0;i<9;i++) { seri_no=hat_byte_oku(); if(i==0) DisplayInt(0,0,seri_no); if(i==1) DisplayInt(0,5,seri_no); if(i==2) DisplayInt(0,10,seri_no); if(i==3) DisplayInt(0,15,seri_no); if(i==4) DisplayInt(1,0,seri_no); if(i==5) DisplayInt(1,5,seri_no); if(i==6) DisplayInt(1,10,seri_no); if(i==7) DisplayInt(1,15,seri_no); if(i==8) DisplayInt(2,0,seri_no); } } ġekil 7:CRC Kodu-Proteus Simülasyon İSMAİL VARIŞLI Sayfa 8 DS18B20-1WIRE İLETİŞİM CRC hesaplama modülü içerisinde olan mikrodenetleyiciler mevcuttur. Fakat bu modül bulunmayan mikdenetleyicilerde bunu yazılım ile yapmamız gerekmektedir. Şekil 6’da crc kod üretici devresi görülmektedir. Bu devreyi açıklayacak olursak. İlk olarak kaymalı kaydedicimizin içeriğinin; D7 D5 D4 D3 D2 D1 D0 ‘şeklinde 1 byte’lık bir veri olduğunu ele alalım. FB= D0 (XOR) veri_biti. Yeni değerimiz; FB -- D7-- D6-- D5-- D4(XOR)FB – D3(XOR) FB – D2 – D1 ‘dir. Buradaki veri_biti sensörden okunan 64 bitlik kodun bitleridir. Ve her bit için bu işlem tekrarlanır. İşleme başlamadan önce kaymalı kaydedicinin içeriği sıfırlanmalıdır. Aşağıda crc hesaplaması yapılan altprogram verilmiştir.Bu program sadece tek bit içindir. 64 bitlik kodun her bir biti için en az değerlikli bitten başlamak üzere çağrılması gerekir. unsigned char crc8 (unsigned char kaydedici, unsigned char veri_biti) { Unsigned char FB; FB = (kaydedici & 0x01) ^= veri_biti; kaydedici = kaydedici >> 1; if (FB) { kaydedici = kaydedici ^ 8C; } return(kaydedici); } İSMAİL VARIŞLI Sayfa 9 DS18B20-1WIRE İLETİŞİM ROM KOMUTLARI : Birincil aygıt ilk olarak hatta hazırlık palsi yollar ve hattı kontrol eder. Hatta bağlı diğer aygıtlardan cevap aldıktan sonra gerekli ROM komutlarını yollamaya başlar. Eğer cevap gelmez ise iletişim kesilir. Hatta bağlı ne kadar aygıt olduğu, adresleri ya da alarm durumunda bulunan bir aygıt olup olmadığı bu komutlar ile algılanır. Bu komutlar sonunda alınan sonuçlara göre fonksiyon komutları yollanır. Beş adet 8bitlik ROM komutu vardır. ROM komutları şunlardır; SEARCH ROM [F0h] Sisteme enerji verildiğinde birincil aygıt hat üzerindeki ikincil cihazların hepsinin kimliklerini tanımlamalıdır. Birincil aygıt bu komut ile her cihazın kendine özel olan kimlik kodunu öğrenir. READ ROM [33h] Bu komut hat üzerinde yalnızca tek bir ikincil aygıt varken kullanılır. Böylece search rom kodunu kullanmadan hızlı bir şekilde hat üzerinde ikincil aygıttan okuma yapılır. MATCH ROM [55h] SKIP ROM [CCh] ALARM SEARCH [ECh] Bu komutu 64bitlik ROM kodu takip eder. Bu komuttan sonra sadece yazılacak olan kimlik numarasına sahip aygıt komutlara cevap verir. Birincil aygıtın hat üzerindeki tüm cihazları ROM kodlarını göndermeden önce adreslemesi için kullanılır. ROM kodu göndermeden fonksiyon kodu gönderileceğini sensöre bildirir. Bu komut tıpkı search rom kodu gibi çalışır. Fakat bu koda yalnızca alarm bayrağı kurulmuş olan sensörler cevap verir. FONKSĠYON KOMUTLARI: Fonksiyon komutları ROM komutlarından sonra gönderilir. Sensörün hafızasından okuma ve yazma işlemleri için gerekli komutları içerir.Fonksiyon komutları şunlardır; Bu komut sıcaklık iletişimini başlatır. Bu iletişimden sonra sıcaklık bilgisi bloknot hafıza üzerindeki 2-byte lık sıcaklık CONVERT T [44h] kaydedicisinde saklanır ve DS18B20 düşük güçlü boş durumuna döner. WRITE SCRATCHPAD [4Eh] Bu komut sensörün TH,TL ve Konfigürasyon kaydedicilerinin değerlerini değiştirmek ve yeni verilerin yazılması için kullanılır.Bu komuttan sonra gönderilen 3byte’lık veri sırası ile TH,TL ve konfigürasyon kaydedicilerine yazılır. READ SCRATCHPAD Bu komut sensörün hafıza içeriğinin okumasını sağlar. [BEh] COPY SCRATCHPAD Bu komut TH,TL ve konfigürasyon kaydedicilerinin içeriğini EEPROM ‘a kaydetmemizi sağlar. [48h] RECALL E2 [B8h] Bu komut alarm tetikleme değerleri olan TH ,TL ve konfigürasyon verilerini EEPROM hafızasından çağırır ve bloknot hafızasına sırasıyla 2,3,4 üncü byte’lara yerleştirir. READ POWER SUPPLY [B4h] DS18B20’nin güç bağlantısının ne olduğunu öğrenmek için kullanılır. DS18B20 birincil aygıta bağlantı türünü iletir. İSMAİL VARIŞLI Sayfa 10 DS18B20-1WIRE İLETİŞİM ĠLETĠġĠM ZAMANLAMASI DS18B20 ile senkron seri iletişim yapıldığı için veri gönderme, alma zamanlamaları ve sırası çok önemlidir. Eğer göndereceğimiz komutların iletişim hızı düşük yada yüksek olursa ve istenilen sırada gönderilmez ise sensör göndereceğimiz komutları algılayamayacak ve cevap vermeyecektir.DS18B20 ile iletişim sıralaması şu şekildedir. 1. Bu hazırlık evresidir. Birincil aygıt ilk olarak hattı 0’a çeker. Eğer hattaki ikincil aygıttan cevap gelirse ikinci adıma geçilir. 2. İkinci adımda ROM komutları gönderilir. Bu komutu gerekli veri bilgileri takip eder. Örneğin hatta eğer ikincil aygıt eşleştirme ROM komutu yollanmış ise bu kodu sıcaklık değeri okunacak ikincil aygıtın seri numarası takip eder. Ya da direk fonksiyon komutu yollanır. 3. Son olarak ROM komutuda yollandıktan sonra fonksiyon komutları yollanır. Yine bu fonksiyon komutlarını eğer gerekli ise veriler takip eder. Eğer bu adımlarda herhangi bir aksama olursa iletişim kesilir. İletişim kesildikten sonra devam edilmesi için tekrar birinci adımdan başlanması gerekir. ĠletiĢimi baĢlatma: 1Wire iletişim yönteminde hazır olma haricindeki tüm haberleşmeyi mikrodenetleyici başlatır. DS18B20 sadece hazır olduğunu bildiren sinyali alıcı tarafa göndererek işlemi başlatır.İletişim için ilk olarak birincil aygıt hattı 0 durumuna çeker ve en az 480uS bu durumda tutar.Bu süre sonunda pull up direnci hattı tekrar 1 durumuna getirir.Bunun için yaklaşık 15-60µS kadar beklenir.Ardından DS18B20 hattı yaklaşık olarak 60-240µs 0 konumuna çeker. Bu sensörün iletişim için hazır olduğunu gösterir. Sensörden hazır sinyali alındıktan sonra artık sıcaklık sensörümüz komutları almaya hazırdır. Eğer 480µS sonunda hattan cevap alınmaz ise iletişim kesilir. Çizgi Tiplerinin Anlamları Birincil aygıt hattı sıfır yapıyor Ds18B20 hattı sıfır yapıyor Pull up direnci hattı bir yapıyor ġekil 8:DS18B20 ĠletiĢim Hazırlık Sinyalleri Aşağıda hattı hazır konuma getiren Hitech C ile yazılmış kod parçası verilmektedir. Altprogram 0 değeri döndürürse hattan cevap gelmiyor demektir ve iletişim kesilir. Eğer 1 değeri döndürülürse hattaki aygıt hazır demektir ve iletişime devam edilir. İSMAİL VARIŞLI Sayfa 11 DS18B20-1WIRE İLETİŞİM #define TRIS_W TRISD0 #define hat RD0 unsigned char hat_reset (void) { unsigned char sonuc; hat=0; TRIS_W=0; DelayUs(250);DelayUs(250); TRIS_W=1; DelayUs(70); sonuc=WIRE; DelayUs(250);DelayUs(250); return sonuc; } İSMAİL VARIŞLI //Hat birincil aygıtın RD0 portuna tanımlanıyor. // Hat sıfıra çekiliyor // Hat çıkıs yapılıyor // 640us>x>480us arasında bekleniyor // Pull-up yükseltmesi bekleniyor // 70us bekleniyor // 0 Hazır, 1 Hazır değil // 640us>x>480us arasında bekleniyor Sayfa 12 DS18B20-1WIRE İLETİŞİM SICAKLIK DEĞERĠNĠN OKUNMASI VE HESAPLANMASI İletişim tam ve hatasız bir şekilde gerçekleştikten sonra sensörden okuyacağımız 2 adet 8 bitlik veridir. Bu ikilik verinin ondalık sıcaklık değerine dönüştürülmesi gerekir. Aşağıdaki şekilde yüksek ve düşük değerlikli iki byte’ın değer katsayıları verilmiştir. Bu katsayılara göre ikilik ondalık dönüşüm yapılır. LS byte’ın ilk 4 biti sıcaklık değerinin ondalıklı kısmını verir. Bit 10-4 sıcaklık değerinin tam kısmını verir.12.bit işaret bitidir.1 ise sıcaklık değeri negatif, 0 ise pozitiftir. Sıcaklık değeri negatif olduğunda sıcaklık değerini hesaplama için ondalık dönüşüm yapmadan önce tümleyenini almak gerekir. ġekil 9:DS18B20 Sıcaklık Değerini Saklayan Hafıza Blokları Örnek: Sıcaklık +25.0625°C -25.0625°C Ġkilik ÇıkıĢ 0000 0001 1001 0001 1111 1110 0110 1111 Yukarıdaki değerler aynı sıcaklığın negatif ve pozitif değerlerini göstermektedir. Böylece aralarındaki farkı görebiliriz.16 bitlik ikilik çıkışın ilk 4 bitinin ondalık kısmın değerini verdiğini söylemiştik. Yani 0001 değeri ondalık değerimizdir.İkilik ondalık dönüşümü yapılırsa bu değer 0.0625 ( ) eder.Sayının tam kısmı için ise 10-4 arasındaki bitler dikkate alınır.Pozitif sıcaklık için 001 1001 değeridir. Bu sayıyı ondalık sayı sistemine çevirdiğimizde 25 eder. Negatif sıcaklık değeri için ikilik çıkış 110 0110.Dikkat ederseniz bu değer pozitif sıcaklık değerinin terslenmiş halidir. Yani birler sıfır, sıfırlarda bir yapılmış halidir.Bu nedenle eğer 12.bit değeri 1 ise ikilik çıkışın tam sayı kısmını ilk olarak tersler daha sonra ondalık sayı sistemine çeviririz. 12.bitin negatif sıcaklık değeri için 1 pozitif sıcaklık değeri için ise 0 olduğuna dikkat edin. Aşağıdaki bu örnekle anlattıklarımızı yapan Hitech C kodu bulunuyor. Bu kodu inceleyerek konuyu daha iyi anlayabiliriz. lsb = hat_byte_oku(); //sıcaklık değerinin ilk byte’ı lsb değişkenine atanıyor msb = hat_byte_oku(); //sıcaklık değerinin ikinci byte’ı msb değişkenine atanıyor while (hat_reset()); //Hatta iletişimi bitiren reset sinyali gönderiliyor ondalik=0; sicak=(msb<<4)+(lsb>>4); //Bit 10-4 deki ondalık değer sicak değişkenine atanıyor if(sicak & 0x80) //msb nin 11.biti 1 ise sıcaklık negatif 0 ise pozitif değer { sicak=~sicak; //sıcaklık negatif ise okunan ters çevriliyor. lsb=~lsb & 0x0F; } if(lsb & 0x08) if(lsb & 0x04) if(lsb & 0x02) if(lsb & 0x01) İSMAİL VARIŞLI onda =0.500; onda+=0.250; onda+=0.125; onda+=0.0625; Sayfa 13 DS18B20-1WIRE İLETİŞİM DS18B20 ÇALIġMASI ÖRNEK 1 Aşağıdaki örnekte birden fazla DS18B20 ile aynı hatta bağlı ve parazit güç bağlantısı kullanılmıştır. Birincil aygıt sıcaklık iletişimine belirli bir DS18B20 ile başlar. Daha sonra DS18B20’nin bloknot hafızası okunur ve alınan verinin kontrolü için CRC kodu hesaplanır. MOD VERĠ AÇIKLAMA TX RESET Birincil aygıt reset palsi gönderir DS118B20 hazır olduğunu bildiren palsi göndererek RX Hazır Bulunma cevap verir. Birincil aygıt Eşleştirme ROM komutunu gönderir. TX 55h Bu komuttan sonra gönderilecek seri numarasına sahip aygıt ile haberleşme yapılacağını bildirir. Birincil aygıt DS18B20 hatta iletişim kurulacak TX 64-bit ROM kod sensörün ROM kodunu gönderir. TX 44h Birincil aygıt sıcaklık dönüşüm komutunu gönderir. DQ hattı 1’de Birincil aygıt sensörün dönüşüm yapmasını TX tutuluyor. beklemesi süresince hattı 1 seviyesinde tutar. TX Reset Birincil aygıt reset palsi gönderir. DS118B20 hazır olduğunu bildiren palsi göndererek RX Hazır Bulunma. cevap verir. Birincil aygıt Eşleştirme ROM komutunu gönderir.Bu TX 55h komuttan sonra gönderilecek seri numarasına sahip aygıt ile haberleşme yapılacağını bildirir. Birincil aygıt DS18B20 hatta iletişim kurulacak TX 66-bit ROM kod sensörün ROM kodunu gönderir. Birincil aygıt Read Scratcpad komutunu,yani TX BEh hafızanın okunacağını bildiren komutu gönderir. Birincil aygıt içinde CRC kodu ile beraber hafızanın tamamını okur. Birincil aygıt gelen ilk 8 byte’ı kullanarak(DS18B20 hafıza bloğunun ilk 8 byte’ı) RX 9 byte veri CRC kodunu tekrar hesap eder.Ve DS18B20 tarafından yollanan 9.byte olan CRC kodu ile karşılaştırır.Eğer eşleşiyorsa işleme devam edilir.Aksi takdirde iletişim tekrarlanır. İSMAİL VARIŞLI Sayfa 14 DS18B20-1WIRE İLETİŞİM ÖRNEK 2 Bu örnekte parazit güç bağlantısı yapılmış bir adet DS18B20 ile iletişim anlatılacaktır. Birincil aygıt TH,TL ve konfigürasyon kaydedicilerini ilk olarak yazar,sonra hafızayı okur ve CRC kodunu yeniden hesaplayarak gelen verinin doğruluğunu kontrol eder. Birincil aygıt hafıza içeriğini EEPROM’una kopyalar. MOD TX VERĠ RESET RX Hazır Bulunma TX CCh TX 4Eh TX 3 byte’lık veri TX RESET RX Hazır Bulunma TX CCh TX BEh RX 9 byte veri TX RESET RX Hazır Bulunma TX CCh TX 48h TX DQ hattı 1’de tutuluyor. AÇIKLAMA Birincil aygıt reset palsi gönderir DS118B20 hazır olduğunu bildiren palsi göndererek cevap verir. Birincil aygıt Skip ROM komutu gönderir.Bu herhangi bir ROM işlemi yapılmayacağı sadece fonksiyon komutu gönderilecek demektir. Birincil aygıt Hafızaya yazı yazma komutunu gönderir. Birincil aygıt sırası ile TH,TL ve konfigürasyon kaydedicilerinin değerinin gönderir. Birincil aygıt reset palsi gönderir DS118B20 hazır olduğunu bildiren palsi göndererek cevap verir. Birincil aygıt Skip ROM komutu gönderir.Bu herhangi bir ROM işlemi yapılmayacağı sadece fonksiyon komutu gönderilecek demektir. Birincil aygıt Hafıza okuma komutunu gönderir. Birincil aygıt içinde CRC kodu ile beraber hafızanın tamamını okur. Birincil aygıt gelen ilk 8 byte’ı kullanarak (DS18B20 hafıza bloğunun ilk 8 byte’ı) CRC kodunu tekrar hesap eder.Ve DS18B20 tarafından yollanan 9.byte olan CRC kodu ile karşılaştırır.Eğer eşleşiyorsa işleme devam edilir.Aksi takdirde okuma işlemi tekrarlanır. Birincil aygıt reset palsi gönderir DS118B20 hazır olduğunu bildiren palsi göndererek cevap verir. Birincil aygıt Skip ROM komutu gönderir.Bu herhangi bir ROM işlemi yapılmayacağı sadece fonksiyon komutu gönderilecek demektir. Birincil aygıt Hafıza kopyalama komutunu gönderir. Birincil aygıt sensörün kopyalama işlemi yaptığı süre boyunca en az 10ms hattı 1 seviyesinde tutar. *TX verinin birincil aygıt tarafından gönderildiğini, RX ise verinin birincil aygıt tarafından alındığını göstermektedir. *Veri gönderilirken yada alınırken en düĢük bitten baĢlanır.Yani alınan yada gönderilen ilk bit sıfırıncı bittir. İSMAİL VARIŞLI Sayfa 15 DS18B20-1WIRE İLETİŞİM Bu örnekler ile iletişimin sıralaması ve zamanlaması ile ilgili gerekli mantık sanırım anlaşılmıştır. Tek bir hat üzerinden birden fazla sensör ile iletişim kurmamız gereken uygulamalarda her bir sensörün seri numarasını tek tek almamız ve enerji kesildiğinde seri numaraların kaybolmaması için mikrodenetleyicinin epromuna kaydetmemiz gerekir. Daha sonra hangi noktadaki sıcaklık değerini ölçmek istiyorsak eproma kaydettiğimiz o sensöre ait kimlik kodunu kullanırız. Şimdi bu kodları sensörden nasıl okuyacağımızla ilgili gerekli kodları görelim. Hitech C ile hazırlanmış bu alt program sensörden okumuş olduğu seri kodu LCD’ye yazdırıyor. Böylece proteusta DS18B20’nin seri kodunu değiştirerek çıkan sonuçları gözlemleyebilirsiniz. Şekil10 proteusta DS18B20 sensörünün özellikler penceresini gösteriyor. Resim şekil11 daki devrede ilk sensöre sağ tıklayıp edit properties menüsüne girildikten sonra alındı. Kırmızı ile daire içerisine alınan kutu sensörün seri numarasını göstermektedir. Şekildeki değer proteusun vermiş olduğu varsayılan değer olup her eklediğiniz sensörünkü aynıdır. Bu nedenle eğer proteusta tek hatta birden fazla sensör simülasyonu yapacaksanız eklediğiniz her sensörün bu kodunu değiştirmeniz gerekir. İkinci önemli nokta mikrodenetleyiciye sensörü tanıtmanız ve seri kodunu okumanız gerektiğinde hatta başka aygıtın olmaması gerektiğidir. Eğer hatta birden fazla aygıt var ve biz read rom komutunu yollarsak hattaki tüm aygıtlar buna cevap vereceği için alınan değerler yanlış olacaktır. Aşağıdaki bu kodu kullanarak yapacağınız değişikliklerin sonuçlarını takip edebilirsiniz. void sensor_ekle(void) { unsigned char i,seri_no; while(hat_reset()); hat_byte_yaz(0x33); for(i=0; i<8; i++) { seri_no=hat_byte_oku(); if(i==0) DisplayInt(0,0,seri_no); if(i==1) DisplayInt(0,5,seri_no); if(i==2) DisplayInt(0,10,seri_no); if(i==3) DisplayInt(0,15,seri_no); if(i==4) DisplayInt(1,0,seri_no); if(i==5) DisplayInt(1,5,seri_no); if(i==6) DisplayInt(1,10,seri_no); if(i==7) DisplayInt(1,15,seri_no); } } İSMAİL VARIŞLI ġekil 10:DS18B20-ROM Seri No Sayfa 16 DS18B20-1WIRE İLETİŞİM ġekil 11:DS18B20 Seri No-Proteus İSMAİL VARIŞLI Sayfa 17 DS18B20-1WIRE İLETİŞİM EK 1:Hitec Pic C için 1Wire iletiĢim kütüphane dosyası.(20MHz’de çalıĢan mikrodenetleyici için.Farklı frekanslar için DelayUs() komutlarını değiĢtirmeniz gerekir.Örneğin 4MHz için yazılan DelayUs adedini 5’e bölün) #define TRIS_W TRISD0 #define WIRE RD0 //Bağlantılar unsigned char hat_reset(void) { unsigned char sonuc; WIRE=0; // Hat sıfıra çekiliyor TRIS_W=0; // Hat çıkıs yapılıyor DelayUs(250);DelayUs(250); // 640us>x>480us arasında bekleniyor DelayUs(250);DelayUs(250); DelayUs(250);DelayUs(250); DelayUs(250);DelayUs(250); DelayUs(250);DelayUs(250); TRIS_W=1; // Pull-up yükseltmesi bekleniyor DelayUs(70); DelayUs(70);DelayUs(70);DelayUs(70);DelayUs(70);// bekleniyor 70us sonuc=WIRE; // 0 Hazır, 1 Hazır değil DelayUs(250);DelayUs(250); // 640us>x>480us arasında bekleniyor DelayUs(250);DelayUs(250); DelayUs(250);DelayUs(250); DelayUs(250);DelayUs(250); DelayUs(250);DelayUs(250); return sonuc; } unsigned char hat_bit_oku(void) { unsigned char veri; WIRE=0; // Hat sıfıra çekiliyor TRIS_W=0; DelayUs(5);DelayUs(5);DelayUs(5);DelayUs(5);DelayUs(5);// 5 bekleniyor TRIS_W=1; // Pull-Up'ın hattı yükseltmesi bekleniyor DelayUs(10);DelayUs(10);DelayUs(10);DelayUs(10);DelayUs(10); mikrosaniye bekleniyor if(WIRE) // Hat okunuyor veri=1; // Okunan veri 1 else veri=0; // Okunan veri 0 DelayUs(60);DelayUs(60);DelayUs(60);DelayUs(60);DelayUs(60); return veri; } void hat_bit_yaz(unsigned char veri) { if(veri) // 1 gönderiliyor { İSMAİL VARIŞLI mikrosaniye // 10 Sayfa 18 DS18B20-1WIRE İLETİŞİM TRIS_W=0; // Hat sıfırlanıyor WIRE=0; DelayUs(5);DelayUs(5);DelayUs(5);DelayUs(5);DelayUs(5);// mikrosaniye bekleniyor TRIS_W=1; // Pull-Up'ın hattı yükseltmesi bekleniyor DelayUs(60);DelayUs(60);DelayUs(60);DelayUs(60);DelayUs(60);// mikrosaniye bekleniyor } else // 0 gönderiliyor { TRIS_W=0; // Hat sıfırlanıyor WIRE= 0; DelayUs(60);DelayUs(60);DelayUs(60);DelayUs(60);DelayUs(60); // mikrosaniye bekleniyor TRIS_W=1; // Pull-Up'ın hattı yükseltmesi bekleniyor } } unsigned int hat_byte_oku(void) { unsigned char i,veri=0, bitler=1; for(i=0;i<8;i++) { if ( hat_bit_oku() == 1 ) veri |= bitler; bitler=bitler<<=1; } return veri; } void hat_byte_yaz(unsigned char veri) { unsigned char bitler=1, i; for (i=0;i<8;i++) { if (veri&bitler) { hat_bit_yaz(1); } else { hat_bit_yaz(0); } bitler=bitler<<=1; } } 5 60 60 Yazan ve Hazırlayan :Ġsmail VARIġLI İSMAİL VARIŞLI Sayfa 19