Jump to content
Devre Forum
  • Kaydol
şenol eker

Düşen kenar yükselen kenar

Önerilen İletiler

Buton algılamada hep bir sıkıntı olur. Nedir işin aslı? Düğmeye basınca bunu "bir" görmeli, ne kadar basılı tutarsam tutayım, ne kadar kısa basarsam basayım. Ama aynı zamanda da kaza ile basılmış gibi davranmasın.

Bunun için "düşen / yükselen kenar" terimlerini öğrenelim bilmiyorsak:
Eğer bir noktada sinyal 0'dan 1'e çıkıyor ve sonra tekrar 0'a düşüyor ve öyle kalıyorsa:
0'da durduğu sürece "seviye 0" olur.
Tam 1'e çıkarken "yükselen kenar" olur
1'de dururken "seviye 1" olur
Tam 0'a düşerken "düşen kenar" olur.
Butonu devreye bağlarken butonun bir ucunu şaseye, diğer ucunu işlemcimize bağlayacağız, işlemcimizin bu ucunu da bir dirençle + ya bağlayacağız. Buna "pullup" denir. Çok işlemcide bu pullup dirençleri istendiğinde devreye alınacak şekilde içeride bulunabilir. Bunu bilmiyorsak dışardan bir direnç takabiliriz.

Peki butonu ne zaman algılamak isteriz? Basınca algılamak isteyebiliriz. Basılı iken algılamak isteyebiliriz. Ya da bırakırken algılamak isteyebiliriz.
Sanırım en çok işe yarayacak olan, "bastığımız anda" algılanması. Yani "düşen kenar" oluyor burası.
Normalde dirençten dolayı pinimiz "1" çünkü. Butona bastığımızda "0" oluyor ve biz 1'den sıfıra düşmesini algılayacağız.
Normalde bu işler kesmelerle yapılır ama biz burada mantığı anlatmak istediğimizden "tuş basılana dek bekleyen" bir kod yazacağız sadece. Başkaca sorunuz olursa aşağıda sorarsınız.
Kenar algılamada, butonun "önceki halini" bilmemiz gerekir. Bunun için bir değişken tutacağız. Bunun  adı "p" olsun.
 

char p;

Pinimizi de "pin" diye tanımlamış olalım. Ya da en iyisi burada bir örnek olarak PORTB.2 olsun.

#define button PORTB.2;

Artık programımızı yazabiliriz:

void tusbekle (void)
{
  while (1)
  {
    p=button; //butonun ilk halini alıyoruz.
    while (p==button); // Buton aynı durumda olduğu sürece bekliyoruz.
    if (!button)exit; //Eğer buton sıfır ise, çıkıyoruz.
  }
}

Tabii sizin kullandığınız işlemci ve dil bundan farklı olabilir ama sonuçta mantık aynı. Anlaşılmayan bir yer varsa lütfen sorun. 
 
 

İletiyi paylaş


İletiye bağlantı
Sitelerde Paylaş

Peki Button debounce ( Button Arkı )Olayını yazılımsal ve Donanımsal olarak çözümümüz nasıl olmalıdır.

İletiyi paylaş


İletiye bağlantı
Sitelerde Paylaş
azmi, 7 saat önce yazdı:

Peki Button debounce ( Button Arkı )Olayını yazılımsal ve Donanımsal olarak çözümümüz nasıl olmalıdır.

Güzel bir soru :)
Aslında devamda bahsedeceğim birinci konu buydu. Ardından da "basılı tuttuğumuzda tekrarlama nasıl olacak" gelecek.

Debounce, butona bastığımızda "basılı" duruma geçerken bir ya da birkaç kez baslılı durumdan çıkması ve tekrar girmesi, dolayısı ile sanki defalarca butona basıp bırakmışız gibi bir sonuç çıkmasıdır. Bunu engelleyeceğiz, ama bunu yaparken butona üst üste hızlı hızlı bastığımızda tümünü algılayabilmeliyiz. Yani öyle kritik bir zaman olmalı ki, butona bu kadar hızlı basıp bırakamayacağımız kadar kısa, ama buton ark süresinden daha uzun bir süre seçmeliyiz.
Örneğin saniyenin onda biri, yani 10 milisaniye bu iş için uygun gibi görünüyor. Butona saniyede on kez basmamız mümkün değil, ama buton arkı bu kadar uzun olmaz.

O halde yapmamız gereken, butona basılmada 10 milisaniye altındaki hareketleri gözardı etmekten ibarettir. Bunu da bekleme satırının yani

while (p==button);

satırının sonuna 10 milisaniye bekleme eklemekten ibarettir.

while (p==button);delay(10);

Burada neler olacak:
Bu satıra geldiğinde while buton basılana dek bekleyecektir. Buton basıldığı anda buradan çıkacak, 10 milisaniye bekleyecek ve bu sırada arklanma tamamlanmış olacaktır.

İletiyi paylaş


İletiye bağlantı
Sitelerde Paylaş
Misafir
Bu konuyu yanıtla

×   Yapıştırdığınız içerik biçimlendirme içeriyor.   Biçimlendirmeyi Temizle

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Önceki içeriğiniz geri yüklendi.   Editör içeriğini temizle

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Yeni Oluştur...

Önemli Bilgilendirme

Facebook / Twitter / Google hesabınızla kolayca kaydolup cevap verebilir, soru sorabilir, istekte bulunabilirsiniz.
Devam etmeniz, forum kurallarını kabul ettiğiniz anlamına gelir.            Forum Kuralları