avatar_kotan04

buton komutu

Başlatan kotan04, 20 Aralık 2012, 22:21:28

kotan04

merhaba arkadaşlar ete hocamızın buton komutuyla ilgili uzun bir yazısı vardı 3-4 farklı teknik kullanarak daha kullanışlı buton  örnekleri vermişti birtürlü bulamadım elinde olan varsa paylaşabilirmi?

kotan04

diğer sitelerede baktım bulamadım :s halla halla nereye gitti bu :)

hasanemmii

#2
Buton komutunu kullanmana gerek yok.
Örnek:
Dİyelim ki PORTB.0 pinine led bağlı
PORTB.1 pinine de buton bağlıyacağız.
PORTB.1 pinini 10K dirençle +5V a bağla. (pull-up)
Yine aynı pin ile şase arasına buton bağla.
Bağlantı tamam. Şimdi gelelim komut yazılımına.
Butona basılıdığında ledi yaksın. Tekrar basıldığında ledi söndürsün.

TRISB=%00000010
PORTB.0=0                    'LED SONUK BASLASIN

BASLA:
IF PORTB.1=0 THEN       'BUTONA BASILDI ISE
TOGGLE PORTB.0           'LEDIN DURUMUNU DEGISTIR (YANIKSA SONDUR, SONUKSE YAK)
GOSUB BUTONBIRAK      'BUTONUN BIRAKILMASI ICIN VE BUTON ZIPLAMALARINI ENGELLENMESI ICIN ALT PROG YONLENDIRDIK.
ENDIF
GOTO BASLA

BUTONBIRAK:
PAUSE 50
IF PORTB.1=0 THEN BUTONBIRAK       'BUTON BASILI ISE BIRAKILMASINI BEKLE
RETURN                                              'GELDIGIN YERE GERI DON

Bu kadar işte.
Eğer programda pause süresi bazı işlemleri aksatacaksa bunun yerine sayaç kullanabilirsin.
Butonun bırakılmasını beklemek için WHILE WEND komutu da kullanılabilir.









Pic_877

Button komutu bir pinden buton okumak için kullanılır, if...then ile yapılan buton okumada ark sorunu yaşanır. Yani tam butona basarken kontaklar arası atlama olur buda parazit olarak pice aktarılır, atıyorum 1 saydırma yapacaksanız pic arktan dolayı 2 sayım yapabilir. Button komutunda böyle sorunlar yoktur.

Kod:
BUTTON okunacak pin,bağlantı çeşidi,gecikme,tekrar,değişken,işlev,etiket şeklindedir. Burada bağlantı çeşidi pull-up yada pull-down a göre belirlenir. Pull up ise butona basıldığında 0 olacağından 0 yazılır, pull-down da ise tam tersidir. Gecikme kısmı ve tekrar kısmı hassas işler için geçerlidir, kafa karıştıracağı için yazmıyorum ikisine 100 değeri yazılabilir, 0-255 arası bir değer yazabiliriz. Değişken buton okuma değişkenidir, programın başında degis var byte ve degis=0 şeklinde tanımlanıp sıfırlanması veya döngüye girerken sıfırlanması gerekir. İşlev kısmı basılıncamı yoksa elimizi çekincemi etikete gidilecek anlamına gelir. 1 yazılırsa basınca 0 yazılırsa elimizi çekince etikete gider. Etiket kısmına ise gidilecek etiket yazılır. Örnek yazılım:

degis var byte
degis=0


oku:
button porta.0,0,100,100,degis,1,led_1
goto oku

led_1:
portb.0=0
goto oku
.
.
.

gibi kullanılır.

kotan04

teşekürler saolun

MS_59

