butonda ark sorunu

Başlatan ota, 02 Ocak 2019, 20:41:48

ota

merhaba butona bir kez bastıgımda 2 kez algılıyor ben ark olustgundan diye düşünüyorum ark sorununu hem donanımsal veya yazılımsal çözüyorlar nasıl yapıldıgını anlatabilecek biri varmı ?

F®T

BAK:
IF BUTON=1 THEN GOTO BAK

En basit bu şekilde çözersin.Butona basılı olduğu sürece bak etiketine gider bırakınca programa devam eder.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

furkan41

if(input(pin_b1)  // butona basıldımı ?
{
sayac++  // sayacı 1 arttır.
while(input(pin_b1)); buton bırakılana kadar bekle
}


CCS C bölümüne yazıldığı için O dilden örnek vermek daha iyi olur.

furkan41

Ark ların bir diğer sorunları donanımsal şunlardır.

1-butonun kontakları yüzünden.
2-pull_up veya pull_down direncleriniz yoktur veya acık devre durumuna düşmüştür.
3-cok fazla dalgalanan gerilim. ki bunda pic bile calışmayabilir.
4-RF maruz kalması devrenin GROUND iyi olması lazım.


bu gibi önlemleri almak lazım. Ve pine daima lojik1 verilip butona basılınca Lojik0 Düşmesi daha güvenli bir donanım oluşturur.

otansev

Bir kısa yol daha,
BUTTONPAUSE 50 gibi bir komut koyarsanız programın başına buton kontaklarındaki arklardan dolayı gereksiz tetiklemelerin önüne geçeblirsiniz.
Kolay gelsin
TA1MK

ete

Donanımsal çözüm buton kontaklarına 100nf kondansatör bağlama ile yapılır. Butona basınca kondansatör boşalır ancak kontakların açılması durumunda deşarj olmuş kondansatör şarj olmaya başlar ve kısa devre gibi davranız anlık olarak kontak kapalı imajını yaratır Dolunca kondansatör işlevini yitirir ve ama anlık olarak buton arklarını önlemiş olur.

Yazılımsal olarak ise butona basıldığının algılanmasını takiben belirli bir gecikme koyarak buton kontaklarının bas-bırak peryodunu aşması geçilmiş olur. Uyguladığım yöntem şöyle;
IF BUTON=0 THEN  'şayet butona basılmış ise
  şu işi yap şeklinde buraya yapılacak işi yaarım
  WHILE BUTON=0:WEND 'Butonun bırakıldığı anı yakalarım yada buton titremesinden dolayı bırakıldığı anı yakalarım
  PAUSE 100  '100 ms beklerim
ENDIF  've buton kotrolünden çıkarım.
Bu komut dizisi kesinlikle ikili bastırma yaptırmaz.
Genellikle hem donanımsal hem yazılımsal çözümü birlikte kullanmak en iyi sonucu verecektir.

Ete

ota

#6
merhaba ark sorununu çözdüm ama şimdi bir şey daha yapmak istiyorum oda şu ; bir butono basıldımı süre başlayacak 15 saniye biteden diger butono basılmassa birinci butonda yaptıgı işlemin tersini yapacak örnek; buton1 e basıldımı ledi yaktı 15 saniye içinde buton2 ye basmadıgı için led i söndürecek bunu nasıl yapabilirim tesekkürler. İYİ ÇALIŞMALAR.

furkan41

Timer kurup 15 saniyelik saydırmayı yaparsın. bu arada buton1 bastığın gibi if şartının icine  while döngüsü kurup şartını 15 saniye olmamış ise kal dersin. o whilenin icindede buton2 ye basmasını beklersin eğer basar ise değişkeni sıfırlar döngüyü kırar cıkarsın. eğer basmamış ise 15 saniye dolunca yine while icinde if döngüsü oluşturursun orada işini yapar ve döngüyü kırıp cıkar.

ete


IF BUTON1=0 then
LED=1 'led yakılmış oldu
SAYAC=0 
WHILE  SAYAC<15000 and BUTON=0
   IF BUTON2=0 THEN CIK ' CIK isimli yerde buton 2 nin yapacağı işler yaptırılacak
   SAYAC=SAYAC+1
   PAUSE 1
WEND
LED=0 '15 sn doldu buton2 ye basılmadı o halde led sönecek,
ENDIF


Ete

Powered by EzPortal