DS18B20 ve yanlış sıcaklık değeri

Başlatan dokuzoguzlar, 22 Şubat 2013, 13:52:29

dokuzoguzlar

Merhaba arkadaşlar uzun uğraşlar sonucu LCD Displayimi lehimlemeyi başardım ve çalıştırabildim. İkinci aşama olarak devreme bir adet DS18B20 sıcaklık sensörü ekledim. Sensör ve PIC'in bağlanma şekli aşağıdaki gibidir:



DS18B20 için kullandığım kütüphane'nin kodları:

ds18b20.c
#define ONE_WIRE_PIN PIN_A1

void onewire_reset()
{
output_low(ONE_WIRE_PIN);
delay_us(500);
output_float(ONE_WIRE_PIN);
delay_us(500);
output_float(ONE_WIRE_PIN);
} 

void onewire_write(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us(2);
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0));
delay_us(60);
output_float(ONE_WIRE_PIN);
delay_us(2);
}
} 

int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us(2);
output_float(ONE_WIRE_PIN);
delay_us(8);
shift_right(&data,1,input(ONE_WIRE_PIN));
delay_us(120);
}
return(data);
} 

float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
while (busy == 0) { busy = onewire_read(); }
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0;
delay_ms(200);
return(result);
}


bu da benim kodum:

main.c
#include <16F628A.h>
#FUSES NOWDT, INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)
#include "C:\Users\Emre\Desktop\pic proje\ccs temp\flex_lcd.c"
#include "C:\Users\Emre\Desktop\pic proje\ccs temp\ds18b20.c"

void main()
{
float temperature;

lcd_init();
delay_ms(10);
lcd_putc("\fDS18B20\nemre");
delay_ms(1000);

while (TRUE) {
output_high(PIN_A0);
temperature = ds1820_read();
delay_ms(250);
printf(lcd_putc,"\fS: %3.1f C\n-emre-", temperature);
output_low(PIN_A0);
delay_ms(450);
}
}


PIN_A0 da bir led bağlı yanıp sönüyor, DS18B20 de PIN_A1 de bağlı fakat sıcaklık olarak 273.0 C yazıyor ekranda, elimi sensöre koyup bir iki saniye bekleyince 0.0 C yazıyor ve sonra -1911.9 C, 17.0 C, 529.0 C  gibi değişik ve olmaması gereken değerler yazıyor.

İnternetteki yabancı forumları ve bu forumu araştırdım bir sonuca ulaşamadım. pull-up direncini çıkarıp 3. bacağı 5V'a bağladım bu sefer devre çalışmadı LCD'nin ışıkları söndü, eski haline getirince düzeldi.

Yardımlarınızı rica ediyorum, iyi çalışmalar.

Extreme

#1
Önce şemanızı düzeltiniz

3.bacak boş deyil 5 volt olacak diye hatırlıyorum.

dokuzoguzlar

#2
3. bacağa 5V verdiğimde devrenin gücü kesiliyor, LCD sönüyor yanıp sönen led artık yanıp sönmüyor. Sensör beslemesini data hattındaki pull-up direnci vasıtasıyla alıyor diye biliyorum, data-sheet'te buna parasite power diye değinmişler.


DÜZELTME:

teşekkür ederim, mesajınızdan sonra devreyi tekrar inceledim ve sensörü ters bağladığımı farkettim. Ters çevirnce 3. bacak boş iken bu kez sabit 85 C gösterdi, sonra 3. bacağa 5V verince doğru çalışmaya başladı. Tekrar teşekkür ederim.