Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: Recep METE - 13 Kasım 2013, 07:56:27

Başlık: ds18b20 ile 7 segment display sorunu
Gönderen: Recep METE - 13 Kasım 2013, 07:56:27
Arkadaşlar 7 segment displayde ds18b20 ile derece yaptım.Ancak şöyle bir sorunla karşılaştım.7 segment display 1 saniye sıcaklığı gösterip kayboluyor.Sonra 3 veya 5 saniye gibi düzensiz peryotlarla sıcaklığı 1 saniye göseri gösterip kayboluyor.Sorunu çözemedim.Yardımlarınızı bekliyorum.


                     
#include <16f877.h> 
#device *=16

#device adc=10
#fuses XT,NOWDT,NOPROTECT   
#use delay (clock=20000000)                   
#include <ds18b20.c>                                       
                         

                 
char display1_onlar,display1_birler,display2_onlar,display2_birler,display3_onlar,display3_birler,temp; 
                 
const int display_digit[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};  // ortak anotlu için             


unsigned long int sicaklik_bilgisi;     
float sicaklik;     

void sicaklik_tara()
{

output_d(0b00000001);       
output_b(display_digit[display1_onlar]);   
delay_ms(2);           
output_d(0b00000010);                   
output_b(display_digit[display1_birler]);     
delay_ms(2);               
output_d(0b00000100);
output_b(0x9c); // derece simgesi   
delay_ms(2);           
output_d(0b00001000);
output_b(0xc6); // C harfi   
delay_ms(2);
output_d(0b00000000);

}


//------- ana program ----------------------------------------------------------
void main ()                                 

   output_a(0x00);
   output_b(0x00);
 
   output_d(0x00);
 
   delay_ms(2);
   setup_adc(adc_clock_internal);   
   setup_adc_ports(AN0);
   
   
   
   for(;;)               
   {                           
       
       
       sicaklik_tara();     
       sicaklik = ds1820_read();  //Sıcaklık bilgisi okunuyor ve çevriliyor
 
    temp = sicaklik;
   
       
       display1_birler=temp%10;
       display1_onlar=(temp/10);
       
       sicaklik_tara();
       delay_ms(5);
       
       }                   
           
       
   }







Hocam buda İSİS dosyası:
http://s3.dosya.tc/server13/fRlCcc/ds18b207segment.rar.html (http://s3.dosya.tc/server13/fRlCcc/ds18b207segment.rar.html)
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: Recep METE - 09 Aralık 2013, 18:54:36
Arkadaşlar haftalardır uğraşılarıma rağmen bu sıkıntıyı gideremedim. Yardımlarınızı bekliyorum.Çok acil bir şekide gerekli.Lütfen işi bilen birisi varsa yukarıdaki kodlar üzerinde bir değişilik yaparsa çok memnun olurum.
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: Bayramsumbul - 09 Aralık 2013, 19:29:45
"for" döngüsü içinde neden iki defa display taradınız?
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: 0xefe - 09 Aralık 2013, 19:47:44
Picden anlamam ama ds18b20 deneyimlerine göre: ds18b20 12 bit en yüksek çözünürlükte ~750 ms okuma gecikmesi yaratır. Sıcaklığı okuduğunuz fonksiyon kendi içinde, da18b20den sonucun gelmesini bekliyor. Bütün işlemleri bloke ediyor. Seven segment yazdirma işini bir interrupt la yapmanız yada seven segmente latch gibi son sonucu sürekli gösteren bir ek yapmanız gerekir.
Ds18b20 fonksiyonuna hakimseniz 750 ms lik beklemeyi delay şeklinde değil de seven segmente veri göndermek için faydalı bir şekile sokabilirsiniz.
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: Bayramsumbul - 09 Aralık 2013, 20:09:51
@Oxefe dediği gibi.Kendi fonksiyonunuzu yazıp dener iseniz belki sorun çözülür gibi.
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: Kabil ATICI - 09 Aralık 2013, 20:17:24
şemadeki dirençleri isis'de dijital olarak tanımladınız mı? Eğer analog olarak tanımlı ise bilgisayarda düşük konfigürasyonda ise bu tür hataları yapabilir.
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: selimkoc - 09 Aralık 2013, 20:24:59
ana fonksiyon içindeki for döngüsünden "delay_ms(5);" satırını kaldır.

bir tane sayac koy. sayac 125 (4*2=8 * 125=1000ms) olduğunda DS18B20'yi oku. ve sayacı sıfırla.
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: pwm.c - 09 Aralık 2013, 20:36:22
ds18b20.c içindeki ds1820_read fonksiyonunda 200ms bir gecikme verilmiş.
bunun gibi kayıpları değerlendirebiliriz.

ds18b20.c dosyasından bu kısımı bul:
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);
}


ve böyle değiştir:
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();sicaklik_tara();}
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0;
for(int i=0;i<25;i++)
{sicaklik_tara();}
return(result);
}


#include <ds18b20.c> komutunu ise main üstüne taşı.

sanki salakca bişey yaptım gibime geliyor ama istersen bir dene. proteusta bu şekilde çalıştırdım.
birde interup ile yapılabilinir ama ds18b20 için gerekli zamanlamaları etkileyebilir diye düşündüm.
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: Recep METE - 09 Aralık 2013, 21:09:17
Alıntı yapılan: pwm.c - 09 Aralık 2013, 20:36:22
ds18b20.c içindeki ds1820_read fonksiyonunda 200ms bir gecikme verilmiş.
bunun gibi kayıpları değerlendirebiliriz.

ds18b20.c dosyasından bu kısımı bul:
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);
}


ve böyle değiştir:
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();sicaklik_tara();}
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0;
for(int i=0;i<25;i++)
{sicaklik_tara();}
return(result);
}


#include <ds18b20.c> komutunu ise main üstüne taşı.

sanki salakca bişey yaptım gibime geliyor ama istersen bir dene. proteusta bu şekilde çalıştırdım.
birde interup ile yapılabilinir ama ds18b20 için gerekli zamanlamaları etkileyebilir diye düşündüm.


Hocam Allah ne muradın varsa versin.Senin dediğin yolla bu iş çözüldü.Allah yolunu açık etsin.Saygılarımla.
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: sifirzero - 30 Ocak 2024, 19:32:40
Merhaba tam kodu paylasirmisiniz. Yazilanlari yaaptim ama olmadi calismadi
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: mustafacan - 31 Ocak 2024, 20:40:04
Onewire, if, for, next,
Ömrümü yedin ömrümü...
Başlık: Ynt: ds18b20 ile 7 segment display sorunu
Gönderen: sifirzero - 01 Şubat 2024, 00:06:12
https://www.sifirzero.com/2024/01/ds18b20-seven-segment-termometre.html?m=0 (https://www.sifirzero.com/2024/01/ds18b20-seven-segment-termometre.html?m=0)

Ds18b20 16f628a 3 digit sevensegment sorunu çözdüm. Arkadaşın verdiği örnek gibi yaptım. Eksi degerleride gosteriyor. Derin dondurucada test ettim 🤭 web sitemizde kodlari paylaştim