Dijital Termometre Yadım !

Başlatan fsm28, 10 Aralık 2010, 20:45:07

fsm28

Pic 16F877A VE DS18B20 sıcaklık sensörü kullanarak dijital termometre yapmaya çalışıyorum.Ancak sürekli hata alıyorum.Aldığım hatayı,1 wire iletişim dosyasını ve ds1820 dosyasını aşağıdaki linkten indirebilirsiniz.Bu hatayı düzeltmek için yardımlarınızı bekliyorum.

http://s2.dosya.tc/file/KCGfzv/Desktop.rar.html

F.T

programı siteye eklersen daha iyi olur.açık kodları ile.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

fsm28

//***main.c***

#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES WRT_50%                  //Lower half of Program Memory is Write Protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#define use_portb_lcd TRUE

#include <lcd.c>
#include <ds1820.c>
#include <1_wire.c>


float sicaklik;

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
   ow_hiz(1);
   lcd_init();
   sicaklik=ds1820_read()/8,0;
   printf(lcd_putc,"%f",sicaklik);
}


//***1_wire.c***

#define ow_data_pin pin_c0

int16 A,B,C,D,E,F,G,H,I,J;

//***** İletişim Hızı Seçme Fonksiyonu *****

void ow_hiz(int hiz)
{
   if (hiz==1) // hiz değeri "1" ise standart hız geçerli
   {
      A = 6;
      B = 64;
      C = 60;
      D = 10;
      E = 9;
      F = 55;
      G = 0;
      H = 480;
      I = 70;
      J = 410;
   }

   if (hiz==0) // hiz değeri "0" ise Yüksek hız geçerli
               // Yüksek hızda ondalıklı süre değerleri yuvarlatılmıştır
   {
      A = 1;
      B = 7;
      C = 7;
      D = 2;
      E = 1;
      F = 7;
      G = 2;
      H = 70;
      I = 8;
      J = 40;
   }
}


//***** 1-Wire İletişim Reset Sinyali Gönderme Fonksiyonu *****

int1 ow_reset(void)
{
   int1 sonuc; // sonuc adında 1 bitlik bir değişken tanımlanıyor

   delay_us(G); // G süresi kadar gecikme veriliyor
   output_low(ow_data_pin); // 1-Wire data pini çıkışı lojik-0
   delay_us(H); // H süresi kadar gecikme veriliyor
   output_float(ow_data_pin); // 1-Wire data pini boşta (giriş olarak yönlendirildi)
   delay_us(I); // I süresi kadar gecikme veriliyor
   sonuc=input(ow_data_pin); // 1-Wire data pini okunuyor
   delay_us(J); // J süresi kadar gecikme veriliyor

   return sonuc; // sonuc değişkeni değeri ile fonksiyon geri döner
}



//***** 1-Wire İletişimde Bir Bit Bilgi Yazma Fonksiyonu *****

void ow_yaz_bit(int bit)
{
   if (bit==1) // "1" Bilgisi Yazılır
   {
      output_low(ow_data_pin);
      delay_us(A);
      output_float(ow_data_pin);
      delay_us(B);
   }
   else  // "0" Bilgisi Yazılır
   {
      output_low(ow_data_pin);
      delay_us(C);
      output_float(ow_data_pin);
      delay_us(D);
   }
}

//***** 1-Wire İletişimde Bir Bit Bilgi Okuma *****
int1 ow_oku_bit(void)
{
   int1 bit; // Bir bitlik değişken tanımlanıyor

   output_low(ow_data_pin);   // 1-Wire data pini çıkışı lojik-0
   delay_us(A);               // A süresi kadar gecikme veriliyor
   output_float(ow_data_pin); // 1-Wire data pini boşta (giriş olarak yönlendirildi)
   delay_us(E);               // E süresi kadar gecikme veriliyor
   bit=input(ow_data_pin);
   delay_us(F);               // F süresi kadar gecikme veriliyor

   return bit; // Fonksiyon bit değişkeni değeri ile geri döner
}


//***** 1-Wire İletişimde Bir Byte Bilgi Yazma Fonksiyonu *****
void ow_yaz_byte(int data)
{
   int i; // Okunacak bilginin bit sayısını tutan değişken

   for (i=0;i<8;i++) // Byte bilgisi bit bit yazdırılıyor. LSB biti ilk önce gönderiliyor.
   {
      ow_yaz_bit(bit_test(data,i)); // data değişkeni değerinin bitleri tek tek okunup gönderiliyor
   }
}

//***** 1-Wire İletişimde Bir Byte Bilgi Okuma Fonksiyonu *****
int ow_oku_byte(void)
{
   int i,sonuc=0; // Tam sayı tipinde değişkenler tanımlanıyor

   for (i=0;i<8;i++)
   {
      sonuc=sonuc>>1;    // sonuc değişkenini 1 bit sağa kaydır

      if (ow_oku_bit())        // Eğer okunan bit "1" ise
         sonuc=(sonuc | 0x80); // Okunan biti sonuc değerinde belirt
   }
   return sonuc;  // Okunan byte değeri ile geri dön
}

//****ds1820.c**

#include <1_wire.c>
float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;

ow_reset();
ow_yaz_byte(0xCC);
ow_yaz_byte(0x44);

while (busy == 0)
  busy = ow_oku_byte();

ow_reset();
ow_yaz_byte(0xCC);
ow_yaz_byte(0xBE);
temp1 = ow_oku_byte();
temp2 = ow_oku_byte();
temp3 = make16(temp2, temp1);

result = (float) temp3 / 2.0;   //Calculation for DS18S20 with 0.5 deg C resolution
// result = (float) temp3 / 16.0;  //Calculation for DS18B20 with 0.1 deg C resolution

delay_ms(200);
return(result);
}

temha

 kardeş kullandığın program yanılmıyorsam c Bu programdan anlamıyorum ama pic basic pro da uyguladığım bir termometreli saat devresi var istersen gönderebilirim


fsm28

Hocam 1. linktekini yaptım;ancak değer hep 0.5 derece çıkıyor.Neden olabilir acaba ?