Haberler:

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

Ana Menü

seri iletişim-udea atx+arx

Başlatan promete1, 24 Şubat 2008, 07:53:57

promete1

arkadaşlar öncelikle herkese kocaman bir merhaba siteyi yeni fark ettim bende pic için yeni sayılırım.soruma geçersem:
iki pici 2400 baud ile haberleştirebiliyorum yeni getirttigim modüllerle bunu yapmak istediğimde preamble için 1-2 kod ilave etmem gerektiğininde farkındayım
soru1}ana programdan önce
putc(0x55);
putc(0x00);
putc(0xff);
direk ilave etmem doğru mu?cunku normalde proteuste calısan devre bu kodları ilave edince calısmaz oldu
soru2}CCS de az bilgiliyim putc funksiyonunu yukardaki sekildeki gibi yazmam dogru mu?
soru3}bu kodu sadece verici pice ilave ettim,alıcı picte getc() kullanarak bunu algılatmalımıyım?cunku mantıken bu sinyal sadece modulu uyandırmak  içinpic2 herhangi bir işlem yapmasada olur değil mi?

ferdem

Merhaba, hoş geldiniz. Verici modülde gönderim sırası uyandırma işareti + öncü veri + veri olmalıdır. Yani:
verici.c
putc(0b01010101); //uyandırma
putc('x'); //öncü veri
putc(veri);//göndermek istediğiniz

Alıcı tarafta ise öncü veriyi kontrol ediyoruz(arkasından asıl gönderdiğimiz veri geliyor çünkü) eğer gelmişse asıl gönderdiğimizi alıyoruz.

alici.c
if(getc()=='x'){ //öncü veriyi aldıysan
  gelen_veri=getc(); //gönderdiğim veriyi al
}

Proteusta da çalışması lazım ancak proteusta sadece kablolu iletişimi simüle edebiliyoruz, dolayısıyla öncü veriye ve uyandırma işaretine de gerek yok.

Daha doğrusu Proteus, rf modül uygulaması için yeterli bir simülasyon ortamı sağlamıyor. İyi çalışmalar.

promete1

sayın ferdem'e yazdığı kod için teşekkür ederim haftasonu  denedim anca şimdi yanıtlayabildim.şimdi dediklerinizi bir kod haline getirdim aşagıya ilave edeceğim ancak önce amacımı aktarıyım:
ben verici picten "A"stringi gönderip 500ms bekleyip "B"string göndermek istiyorum buna göre alıcıda bunu algılayıp a gelince D_0 pinini high,b gelince low yapmalı
şimdi bu koda uyandırma kodlarınıda ilave ettim ancak rf module girmeden evvel kablo ile denediğimde D_0 pinine baglı ledin enerji verince direk yandığını gördüm ve A stringi gelince daha parlak yandığını 500ms sonra daha sönük biçimdede olsa gene yandığını gördüm(durum kötü yani:))sizce ne yapmalıyım kodlardamı bir hatam var yada preambleda mı?? yardımcı olursanız sevinirim.


verici pic kod:
void main()
{
ilk_ayar();
while(true)
{

putc(0b01010101); //uyandırma
putc('x'); //öncü veri
putc('A');//göndermek istediğiniz
delay_ms(500);



putc(0b01010101); //uyandırma
putc('x'); //öncü veri
putc('B');//göndermek istediğiniz
delay_ms(500);
}
}


alıcı kod:
#include "C:\Documents and Settings\bilgisayarım\Desktop\Ana harmonik(B)\Bb.h"
#define LED_ON output_high(PIN_D0);
#define LED_OFF output_low(PIN_D0);

void ilk_ayar(void)
{

  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_psp(PSP_DISABLED);
  setup_spi(FALSE);
  setup_wdt(WDT_OFF);
  setup_timer_0(RTCC_INTERNAL);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_oscillator(False);

  // TODO: USER CODE!!

}
void main()
{
ilk_ayar();


while(1){

int gelen;tekrar:
while(getc()=='x') //öncü veriyi aldıysan
{gelen=getc(); //gönderdiğim veriyi al


switch (gelen)
{
case 'A': LED_ON;goto tekrar;
case 'B': LED_OFF;goto tekrar;
}
}}}

kadirbas

Selamlar,

Promete1 arkadaşım, yazmış olduğun koda ilişkin bir kaç gözlem ve önerimden bahsetmek istiyorum. Öncelikle kodunuzu CCS'de yazmış olduğunuzdan bahsetmiştiniz fakat ben seri haberleşme için herhangi bir ayar göremedim. Bildiğim kadarıyla

#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8  )

