Ds18b20 + RF modül (kayıp veri )

Başlatan ehliseyf, 23 Şubat 2012, 11:47:26

ehliseyf

Rf ile bir noktadaki sıcaklık verisini başka bir noktaya iletmek istiyorum.Bunu yaparken sıcaklık sensör'ü olarak ds18b20 kullandım.
alıcı pic16f877 ve verici olarak pic16F628 kullandım.udea nın alıcı verici modüllerini piclere bağladım.Şemada modüller yok fakat devrede bulunmakta.
kodları paylaşıyorum. çalışmıyor tam olarak stabil.
bazen abuk subuk rakamlar geliyor.

bir yerde bug yaşıyor olabilirmiyim ?


Alıcı kod :

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#USE rs232(baud=2400, xmit=PIN_C6,rcv=PIN_C7,parity=N, stop=1,bits=8)
//#include "ds18b20.c"
#include <benim_LCD.c> // benim_LCD.c dosyası programa ekleniyor

/********* ANA PROGRAM FONKSİYONU********/
 
void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
    

   float temp2; 
	
	int veri[4];
   lcd_hazirla(); // LCD başlangıç ayarları yaptırılıyor

   while(TRUE) // Sonsuz döngü
   {
		if(getc()=='X')
{ 

veri[3]=getc();
veri[2]=getc();
veri[1]=getc();
veri[0]=getc();
temp2=make32(veri[3],veri[2],veri[1],veri[0]);
temp2=temp2/100;
imlec(1,1);   
printf(lcd_veri,"sck:%3.1f",temp2);
}

	 

      
      
      
      
   }
}





verici kod

#include <16f628.h>     // Kullanılacak mikroişlemci seçiliyor
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOMCLR // sigorta ayarları
#use delay (clock=4000000) //  osilatör frekansı.
#USE rs232(baud=2400, xmit=PIN_B2,rcv=PIN_B1,parity=N, stop=1,bits=8)
#include <ds18b20.c>  //18b20 sıcaklık sensoru
#include <stdlib.h>
#use fast_io(a)
#use fast_io(b)



float temp;
int32 temp2;
int sicaklik[4];
void main()
{

   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);
   set_tris_a(0b00100000);
   set_tris_b(0x00); 



for(;;)
{




putc(0xAA); //uyandırma
putc(0xAA); //uyandırma
putc(0xAA); //uyandırma
putc(0xAA); //uyandırma
putc(0xAA); //uyandırma

putc(0x00); //
putc(0x00); //
putc(0x00); //
putc(0x00); //
putc(0x00); //

putc(0xFF); //
putc(0xFF); //
putc(0xFF); //
putc(0xFF); //
putc(0xFF); //




putc('X');
putc(sicaklik[3]);//göndermek istediğiniz
putc(sicaklik[2]);//göndermek istediğiniz
putc(sicaklik[1]);//göndermek istediğiniz
putc(sicaklik[0]);//göndermek istediğiniz

temp=ds1820_read(); 
temp = 100*temp;
temp2=temp;

sicaklik[0]=make8(temp2,0);
sicaklik[1]=make8(temp2,1);
sicaklik[2]=make8(temp2,2);
sicaklik[3]=make8(temp2,3); 
}
}








Code'm mu oturturum !

pea

Mobil girdiğim için kodun devamını göremedim ama gözüme takılanlar :
HS kristal olarak fuse belirtmişsiniz ama 4mhz demişsiniz. HS 8mhz ve üzerinde kullanılır. Doğrusu XT olacak.
2400 baud da rf modüller için uç bir hız. Düşürmeyi deneyin. Çalışırsa daha yüksek hızları denersiniz

ehliseyf

#2
Xt olarak değiştirdim.Ben denemelerimi bazen  20 mhzde yapıyorum. o yüzden hs de kalmış sigorta ayarı.
1200 baud rate olarak düşürdüm.
sorun hala aynı.

alıcı modulü resetlediğimde ilk 10 15 veri normal şekilde geliyor.( besleme keserek )
daha sonrasında alıcı modul kendinden geçiyor.başka başka rakamlar gösterip takılıyor o rakamlarda.sanırım veri alamıyor.




işaretli yerlerin eşit aralıklarda olması gerekirken niçin bu şekilde araya bir tane daha eklemiş bir puls çıkıyor.

bu işaretli kısımların pdf dökümandaki gibi olmasını beklerken bu şekilde çıkması sanırım senkron kaybına ugratıyor devremi.

http://www.udea.com.tr/dokumanlar/ATX-34S%20KILAVUZ.PDF

bu puls lar stop biti yada parity olabilir mi ? nasıl kapatırım.
Code'm mu oturturum !

ehliseyf

udea'nın modülleri ile bu tarz bir sorun yaşayan oldu mu daha önce ?
Code'm mu oturturum !

aslan_korhan

Eşit aralıklı olmaması lazım zaten. Yoksa nasıl veriye dönüşecek.
Asenkron bir iletişim olduğundan bu aralıklar farklı genişlikte olması gerekiyor...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

ehliseyf

Alıntı yapılan: aslan_korhan - 25 Şubat 2012, 09:55:41
Eşit aralıklı olmaması lazım zaten. Yoksa nasıl veriye dönüşecek.
Asenkron bir iletişim olduğundan bu aralıklar farklı genişlikte olması gerekiyor...
göndermiş olduklarım uyandırma verisi olarak adlandırılıyor.

Datasheet'i incelerseniz.belki de ben yanılıyorumdur..
Code'm mu oturturum !

aslan_korhan

Evet, Preample eşit aralıklı olur genelde.
Ben tüm gönderdiklerin eşit aralıklı olmaması lazım demek istedim...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.