Butona Basılı Olma Süresi Hk.

Başlatan tyfrydn, 08 Ocak 2016, 12:10:26

tyfrydn

Arkadaslar Merhaba,

Bir projemde ek fonksiyon olarak eger bir tusa 3 sn  basılı tutulursa bir işlemi yaptırılmasıyla alakalı nasıl bir kod yapısı kullanmalıyım.

Selamlar..

dursuncemal

herhangi bir  timer fonksiyonu  icinde    tusa basilma sarti ile  bir degiskeni  3 ten sifira yada 0 dan 3 e saydirarak yapabilirsin; 3 ten sifira yaparsan  tusa basilmazken degiskenine surekli 3 at.0 dan 3 e  yaparsanda 0 at.
:=

sifirzero

Merhaba şoyle birşey yaptim ama uygun olurmu arkadaşlar


while(true)
{
if(input(pin_a0))
{
X++;
Delay_ms(100);
}


if(x==10)
{
Output_high(pin_a1);
}
}
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

sifirzero

Arkadaşlar elinde hazır kodu olan veya mantiğini yazabilirmisiniz
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Cemre.

#4
Öyle olmaz. Butona basılı olduğu sürece sistem 100ms kadar çakılı kalacaktır. Programınız bu şekilde manipülasyona açık hale gelir.

Yapmanız gereken basit bir Timer kurmak. 1ms 10ms 100ms hangi çözünürlükte çalışmak istediğinize bağlı olarak değişebilir. Ben 1ms tercih ediyorum.

Timer kesme alt rutininde buton durumunu kontrol edeceksiniz ve eğer butona basılıyorsa Counter değişkeninizi 1 artıracaksınız. Sonra eğer Counter > Threshold ise bir flag değişkeninin durumunu True'ya çekeceksiniz. Daha sonra ana döngü içerisinde bu flag değişkenini kontrol ederek gerekli işlemleri yaptıracaksınız. Butona basılmadığı durumlarda ise Counter değişkenini sıfırlayacaksınız. Ana döngüde çalıştıracağınız kod parçacığının sonunda flag değişkenini temizlemeyi unutmayın.

Bu mantık ile bir butona birden çok işlev yüklemek mümkündür.

Kolay gelsin...

Teğmen

Alıntı yapılan: serkancetin - 04 Aralık 2017, 11:01:39
Arkadaşlar elinde hazır kodu olan veya mantiğini yazabilirmisiniz
hazır kodla yaparsan mantığı kavrayamazsın.
while(true)
{
if(input(pin_a0))
{
X++;
Delay_ms(100);
}


if(x==10)
{
Output_high(pin_a1);
}
}

bu yazdığın kodda eksik ; en başta x=0; diye belirtmelisin bu birincisi;
ikincisi  0.1 saniye geç kalsan x=11 olur ve tine yaptıramazsın.Kısacası şunu diyeyim bu yapmak istediğin olay bu yazdığın mantık doğru gibi gözükebilir ama bu şekilde yapmak yanlış olur.Timerler ile ile yapmak daha mantıklı olacaktır.
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

Teğmen

Alıntı yapılan: Cemre. - 04 Aralık 2017, 11:09:08
Öyle olmaz. Butona basılı olduğu sürece sistem çakılı kalacaktır. Programınız bu şekilde manipülasyona açık hale gelir.

Yapmanız gereken basit bir Timer kurmak. 1ms 10ms 100ms hangi çözünürlükte çalışmak istediğinize bağlı olarak değişebilir. Ben 1ms tercih ediyorum.

Timer kesme alt rutininde buton durumunu kontrol edeceksiniz ve eğer butona basılıyorsa Counter değişkeninizi 1 artıracaksınız. Sonra eğer Counter > Threshold ise bir flag değişkeninin durumunu True'ya çekeceksiniz. Daha sonra ana döngü içerisinde bu flag değişkenini kontrol ederek gerekli işlemleri yaptıracaksınız. Butona basılmadığı durumlarda ise Counter değişkenini sıfırlayacaksınız. Ana döngüde çalıştıracağınız kod parçacığının sonunda flag değişkenini temizlemeyi unutmayın.

Bu mantık ile bir butona birden çok işlev yüklemek mümkündür.