ete hocanın buton kullanımı ile ilgili yazısı
Alıntı YapProgramlarda Buton Kullanımı;
Her ne kadar Basic komutları arasında bir BUTTON komutu olsada komut
parametrelerinin çok fazla olması onu karmaşık ve anlaşılmaz bir komut
haline getirmektedir. Bu nedenle programcıların pek çoğu bu komutu
kullanmak yerine kendi kontrol birimlerini yaratmışlardır. Bende
bunlardan birisiyim. Şimdiye kadar Button komutunu hiç kullanmadım. Bana
çok anlamsız geliyor.
Buton (Ya da TUŞ) kontrolüne yakından bakacak olursak olayın bazı boyutlarının olduğunu görürsünüz. Nedir bunlar derseniz;
Birincisi işlemciye buton'a basıldığını nasıl anlatacağımızdır. Her
şeyden önce işlemci farkı ayrırt edebilir. O halde butona basmakla
basmamak arasında bir fark yaratmamız lazım gelir. İki türlü fark
yaratılabilir. Birincisi Buton pini LOW da beklerken butona basarak
buton pinine HIGH vermek, ikincisi ise tersi olarak buton pini High da
beklerken butona basarak pine LOW vermek şeklindedir.
Tavsiye olarak söylüyorum, daima buton pini High da beklerken butona
basarak pine LOW tatbik ederek çalışmaya kendinizi alıştırın. Bu size
bir çok avantaj sağlayacaktır.
Genelde PortB pinleri dahili olarak Pullup lıdır ve istenildiği taktirde
bu pullup direnci aktif edilebilir. Alın size hazır pullup yapılmış
pinler işte. Bağlayın butonlarınızı ve butonların diğer uçlarını verin
GND ye hepsi bu. Böylece direnç kullanmadan direk buton
kullanabilirsiniz. Ayrıca genelde ana karttan uzakta yer alan butonlara
GND çekmek +5V çekmekten daha kolaydır. Bu nedenle Buton pinlerini daima
pullup ile kullanınız.

Olayın ikinci boyutu program içinde buton kullanım şeklinizdir. Buton
ya sürekli basılı tutularak kullanılır Ya da basıp bırakılarak
kullanılır. Her iki kullanım şeklide yaygındır ve amaca göre seçilir.
Burada her iki kullanım şeklinede örnek vererek açıklamayı
genişleteceğim. Öncelikle sürekli basılarak yapılan buton kullanım
şekline bir bakalım;
Diyelimki bir SAAT ayarı yapıyoruz. Butona bastıkça saat değişecek.
Ancak bas bırak bas bırak şeklinde çalışırsak bu iş uzun zaman
alacaktır. Halbuki bir an evvel saati ayarlamak istiyoruz. O halde
sğrekli basma metodunu burada kullanır ve bastıkça kesintisiz saat
değerini artırabilriz. Nasılmı ? Aşağıdaki şekilde;

While TUS=0 'tuşa basılı tutulduğu müddetçe
SAAT=SAAT+1
IF SAAT=60 Then SAAT=0 'saat maksimum değeri geçince yeniden başa dönsün
PAUSE 50
GOSUB EKRAN 'burada ekran alt programına gidip saat değerini gösteririz.
WEND
Tuşa basılı tutulduğu müddetçe program While – wend arasında gidip gelecektir.

Şimdi de Bas bırak sistemine ait bir örnek verelim. Bazı programlarda
da Butona yalnızca bir kere basılması ve hemen bırakılması istenir.
Mesela bir ayar menüsüne girdiniz ve ayar bittiğinde Kayıt (Ya da SEC)
tuşuna basılarak yapılan ayarların kayıt edilmesi istenir.
Ancak aynı Buton sizi programın başlangıcında AYAR kısmınada taşıyan
butondur. Yani başlangıç kısmında SEC butonuna basılınca Ayar kısmına
gidersiniz ve ayarlar bitincede aynı SEC tuşu ile yapılan ayarları kayıt
edip ayar menüsünden başlangıç kısmına geçersiniz.
Ayar kısmından başlangıca giderken eliniz hala SEC butonu üzerinde
olursa program yeniden ayar menüsüne geçer. Bu ,stenmeyen bir durumdur.
İşte bu konumda yalnızca bir kere buton komutu çalıştırılmalıdır. O
halde bir şekilde butona basıldığını algılayacak ama sonrasında butonun
bırakılmasınıda beklememiz gerekiyor. İşte komutlar;

