O

Pic programlamada sıralı komut yazma

Başlatan onurreyiz, 27 Mayıs 2013, 00:07:09

onurreyiz

iyi akşamlar arkadaşlar

demek istediğim örneğin;
iki buton mevcut

butonlardan

1 0 0 1 1
1 1 0 0 1

değerleri gelince değişken in bir artmasını istiyorum bunu nasıl yapabilirim ?

teşekkürler

haberlesme

Bu kadar ayrıntıyla bişey söylemek zor öncelikle bu değerler nereye gidiyor ne yapacagınla ilgili biraz daha açık olursanız daha doğru şekilde yardım imkanı olabilir.

ete

Soru çok iyi anlaşılmıyor. Biraz açıklama vereyim sen bu açıklamayı okuyup yeniden sor sorunu.
Bir buton bit bazında çalışan bir elemandır. Normal şartlarda bir konumda ( pullup yada pulldown) bekler. Butona basınca beklediği konumun tersi olan biti buton pinine uygular. Örnek verelim.
Buton high da bekliyor olsun ( daima high da bekleyen tercih edin avantajları var) buton pini high demektir. Butona basınca pin low olacaktır. Gördüğün gibi buton pini ya high yada low oluyor.
İki buton için durum farklı değildir. Şimdi senin verdiğin sıralamaya bakınca üst üste iki satır şeklinde verdiğin bit değerleri butonlara ait çıkış değerlerimidir? Şayet öyle ise ilk satırı ele alalım istersen.
%10011 değerleri için şöyle bir düşünelim. Farz edelim buton high da bekliyor. Demekk ilk iki bit için butona basılmamış sonra 2 defa butona basılmış sonra yine basılmamış. Peki işlemci bir saniyede milyon bazında işlem yapar. Basılmayan tuş konumuöyle iki tane değil yüzlerce yakalanabilir işin bu kısmı nasıl olacak. Diğer bir sorunda bit bazındaki işlem için sıralı bit konumlarının byte cinsi bir değişkene aktarılması işlemi dir. Diyelimki elimizde basılan diye bir değişkenimiz var. Başlangıçta basılan=0. İlk basılmayan tuş karşılığı basılan=1 oldu. İkinci basılan tuş karşılığı olarak basılan=basılan*2+tus eşitliği ile basılan=%10 oldu ,
Üçüncü basılan tuş karşılığı basılan=%100 oldu ve dördüncü basılmayan tus karşılığı basılan=%1001 ve son okarak basılmayan son tus karşılığı basılan=%10011 olacaktır. Burada dikkat edilmesi gerekn şey hane sayısını yine bir değişken ile kontrol edip istenen sayıya gelinca katşılaştırma işini yaptırmak olmalıdır.
Aynı işlemler diğer tuş içinde geçerli olacaktır.
Çok komplike bir tuş kontrolü bu şayet doğru anlamış isem. Farklı bir düşünce şeklinde olabilir. Bu yüzden yeniden bir düşün ve açımla istersen.
Ete

onurreyiz

çok teşekkür ederim vakit ayırdığınız için,

aslında benim yapmak istediğim fotodirenç ve lazer ile kişi sayıcı,
bu sistemde iki tane lazer olacak ve girişte ve çıkışta, foto direçnlerden
gelecek bir kaç değişken sonucunda sayım yapılabilir.

yani a ve b lazerleri olduğunu varsayarsak ve a iç tarafta ki ve b dış taraftaki lazerse

a 0 0 1
b 1 0 0 olduğunda değişken bir azalacak, tam tersi durumda bir artacak,

sanıyorum if kullanılarak yapılacak ama, iki değişken ve 3 koşul olduğundan nasıl yapılacağı hakkında bir fikrim yok.

yardımcı olursanız çok sevinirim.

ete

#4
Sorunun sorulma şekli yine yanlış bence.
Bir kapının girişinde ve çıkışında iki sensör var. Dışarıdan içeri birisi girdiğinde önce DIŞ=1 ve sonra İÇ=1 olacaktır.

