Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ds18b20

Başlatan fm, 14 Mayıs 2013, 23:18:25

fm

Tek bir pic üzerine 2 adet ds18b20 kullanarak sıcaklıkları okutmaya çalıştığım zaman sonuçlar doğru çıkıyor. Ancak rs232 kullanarak ds18b20 lerden okunan sıcaklık verilerini başka bir pice göndermek istediğim zaman hem proteusta hemde kurulu devrede abuk subuk sıcaklıklar okuyor. Buna ne neden olabilir bilginiz var mı acaba?

Saygılarımla..

Kabil ATICI

Eğer okuduktan sonra gönderipte değerlerde bir saçmalık oluyorsa, seri portun hızları ile ilgili bir sorunun var demektir.
İlk önce okuduğun sıcaklık değeri yerini sabit sayılar gönder. Gönderdiğin değerin doğru alındığından emin olduktan sonra sıcaklık değerini gönder

Bir değeri gönderirken eğer aynı zamanda sıcaklık okumaya çalışıyorsan belki program mantığını gözden geçirmen gerekebilir.
ambar7

fm

Hocam rs232 ile bağlı 2 tane PIC var(16f877A). 1. PIC üzerinde sadece lcd var. 2. PIC üzerinde sadece 2 tane ds18b20 sensörleri var. lcd li olan sırayla 0, 1 ve 2 sayılarını gönderiyor sensörlü olana. 0,1 ve 2 hatasız gidiyor.  2. PIC ne zaman 0 değeri ile karşılaşırsa okuduğu blgileri 1. PIC e gönderiyor. Oda lcd de yazdırıyor. Temelde program bu. Dediğiniz gibi seri portun hızlarını da kontrol ettim ama sonuç değişmedi. Aklınıza gelen başka şeyleride paylaşırsanı çok sevinirim.

Saygılarımla..

Kabil ATICI

Aslında ben sıcaklık değeri olarak giden bilgi için kastetmiştim.

Sensör işlemcisi (sıcaklık değeri) ----> LCD işlemcisi

Yani sanki değeri ölçmüşsün de onu gönderiyormuşsun gibi. Böylece gönderdiğin değer aynen ekranda görüntüleniyor mu? Bakarsın eğer değer
görüntüleniyorsa, sorun sıcaklık değerini çevirmede dersin.
Görüntülenmiyorsa ozaman gönderme ve ekrana yazma bölümünde bir sorun var dersin.

Adım adım;
1-Verdiğin değer LCD'de görüntüleniyor mu? (LCD'nin buluduğu işlemcide)
2-Seri porttan giden değer LCD'de görüntüleniyor mu? (sensörün bulunduğu işlemcide)
3-Ölçüm yapmadan elle verilen bir değer (Sensör ölçmüş gibi) LCD'de görüntüleniyor mu?(sensörün bulunduğu işlemcide)
4-Son artık ölçülen değerin LCD'e görüntülenmesi kalıyor!(sensörün bulunduğu işlemcide)
ambar7

fm

Hocam vaktiniz olurda bakarsınız diye tasarımı kodları ve ds18b20ler için kullandığım kütüphaneyi ekledim. Eğer bakarsanız çok minnettar olurum.



SAĞDAKİ PIC:
#include <16F877A.h>
#include <string.h>

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#define use_portb_lcd TRUE
#include <lcd.c>

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // iletişimleri ayarlamak için isim verildi.




char giris[80]; 
int i,kb;
char *k;

void main()
{
   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
     
   set_tris_b (0x00);
   output_b (0x00) ;
   
   set_tris_c (0x80);
   
   set_tris_d (0x03);
   output_d (0x00);
   
   lcd_init();
   
   i=0;
   kb=0;
   
   printf(lcd_putc,"\fLutfen");
   printf(lcd_putc,"\nBekleyiniz");
   delay_ms(900);
   printf(lcd_putc,"\fOkuma Yapiliyor");
   delay_ms(2);

   while (1)
   {
      //putc(i);
       
      kb=kbhit(); 

      
      if(kb==1)
      {    
         gets(giris);
         delay_ms(100);
         

         //printf(lcd_putc,"\f%d numarali",i);
         //printf(lcd_putc,"\nslave okunuyor");
         //delay_ms(500);
         printf(lcd_putc,"\f%s",giris);
         delay_ms(1000);

         //i++;
         kb=0;
       }
       
      //if(i==2)
      //{
      //i=0;
      //}
      
    
   }   
}


SOLDAKİ PIC:
#include <16F877A.h>
#include <ds18b20.c>  

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)
//!#use fast_io(a)
//!#use fast_io(b)

#define use_portb_lcd TRUE
#include <lcd.c>

float sicaklik1, sicaklik2;

void main()
{

   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
    
//!   set_tris_a(0xff);
//!   output_a(0x00);
//! 
//!   set_tris_b(0x00);
//!   output_b (0x00);
   
   lcd_init ();
   
   while (1)
   {
 
      
      sicaklik1=ds1820_read();
      sicaklik2=ds1820_read1();
      
      printf(lcd_putc,"\fSicaklik1=%1.1f%cC",sicaklik1,223);
      printf(lcd_putc,"\nSicaklik2=%1.1f%cC",sicaklik2,223);

      delay_ms(500);
      
      printf("%f,%f\n\r",sicaklik1,sicaklik2);
      
  }


DS18B20 KÜTÜPHANESİ:
// 2 tane ds18b20 kullanıldığı zaman kullanılacak olan kütüphane
#define ONE_WIRE_PIN PIN_A4 //DS18B20 Bğlı pin tanımı
#define ONE_WIRE_PIN1 PIN_A5
#use delay(clock=4000000)

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_reset1() 

{
output_low(ONE_WIRE_PIN1);
delay_us( 500 ); 
output_float(ONE_WIRE_PIN1); //1-wire bir yapılır
delay_us( 500 );
output_float(ONE_WIRE_PIN1);
} 
//-------------------------------------------------------//
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.
}
} 

