Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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?

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ć
} 
} 

Ok dzięki, mógłbyś wytłumaczyć skąd się to bierze:

PINE & (1<<7)

czemu akurat 1 << 7 ??

Z góry dzięki.

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

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?

    } 
  } 
} 

Coś nie bardzo.

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

Ok to w takim razie po rybach 🙂 bo układ już gotowy więc podpięć nie zmienie .Dzięki za pomoc.

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.

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 =]

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 😉

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?

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

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.

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