En etkili buton okuma yöntemi?

Başlatan Ramiz, 21 Aralık 2013, 19:26:11

Ramiz

Merhaba,

Yakında butonları, birkaç dil desteği, lcd ekranı olan komplike bir cihaz geliştireceğim. Şimdiden beyin jimnastiği yapıp, algoritma oluşturmaya başladım :)

Evet en etkili ve mantıklı buton okuma yöntemi nedir? Siz nasıl yöntemler kullanıyorsunuz?

Ben kendi fikrimi açıklayayım. Kullanacağım işlemcide bir adet external interrupt girişi olduğundan MCP23008 ile 8 adet butonu okuyacağım. Her butona basılışında interrup a girecek. İnterruptta, buton değerlerini (basılmışmı, basılmamışmı) buton değişkenlerine yazıp, int.ten çıkacağım. Fonksiyonlarda ise, Lcd ye yazı yazıp, bekleyeceğim. Hatta 500mSn yeyi aşmayacak işlerde yaptırabilirim işlemciye.


Aklımda böyle bir tasarım yaptım ama daha değişik ve farklı fikirlere açığım. Şidmi gelelim başlıktaki soruya :)

Siz butonları yazılımlarınızda nasıl okuyorsunuz? (En etkili ve mantıklıca olanı arıyoruz :) )
Electrical & Electronics Engineering -> Step one

fgokcegoz

Ben buton okurken, aynı lojik seviyeyi en az 10 defa yakaladıktan sonra güncel lojik durumu belirliyorum. Yani 8 defa lojik 1 okusam, 9. da lojik 0 gelse de, sayıcıyı 0 layıp baştan saymaya başlayıp, 10 tane aynı durumu yakalamaya çalışıyorum... Bu 10 sayısı dahada artırılabilir, yada azaltılabilir. Keyfi bir değerdir.
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

Maxim

tek 1 adc girişinden istediğiniz kadar buton okuyabilirsiniz

erpay

Peki bir butonu on/off anahtarı gibi nasıl kullanırız. Basıldığı sürece tek bir durumda kalıp basma işlemi bitince tekrar basıldığında diğer duruma geçebilecek. Bayrak yöntemini denedim ama sanırım birşeyleri gözden kaçırıyorum.

Ramiz

#4
Alıntı yapılan: fgokcegoz - 21 Aralık 2013, 19:31:55
Ben buton okurken, aynı lojik seviyeyi en az 10 defa yakaladıktan sonra güncel lojik durumu belirliyorum. Yani 8 defa lojik 1 okusam, 9. da lojik 0 gelse de, sayıcıyı 0 layıp baştan saymaya başlayıp, 10 tane aynı durumu yakalamaya çalışıyorum... Bu 10 sayısı dahada artırılabilir, yada azaltılabilir. Keyfi bir değerdir.

Bu biraz daha güvenlik gerektiren işlerde çok mantıklı olabilir. Mesela asansör, endüstriyel makinalar vs gibi gürültüye çok açık ortamlarda sanırım en mantıklı yöntem bu olabilir. Peki biraz kod paylaşabilirmisiniz? Sadece buton kısımlarını?

Benim bahsettiğim yöntem ile inerrupt içersinde 10 defa okuma yapıp(1 msn aralar ile okusam, yaklaşık 10 msn zaman kaybederim) parazitmi yoksa gerçekten butona mı basılmış anlarız..

Daha farklı yöntemler ve algoritmalar üzerine konuşmak istiyorum biraz. İnterrupta okumak ve değişkenler içersine yazıp, intten çıkarak işlem yapmak mantıklımı?

mesaj birleştirme:: 21 Aralık 2013, 19:42:27

Alıntı yapılan: Maxim - 21 Aralık 2013, 19:33:01
tek 1 adc girişinden istediğiniz kadar buton okuyabilirsiniz

Buda olabilir ama gürültü açısından benim için şimdi olmasa bile ileride sorun yaratan cihazlar üretmeme sebep olabilir.

mesaj birleştirme:: 21 Aralık 2013, 19:44:57

Alıntı yapılan: erpay - 21 Aralık 2013, 19:40:43
Peki bir butonu on/off anahtarı gibi nasıl kullanırız. Basıldığı sürece tek bir durumda kalıp basma işlemi bitince tekrar basıldığında diğer duruma geçebilecek. Bayrak yöntemini denedim ama sanırım birşeyleri gözden kaçırıyorum.

fgokcegoz yöntemi ile yapabilirsiniz. Ben son mesajımda 1 msn aralarla 10 kez okuyabileceğimi yazdım. Siz 10msn ara ile 100 kez okuyup, Eğer hepside OK ise(yani buton basılmış ise) Buton değişkenine değer atarsınız.
Electrical & Electronics Engineering -> Step one

selimkoc

#5
74HC148 öncelikli 8 den 3 e kodlayıcı kullanarak  GS veya EO çıkışlarını kesme girişine bağlayarak buton kontrolü yapabilirsin. Giriş olgunda kesme oluşacak ve A B C çıkışlarının bağlı olduğu pinler okunarak hangi butona basıldığı tespit edilebilir.

Veya A B C çıkışları Rb change interruptı ile okunabilir. Teferruat için;

http://elektrokod.wordpress.com/2013/10/12/portb-change-interrupt-portb-degisim-kesmesi/


mesaj birleştirme:: 21 Aralık 2013, 21:01:04

Alıntı yapılan: erpay - 21 Aralık 2013, 19:40:43
Peki bir butonu on/off anahtarı gibi nasıl kullanırız. Basıldığı sürece tek bir durumda kalıp basma işlemi bitince tekrar basıldığında diğer duruma geçebilecek. Bayrak yöntemini denedim ama sanırım birşeyleri gözden kaçırıyorum.

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

