Hserin ile aldığım bilği sürekli karışık geliyor?

Başlatan forumsad, 17 Mart 2011, 08:12:08

forumsad

arkadaşlar seri portdan MerhabaM  şeklinde bir yazıyı pic'e gönderiyorum
gelen veriyi aşagıdaki kod ile alıp lcd'de gösteriyorum
HSerIn [Str SerGelen\8]
Print At 1,1, Str SerGelen\8
DelayMS 300
Cls


sorunum şu:MerhabaM  verisi

veriyi her gönderdiğimde ilk karakter kayıyor

lcd'de gözüken sonuçlar

MerhabaM
baMMerha
habaMMer

gibi sürekli kaymalar oluyor oysa benim istediğim ilk karakterin daima M ile başlaması  gönderdiğim şekilde gözükmesi
cünkü gelen veriyi analiz ediyorum
If SerGelen[0]=48 Then D_mk1=0  'bu mantığı kullanarak gelen veriye göre değişken atıyorum
bu sorunu nasıl düzeltebiliriz acaba

teşekkürler..

computerboy

0 dan saymaya başlarsanız sizin tanımlamanıza göre 9 adet byte tanımlamış oluyorsunuz mikroişlemcide doğal olarak kendisine belirtilen kadar byte arıyor ve bulamıyor bu sebebpten karakterlerde kayma meydana geliyor. 8 yerine 7 yazıp denerseniz sonuç düzgün olur tahminimce. başarılar.

alayli

Alıntı yapılan: forumsad - 17 Mart 2011, 08:12:08
arkadaşlar seri portdan MerhabaM  şeklinde bir yazıyı pic'e gönderiyorum
gelen veriyi aşagıdaki kod ile alıp lcd'de gösteriyorum
HSerIn [Str SerGelen\8]
Print At 1,1, Str SerGelen\8
DelayMS 300
Cls


sorunum şu:MerhabaM  verisi


veriyi her gönderdiğimde ilk karakter kayıyor

lcd'de gözüken sonuçlar

MerhabaM
baMMerha
habaMMer

gibi sürekli kaymalar oluyor oysa benim istediğim ilk karakterin daima M ile başlaması  gönderdiğim şekilde gözükmesi
cünkü gelen veriyi analiz ediyorum
If SerGelen[0]=48 Then D_mk1=0  'bu mantığı kullanarak gelen veriye göre değişken atıyorum
bu sorunu nasıl düzeltebiliriz acaba

teşekkürler..

Sorununuzun çözümü basit. Hserin komutu ile birlikte "Wait" modifier'ini kullanırsanız sorun kalmaz. Kodunuzu aşağıdaki şekilde değiştirip denerseniz sorunun ortadan kalktığını göreceksiniz...
HSerIn [Wait("##forumsad##"),Str SerGelen\8]
Print At 1,1, Str SerGelen\8
DelayMS 300
Cls


Burada asıl almak istediğiniz data olan "MerhabaM" ı göndermeden önce "##forumsad##" gibi bir başlangıç headeri belirlemiş oluyorsunuz. Pic StrGelen dizisine 8 baytı yerleştirmeden önce Wait modifierinden sonra parantez ve çift tırnak içinde yazılan karakteri (veya karakterleri) bekler. Onları aldıktan sonra arkadan gelen 8 baytı Gelen dizisine sırayla yerleştirir. PC'den veya Pic'e data gönderen sistemden asıl datayı göndermeden önce her defasında "##forumsad##" karakterlerini göndermeniz gerekli. Burada Wait modifierinden sonra parantez ve çift tırnak içinde yazılan karakter (veya karakterler) bir bakıma iletişim için parola görevi görürler yada senkronun tutmasını sağlarlar.

"##forumsad##" ı ben tamamen örnek olsun diye yazdım. Eğer asıl göndereceğiniz datada yer alma ihtimali yoksa "#" veya "*" veya "$" gibi tek baytlık veya "#*$" gibi üç baytlık bir şifreleme de oluşturabilirsiniz. Bu tamamen size kalmış...
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

