Butonla Karmaşık İşlemler

Başlatan Teğmen, 02 Ocak 2017, 17:27:16

Teğmen

Merhaba,
Mikrodenetleyici tabanlı sistemlerde;tek bir butona farklı görev ataması nasıl yapılmaktadır?
Tercihen MikroC ile olursa sevinirim.

Örneğin #define enter PORTA.RA0 diyerek A portunun 0.pinine "Enter"isimli bir buton ataması yaptık.
Bu buton menülere hem girecek,hemde çıkabilecek!
Mesela 1 sn. basılı olursa girecek 5.sn basılı durursa çıkacak.Cep telefonlarındaki uzun basınca telin kapanması mantığıyla ?

Şimdiden Teşekkür Ederim.
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

vitruvius


  • Saniye için int bir değişken tanımlayıp 1 saniyelik timer kesmesi kurarsınız.
  • Butona basıldığında timer'ı aktif edersiniz, buton bırakıldığında kapatırsınız.
  • Kesme her oluştuğunda bu değişkenin değerini bir arttırırsınız.
  • Buton bırakıldıktan sonra ana döngüde bu değişkenin değerine bakıp kaç saniye basılı tutulmuş anlarsınız.

Timer: http://learn.mikroe.com/ebooks/piccprogramming/chapter/timer-tmr0/

XX_CİHAN_XX

Bu iş için aşağıdaki gibi bir fonksiyon kullanabilirsin. Buton pinini ENTER adı ile tanımladığını varsayıyorum ve butonun active high çalıştığını varsayıyorum.
Bu durumda aşağıdaki fonksiyonu çağırdığında dönen değer sıfır ise butona hiç basılmamış demektir.
Eğer bir değer dönerse Dönen değer x 100mS kadar süre butona basılı tutulmuş demektir.
Yani 20 değeri basılırsa butona 2 saniye basılmış 27 değeri döberse 2.7 saniye basılı kalmış demektir. Bu fonksiyondaki ölçme süresi 10 saniye ile sınırlandırılmıştır.

char checkBtn(void)
{
   char btnCounter=0;
   while(ENTER)
   {
	  delay_ms(100);
	  if(++btnCounter>=100)
	     break;
   }
   return btnCounter;
}


Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Teğmen

char checkBtn(void)
{
   char btnCounter=0;
   while(ENTER)
   {
	  delay_ms(100);
	  if(++btnCounter>=100)
	     break;
   }
   return btnCounter;
}


Cihan Bey bu kodlar mikroc için mi ?Şİmdiden teşekkür ederim.

Kesmeyle de deneyeceğim çok teşekkürler.

Kolay Gelsin.
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

XX_CİHAN_XX

Uygundur ancak profesyonel kodlarda kesme içinde uzun beklemeler hoş karşılanmaz. Bu fonksiyonu kesme içinde çağırdığınız taktirde butona basılı tutulduğu sürece program orada takılı kalacaktır. Örneğin ana programda lcd ekrana biryazı yazarken butona basılı tuttun. Sen butondan parmağını bırakana kadar ekrandaki yazı yarım kalabilir. Bunun gibi durumlardan dolayı kesme içinde uzun beklemek güzel bir davranış değildir. Bu nedenle buton sorgusu için çok yüksek bir hıza ihtiyaç duymuyor isen bu fonksiyonu ana program döngünde periyodik olarak çağırman yeterli gelecektir.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Teğmen

"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

fatal16

@XX_CİHAN_XX Hocam, butona yükselen ve alçalan kenarda dış kesme ayarlasak,

yükselen kenarda oluşan dış kesmede timer kesmesini tetiklesek, alçalan kenarda da timer değerini okusak ve timer kesmesini kapatsak, geçen süreyi hesaplamış oluruz. Mümkün müdür ?

(butona basıldığında girişi 1'e çektiğini varsaydım.)

boreas

Böyle bir çalışmanın tam nedeni nedir ?
tek butonla menüye girme gezinme gibi işlemler yapabilirsin ama kullanıcı için çokda hoş olmuyor. Telefonda epey göbeğim çatlıyor :)

XX_CİHAN_XX

Alıntı yapılan: fatal16 - 04 Ocak 2017, 10:34:48
@XX_CİHAN_XX Hocam, butona yükselen ve alçalan kenarda dış kesme ayarlasak,

yükselen kenarda oluşan dış kesmede timer kesmesini tetiklesek, alçalan kenarda da timer değerini okusak ve timer kesmesini kapatsak, geçen süreyi hesaplamış oluruz. Mümkün müdür ?

(butona basıldığında girişi 1'e çektiğini varsaydım.)

Dediğiniz mümkündür ancak butona basıldığında ve bırakıldığında oluşabilen bir takım gürültüler vardır. Bunları dikkate almanız gerekir.
İdeal de bastığınızda oluşmasını beklediğiniz sinyal bu şekildedir.



Ancak gerçekte şu tarz bir durumla karşılaşabilirsin.




@boreas, fiziksel imkanlar sınırlı olduğunda bu tarz uygulamalar tercih edilir.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

boreas

@XX_CİHAN_XX onu bende tahmin ediyorum yalnız fiziksel imkanlar kutu boyutu değil denetleyici bacağı ise a0 analog giriş olarak kullanılarak birden çok buton bağlanabilir bununla ilgili microchip'in uygulama notları mevcut ama kutuda yer yoksa yapacak birşey yok bunun için öğrenmek istedim.

fatal16

@XX_CİHAN_XX Hocam debounce aşmak için eşik süresi belirlesek olmaz mı ?

Yoksa şansımı çok mu zorluyorum  :)

XX_CİHAN_XX

Alıntı yapılan: fatal16 - 05 Ocak 2017, 01:52:05
@XX_CİHAN_XX Hocam debounce aşmak için eşik süresi belirlesek olmaz mı ?

Yoksa şansımı çok mu zorluyorum  :)

Evet 50mS civarı bir bekleme yapmak yeterli olur.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

muhittin_kaplan

external interrupt debounce u nasıl yaparız hocam ? interrupt içinde delay mı yapalım ;)

mehmet

Kesme işleminde emin olunamayacak bir durum
yok bence. Kesme fonksiyonuna girdiğinde
işlem tamamdır. Burada debounce işleminin pek
anlamı yok.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

XX_CİHAN_XX

Hocam interrupt içinde delay koymak tabii ki doğru değil. Aslına bakarsanız debounce için koyacağımız gecikme çoğu zaman birkaç mikrosaniye den ibaret. Ancak bazı switch türlerinde milisaniyelere kadar beklemek gerektiğii tecrübe ettiğim için 50mS gibi toleranslı bir süreyi kesme içinde kullanmayacağını varsayarak verdim. Normal şartlarda zaten programın kesme vektörüne girip işini halledip oradan geri çıkması birkaç mikrosaniye sürer. Bu nedenle çoğu zaman kesme içinde bir debounce gecikmesi kullanmaya gerek kalmıyor.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.