Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

stm8 buton uygulaması

Başlatan isoment01, 12 Aralık 2018, 15:52:00

isoment01

Arkadaşlar stm8 de bir uygulama yapmaktayım. Basitçe mevzunun özünü anlatacak olursam iki butonum var bunlar up ve down butonları , bu butonlara basarak bir dizideki sayıları up ve down yapmak istiyorum fakat şöyleki;

 up ve down butonlarına sürekli bastığımda sürekli bir iniş çıkış yapacak tek tek bastığımda ise tek tek dizideki her değere inecek ve ya çıkacak bunu nasıl yapabilirim ? İnternette bu tarz uygulamaları nasıl bulabilirim ikisini birleştiren bir uygulama göremedim.

Yardımlarınızı bekliyorum .

dumansiz

Timer kullan.
Örneğin 1 saniyeden uzun basıldıysa, buton basılı tutulmuştur.
1 saniyeden az ise 1 kere basılmıştır.
Butonun basılması sırasında "ark"lar oluşacaktır. Bunları elemen lazım.

mustafa_cmbz

For next ile rahatça yaparsın..

Bir döngü kur basılı tuttuğunda tek tek artsın döngünün bitiminde şayet butona hala basılıysa 2. Döngüye gönderip orada daha hızlı arttırabilirsin değişkeni.

isoment01

Alıntı yapılan: dumansiz - 12 Aralık 2018, 18:06:03Timer kullan.
Örneğin 1 saniyeden uzun basıldıysa, buton basılı tutulmuştur.
1 saniyeden az ise 1 kere basılmıştır.
Butonun basılması sırasında "ark"lar oluşacaktır. Bunları elemen lazım.
Hocam yarım saniyelik bir timer kurdum bu timer ile söyle birşey yapmak istiyorum hem yarım saniyenin üzerinde basıldı ise devamlı up down yapacak şayet yarım saniyeden az ise tek tek yapacak.
bunu kuramadım.
 Şey mi yapılmalı bir saniyelik bir timer kurum onu ikiye mi bölmeli hocam ? Eğer öyleyse ise nasıl kurucam yine yardım ederseniz çok mutlu olurum.

Gediz1337

#4
RC ile donanımsal debounce filtresi oluşturduktan sonra ilgili butona ait kesme içerisinde bir flag set edin. Ardından kısa periyotlarla (1 ms, 10 ms gibi) kesme oluşturan bir zamanlayıcı ayarlayın. Zamanlayıcı kesmesi içerisinde şöyle bir mantık kurabilirsiniz mesela;

Buton hâlâ basılı mı?
Basılı ise:
  • Süre sayacını arttır.

Basılı değil ise:
  • Flagi resetle.
  • Süre sayacını resetle.

Süre sayacını da belirli bir eşik değeriyle kıyaslama sonucuna göre arttırma/azaltma yapıp sonra da sayacı sıfırlarsınız işinizi görür diye tahmin ediyorum.


dumansiz

İlkel bir örnek:
Hatalı olabilir. Test edilmedi. Şimdi uydurdum.
if(butonun_bagli_oldugu_port_pini)//butona basıldı mı?
{
 TIMER_BASLA();//butona basıldığı anda timer saymaya başla
 while(butonun_bagli_oldugu_port_pini)//basılı kaldığı sürece burada dön 
 {
  if(timer_500ms_saydi)//bu değişken timerın içinde set edilecek
  {
   sayaca_eklenecek_sayi++;//!!burası işlemcinin clock hızında artacağı için çok hızlı artacak!!
  }
  else//buton 500ms basılı kalmadıysa 1 artacak.
  {
   sayaca_eklenecek_sayi=1;
  }
 }
 TIMER_KAPAT();
}

Buton arklarını elemelisin

isoment01

#6
Alıntı yapılan: dumansiz - 14 Aralık 2018, 15:18:14İlkel bir örnek:
Hatalı olabilir. Test edilmedi. Şimdi uydurdum.
if(butonun_bagli_oldugu_port_pini)//butona basıldı mı?
{
 TIMER_BASLA();//butona basıldığı anda timer saymaya başla
 while(butonun_bagli_oldugu_port_pini)//basılı kaldığı sürece burada dön 
 {
  if(timer_500ms_saydi)//bu değişken timerın içinde set edilecek
  {
   sayaca_eklenecek_sayi++;//!!burası işlemcinin clock hızında artacağı için çok hızlı artacak!!
  }
  else//buton 500ms basılı kalmadıysa 1 artacak.
  {
   sayaca_eklenecek_sayi=1;
  }
 }
 TIMER_KAPAT();
}

Buton arklarını elemelisin
hocam o aradaki atlama sürelerini clock hızı değilde timer ile yapmak istiyorum 0.1 snlik bir timer kurucam 0.5sn den fazla basarsa 0.3sn atlamalarla gıdıcek 0.5 saniyeden az basarsa tek atlayıp durcak hala kuramadım.  Tek timer imkansız ise ikinci bir timer da kurabilirim, verimli mi bilmiyorum delay fonksiyonu ya da bir for döngüsü ile geçikme yaptırmak  istemiyorum işlemciyi yormamak kastım.

dumansiz

@isoment01

"100ms" lik timer kurun. "100ms_timer_sayac" değişkeni oluşturun. Her kesme oluştuğunda kesme fonksiyonu içerisinde "100ms_timer_sayac" değişkenini 1 arttırın.
Main fonksiyonunda "100ms_timer_sayac" değişkenine kalansız bölme işlemi uygulayın.
  if(timer_100ms_saydi>=5)//500msden büyükse
  {
   sayaca_eklenecek_sayi=((100ms_timer_sayac-5)/3)(artı)1 ;// "artı" işareti çıkmadı yazı ile yazdım.Kalansız bölme 
  }
Yalnız diğer yazdığım kod değişecek. "500ms" den az basılma olayını döngünün dışında yazmalısın. Butondan elini çektikten sonra "sayaca_eklenecek_sayi" değişkeni 0 ise veya "100ms_timer_sayac" değişkeni 5 ten küçük ise sayaca_eklenecek_sayi=1 olacak.