Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

programda ds18b20 yi oturtamadım

Başlatan necimettin, 20 Nisan 2010, 23:13:23

necimettin

Arkadaşlar devrede lm35 vardı onun yerine ds18b20 koymaya çalıştım.ama bir yerde hata yaptım sanırım değeri doğru yakalayamıyorum işten anlayan arkadaşlar yardımcı olabilirler mi?
(programı netten buldum.displayları tarama yöntemi ile sürüyor.Bana -25 ve +55 derece arası ölçüm yapması lazım lm35 te bunu başaramadım.)

//----- ds1302 pinleri tanımlanıyor --------------------------------------------
#ifndef     rtc_sclk
#define     rtc_sclk   pin_c1
#define     rtc_io     pin_c2       
#define     rtc_rst    pin_c0
#endif                       
//------------------------------------------------------------------------------
                     
#include <16f877.h>                             
#fuses XT,NOWDT,NOPROTECT   
#use delay (clock=20000000)                   
                                       
#include <DS1302.c>                           
#include <math.h>
#include <ds18b20.c>
#define set pin_c4
#define mod pin_c5
#define arttir pin_c6
#define azalt pin_c7

byte saniye,dakika,saat,gun,ay,yil,haftanin_gunu;
                 
char display1_onlar,display1_birler,display2_onlar,display2_birler,display3_onlar,display3_birler; 
                 
const int display_digit[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};  // ortak anotlu için             
int i;
int set_degeri=0; // 1=saat 2=tarih
int mod_degeri=0; // 1=saat,gun 2=dakika,ay 3=saniye,yıl 

float sicaklik_degeri;
int sicaklik_ekrani=0; //1=aktif, 0=pasif   
           
//------------------------------------------------------------------------------

//----- displaylerin hepsi taranıyor -------------------------------------------
void display_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(display_digit[display2_onlar]);     
delay_ms(2);           
output_d(0b00001000);
output_b(display_digit[display2_birler]);     
delay_ms(2);
output_d(0b00010000);
output_b(display_digit[display3_onlar]);     
delay_ms(2);
output_d(0b00100000);
output_b(display_digit[display3_birler]);     
delay_ms(2);

} // display tara 
//------------------------------------------------------------------------------

//-------- sicaklik gosterimi icic tarama --------------------------------------
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(0b000010000);
output_b(0x9c); // derece simgesi   
delay_ms(2);           
output_d(0b000100000);
output_b(0xc6); // C harfi   
delay_ms(2);
output_d(0b00000000);

}
//------------------------------------------------------------------------------

//------- gecisler icin animasyon ----------------------------------------------
void gecis_animasyon()
{
output_d(0x00);
delay_ms(300);

output_d(0b00000001);         
output_b( 0xb6 );   
delay_ms(100);           
output_d(0b00000010);         
output_b( 0xb6 );   
delay_ms(100);
output_d(0b00000100);         
output_b( 0xb6 );   
delay_ms(100);
output_d(0b00001000);         
output_b( 0xb6 );   
delay_ms(100);
output_d(0b00010000);         
output_b( 0xb6 );   
delay_ms(100);
output_d(0b00100000);         
output_b( 0xb6 );   
delay_ms(100);         

output_d(0x00);
delay_ms(300);
}
//------------------------------------------------------------------------------

//------- sadece display1 taranıyor --------------------------------------------
void display1_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);
}
//------------------------------------------------------------------------------

//------- sadece display2 taranıyor --------------------------------------------
void display2_tara()
{
output_d(0b00000100);
output_b(display_digit[display2_onlar]);     
delay_ms(2);           
output_d(0b00001000);
output_b(display_digit[display2_birler]);     
delay_ms(2);
}
//------------------------------------------------------------------------------

//------- sadece display3 taranıyor --------------------------------------------
void display3_tara()
{
output_d(0b00010000);
output_b(display_digit[display3_onlar]);     
delay_ms(2);
output_d(0b00100000);
output_b(display_digit[display3_birler]);     
delay_ms(2);
}
//------------------------------------------------------------------------------

//------- SET konumunda displayler taranıyor -----------------------------------
void set_konumunda_display_tara()
{
output_d(0x00);
delay_ms(300);
display_tara();
display_tara();
display_tara();
display_tara();
display_tara();
}
//------------------------------------------------------------------------------

