Haberler:

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

Ana Menü

ds18b20 nin 85 Derece ölçmesi

Başlatan Emre MERMİ, 19 Aralık 2015, 16:02:00

Emre MERMİ

merhaba hocalarım,

daha önceden çalıştırdığım ds18b20 şimdi sürekli olarak 85 derece ölçüyor. Bu sorunla karşılaşan insanların yerli yabancı forumlarda yazdıklarını okudum ama net birşey bulamadım. Nedeni ne olabilir ? sensörün datasheetinin 7 sayfasında da bahsetmiş ama anlamadım.

#include <16F628A.h>

#FUSES MCLR //Master Clear pin enabled
#fuses INTRC_IO

#use delay(internal=4MHz)
#include <ds18b20.c>
const char  digit[10]={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C,  0x07, 0x7F, 0x67};
int sicaklik=0,max=50; 
int a=0,b=0,b1=0,c=0,e=0,f=0,g=0,h=0,m=0;
int1 z=0,y=0,x=0,x1=0;
unsigned long int d=0,p=0;

#INT_TIMER2
void  TIMER2_isr(void) 
{

if(m==4){
m=0;
}

m=m+1;

    output_b(0x00);
   output_low(pin_a0);  // soldan 1. display toprağı
   output_low(pin_a7);  //  soldan 2. display toprağı
   output_low(pin_a6);     // soldan 3. display toprağı

if(x==0){
if(m==1){
   a=sicaklik/100;
   output_high(pin_a0);  // soldan 1. display toprağı
   output_low(pin_a7);  //  soldan 2. d,splay toprağı
   output_low(pin_a6);     // soldan 3. display toprağı
   output_b(digit[a]);

   }
   if(m==2){

   output_low(pin_a0);  // soldan 1. display toprağı
   output_high(pin_a7);  //  soldan 2. d,splay toprağı
   output_low(pin_a6);     // soldan 3. display toprağı
   b=sicaklik%100;
   b1=b/10;
   output_b(digit[b1]);


   }
   
   if(m==3){
  
   output_low(pin_a0);  // soldan 1. display toprağı
   output_low(pin_a7);  //  soldan 2. display toprağı
   output_high(pin_a6);     // soldan 3. display toprağı
   c=sicaklik%10;
   output_b(digit[c]);


   }
 
}
if(x==1){

    output_b(0x00);
   output_low(pin_a0);  // soldan 1. display toprağı
   output_low(pin_a7);  //  soldan 2. display toprağı
   output_low(pin_a6);     // soldan 3. display toprağı
   
   
if(m==1){
   output_high(pin_a0);  // soldan 1. display toprağı
   output_low(pin_a7);  //  soldan 2. d,splay toprağı
   output_low(pin_a6);     // soldan 3. display toprağı
  e=max/100;
  output_b(digit[e]);

  }
  
   if(m==2){

   output_low(pin_a0);  // soldan 1. display toprağı
   output_high(pin_a7);  //  soldan 2. d,splay toprağı
   output_low(pin_a6);     // soldan 3. display toprağı
   f=max%100;
   g=f/10;
   output_b(digit[g]);



   }
   
      if(m==3){
  
   output_low(pin_a0);  // soldan 1. display toprağı
   output_low(pin_a7);  //  soldan 2. display toprağı
   output_high(pin_a6);     // soldan 3. display toprağı
   h=max%10;
   output_b(digit[h]);
  }
  

}

    
    
    }
   
   
   


void main()
{  
   
   setup_oscillator(osc_4mhz);
   setup_timer_2(T2_DIV_BY_16,190,1);      //3,0 ms overflow, 3,0 ms interrupt
   

   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);
   
   set_tris_b(0x00);
   delay_ms(50);
   output_b(0x00);
   set_tris_a(0b00111110);
   delay_ms(50);
   output_b(0x00);
   sicaklik=ds1820_read();
   
   while(TRUE)
   {

        
        

      sicaklik=ds1820_read();
    
            

      //TODO: User Code
   }

}


kütüphane;
#define ONE_WIRE_PIN PIN_C7 // sensörün DQ bacağının bağlanacağı pin
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);
}


bir ara ölçüyordum ama kodda biraz değişiklik yapınca ölçüm kayboldu. Eski haline de döndüremedim bir türlü.

xoom

Sensör arızalanmış olabilir veya bağlantılarınızı kontrol ediniz. Genellikle arızalanınca veya bağlantı probleminde 85 okunur.

Emre MERMİ

hocam bağlantılarda bir sorun yok elimde birkaç tane sensör var hepsini deniyorum aynı ayrıca elimde 2 tane devre var ikisinde de sonuç aynı

pwm.c

#define ONE_WIRE_PIN PIN_C7
16f628'de C7 diye pin yok. burayı düzenledinmi?
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Emre MERMİ

hocam kütüphaneyi bilgisayarda bulmaya çalışmak yerine direk aldığım siteden kopyalayıp yapıştırdım. pin a1 e bağlı kütüphanede de a1 yazıyor.

ahmetbudak


Emre MERMİ

Nasıl hocam digital yaptık mı ?

pwm.c

