kumanda protokolü yardım

Başlatan blueboard, 08 Şubat 2014, 22:50:12

blueboard

Ete Hocam , öncelikle PBP konusunda acemi olduğumu belirtmek istiyorum. Ancak kendimi geliştirmek için sürekli olarak araştırma içindeyim. PBP ile ilgili yazdıklarımda bariz hatalarım olabilir,kusuruma bakmayın.
Hocam, ben bir kablolu kumanda konusunda çalışıyorum. Konu ile ilgili araştırmalarım sonucu  belirli bir mesafe kat ettim.Ancak bir yerde tıkandım,yardımınızı rica ediyorum.Sistemin daha anlaşılır olması için 2 adet butona indirgedim. Çözümü 2 buton için getirebilirseniz devamını ben hallederim.
Sözü fazla uzatmak istemiyorum. Protokol yapı olarak SIRC protokolüne benziyor,ancak süreler farklı. Konu ile ilgili olarak PBP dosyasını, konu açıklamasını, Proteus çizimini ekledim.
Burada ilk takıldığım nokta şu: test etiketi altında "select case key ve  CASE 1  " ifadeleri kullanılmış. Bu komuta yabancıyım. İnternette bu komutun şart ifadesi taşıdığını okudum ama kafamı karıştırıyor.Bunun yerine if ile aynı şart kullanılamaz mı? Kullanılabilirse if ifadesini nasıl yazmam gerekir? Lütfen benim gibi bir acemiye yardım edin ki sayenizde ustalaşalım.Teşekkür ederim.

İlyas KAYA

Alıntı yapılan: blueboard - 08 Şubat 2014, 22:50:12
Ete Hocam , öncelikle PBP konusunda acemi olduğumu belirtmek istiyorum. Ancak kendimi geliştirmek için sürekli olarak araştırma içindeyim. PBP ile ilgili yazdıklarımda bariz hatalarım olabilir,kusuruma bakmayın.
Hocam, ben bir kablolu kumanda konusunda çalışıyorum. Konu ile ilgili araştırmalarım sonucu  belirli bir mesafe kat ettim.Ancak bir yerde tıkandım,yardımınızı rica ediyorum.Sistemin daha anlaşılır olması için 2 adet butona indirgedim. Çözümü 2 buton için getirebilirseniz devamını ben hallederim.
Sözü fazla uzatmak istemiyorum. Protokol yapı olarak SIRC protokolüne benziyor,ancak süreler farklı. Konu ile ilgili olarak PBP dosyasını, konu açıklamasını, Proteus çizimini ekledim.
Burada ilk takıldığım nokta şu: test etiketi altında "select case key ve  CASE 1  " ifadeleri kullanılmış. Bu komuta yabancıyım. İnternette bu komutun şart ifadesi taşıdığını okudum ama kafamı karıştırıyor.Bunun yerine if ile aynı şart kullanılamaz mı? Kullanılabilirse if ifadesini nasıl yazmam gerekir? Lütfen benim gibi bir acemiye yardım edin ki sayenizde ustalaşalım.Teşekkür ederim.

Kablolu bir kumanda ve SIRC protokolü .. Eminmisiniz ?
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

Bak İlyas bir anlam verememiş bende veremedim doğrusu. Bir kavram anlaşmazlığımı var acaba.
Dosyaya bakamıyorum şimdilik sonra bakacağım belki orada açıklayıcı bir şey vardır. Protokoller kablosuz sistemler için sağa sola karışmasın diye geliştirilmiştir. Kablo ulunca kontrol kablondan dışarı çıkmaz zaten bir protokole hiç gerek yoktur. Amacın nedir bilemiyorum ama bana anlamsız geliyor.
Ete

blueboard

