ds18b20 ile displaydeki görüntünün gelipgelip gitmesi sorunu

Başlatan Recep METE, 28 Nisan 2014, 09:00:44

Recep METE

Arkadaşlar ds18b20 ile yaptığım 7 segment displayde görüntü gelip gelip gidiyor.Bu sorunun kalıcı çözümü nedir acaba.Çok araştırma yaptım ama istediğim gibi sorunu çözemedim.Yardımlarınızı bekliyorum.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

F493

Selam,



  Ds18B20'nin tüm fonksiyonları kapalı olsun, Display ile ilgili rutinler açık olsun. Ana döngüde ekrana bir şeyler yazdır sorun var mı bak. Eğer sorun yoksa sorunun kaynağının one wire bus olma ihtimali var. Bunun nedeni one wire bus okuma yazma yaparken ekran fonskiyonlarını bloke ediyor olabilir, yani owire için yazılan bekleme zamanları sorun oluyordur, çünkü sabit zamanlamalar malesef. Donanımsal bir protokol olmadığından. Bu gözle bir bakın.


Esen kalın.

baran123

Merhaba projende tarama yontemımı yoksa shıft regıster mı kullandın ?

Kabil ATICI

Buradaki asıl soru şu;
gerçek devre üzerinde mi,
Yoksa isis gibi bir simülasyon programı üzerinde mi
olduğu.

Gerçek devre ise işlemcinin hızını artırmak veya kod optimizasyonu sorunun çözümü olabilir iken (bu türden uygulamayı ilk siz yapmıyorsunuz);
isis gibi simülasyondaki sorunun kaynağı şema üzerinde analog özelliği bulunan elemanlar bulunmasıdır. (dijital özellikli devrede analog özellikli elemanlar simülasyonun yavaşlamasına sebep olur, hatta  program tarafından uyarı verilir. Çünkü program devredeki o elemana göre gerçek zamanlı hesaplamalar yapmak zorunda kalır ve yavaşlamaya sebep olur.)
ambar7

Recep METE

Alıntı yapılan: F493 - 28 Nisan 2014, 10:07:02
Selam,



  Ds18B20'nin tüm fonksiyonları kapalı olsun, Display ile ilgili rutinler açık olsun. Ana döngüde ekrana bir şeyler yazdır sorun var mı bak. Eğer sorun yoksa sorunun kaynağının one wire bus olma ihtimali var. Bunun nedeni one wire bus okuma yazma yaparken ekran fonskiyonlarını bloke ediyor olabilir, yani owire için yazılan bekleme zamanları sorun oluyordur, çünkü sabit zamanlamalar malesef. Donanımsal bir protokol olmadığından. Bu gözle bir bakın.


Esen kalın.

Hocam, ds18b20'nin tüm fonksiyonlarını kapatım.Displayde görülen rakamlar problemsiz çalıştı.Ds18b20 devreye girince displayde yanıp sönmeler  başladı.Mutemelen "one wire bus" sorunu.Peki bu sorun için çözüm yolunu biliyor musunuz?



Alıntı yapılan: baranekrem9 - 28 Nisan 2014, 11:01:54
Merhaba projende tarama yontemımı yoksa shıft regıster mı kullandın ?

Arkadaşım tarama yöntemini kullanıyorum.Kodları aşağıya yayınlıyorum.Tarama yönteminde bu tip sıkıntılar olur mu? sizin shift register la yaptığınız çalışmayı çok beğendim.Bende tarama yöntemiyle yapıp sizlerle paylaşmak istiyorum.

           
#include <16f877.h>  
#device *=16
#device adc=10
#fuses XT,NOWDT,NOPROTECT    
#use delay (clock=20000000)                   
              
char display1_onlar,display1_birler,temp;  
const int display_digit[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};  // ortak anotlu için   

int i;
int16 okunansicaklik;
void sicaklik_tara()
{
 


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

}


//------- ana program ----------------------------------------------------------

#include <ds18b20.c> 

void main ()                                 
{  

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);

setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);





   output_a(0x00);
   output_b(0x00);
   output_d(0x00);  
   delay_ms(2);
  
   while(1)                
   { 
   okunansicaklik = ds1820_read();  //Sıcaklık bilgisi okunuyor ve çevriliyor
  
   if(okunansicaklik==85)
   okunansicaklik=0;
   
   
 
   
      for(i=0;i<=100;i++){
       display1_birler=okunansicaklik%10;
       display1_onlar=(okunansicaklik/10)% 10;
      
  
    if (bit_test(okunansicaklik,11))  //12.bit kontrol ediliyor.
   {  
   
   
   okunansicaklik= ~okunansicaklik+ 1 ; // Tümleyeni alınıyor.
   
   
output_d(0b00000010);
output_b(0x3f);
delay_ms(2);
  

  }
   

      
   } 
   
      
    sicaklik_tara();
       delay_ms(2);
       
       }
                          
}
       
   




Alıntı yapılan: ambar7 - 28 Nisan 2014, 11:13:16
Buradaki asıl soru şu;
gerçek devre üzerinde mi,
Yoksa isis gibi bir simülasyon programı üzerinde mi
olduğu.

Gerçek devre ise işlemcinin hızını artırmak veya kod optimizasyonu sorunun çözümü olabilir iken (bu türden uygulamayı ilk siz yapmıyorsunuz);
isis gibi simülasyondaki sorunun kaynağı şema üzerinde analog özelliği bulunan elemanlar bulunmasıdır. (dijital özellikli devrede analog özellikli elemanlar simülasyonun yavaşlamasına sebep olur, hatta  program tarafından uyarı verilir. Çünkü program devredeki o elemana göre gerçek zamanlı hesaplamalar yapmak zorunda kalır ve yavaşlamaya sebep olur.)



Hocam isis üzerinde çalışıyorum şu an.Breadboarda da aynı sıkıntı görülüyor.Yazınız için ayrıca teşekkür ederim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

kralsam

Sorunun arkadaşlarında belirttiği gibi one wire bus haberleşme gecikmesi. Bunun çözümüde okuma yaparken her fırsatta ekrana yazmak. Hazır örneği sitemde yayınlamış olduğum yazıda mevcut. Kendine göre modifiye edebilirsin.

Bu arada similasyonda çalışmıyor.

http://www.mafgom.com/sicak-su-tanki-sicaklik-uyari-ve-kontrol-sistemids18b20/

Kolay gelsin.

baran123

@semfero bu sensorle cok ugrastım ıslemcı hızı krıstal hızı degısımı gıbı hızlanınca gever mantıgı olmaz nasıl olsa ds18b20 fonksıyonu en az 700 mılı sanıye suruyor koddan kaynaklı bır se degıl cozumu ıse ccozmus gıbı gostemekmıs yanı sıcaklıgı goster okumayı yap okuma yaparken gosterdıgın sıcaklıgı sılme yenısı gelene kadar ! Bır abı soylemıstı ben devreyı kurdugumda pek pek goze battıgını gormeıdrmedım ama cozmekte fayda var bıde ısıde yenı bısı kesfettım sensore sag tıkla edı den altta kutucuklar orda bı secenetıkladın zaman bır metın belgesı acılıyor sensorun ayarları var ondalık ayarım gıbı sure ayarları var kurcala ısıne yarabılır aksam pc ye gecınce ugrasıyım gene kolay gelsın .

Recep METE

Alıntı yapılan: baranekrem9 - 28 Nisan 2014, 12:18:25
@semfero bu sensorle cok ugrastım ıslemcı hızı krıstal hızı degısımı gıbı hızlanınca gever mantıgı olmaz nasıl olsa ds18b20 fonksıyonu en az 700 mılı sanıye suruyor koddan kaynaklı bır se degıl cozumu ıse ccozmus gıbı gostemekmıs yanı sıcaklıgı goster okumayı yap okuma yaparken gosterdıgın sıcaklıgı sılme yenısı gelene kadar ! Bır abı soylemıstı ben devreyı kurdugumda pek pek goze battıgını gormeıdrmedım ama cozmekte fayda var bıde ısıde yenı bısı kesfettım sensore sag tıkla edı den altta kutucuklar orda bı secenetıkladın zaman bır metın belgesı acılıyor sensorun ayarları var ondalık ayarım gıbı sure ayarları var kurcala ısıne yarabılır aksam pc ye gecınce ugrasıyım gene kolay gelsın .