forumsad

hocam teşekkürler tamamdır..

zaman ayırıp bilği paylaşıyorsunuzya  ne kadar dua ve teşekkür etsem az

saygılarımla...

alayli

Alıntı yapılan: forumsad - 17 Mart 2011, 11:19:52
hocam teşekkürler tamamdır..

zaman ayırıp bilği paylaşıyorsunuzya  ne kadar dua ve teşekkür etsem az

saygılarımla...

Yardımcı olabildiysem ne mutlu bana...
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

ete

Haberleşmede en önemli faktörlerden birisi senkron çalışmadır. Kısaca izah etmek gerekirse ortada bir verici birde alıcı olduğunu düşünün ve bunların arasında gidip gelen birde veri paketi olduğunu varsayın. Verici bilgisni yollamadan önce alıcıyı bir şekilde haberdar edip onu veriyi bekler halde tutabilsek işimiz epeyce kolaylaşırdı. Ancak herkesin bildiği gibi veri zaman paylaşımlı olarak yollanmaktadır. Yani belirli süre içinde veri paketi yollanır. Bu yollamanın başladığı anda da alıcının alım konumunda bekleyip gelenleri alması tercih edilir. Aksi halde alıcı bir veri paketi geldiğinde doğruca gider ve almaya başlar. Ancak bu esnada bazı bilgilerin alıcıya girmiş yani kaçırılmış olması kuvvetle muhtemeldir. Bu nedenle alıcı hiç bir zaman bilgi paketinin başını tam olarak yakalayamaz. Tabiiki tedbir almazsanız bu olur.
Hal böyle olunca alıcının, belirli uzunlukta olan veri paketinin neresinden almaya başladığı bilinmez.  Bu bir sorun ama çözümü kolay. Zira siz veri paketinin başına bir uyandırma sinyali eklerseniz bu sinyalin sizin verinizle alakası olmayacaktır. Ancak alıcıyı veri paketi geldi şeklinde uyandıracaktır. Böylece baştan kaçırılan bilgiler uyandırma sinyaline ait olacağından sizin veriniz emniyetli bir şekilde alınacaktır. Ancak bu alımın yapılabilmesi için veri paketinin başına birde senkron işareti eklemek gerek. Bu işaret size ait asıl verinin başlangıcını gösterecek ve bu noktadan sonraki verilerin sizi ilgilendiren veriler olduğunu belirleyecektir. Dolaysıyla alıcı veri akışı devam ederken önce bu senkron işaretini arayıp bulacak ama bu işareti buluncaya kadar hiç bir veriyi kayıt etmeyecektir. Sonuçta işaret bulunduktan sonra ardından gelen verilerin kaydı yapılarak veriniz emniyetli bir şekilde alınmış olacaktır.
Şimdi dikkat ederseniz ortada iki farklı terim var. Birincisi uyandırma sinyali, diğeride senkron noktası işareti.
Uyandırma sinyali genelde 5 byte $AA bilgisi , 5 Byte $FF bilgisi ve 5 Byte $00 bilgisi şeklinde yollanır.
Bu bilgi yollandıktan hemen sonra sırada senkron noktası işareti için sizin seçtiğiniz 1-5 arası özel bir karekter dizisi yollanır. Ben genelde 3 karekteri tercih ediyorum . Bu yalnızca bir tercih ve bana daha iyi çalışıyor gibi geliyor.
diyelimki senkron işereti de "ETE" olsun. Bu işaretin ardından da asıl yollayacağınız bilgileri yolluyorsunuz. Onlarda A,B,C,D,E,F gibi 6 adet değişkene yerleştirilmiş byte dizisi olsun. Şimdi veri paketinize bakarsak aşağıdaki dizilişi göreceğiz;
$AA,$AA,$AA,$AA,$AA,$FF,$FF,$FF,$FF,$FF,$00,$00,$00,$00,$00,"ETE",A,B,C,D,E,F  (veri akış yönü  <<===<<===)
İşte bu sizin veri paketiniz oluyor. Alıcınız şayet uyandırılmaz ise ve siz ona arada bir git bak bir şey gelmiş mi derseniz muhtemelen alıcı bir şey geldiğini anlayıp veri paketinin içine dalacak ama ya ortadan bir yerden yada rastgele bir konumdan verileri almaya başlayacaktır. İşte sizin verilerinizin karışık gelme sebebi budur.
Ama alıcı bir şekilde veri geldiğinde uyarılır ise hemen gidip gelenlere bakmaya başlayacak ama bu arada paketin başında yer alan  bir veya bir kaç byte ı kaçırmış olabilecektir. Ama bizim için önemsiz olan bu işlemden sonra senkron işaretimiz olan ETE karekterlerini bekleyecek ve onu yakaladıktan sonra ardından gelen değişkenleri almaya başlayacak ve dolaysıyla peket başı bulunmuş olarak verilerimizi sağlıklı bir şekilde almış olacaktır.