#7
Programdaki hatayı bulmak için debug yapman gerekir. en garantili sonuca böyle ulaşırsın.
Yazdığın kodlarda ise interrupt fonksiyonu içine çok fazla kod ve işlem eklemişin. bunlar sensörden okunan değerleri etkiler.
istersen benim yaptığım DS18B20 uygulamasını incele. kendi kodlarını bunun üzerine ilave ederek devam edersin. ikisinide CCS C ile yazdım ve sensör hata göstergeside mevcut. devrelerden biri timer0 kesmesi diğeride kesme kullanılmadan yapılmış örnektir. umarım işini görür.

indir:
https://github.com/pwmccs/elektronik/raw/master/pic16f628_ds18b20_termometre.zip
alternatif:
https://yadi.sk/d/Onhu45B535bcQf

kolay gelsin.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

ahmetbudak

#8
Alıntı yapılan: Emre MERMİ - 19 Aralık 2015, 19:24:55
Nasıl hocam digital yaptık mı ?
628 de a1 analog karşılaştırıcı olması lazım datasheet den bakarsan ilgili registerden bu pini digital I/O yapmak lazım
Ccs de main fonk. da  setup_comparator(NC_NC_NC_NC)
Bildirimini yapmak gerek

Emre MERMİ


Alıntı yapılan: ahmetbudak - 19 Aralık 2015, 20:34:16
628 de a1 analog karşılaştırıcı olması lazım datasheet den bakarsan ilgili registerden bu pini digital I/O yapmak lazım
Ccs de main fonk. da  setup_comparator(NC_NC_NC_NC)
Bildirimini yapmak gerek

Hocam comparator u kapatım deneyeceğim ama daha önce aynı pinden sorunsuz okumuştum.

Emre MERMİ


Alıntı yapılan: pwm.c - 19 Aralık 2015, 19:29:59
Programdaki hatayı bulmak için debug yapman gerekir. en garantili sonuca böyle ulaşırsın.
Yazdığın kodlarda ise interrupt fonksiyonu içine çok fazla kod ve işlem eklemişin. bunlar sensörden okunan değerleri etkiler.
istersen benim yaptığım DS18B20 uygulamasını incele. kendi kodlarını bunun üzerine ilave ederek devam edersin. ikisinide CCS C ile yazdım ve sensör hata göstergeside mevcut. devrelerden biri timer0 kesmesi diğeride kesme kullanılmadan yapılmış örnektir. umarım işini görür.

https://dl.dropboxusercontent.com/u/59120073/pic16f628_ds18b20_termometre.zip


kolay gelsin.

Hocam kesme içinde sadece bayrak atayarak da denedim sonuç aynı. Bu sefer de ds18b20 nin kütüphanesinde bulunan 200ms bekleme süresi yüzünden okuma yaparken ekranda yazı gidip geliyordu. @MrDark hocam kesme içinde ekrana yazdır dediği için böyle yaptım bende. Birde maalesef pic kit 2 kullandığım için debug yapamıyorum. Yarın sabah sizin uygulamanızı deneyip sonucu sizinle paylaşacağım.

aliveli

85 ds18b20 içindeki deafult değer sürekli 85 okuyorsan çevrim işlemi gerçekleşmediğindendir muhtemel sebebini pwm.c açıklamış

MrDarK

#12
Emre digitlerini ana programda böl, yani hangi digite hangi rakamın geleceğini ana programında belirleyeceksin. Ayrıca gereksiz yere heryere if yazmak yerine else if kullanman gerekiyor.

Aynı uygulamayı sıkıntısız çalıştırdım, arkadaşların dediği doğru interrupt içinde gereksiz işlem yapma. Sadece tarama yapacaksın başka birşey koymamalısın. Onuda sana gösterdiğim örnekte if kullanmadan switch case lerle yaptırmıştım...

Birde ana programına delay_ms(1000) şeklinde bir ifade gir. Her u sn de bir ds18b20'yi okumak sana birşey kazandırmayacaktır.
Picproje Eğitim Gönüllüleri ~ MrDarK

Emre MERMİ

Alıntı yapılan: MrDarK - 20 Aralık 2015, 12:52:27
Emre digitlerini ana programda böl, yani hangi digite hangi rakamın geleceğini ana programında belirleyeceksin. Ayrıca gereksiz yere heryere if yazmak yerine else if kullanman gerekiyor.

Aynı uygulamayı sıkıntısız çalıştırdım, arkadaşların dediği doğru interrupt içinde gereksiz işlem yapma. Sadece tarama yapacaksın başka birşey koymamalısın. Onuda sana gösterdiğim örnekte if kullanmadan switch case lerle yaptırmıştım...

Birde ana programına delay_ms(1000) şeklinde bir ifade gir. Her u sn de bir ds18b20'yi okumak sana birşey kazandırmayacaktır.

hocam if kullanmak alışkanlık olmuş vazgeçmeye çalışacağım, dediğiniz gibi  switch case kullanarak yapacağım. Bu arada elimde 4 tane sensör vardı. Dün gidip yeni sensör aldım, ne olur ne olmaz diye. Devre çalıştı. Meğer elimdeki 4 sensörü de bozmuşum.
Birde hocam bu delay_us yi bişey denemek için koymuştum öyle kalmış :)

herkese yanıtı için çok teşekkür ederim, sadece sorunun çözümü değil birçok konuda bilgi sahibi oldum bu başlık sayesinde.