tarzı bir kodla öncelikle bunu sağlamanız gerekiyor. Bu işlemden sonra printf, putc gibi fonksiyonların çıktıları doğrudan ayarlamış olduğunuz seri port çıkışı; scanf, getc, gets gibi fonksiyonların girişi de yine ayarlamış olduğunuz seri port girişi olacaktır. Bildiğiniz ve belki de kodunuzda kullandığınız birşey olabilir. Fakat ben göremediğim için söyleme ihtiyacı duydum.

Bunun dışında alıcı kodunuzda C dili ile ilgili de bir hatırlatma yapmak istiyorum. switch..case yapısını kullandığınızda her bir durumun devamındaki işlemleri uyguladığını farketmiş ve bu olaydan kurtulmak için goto deyimini kullanmışsınız. Genel kullanımda bunun yerine, bir sonraki durumun işlemleri işletilmek istenmiyorsa, break anahtar kelimesi kullanılır. "break", switch...case kullanımında herhangi bir durumda switch bloğundan çıkmak, döngülerde ise döngüyü kırarak çıkmak için kullanılır. Söylediklerim sadece ufak hatırlatmalardan ibaret şeyler. Umarım ukalalık olarak algılamazsınız...

while(1)
{
int gelen;

if(getc()=='x') //öncü veriyi aldıysan
{
gelen=getc(); //gönderdiğim veriyi al
switch (gelen)
{
case 'A': LED_ON;break;
case 'B': LED_OFF;break;
}
}
}
}


3. sorunuzda o verilerin algılatılması gerekip gerekmediğini sormuşsunuz. Verici taraftan gönderdiğiniz her bilgi, doğru ya da yanlış, alıcı tarafa ulaşacaktır. (Mesafe vb. şartların uygunluğu şartıyla tabi...) Dolayısıyla siz getc fonksiyonunu kullandığınızda, yanlış aktarılmış da olsa, o veriyle de karşılaşacaksınız mecburen.

Son olarak önerim, preamble olarak daha uzun veriler kullanmanız. 4-5 byte olabilir belki...

İyi çalışmalar

ferdem

Tekrar merhaba, Kadir hocam Promete sadece programın ana bölümünü vermiş, rs232 bildirimlerine gerek duymamış.

Her şeyden önce şunu söyleyeyim: Vermiş olduğum kod bir prototiptir, olduğu gibi kullanıldığında RF modüller çalışmayabilir, Kadir'in de dediği gibi bazen arka arkaya bir kaç sefer uyandırma gönderiyorum, sonra öncü veri + asıl veri yapıyorum. UDEA nın modülleri kullanan bir arkadaş hiç uyandırma göndermediğini söylüyor, bu mümkün ama her modül böyledir diyemiyoruz. Ben de şu sıra elimdeki 2 çift keymark ve bir çift UDEA modülü test etmek ve en uygun yazılımı bulmak üzere edindim, güzel sonuçlar elde edebilirsem yazacağım.

Promete hocam; öncelikle uyandırma işareti-öncü veriyi bir kenara bırakıp sisteminizi kablolu ve sadece putc, getc komutları ile çalıştırın derim. Bu iki komut kablolu iletişimin düzgün gerçekleşmesi için yeterli. Adım adım ilerlemek gerekiyor, hatta ve hatta d0 pinine bağlı bir led için yanıp-sönen led uygulaması yaparak bile başlayabilirsiniz. Biraz yavaş ama emin adımlar... Kolay gelsin, iyi çalışmalar.

promete1

iki arkadaşada ilgilendikleri için teşekkür ederim.
öncelikle ferdem hocamın tahmin ettiği gibi kodun ana parcasını koymustum.ikincisi dediğinize katılıyorum ancak kablo ile daha önce yakıp söndürmeyi becerebilmiştim.buradaki problemim ise daha başka:

Alıntı Yapşimdi bu koda uyandırma kodlarınıda ilave ettim ancak rf module girmeden evvel kablo ile denediğimde D_0 pinine baglı ledin enerji verince direk yandığını gördüm ve A stringi gelince daha parlak yandığını 500ms sonra daha sönük biçimdede olsa gene yandığını gördüm
Alıntı Yap

yani bunun sebebini merak etmiştim.Ancak kodlarda genel olarak bir sorun veya mantık hatası yok değil mi?

şunları bi aşsam bende udea kullanan arkadaşlara fayda sağlamak isterim.herkese ii çalışmalar

promete1

iki arkadaşada ilgilendikleri için teşekkür ederim.
öncelikle ferdem hocamın tahmin ettiği gibi kodun ana parcasını koymustum.ikincisi dediğinize katılıyorum ancak kablo ile daha önce yakıp söndürmeyi becerebilmiştim.buradaki problemim ise daha başka:

