Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

EXTI9_5

Başlatan muhittin_kaplan, 15 Haziran 2014, 02:36:38

muhittin_kaplan

ST şöyle yapmış.




CLR

@muhittin_kaplan

şemada kondansatörün yanında not fitted yazıyor yani pcb üzerine dizilmiyor demektir, öyleyse o tuştanda gereksiz spike'lar işlemciye gelecektir, ST örnek kodlarında da interruptlı veya interruptsız delay kullanılıyordur.

Gerçi herkesin tekniği farklıdır, benim prensiplerime göre en az code ile büyük iş yaptırmaya çalışırım. 2 kez okuduğumda doğru tuş okuyacaksam neden fazla okuyayım ki, nokta atışı yaparım.   
Knowledge and Experience are Power

muhittin_kaplan

hocam,

systemtick in altına (yaklaşım 10ms)
if (!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)) {
		if (Button1Now==TRUE) {
			Button1Pass++;
			if (Button1Pass==TRUE) {
				intValue++;
				Button1Pass=FALSE;
				Button1Now=FALSE;
			}

		}
	}

yaptım

AsHeS

Alıntı yapılan: muhittin_kaplan - 19 Haziran 2014, 19:49:56
hocam,

systemtick in altına (yaklaşım 10ms)
if (!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)) {
		if (Button1Now==TRUE) {
			Button1Pass++;
			if (Button1Pass==TRUE) {
				intValue++;
				Button1Pass=FALSE;
				Button1Now=FALSE;
			}

		}
	}

yaptım

Button1Now ne zaman TRUE oluyor ?

CLR

@muhittin_kaplan

Aşağıya basit bir örneğini yazdım, sayıları işlemek sana düşer, Bir tane yerine çok tuş okuyacağını varsayıyorum(mesela 8bitlik bit port/8 tuş olsun), önce bir struct oluşturacağım, bu struct içinde geçerli bir tuş yakalarsan flag 1 olacak(basılan tuş bulundu artık bu tuşla işlem yapabilirsin anlamında), ardışık 2 okumada aynı değeri(tuşu yakalarsam) tuş basılmış kabul edeceğim, 2 okuma için araya delay yerleştireceğim ama yazılıma yük getirmeyecek sonra tuş değerini struct içinde bir registere yazacağım.

struct{
   u8     Flag;             //
   vu8   Delay;           // buton okumada delay için kullanacağım, interrupt içinde kullanacağım için volatile 
   u8   KeyCode;       // tuş koduda buraya
}ButonRegs;

#define BUTON_DELAY   25                      //25ms
#define KEY_PORT   (vu8) GPIOA->IDR    // portun 0-7bitlerini okuyacağız

main(){
// systick interupt 1ms'de bir interrupt ayarı
// port ayarları
ButonRegs.Delay=BUTON_DELAY;    

    while(1){                 // main loop
         CheckKeys();
         KeyProcess()


     }


}

//25ms'de bir keyleri check edeceğiz, bu fonksiyon sadece 25ms'de bir çalışacaktır
void CheckKeys(void){

   static u8 KeyTemps[2];      // karşılaştırmalar için
   static u8 cnt;                      // tuş okuma sırasını tutan counter         

   if(ButonRegs.Delay == 0){ // 25ms olduysa tuşlar okunur
            KeyTemps[Cnt++]=KEY_PORT;
            if(Cnt==2){               //2 olduysa tuşlar karşılaştırılır
                     if(KeyTemps[0] == KeyTemps[1]){
                               ButonRegs.KeyCode = KeyTemps[0];    // tuş kodları 0x1,0x2...0x80 şeklinde gelecektir hatta istersen aynı anda 2 tuşa basılmalarıda okuyabilirsin 
                               ButonRegs.Flag=1;  // tuş update oldu anlamında
                     }
               Cnt=0;  //clear
            } 

          ButonRegs.Delay = BUTON_DELAY;         // sonraki işlem için tekrar 25ms yükledim
   }
}

// bir tuş yakalandı ise işlemleri burada yapılır
void KeyProcess(void){
        if(ButonRegs.Flag){


           ButonRegs.Flag =0;
        }

}

systick_interrupt{

if(ButonRegs.Delay) ButonRegs.Delay--;  // varsa bir azalt

}
Knowledge and Experience are Power

muhittin_kaplan

hocam 20ms de bir gelip bakıyorum,
şu haliyle çalışıyor.

if (!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)) {
		if (Button1Now==TRUE) {
			intValue++;
			Button1Now=FALSE;
		}
	}

	else {
		Button1Now=TRUE;
	}

CLR

çözdüysen iyi, 20ms'de bir baktıktan sonra tuş bırakılana kadarda tuş verileri gecektir, eski tuş ile yeni tuşu karşılaştırabilirsin aynı ise dikkate almazsın veya uzun süreli basım için dikkate alabilirsin
Knowledge and Experience are Power

Müh. müh.

Birkaç çeşit buton fonksiyonlama şekli var.

-Mesela basarsın, işlem yapılmaz. Butondan elimizi çekince işlem yapılır.

-Basarsın +1 işlem yapılır. Eğer buton belirli bir süre basılı kalmış işe, yapılan 1 işlemi hızlıca yapmaya başlarsın(sayı arttırma, azaltma fonksiyonlarında sıklıkça kullanılır)

birkaç buton algılatma fonksiyonu daha olması gerekli. Yerine göre seçim yapmamız gerekli.

Eğer ilk yöntem, projeniz için uygunsa, birde butondan elinizi çekme testi yapmanız lazım.

Destiny of white is dirtied. Destiny of black is found guilty...