Mekanik bir butonun debounce işlemi neden gereklidir ve yazılımda nasıl yapılır?

Cevap

Mekanik kontaklar kapanırken veya açılırken birkaç milisaniye boyunca (tipik olarak 1–20 ms) defalarca açılıp kapanır (bounce). MCU bu darbelerin hepsini ayrı basış olarak algılayabilir; tek basışta sayaç 5 artabilir.

Donanım çözümleri

  • RC filtre + Schmitt trigger girişli tampon
  • SR latch (çift kontaklı anahtarlarda)
  • Bazı MCU'larda dahili glitch filtresi

Yazılım: periyodik örnekleme (önerilen)

Butonu bir timer interrupt'ı veya ana döngüde sabit aralıkla (ör. her 5 ms) okuyup durumun N ardışık örnek boyunca sabit kalmasını beklemek:

#define STABLE_COUNT 4          /* 4 x 5 ms = 20 ms */

static uint8_t  stable_state = 1;   /* pull-up, basılı değil = 1 */
static uint8_t  counter = 0;

/* Her 5 ms'de çağrılır; basış anında true döner */
bool button_poll(void) {
    uint8_t raw = gpio_read(BTN_PIN);
    if (raw != stable_state) {
        if (++counter >= STABLE_COUNT) {
            stable_state = raw;
            counter = 0;
            return (stable_state == 0);   /* düşen kenar: basıldı */
        }
    } else {
        counter = 0;
    }
    return false;
}

Kaydırmalı register (shift register) yöntemi

static uint8_t hist = 0xFF;
hist = (hist << 1) | gpio_read(BTN_PIN);
if (hist == 0x80) { /* 1 sonra yedi kez 0: kararlı basış */ }

Interrupt tabanlı yaklaşım

EXTI interrupt'ı ilk kenarda tetiklenir; ISR içinde interrupt geçici olarak kapatılır ve bir timer (veya RTOS'ta bir task'a bildirim) başlatılır. Süre dolunca pin tekrar okunur ve interrupt açılır. Bu yöntem MCU'nun uykudan butonla uyanması gerektiğinde tercih edilir.

Yapılmaması gereken

ISR içinde delay_ms(20) beklemek: diğer interrupt'ları bloklar ve sistemin gerçek zamanlı davranışını bozar.

  1. Kesme (interrupt) nedir? ISR yazarken nelere dikkat edilir?OrtaMikrodenetleyicilerEmbedded
  2. Watchdog timer nedir, ne işe yarar?KolayMikrodenetleyicilerEmbedded
  3. Bir bootloader nasıl çalışır? Uygulamaya atlama ve güvenli firmware güncellemesi nasıl tasarlanır?ZorMikrodenetleyicilerEmbedded
  4. DMA nedir, ne zaman kullanılır? DMA kullanırken cache coherency ve double buffering gibi konularda nelere dikkat edilmelidir?ZorMikrodenetleyicilerEmbedded
  5. ADC çözünürlüğü, referans voltajı ve örnekleme hızı nedir? ADC okumasında doğruluğu etkileyen faktörler nelerdir?OrtaMikrodenetleyicilerEmbedded
  6. Timer ile PWM sinyali nasıl üretilir? Frekans ve duty cycle nasıl hesaplanır?OrtaMikrodenetleyicilerEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle