Buton Kontrolü

Butonlar ve anahtarlar mikrodenetleyiciye (veya Lojik devreye) giriş pini üzerinden lojik “1” veya lojik “0” olarak bilgi girişini sağlayan mekanik elemanlardır.

Konum geçişlerinde kontak sıçraması olarak bilinen ark (debuance) oluşur. Bu ark değişik devrelerle giderilebildiği gibi yazılımla da giderilebilir.

Buton Bağlantı Şekilleri

Buton veya anahtarlar lojik devreye bağlantı şekline göre iki şekilde bağlanır.

1. Pull-up dirençli Low aktif (Low Active) bağlantı

2. Pull-down dirençli High aktif (High Active) bağlantı.

Buton bağlantı şekilleri

Pull-up (yukarı çek) bağlantıda MCU girişine direnç vasıtası ile Lojik “H” gelmektedir. Butona basıldığında H’dan L’a düşer. Dolayısı ile mcu girişi “L” olur. Bu bağlantıya low aktif bağlantı ismi verilir.

Pull-down (aşağı çek) bağlantıda mcu girişi direnç üzerinden “L”‘a bağlıdır. Butona basıldığında mcu girişine “H” uygulanır. Bu bağlantı şekline de High  aktif bağlantı ismi verilir.

Mikrodenetleyicilerde bazı portların dahili pull-up/pull-down bağlantıları vardır. Mesela PIC16F628A mikrodenetleyicisinde  PORTB giriş olarak ayarlanırsa OPTION_REG.RBPU biti “0”(7.bit)  yapılırsa PORTB’deki girişlerde dahili pull-up aktif edilmiş olur.  STM32F4 mikrodenetleyicisinde girişler dahili pull-up veya pull-down olarak ayarlanabiliyor.

Buton Arkı (Debuance)

Butonlar mekanik elemanlar olduğundan buton pinleri birleştirildiğinde (butona basıldığında) elektik atlaması (ark) oluşur. Bu ark sonucu mcu girişine yüzlerce defa farklı lojik bilgi gidebilir. Bu ise istenmeyen bir durumdur.

Buton ark oluşumu

Donanım Ark (debuance) Önleme Devreleri

Mikrodenetleyicilerde buton arkı önlemek yazılımla mümkündür. Ama lojik devrelerde bu mümkün değildir. Dolayısı ile mutlaka bir ark önleyici devre ile buton girişi yapılmalıdır. Bir uygulamada TTL entegrelerle sayıcı devresi yapmıştım. Sayma için kullanılan buton teker teker attırmıyordu. Bu problemi 555 entegre devresi ile( debuance önleme devresi) sağlamıştım. Aşağıda örnek devreler görülmektedir.

   

Buton ark önleme devreleri

 butondebuance_cap470nf_devre  butondebuance_cap470nf

Buton uçlarına kondansatör bağlayarak ark önleme

Yazılımla Ark (Debuance) Önleme

MikroC’nin buton ve anahtar uygulamalarında, oluşan arkın giriş olarak algılanmasını engellemek için kullanılan bir fonksiyonu vardır. Bu fonksiyonun kullanımı şöyledir;

Button(&PORTB, 0, 180, 0)  // RB0'a bağlı buton 180 ms süresince aktif Low
/*
  Button    Fonksiyon adı
  &PORTB    Butonun bağlandığı port
  0         Butonun bağlandığı pin numarası
  180       ms saniye cinsinden bekleme süresi(max değer 255)
  0         low aktif (yani butana basıldığına mcu girişi L
*/

Özetle; butona basıldığı andan itibaren girişi lojik “0” yapar ve 180ms bekleme yaparak başka giriş kabul etmez.

Not: Bu fonksiyonun kullanılabilmesi için Library Manager’de Button seçili olmalıdır.

MikroC Buton Uygulaması 1

Bu iki uygulamada PORTA’nın 0.pinine bağlı olan low aktif buton ile PORTB’ de binary sayma gerçekleştirilecektir.

#define TEST Button(&PORTA, 0, 180, 0) // TEST isminde buton tanımlandı
//------------------------------------------
void main()
{
  CMCON=7; // PORTA dijital yapıldı
  TRISA=1; // PORTA'nın 0.pini giriş diğerleri çıkış
  TRISB=0; // PORTB çıkış
  PORTB=0; // PORTB çıkış pinleri lojik "0" yapıldı
  while(1)
  {
    if(TEST) PORTB++; // eğer TEST butonuna basıldıysa PORTB'yi 1 arttır.
  }
}

MikroC Buton Uygulaması 2