Ramiz

#6
Selim bey,

HC148 ile olan yönteminiz, benimkisi ile aynı mantıkla çalışıyor. Benim tasarımımda 3 pin, sizinkisinde ise 4 pin kullanılıyor. Maliyet çok söz konusu değilse ve güvenlik çok had safada ise benim yöntemim daha mantıklı gibi.


Haydi bakalım birazda kod veya algoritma örneği görelim. Butonları interrupta okuduk ve interruptı terkettik. Dönülen fonksiyon içersinde neler yaparız? Neler yapmayız?

mesaj birleştirme:: 21 Aralık 2013, 21:23:35

Birde Selim bey,

Sizin yönteminiz ile birden fazla buton okuması yapılamıyor.. Yani iki tuşa basma gereksinimi oluşursa, okuma yapamazsınız, bilginize :)
Electrical & Electronics Engineering -> Step one

Maxim

bana adc girişinin nasıl parazit kapacağını söylermisiniz?
birçok sensör 0-5volt çalışıyor

Ramiz

Electrical & Electronics Engineering -> Step one

ilhan_mkp

Alıntı yapılan: Maxim - 21 Aralık 2013, 21:27:28
bana adc girişinin nasıl parazit kapacağını söylermisiniz?
birçok sensör 0-5volt çalışıyor

maxim hocam bizim firmada bir tasarumda bu yöntem kullanılmış.

7 adet sinek buton tk adc kanalından okunuyor. butonlar zamanla deforme olup direnç göstermeye başlayınca yanlış butonun görevini okuyor.

fgokcegoz

Alıntı yapılan: Ramiz - 21 Aralık 2013, 19:41:15
Bu biraz daha güvenlik gerektiren işlerde çok mantıklı olabilir. Mesela asansör, endüstriyel makinalar vs gibi gürültüye çok açık ortamlarda sanırım en mantıklı yöntem bu olabilir. Peki biraz kod paylaşabilirmisiniz? Sadece buton kısımlarını?

Benim bahsettiğim yöntem ile inerrupt içersinde 10 defa okuma yapıp(1 msn aralar ile okusam, yaklaşık 10 msn zaman kaybederim) parazitmi yoksa gerçekten butona mı basılmış anlarız..

Daha farklı yöntemler ve algoritmalar üzerine konuşmak istiyorum biraz. İnterrupta okumak ve değişkenler içersine yazıp, intten çıkarak işlem yapmak mantıklımı?

Evet endüstriyel olarak parazitli ortamlarda etkili bir okuma sağlarsınız, belirttiğim teknik ile. 1 ms lik kesmeler ile 10 kez okuma yapsanız, 10 ms geçer. Bu da buton okuma için uzun bir süre değildir. Zaten butona mekanik olarak basmak için geçen süre çok daha uzundur. Bu işi zaten interrupt ile yapacaksınız. Interrupt içinde okunan buton lojik değerlerini bir önceki lojik durumuyla karşılaştıracaksınız, eğer tutuyorsa buton counter ınızı bir artıracaksınız. Bu counter değerini tutan değişken 10'a (veya sizin belirlediğiniz değere) ulaşırsa buton durumunu güncelleyeceksiniz. Eğer bir önceki değer ile o anki interruptta okunan değer tutmuyorsa, counter ı sıfırlayıp çıkacaksınız. 
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

haydarpasamikro

Bilgisayar klavyelerinin tuş okuması nasıl sizce. Örnek olabilir.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Ramiz

Alıntı yapılan: haydarpasamikro - 21 Aralık 2013, 23:02:59
Bilgisayar klavyelerinin tuş okuması nasıl sizce. Örnek olabilir.

Tam olarak neyi kastettiğinizi anlamadım :)

Alıntı yapılan: fgokcegoz - 21 Aralık 2013, 22:54:04
Evet endüstriyel olarak parazitli ortamlarda etkili bir okuma sağlarsınız, belirttiğim teknik ile. 1 ms lik kesmeler ile 10 kez okuma yapsanız, 10 ms geçer. Bu da buton okuma için uzun bir süre değildir. Zaten butona mekanik olarak basmak için geçen süre çok daha uzundur. Bu işi zaten interrupt ile yapacaksınız. Interrupt içinde okunan buton lojik değerlerini bir önceki lojik durumuyla karşılaştıracaksınız, eğer tutuyorsa buton counter ınızı bir artıracaksınız. Bu counter değerini tutan değişken 10'a (veya sizin belirlediğiniz değere) ulaşırsa buton durumunu güncelleyeceksiniz. Eğer bir önceki değer ile o anki interruptta okunan değer tutmuyorsa, counter ı sıfırlayıp çıkacaksınız. 

Eğer butona basılmış ise, işlemci yaptığı tüm işleri kesebilir. O yüzden test işlemini timer ile değil, Ex. int kesmesi içersinde yapmak daha mantıklı olmazmı? Parazit olursa, mcu 1 msn kaybeder. Olmazsa zaten hiçbirşey yapmasın, sadece butonla ilgilensin istiyoruz :)
Electrical & Electronics Engineering -> Step one

F.T

Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

selimkoc

MCP23008 eşdeğeri olan PCF8574A'yı bu amaçla kullandım. Gayet kullanışlı bir entegre aynı mantıkla çalışıyor. Hem giriş hem çıkış olarak kullanılabiliyor.

78HC148 öncelikli encoder olduğu için hangisi önce basılırsa o girişi kabul ediyor. Eğer tuş kombinasyonu kullanılacaksa uygun değil.