avatar_fatih88

USART ASENKRON HABERLEŞME SORUNU

Başlatan fatih88, 22 Aralık 2011, 16:48:56

fatih88

SLM EROL HOCAM BENİMBİR PROJEM VAR AMA BİR TÜRLÜ USART ASENKRON HABERLEŞMEYİ DÜZGÜN ÇALIŞTIRAMADIM SİZİN DERLERİDE İNCELEDİM ÇOK İŞİME YARADI PAYLAŞIMLARINIZ İÇİN TŞKLER BENİM SORUNUM ARAYÜZ YARDIMI İLE SERİ PORTTAN GELEN 0-255 ARASINDAKİ DESİMAL SAYIYI ALIP LEDLERDE BİNARY OLARAK GÖSTERMEK HYPER TERMİNALDEN SIKINTISIZ ÇALIŞIYOR HYPER TERMİNAL VERİLERİ TEKTEK YOLLUYOR AMA ARAYÜZ VERİLERİ PAKET HALİNDE "123" KARAKTERİNİ 30(START VE STOP BITLERI DAHİL) BIT YOLLUYOR BENİM İSTEDIGIM START BİTİ GELSİN GELEN 8 ILK DEĞİŞKENE KAYDOLSUN STOPBİTİNDEN SONRA TEKRAR START BİTİNİ GORDÜĞÜNDE 2. DEĞİŞKENE ATASIN 3. VERİDE AYNI ŞEKİLDE ALSIN BİRTÜRLÜ OLMUYOR BECEREMEDİM YARDIMLARINIZI BEKLIYORUM İYİ CALIŞMALAR
HSERIN 30,CIK,[(WAIT("X")VERI,VERI2,VERI3] BU KOMUTU DÜZGUN ÇALIŞTIRAMADIM (USART KESME AYARLARI YAPILI)
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

ete

Öncelikle mesajlarını büyük harf ile yazma lütfen. Başka anlama geliyor.

Basic de asenkron haberleşmede start stop bitlerini ben kontrol etmiyorum. Onu derleyici derleme esnasında oluştırduğu kod ile zaten kontrol ediyor. Bu kadar detaya inmene gerek yok bence.

Buraya her hangi bir koda da koymamışsın. Sanal ortamdan soru soruyprsun cevabında sanal olacak elbette.

USART üserinden haberleşmenin temel kuralları var. BUnlara uyarsan hiç bir sorun olmadan haberleşirsin.
Herhangi bir şema ve detay vermediğin için nasıl bir bağlantın var bilemiyorum. Ama Anladığım kadarı ile PC Seri port dan bir Pic kartına bilgi yolluyorsun ve kartın bu bilgiyi alıp Ledler üzerinde göstermesini istiyorsun.

Kural-1 (Şema versen belkide boşuna bu kuralı açıklamak zorunda olmayacaktım)
PC, RS232 formatında bilgi yollar. Yani HIGH=-10V ve LOW=+10 volt seviyesindedir.
Pic Kart ise TTL seviyesinde çalışır. Yani HIGH =+5V  ve LOW=0 (GND)  seviyesindedir.
O halde iki sistemin bir biri ile anlaşabilemsi için seviyelerin arada anlayacakları şekle çevrilmesi gerekir ki bunuda Max232 entegresi yapar. Bu devreyi araya koyman gerekiyor.

Kural-2 :
Her gönderilen bilgi bir paket halinde yollanmalıdır. Ancak paket verilmeden önce bir uyandırma sinyali yollanmalıdır. Buna Preambl deniliyor. Bu veri 5 byte $AA bilgisi, 5 byte $00 bilgisi ve 5 Byte $FF bilgisi şeklindedir.
Daha sonra paket başına bir işaretçi eklenerek USART 'ın paket başını bulması kolaylaştırılır. Böylece asenkron bilgi demetinde senkron yakalanmış olur. Bu bilgi genelde 3 karekterden oluşan bir harf dizisi şeklinde olabilir. ("ETE" gibi.
İşaretçinin arkasından  asıl veri yollanmalıdır.
Pic Kart uyandırma sinyali ile uyanıp gelen verideki işaretçiyi aramalı bulduktan sonrada peşinden kay byte lık bilgi geliyor ise onu almalıdır.

Kural-3:
Haberleşme hızı pic kartın çalışma frekansına göre belirlenmelidir. 4 Mhz deki hızlarda 9600 baud kullanılması hata oranını artıracaktır. Ama 4800 veya 2400 baud larında uygun çalıştığını görebilirsiniz. Üstelik hiç de yavaş değillerdir.

Şimdilik bu kadar. Daha fazla detaya girmeye gerek yok. Bunları yerine getirin sistem doğru çalışır.

Ete

fatih88

ilginiz için teşekkürler hocam ben size devre şeması ve programın basıc ve proton basıc kotlarını yolluyorum bir bakarmısınız
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

ete

Önce sen bak bakalım dediklerim yapılmışmı.

Ete

fatih88

hocam zaten dosyayı ekleyemiyorum hata var diyor 9600 baud da yolluyom ben, ve ınternal osc kullanıyorum simuledede çalışmıyor alıyor ama istediğim şekilde değil sapıtıyor neyse hocam sağol ben birazdaha kafa yorayım ilginiz için teşekkürler
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

fatih88

erol hocam bilgisayarın gonderme voltajlarını biliyorum arada max232 var ben bi uyandırma sinyalini yollayamadın arayüzeyi bir mühendis arkadaşım yazdığı için onu şu an deneyemem zaten muhtemelen benim baud hızında bir sorun var birde hocam şöyle bir tezatlık var ara yüzeyden bilğileri tek tek yollarsam sorunsuz alıyorum ledlerede yoluyorum neyse akşam akşam kafanızı şişirdim kusura bakmayın a.e.o
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

ete

Dosyalarına baktım.
Benim standartlarımın dışında bir programlama mantığı gözlemledim.
Bu şekilde doğru çalışma elde edebilirmisin şüpheliyim doğrusu.
Ben olsam farklı yapardırm.
Haberleşme esnasında alınan verilen byte sayısı değişmemeli. Bir karekter dizisini hiç bir zaman senin yaptığın gibi yollamam ben. Bunların hepsi hem programı geciktirir hemde haberleşme güvenliğini zora sokar.
Sayılarla çalışmaya alıştım. Bana daha kolay bir mantık olarak geliyor.
Programın en başına bakalım;
HSEROUT ["      KLAVYEDEN LUTFEN SAYI GiRiNiZ!!!    ",13,10]
şeklinde bir komut satırı yerine
HSEROUT [100,13,10]
yollarım. PC bu veriyi aldığında gelen 100 ise ekrana   "   KLAVYEDEN LUTFEN SAYI GiRiNiZ!!!    " ifadesini kolaylıkla yazabilir. Yazılacak bilgiyi neden seri yoldan yollayayımki?
Bir sürü harf yerine yalnızca 100 sayısını yollamakla aynı işi yapabiliyorsam neden işi zora sokayımki?

Örnekler çoğaltılabilir. Ama sorun buradan kaynaklanıyor. İşi kısaltmak lazım gelir.
ALma formatı ise şöyle olmalı
HESERIN 10,ATLA, [WAIT("ETE"),VERI0,VERI1,VERI2]
bu satırda 10 değeri veri için 10 ms bekleyip istenen gelmiyor ise ATLA isimli etikete gidilmesini sağlayan parametredir. Yoksa orada 65,5 ms lik bir beklemeden sonra program kesmeden çıkar.

SOnuç olarak kolay bir projeyi zor hale sokmuşsunuz. Bence sadeleştirip kısa yoldan halledin derim.

Ete

fatih88

hocam osadece deneysel birçalışma daha bir sürü komut yazılacak veri alma problemini bir çözsem bilgisayar girilen "111" verisini ascii olarak yolluyor bende tek değişken içine veye üç değişken içine "494949" diye almam gerekiyor bir türlü alamadım sorunum bu sizden ricam bana örnek bir satıryollyabilirmisiniz
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

ete

#8
İşin pic kısmı zor değil onu hallederiz. Asıl önemli olan PC tarafının halledilmesi gerekiyor.
PC tarafından veri aşağıdaki formatta yada sırada (soldan sağa doğru yani $AA ilk yollanacak bilgi)) yollanması gerekir.
$AA,$AA,$AA,$AA,$AA,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,"F","A","T",VERI1,VERI2,VERI3
Dikkat edersen Veri değişkenlerine kadar olanlar sabit bilgidir değişmiyor. Yalnızca VER1 - VER2 - VER3 sanırım klavyeden girilen bilgiye göre değişecektir.