#define TEST Button(&PORTA, 0, 180, 0) // TEST isminde buton tanımlandı
//------------------------------------------
bit ButonKonum; // Buton konumuyla ilgili bayrak tanımlandı
void main()
{
  CMCON=7; // PORTA dijital yapıldı
  TRISA=1; // PORTA'nın 0.pini giriş diğerleri çıkış
  TRISB=0; // PORTB çıkış
  PORTB=0; // PORTB çıkış pinleri lojik "0" yapıldı
  while(1)
  {
    if (TEST) // Butona basıldığını tespit etmek için
    {
      ButonKonum = 1; // buton bayrağını güncelle (butona basılmış durumda)
    }
    if (ButonKonum && !TEST) // butona basılıysa ve önceki durumu basılı ise
    {
      PORTB++; // PORTB'yi 1 arrttır
      ButonKonum = 0; // buton bayrağını güncelle
    }
  }
}

Bir Butonu Birden Fazla Görevler İçin Kullanma

Bu uygulamada aynı devre üzerinde TEST butonuna kısa basmada PORTB’nin çıkışları 0xAA değerini alacak uzun basmada (yaklaşık 3sn) PORTB çıkışları 0xFF olacaktır. 5 saniye sonra PORTB çıkışları sıfırlanacaktır.

#define TEST Button(&PORTA, 0, 10, 0) // TEST isminde buton tanımlandı
//---------------------------------------------------------------------
bit ButonKonum; // Buton konumuyla ilgili bayrak tanımlandı
char sayac=0;   // 1-bytelık değişken tanımlandı
void main()
{
  CMCON=7; // PORTA dijital yapıldı
  TRISA=1; // PORTA'nın 0.pini giriş diğerleri çıkış
  TRISB=0; // PORTB çıkış
  PORTB=0; // PORTB çıkış pinleri lojik "0" yapıldı
  while(1)
  {
    if (TEST) // Butona basıldığını tespit etmek için
    {
       ButonKonum = 1; // buton bayrağını güncelle (butona basılmış durumda)
       while (ButonKonum && TEST) // butona basılıysa ve önceki durumu basılı ise
       {
          sayac++; // PORTB'yi 1 arrttır
          if(sayac==30) ButonKonum = 0; // eğer sayac 30 ise (30*(90+10)=3000ms) döngüden çık
          Delay_ms(90);
       }
       ButonKonum=0;
       if(sayac<30) PORTB=0xAA;
         else       PORTB=0xFF;
       Delay_ms(5000);
       PORTB=0;
       sayac=0;
    }
  }
}

Proje dosyalarını buradan indirebilirsiniz.

Kaynaklar:

http://www.ikalogic.com/de-bouncing-circuits/

http://www.555-timer-circuits.com/switch-debounce.html

http://commons.wikimedia.org/wiki/File:Rc-switch-debouncer.png

http://www.mikroe.com

Reklamlar

11 thoughts on “Buton Kontrolü

  1. Çok denedim buton kontrolünü ama bir türlü istediğim gibi olmadı. Arktan haberim bile yoktu. Buradaki kodlar işimi görecek gibi. Blog çok güzel olmuş, anlatımına göre tekrar deneyeceğim. İyi çalışmalar.

  2. Tamam o şekilde deneyeceğim. Kondansatör kullanırsak yazılımsal olarak müdahale etmeye gerek yok sanırım.

  3. Dostum 1mhz dahili osilatör kullanıyorum. 200ms gecikmeyle çözdüm işi. Şimdi kondansatör kullanıp gecikmeyi yavaş yavaş azaltacağım. En kararlı çalıştığı aralığı tespit edeceğim. Ama sonuç itibariyle sorun çözüldü. Teşekkür ederim.

  4. Bir şey daha danışmak istiyorum. Pice ilk enerji verdiğimde garip bir şey oluyor. 3 adet kalem pille ya da 5voltluk adaptörle de aynı şey oluyor. Reset attıyorum düzelmiyor, enerjiyi kesip bağlıyorum bir kaç sefer kafasına göre bazen düzgün bazen hiç çalışmıyor. İlk enerji verme sırasında dalgalanma vs oluyormuş sanırım bundan kaynaklandığını düşünüyorum nasıl bir çözüm getirebiliriz.

  5. Merhaba,bir pic devresi yapmak istiyorum.yardımcı olursanız sevinirim.
    devrenin amacı:yukarı-aşağı- ve reset düğmesi olacak. çıkışlarda 6 adet led yanacak. yukarı düğmesi bir ileri giderek sırayla 1.,2.,3. ledi yakacak.aşağı düğmesine her bastığımda da 1 led sönecek.reset ise program sonlanacak(sıfırlanacak.)
    Sorular:
    1-Hangi pic entegre kullanmalıyım?(16f628-16f84.. gibi
    2-devre şeması (isis şeması)
    3-baskı devre şeması(Ares)
    Teşekkürler

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s