Skocz do zawartości

Oprogramowanie wciśnięcia 2 przycisków na raz


noobek

Pomocna odpowiedź

Witam wszystkich. To mój pierwszy temat, jestem tu nowy.

Chciałbym się zapytać czy istnieje jakiś w miarę sensowny sposób na sprawdzenie czy wciśnięto 2 przyciski na raz w krótkim odstępie czasu? Piszę w C i póki co doszedłem do czegoś takiego:

Knefle są na porcie D, tu zamieszczam tylko fragment kodu do ich obsługi


if(!(PIND & 0b00000010) ) 
   { 
	_delay_ms(80); 
	if(!(PIND & 0b00000001)) 
	{ 
	_delay_ms(80); 

	  PORTC =0b00011111; 
	  .
	  . 
	  .
	  .
	  /* opóżnienie aż drgania na stykach ustaną */
	   _delay_ms(80); 
	  /* oczekiwanie na zwolnienie przycisku */
	  while(!(PIND & 0b00000001)) {} 
	  /* opóżnienie aż drgania na stykach ustaną */
	   _delay_ms(180); 
	   PORTC =0b00000000; 
	} 
   } 

Chodzi o to, że tak naprawdę sprawdzam czy wciśnięto najpierw przycisk lewy a dopiero potem czy zaraz wciśnięto też prawy. Da się to sprawdzić jakoś równocześnie? bo problem w tym, że raczej nie zdarza się wcisnąć 2 przycisków "idealnie" równocześnie?

Link do komentarza
Share on other sites

Ja robiłem tak, że wciśnięcie jednego przycisku uruchamiało przerwanie zewnętrzne (ATmega128) i tam sprawdzałem czy nie naciśnięto drugiego przycisku. Kod wygląda tak:

SIGNAL(SIG_INTERRUPT0)		//przerwanie INT0 wyzwalane zboczem opadającym
{ 
if (!(PINE & (1<<7)))  //sprawdzanie naciśnięcia określonego przycisku (aktywny stan niski) 
{ 
             funkcja();   //tu wywołujesz funkcję lub piszesz kod, który ma coś tam zrobić
} 
} 
Link do komentarza
Share on other sites

" << " to znak logiczny przesunięcia bitów. Wartość po jego lewej stronie jest przesumana w lewo o określoną po prawej stronie znaku ilość pozycji. Czyli 1 << 7 jest równoznaczne z 1000000. Po prostu ta jedynka wędruje sobie w lewo. Można tak łatwiej i czytelnie sprawdzić Stan dokładnego pinu.

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

Dobra więc teraz mając taki kod samego przerwania jak je uruchomić? trzeba je jakoś definiować dodatkowo czy coś takiego wystarczy?


#include <avr/interrupt.h> 


SIGNAL(SIG_INTERRUPT0)        
{ 
   if (!(PIND & (0b00000001)))  //drugi knefel
   { 
             funkcja();   
   } 
} 

int main() 
{ 

sei(); 

  while(1) 
  { 
    if(!(PIND & 0b00000010) )      //jeden knefel
   { 
         //tu cos ma byc?

    } 
  } 
} 
Link do komentarza
Share on other sites

Coś nie bardzo.

Jeden uswitch pod pin od przerwania zewnętrznego, i w funkcji przerwania sprawdzasz wciśniecie drugiego. Przynajmniej ja to tak rozumiem...

Link do komentarza
Share on other sites

A co do przerwań to RTFM ! Dlaczego wy nie czytacie datasheetów do procków ?? Tam jest WSZYSTKO.

Zresztą, jeśli nie możesz wykorzystać przerwań to robisz dokładnie tak samo, tylko stan jednego przycisku testujesz programowo i w momencie wykrycia jego naciśnięcia i wejścia w funkcję jego obsługi sprawdzasz stan wybranego, drugiego przycisku.

Link do komentarza
Share on other sites

No tak 🙂 Tylko usuń opóźnienie i będzie si. Najlepiej wówczas wcisnąć przycisk podłączody do PORTD0 i trzymając go wcisnąć ten podłączony do PORTD1. Tak zadziała:) Idealnie równocześnie to zrobiłbyś na CPLD =]

Link do komentarza
Share on other sites

Szczerze, to nie wiem, czy nie przedłużyłbym tego opóźnienia nawet do około sekundy. Po wciśnięciu przycisku nr1 będzie wystarczająco czasu na wciśnięciu nr2, pokonamy również drgania na nr1. Nawet przy przytrzymaniu nr1 to opóźnienie nie będzie przeszkadzało. IMO 😉

Link do komentarza
Share on other sites

Nie specjalny jestem w C, ale dlaczego w jednym warunku od razu nie sprawdzać stanu dwóch pinów portu? A jesli dwa różne porty to dwóch różnych pinów?

Link do komentarza
Share on other sites

Jak kolega wyżej napisał - czemu nie sprawdzać obu pinów na raz w jednym warunku. Tak jest chyba najprościej no i będzie idealnie równocześnie.

if(!(PIND & 0b00000011) ) 
Link do komentarza
Share on other sites

Dobra dobra, ale w rzeczywistym działaniu robota-odbijacza chyba nie uda mi się trafić na idealnie równoczesne wciśnięcie obu krańcówek... 🙂 W sumie i tak już zrobiłem z opóźnieniami i wydaje mi się, że działa dobrze.

Sory za zamieszanie i dzięki za odpowiedzi.

Link do komentarza
Share on other sites

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!

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