tus kontrolü nasıl yapılıyor ....

Başlatan bahdiyarusta, 26 Şubat 2013, 18:22:53

bahdiyarusta

arkadaslar benım amacım porta dakı  ıkı buton ile portb deki iki ledi start stop olarak yakmak istiyorum deneme olarak bir kanal start stop yapmaya çalıştım ama düzensiz çalışıyor yardımınızı beklıoyrum
<<<***bahdiyarusta****>>>
                  - 66 -

F®T

BASLA:
    IF  TUS1=0   THEN
    toggle portb.0
    WHILE   TUS1=0
    wend
    endif     
    GOTO BASLA
    END
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Bir tuş kontrolü gerçekleştirmeden önce bazı açıklamaları dikkate almak gerekir.
Bir tuşun pic pinine bağlanmış olması yetmez. Tuşa basılıp basılmadığını anlamak için tuş pininin konum değiştirmesi gerekir.
Yani pin önceden (tuşa basılmadan önce) bir konumda duruyor ise basıldıktan sonra bir başka konuma geçmelidir. Böylece pic basıldığını kolaylıkla anlar tabiiki program bunu anlayacak.

Microchip firması tuş bağlantılarını sorunsuz şekilde yapabilmeniz için B portuna özellkler kazandırmıştır. En önemliside dahali pullup dirençleridir. Bu dirençleri OPTION_REG.7=0 komutu ile aktif hale getirebilirsiniz.
Böylece giriş olarak ayarlanmış tuş pini HIGH konumuna çekilmiş olur. Sonrasında size düşen tuşa basılınca pin'e LOW verdirmek olacaktır. Bunuda tuşun diğer ucunu GND ye bağlayarak yapabilirsiniz. Böylece tuş dan başka ilave malzeme kullanmadan tuş kontrol donanımını sağlamış olursunuz.
Tuş kontrolü iki şekilde yapılır. Birincisinde tuşa basıldığı anda bir başka çıkışın kalıcı olarak aktif edilmesidir.
Kalıcı diyorum çünki tuşu bıraksanızde çıkış pini değişmeyecektir. Buna Toggle çalışma deniliyor.
İkinci şekilde ise çıkış pini tuşa basılı tutulduğu müddetçe aktif olur tuşu bırakınca eski konumuna döner. Bunada ben bas-Bırak çalışma diyorum.

Şimdi ikisinde örnek vereceğim. Aslında daha farklı kullanımlarda mevcut.  Bunlarada örnek vereceğim.
1. Toggle Çalışma Örneği

IF TUS=0 THEN
   TOGGLE LED
WHILE TUS=0:WEND
ENDIF

Kod içinde yer alan While wend satırını kullanmazsanız program sürekli başa dönüp siz tuşu bırakıncaya kadar aynı kodu defalarca çalıştırır ve orada görülen LED yanıp yanıp söner. While wend döngüsü ise tuşu bırakıncaya kadar programı bloke eder. Hatta bazen endif komutundan sonra 50 ms lik bir gecikme de koymak fayda sağlar.

2. Bas-bırak Çalışma Örneği

IF TUS=0 then
   LED=1
WHILE TUS=0:WEND
   LED=0
ENDIF

Burada da endif satırından sonra biraz gecikme vermek faydalı olabilir.

3. Tuşa basınca zamana bağlı işler yapma örneği. Diyelimki Tuşa bastıktan sonra led hemen yansın ama 100ms içinde tuşu bırakırsam led sönsün. Bu süreyi geçirirsem led sönmesin.

IF TUS=0 then
   LED=1
   While Tus=0
      SURE=SURE+1
      PAUSE 1
   Wend
    IF SURE<100 THEN LED=0
ENDIF 

Şimdilik aklıma gelenler bunlar. Umarım faydası dokunmuştur.
Ete

bahdiyarusta

<<<***bahdiyarusta****>>>
                  - 66 -

toprak

Tuş ile ilgili yukarıdaki uygulamalar güzeldi. Aklıma gelirse ekleyeceğim.
Tuşa basma işlemi olan devrelerde ark önlemek için hangi yöntemleri kullanabiliriz hocam.
Kişi kesinliklerle başlarsa gideceği yer kuşkulardır, ama kuşkularla başlayacak kadar doygun ise kesinliklere ulaşır.

ete

Ark denilen şey çok kısa bir süre içinde aynı tuşa çok miktarda basılıp bırakılması olayıdır. Tuş kontrollerinde tuşa basıldığı anda hızlı çalışan program ilk baılışı yakalar. Bu anda ikinci defa basılmayı programa şart koyarak önlersen ark olayı oluşsa bile program bunu görmez ve bir müddet sonra ortalık süt liman olacağından sorunda ortadan kalkmış olur. Peki ikinci defa basılmayı nasıl önlerim? İlk basılmayı yakaladıktan sonra bir while- wend döngüsü bunu sağlar. Yada tuşu yakaladıktan sonra ortalama 100 ms lik bir gecikme koyarsanız o süre zarfında program orada bekler ve ilave basılmaları göremediği için yine sorun ortadan kalkar. Toparlarsak , ark etkisini kaldırmak için ilk basılıştan sonra tuş kontrolünü durdurmak (gecikme veya tuşun bırakılmasını bekleyen while wend döngüsü+gecikme ile) veya bir şekilde programı orada bloke etmek gerekir.
Yukarıdaki örneklere birazda gecikme ilave edersen hepsi arkdan korunmuş olurlar.
Ete

