Düşen kenar yükselen kenar - Makaleler - Devre Forum
Oluşturan: şenol eker, 16 Ocak in Makaleler
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.
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)
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.
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
satırının sonuna 10 milisaniye bekleme eklemekten ibarettir.
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.