CCSPic

Tam Versiyon: ds18b20.c problemi
Şu anda tam olmayan bir versiyonun içeriğine bakıyorsunuz. Tam versiyona bakınız.
arkadaşlar önce herkese mrbç demek istiyorum. pic proğlamada çok tecrübem yok ama meraklıyım.birbirimize tecrübelerimizden faydalandıralım inş. bilgi paylaştıkça artar. ben sitede olan örnekten 18b20.c dos. kullanarak lcd kullanarak16f628 A ile ve ds 1302 ve 18b20 ile saat sıcaklık devresi yapmak istedim fakat zaman da problem yok ama sıcaklıkta karşıma 240 gibi değer geldi boardda,proteusta ise sabit -0,5 yazıyor ve hiç değişmiyor. boardda sıc. artınca değerde artıyor. proğram kodlarım aşağıda şimdiden tşkler.

#include <16f628A.h>
#use delay (clock=4000000)
#include <benim_LCD.c>
#include <DS1302.c>
#include <ds18b20.c>
#byte saniye,dakika,saat,gun,ay,yil,haftanin_gunu;
float temperature;
void main ( )

{
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
lcd_hazirla(); // LCD başlangıç ayarları yaptırılıyor
rtc_init(); // DS1302 başlangıç ayarları yapılıyor

while(1)
{
temperature = ds1820_read();
rtc_get_time(saat,dakika,saniye);
rtc_get_date(gun,ay,yil,haftanin_gunu);
imlec(1,1);
printf(lcd_veri,"%02d/%02d/20%02d ",gun,ay,yil);
switch(haftanin_gunu)
{
case 1: printf(lcd_veri," PAZ"); break;
case 2: printf(lcd_veri," PZT"); break;
case 3: printf(lcd_veri," SAL"); break;
case 4: printf(lcd_veri," CRS"); break;
case 5: printf(lcd_veri," PER"); break;
case 6: printf(lcd_veri," CUM"); break;
case 7: printf(lcd_veri," CTS"); break;
}
imlec(2,1);
printf(lcd_veri,"%02d:%02d:%02d %3.1f C.",saat,dakika,saniye,temperature);
delay_ms(1000); // 1 sn gecikme veriliyor
}
}

LCD DOSYA KODUM ;
//benim_lcd.c dosyam
#define e pin_a3 // LCD'nin E ucu RB5 pinine bağlı
#define rs pin_a2 // LCD'nin RS ucu RB4 pinine bağlı

//****** LCD'ye Komut Gönderme Fonksiyonu **********
void lcd_komut(byte komut)
{
output_b(komut>>4); // Komutun yüksek değerli 4 bitini gönder
output_low(rs); // LCD komut almak için ayarlandı
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(2); // 2 msn gecikme veriliyor

output_b(komut&0x0F); // Komutun düşük değerli 4 bitini gönder
output_low(rs); // LCD komut almak için ayarlandı
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(2); // 2 msn gecikme veriliyor
}

//******* LCD'ye Veri Gönderme Fonksiyonu **********
void lcd_veri(byte veri)
{
output_b(veri>>4); // Verinin yüksek değerli 4 bitini gönder
output_high(rs); // LCD veri almak için ayarlandı
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(1); // 1 msn gecikme veriliyor

output_b(veri&0x0F); // Verinin düşük değerli 4 bitini gönder
output_high(rs); // LCD veri almak için ayarlandı
output_high(e); // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(1); // 1 msn gecikme veriliyor
}

//******* LCD'de İmlec Konumlandırma Fonksiyonu ********
void imlec(byte satir, byte sutun)
{
if (satir==1) // Eğer satır değişkeni "1" ise
lcd_komut(0x80|(sutun-1));

if (satir==2) // Eğer satır değişkeni "2" ise
lcd_komut(0x80|(0x40+(sutun-1)));
}

//********* LCD Başlangıç Ayarları Fonksiyonu ******
void lcd_hazirla()
{
lcd_komut(0x02);// LCD'yi kullanıma hazır hale getir, imleç // 1.satır 1.sütunda komutu
lcd_komut(0x28);//2 satır, 4 bit iletişim, 5x8 dot matris seçildi
lcd_komut(0x08);//Display kapalı,alt çizgi ve yanıp sönme yok
lcd_komut(0x0C);//Display açık,imleç alt çizgi ve yanıp sönme yok
lcd_komut(0x06);// Her veri yazıldığında imleç bir sağa gitsin
lcd_komut(0x01);// Display sil. İmleç 1.satır 1.sütunda
delay_ms(1); // 1 msn bekle
}

//ds18b20.c dopsya kodum;

#define ONE_WIRE_PIN PIN_A1
void onewire_reset()

{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 ); // sensörün hazırlanması için beklenir.
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 ); // Sensöre yazma işlemine başlamak için 1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,
delay_us( 2 ); // 1us'den fazla beklenir.
}
}

int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
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 / 2.0;
delay_ms(200);
return(result);
}
kodunda hata yok aslında bulduğun 240 değeri aslında 24 derecedir
sonucun büyük çıkması ölçüm derinliğiyle alakalı olması lazım
kodunda yer alan

Kod:
temperature = ds1820_read();

satırının altına birde

Kod:
temperature = temperature/10.0;

satırını ekleyip bi denermisin sonuç ne olacak bakalım

temperature = temperature/10.0; ilavesini yaptım 240 yerine 24 yazdı ama ortam sıcaklığı 29 C ölçüyorum o anda. 18b20 9 bit gönderdiği için -55 ve 125 aralığı toplam 180 yapıyor. 512/180= 2,84 yapıyor her derece için. 240/2.84= 84,5 çıkar 84,5-55=29,5 çıkıyor yani ham 240 değere karşılk 29,5 çıkıyor doğru bence. sorun hem başında +,- yok hemde ham değer gösteriyor.
iyi çalışmalar
Port A,0 anahtarı ile bir sayıcı artacak, Port A,7 anahtarı ile de azalacaktır. Sayılan
değerler displaylerde gorulebilecektir. Eğer sayma değeri hafızanın 0300H adresindeki değer
ile 0301 H adresindeki değerler arasında ise Port B,7 lojik ‘1’ olan programı yazmam gerkiyor.Lütfen yardımcı olun.
Referans URL