ds18b20

Başlatan fm, 14 Mayıs 2013, 23:24:15

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..

est32

Benim tahminim, sıcaklıkları doğrudan derece cinsinden göndermeye çalışıyorsun.
Bence diğer pic'e sensörden okuduğun ham değeri yolla ve oradaki pic ile yeniden hesaplayarak derece cinsine çavir.

fm

Cevabınız için teşekkür ederim hocam. Deneyip sonucu bildireceğim.

fm

est32 hocam sormak istediğim bir şey var. ds18b20 okumayı direk kendi kütüphanesinde yapıp çevirmiyor mu. Sizin bahsettiğiniz durumda bunu nasıl yapmam gerekiyor?

est32

#4
Alıntı yapılan: fm - 15 Mayıs 2013, 00:19:10
ds18b20 okumayı direk kendi kütüphanesinde yapıp çevirmiyor mu.
burayı tam anlamadım.
DS18B20 ye komut yollanır ve sensör de sıcaklığı okuyarak atıyorum 234 gibi bir rakamı pic e geri yollar. Bu ham değerdir ve sen bunu işleyerek sıcaklığı öğrenirsin.
234 değeri>>>  234/16=14,6 derece falan yapar(küsüratını hesaplamak için de basit bir kod yazman gerekecek).
İşte burada diğer pice(alıcı pice) çıkan sonuç değil de, ham değer olan 234'ü göndereceksin ve hesaplamayı oradaki alıcı durumundaki pic ile yapacaksın.

ete

#5
Doğru hesaplanmış bir sıcaklık bilgisi yolda değişiyorsa alışveriş işlemlerinde sorun vardır. Sıcaklık okumaya odaklanmayın. Seri haberleşme işine odaklanın.
Sorun orada çünki.
Ete

fm

Hocam okumaların yapıldığı PIC ler üzerinde de LCD le var ve okunan değerleri direk göstermesi için kullandım. Oradaki göstergede de hatalı okuma var ve o değerleri gönderiyor.

ete

Peki bu cümlen ne anlama geliyor o zaman ?
Alıntı YapTek bir pic üzerine 2 adet ds18b20 kullanarak sıcaklıkları okutmaya çalıştığım zaman sonuçlar doğru çıkıyor.

ete

fm

Hocam anlatmaya çalıştığım olay şu. Tek bir pik ve üzerine bağlı 2 adet ds18b20 varken bunları yine o pice bağlı lcd de okuttuğumda doğru okuyor.

Bu pice başka bir pici rs232 kesmesi ile bağlayıp bu okumaları göndermeye çalıştığım denemede hem okumaların yapıldığı hem de gönderildiği piclerde lcdler de hatalı okumalar yapıyor. Bunun nedeninin ne olabileceğini soruyorum.

est32

hocam elimizde şema ve program olmayınca tahmin konusunda bundan daha öteye gidebileceğimizi sanmıyorum.

fm

Hocam kusura bakmayın çok kafayı taktıtm sürekli uğraşıyorum aklıma gelmedi. Haklısınız tekrar kusuruma bakmayın hemen tasarımı ve kodları ekliyorum.

Sağdaki PIC için kod:
// BU PROGRAMDA KESMEYE GEREK YOKTUR. LM35


#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;
      //}
     
   
   }   
}

 


Solcadki PIC için kod:
// REFERANS DALLAS PROGRAMI


#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);
     
  }


}

fm

Bu konuda yardım edecek kimse yok mudur acaba?

haberlesme

Fm ,

Forum Pic Basic tabanlı bir forum oldugu için yazdıgın kod hakkında bilgi sahibi olan olsaydı şimdiye kadar çoktan olurdu sana ancak mantık olarak yardım edebilirler kodlara çevirmek sana kalıyor gibi görünüyor.

F®T

arkadaşın dediği gibi basic tabanlı ama c bilen arkadaşlarda var görürlerse el atarlar.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Powered by EzPortal