Ete Hocam,kesinlikle doğru olarak belirtiyorum.Sistem kablolu bir kumanda sistemi ancak protokol var.Benzer durum araçlarda can bus haberleşmesinde de vardır. örneğin araçlarda Can Bus haberleşmesinde aynen kablosuz prtokollerinde olduğu gibi başlangıç sinyali gönderiliyor,ardından asıl komut.Alıcılar önce başlangıç sinyalini aldıklarında komutun kendilerine gönderildiğini anlıyorlar,ardından yapılması istenen komutu sinyale göre yorumlayıp gereğini yapıyorlar.Aşağıdaki linklerde kablolu sistemlerde protokol ile veri gönderimine ait açıklayıcı yazılar var.
http://www.barissamanci.net/Makale/15/can-bus-nedir-can-protokolu-incelemesi/
http://kurumahmut.blogcu.com/can-bus-haberlesme-sistemi-hakkinda-kisa-makale/2760108
Burada sizi gereksiz yere meşgul etme gibi gayri ciddi bir düşüncem kesinlikle yoktur.Bu sistemin amacı sadece 2 kablo üzerinden farklı alıcılara komutlar göndermektir. Ana amaç maliyeti düşürmektir. Düşünün bir sistemde 50 adet alıcı olsun. Bu 50 alıcıya ayrı ayrı hatlar çekmek yerine sadece 2 kabloyu tüm sistemde gezdiriyorsunuz ve tüm alıcıları buraya bağlıyorsunuz. Bu protokol sayesinde de alıcıları birbirinden ayırmış oluyorsunuz. Teşekkür ederim.

ete

En başta yapman gereken açıklamayı şimdi yaptın önceden yapsaydın o mesajları atmayacaktık.
Elbette birden fazla abıneye kabloluda olsa ulaşmak için protokol kullanılabilir. Hemde 2 kablo ile yapılması hem sistemi basitleştirir hem maliyeti düşürür.

Select case komutu yaygın kullanımı olan bir komuttur. Aynı iş if satırları ilede  yapılabilir ama select case ile yapılması daha kolaydır. Türkçeye şöyle çevirebiliriz "Değer seç". Yada "değere göre işlem yap"
Bir değişken değerine göre işlem yapmak için kullanılır. Kullanım şekli şöyledir.
Select case değişken.  Mesela select case sayac
Case 0.  Yani sayac=0 ise demektir
Şunu yap bunu yap şeklinde komutları sıralarsın.
Case 1. Yani sayac=1 ise
Şunu yap
Case 2,3,5.  Yani sayac=2 veya sayac=3 veya sayac=5 ise
Şunu yap
Sonunda işi kapatmak için end select demek gerekiyor
Bu kadar işi iflerle yapınca bir çok satır yazman gerekebilir.

Ete

blueboard

Teşekkür ederim, anlattıklarınız doğrultusunda programı  tekrar elden geçireceğim.

blueboard

#6
Ete Hocam,ekteki dosyada select case yerine if kullandım. Select Case 'de benim mantığıma şurası ters geldi: öncelikle KEY adında bir değişken tanımlayacağım,burada sorun yok. Ama daha sonra buton sıfıra basıldığında KEY değişkenini örneğin 0 olarak atayacağım.Yani KEY değişkenini sıfır olarak atamam için şunu yazmam gerekecekti:
if buton0=0 then KEY=0
sonra select case ile key değişkenini kontrol ettirecektim.
Ben burada hem if hem de select case kullanacağım yerde sadece if ile işi çözdüğümü düşünüyorum. Hatalı mı düşünüyorum. Yeni eklediğim dosyada if şartlarında sorun var mı? Teşekkür ederim.

ete

senin karşılaştırman zaten if'e uygun. Topu topu 2 adet satırın var. Her birinde farklı bir değişkeni test ediyorsun.
Burada select case kullanılmaz zaten.
Select case tek bir değişkenin birden fazla (en azından 2 den fazla demek daha uygun) değer alması durumunda her değer için farklı işlemler yapılacak ise select case kullanımı mantıklıdır. Bunda bile toplam 2 değer için select kullanmak gerekmez.

Ete

blueboard

