ext kesmesi içinde bir butona basılmasının beklenmesi

Başlatan Emre MERMİ, 19 Ağustos 2014, 00:05:05

Emre MERMİ

iyi geceler arkadaşlar,
bir programda kesme gerçekleştiğinde d portlarına bağlı butonlardan birine basılması beklenecek ve butona basıldıktan sonra o butona bağlı görevler gerçekleşecek. Bunu nasıl gerçekleştirebilirim? kesme içine yazılacak komutlar ne olmalı ? 16f887 kullanıyorum ve derleyici olarak da ccs c kullanıyorum.

Kabil ATICI

küçük blir düşünce hatası diyelim.Bu tür sistemlerde butona basıldığı zaman kesme üretmesi için harici kesmeye uygulanır ve hangi butona basıldığına bakılır. Ve kesme içinde bekleme yapılmaz. Hemen terk edilmesi gerekir çünkü her an başka bir kesme gelebilir.
2 tane seçeneğin var, kısa süreli ise kesme içinde yapabilir. Yada yapacağın işlem uzun ise bir bayrak ataması yapılır ve kesmeden çıkılır, bu bayrak değişikliği main döngüsü içinde kontrol edilir bayrak durumu uygunsa kesme ile ilgili işlem yerine getirilir.
ambar7

AsHeS

Debounce etkisini geçirmenin bir başka yolunu önereyim size;

10 ms lik bir timer kurun bu timer da istediğiniz butonu kontrol edin. Durumu değişmişse buton basılmıştır ya da bırakılmıştır.

Emre MERMİ

Alıntı yapılan: AsHeS - 19 Ağustos 2014, 00:15:17
Debounce etkisini geçirmenin bir başka yolunu önereyim size;

10 ms lik bir timer kurun bu timer da istediğiniz butonu kontrol edin. Durumu değişmişse buton basılmıştır ya da bırakılmıştır.

haklısınız hocam ama ön şart olarak bir kesmenin gerçekleşmenin gerçekleşmesi gerekiyor yani başka bir cihazdan bir bilgi gelcek ona göre butonlar okunacak. bilgi gelmeden butonlara bakılıp hareket edilirse istenmeyen durum ortaya çıkar. ön şart dışarıdan bir cihazın veya butondan bir bilgi gelmesi o bilgiye göre butonlar kontrol edilmeli.

tabiki diyebilirsiniz ki timerdan sürekli hangi butonlara basıldığını kontrol et eğer diğer cihazdan da bilgi geldiyse görevi gerçekleştir. bu da olabilir.

MrDarK

Ana programda 2 fonksiyon olsun;kesme gelince butontara fonksiyonu aktif olur ve while içinde kendine yer bulur. Buton tara işleminin sonunda status'u sıfıra çekersen bir daha sormaz. kesme geldiğinde de status'u aktif edersin :)

yani while(1)
{
temelislemler();
if(status)
butontara();
}

#kesme;
status =1;
Picproje Eğitim Gönüllüleri ~ MrDarK

Emre MERMİ

#5
Alıntı yapılan: ambar7 - 19 Ağustos 2014, 00:12:33
küçük blir düşünce hatası diyelim.Bu tür sistemlerde butona basıldığı zaman kesme üretmesi için harici kesmeye uygulanır ve hangi butona basıldığına bakılır. Ve kesme içinde bekleme yapılmaz. Hemen terk edilmesi gerekir çünkü her an başka bir kesme gelebilir.
2 tane seçeneğin var, kısa süreli ise kesme içinde yapabilir. Yada yapacağın işlem uzun ise bir bayrak ataması yapılır ve kesmeden çıkılır, bu bayrak değişikliği main döngüsü içinde kontrol edilir bayrak durumu uygunsa kesme ile ilgili işlem yerine getirilir.

hocam haklı olabilirsiniz belki düşünce hatasıdır ama kesme oluşturacak 1. butona bastıktan sonra diğer butonların basılması için 30 saniye kadar bir bekleme koymak zorundayım. yani kullanıcı kesme oluşur oluşmaz butona bastı bastı eğer basmazsa hakkını kaybeder diye bir durum oluşur bunu engellemeye çalışıyorum.  zaten başka bir kesme oluşma şansı olmayacak tek kesme kullancam.

en son önerdiğiniz fikir mantıklı aslında yapılabilir. üstünde biraz daha düşünmem lazım ama. çok teşekkürler



mesaj birleştirme:: 19 Ağustos 2014, 14:53:23

Alıntı yapılan: MrDarK - 19 Ağustos 2014, 00:49:05
Ana programda 2 fonksiyon olsun;kesme gelince butontara fonksiyonu aktif olur ve while içinde kendine yer bulur. Buton tara işleminin sonunda status'u sıfıra çekersen bir daha sormaz. kesme geldiğinde de status'u aktif edersin :)

yani while(1)
{
temelislemler();
if(status)
butontara();
}

#kesme;
status =1;

bu da kafama yattı hocam çok teşekkürler :) ayrıca galiba @ambar7 hocamın anlatmaya çalıştığı şey de bu. peki bu bekleme süresini nasıl ayarlayabilirim ? timer ile mi ? kesme aktif olduğunda timer i de aktif etcem timer kesmesi oluştuğunda süre doldu diyecem ?

AsHeS

Alıntı yapılan: lethaldream - 19 Ağustos 2014, 00:51:05
hocam haklı olabilirsiniz belki düşünce hatasıdır ama kesme oluşturacak 1. butona bastıktan sonra diğer butonların basılması için 30 saniye kadar bir bekleme koymak zorundayım. yani kullanıcı kesme oluşur oluşmaz butona bastı bastı eğer basmazsa hakkını kaybeder diye bir durum oluşur bunu engellemeye çalışıyorum.  zaten başka bir kesme oluşma şansı olmayacak tek kesme kullancam.

en son önerdiğiniz fikir mantıklı aslında yapılabilir. üstünde biraz daha düşünmem lazım ama. çok teşekkürler



mesaj birleştirme:: 19 Ağustos 2014, 00:53:23

bu da kafama yattı hocam çok teşekkürler :)
butontara()
altında debounce etkisini delay_ms ile mi gidermeyi planlıyorsunuz ?

mesaj birleştirme:: 19 Ağustos 2014, 00:59:42

Kullandığım çoklu buton tarama kodunu vereyim;(Periyot 20 ms)
void button_scanner()
{
	uint8_t i = 0, temp_state;

	for(;i < NUM_OF_BUTTONS;i++)
	{

		temp_state = ll_get_button_state(i);
		switch(button_control[i].bc_state)
		{
			case BUTTON_RELEASED:
				if(temp_state == BUTTON_PRESSED)
				{
					button_control[i].bc_pressed_time = local_time;

					if(button_control[i].bc_pressed_function != NULL)
						(*button_control[i].bc_pressed_function)();
				}
				break;
			case BUTTON_PRESSED:
				if(temp_state == BUTTON_RELEASED)
				{
					button_control[i].bc_released_time = local_time;

					if(button_control[i].bc_released_function != NULL)
						(*button_control[i].bc_released_function)();
				}
				else
				{
					if(button_control[i].bc_hold_function != NULL)
						(*button_control[i].bc_hold_function)();
				}
				break;

		}
           button_control[i].bc_state = temp_state;

	}
}

Emre MERMİ

#7
Alıntı yapılan: AsHeS - 19 Ağustos 2014, 00:54:41
butontara()
altında debounce etkisini delay_ms ile mi gidermeyi planlıyorsunuz ?

timer ile yapabilirim anca hocam ama algoritma olarak kafamda bişeyler oluşsada bunu kullanabilirmiyim bilmiyorum. ilk kesme oluştuğunda timer i aktif edecem timer kesmesi oluştuğunda da süre doldu diyecem ?

mesaj birleştirme:: 19 Ağustos 2014, 01:02:53

veya timer değerini sıfırlayacağım sıfırladığımda  bi bayrak tanımlayacağım 30 saniye süre dolduğunda kesme oluşcak ona göre bayrağı kontrol edip timer değerini sıfırlayacağım

AsHeS

timer kesmesi oluştuğunda değilde timer aktifken devamlı durumları check etmeniz gerekiyor. Basıldığını ve bırakıldığını bir periyotta alırsanız debounce etkisini doğrudan okuma periyodu ile gidermiş olursunuz.