Ardunio Up-Down Counter Debounce

Başlatan veliusta, 15 Nisan 2015, 01:57:18

veliusta

byte sayac=0;

void setup(){
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop(){
  if(digitalRead(2)==LOW){
    if((sayac>=0 && sayac<=9)){
    sayac++;
    Serial.println(sayac);
 }
}
  if(digitalRead(3)==LOW){
    if((sayac>1 && sayac<=10)){
    sayac--;
    Serial.println(sayac);
  }
 }
}


Buton Filtresi Yapmam gerekiyor. Yaparmısınız?
Buton parazitleri ve ani basmaları önlemek için.

skara1214

Herkes ölür ama herkes gerçekten yaşamaz

selimkoc

https://elektrokod.wordpress.com/2013/11/18/buton-kontrolu/

Donanım olarak ark önleme yaptığınızda yazılımsal bir şey yapmaya gerek kalmaz.

JOKERAS

Selam,

Bu tip işler için Port Change interrupt'ı kullanmanızı öneririm.
Debounce olayını anlamanın en iyi yolu Toggle led yaparak anlaşılır.
Eğer kod düzgün çalışıyorsa tam kararlı oluyor.

selimkoc arkadaşın önerdiği yöntem donanımsal olarak yapılan yöntem,donanım bağımlı,bir süre sonra
buton laçkalaştığında kararsızlık gösterebilir!

Bir direnç ile pullup yapılmış buton portu ile ilgili  Port change interrupt'ı kur,
her düşen kenarda(butona bastığınızda) interrupt oluşur,bu basma anında sayısız 1 ve 0 gelir,
tam bu sırada bir timer kurarak saymaya başlayıp geçen makul bir süre kadar timer sayar ve kararınızı verirsiniz.
Bu gelen gerçekten 0'mı?O halde butona basılmış demektir.
Aynı işlemin tersini tuş bırakma durumu içinde yapmalısınız,çünkü aynı buton arkı tuşu bırakırkende oluşur.

Buton filitresi düzgün olduktan sonrası çok kolay.




selimkoc

#4
Alıntı Yapselimkoc arkadaşın önerdiği yöntem donanımsal olarak yapılan yöntem,donanım bağımlı,bir süre sonra
buton laçkalaştığında kararsızlık gösterebilir!

Eğer buton laşkalaştıysa ömrünü doldurmuş demektir. Değiştirilmesi gerekir. Donanım olarak kararlılık sağlayamadığınız bir butonla yazılımsal kararlılık çok daha zor sağlanır.

İnterrupt önemli durumlarda kullanılır.

Endüstriyel bütün cihazlarda önce donanımsal kontrol sağlanır daha sonra yazılımsal kararlılık sağlanır.

https://www.picproje.org/index.php?topic=46371.0

http://www.labbookpages.co.uk/electronics/debounce.html

mehmet

Bunu deneyiniz...
//Butonlar
#define BTN_A   2
#define BTN_B   3
#define BTN_C   4
#define BTN_D   5

// Debounce sayacı
#define BTN_DLY1    10

// Buton değeri ve durum degişkenleri
uint8_t BTN_A_Basildi = 0;
uint8_t BTN_B_Basildi = 0;
uint8_t BTN_C_Basildi = 0;
uint8_t BTN_D_Basildi = 0;

uint8_t BTN_A_deger = 0;
uint8_t BTN_B_deger = 0;
uint8_t BTN_C_deger = 0;
uint8_t BTN_D_deger = 0;

//------------------------------------------------------------------------------
//
uint8_t Hangi_Button(void)
{
    uint8_t btn_yolla = 0;

    BTN_A_Basildi = 0;
    BTN_B_Basildi = 0;
    BTN_C_Basildi = 0;
    BTN_D_Basildi = 0;

    if(BTN_A == LOW)
    {
        if(BTN_A_deger++ > BTN_DLY1)
        {
            BTN_A_Basildi = 1; //işi bitince ilgili alanda bu değişken sıfırlanacak
            btn_yolla = 1;
            BTN_A_deger = 0;
        }
    }

    if(BTN_B == LOW)
    {
        if(BTN_B_deger++ > BTN_DLY1)
        {
            BTN_B_Basildi = 1; //işi bitince ilgili alanda bu değişken sıfırlanacak
            btn_yolla = 2;
            BTN_B_deger = 0;
        }
    }

    if(BTN_C == LOW)
    {
        if(BTN_C_deger++ > BTN_DLY1)
        {
            BTN_C_Basildi = 1; //işi bitince ilgili alanda bu değişken sıfırlanacak
            btn_yolla = 3;
            BTN_C_deger = 0;
        }
    }

    if(BTN_D == LOW)
    {
        if(BTN_D_deger++ > BTN_DLY1)
        {
            BTN_D_Basildi = 1; //işi bitince ilgili alanda bu değişken sıfırlanacak
            btn_yolla = 4;
            BTN_D_deger = 0;
        }
    }
    return btn_yolla;
}

//------------------------------------------------------------------------------
//
void setup() 
{
  pinMode(BTN_A, INPUT_PULLUP);
  pinMode(BTN_B, INPUT_PULLUP);
  pinMode(BTN_C, INPUT_PULLUP);
  pinMode(BTN_D, INPUT_PULLUP);
  
  Serial.begin(9600); 
}

//------------------------------------------------------------------------------
//
void loop() 
{
  switch(Hangi_Button())
  {
    case 1:
      Serial.print("Birinci butona basildi.\n\r");
      BTN_A_Basildi = 0;
      break;
    
    case 2:
      Serial.print("İkinci butona basildi.\n\r");
      BTN_B_Basildi = 0;
      break;
    
    case 3:
      Serial.print("Ucuncu butona basildi.\n\r");
      BTN_C_Basildi = 0;
      break;
    
    case 4:
      Serial.print("Dorduncu butona basildi.\n\r");
      BTN_D_Basildi = 0;
      break;
      
    default:
      break;
  }

}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

JOKERAS

Buton okumak önemsiz bir işmi?
Port change donanınımın işlemcilerde olmasının en önemli nedenlerinden biride buton okumalarında kullanılmaktır.
Özellikle matrix buton okumalarda çok fayda sağlar.

Bu olay yazılımsal olarakta yapılabilir,ama yazılım büyüdükçe yazılım gecikmeleri işi cılkından çıkartır.
Kullandığımız işlemciler seri işlem yapan işlemciler olduğu için bu tip durumlar için interrupt olmazsa olmazdır!

Öyle butonlar varki...
200-300 basışta laçkalaşıyor,ne yapacağız o zaman,durmadan butonmu değiştireceğiz?
Butonun mekanik olarak laçkalşması yazılımın kararını bozmaz,sistem aynı kararlılıkta çalışmaya devam eder.

Butona 100nf bağlamak direnç bağlamak buton kontaklarındaki sıçramaları arkları en aza indirir,tamamen yok etmez!
Endüstriyel uygulamalarda bunlar zaten yapılır buradaki amaç buton arklarını azaltmak,yok etmek değil.
Ayrıca Elektroniğin endüstriyeli endüstriyel olmayanı diye bir kavram yoktur bence.
Kritik olan ve olmayan durumlar vardır hepsi o.