Kesme işlemi için ufak bir soru

Başlatan OzkanAtas, 19 Mayıs 2016, 20:30:48

OzkanAtas

Merhaba arkadaşlar sizden ufak bir yardım rica edeceğim. 12f683' te int kesmesi kullanıyorum; ama kesme butonuna bir defa basmama rağmen bazen kesme içerisindeki sayac birden fazla artıyor. Bu sorunu engellemek için 250ms'lik bir bekletme ekledim; kesme içerisinde bekletme hiç iyi birşey değil. Aşağıda  kesme içerisindeki kodu paylaşacağım bir fikri olan var ve yardım edebilirse sevinirim.

void interrupt()
{

 if(INTCON.INTF){

INTCON.GIE=0;
sayac++;
delay_ms(250); // kesme butonuna basınca sayac birden fazla artmasın diye bekletme yapılıyor
if(sayac==3){
 sayac=0;
}
 INTCON.INTF = 0;


}
}

Cemre.

Dış kesme kullanmak yerine misal 50ms'de bir taşma oluşturacak şekilde bir timer kursanız ve her 50ms'de bir butonun durumunu kontrol edip ona göre sayacı artırsanız olmaz mı?

z

Bu konuyu forumda çok konuştuk.

Buton dediğimiz nesneye tam bastığın anda ya da parmağını çektiğin anda kontaklar titreşir ve 100 ms kadar bir zaman dilimi içinde kontaklar defalarca birbirine deyer ve ayrılır.

MCU programı çok hızlı koştuğundan bu açılıp kapanmaları tek tek takip eder.

Peki ne yapacaksın?

İlk yöntem  buton uçlarına paralel 100nF yada daha yüksek kapasitör eklemek.
Böylece butona basılan kapasitör boşalır ve dolmaya çalışırken tekrar buton kontaklar temas ederse kapasitörün dolduğu kadarını tekrar boşaltır. Ne zaman artık kontaklar kesin ayrılı o zaman kapasitör dolmaya başlar. Ve kapasitör dolduğunda işlemci arttık butonu açık devre görür.


Diğer yöntem ise butona basıldığında mesela 100ms den önce bir daha buton basılımı değilmi diye bakmamak.

Daha gelişkin filitreleme de yapabilirsin.

Mesela timer int ile butonun basılı oup olmadığına bakarsın ve 3 timer interruptında da buton hep basılı ise buton basılı kararı verirsin.

3 timer interruptı boyunda okunan buton verileri aşağıdaki gibi olursa buton hakkında en sağdaki yorumu yapabilirsin.


0 0 0 Buton basılı
0 0 1 Belirsiz
0 1 1 Belirsiz
1 0 0 Belirsiz
1 0 1 Belirsiz
1 1 0 Belirsiz
1 1 1 Buton basılı değil

Nt: Butonun giriş ile Gnd arasında olduğunu varsay.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

dursuncemal

arkadaslarin onerilerine ek olarak  delay kullanacagim diyor isen interrupta girdikten sonra interruptu disable et  mainin icinde tekrar aktif edersin.
:=

OzkanAtas

Hepinizden Allah razı olsun, teşekkür ederim ilgilendiğiniz için. Dün gece epey uğraştım, donanımsal olarak butona kondansatörde ekledim; ama daha başarılı olamadım. Dediklerinizin hepsini yaptım. Muhakkak bir yerde yanlış biir mantık kuruyorum; eğer sağlıklı şekilde çalıştırabilirsem paylaşacağım