Kolay gelsin...
Tam olarak @Cemre. ustanın dediklerini yapacaksın.Senin dediğin halde çok kararsız olur.Olmaz mı olur ama çok kullanışsız olur sürekli hata olur arada bir doğru çalışır falan.
İyi Çalışmalar
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

sifirzero

Timer ların herhangi birini kullansak olurmu.deneyim ustam. Bazı yerlerde kullaniyorlar 30 sn basili tutun reset atsin veya star versin gibi. @Teğmen ustam int x=0; onu yazmayi gerek duymadim donguyu göstermek istedim.@cemre ustam verdigin terimlere uzakım biraz. Araştirayim. Önerdiginiz bir yazi kitap site varsa oraya bakayim. Web sayfalarina baktimda uygun birşey bulamadım
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Cemre.

Tamam, adım adım gidelim.

Button_Counter isimli unsigned short tipinde global bir değişken oluşturun.
1ms'de bir interrupt (kesme) üretecek bir Timer kurun. Kesme alt rutininde butonun bağlı olduğu inputun (girişin) durumunu

if(input_xx == 1)
{
  Button_Counter++;
}
else
{
 Button_Counter = 0;
}

gibi bir kod parçası ile kontrol edip Button_Counter değişkenini artırın.
Debug yaparak bu değişkenin sadece ve sadece butona bastığınız sürece arttığını görün.
Daha sonra gerekli geliştirmeleri yaparak bunu süre kontrollü bir bayrak şeklinde kullanmaya çalışacağız...

sifirzero

@cemre ustam akşam denedigimde yazayim.size olurmu. Çok saolasin
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Teğmen

Alıntı yapılan: serkancetin - 04 Aralık 2017, 11:19:26
Timer ların herhangi birini kullansak olurmu.deneyim ustam. Bazı yerlerde kullaniyorlar 30 sn basili tutun reset atsin veya star versin gibi. @Teğmen ustam int x=0; onu yazmayi gerek duymadim donguyu göstermek istedim.@cemre ustam verdigin terimlere uzakım biraz. Araştirayim. Önerdiginiz bir yazi kitap site varsa oraya bakayim. Web sayfalarina baktimda uygun birşey bulamadım
@serkancetin usta hangi, derleyici kullanıyorsunuz CCS C ise onunla ilgili güzel dökümanlar var kitap,pdf v.s
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

sifirzero

Ccs c kullaniyorum elimde serdar çicek hocanin kitabi var.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Teğmen

@serkancetin usta dökümanlardan Timer uygulamaları kısmını iyice bir inceleyin. Timer yapılarının sayıcı ve zamanlayıcı olarak kullanıldığını anladığınızda çoğu programı yazarken çok kolaylık sağlayacaktır.
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

foseydon

#define NULL 0
#define ENTER 1
#define UP 2
#define BUTTON_INTERVAL 400

unsigned short input;
unsigned short buttonUpCounter;

void readButton(void)
{
	if(input == NULL)
	{
		if(BUTTON1 == 0)
		{
			buttonUpCounter++;
		}
		else 
		{
			if(buttonUpCounter > BUTTON_INTERVAL)
			{
				input = ENTER;
				buttonUpCounter = 0;
			}
			else if (buttonUpCounter > 0)
			{
				input = UP;
				buttonUpCounter = 0;
			}
		}		
	}
}


bana lazım olmuştu zamanında, şu şekilde birşey yazmıştım. burada, bir timer kurup readButton() fonksiyonunu bu timer interrupt rutini içerisinde çağırıyorsunuz. Buton, koyduğunuz zaman aralığı(BUTTON_INTERVAL) * timer süresi (1ms) kadar basılı tutulursa (ENTER) daha kısa basılı tutulursa (UP) olacak şekilde işlem görüyor. Anlamadığınız nokta olursa sorun, yardımcı olmaya çalışalım.

Cemre.

#14
@foseydon gerekli kod parçasını da paylaşmış. Lütfen işin mantığını anlamaya çalışın. Kesmeler, Timer'lar vs. bunlar bu işin temeli ve olmazsa olmazıdır. Aksi halde LED yak-söndürden öteye geçmek çok zor...

@foseydon'un örneğine ek olarak, buttonUpCounter > 0 demek yerine buraya da 25-50ms gibi bir süre eklenirse "button debounce" fonksiyonu da bu yolla halledilmiş olur. Tadından yenmez :)