Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ds18b20.c problemi çözemedim

Başlatan hmg, 27 Mayıs 2008, 16:42:31

hmg

arkadaşlar internetten bulduğum aşağıdaki 18b20.c dosyasını kullanarak lcd de 240 gibi bir değer görüyorum. bu değeri aslında başında + ve- olarak -55 ile 125 arasında göstermesi gerekiyor. sizce aşağıdaki proğram doğrumu? doğru değer göstermesi için ne yapmalıyım. tşk şimdiden



//Bu kodu ds18b20.c olarak kaydettim

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

erkan06

burdaki kod anladığım kadarıyla sensor mikroişlemci arasındaki iletişimi kapsıyor. Bundan daha çok problem lcd ye yazan kod kısımlarında olabilir. Onu da eklersen daha iyi olur
Ne mutlu Türküm diyene!

hmg

ana proğram kodum bu;
#include <16f628A.h>    
#use delay (clock=4000000)
#include <benim_LCD.c> // benim_LCD.c dosyası programa ekleniyor
#include <DS1302.c>
#include <ds18b20.c>  
#byte saniye,dakika,saat,gun,ay,yil,haftanin_gunu;

/********* ANA PROGRAM FONKSİYONU********/
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 dosyamda aşağıda

//benimlcd.c

#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
}

ahmet2004


erkan06

Peki; lcd de elde ettiğin sıcaklık değeri değişiyor mu, yoksa hep aynı mı kalıyor bunu bi denersen...
Ne mutlu Türküm diyene!

hmg

Ahmet kardeş bizim ağda firewall var o dosyalara bakamadım. belki mail atabilirsen bakma şansım olabilir. ayrıca ekrana gelen ham bilgi sıcaklık artınca azalınca değişiyor .-55ile  125 aralığı 180 yapar 18b20 9 bit gönderdiğiiçin 512/180=2,84 her derece için. 240/2,84=84,5 çıkıyor 84,5-55=29,5 yani cihaz ham değer olarak doğru gösteriyor ama +- işareti ve sıc. derece olarak göremiyorum.
iyi çalışmalar

hmg