İşte sağlıklı seri haberleşme bu şekilde yapılmaktadır.
Veri yollama şekliniz bu açıklamalara uygun oalrak başına uyandırma sinyali ekleyerek yaparsanız ve aılcıda da senkron işaretini alacak şekilde Wait ("ETE") ayarlarsanız sorununuz çözülecektir.

Burada bir şey daha eklemekte yarar vardır. Genelde bilgi paketi uzunluğu süre olarak 1-2 ms dolayında dır tabiiki yolladığınız veri uzunluğunada bağlıdır bu ancak ortalama 20-25 bytelık paketin alınma süresi 1-2 ms de biter.
Normal şartlarda , özellikle RF haberleşmede bir takım parazitler gelen bilgi gibi değerlendirilip alıcıyı alım konumuna geçirmektedir.
Tedbir almaz iseniz alıcı alma komutunda gelecek veriyi 65535 ms yani yaklaşık 65 sn bekleyecektir. Bu default bekleme süresidir.
Bunu önlemek için komutlara bekleme süresi (timeout) ve süre sonunda gidilecek bir etiket adı girilmesi imkanı verilmiştir.
Bundan yararlanarak veri alımında bekleme süresini 3-5ms olarak ayarlamak ve bu süre içinde veriniz gelmişse almak gelmemiş ise verdiğiniz süre kadar bekledikten sonra belirlediğiniz etikete atlamak mümkündür. Komutu bu şekilde kullanmak menfaatiniz icabıdır.
Örnek vermek gerekirse;
Heserin 5,ATLA,[wait("ETE"),A,B,C,D,E,F]    şeklinde kullanılan komut ile program en fazla 5 ms gelen veri içinde ETE senkron işaretini arar. Gelmemiş ise komuttan çıkar ve ATLA etiketine gider.

Hepsi bu kadar,

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

alayli