Alıntı Yapşimdi bu koda uyandırma kodlarınıda ilave ettim ancak rf module girmeden evvel kablo ile denediğimde D_0 pinine baglı ledin enerji verince direk yandığını gördüm ve A stringi gelince daha parlak yandığını 500ms sonra daha sönük biçimdede olsa gene yandığını gördüm
Alıntı Yap

yani bunun sebebini merak etmiştim.Ancak kodlarda genel olarak bir sorun veya mantık hatası yok değil mi?

şunları bi aşsam bende udea kullanan arkadaşlara fayda sağlamak isterim.herkese ii çalışmalar

promete1

iki arkadaşada ilgilendikleri için teşekkür ederim.
öncelikle ferdem hocamın tahmin ettiği gibi kodun ana parcasını koymustum.ikincisi dediğinize katılıyorum ancak kablo ile daha önce yakıp söndürmeyi becerebilmiştim.buradaki problemim ise daha başka:

Alıntı Yapşimdi bu koda uyandırma kodlarınıda ilave ettim ancak rf module girmeden evvel kablo ile denediğimde D_0 pinine baglı ledin enerji verince direk yandığını gördüm ve A stringi gelince daha parlak yandığını 500ms sonra daha sönük biçimdede olsa gene yandığını gördüm
Alıntı Yap

yani bunun sebebini merak etmiştim.Ancak kodlarda genel olarak bir sorun veya mantık hatası yok değil mi?

şunları bi aşsam bende udea kullanan arkadaşlara fayda sağlamak isterim.herkese ii çalışmalar

ferdem

Kodunuzu "compile" ettiğinizde "int gelen;" in olduğu satırda bir hata almanız gerekir çünkü C'de değişkenleri "main" in hemen altına tanımlamalıyız.

tekrar etiketi kullanmanıza da gerek yok, zaten "while(1)" içine yazmışsınız, üstelik "gelen" değişkeni "A" veya "B" değilse "goto tekrar" çalışmayacağından bir anlamı da yok. "Tekrar" etiketini kaldırıp "goto tekrar;" yerlerine Kadir hocamın da dediği gibi "break;" kullanın, "switch-case" hep o yapıda kullanılır. "Switch" yerine "if" sorgusu da kullanabilirsiniz.

RF modüllü iletişimdeki kodları kablolu iletişimde ben hiç denemedim, bir karışıklığa yol açar mı bilemiyorum. Kolay gelsin.

promete1

evet arkadaslar programda bir hata olmadan compile etmyi basardım alıcı ve verici moduller düzgün bir şekilde bagladım. ve sonunda 1m. uzaktaki led pırıl pırıl parlıyordu.
donanım uyandırmasıyla ilgili olarak sanrım ilk bastığıda tam randımanlı olmadı ancak sonra güzel bir biçimde veriyi alıyor.Bu noktadada bu modüllerden kullanan arkadaşlara sorularım olucak;
ben her iki modülede +5v girdim ölçtüğüm max. mesafe 3-5 m. falandı daha  yüksek gerilim giripte mesafe ölcümü deneyenler var mı?
birde benim piller epey zayıfladı +3v falan girince modüllerde picte kafayı yemeye başladı bu normal bir sonuçmudur basta ferdem beyden olmak üzere udea modül kullananlardan cvp rica ediyorum.

ferdem

Besleme gerilimi düştükçe PIC in veya modüllerin çalışmaması normal, malum pili biten cihazlar çalışmıyor. Daha yüksek besleme gerilimi vererek bu modüllerin çıkış gücünü arttırabileceğimizi zannetmiyorum, katalogda ne verilmişse o değeri kullanmak gerekir derim. İyi çalışmalar.

promete1

evet ferdem beyin dediği dogru ancak datasheetinde transmitter için  nominal +5v max. 12 v yazıyordu bu anlamada 12 v giren varmid iye sormustum.yeni bir pil alarak  mesafeyi azami ölçüde arttırdım 10-20 m.lik bir ölçümde bulundum.
ferdem beye'e tüm cevapları için çok teşekkür ederim.

promete1

evet ferdem beyin dediği dogru ancak datasheetinde transmitter için  nominal +5v max. 12 v yazıyordu bu anlamda 12 v giren varmi diye sormustum.
Yeni bir pil 9'luk pilalarak  mesafeyi azami ölçüde arttırdım 10-20 m.lik bir ölçümde bulundum.
ferdem beye'e tüm cevapları için çok teşekkür ederim.