Ete Hocam,normalde 10 adet değişken var ama ben 10'unu da yazmak istemedim. 2 ile sınırlandırdım,  fazla miktarda yazdığımda kafa karıştırmasın diye düşündüm. Ete hocam son gönderdiğim dosyada mantık hatası var mı? İnceleyebildiniz mi? Benim şurada bir ihtimal hatamın olabileceğini düşünüyorum: Daha önce de belirttiğim gibi komut 48 bitten oluşuyordu ve ilk 24 bit tüm komutlarda aynı idi. Ben bu aynı olan 24 bitlik komutu döngüden önce yazdım,burada sıkıntı olur mu? İlk komutta sıkıntı olmaz ama döngü 2. kez tekrarlandığında döngüden önce yazmış olduğum "StartH CON %11010111       
                                                      StartM CON %11011011       
                                                       StartL CON %10101011      ifadeleri komut grubuna dahil olurlar mı? Teşekkür ederim.

ete

ByteArray'e verdiğin ilk 3 değer değişmez başka bir yerde değiştirmedikten sonra.
Orada sorun yok ama sorun şurada;

gonder:
    FOR BitCount = 0 to 47
        If ByteArray.0[BitCount] = 1 THEN
            GOSUB bir
        ELSE
            GOSUB sifir
        ENDIF
    NEXT
RETURN
        If ByteArray.0[BitCount] = 1 THEN satırı hatayı doğuracak olan satırdır.
BitCount 48 defa saymaktadır.
Hata satırında da ByteArray değişkeninin 47. bitini test ediyorsun.
Basic de 48 bitlik bir sayı yoktur. Senin sayıların hep 8 bit olduğuna göre bu testi 8'er bitlik bloklar halinde yapmalısın.
Şöyle
For X=0 to 5
   TEMP=ByteArray[X]
   For BitCount=0 to 7
        If Temp.0[BitCount] = 1 THEN
            GOSUB bir
        ELSE
            GOSUB sifir
        ENDIF
    NEXT
Next
RETURN

Anlaşılmayan bir yer olursa sorarsın

Ete


blueboard


blueboard

#11
Ete Hocam, söylediğiniz değişikleri yapıp kaydettikten sonra derleme kısmında
For X=0 to 5
   TEMP=ByteArray[X] satırlarında hata verdi. Ben de x ve temp için programın başında bunları byte olarak tanımladım. Sanırım hatalı tanımlama yapmadım.
Ete Hocam Proteus ta programı çalıştırdığımda 2 şey dikkatimi çekiyor.Birincisi sanal osiloskopta sinyallerin gelişini görebilmek için örneğin buton 0 'a sürekli olarak elimi basılı tutmam gerekiyor. Oysa  Pic Basic'te ben butona bir kez bastığımda programın başlaması ve program sona erene kadar devam etmesi gerekmiyor mu? Yani butona bastığım anda osiloskop ekranında 1 lerin ve 0 ların gelişini elimi çeksem de gözlemem gerekmez mi?
İkincisi ise yine osiloskop ekranında bu 1 ve 0 ların gelişi hemen olmuyor. Aradan 3-4 saniye geçtikten sonra görmeye başlıyorum. Vereceğiniz değerli fikirleriniz için şimdiden teşekkür ederim. Dosyaların son halini tekrar ekliyorum.

ete

#12
Sİmulasyon da pic işlemcinin hızı 1Mhz seçili ondan sistem yavaş çalışıyor. Onu 4 Yapman gerekiyor.
Ayrıca programın başlarına DEFINE OSC 4 komutunuda eklemen gerekiyor ki sistem gecikme komutlrını doğru işleyebilsin.

