Şimdi Ara

DS18B20 nin hatalı okuma sorunu ?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir (1 Mobil) - 1 Masaüstü1 Mobil
5 sn
3
Cevap
0
Favori
720
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba arkadaşlar,

    DS18B20 ile haberleşme konusunda kendi kodlarımı yadım, Ancak ara sıra 2 derecelik farklılıklarla okuyor.

    Örneğin sıcaklık 21.2 derece iken birden 23.2 okuyup, bir sonraki okumada tekrar doğru olan 21.2 yi okuyor. Bu hatayı saatte 2-3 kezden fazla yapmadığı için kodda hata olmadığını, sensörün bozuk olabileceğini düşünmüştüm ancak taktığım yeni sensörde aynı hatayı yapınca datasını biraz daha kurcalamayı düşündüm.

    Datasında Harici beslemeden bahsediyor (İngilizcemin hiç iyi olmadığını belirteyim), eğer kartın beslemesinden faydalanılacaksa 1 ve 3 nolu pinlerin Şaseye bağlanmasından bahsediyor ancak resimdeki elemanın ne olduğunu anlayamadım.

    Konu hakkında bir fikri olan varmı ?

    Kodum :
     
    //***************************************************************************************
    unsigned char DS18B20_init(void) {
    unsigned char sonuc;
    DS18B20_PinYon = 0;
    DS18B20_Pin = 0;
    DelayUs(490); // > 480us
    DS18B20_PinYon = 1;
    DelayUs(65); // > 60us
    sonuc = DS18B20_Pin; // 0 Hazır, 1 Hazır değil
    DelayUs(400);
    return sonuc;
    }
    unsigned int DS18B20_Oku(void) {
    unsigned char sayac;
    unsigned int veri, bitler;
    veri=0; bitler=1;
    for (sayac=0; sayac<16; sayac++) {
    DS18B20_Pin=0; DS18B20_PinYon=0; DelayUs(1); DS18B20_PinYon=1;
    if ( DS18B20_Pin==1 ) veri|=bitler;
    DelayUs(60); bitler=bitler<<1;
    }
    return veri;
    }
    void DS18B20_Yaz(unsigned char veri) {
    unsigned char bitler, sayac;
    bitler = 1;
    for (sayac=0;sayac<8;sayac++) {
    if ( veri&bitler) {
    DS18B20_PinYon=0; DS18B20_Pin=0; DelayUs(3); DS18B20_PinYon=1; DelayUs(60);
    } else {
    DS18B20_PinYon=0; DS18B20_Pin=0; DelayUs(60); DS18B20_PinYon=1;
    }
    bitler=bitler<<1;
    }
    }

    void SicaklikOku(void) {
    unsigned char sayac, bitlertam, bitleronda;
    unsigned int sicaklik, bitler;
    DS18B20_PinYon = 0;
    Tekrar:
    if ( DS18B20_init()==1 ) goto Tekrar;
    DS18B20_Yaz(0xCC); DS18B20_Yaz(0x44);
    DelayMs(250); DelayMs(250); DelayMs(250);
    if ( DS18B20_init()==1 ) goto Tekrar;
    DS18B20_Yaz(0xCC); DS18B20_Yaz(0xBE);
    sicaklik=DS18B20_Oku();
    bitler=1; bitlertam=1; bitleronda=1;
    OrtamSicaklik=0; OrtamSicaklikOnda=0;
    for (sayac=0;sayac<12;sayac++) {
    if (sayac<4) {
    if (sicaklik&bitler) OrtamSicaklikOnda=OrtamSicaklikOnda|bitleronda;
    bitleronda=bitleronda<<1;
    } else {
    if (sicaklik&bitler) OrtamSicaklik=OrtamSicaklik|bitlertam;
    bitlertam=bitlertam<<1;
    }
    bitler=bitler<<1;
    }
    OrtamSicaklikOnda = (OrtamSicaklikOnda * 625) / 1000;
    }


    Datasındaki şema :


     DS18B20 nin hatalı okuma sorunu ?







  • Bu bir mosfet transistör. Normal beslemenin yanında sadece data hattıyla yapılan bir besleme seçeneği de var. Pull-up direnci üstünden içerde şarj olan bir kondansatör ve buna dayalı bir besleme sistemi var. Ama bazı durumlarda gereken yüksek akım yüzünden gerilim çöküyor. Durumlar şunlar: Analog-dijital dönüştürme işlemi ve copy-to-scratchpad. Bu durumlarda kılavuzda belirtilene göre komut uygulandıktan en geç 10 mikro saniye sonra Vpu gerilimini işlem süresince direkt uygulamak gerekiyor. Bunlarla uğraşmaya gerek yok ikinci devreyi kurarsın normal besleme ile kullanırsın.

    Okuma hatası için ben olsaydım hızı düşürürdüm veya hattı (sallıyorum) 50-100 ohmluk dirençlerle sonlandırırdım veya pull-up direncinin değerini değiştirirdim veya hattan sıfıra 20 pF kondansatör atardım veya ekranlı kablo kullanırdım, birini birkaçını veya en kötü ihtimalle hepsini birlikte denerdim




  • quote:

    Orjinalden alıntı: Liu Kang

    Bu bir mosfet transistör. Normal beslemenin yanında sadece data hattıyla yapılan bir besleme seçeneği de var. Pull-up direnci üstünden içerde şarj olan bir kondansatör ve buna dayalı bir besleme sistemi var. Ama bazı durumlarda gereken yüksek akım yüzünden gerilim çöküyor. Durumlar şunlar: Analog-dijital dönüştürme işlemi ve copy-to-scratchpad. Bu durumlarda kılavuzda belirtilene göre komut uygulandıktan en geç 10 mikro saniye sonra Vpu gerilimini işlem süresince direkt uygulamak gerekiyor. Bunlarla uğraşmaya gerek yok ikinci devreyi kurarsın normal besleme ile kullanırsın.

    Okuma hatası için ben olsaydım hızı düşürürdüm veya hattı (sallıyorum) 50-100 ohmluk dirençlerle sonlandırırdım veya pull-up direncinin değerini değiştirirdim veya hattan sıfıra 20 pF kondansatör atardım veya ekranlı kablo kullanırdım, birini birkaçını veya en kötü ihtimalle hepsini birlikte denerdim


    Mesajımı yazdıktan sonra 4K7 yerine Pullup direncini 10K ile değiştirdim. Şimdilik bir sorun yok.
    Ayrıca sensör plaket üzerinde. Dolayısı ile ekranlı kablo kullanma ihtimalim yok. Ancak sonlandırma direnci ve 20pf kapasite teklifleriniz için çok teşekkür ederim.




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.