Alıntı yapılan: ete - 17 Mart 2011, 11:46:23
Haberleşmede en önemli faktörlerden birisi senkron çalışmadır. Kısaca izah etmek gerekirse ortada bir verici birde alıcı olduğunu düşünün ve bunların arasında gidip gelen birde veri paketi olduğunu varsayın. Verici bilgisni yollamadan önce alıcıyı bir şekilde haberdar edip onu veriyi bekler halde tutabilsek işimiz epeyce kolaylaşırdı. Ancak herkesin bildiği gibi veri zaman paylaşımlı olarak yollanmaktadır. Yani belirli süre içinde veri paketi yollanır. Bu yollamanın başladığı anda da alıcının alım konumunda bekleyip gelenleri alması tercih edilir. Aksi halde alıcı bir veri paketi geldiğinde doğruca gider ve almaya başlar. Ancak bu esnada bazı bilgilerin alıcıya girmiş yani kaçırılmış olması kuvvetle muhtemeldir. Bu nedenle alıcı hiç bir zaman bilgi paketinin başını tam olarak yakalayamaz. Tabiiki tedbir almazsanız bu olur.
Hal böyle olunca alıcının, belirli uzunlukta olan veri paketinin neresinden almaya başladığı bilinmez.  Bu bir sorun ama çözümü kolay. Zira siz veri paketinin başına bir uyandırma sinyali eklerseniz bu sinyalin sizin verinizle alakası olmayacaktır. Ancak alıcıyı veri paketi geldi şeklinde uyandıracaktır. Böylece baştan kaçırılan bilgiler uyandırma sinyaline ait olacağından sizin veriniz emniyetli bir şekilde alınacaktır. Ancak bu alımın yapılabilmesi için veri paketinin başına birde senkron işareti eklemek gerek. Bu işaret size ait asıl verinin başlangıcını gösterecek ve bu noktadan sonraki verilerin sizi ilgilendiren veriler olduğunu belirleyecektir. Dolaysıyla alıcı veri akışı devam ederken önce bu senkron işaretini arayıp bulacak ama bu işareti buluncaya kadar hiç bir veriyi kayıt etmeyecektir. Sonuçta işaret bulunduktan sonra ardından gelen verilerin kaydı yapılarak veriniz emniyetli bir şekilde alınmış olacaktır.
Şimdi dikkat ederseniz ortada iki farklı terim var. Birincisi uyandırma sinyali, diğeride senkron noktası işareti.
Uyandırma sinyali genelde 5 byte $AA bilgisi , 5 Byte $FF bilgisi ve 5 Byte $00 bilgisi şeklinde yollanır.
Bu bilgi yollandıktan hemen sonra sırada senkron noktası işareti için sizin seçtiğiniz 1-5 arası özel bir karekter dizisi yollanır. Ben genelde 3 karekteri tercih ediyorum . Bu yalnızca bir tercih ve bana daha iyi çalışıyor gibi geliyor.
diyelimki senkron işereti de "ETE" olsun. Bu işaretin ardından da asıl yollayacağınız bilgileri yolluyorsunuz. Onlarda A,B,C,D,E,F gibi 6 adet değişkene yerleştirilmiş byte dizisi olsun. Şimdi veri paketinize bakarsak aşağıdaki dizilişi göreceğiz;
$AA,$AA,$AA,$AA,$AA,$FF,$FF,$FF,$FF,$FF,$00,$00,$00,$00,$00,"ETE",A,B,C,D,E,F  (veri akış yönü  <<===<<===)
İşte bu sizin veri paketiniz oluyor. Alıcınız şayet uyandırılmaz ise ve siz ona arada bir git bak bir şey gelmiş mi derseniz muhtemelen alıcı bir şey geldiğini anlayıp veri paketinin içine dalacak ama ya ortadan bir yerden yada rastgele bir konumdan verileri almaya başlayacaktır. İşte sizin verilerinizin karışık gelme sebebi budur.
Ama alıcı bir şekilde veri geldiğinde uyarılır ise hemen gidip gelenlere bakmaya başlayacak ama bu arada paketin başında yer alan  bir veya bir kaç byte ı kaçırmış olabilecektir. Ama bizim için önemsiz olan bu işlemden sonra senkron işaretimiz olan ETE karekterlerini bekleyecek ve onu yakaladıktan sonra ardından gelen değişkenleri almaya başlayacak ve dolaysıyla peket başı bulunmuş olarak verilerimizi sağlıklı bir şekilde almış olacaktır.

İşte sağlıklı seri haberleşme bu şekilde yapılmaktadır.
Veri yollama şekliniz bu açıklamalara uygun oalrak başına uyandırma sinyali ekleyerek yaparsanız ve aılcıda da senkron işaretini alacak şekilde Wait ("ETE") ayarlarsanız sorununuz çözülecektir.