Program GOSUB TEST komutu ile çalışmaktadır. Test kısmında ileri yada geri butonuna göre işlem yapılmaktadır.
Ama TEST alt programının sonuna Pause 500 gibi yüksek bir gecikme koymuşsun bu bir bir de açılışta Pause 1000 gibi yine yüksek bir gecikme var. Bana kalırsa açılış gecikmesi 300 ms olabilir.
TEST kısmındaki gecikmeye gelince şayet tuşa basılmamış ise programın orada 500 ms beklemesinin hiç bir anlamı yok.
Bu gecikmenin bir tuşa basılmış olması durumunda işleme koyulmasında yarar var.  Bu gecikmeyi gönder etiketi altına koyarsan tuş kontrolün hızlanmış olur. O gecikme de her gönderme işleminden sonra tatbik edilerek sistem bozulmamış olur.
Aslında iki ver paketi arasına 500 ms lik gecikme koymak zorunlumudur değilmidir bilmiyorum ama genelde bu süre daha düşüm ms lerle ayarlanması daha dorğu olur kanaatindeyim. Böylece tuşa geç basılıyormuş hissi ortadan kalmış olur. Mesela 500ms yerine 50 ms lik bir bekleme süresi koyulabilir oraya. Böylece pulslerin anında çıktıklarını görebilirsin.
Skop ayarlarınıda gerek trigger ve gerekse kanal-1 de sinyal olarak AC yerine DC yi seçmen daha doğru olur.

Bunları yaptığında sistem daha düzgün çalışmaktadır.

Ete



blueboard

#13
Ete Hocam,biliyorum sizi bugün çok uğraştırdım ama son bir şey daha sormak istiyorum. Butona basılı olduğu sürece iki komut arasında 41 ms süreyle beklemek gerekiyordu. Bu bekleme süresini ana döngü etiketinde ilk satıra yazmam mı daha doğru yoksa programın sonuna bir yere mi?
Bir de şu durum var ;hatırlarsanız ilk mesajımda alıcının kendine komut gönderildiğini anlaması için 8 ms süreyle high , ardından 4.5 ms süreyle low sinyali görmesi gerekiyordu. 8  ms high ve 4.5 ms low sinyali programın başında nereye yazmalıyım?Hem başlangıç durumunu hem de ikinci komut arasında bekleme durumunu ifade eden resimleri ekledim.Teşekkür ederim.

ete

Mantığınla çözmen gereken soruları sorduğunun farkındamısın.?
"alıcının kendine komut gönderildiğini anlaması için 8 ms süreyle high , ardından 4.5 ms süreyle low sinyali görmesi gerekiyordu"
alıcı kim verici kim ben anlamıyorum. Ama bu programda söz konusu olan Verici olduğunu sanıyorum. O halde alıcıya bu program 8ms HIGH, 4,5ms de Low verecektir. Peki bunu her veri paketininbaşında mı yapmalı yoksa yalnızca bir kere mi yapmalı işin burası mechul. Ama mantığım bana her veri paketinin başına bunu ekle diyor. O halde bu sinyali çıkartmanın yeri veri paketinin yollandığı yer olmalıdır. Basit bir mantık muhakemesi ile çözülmüş oldu. Veri paketi GONDER isimli etiket altında yollanıyor.

Diğer taraftan iki paket arasında 41 ms lik bir boşluk olması gerekiyormuş. Bunu ayarlamanında en güzel yeri yine veri paketi nin yollandığı yerdir. Bu husus tuşa sürekli basıldığı zaman gerçekleşir. Zira programın ana algoritması her tuşa basılışta tek paket yollanacak şekilde hazırlanmış. Ama tuşa basmaya devam edersen program iki paket arasına 41 ms boşluk ekleyip yeniden paket yollar. Bu iki hususu birleştirerek Gönder etiketi altında olanları şöyle düzenlemek gerekir.

Gönder:
PORTA.0=1:pause 8
PORTA.0=0:pauseus 4500

   For X=0 to 5
   TEMP=ByteArray[X]
   For BitCount=0 to 7
        If Temp.0[BitCount] = 1 THEN
            GOSUB bir
        ELSE
            GOSUB sifir
        ENDIF
    NEXT
Next
pause 41  'iki paket arasındaki boşluğu bu gecikme ayarlamış olacaktır.
RETURN


Ete



Powered by EzPortal