Mesaj Önizleme  Konuyu Gönder 
ds18b20.c problemi
Yazar Mesaj
hmg
Member
***


Mesajlar: 2
Grup: Registered
Katılım: May 2008
Statü: Çevrimdışı
Karma Puanı: 0
Mesaj: #1
ds18b20.c problemi

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);
}

05-28-2008 04:09 PM
Bu kullanıcının gönderdiği mesajları bul Bu mesajı bir cevapta alıntı yap
admin
Administrator
*******


Mesajlar: 29
Grup: Administrators
Katılım: Apr 2008
Statü: Çevrimdışı
Karma Puanı: 0
Mesaj: #2
RE: ds18b20.c problemi

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

En son düzenleme: 05-28-2008 11:37 PM admin.

05-28-2008 11:36 PM
Bu kullanıcının gönderdiği mesajları bul Bu mesajı bir cevapta alıntı yap
hmg
Member
***


Mesajlar: 2
Grup: Registered
Katılım: May 2008
Statü: Çevrimdışı
Karma Puanı: 0
Mesaj: #3
RE: ds18b20.c problemi

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

05-29-2008 05:43 PM
Bu kullanıcının gönderdiği mesajları bul Bu mesajı bir cevapta alıntı yap
ismillimehmet
Member
***


Mesajlar: 1
Grup: Registered
Katılım: May 2009
Statü: Çevrimdışı
Karma Puanı: 0
Mesaj: #4
RE: ds18b20.c problemi

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.

05-11-2009 03:22 AM
Bu kullanıcının gönderdiği mesajları bul Bu mesajı bir cevapta alıntı yap
Mesaj Önizleme  Konuyu Gönder 

Yazdırılabilir Bir Versiyona Bak
Bu Konuyu Bir Arkadaşına Gönder
Bu Konuya Abone Ol | Konuyu Favorilerine Ekle

Foruma Git: