İ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

Benzer belgeler