Rx-Tx Veri Alımı?

Başlatan bladekel, 13 Ocak 2015, 17:41:25

bladekel

Arkadaşlar, herkese merhabalar...

Geçen sefer rx-tx gönderimi diye bir başlık açmıştım. Sağolsun arkadaşlar yardımcı oldular, sorunu halletim.

Bu sefer gene aynı proje ancak farklı bir sorun, veri alımı, olduğu için yeni bir başlık açtım.

16f877a'lar ile Proteus'ta kurduğum rx-tx veri gönderimi-alımı devresi var. Vericiye bağladığım bir buton vasıtasıyla, butona basıp çektiğim zaman, alıcıya bir kod(string olarak), gönderiyorum.

Bu esnada, alıcıdaki butona bastığımda, kodu alıyor ve virtual terminal ile ekranı bastırıyorum.

Ancak bir tutarsızlık var. Şöyleki;

- Eğer ilk önce alıcıdaki butona basılı tutmazsam, vericiden gelen kodu , alıcı almıyor.
- İlk önce alıcıdaki butona basılı tuttum, daha sonra vericideki butona bas-çek yaparak kodu gönderdim. Kodu okudu sıkıntı yok. Daha sonra alıcıdaki butondan elimi çektim. Vericideki butona bir kez daha bas çek yapınca, bir kez daha alıcı kodu okuyor,daha sonraları okumuyor. Halbuki , alıcıdaki butona basılı değil okumaması lazım.

Verici kodu:

#define passbut PIN_C0

void password();

void main()
{

while(1)
{
   if(input(passbut)==1){delay_ms(10);if(input(passbut)==0){password();}}
}

}

void password()
{
   int i=0;
   char passkey[11]="0000000000";
   puts(passkey);
}


Alıcı Kodu:
void main()
{

char pass[11]="0000000000";

while(1)
{
    if(input(PIN_C0)==1)
   {
        gets(pass);
        puts(pass);
    }
}

}


devre şeması ve kodu :https://drive.google.com/file/d/0B9X_536BhHneakhzUk44QVlSd2s/view?usp=sharing

Ne yapmam lazım ki, her vericideki butona bas çek yaptığım zaman, eğerki alıcıdaki butona basılıysa, alıcı , vericinin gönderdiği kodu okusun....

Not: Devre henüz tasarım aşamasında ve isis ile tasarlıyorum, ve kesmeleri henüz eklemedim....

MrDarK

#1
Merhaba;

alıcı devrenin kod kısmında gets kullandığın için bu problem ortaya çıkıyor. Gets datası gönderilen verinin sonunda \r\n görene kadar bekler.

Yani while(1) gibi seri porttan \r \n datası arka arkaya gelene kadar hiçbir işlem yapmaz. Örneğin alıcı devreye bir led taksan ve başka bir butona bastığında yakabiliyor olsan seri portu aktif eden tuşa bastıktan sonra ledi yakan butona bassan bile çalışmaz.

Şimdi ben \r \n göndermiyorum o zaman benim kodu nasıl alıyor diyebilirsin :) vericide kullandığın puts fonksiyonu kendisi datanın sonuna \r \n ekler bu sayede gets komutun çalışıyor.

Eğer amacın sadece buton basılıyken veri alsın diğer durumlarda almasın ise , kesmeli devren için diyorum, butona basılı değilken interrupt ı kapatırsın, basılıyken aç komutu verirsin. Bu sayede istemediğin andaki dataları almamış olursun :)

Birde dipnot : Yazdıklarını anlamak için 2-3 kere okumam gerekti biraz daha sonuç odaklı ve kısa yazarsan daha çok yardım alabilirsin. Birde aşağıdaki linkte Z hocamızın bir konusu var onda da bol yardım almak için ip uçları var tavsiye ederim :) Hatalı mesajın olduğunu söylemiyorum en azından devre şemanıda buraya koysaydın indirme ihtiyacımız olmazdı :)
https://www.picproje.org/index.php/topic,57135.0.html
Picproje Eğitim Gönüllüleri ~ MrDarK