DS18B20 sensör bozulma durumu

Başlatan mbozdal, 13 Eylül 2012, 14:19:49

mbozdal

Arkadaşlar 2 tane ds18b20 içeren bi devre kurdum devre çalışşıyor bi sıkıntı yok. Yalnız sensörlerden birinin kablosu kopsa çalışmassa pic kitleniyor wdt  kullansam diye düşündüm ama reset atsa bile yine aynı durum yaşanacak. cvp gelmediğini nassıl anlarım ve cvp yoksa farklı bir işlem nasıl yaptırabilirim şimdiden teşekkürler.
#include <16f877.h>  

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) 

#use fast_io(b)


#define use_portb_lcd TRUE

#include <lcd.c> 
#include "s2ds18b20.c"
#include "ds18b20.c"  

float sensor1,sensor2;  


void main ( )
{
   setup_psp(PSP_DISABLED);       
   setup_timer_1(T1_DISABLED);    
   setup_timer_2(T2_DISABLED,0,1); 
   setup_adc_ports(NO_ANALOGS);  
   setup_adc(ADC_OFF);          

   set_tris_b(0x00);
   set_tris_d(0xf0);
   output_d(0x00);

   lcd_init(); 
   delay_ms(100);
   printf(lcd_putc,"      Devre ");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"   Hazirlaniyor ");
   sensor1 = ds1820_read();
   sensor2 = s2ds1820_read();
   delay_ms(500);
   while(1) 
   {
      sensor1 = ds1820_read();
      sensor2 = s2ds1820_read();
      printf(lcd_putc,"\f Sensor 1 : %f",sensor1);
      lcd_gotoxy(1,2);
      printf(lcd_putc," Sensor 2 : %f",sensor2);
      
      if(sensor1<0||sensor2<0)
      {
      output_high(pin_d0);
      output_low(pin_d1);
      }
      else if(input(pin_d5)||input(pin_d6)||input(pin_d7))
      {
      if(sensor1<2||sensor2<2)
      {
        output_high(pin_d0);
        output_low(pin_d1);
      }    
      }
      else
      {
      output_high(pin_d1);
      output_low(pin_d0);
      }
   
      delay_ms(3000); 

   }
}

Burak B

DS18B20 kodundaki ds1820_read() fonksiyonundaki while döngüsünün (bir while var diye tahmin ediyorum) yerine belli bir süre bekleme yapan bir kod koy. Böylece While sonsuz döngüye girmez ve PIC kitlenmez. Ayrıca zaman aşıldığı halde veri onayı gelmemişse hata döndürürsün. Sensör okuma kodunu vermemişsin. Onları da eklersen daha iyi yardım alırsın.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

camby

yazılımsal bir sorun bu. Pic kitlenmez bu sensör ile , @bytemaster'ın dediği gibi program biyerden çıkamıyordur.

mbozdal

Alıntı yapılan: ByteMaster - 13 Eylül 2012, 16:55:22
DS18B20 kodundaki ds1820_read() fonksiyonundaki while döngüsünün (bir while var diye tahmin ediyorum) yerine belli bir süre bekleme yapan bir kod koy. Böylece While sonsuz döngüye girmez ve PIC kitlenmez. Ayrıca zaman aşıldığı halde veri onayı gelmemişse hata döndürürsün. Sensör okuma kodunu vermemişsin. Onları da eklersen daha iyi yardım alırsın.
Teşekkürler arkadaşlar evet yazılımsal olduğu kesin zaten hatta geri bağllayınca çalışıyorda. en kısa zamanda deneyeceğim sensör kodunuda aşağıya ekliyorum.
#define ONE_WIRE_PIN PIN_c0
void onewire_reset() 

{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); 
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 );
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)  //Galiba Burasını değiştireceğim =)
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);
}

Burak B

Tespit doğru. Orayı belli bir süre bekleyip sonra eğer istenen durum değişmezse hata döndürecek şekilde bir kod ile değiştir. Bu bir delay() olabileceği gibi bir for() döngüsüde olabilir. Delay kullanırsan bekleme sonunda durumu kontrol et ve hala busy==0 geliyorsa o zaman sensör yok kabul et ve yoluna devam et. Temel mantık bu. Geliştirmek sana kalmış.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

mbozdal

Alıntı yapılan: ByteMaster - 13 Eylül 2012, 22:32:48
Tespit doğru. Orayı belli bir süre bekleyip sonra eğer istenen durum değişmezse hata döndürecek şekilde bir kod ile değiştir. Bu bir delay() olabileceği gibi bir for() döngüsüde olabilir. Delay kullanırsan bekleme sonunda durumu kontrol et ve hala busy==0 geliyorsa o zaman sensör yok kabul et ve yoluna devam et. Temel mantık bu. Geliştirmek sana kalmış.

Çok çok teşekkür ederim en kısa zamanda denyeceğim. Sonucuda söylerim:D

mbozdal

Arkadaşlar sonunda deneyebildim gecikme olmadı biraz sacmaladım :) ama sonunda başardım ve çalıştırdım ;D ;D ;D sensör olmayınca -500 değeri dönderiyorum. kodu buraya ekliyorum umarım başka arkadaşlara da yardımcı olur .
#define ONE_WIRE_PIN PIN_a7
int cvc=0;
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);
cvc=0;
while (busy == 0)
{
busy = onewire_read();

if(input(ONE_WIRE_PIN)==0)
{
cvc++;
if(cvc==350)
return -500;
}

}

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