Debounce Problemi

the_maniac

Üye
Katılım
25 Nis 2009
Mesajlar
48
Puanları
1
Arkadaşlar benim debounce problemim var. Pic 16F877A kullanıyorum. 4Mhz kristal osilatörüm var. Buton ise momentary(anlık) switch. Normalde açık, bastığınızda devrede iletim sağlıyor. Yapması gereken bastığımda interrupt rutinine girecek. Led devreme power sağlayacak ve 2 numaralı led yanacak. Tekrar basınca 2 numaralı ledi söndürecek ve 1 nolu ledi yakacak.

Sorun şu ki bastığımda bazen 1i söndürüp 2yi yakıyor. Bazen 1i söndürüp 2yi yakıyor ardından da 2'yi de söndürüp 1i yakmaya devam ediyor. Bunu bi kaç defa yapabiliyor. Anladığım kadarıyla bounce sorunu oluşuyor.

İhtiyacım olan şey gerçekten çalışacağından emin olduğum bir debounce devresi. Yazılıma bir şey eklemek istemiyorum artık. Çünkü karıştıkça güvenilir olmuyor. Aynı anda pwm timer vs vs çalıştığında sorun çıkıyor. Bu nedenle donanımla çözmek istiyorum. Bu konuda özellikle denenmiş ve çalıştığı görülmüş devreleri önerirseniz sevinirim.

Yardımlarınız için şimdiden teşekkürler.
 
Ekleyeceğin şey sadece kısa bir delay, pwm, tmrx vb etkilenmez, en azından bir dene, elinin altında mc varken debouncer donanımı kullanmak çok gereksiz.
Selamlar
 
Kapasitansın o şekilde kalması sorun yaratır mı peki ? Butona bastığımda kısa devre oluyor çünkü.
------------------
Kapasitansın o şekilde kalması sorun yaratır mı peki ? Butona bastığımda kısa devre oluyor çünkü.

Bir de delay 150ms ideal diye biliyorum ama garanti bir şey olması için ne kadar koymalıyım ?
 
Son düzenleme:
Kondansatöre ihtiyaç yok, kaldırabilirsin, delay süresini denemek lazım, 50-250 ms arası olabilir.
 
kullandığın zıplama engelleme devresi fazlası ile yeterli. bir çok profesyonel devrede bunlar yeterli oluyor. tyildizak arkadaşın dediği gibi butona bastıktan sonra 50msn lik bir bekleme koyarsın ardından butonu kontrol eden bir döngü kurarsın bu döngü buton 1 olduğu müddetçe kendi içinde döner 0 olduğunda program işlemeye devam eder ve hiç bir sıkıntı yaşamazsın...
 
Aslında benim kodum epey karışık yani sadece yak söndür şeklinde basit bir devre değil. Ben rahat anlatmak için o şekilde söyledim. Ledleri pwm ile sürüyorum ve delay değiştikçe pwm dalgaları bozuluyor.

Şöyle bir kod yazmışım daha önce (projenin yazılımını tamamladım diye düşünüp donanımını yaptırıyordum da). Butona basınca interrupt rutinine giriyor. Burada hangi interrupt gelmiş diye bakılıyor. INT/RB0 pinine bağlı olduğu için buton, INTF'i kontrol ediyorum. İnterrupt flagi sıfırlıyorum. Sonra 1.ledi kapatıp 2. ledi yakıyorum. Kendi tanımladığım bir bayrağı 1 yapıyorum. İnterrupt enable yapıp çıkıyorum. Burada delay yok. Sonra ana döngüde benim tanımladığım bayrağı kontrol ediyor. 1 olduğunu görünce pwmleri kapatıyor. 2. ledin olduğu pine 1 atıyor. Burada 125ms bekliyor. Sonra devreye bağlı olan potla oynanmış mı diye bakıyor. Eğer oynanmışsa pwmi başlatıyor. Ona göre bir pulse dizilimi veriyor.

Eğer bu sırada butona tekrar basılırsa yine aynı interrupt rutinine gidiyor. Her şey aynı. Sadece kendi tanımladığım bayrak 0 oluyor. Zaten int.rutininden çıktığında sürekli dönmekte olan biraz önce bahsettiğim döngüye geliyor. Burada da flag 0 olmuş mu diye kontrol ettiğimden, eğer 0 olmuşsa yakalayıp 100ms bekliyor. Sonra ilk buton basılmadan önce ledlerin durumu neyse ona dönüyor.

Sizce buradaki delayler yeterli ve yerinde mi ?
 
Son düzenleme:
Arkadaşlar bir de bir şey farkettim. Butona 1 kez basınca oradaki kapasitans yüzünden butonun pice bağlı bacağında 1V-1.5V arası bir gerilim oluıyor. Bence bu sebepten dolayı biraz da durup durduk yere 1. ledi söndürüp 2. lede geçmeye çalışıyor. O kapasitansın doğru bağlandığından emin miyiz ?
 
Sanırım bir eşik değeri var. Şimdi denediğimdeyse düzgün çalışıyor. Butona hiç basmadan da o gerilimi görebiliyorum. Fakat fonksiyon bozucu bir sorun yaratmıyor.
 
Bugünkü denemelerimden sonra eminim arkadaşlar kondansatör boşalmıyor. 1.3V'un üzerinde kalabiliyor ve bu da picin butona basıldığını zannetmesine sebep oluyor. Bana kondansatörün tam boşalmasını sağlayacak bir şey önerebilir misiniz ?
 
Bugünkü denemelerimden sonra eminim arkadaşlar kondansatör boşalmıyor. 1.3V'un üzerinde kalabiliyor ve bu da picin butona basıldığını zannetmesine sebep oluyor. Bana kondansatörün tam boşalmasını sağlayacak bir şey önerebilir misiniz ?


Daha önce önermiştim, kondansatörü kaldır. Mikrodenetleyici girişine bu şekilde kondansatör üzerinden buton bağlanmaz.
Debouncer yaptım desen, o da zaten tek kondansatörle olacak iş değil.
 

Forum istatistikleri

Konular
129,880
Mesajlar
931,002
Kullanıcılar
452,758
Son üye
aprnck

Yeni konular

Çevrimiçi üyeler

Geri
Üst