toprak

Ark önlemeyi bir programda şu şekilde yapmıştım.
If TUS1=0 Then
     TUS=1
     While TUS1=0
     LED=1
     Wend
     LED=0
     GoSub ZAMAN
     TUS=0
  EndIf


Yukarıdaki şekilde tuşa bastıktan sonra basılı olduğu sürece while wend döngüsünde program bekleyecektir. Bu şekilde ark önlenemeyebilir. Ark oluşursa program devam edip aynı yere ikinci defa dönebilir.
Fakat aşağıdaki şekilde belli bir miktar zaman koyarsak ilk algılamadan sonra bekleme olacağı için ark için ortam ortadan büyük bir oranda kalkar.
If TUS1=0 Then
     TUS=1
     While TUS1=0
     LED=1
     Wend
     Pause 100
     LED=0
     GoSub ZAMAN
     TUS=0
  EndIf
Kişi kesinliklerle başlarsa gideceği yer kuşkulardır, ama kuşkularla başlayacak kadar doygun ise kesinliklere ulaşır.

enginkanat

Kimse kusura bakmasın yaş geldi geçiyor, bazı konuları anlamakta zorluk çekiyorum. Belliki bunun en büyük nedeni sigara, Bu tuş okuma işini bir türlü beceremedim. Yani matrix ten bahsediyorum. Dahili pull up nasıl kullanılr? PORTB kesmesi kullanırsam PORTB ye bağlı bir tuşa bastığımda sistem kesmeye gidecek fakat devamını nasıl getireceğim, Mesela hali hazırda çalışan bir adım motorum var, Bu motor PORTA.0 dan gelen her bir giriş ile 110 adım atıyor. ben keypad aracığı çalışmayı durdurmadan 120 adıma çıkarmak istiyorum. 4x3 telefon tuş takımı mesela. değeri girip "*" tuşuna bastğım anda bu motor 110 adımdan girdiğim değere, mesela 120 adıma çıksın. Lakin ben "1","2","0"ve"*" tuşalarına basana kadar PORTA.0 dan her sinyal girişinde 110 adım ile devam etsin.


ete

Sorduğun sorulara bakarsan bu programlama işi henüz kafana oturmamış ve sen bilgi seviyenden daha fazlasını gerektiren işlerle uğraşıyorsun. Hal böyle olunca anlatılanların birini anlasan bile bir çok eksiğin olduğu için olay kafana oturmuyor.
Daha dahili pullup nasıl açılır bilmediğine göre epeyce gerilerdesin demektir. Bu iş senin dediğin gibi yaşa bağlı anlamama değil bilmediğin bir çok şeyi birden kavrayamama olayıdır. Bu nedenle adım adım ilerlemen daha doğru olur kanaatindeyim.
Dahili pullup dirençlari Portb de yer alır ve pek çok işlemcide OPTION_REG.7=0 komutu verilerek aktif edilir. Yeni nesillerin bazılarında ayrıca wpu denilen bir registeride set etmek gerekir.

Birtuşa basılınca programı kesmeye götürdükten sonra ne yapacağını kendin bileceksin biz değil. Bu konuda yapılmiş bir sürü örnek var bunlar sana ışık tutar sanırım. Bu soru çok genel olmuş cevabıda ancak böyle verilirsi sanırım. Ortada bir amaç olmayınca ne yapılacağını ancak soruyu soran bilir düşüncesindeyim.

Matrix tuş takımı mantığınıda bir çok kere izah ettim son derece basit aslında yeniden söyleyeyim.
Telefon tuş takımında 3 adet dikey hat ve 4 adet yatay hattın var. Tuşun birine bastığın zaman o tuşun bir ucu yatayda diğer ucu ise dikeyde olduğundan yatay hat ile dikey hat tuş üzerinden kısa devre olur. İşte işin püf noktası burasıdır. Hatlardan birini giriş yapıp , pullup lı olarak bekletsem ve diğer hattı ise low yapsam tuşa basıldığında high da bekleyen giriş hattı hemen tuş üzerinden low olacaktır. Programda bunu görüp basılan tuş şudur diyecek ve ona göre işlem yapacaktır. Örnek vermek gerekirse yatay-1 ile dikey-1 kısa devre ise basılan tus=1 dir. Yatay-1 ile dikey-2 çakışmış ise basılan tus=2 diye karar alınacaktır. Gerisi artık on tabanına göre sayı oluşturmaktan başka bir şey değil. Onuda Rakam= Rakam * 10 + Tus. Formülü ile yapıyoruz.

Senin adım motoru meselesini programı vermeden çözmek mümkün değil. Kendin bu açıklamalardan sonra bir şeyler yaparsın artık.
Ete

Powered by EzPortal