Button Çoklu Görev

Başlatan Analog, 27 Haziran 2019, 23:49:08

Analog

Herkese merhaba buton a 2 farklı görev atamak istiyorum ama biraz sorun yaşıyorum.
TIM2 yi counter ve buton alçalan yükselen kenar tetik olarak ayarlandı.

Buton kesmesinin içinde TIM2'nın flag ı kontrol edilip aktif ediliyor aktif se 0 verilip kapatılıyor yanı buton a basılınca counter sayıyor cekınce de duruyor. Buraya kadar herşey normal ama main içinde biraz problem yasıyorum kısa basma suresını algılıyor ama uzun basmada sorunum var kod orneği aşağıdadır. Önerilerinizi bekliyorum
Alıntı Yapvoid HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{   
   if(TIM2->CR1==0x00)
      {
         TIM2->CR1 |= TIM_CR1_CEN;
      }
   else __HAL_TIM_DISABLE(&htim2);
}
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();

   
  while (1)
  {
      counter=__HAL_TIM_GET_COUNTER(&htim2);
      if(counter>=2000 && counter<=3000)
      {HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_14); counter=0;}
      else if (counter>=3500 && counter<=4500)
      {HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13); counter=0;}
  }   

}



RaMu

Uzun süreye ulaşılırken önce kısa süre kadar zaman geçiyor.
sende önce kısa süre geçmiş mi diye kontrol ediyorsun ve
her zaman ilk if sorgusunda evet kısa basıldı anlamı çıkarıyorsun.

exti kesmede else kısmına buton basıldı bırakıldı anlamında bir bayrak ekle,
while kısmında buton basılıp bırakıldığında süre kontrolü yap.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

sessiz_roman

#2
If kisminda sadece counter sinamasi yapma. Sonucta timer calisirken while dongusu surekli tarandigi icin sen basmaya devam etsende counter 2000i geçince ilk if dongusunun icine girecek sonra counter i sifirlayacak.

Soyle bir sey yapabilirsin. If sinamasinda counter sinamasinin yanina && baglaci ile buton durum == sifir şartını da koy.

Boylece butona basinca counter sayacak ama buton durum sifir olmadigi icin if dongusune girmeyecek. Butona basmayi bırakınca tum sartlar saglanmis olacak ve counter sayisisa göre belirli if koduna girecek.

Aklima boyle bir cozum yolu geldi deneyip sonucu yazarsan seviniriz.

Analog

Böyle yazdım ve çalışıyor. Daha iyi önerisi olan varsa açığım

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{	
	if(TIM2->CR1==0x00)
		{
			
			TIM2->CR1 |= TIM_CR1_CEN;
		}
	else    TIM2->CR1=0x00;
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();
	
  while (1)
  {
			
			counter=__HAL_TIM_GET_COUNTER(&htim2);
		if(TIM2->CR1==0x00)
		{
			if(counter>=1500)			  {HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13); TIM2->CNT=0x00;}
			else if (counter<=500 && counter>0)	{HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_14); TIM2->CNT=0x00;}		
			else if(counter>500&&counter<1500) {TIM2->CNT=0x00;}
		}
		
	}	

}