@baran ekrem, arkadaşım uzun zamandır uğraşıp çözemediğim bu konuya bir el atıp çözersen çok minnettar kalacağım.İstersen isis şemasınıda gönderebilirim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

serhat1990

Merhabalar, okuma süresi ve display'e tarama yönetemiyle veriyi atamandan dolayı okuma süresinde geçen sürede display'de görüntü kayboluyor gibi gözüküyor. Bu yüzden okuma işlemini yaparken geçecek olan bekleme sürelerini display'e değer atama için kullanabilirsin. Veya display'e veri atamada tarama yöntemini kullanmayıp tüm display'leri ayrı portlardan veya port çoğullama yöntemini kullanarak tek tek  yönetebilirsin. Daha farklı çözümlerde olabilir. CCS C ile uzun zamandır çalışmadığımdan dolayı kodlarına müdahale edemiyorum ama dediğim yöntemlerle sorunu aşabilirsin diye düşünüyorum.  İyi çalışmalar dilerim.

MrDarK

Yüksek hızda osilatör kullanmak faydalı olabilir. Veya hiç uğraşmadan tarama metodu yerine 74HC ile sürülebilir yine çok kolay bir çözüm olur.

Tarama işini timer interrupt fonksiyonuna bırakmak bence çok daha kolay olur ;)
Picproje Eğitim Gönüllüleri ~ MrDarK

baran123

@semfero sunu bir dener misin, bu sorunu bende hala çözmeye çalışıyorum ama milisaniyelik bir olay zorda olsa yapacağız merak etme  :D

burda timer0 kesmesi ile yaptığım bir proje

edit isis seması atarmısın bi bakalım onada

#include <16F88.h>
#device adc=16
#fuses NOWDT,XT,NOBROWNOUT,NOLVP,NOPUT,NOCPD,NOWRT,NOPROTECT,NODEBUG
#use delay(clock=4M)
#include "ds18b20.c"
                          
#define onlar  pin_a3        
#define birler pin_a4                        

int temp,sayac = 0;                                   
const int digit[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F};   
            
#int_timer0
void timer0_kesme() 
{     
   disable_interrupts(INT_timer0);                                                       
   switch(sayac)
   {                           
      case 0:      
      output_low(onlar);                  
      output_b(digit[temp % 10]);
      output_high(birler);
      sayac = 1;
      break;
                
      case 1:
      output_low(birler);  
      output_b(digit[temp / 10]);
      output_high(onlar);
      sayac = 0;  
      break;   
   }
   enable_interrupts(INT_timer0); 
}

void main()
{                        
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(T0_INTERNAL | T0_DIV_16 );
   setup_timer_1(T1_DISABLED);  
   setup_timer_2(T2_DISABLED,0,1);    
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   set_timer0(131);     
   
   enable_interrupts(INT_timer0);
   enable_interrupts(GLOBAL);
   
   set_tris_a(0x00);
   set_tris_b(0x00);       
   output_a(0x00);
   output_b(0x00);          
                      
   While(TRUE){temp = ds1820_read();}                                      
}                                             



F493

Merhaba semfero,

     Koduna baktım bir sorun yok gibi görünüyor, gayet açık yazılmış. Ds1820 fonksiyonu okumayı interrupt ile mi yapıyor?. Sen Ds1820 fonk. while'ın başında çağırmışşın sonrada ekrana yazdırmışşın. Eğer interrup yok ise sorun olmaması lazım.  Açıkcası anlayamadım. Sanki senin kodunda arka planda interrupt çalışıyor. Sen Ds1820 fonk. bir incele içinde periodik int. falan mı var?. Başka bir durum ise Eğer taramayı interrupt ile yaparsan bu seferde ds1820'den sıcaklıkları yanlış okursun. Nedeni okuma yazma yaparken beklemeleri garanti etmek gerekiyor Ds1820 için o nedenle bu sefer başka yerden patlak verir yazılım.

Esen kalın.