Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

BUTON İLE YÜKSELEN KENAR UYGULAMASI

Başlatan elektrorazor, 22 Temmuz 2013, 17:53:36

elektrorazor

selamlar. 8 adet buton ile 8 adet led yükselen kenar ile toggle alma işlemi yapacaktır. buton ile ledler sıralı vaziyettedir.yani 1. buton 1.led 2. buton 2.led.... yapmış olduğum uygulama butonlara teker teker basıldığı durumda gayet güzel çalışıyor. ancak 4-5 butona aynı anda basıldığı takdirde bazılarının toggle işlemi atlanıyor.anca 1-2 tanesi işleme giriyor.amacım 8 butona da aynı anda basılsa bile hepsi toggle alsın.aşağıda 3 buton için yazılmış kodu paylaştım.gerisi aynıdır. bunu nasıl çözebilirim? teşekkürler.

if(input(pin_b0)==0) 
  a=1;
  if(input(pin_b0)==1 && a==1)
  {
  a=0;
  output_toggle(pin_c0);
  delay_ms(70);
  
  }
  if(input(pin_b1)==0) 
  b=1;
  if(input(pin_b1)==1 && b==1)
  {
  b=0;
  output_toggle(pin_c1);
  delay_ms(70);
  
  }
  if(input(pin_b2)==0) 
  c=1;
  if(input(pin_b2)==1 && c==1)
  {
  c=0;
  output_toggle(pin_c2);
  delay_ms(70);
}

RaMu

#1
Alıntı yapılan: elektrorazor - 22 Temmuz 2013, 17:53:36


while (bk)
{

if(input(pin_b0)==0) 
  a=1;
  if(input(pin_b0)==1 && a==1)
  {
  a=0;
  output_toggle(pin_c0);
  
  }
  if(input(pin_b1)==0) 
  b=1;
  if(input(pin_b1)==1 && b==1)
  {
  b=0;
  output_toggle(pin_c1);
  
  }
  if(input(pin_b2)==0) 
  c=1;
  if(input(pin_b2)==1 && c==1)
  {
  c=0;
  output_toggle(pin_c2);

}
  delay_ms(70);
}       // while (bk)sonu


Böyle dene bir bakalım,
istersen 8 kontrolüde delay kısımlarını çıkarıp yukarıdaki gibi ekle,
sonunda aynı gösterdiğim gibi 1 tane delay ekle.


Aynı kodu tekrar yazıyorum,
sanki böyle yazsan okunması daha kolay olur gibi,

while (bk)
{

if(input(pin_b0)==0) 
  a=1;
  if(input(pin_b0)==1 && a==1)
  {
  a=0;
  output_toggle(pin_c0);
  }

  if(input(pin_b1)==0) 
  b=1;
  if(input(pin_b1)==1 && b==1)
  {
  b=0;
  output_toggle(pin_c1);
  }

  if(input(pin_b2)==0) 
  c=1;
  if(input(pin_b2)==1 && c==1)
  {
  c=0;
  output_toggle(pin_c2);
  }

  delay_ms(70);
}       // while (bk)sonu
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

elektrorazor

#2
çok sağolun süper çalışıyor. delay i dışarı atarsam toggle ları atlar diyordum ama hiç sıkıntı yapmadı. tekrar teşekkürler.

RaMu

Buton kontrolde delay niçin kullanılıyor?
Bouton debounce nedir nasıl engellenir?
Bunları araştırırsan zaten cevap kendini göztermeye başlar,
sonra mantığını merak ediyorsan onuda yazarım,
yada mantığı sen çözdüysen yazki okuyan olursa faydalansın.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

elektrorazor

mantığını anladım ama kendimi anlatacak düzeyde görmüyorum. siz buyrun isterseniz  :)

RaMu

