Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: veliusta - 15 Nisan 2015, 01:57:18

Başlık: Ardunio Up-Down Counter Debounce
Gönderen: veliusta - 15 Nisan 2015, 01:57:18

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.
Başlık: Ynt: Ardunio Up-Down Counter Debounce
Gönderen: skara1214 - 15 Nisan 2015, 10:28:36
delay at 200 ms falan
Başlık: Ynt: Ardunio Up-Down Counter Debounce
Gönderen: selimkoc - 15 Nisan 2015, 11:56:27
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.
Başlık: Ynt: Ardunio Up-Down Counter Debounce
Gönderen: JOKERAS - 15 Nisan 2015, 12:32:29
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.



Başlık: Ynt: Ardunio Up-Down Counter Debounce
Gönderen: selimkoc - 15 Nisan 2015, 13:24:53
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 (https://www.picproje.org/index.php?topic=46371.0)

http://www.labbookpages.co.uk/electronics/debounce.html (http://www.labbookpages.co.uk/electronics/debounce.html)
Başlık: Ynt: Ardunio Up-Down Counter Debounce
Gönderen: mehmet - 15 Nisan 2015, 13:34:41
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;
  }

}
Başlık: Ynt: Ardunio Up-Down Counter Debounce
Gönderen: JOKERAS - 15 Nisan 2015, 14:24:48
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.