İçeriden birisi dışarı çıkıyor ise  Önce İÇ=1 sonra DIŞ=1 olacaktır. Bu varsayımda sensörlerin insan görmesi halinde 1 verdiklerini varsayıyoruz.
O halde algoritma şöyle kurulmalıdır.
Dışarıdan içeri insan girmesi hali,
IF DIS=1 then
  WHILE  DIS=1:WEND  'kişinin dış sensörün  sahasından çıkması beklenir ve hemen ardından iç sensörün alanına girmesi beklenir.
  WHILE IC=0:WEND 'bu komut satırı geçilince kişi iç sensör alanına girdi demektir.
  SAYAC=SAYAC+1
  WHILE IC=1:WEND ' bu komut satırı ile kişi iç sensör alanından kurtulmuş olur.
ENDIF

IF IC=1  THEN
  WHILE IC=1:WEND
  WHILE DIS=0:WEND
  SAYAC=SAYAC-1
  WHILE DIS=1:WEND
ENDIF
bu iki komut gurubu ile sensörler girişlerde sayac değerini artırır ve çıkışlarda ise azaltır.

Ama hareketli bir ortamda bu sistemin pekde sağlıklı çalışmayacağını hesaba katmalısın.
Bunun anlamı şu dur. Bir kişi dışarıdan içeri girerekn aynı zamanda biride dışarıdan içeri giriyorsa sistem şaşırır.
Bunu gidermek için daha değişik bir sistem kullanmak gerekebilir. Mesela çıkışlar ayrı girişler ayrı yerden yapılırsa sistem nispeten doğru çalışır.

Bir şeyi anlamakta zorlanıyorum. İç deki sensör nasıl olupta şu bilgiyi üretecek? A 0 0 1  ?
Dikkat edilirse 3 ayrı bit sözkonusu. Bunu ancak 3 ayrı sensör aynı anda üretebilir. Yoksa tek sensörün bu bilgiyi vermesi mümkün değil. İşin bu kısmında farklı bir şeymi düşünüyorsun acaba.?

Ete

   

onurreyiz

çok teşekkür ederim

Ben aslında içteki sensörün sırayla o değerleri aldığında sayacın artacağını düşünmüştüm. Yani o değerleri tek seferde değil, ilk olarak 0 ikinci olarak 0 son olarak da 1 değerini almasını gerektiğini düşünmüştüm.

ama ihtiyacım olan bilgiyi aldım düşünce tarzım yanlışmış

çok teşekkür ederim vakit ayırdığınız için

onurreyiz

hocam son olarak

böyle bir devrede kesmeye gerek var mı olmazsa olur mu?

ete

ELbette kesme her zaman daha iyi iş görür.
Gözünde canlandırmaya çalış.
Ortada 4 adet sensör var. Hangisinin aktif olacağı belli değil. Sen birinciye bakarken anlık olarak dördüncü aktif olursa ne yaparsın? kaçırma ihtimalin çok büyük. Bu nednele en güzeli,
- PortB değişiklik kesmesi kullanarak 4 adet sensörü PORTB.4-PortB.7 pinlerine bağlarım.
Kesmeyi aktif ederim.
Kesme oluşunca sensör bitlerini aktive ederim.
SEN-1=1 yada ikinci sensör aktif olmuş ise SEN-2=1 gibi
Programın ana bölümünd eise aktif olan sensörle ilgili ne yapılmasıgerekiyorsa onları yaparım.
Bu dar vakitte böyle bir uygulama aklıma geldiği için söyledim. Olaya konsantre olunca daha iyi çözüm de bulunabilir. Mesela daha öncede dediğim gibi aktif olan sensörün takip edilerek sonrakinin yakalanması gibi. Ancak bir kural vardır. Kesme alt programından mümkün olan en kısa sürede çıkmak gerekir. Böylece diğer kesmelere fırsat tanımış olursun.
Aksi halde orada vakit geçirirsen oluşabilecek diğer sensör kesmelerini kaçırma ihtimalin doğar bu seferde. Bu nedenle genellikle kesme olduğu zaman bir bit değişkeni set edilip kesmeden çıkılır ve ana bölümde set edilen değişkenlere göre işlem yaptırılır. Orada vakit çok tur diyebiliriz. Çünki arada kesmede oluşsa gider gelir program sen işine devam edebilirsin demektir bu.

Ete

Powered by EzPortal