Button debounce-buton arkı nette detaylı bir şekilde anlatılıyor,
bu yüzden yüzeysel olarak ne olduğunu tekrarlayalım sadece,
kullandığımız butonlar mekaniğinden ötürü
biz butona bastığımız anda üzerlerindeki gerilimi direk iletmezler,
butona basarken buton plakaları arası çok kısa bir mesafe kaldığı andan itibaren
iletime geçmeye başlar ve yine u kısa mesafede bir iltim bir kesim durumunda sallanırlar,
bu bahsettiğimiz olay micro-mili saniyeler mertebesinde olur,
şimdi bu durum engellenmelidir, neden?
buton kontrol eden bir rutinimiz var diyelimki buton basıldığında 1, bırakıldığında 0 geliyor,
fakat yukarıda anlattığımız gibi butona basılırken misal 50ms boyunca ardarda birçok 1-0 gelir,
buton bırakılırkende 50 ms boyunca birçok 1-0 gelir,
ve buton kontrol rutinimizi düşünelim,
eğer buton kontrol rutini butonun ilk gelen 1 ile basıldığını kabul etse ve işlem yapsa sonra işlemi bitirse,
ve başka bir işi olmasa tekrar butonun basılıp basılmadığını kontrol etse,
yani aynı butonun kontrolü 50 ms den çok daha kısa sürede yapılsa ne olur,
tabiki buton arkında dolayı biz butona bir defa basmış olsak bile
buton kontrol rutini butona defalarca basılmış gibi işlem yapar,
aynı şey buton bırakılması kontrolü içinde geçerlidir,
şimdi biz butonu kontrol edip misal bir ledi toogle yapıyor olalım(yanıyorsa söndür-sönükse yak)
butona bir defa basıldığında defalarca basılmış gibi algılanacağından led defalarca toogle yapılır
ve en son konumunda bırakılır, ve bu konumun ne olacağı belirsizdir,
buda bizim işimizi görmez,

en basit çözüm butona basıldığını algılayıp işlem yaptıktan sonra kısa bir bekleme yapmaktır (50-60 ms)
ilk program bunu yapıyor,
yapıyor ama her buton için bunu yapınca
8*70=560 ms bekliyor,
ilk butona basıldıktan neredeyse 500 ms yani yarım saniye sonra 8. buton kontrol edilebiliyor,
eğer kullanıcı yarım saniyeden daha kısa sürede ilk butona basma ve aynı zamanda son butona basma işlemini bitirirse
sizin led rutinleriniz bu işlemi algılayamıyor,

peki ben ne yaptım,
biliyorumki herhangibir butona basıldıktan sonra bu butonu tekrar kontrol etmeden önce 70 ms beklemem lazım,
o zaman bütün butonların kontrolünü yapıp bu işin sonunda 70 ms beklersem şartı sağlamış olurum,
herhangibir butona basıldıktan sonra kesinlikle 70 ms beklemiş olurum,
basılan buton veya butonları tekrar kontrole geldiğimde buton arkı geçmiş olur,
yaptığımız buydu.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

elektrorazor

açıklama gayet iyi olmuş teşekkürler. peki şimdi burda ilk basma anında delay olmadıgından dolayı butona tamamen basmasam yani mekanik temas tam olmasa bile toggle işlemi gerçekleşir. yukardaki işlem butondan el çekme durumunda işe yarıyor. ben ilk basma anında da aynı ark kontrolünü uygulamak için timer mı kullanmalıyım. mesela 30 ms basılı ise işlem yap gibi. bu şekilde ilk andaki ark önlenmiş olur mu?

RaMu

Buton ile uğraşırken şunu biliyoruz,
butona basmazsam durumu değişmez,
basılınca 1-0-1-0.... belli bir süre üretir,
bırakıncada aynı şekilde,
bu yüzden ilk durum değişiminde butona basıldı diyebiliyoruz,
aslında başka şekillerdede buton arkı hesaba katılarak işlem yapılabilir,
misal değişimin sona ermesini kontrol eden rutin yazılabilir,
hem buton basma hemde bırakma için.

Bekleme yapmak en kolay çözüm, bu yüzden genelde kullanılır,
beklemeyi ister timer ile yaparsın ister standart bekleme fonksiyonu ile.
Önemli olan yukarıdaki gibi durumları hesaba katıp en uygun olanı seçmek uygulamak.

Bu konu üzerinde çok fazla açıklama yapılmış ve birçok çözüm üretilmiş bir konu,
ben sadece ilk programındaki sorun ve çözümünü  değerlendirdim,
buton arkı ile ilgili nette mevcut detaylı bilgiyi tekrar paylaşmaya gerek yok bence.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html