udea alıcı verici yardım

Başlatan akasya, 22 Nisan 2008, 18:25:40

akasya

Arkadaşlar merhaba, udea atx-34 ve arx-34 modüllerini çalıştırmaya çalışıyorum. Udeanın sitesinden uygulama notlarını inceledim. Atx-34 Arx-34 ile veri iletimi ve alımı örneğini inceledim ve kodu ccs ile yazıp çalıştırmaya çalıştım, ancak henüz proteusta kabloyla bağladığımda bile düzgün çalıştıramadım. Öncelikle 0x55 preamble, sonra 0x00 ve 0xff senkron veri gönderip ardından asıl veriyi göndermeye çalıştım.
yazdığım kod şu şekilde

*******************verici kodu***********************
#include <16F877A.H>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT, NODEBUG, NOCPD
#use delay(clock=4000000)
#use rs232(baud=2400, xmit=PIN_B7)

void main()
{

while(1)
{
putc(0x55);
putc(0x55);
putc(0x55);
putc(0x55);
putc(0x55);

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

putc(0xff);
putc(0xff);
putc(0xff);
putc(0xff);
putc(0xff);

putc(0x33);
}
}

*********************alıcı kodu**********************
#include <16F877A.H>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT, NODEBUG, NOCPD
#use delay(clock=4000000)
#use rs232(baud=2400, rcv=PIN_B6)

int say1=0;
int say2=0;

void fivebyte0();
void fivebyte1();
void read();


void main()
{

while(1)
{fivebyte0();}
}

void fivebyte0()
{
while(1)
{
 if(getc()==0x00)
{say1++;
 if(say1>=5)
 {say1=0;}
 fivebyte1();}
}
}

void fivebyte1()
{
while(1)
{
 if(getc()==0xff)
{say2++;
 if(say2>=5)
 {say2=0;}
 read();}
}
}

void read()
{
if(getc()==0x33)
{output_high(pin_c1);
delay_ms(500);
output_low(pin_c1);}
}

kodlar bu şekilde bu haliyle alıcıda c1 ledi yanıyor ancak 0.5snde bir değil
if(getc()==0x33) komutunda 0x33 e değil de başka bir değere eşitlediğimde led yanmıyor bu haliyle çalışıyor sandım ancak

if(getc()==0x33)
{output_high(pin_c1);
delay_ms(500);
output_low(pin_c1);}

komutunun altına

else{output_high(pin_c2);
delay_ms(500);
output_low(pin_c2);}

eklediğimde bu sefer c1 değil c2 ledi yanıyor yani bu da kodun düzgün olmadığını gösteriyor. Özellikle udea alıcı vericileri çalıştırmış arkadaşlar yardımcı olursa çok sevinirim, acaba senkronizasyon için başka eklemeler mi yapmalıyım, bekleme komutları mı koymalıyım, lütfen arkadaşlar biraz uzun oldu ama gerçekten yardıma ihtiyacım var...

ferdem

RF modül iletişimi için yazdığınız kodların proteusta çalışmaması anormal bir durum değil(muhakkak çalıştırılır ama amacımıza uygun değil). Proteusta preamble ve senkron olmadan simülasyon yapınız. Preamble(uyandırma işareti) ve senkron RF iletişimine has işaretlerdir. RF modül kullanırken uyandırma işareti göndermek zorundayız çünkü alıcı modül uyuyor:) Önce uyandırıyoruz sonra zaman kaybetmeden verimizi gönderiyoruz.

Bu yazdığınız kodda read() fonksiyonu çalışana kadar epey bir değer istiyorsunuz, bu kadar kesin olmasın, önce daha düşük hassasiyetli bir iletişim olsun sonra arttırırsınız. En basitinden:
verici.c
putc(0x55);
putc(0x55);
putc('x');
putc(veri);

alici.c
if(getc()=='X'){
gelen_veri=getc();
}

gibi.

Bu ve benzeri konular forumda çokça konuşuldu.

https://www.picproje.org/index.php/topic,19537&highlight=

Verdiğim bağlantıya göz atmanızı tavsiye ederim. Modüllerle çalışmak zor olabiliyor, normaldir, sabırla devam. Kolay gelsin.

akasya

Ben udeadaki örnek kodu aynen çevirmek istediğim için o kadar çok preamble ve sencron gönderdim, modüllerin kullanım kılavuzunda 5'er byte olarak verilmişti çünkü. Bir de söylediğiniz gibi daha az preamble ve sencron göndererek deneyeceğim, yani yazdığım kodlarda bir hata yok galiba o zaman. Tam olarak senkronizasyon olayını anlayamadım acaba araya gecikmeler mi koymak gerekir diye düşünmüştüm, neyse teşekkürler, ben deneyip sonuçlarımı paylaşırım, inşş çalıştırabilirim...

kadirbas

Sayın "akasya".
Kodunuzla ilgili bir kaç gözlemim ve tavsiyemi belirtmek istiyorum.

Öncelikle verici kodunuzun sonuna da alıcı kodunda olduğu gibi 500ms'lik (hatta belki yanıp sönmeleri görebilmek için daha fazla) gecikme koyarsanız daha stabil bir çalışma gözlemleyebilirsiniz.

İkinci olarak alıcı kısım için yazdığınız kod biraz karmaşık olmuş ve ilk bakışta çok ufak bir hata durumunda kilitenebilecek gibi duruyor. Zaten kodunuz bir kere "fivebyte1" adlı fonksiyonu çağırdıktan sonra oradaki sonsuz döngüden çıkamadığından bir daha asla önceki kontrolü yapmıyor.

Sizin kodunuzdaki gibi fonksiyonlara bölünmüş ama daha doğru şalışacağını düşündüğüm ufak bir kod yazdım. Sizin kodunuzu biraz değiştirdim aslında.

int stage = 0;
int counter = 0;

void allZeroBytes();
void allOneBytes();
void read();


void main()
{
	while(1)
	{
		switch(stage)
		{
			case 0:
				allZeroBytes();
				break;
			case 1:
				allOneBytes();
				break;
			case 2:
				read();
				break;
		}
		if(counter >= 5)
		{
			++stage;
		}
	}
}

void allZeroBytes();
{
	if(getc()==0x00)
	{
		++counter;
	}
	else
	{
		counter = 0;
	}
}

void allOneBytes();
{
	if(getc()==0xff)
	{
		++counter;
	}
	else
	{
		counter = 0;
		stage = 0;
	}
}

void read()
{
	if(getc()==0x33)
	{
		output_high(pin_c1);
		delay_ms(500);
		output_low(pin_c1);
	}
	stage = 0;
}


Deneme fırsatım olmadı ama daha stabil çalışacağını düşünüyorum.

Kolay gelsin...

akasya

Arkadaşlar, dediklerinizi bir bir denedim ama tık yok, öncelikle sadece birer byte preamble ve sencron sinyalleri gönderdim, sonra da kadirbasın yazmış olduğu kodu denedim lakin olmadı bir türlü. Board üzerinde gerçekliyorum öncelikle acaba bundan kaynaklanan bir sorun olabilir mi? Bir türlü anlayamadım çalışmama nedenlerini. Donanımsal mı, yazılımsal mı senronizasyon sorunu mu var, işin içinden çıkamadım. Bu modülleri kullanan arkadaşlar yardımcı olabilirlerse çok mutlu olucam...