//------------- saat tarih ayarı -----------------------------------------------
void ayarlar()
{

  if (input(set))
  {
   while(input(set))
   {
      if(sicaklik_ekrani==1){ sicaklik_tara(); }
      else { display_tara(); }
      output_low(pin_a1);output_low(pin_a2);
   }
  set_degeri=1;                                       
  }
  else { goto ayardan_cik; }

while(set_degeri==1) //saat ayarı           
{
output_e(0b001);

rtc_get_time(saat,dakika,saniye);
display1_birler=saat%10;             
display1_onlar=saat/10;
display2_birler= dakika%10;
display2_onlar=dakika/10;
display3_birler=saniye%10;
display3_onlar=saniye/10;
set_konumunda_display_tara();

if(input(set)){ while(input(set)){display_tara();} set_degeri=2; goto set1_den_cik; }
                   
if(input(mod)){ while(input(mod)){display_tara();} mod_degeri=1; }
                         
while(mod_degeri==1)   //saat ayarlanıyor.
{
     
  for(;;)               
  {           
    display1_birler=saat%10;             
    display1_onlar=saat/10;           
    display1_tara();
                                                               
if(input(arttir)){saat++; while(input(arttir)){display1_tara();} if(saat==24){saat=0;} }
if(input(azalt)){saat--; while(input(azalt)){display1_tara();} if(saat==-1){saat=23;} }
if(input(mod)){while(input(mod)){display1_tara();} mod_degeri=2; goto mod1s_cik;}                                   
write_ds1302(0x84,get_bcd(saat)); //saat degeri gonder. 0-23
delay_ms(5);
} //for smod1
} //while mod deger = 1
mod1s_cik:
                           
while(mod_degeri==2)   //dakika ayarlanıyor.
{                             

  for(;;)               
  {                     
    display2_birler=dakika%10;             
    display2_onlar=dakika/10;           
    display2_tara();
 
if(input(arttir)){dakika++; while(input(arttir)){display2_tara();} if(dakika==60){dakika=0;} }
if(input(azalt)){dakika--; while(input(azalt)){display2_tara();} if(dakika==-1){dakika=59;} }
if(input(mod)){while(input(mod)){display2_tara();} mod_degeri=3; goto mod2s_cik;}                                   
write_ds1302(0x82,get_bcd(dakika)); //dakika degeri gonder. 00-59 
delay_ms(5);
} //for smod2
} //while mod deger = 2
mod2s_cik:   

while(mod_degeri==3)   //saniye ayarlanıyor.
{   
   
  for(;;)
  { 
    display3_birler=saniye%10;             
    display3_onlar=saniye/10;           
    display3_tara();
                                     
if(input(arttir)){saniye++; while(input(arttir)){display3_tara();} if(saniye==60){saniye=0;} }
if(input(azalt)){saniye--; while(input(azalt)){display3_tara();} if(saniye==-1){saniye=59;} }
if(input(mod)){while(input(mod)){display3_tara();} mod_degeri=0; goto mod3s_cik;}                                   
write_ds1302(0x80,get_bcd(saniye)); //saniye degeri gonder. 00-59
delay_ms(5);
} //for smod3         
} //while mod deger = 3
mod3s_cik:
                           
delay_us(1);
} // while set deger = 1
set1_den_cik:


while(set_degeri==2) //tarih ayarı           
{
output_e(0b010);

rtc_get_date(gun,ay,yil,haftanin_gunu);
display1_birler=gun%10;                                             
display1_onlar=gun/10;                                             
display2_birler= ay%10;
display2_onlar=ay/10;                                             
display3_birler=yil%10;         
display3_onlar=yil/10; 
set_konumunda_display_tara();                                               

if(input(set)){ while(input(set)){display_tara();} set_degeri=0; goto set2_den_cik; }
                                                               
if(input(mod)){ while(input(mod)){display_tara();} mod_degeri=1; }
                         
while(mod_degeri==1)  //gun ayarlanıyor.
{
     
  for(;;)               
  {           
    display1_birler=gun%10;             
    display1_onlar=gun/10;           
    display1_tara();
                                                               
if(input(arttir)){gun++; while(input(arttir)){display1_tara();} if(gun==32){gun=1;} }
if(input(azalt)){gun--; while(input(azalt)){display1_tara();} if(gun==0){gun=31;} }
if(input(mod)){while(input(mod)){display1_tara();} mod_degeri=2; goto mod1t_cik;}                                   
write_ds1302(0x86,get_bcd(gun)); //gun degeri gonder. 1-31
delay_ms(5);
} //for tmod1
} //while mod deger = 1
mod1t_cik:                   
                           
while(mod_degeri==2)    //ay ayarlanıyor.
{

  for(;;)               
  {                     
    display2_birler=ay%10;             
    display2_onlar=ay/10;           
    display2_tara();
 
if(input(arttir)){ay++; while(input(arttir)){display2_tara();} if(ay==13){ay=1;} }
if(input(azalt)){ay--; while(input(azalt)){display2_tara();} if(ay==0){ay=12;} }
if(input(mod)){while(input(mod)){display2_tara();} mod_degeri=3; goto mod2t_cik;}                                   
write_ds1302(0x88,get_bcd(ay)); //ay degeri gonder. 1-12
delay_ms(5);
} //for tmod2
} //while mod deger = 2
mod2t_cik:

while(mod_degeri==3)  //yil ayarlanıyor.
{   
   
  for(;;)
  { 
    display3_birler=yil%10;             
    display3_onlar=yil/10;           
    display3_tara();
                                     
if(input(arttir)){yil++; while(input(arttir)){display3_tara();} if(yil==100){yil=0;} }
if(input(azalt)){yil--; while(input(azalt)){display3_tara();} if(yil==-1){yil=99;} }
if(input(mod)){while(input(mod)){display3_tara();} mod_degeri=0; goto mod3t_cik;}                                   
write_ds1302(0x8C,get_bcd(yil)); //yil degeri gonder. 00-99
delay_ms(5);                   
} //for tmod3       
} //while mod deger = 3
mod3t_cik:

delay_us(1);
} // while set deger = 2
set2_den_cik:

ayardan_cik:
output_e(0b000); //lambalar söndü
} // void ayar
//------------------------------------------------------------------------------             

