MSP430 Uyg.34 – DS18B20 Sıcaklık Sensörü Uygulaması
Ferudun GÖKCEGÖZ, 02 Eylül 2011, Cuma
Merhaba arkadaşlar. Yeni bir uygulamamızda yine sizlerle birlikteyiz.
Geçenki uygulamada söylediğimiz gibi bu dersimizde OneWire protokolü ile haberleşen Maxim – Dallas firmasına ait DS18B20 sıcaklık sensörü ve termostat entegresi ile bir uygulama yapacağız. Bir önceki yazımda OneWire protokolünden bahsetmiştim. Bu nedenle bu yazıda OneWire protokolünden bahsetmeyip, sadece aynı C kütüphanesini kullanarak, DS18B20 ile nasıl haberleşeceğimizi anlatacağım. İlk olarak devre şemasını vererek uygulamamıza başlayabiliriz.
Devre şemasında görüldüğü gibi bir adet MSP430, bir adet LCD ekran ve DS18B20 entegremiz bulunmaktadır. İlk olarak DS18B20 entegresinden bahsedelim isterseniz.
• DS18B20 OneWire protokolüyle haberleşebilen dolayısıyla mikrodenetleyici ile haberleşmek için sadece tek bir hattın yeterli olduğu bir entegredir. Ekstradan besleme gerektirmez fakat harici olarak besleme girişide bulunmaktadır.
• OneWire cihazlarına özgü olan 64 bit lik Rom Code bulundurmaktadır. Önceki yazımızda bahsettiğimiz gibi, bu 64 bitin ilk 8 biti Aile Kodu, Sonraki 48 biti seri numarası, son 8 biti ise CRC kodudur.
• Harici besleme kullanılacaksa 3V ~5.5V arasında bir besleme aralığına sahiptir.
Maksimum 750 msn de 12 bitlik çözünürlüğe sahip (8bit tam kısım + 4 bit ondalık kısım olmak üzere) sıcaklık verisi elde edilebilir.
• Standart olarak 12 bitlik çözünürlüğe sahip olmasına rağmen 9,10 ve 11 bit çözünürlükte çalışmak üzerede ayarlanabilir. Çözünürlük sayısı azaldıkça, sıcaklık verisinin 8 biti sabit kalmakta sadece 4 bitlik ondalık kısmın bit sayısı azalmaktadır.
• -55 C ~ +125 C(-67 F ~ +257 F) arasında ölçüm aralığına sahip olup -10 C ~+85 C arasında 0.5 C hassasiyetle ölçüm yapılabilmektedir.
• Termostat olarak kullanmak için kullanıcının tanımlayabileceği alarm kaydedicileri barındırmaktadır. Entegrenin ölçtüğü sıcaklık ile alarm kaydedicilerine kaydedilen sıcaklık otomatik olarak karşılaştırılıp alarm durumu oluşup oluşmadığı entegreye alarm sorgulama komutu gönderilerek tespit edilebilir.
• TO92, SO8, uSOP kılıflarında üretilebilmektedir. Aşağıda entegrenin kılıflarına ait görüntüleri görebiliriz.
Aşağıda bunlard
TEMPE
Yukarıd Byte ol Örneğin olduğu ağırlıkla görmek son 4 b verisinin edilirke değer(sı sıcaklık
a DS18B20 dan önemli o
ERATURE
daki tabloda lmak üzere n ilk 4 bit
için, sıcakl arı 0.0625, k istiyorsak biti ise sıca
n yüksek dö n, Low Byt ıcaklık veris k negatif ise
içerisinde b olanlarına k
E KAYDED
anda görüld iki byte tır
“1000″ ise lık veriside
0.125, 0.25 bu bitleri k aklık verisi ört biti ise H te ın son dö sinin tam kı e bu dört b
bulunan kay kısaca değin
DİCİLERİ
düğü gibi sı r. Low Byt
bu şu anla
“XX.5″ şek 5, 0.5 olmak kontrol edip
inin tam kı High Byte ı ört biti ile H ısmı) elde e bit 1 olmakt
ydedicilere elim.
caklık veris te ın ilk 4 ama gelmek klinde olac ktadır. Yazı düzgün bir ısmının low ın ilk dört b High Byte ın edilir. High
tadır. Ve sı
ait RAM H
sini tutan k biti ondalık ktedir. BIT
aktır. Sırası ılım içerisin r şekilde lcd w nibble ı
bitidir. Yaz n ilk dört bi
Byte ın son ıcaklık veri
aritası görü
aydedicilerd k kısma ait T3 ün byte ıyla BIT0,B ndeki sıcakl
d ekrana ba yani düşük ılım içerisin iti bir araya n dört biti is
isi ise 2 ye
ülmektedir. Ş
dir. Low By t datayı tuta üzerindeki BIT1,BIT2 lığın ondalı asmalıyız. L k dört bitid nde sıcaklık a getirilerek e işaret biti tümleyen
Şimdi
yte ve High an bitlerdir
ağırlığı 0.5 ve BIT3 ün k kısmınıda Low Byte ın dir. Sıcaklık k verisi elde k 8 bitlik bir dir. Ölçülen formatta bu h r.
5 n a n k e r n u
kaydedi edilmeli TH ve T
Bu kayd bu kayd olmadığ değerler deki ka kullanıl CONFI
ScratchP çözünür default yukarıd
icilerden ok idir.
TL KAYDE
dediciler 8 b dedicilere y ğı tespit edi
ri aynı isim arşılıklarının
mayacak is IGURATIO
Pad in 4.
rlüğü ayarl olarak 12 b da görüldüğ
kunmaktadır
EDİCİLER
bitlik iki ad yüklenen d ilebilir. Bu mde EEPRO n değeri E e bu kayded ON KAYDE
byte ı ise lanmaktadır bit olmasın ğü gibi kon
r. Bu neden
Rİ
det register değerlerle ö kaydedicile OM hafızada
EEPROM diciler kulla EDİCİSİ
e Configura r. Yazının na rağmen 9
nfigürasyon
nle negatif sı
dır. Ve ente ölçülen sıca erin son bit a tutulmakt daki değer anıcı tarafın
ation Regis başında b 9,10 ve 11 kaydedicis
ıcaklık ölçü
egre termos aklık değer ti ise yine i tadır. Powe rlerdir. Eğ ndan genel k
ster ı dır.
belirttiğimiz bit olarakta sinin R0 v
ümü yapılac
stat olarak k ri kıyaslanıp
şaret bitidir r On durum er entegren kullanım am
Bu kayded z gibi ente
a kullanılab e R1 bitler
caksa bu dur
kullanılmak p alarm du r. Ve bu ka munda ise S
nin termos macı ile kulla
dici ile de egremizin ç
bilmektedir.
ri ile ayarl
ruma dikka
k isteniyorsa urumu olup ydedicilerin ScratchPAD stat özelliğ
anılabilir.
entegrenin çözünürlüğü . Bu ayarda lanmaktadır
at
a p n D i
n ü a r.
Tablodan görüldüğü gibi çözünürlük düştükçe sıcaklık verisini elde etmek için geçen çevrim süreside düşmektedir. Ayrıca bu kısımda belirtilmesi gereken birşey varki, çözünürlük düşürüldüğünde eksilen bitler sıcaklık verisinin tam kısmından değil ondalık kısmındaki bitlerden düşürülmektedir. Buda kullanıcı için gayet güzel bir özelliktir.
ScratchPad in 5, 6 ve 7. byte ı reserve edilmiştir. Bu bitler kullanılmamaktadır. 8. byte ı ise CRC kodudur. Bir önceki yazımızda belirttiğimiz gibi CRC kodu bir hata kontrol algoritmasından geçirildikten sonra elde edilen bir veridir. Ve okunan verinin doğruluğunu test etmek için oldukça iyi bir yöntemdir. Birkaç byte veri iletiminde çok önemli olmasada onlarca bytelık veri paketlerinin iletildiği bir haberleşme protokolünde hata kontrol algoritmaları (CRC, LRC vb.) oldukça önem taşımaktadır.
Bir önceki yazımızda belirtiğimiz gibi OneWire cihazlarla haberleşebilmek için fonksiyon kodları bulunmaktadır. Ve yapılan işlem bu fonksiyon kodları ile belirlenmektedir. DS18B20 entegresi için rom code için ve scratchpad için birtakım fonksiyon kodları bulunmaktadır.
Bunlardan da bahsedecek olursak, ROM Komutları
1. Search ROM (0xF0) 2. Read ROM (0×33) 3. Match ROM (0×55) 4. Skip ROM (0xCC) 5. Alarm Search (0xEC) DS18B20 Fonksiyon Komutları
1. Convert T (0×44)
2. Write ScratchPad (0x4E) 3. Read ScratchPad (0xBE) 4. Copy ScratchPad (0×48) 5. Recall E2 (0xB8)
6. Read Power Supply (0xB4)
DS18B20 ile haberleşebilmek için datalara ait bir veri sekansı bulunmaktadır. İlk olarak hat resetlenip presence pulse beklenir. Ve hatta bir cihaz bulunduğu ve hattaki cihazın haberleşmeye uygun olduğu anlaşılır. Daha sonra ROM komutu gönderilir. Bu aşamada match rom(0×55) komutu kullanılarak cihazın seri numarasının okunması suretiyle hatta birden fazla cihaz varsa tanımlama işi gerçekleştirilebilir. Rom komutu gönderilmeyecek ise skip rom(0xCC) komutu gönderilerek bu ikinci aşama geçilir. Üçüncü aşama olarakta fonksiyon kodlarından biri gönderilerek yapılacak işlem ne ise o yapılır. Örneğin sıcaklık verisinin okunması için bir çevrim başlatılmasını istiyorsak convert t (0×44) komutu göndererek sıcaklık verisini okuyabiliriz.
Daha detaylı bilgi almak isteyenler DS18B20 ye ait datasheet i buradan inceleyebilirler. Birde şunu söylemeliyimki yine bu ürüne çok benzer bir şekilde, DS18S20 entegresi bulunmaktadır. O entegrede aynen DS18B20 gibidir. Farklılık olarak örneğin çözünürlüğü ayarlanamakta ve
standart için DS Gelelim main.c
#includ
#includ
#includ
#includ
#includ bool ne bool l void LC { char int unsig for(
{s for(
} void Re {
t olarak 9 b 18S20 ye ai m uygulamay
de "io430 de "in430 de "stdbo de "lcd_4b de "OneWi egative=f imited=fa CD_Write_
j;
temp=1;
gned char j=0;j<mul tr[j] = ( j=0;j<mul lcd_putc
ead_DS18B unsigned
*tam_adr
*ondalik
ittir.. O ent it datasheet ya ait yazılı
.h"
.h"
ol.h"
bit.h"
re.h"
alse;
lse;
Int (unsi
str[4];
;j++) (val/temp
;j++) ch(str[mul
20 (unsig d char msb r = 0;
k_adr = 0;
while(Ow_
Ow_WriteB Ow_WriteB __delay_c while(Ow_
Ow_WriteB Ow_WriteB __delay_c lsb = Ow_
msb = Ow_
if(msb &
*tam_adr=
if(*tam_a temp = ls if(temp &
if(temp &
if(temp &
if(temp &
tegre kullan buradan in ımımıza…
gned int
)%10+48);
l-1-j]);
ned char b,lsb,temp
;
_Reset());
Byte(0xCC) Byte(0x44) cycles(120 _Reset());
Byte(0xCC) Byte(0xBE) cycles(800 _ReadByte(
_ReadByte(
0xF0) neg
=(msb<<4)+
adr>99) li sb & 0x0F;
& 0x01) *o
& 0x02) *o
& 0x04) *o
& 0x08) *o
nılarakta 9 b ncelenebilir.
val,char
temp*=10
*tam_adr, p;
;
; 0);
;
; 0000);
();
();
gative = t +(lsb>>4);
imited = t
ondalik_ad ondalik_ad ondalik_ad ondalik_ad
bit sıcaklık
mul)
;}
unsigned
true;
true;
dr += 625;
dr += 1250 dr += 2500 dr += 5000
verisi elde
d int *ond
0;
0;
0;
edilebilir. D
dalik_adr)
Detaylı bilg
i
}
void main (void) {
unsigned char TAM_KISIM = 0;
unsigned int ONDALIK_KISIM = 0;
WDTCTL = WDTPW + WDTHOLD;
DCOCTL=CALDCO_1MHZ;
BCSCTL1=CALBC1_1MHZ;
P1SEL = 0x00;
P1OUT = 0x00;
P1DIR = 0xFF;
P2SEL = 0x00;
P2OUT = 0x00;
P2DIR = 0xFF;
lcd_init();
lcd_goto(1,1);
lcd_puts(" DS18B20 TERMOMETRE ");
lcd_goto(2,1);
lcd_puts(" UYGULAMASI ");
__delay_cycles(1000000);
lcd_puts("");
for(;;) {
Read_DS18B20(&TAM_KISIM,&ONDALIK_KISIM);
if(limited==false && negative==false) {
lcd_clear();
lcd_goto(1,1);
lcd_puts(" SICAKLIK ");
lcd_goto(2,6);
LCD_Write_Int(TAM_KISIM,2);
lcd_putch('.');
LCD_Write_Int(ONDALIK_KISIM,4);
lcd_putch(' ');
lcd_putch(223);
lcd_putch('C');
} else {
lcd_clear();
lcd_goto(1,1);
lcd_puts(" OLCULEN SICAKLIK ");
lcd_goto(2,1);
lcd_puts(" ARALIK DISI ");
negative = false;
limited = false;
}
__delay_cycles(100000);
}
}
Yazılımda kullanılan OneWire.c ve OneWire.h kütüphane dosyaları aynı. O yüzden tekrar vermek istemedim. Uygulamayı proteus üzerinde kurmak isteyen arkadaşlar bir önceki yazıya bakabilirler…
Yazılımdan kısaca bahsedecek olursak, ilk olarak lcd ekranda “DS18B20 TERMOMETRE UYGULAMASI” string i yazdırılmaktadır. Daha sonra sonsuz döngü içerisinde sensör den sıcaklık verisi tam kısım ve ondalık kısım olarak okunup lcd ekrana yazdırılmaktadır. Okunan sıcaklık 0~99 C arasında değilse lcd ekranda “OLCULEN SICAKLIK ARALIK DISI” yazısı yazdırılmaktadır. Ardından da 100 ms gecikme verilip aynı işlemler sürekli olarak tekrarlanmaktadır. Uygulamaya ait ekran görüntüsünüde verelim.
isterseniz entegrenin ayarlarından ondalık sıcaklık belirleyip o şekilde de ölçüm yapabilirsiniz.
Görüldüğü gibi başarılı bir şekilde sıcaklık ölçümü gerçekleştirilmiştir. Ben bu uygulamayı PIC üzerinde de gerçekleştirdim. Bu tür uygulamalarda en çok dikkat edilmesi gereken mesele gecikme üreten fonksiyonların doğruluğu. O yüzden bu uygulamayı launchpad üzerinde denerken, dahili RC osilatörün stabil clock darbeleri üretememesi nedeniyle problem çıkabilir.
Bu nedenle sinyaller dikkatlice osiloskopta incelenip, msp430 üzerinde o şekilde uygulama yapılması tavsiye edilir.
Geldik bir yazımızın daha sonuna. Bir sonraki yazımda LaunchPad üzerinde RC Servo Motor uygulaması yapacağız. Uygulama hazır. Muhtemelen birkaç gün içerisinde siteye eklerim. Bir sonraki yazımda görüşmek dileğiyle.
Hadi bakalım kalın sağlıcakla…
Ferudun GÖKCEGÖZ fgokcegoz@yahoo.com