Burada bir şey daha eklemekte yarar vardır. Genelde bilgi paketi uzunluğu süre olarak 1-2 ms dolayında dır tabiiki yolladığınız veri uzunluğunada bağlıdır bu ancak ortalama 20-25 bytelık paketin alınma süresi 1-2 ms de biter.
Normal şartlarda , özellikle RF haberleşmede bir takım parazitler gelen bilgi gibi değerlendirilip alıcıyı alım konumuna geçirmektedir.
Tedbir almaz iseniz alıcı alma komutunda gelecek veriyi 65535 ms yani yaklaşık 65 sn bekleyecektir. Bu default bekleme süresidir.
Bunu önlemek için komutlara bekleme süresi (timeout) ve süre sonunda gidilecek bir etiket adı girilmesi imkanı verilmiştir.
Bundan yararlanarak veri alımında bekleme süresini 3-5ms olarak ayarlamak ve bu süre içinde veriniz gelmişse almak gelmemiş ise verdiğiniz süre kadar bekledikten sonra belirlediğiniz etikete atlamak mümkündür. Komutu bu şekilde kullanmak menfaatiniz icabıdır.
Örnek vermek gerekirse;
Heserin 5,ATLA,[wait("ETE"),A,B,C,D,E,F]    şeklinde kullanılan komut ile program en fazla 5 ms gelen veri içinde ETE senkron işaretini arar. Gelmemiş ise komuttan çıkar ve ATLA etiketine gider.

Hepsi bu kadar,

Ete

Ete hocam elinize emeğinize sağlık; pişmiş balık ikram etmektense balık yakalamayı öğretmek amacıyla uzun uzun yazmışsınız ama, bu söylediklerinizin bir kısmı RF haberleşme, bir kısmı da Pulsin komutu ile ilgili. Okurken benim bile kafam karıştı. Yanlış algılamadıysam @forumsad'ın yardım talebi kablolu Usart tabanlı seri haberleşme ile ilgili. Kablolu seri haberleşmede uyandırma işaretine gerek yoktur. Sadece senkronu tutturmak yeter.  Kablolu haberleşmede "$AA,$AA,$AA,$AA,$AA,$FF,$FF,$FF,$FF,$FF,$00,$00,$00,$00,$00" gibi 15 bayt haberleşme hızını azaltmaktan öte bir amaca hizmet eder mi sizce?

Kablosuz seri iletişimde de Usart haberleşmeyi FSK, GFSK vb. frekans modülasyonlu alıcı vericilerle kullanmak daha başarılıdır. OOK, ASK vb. genlik modülasyonlu alıcı vericilerde Usart kullanımının hüsranla sonuçlandığına dair forumda bir çok kişinin tecrübesi malumdur. Bunlarda NRZ veya manchaster gibi protokoller başarımı arttırmaktadır...

Son paragraftaki timeout kullanımı uyarınız yerinde. Ben de mesajımda bahsetmeyi düşünmüştüm ama arkadaşın kafası karışabileceği düşüncesiyle eklemekten vazgeçtim. Nasılsa takılırsa sorar bizlerde yardımcı oluruz dedim. Fakat burada da 65535 ms bekleme ile ilgili, siz bir hususu gözden kaçırmışsınız gibi; (yada Proton+'dan farklı olarak PBP'de öyle olabilir belki) Proton+'da eğer bir timeout değeri ve etiketi belirtilmezse tüm Usart tabanlı komutlar, eğer Wait modifieri kullanılmamışsa Rx pinine herhangi bir data gelinceye kadar,  Wait modifieri kullanılmışsa Rx pinine senkron işaretine eş data(lar) gelinceye kadar ilgili satırda çakılı kalır, 65535ms bekleyip alt satıra dallanmaz. Hatta Proton+'da Usart tabanlı komutların çakılmasıyla ilgili başka trickler de vardır. Örneğin Str kullanımıyla ilgili:

HSerIn [Str SerGelen\8]


Bu kod Rx pininden en az 8 bayt data gelmesini bekler. <8 baytlık bilgi komutu bu satırda çakılı bırakır. =8 bayt veya >8 baytlık bilgi gelirse ilk 8 baytı dizine yerleştirir ve sonraki satıra dallanır.

HSerIn [Str SerGelen]


şeklinde bir yazım <8 bayt gelirse; gelen baytları sırayla dizine yerleştirir, eksik baytlara ait dizi değişkenlerine dokunmaz ve sonraki satıra dallanır.  =8 bayt veya >8 baytlık bilgi gelirse ilk 8 baytı dizine yerleştirir ve sonraki satıra dallanır.

HSerIn [Wait("ETE"),Str SerGelen\8]


Bu kod "ETE" ile senkronu tutturduktan sonra en az 8 bayt daha gelmesini bekler. "ETE" sonrası <8 baytlık bilgi komutu bu satırda çakılı bırakır. "ETE" sonrası =8 bayt veya >8 baytlık bilgi gelirse ilk 8 baytı dizine yerleştirir ve sonraki satıra dallanır.

HSerIn [Wait("ETE"),Str SerGelen]


şeklinde bir yazım "ETE" den sonra <8 bayt gelirse; gelen baytları sırayla dizine yerleştirir, eksik baytlara ait dizi değişkenlerine dokunmaz ve sonraki satıra dallanır. "ETE" sonrası =8 bayt veya >8 baytlık bilgi gelirse ilk 8 baytı dizine yerleştirir ve sonraki satıra dallanır.

Herhangi bir önlem alınmadığında veya süre deklare edilmediğinde 65535 ms bekleyen komut Proton+'da Pulsin komutudur ki OOK, ASK modüllerle RF seri haberleşmede alıcı tarafta en sık kullanılagelen Proton+ komutudur...
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

ete

Alaylı,

Bana göre uyandırma sinyalinin USART seçeneğinde de kullanılması fayda sağlar. Gerekirse gönderilen bilgileri 5 şer byte değilde 2 şer byte yollarsın ama bence gerekli . Bunun aksini bir yerlerde okumadım. Varsa senin okuduğun bir yer oradan okuyayım. Sonuçta USART mekanizması geri planda çalışan bir mekanizma ilk bit porta girdiği andan itibaren kayda alınıyorsa sorun yok o zaman uyandırma kullanma ama benim senkron bilgimi kaçırıyorsa o zamanda gerekli derim. Bence kullanmak zarar değil fayda getirir. Zaman çok kritik ise kullanmayabilirler tabiiki sistem çalışıyor ise değilse ben yinede kullanılması taraftarıyım. Usart kullanan bir çok proje yaptım.  Gerçek projeler hemde simulasyon değil. Bir kısmında uyandırma kullanmadım ama kullanmadığım bazı yerlerde sorunlar çıktı ve kullanmak zorunda kaldım. Anlayacağın kullanılması sorun yaratmıyor.
Yalnızca Transparan RF modüllerde (transceiver) kullanılması gerekmiyor çünki onlarda kendi işlemcileri var asıl haberleşmeyi o yapıyor. Bu nedenle o tür sistemlerde kullanmıyorum.

Yazdıklarımın Pulsin komutu ile alakası olmadığını düşünüyorum. Hepsi haberleşme komutları ile alakalıdır. Pulsin işini süre meselesine bağladınız ise o doğru .

Hserin komutunda timeout verilmediği zaman programın default süre kadar beklediğini bir yerlerde okumuş idim. Şimdi bulamadım ama bulursam açıklayacağım. Şimdiye kadar çok kullandım bu komutu. Özellikle bu konuda da denemeler yaptım. Bana kalırsa (Proton farklı olabilir) PBP da default süre kadar  bekleyip çıkıyor.   Bu konuda iddalı da değilim. Kaynak gösterirseniz okur kabullenirim. Ama benim tecrübelerim anlattığım yönde şimdilik.

Ayrıca sen Proton tabanlı konuşuyorsun ben PBP tabanlı konuşuyorum. Sonuçta aralarında pek fark yok ama olabilirde.
Ben yinede araştıracağım. Özellikle çakılma konusunu derleyicinin ana formuna soracağım bakalım ne cevap gelecek.

Ete


Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

egex

Bilgilendirme için teşekkür ederim .

Ete Hocam sizin paylaştıklarınız bizlere kazanımları çok olmuştur. Allah Razı olsun. :)