DS18B20’den sıcaklık okumada farklı bir yöntem
DS18B20'den sıcaklık okumada farklı bir yöntem |
DS18B20 ölçüm sonucunu float olarak vermektedir. Fakat bu değişken tipini işlemek 8 bitlik bir mikrokontrolcü tarafından oldukça kasvetli bir iştir. Örneğin PIC16F84 de float bir değişkenin içerisinden ondalık ve tam kısımların ayırt edilebilmesi için yapılması gereken işlemler, program belleğinin neredeyse yarısını kaplayacak kadar yer işgal eder. Fakat aşağıdaki gibi alternatif bir yöntemle ondalık kısım (0.1 hassasiyetle) ve tam kısım, basit işlemlerle de elde edilebilir.
Aşağıdaki fonksiyon örneği pozitif sıcaklık değerleri için geçerlidir. Fonksiyon bReturnOption 1 ile çağırıldığında sıcaklığın tam sayı değerini, 0 ile çağırıldığında ise sıcaklığın ondalık değerini geri döndürür.
unsigned char bGetTemperature(unsigned char bReturnOption)
{
unsigned char bTemperatureLSB, bTemperatureMSB, i, bReturned;
vReset();
vWriteByte(0xCC);
vWriteByte(0×44);
for(i=0;i<8;i++) __delay_ms(100);
vReset();
vWriteByte(0xCC);
vWriteByte(0xBE);
bTemperatureLSB=bReadByte();
bTemperatureMSB=bReadByte();
vReset();
if(bReturnOption==1)
{
bReturned=((bTemperatureMSB<<4)|(bTemperatureLSB>>4));
}
else
{
bReturnOption=bTemperatureLSB&0x0F;
switch(bReturnOption)
{
case 0:
case 1: bReturned=0; break;
case 2:
case 3: bReturned=1; break;
case 4: bReturned=2; break;
case 5:
case 6: bReturned=3; break;
case 7: bReturned=4; break;
case 8: bReturned=5; break;
case 9:
case 10: bReturned=6; break;
case 11:
case 12: bReturned=7; break;
case 13: bReturned=8; break;
case 14:
case 15: bReturned=9; break;
}
}
return bReturned;
}