ds18b20 sıcaklığı hep 0.5 derece olarak görüyor ?

Başlatan engineer42, 20 Temmuz 2012, 14:31:30

engineer42

iyi günler... ds18b20 ile termometre yapmaya çalışıyorum lcd ekran da sıcaklık okunacak sadece... entegrenin sürücüsünü derleyicinin klasörüne attım internette baya bi tüyo vardı onları da uyguladım (entegreye 4.7 k lık pull up direnci gibi).. ancak sıcaklığı hep 0.5 derece olarak görüyor...
#include "D:\projeler\termometre...h"
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NODEBUG,NOCPD

#use delay (clock=4000000)
#use fast_io(b)
#use fast_io(a)
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1)
#include <ds18b20.c>
#include <lcd.c>
 
float x;

 

void main( )
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
    
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
    
   
   
    
     lcd_init();
   
   while(1)
   {
  
     x=(ds1820_read());
     delay_ms(1000);
    
     printf(lcd_putc ,"\fSicaklik: %5.1f'C",x);
     delay_ms(100);
     
   }
}

pwm.c

sana denediğim uygulamayı vereyim istersen. %100 çalışıyor.
kendi yapacağın projeye uyarlayabilirsin.

#include <16f876a.h>            //Kullanılacak pic       
#use delay(CLOCK=4000000)         //Fosc=4Mhz 
#fuses HS,NOWDT,NOPROTECT,NOLVP
#define use_portb_lcd TRUE         //B portu lcd için ayrılıyor
#include <lcd.c>                 //lcd ait fonksiyonlar programa eklenir
#include "ds18b20.c"             //ds18b20 ait fonksiyonlar programa eklenir
//Global değişkenler

///PROGRAM
void main(void){ 
float temp;    
   lcd_init();  // LCD başlangıç ayarları yapılıyor

   while(1)
   {  temp = ds1820_read();                //Sıcaklık bilgisi okunuyor ve çevriliyor
      
      printf(lcd_putc,"\f %3.1f%cC  \n DS18B20 CCS",temp,223); 

      delay_ms(300); // 1/2 sn gecikme veriliyor
   }
}


ds18b20.c dosyası:
#define ONE_WIRE_PIN PIN_c0
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);
}


buda devre şeması:
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

engineer42

hocam verdiğiniz kodları aynı şekilde yazdım devreyi yeni baştan kurdum ama yine -0.5 derece gösteriyor.... :(