Skocz do zawartości

Zapamiętanie stanu przycisku [AVR]


pawo90

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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...).

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.