PBP de while wend komut kullanımı

Başlatan kılıckaya, 27 Ekim 2013, 20:25:34

kılıckaya

İyi günler, bugün forumları gezerken tesadüfen while wend komutunun kullanımı ile ilgili bir şeyler okudum ve uygulamaya çalıştım. Daha önce Keypad buton kontrolü için "IF" komutunu kullanıyordum. Keypad kontrolünü while wend döngüsü ile yapmaya çalıştım ama başarılı olamadım. Yapmak istediğim örneğin keypadde sw2 butonuna basılı olduğu sürece sürekli olarak b2 pininin lojik 1 olması, butondan elimi çektiğimde de b2 nin lojik sıfıra dönmesi.Ekte devrenin daha basit ve anlaşılır olması için 2x2 keypad devresi ve bununla ilgili yazmış olduğum pbp dosyası var. PBP dosyasında yine fazla karışıklık olmaması için sw3,sw6 ve sw7 için daha önceden yazmış olduğum "IF" kullanarak yazmış olduğum komutları bilinçli olarak açıklama gibi gösterdim. Sadece sw2 butonu için yazmış olduğum örnek while wend döngüsünü yazdım.
Sizlerden sw2 butoonuna elim basılı olduğu sürece b2 pininden lojik 1 , elime çektiğimde de lojik sıfır almayı while wend döngüsüyle sağlamam için yardım istiyorum. Bakar mısınız nerede hata yapmışım? Teşekkürler.

ete

Hata şurada. Normalda tuş taraması yaptığın için SW2=1 olduktan sonra programı While - Wend döngüsüne sokunca SW2 hiç bir zaman sıfır olamayacaktır. Ne zaman sıfır olmalı, Butonu bırakınca !. Peki butonu bırakmak ne demek PORTB.5 pininin yeniden HIGH olması demektir. Ancak buton ları tarama şeklinde çalıştırdığın için zaten PORTB.5 pini buton kontrolündetuşa basılı tutsanda HIGH olmaktadır. O halde geriye tek bir çözüm kalıyor. SW2 kontrolünü tarama kısmında çözmen gerekiyor.
IF PORTB.5=0 THEN SW2=1   satırı yerine şunları yazarsan istediğin olur.
if portb.5=0 then
SW2=1  'aslında bu komuta artık ihtiyaç bile yok.
PORTC.2=1
WHILE PORTB.5=0:WEND
PORTC.2=0:SW2=0
ENDIF
Burada butona sürekli basacağın için diğer tuşların taranmasında gerek olmayacaktır umarım. Zira bu mantıkta tuş taraması SW2 yi bırakıncaya kadar duracaktır.

Bu satırlar işini görecek durumda. O halde aşağılarda yer alan ;
IF SW2=1 then C1 satırını ve daha aşağıdaki while wend satırlarını silmen gerekir.

Ete

kılıckaya

Ete Hocam,belirttiğiniz şekilde yazdım. Ancak derlemeye gelince " ENDIF" ifadesine geldiğinde hata mesajı veriyor. Ekran görüntüsünü ekliyorum.

est32

if portb.5=0 then SW2=1 satırındaki then'in ardındaki sw2=1 kısmını bir alt satıra yazar mısın, then den sonra bişey olmasın o satırda

kılıckaya

SW2=1 komutunu alt satıra yazınca hata vermeden derledi. Ancak yine SW2 butonu bırakılsa da b2 pini lojik 1 (HIGH) ta kalıyor.

ete

#5
Ne olması gerektiğini açık yazdım ama hata yapıyorsun sanırım.
İlişikteki dosyayı yükle ve bak bakalım.

Aslında sonradan düşündüm de aşağıdaki şekilde yalnızca C1 etiketindeki kodları değiştirerek de bu iş yapılabilir. Şöyle

C1:
PORTB.0=0  'tuşa low verecek pini GND ye çekiyoruz.
IF PORTB.5=0 THEN   'bu durumda tuşa basılıyor ise PortB.5=0 olacaktır.
PORTC.2=1                'şayet böyle ise led çıkışını aktif et
WHILE while portb.5=0:wend   'tuş bırakılıncaya kadar bekle
PORTB.0=1                 'tuşa low veren pini tekrar high yap
PORTC.2=0                 'led çıkışını low yap
PAUSE 150                  '150 ms bekle   
RETURN                       've geri dön.

Bu şekilde yapmak istersen ilk yazdığın programdaki bütün satırları bırakıyorsun yalnızca C1 kısmını yukarıda yazdığım şekilde yeniden düzenliyorsun.
Ete

kılıckaya


Powered by EzPortal