void onewire_write1(int data1)
{
int count1;
for (count1=0; count1<8; ++count1)
{
output_low(ONE_WIRE_PIN1);
delay_us( 2 ); // Sensöre yazma işlemine başlamak için  1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN1, shift_right(&data1,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN1); // 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 );
} 

int onewire_read1()
{
int count1, data1;
for (count1=0; count1<8; ++count1)
{
output_low(ONE_WIRE_PIN1);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN1); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data1,1,input(ONE_WIRE_PIN1)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
return( data1 );
} 
//------------------------------------------------------------------//
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);
}

float ds1820_read1()
{
int8 busy1=0, temp11, temp21;
signed int16 temp31;
float result1;
onewire_reset1();
onewire_write1(0xCC);
onewire_write1(0x44);
while (busy1 == 0)  //Galiba Burasını değiştireceğim =)
busy1 = onewire_read1();
onewire_reset1();
onewire_write1(0xCC);
onewire_write1(0xBE);
temp11 = onewire_read1();
temp21 = onewire_read1();
temp31 = make16(temp21, temp11);
result1 = (float) temp31 / 16.0;

delay_ms(200);
return(result1);
}

fm

Bu konuda yardım edecek yok mudur?

striger

#6
http://rapidshare.com/files/3802786036/New%20Folder%20(3).zip
sorun gorunmuyo bahsettigin sekilde isis 7.10, ccs 4.140

linkin duzelmis olması lazim

fm

#7
Hocam teşekkür ederim. Ancak rapidshare "Bu dosya için indirme geçerli kılınmadı. Sadece dosyayı yükleyen kullanıcı indirmeyi geçerli kılabilir. " diye bir uyarı verdi. Dosyayı indiremiyorum. Bir bakabilir misiniz.

Saygılarımla..

mesaj birleştirme:: 18 Mayıs 2013, 17:05:54

@stiger,

Hocam çok teşekkür ederim. Peki sorun tam olarak nedir. Tasarım aynı, program aynı. Acaba siz programı yazmadan önce açtığınız project dosyası ile ilgili ayarlama yaptınız mı?
Sizin gönderdiğiniz hex dosyalarını kendi tasarımımda denediğimde yine 2. dallas yok gibi görüyor. Bunun nedeni ne olabilir? Sizce ben nerde hata yapıyor olabilirim.

isis 7.10, ccs 4.140 kullanırsam sorun düzelebilir mi?

Saygılarımla..

striger

proje dosyası uzerinde yaptıgım bi duzenleme yok, isis te bazen projeyi sıfırdan olusturmak sorunu cozebiliyo, basıma geldigi oldu calısması gereken kod hatalı calısıyo senin projede oldugu gibi, prgramalrın versiyon farkları da etken olabilir.

fm

Hocam denedim ama olmuyor bir türlü. Yapmak istediğim similasyon aşşağıda müsait olduğunuz bir zaman bakabilir misiniz acaba?

http://rapidshare.com/files/3571967395/KODLAR%20ve%20TASARIM.rar


Kabil ATICI

Anlayabildiğim kadarı ile;
problemin ds18b20 ile ilgili okuma ve değerlendirme ile ilgili yoksa işlemciler veriyi düzgün biçimde gönderiyor ve alıyor...
sabit olarak sıcaklık değerini seri porta gönderen (slave üzerinde) bölümden önce alt ve üst sıcaklık değerini düzgün bir şekilde gönderiyor...
aşağıdaki gibi...
         delay_ms(250);
sicaklik_ust=12.0;
ust,sicaklik=10.5;

         printf("a%f,%f,%f,%f,\n\r",sicaklik_ust,sicaklik_alt,voltaj_a,voltaj_b);

bu nedenle ds1820 bölümünü incele..
ambar7

fm

Hocam devrede tek slave olduğu zaman çalışır duruma striger hocamın yardımıyal getirebildim. Ordaki mantıkla ve herşeyi teker teker inceyerek slave sayısını arttırmaya çalıştım. O zaman hatalar başlıyo. ds18b20 yi sürekli inceliyorum. ama ne yapmam gerektiğini hiç bilmiyorum..

Kabil ATICI

sanırım 2 sensörün aynı dosya içinde işlem yaptırmaya çalıştığın için birbirlerine karışıyor... Her sensör için ayrı ayrı dosya oluştur. Böylece hatanı daha kolay görebilirsin.
ds18b20_1.c
ds18b20_2.c
gibi...
ambar7

striger

#13
board uzerinde daha saglıklı sonuclar elde edebilirsin, son ekledigin dosyada ds18b20 lerin bikac tanesi nin DQ u yanlıs baglı derledigin kod ta 16f877a tanımlı isis te 16f877, buhalde birinci sensorden sıcaklık okunuyo ama ikinciden yanlıs deger geliyo, sensorun pini ni degistirdigim de ikisinden de yanlıs degerler geliyo, tek slave le calısıtıgı dusunulurse simulasyonda bi problem var sanki, int_rda problem cıkarıyo olabilir okuma yapılırken
lcd ve button kısımalarını iptal edebilirsin istedigin sonucu alınca eklersin o kısımları

http://rapidshare.com/files/870713068/1.zip fikir verir bunlar sanırım