Bu bilgi Pic karta ulaştığı zaman paketin başında yer alan $AA,$00 ve $FF bilgileri USART'ı uyandıracak ve programın kesme kısmına atlamasını sağlayacak.  BU arada veri akışı devam edecek ve Pic kart veri almaya hazır olduğu zaman muhtemelen baştaki sayı verilerinin sonuna doğru gelinmiş olacak ve kesme içine yerleştirdiğin ;

HSERIN 10,ATLA,[("FAT"),VERI1,VERI2,VERI3] komutu gelen paket içinde yer alan ("FAT") şeklinde belirlediğimiz işretçi ye erişmiş olacaktır.
Böylece ardından gelen Veri-1, Veri-2,Veri-3 değişkenlerinide alıp kesmeden çıkacaktır.

Bu dediklerimi yap işin ne kadar kolay hallolduğuna şaşıracaksın.
Takıldığın yerde yeniden sorarsın. Pic programı ile ilgili örnekler bu sitede yer alan aşağıdaki programlarda mevcut,

http://etepic.com/index.php?topic=74.0
http://etepic.com/index.php?topic=62.0
http://etepic.com/index.php?topic=57.0

Örnekleri iyi incele ve takıldığın yer olursa yeniden sor. Ama en önemlisi PC den gelen veri paketini yukarıda açıkladığım formatta yollanmasını sağla.
Ayrıca Baud rate ayarlamasınıda 9600 baud 8 N 1 (8bit - no parity-1 stop biti) şeklinde ayarla. Bu zaten standart formattır.

Ete

fatih88

eyvallah hocam ilginiz için teşekkürler kusura bakmayın ben biraz mesajlaşma özürlüsüyüm birçok şeyi size dogru aktaramamış olabilirim dediklerinizi uyulayayım bi iyi çalışmalar hayırlı cumalar
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

Powered by EzPortal