IF TUS=0 Then
GOSUB KAYIT
While Tus=0: Wend
pause 50
GOTO BASLA
Endif
Görüldüğü gibi önce tusa basılmışmı onu test ediyoruz. Sonra basılmış
ise kayıt kısmına gidip ayarları kayıt ediyoruz oradan döndükten sonra
hala tusa basılıyormu onu test ediyor ve basılı olduğu müddetçe programı
oraya hapsediyoruz. Taaki tuş bırakılıncaya kadar sonra gecikmemizi
verip başa dönüyoruz.
Hepsi bu kadar.
mehmet

kotan04

proteus süpersin foruma bu kaybolmuş yazıyı kavuşturduğun için teşekürler

dnaci

Birde buton kullanımını süreye bağlı çalışması var. Örneğin 3 saniye butona basarsanız çalışan bir sistem için örnek kod ;

http://elektroinfo.blogspot.com/2011/12/pic16f628a-ile-3-saniye-iptal-butonu.html

Linkteki yorumlarda da güzel örnekler var.

kotan04

çok saolun teşekürler

MS_59

#9
iki butona birden basınca belirleyeceğiniz gecikme ile menüye gireceğiniz yada herhangi bi işlem yapacaksanız aşağıdaki gibide yapabilirsiniz

IF buton1=1 AND buton2=1 THEN  ;buton1 ve buton2 birlikte basılı ise
WHILE buton1=1 AND buton2=1
PAUSE 10
SURE=SURE+1
IF SURE=200 THEN MENU  ;10X200=2000    2 Saniye geçti ise menüye git
WEND
mehmet

ferruh

SELAM..
BENDE BUTONLA ILGILI BIR SORUN YASIYORUM..4 BUTON VAR  3 LED VAR
1 BUTON 1 LEDI YAKACAK 2 CI BUTONDA 1 LEDI YAKACAK.
3 BUTON 3 LEDI YAKACAK 4 CU BUTONDA 3 CU LEDI YAKACAK FAKAT 2Cİ BUTON ILE 3CÜ BUTONA AYNI ANDA BASILDIGINDA  2 CI LED YANACAK

  IF BUTON1=0 THEN HIGH LED1
  IF BUTON2=0 THEN HIGH LED1
  IF BUTON3=0 THEN HIGH LED3
  IF BUTON4=0 THEN HIGH LED3
  IF BUTON2=0 AND BUTON3=0 THEN HIGH LED2

ŞEKLİNDE  FAKAT BİR TÜRLU OLMUYOR NEREDE HATA YAPIYORUM  TEŞEKKÜRLER

MS_59

programın hepsini buraya koyda isis şeması bas dosyası vs. bakalım
mehmet

F®T

aslında mantığın doğru ama geri kalanlar ne ise orda sorun olabilir. :D
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Alıntı YapSELAM..
BENDE BUTONLA ILGILI BIR SORUN YASIYORUM..4 BUTON VAR  3 LED VAR
1 BUTON 1 LEDI YAKACAK 2 CI BUTONDA 1 LEDI YAKACAK.
3 BUTON 3 LEDI YAKACAK 4 CU BUTONDA 3 CU LEDI YAKACAK FAKAT 2Cİ BUTON ILE 3CÜ BUTONA AYNI ANDA BASILDIGINDA  2 CI LED YANACAK

Mesajları lütfen büyük harfle yazmayın.  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

IF BUTON1=0  OR  BUTON2=0 THEN  LED1=1
IF BUTON2=0  AND  BUTON3=0 then LED2=1
IF BUTON3=0 or BUTON4=0 THEN LED3=1


Ete

ferruh

hocam çok teşekkür ederim..emeğinize sağlık  büyük harf içinde kusura bakmayın anlaşılır olması içindi.. :(

Powered by EzPortal