Başlangıç > Donanım/Yazılım > 1-wire DS18B20

1-wire DS18B20

DS18B20 maksimum 12, minimum 9bit çözünürlüğünde celsius cinsinden sıcaklık ölçebilir. Nonvolatile yapısı sayesinde kullanıcı istediği bir sıcaklık değerinin üzerinde veya altında sensörden alarm alabilir. Ds18B20 maxim firmasının geliştirdiği 1-wire haberleşme protokolü ile çalışır. 1-wire sistemde sadece 1 data hattı ( ve ground ) kullanılarak, mikrokontrolcü ile haberleşilebilir. DS18B20, -55°C den +125°C ye kadar, geniş bir çalışma aralığına sahiptir fakat ölçebileceği aralık ±0.5°C hata ile -10°C ila +85°C arasındadır. DS18B20 doğrudan data hattından beslendiği için ekstra bir besleme kaynağına ihtiyaç duymaz.

Aşağıdaki C kodları, PIC16F628A için yazılmıştır. Kullanılan derleyici Hi-Tech C (PIC10-12-16) dir. Kodlarda yer alan _XTAL_FREQ kristal frekansını, ONE_WIRE_DATA_PIN sensörün PIC e bağlandığı pini, ONE_WIRE_DATA_PIN_DIRECTION_REGISTER ilgili pinin portunu, ONE_WIRE_DATA_PIN_MASK ise ilgili pinin maskesini ifade eder. Bu değerler değiştirilerek istenilen pinden DS18B20 ile haberleşilebilir.

Program sensörden aldığı sıcaklık bilgisini PORTB ye basar. bGetTemperature(void) fonksiyonunun geri dönüş değerine göre bu değer sıcaklığın virgülden önceki veya sonraki kısmı olabilir.

#include <htc.h>
#include “pic16f62xa.h”

#define _XTAL_FREQ        4000000

//ONE-WIRE
#define ONE_WIRE_DATA_PIN      RA1
#define ONE_WIRE_DATA_PIN_DIRECTION_REGISTER TRISA
#define ONE_WIRE_DATA_PIN_MASK     0x02

bit bitReadOneBit(void)
{
unsigned char i;
 ONE_WIRE_DATA_PIN=0;
 ONE_WIRE_DATA_PIN_DIRECTION_REGISTER&=~ONE_WIRE_DATA_PIN_MASK;
 ONE_WIRE_DATA_PIN=0;
 __delay_us(1);
 ONE_WIRE_DATA_PIN_DIRECTION_REGISTER|=ONE_WIRE_DATA_PIN_MASK;
 __delay_us(1);
 return(ONE_WIRE_DATA_PIN);
}

void vWriteOneBit(unsigned char bValue)
{
 ONE_WIRE_DATA_PIN=0;
 ONE_WIRE_DATA_PIN_DIRECTION_REGISTER&=~ONE_WIRE_DATA_PIN_MASK;
 ONE_WIRE_DATA_PIN=0;
 __delay_us(1);
 if(bValue)
 {
  ONE_WIRE_DATA_PIN_DIRECTION_REGISTER|=ONE_WIRE_DATA_PIN_MASK;
  __delay_us(60); 
  return;
 }
  else
  {
   __delay_us(60); 
   ONE_WIRE_DATA_PIN_DIRECTION_REGISTER|=ONE_WIRE_DATA_PIN_MASK;  
  }
}

unsigned char bReadByte(void)
{
unsigned char i;
unsigned char bReturned=0;
 for (i=0;i<8;i++)
 {
  if(bitReadOneBit()) bReturned|=0x01<<i;
  __delay_us(120);
 }
 return(bReturned);
}

void vWriteByte(char bData)
{
unsigned char i;
 for (i=0; i<8; i++)  
 {    
  vWriteOneBit(bData&0x01);  
  bData = bData>>1;
 }
 __delay_us(104);
}

bit bitReset(void)
{
unsigned char bReturned=0;
 ONE_WIRE_DATA_PIN=0;
 ONE_WIRE_DATA_PIN_DIRECTION_REGISTER&=~ONE_WIRE_DATA_PIN_MASK;
 ONE_WIRE_DATA_PIN=0;
 __delay_us(480);
 ONE_WIRE_DATA_PIN_DIRECTION_REGISTER|=ONE_WIRE_DATA_PIN_MASK;
 __delay_us(72);
 if(ONE_WIRE_DATA_PIN) bReturned=1;
 __delay_us(424);
 if(bReturned) return 1;
  else return 0;
}

void vConfigure(void)
{
 bitReset();
 vWriteByte(0x4E); 
 vWriteByte(0x00);  
 vWriteByte(0x00); 
 vWriteByte(0x00);
}

void vInitializeTemperatureSensor(void)
{
 vConfigure();
}

unsigned char bGetTemperature(void)
{
unsigned char bTemperatureLSB, bTemperatureMSB, i;
 bitReset();
 vWriteByte(0xCC);
 vWriteByte(0x44);
 __delay_ms(100);
 bitReset();
 vWriteByte(0xCC);  
 vWriteByte(0xBE);
 bTemperatureLSB=bReadByte();
 bTemperatureMSB=bReadByte();
 for (i=0;i<7;i++) bReadByte();
 
 
 {
 float fRealTemperature;
 unsigned short wTemperature=bTemperatureMSB;
  wTemperature<<=8;
  wTemperature|=bTemperatureLSB;
 
  fRealTemperature=(float)wTemperature;
  fRealTemperature/=16;
  
  //floating part
  //fRealTemperature*=10;
  //return (((unsigned char)fRealTemperature)%10);

  //decimal part
  //return (((unsigned char)fRealTemperature));
 }
 
}

void main(void)
{
 TRISB=0;
 PORTB=0x00;

 vInitializeTemperatureSensor();

 while(1)
 {
  PORTB=bGetTemperature();
 }
}

DS18B20, sıcaklık çevriminin sonucu float bir değerdir. Bu yüzden sensörden alınan 2byte lık değer float cinsi değişkene çevrilmiştir. İsternirse bGetTemperature(void) fonksiyonun geri dönüş tipi float yapılarak gerçek sıcaklık değeri elde edilebilir. Bu örnekte bGetTemperature(void) ile geri döndürülen değer;

return (((unsigned char)fRealTemperature));

satırları açılırsa virgülen önceki kısmı

fRealTemperature*=10;
return (((unsigned char)fRealTemperature)%10); 

satırları açılırsa, sıcaklık değerinin virgülden sonraki kısmı PORTB ye yazdırılır.

Float işlemleri yapmak PIC16F628A için zor bir iştir. Hem kod alanından kaybettirir hemde sistemin gecikmesine neden olur. Float işlemleri yapılmadan da sensörün okuduğu sıcaklık bilgisi, LSB ve MSB değerleri işlenerek ( kaydırma ekleme gibi işlemler ile) de elde edilebilir.

MPLAB projesi (dosya uzantısını .rar olarak değiştirin)

Proteus simulasyonu (dosya uzantısını .rar olarak değiştirin)

 

Reklamlar
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: