Skocz do zawartości

Zapamiętanie stanu przycisku [AVR]


Pomocna odpowiedź

Napisano

Witam,

Mam problem z zaprogramowaniem przycisku w taki sposób by pamiętał wcześniejszy stan.

Układ ma działać w ten sposób, że po jednokrotnym przyciśnięciu przycisku serwo obraca się w skrajną pozycję prawą a po ponownym wciśnięciu wraca w skrajną pozycję lewą.

Obecnie do obsługi tego zadania wykorzystuję 2 funkcje.

1)

unsigned int P1_push_amount;

void P1_read(void)

{

if(bit_is_set(PINC, Numer portu))

{

P1_push_amount = P1_push_amount + 1;

}

}

2)

void Serwo_state(void)

{

if(P1_Push_amount % 2)

{

OCR1A = jakas wartosc

}

else

{

OCR1A = jakas wartosc

}

}

w pętli głównej sprawdzam najpierw funkcje 1 a następnie funkcje 2

Teoretycznie wszystko działa, z tym ze czasami program czasami odczytuje wielokrotne przyciśniecie przycisku, co skutkuje tym ze serwo obraca sie w prawo i od razu wraca w lewo. Ja chciałbym aby nawet w przypadku przytrzymania przycisku serwo obróciło się tylko raz.

Najlepiej blokuj przycisk na 0.4-0.3s wtedy efekt zniknie(taki czas to zwykle użytkownik trzyma wciśnięty klawisz), licz czas od puszczenia klawisza.

Efekt pochodzi od samego klawisza w pewnym momencie pozostaje on w stanie nieustalonym.

Rozwiązanie drugie to dać równolegle kondensator plus rezystor(nie pamiętam jakie...).

To są podstawy programowania.

Ja preferuje dosyć prostą metodę:

1. Klawisz ma zmienną ( dla większej ilości używam tablicy )

2. Jak klawisz jest wciśnięty w każdej pętli (np. co 10msec) dodaje 1

3. Po uzyskaniu odpowiedniej liczby zliczeń (zależy od funkcji, krótkie wciśnięcie to zazwyczaj 50-100ms, długie to 500-2000ms) wykonuję odpowiednią funkcję (przypisaną klawiszowi) i "blokuje" klawisz ustawiając jego wartość na maksymalną (np. 255 dla unsigned char)

4. Jak klawisz nie jest wciśnięty zapisujemy do zmiennej 0.

Kod może wyglądać tak:

#define CZASKLAWISZA 5;
void main ()
{
 unsigned char klawisz = 0;
...
 while (1)
 {//petla glowna
   delayms(10)
   if(bit_is_set(PINC,0))
   {//klawisz wciśnięty
     if (klawisz<255) klawisz++;
   }
   else klawisz = 0;

   if (klawisz==CZASKLAWISZA)
   {//klawisz wciśnięty przez odpowiednio długi czas
     klawisz = 255; //zablokuj ew. kolejne wywołanie funkcji przy tym samym wciśnięciu klawisza
     ... // zrob tutaj to co masz - np. zmień kierunek serwa
   }
 }
}

Oczywiście delayms(10) będzie sensownie działało tylko jak w głównej pętli bardzo mało robimy. W innym wypadku należy użyć timera do wywoływania przerwania obsługi klawiatury.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...