//--------- saat basi alarm caliyor --------------------------------------------
void saat_basi_alarm()
{
if ((display2_onlar==0)&(display2_birler==0))
{
output_high(pin_c3); delay_ms(100); output_low(pin_c3); delay_ms(100);
output_high(pin_c3); delay_ms(100); output_low(pin_c3);
}
}
//------------------------------------------------------------------------------

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

   output_a(0x00);
   output_b(0x00);
   output_c(0x00);
   output_d(0x00);
   output_e(0x00);
   delay_ms(2);
   
   rtc_init();  // DS1302 başlangıç ayarları yapılıyor
   delay_ms(20);
   sicaklik_degeri=ds1820_read();
   //rtc_set_datetime(1,02,10,7,21,20); // Tarih ve Saat ayarları yapılıyor
   
   for(;;)               
   {                           
       
       gecis_animasyon();

       output_low(pin_a2);
       output_high(pin_a1);
       
       for(i=0;i<250;i++) //for saat
       {
       if (input(set)){ayarlar();output_low(pin_a2);output_high(pin_a1);}
       rtc_get_time(saat,dakika,saniye);       // DS1302'den saat,dakika,saniye bilgileri alınıyor
       display1_birler=saat%10;  // birler basamağı için % işareti ile mod lu bölme yapılarak 10 a bölümünden kalan hesaplanıyor.             
       display1_onlar=saat/10;   // saat degerini 10 a bölüp onlar basamağı hesaplanıyor.
       display2_birler= dakika%10;
       display2_onlar=dakika/10;
       display3_birler=saniye%10;   
       display3_onlar=saniye/10;
       display_tara();                 
       delay_ms(5);   
       } // for saat 
       
       saat_basi_alarm();
       
       output_low(pin_a1);
       output_low(pin_a2);
       
       gecis_animasyon();

       output_low(pin_a1);
       output_high(pin_a2);
       
       for(i=0;i<250;i++)  //for tarih
       {   
       if (input(set)){ayarlar();output_low(pin_a1);output_high(pin_a2);}
       rtc_get_date(gun,ay,yil,haftanin_gunu);
       display1_birler=gun%10;  // birler basamağı için % işareti ile mod lu bölme yapılarak 10 a bölümünden kalan hesaplanıyor.             
       display1_onlar=gun/10;   // saat degerini 10 a bölüp onlar basamağı hesaplanıyor.
       display2_birler= ay%10;
       display2_onlar=ay/10;
       display3_birler=yil%10;         
       display3_onlar=yil/10;
       display_tara();
       delay_ms(5);           
       } // for tarih
       
       output_low(pin_a1);
       output_low(pin_a2);
       
       gecis_animasyon();
       
       sicaklik_ekrani=1;
       for(i=0;i<=250;i++) //for sicaklik
       {
       
       if (input(set)){ayarlar();}
       delay_us(20);
       sicaklik_degeri=ds1820_read();   
       display2_birler=(int)sicaklik_degeri%10;
       display2_onlar=(int)(sicaklik_degeri/10);   
       sicaklik_tara();     
       delay_ms(5);
       }//for sicaklik                   
       sicaklik_ekrani=0;     
       
   } //for sonsuz 
}  // main

necimettin


mustafay

Merhaba,

Driver dosyası olarak 1 wiler kodu ile birlikte aşağıdaki gibi düzgün çalışıyor. Bir de bunu dene istersen


#define ONE_WIRE_PIN PIN_E0   // Burası istenilen pin seçilebilir.
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 / 16.0;
delay_ms(200);
return(result);
}


programda

*değişken = ds1820_read();

şeklindeki kod direk sayısal bilgi olarak değişkene yüklenir.