Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 12 kwi 2026, o 02:30


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 26 maja 2016, o 20:47 
Offline
Nowy

Dołączył(a): 26 maja 2016
Posty: 18
Pomógł: 0

Witam.

Mam za zadanie napisać funkcję która, wykrywa który klawisz został pierwszy wciśnięty. A dokładnie to mam 3 klawisze S1,S2,S3 każdy z nich potrafię obsłużyć. Czytałem poradniki Pana Mirka o drganiach styków i ten dział w miarę rozumiem. Ale jak zabrać się do tematu wykrywania kolejności wciśniętego klawisza ??

Np: Pierw S2 potem S1 ->pierwsza funkcja,
pierw S1 potem S2 -> druga funkcja,

Dodam, że dopiero zaczynam z AVR i językiem C więc pewnie z tąd ta niewiedza. Ale zadanie to muszę rozwiązać jak najszybciej. Z góry dzięki za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2016, o 21:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

witam,

Co nieco już na temat było, może pomoże.
http://forum.atnel.pl/topic15432.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2016, o 21:58 
Offline
Nowy

Dołączył(a): 26 maja 2016
Posty: 18
Pomógł: 0

Dopiero co zaczynam, powiem szczerze że trochę nie mogę się połapać :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2016, o 23:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Na pewno ktoś pomoże, ale przecież musisz wykazać trochę więcej swojego zaangażowania, ponieważ jak do tej pory, to posty sugerują oczekiwanie na gotowca ad A do Z.
Opisz jaki procesor, na których pinach które przyciski, przedstaw kod który skonstruowałeś do tej pory, najlepiej z komentarzami żeby nie trzeba było domyślać się co oczekujesz od kodu. (oczywiście kod wstaw wg. zasad obowiązujących na forum).
Myślę że i chętnych do pomocy będzie więcej .

Podpowiem jeszcze tak:
po wciśnięciu klawisza, funkcja powinna sprawdzić czy wcześniej był naciśnięty jakiś klawisz, -więc musisz mieć inną zmienną do przechowywania takiej informacji. Jeżeli był, to wykonuje funkcję.
Np.
wciskam "2", to jest pierwszy naciśnięty klawisz. funkcja to sprawdza i wpisuje do zmiennej że pierwszy klawisz został naciśnięty i jest to "2".
wciskam "3", funkcja sprawdza, i wie że pierwszy zapis jest zajęty przez "2", a teraz naciskam "3", więc wykonuje f_23();,
lub inną, uzależnioną od kolejności przyciśnięcia, po czym musi wyczyścić zapisane przyciśnięcia.

To taki mój pomysł, ale rozwiązań może być wiele.
Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 03:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 maja 2014
Posty: 317
Pomógł: 19

Proponuję zrobić funkcję (zawierającą wskaźnik lub bezpośrednie wywołanie finalnej, właściwej funkcji) korzystającą z dobrodziejstw rekurencji, stosu i... timera do zliczania tych 3-ech powtórzeń.

Pozdrawiam! j23

_________________
"O sygnałach bez całek" Czesław Frąc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 12:49 
Offline
Nowy

Dołączył(a): 26 maja 2016
Posty: 18
Pomógł: 0

Trochę posiedziałam nad tematem i prawie mi to wyszło ale nie do końca :/
To może pokaże co zrobiłem, obsługa klawisza póki co bez niwelacji drgań styków więc się nie przestraszcie. Bardziej skupiłem się na tym żeby moja funkcja działała. Na początku próbowałem zrobić to operując na zmiennych ale nic z tego nie wyszło, więc postanowiłem zrobić sprawdzenie klawisza gdy jeden jest już wciśnięty:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



I prawie moja funkcja działa ale nie do końca:

Klikam przycisk S1 - Na LCD mam S1, OK :)
Klikam przycisk S3 - Na LCD mam S3, OK :)

Klikam przycisk S1 Potem S3 na LCD mam S1 oraz S3, też OK :)
Gdy klikam S3 a potem S1 wyświetla mi się : S1 oraz S3, ŹLE :( bo powinno być S3 oraz S1.

Za komentowałem obsługę S1, żeby sprawdzić gdzie jest błąd:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



No i po naciśnięciu S3 a potem S1 zgodnie z tą częścią kodu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wyświetla się S3 potem S1, tak jak chce żeby było.

Wniosek taki że te dwie funkcję się w jakiś sposób gryzą :/ już nie mam pomysłów jak temu zaradzić :/ Ma ktoś może jakiś pomysł ??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 14:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

kolego napisałeś:
Mortis napisał(a):
Gdy klikam S3 a potem S1 wyświetla mi się : S1 oraz S3, ŹLE bo powinno być S3 oraz S1.

po czym dalej:
Mortis napisał(a):
No i po naciśnięciu S3 a potem S1 zgodnie z tą częścią kodu:
.............................
Wyświetla się S3 potem S1, tak jak chce żeby było.


Pogubiłem się :) .

Na marginesie, pod podanym wcześniej linkiem, jest następny link. Czy on nic nie pomógł ?
http://forum.atnel.pl/post160304.html#p160304.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 14:48 
Offline
Nowy

Dołączył(a): 26 maja 2016
Posty: 18
Pomógł: 0

Ok postaram się jaśniej :)

Efekt pożądany:

klikam S1 a potem S3, ma się wyświetlić na wyświetlaczu S1 S3:

Obrazek

świadczy to o tym że został wciśnięty klawisz pierwszy S1 a potem S3.

No i potem odwrotna sytuacja, pierw klikam S3 następnie S1. I wyświetla się kolejno S3 S1, znaczy to że są włączone dwa przyciski a pierw został wciśnięty S3 a następnie S1.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 14:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Niewiem do jakiego momentu ma być pamiętana kolejność, ale zakładam, że sam kasujesz stan po odczytaniu kolejności, a więc ja bym to zrobił na trzech zmiennych wyzerowanych na początku (a później oczywiście sam zerujesz je po odczycie). Odczytujesz klawisze (metoda nieistotna) sprawdzasz czy pierwsza zmienna ma wartość zero i jeśli tak to wpisujesz tam, nr klawisza w postaci kodu ASCII, jeśli różna od zera to sprawdzasz drugą zmienną i analogicznie trzecią. Chyba dość prosto opisałem mechanizm - ile klawiszy tyle dodatkowych zmiennych, które po odczycie i obróbce zerujesz i czekasz na kolejne wciski.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 15:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Zauważ że w twoim kodzie, po naciśnięciu jednocześnie klawiszy S1 i S3, w dowolnej kolejności,
są spełnione oba if-y , i pierwszy i drugi - jednocześnie.
A ponieważ procesor oblicza spełnione warunki tysiace razy na sekundę,
nakładają się na siebie wykonywanymi funkcjami.
Tak to widzę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 15:37 
Offline
Nowy

Dołączył(a): 26 maja 2016
Posty: 18
Pomógł: 0

Właśnie Daro69, tu jest mój aktualny problem. Co zrobić żeby te dwa warunki się różniły :D
Stan klawisza po jego puszczeniu jest kasowany, postaram się jeszcze popróbować metodą SylwekK.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 15:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

wciskając klawisz sprawdzaj czy jest wolny zapis poprzedniego klawisza, np dopisując do warunku && .
Sprawdzasz czy key-e[]- trzy są równe "0". jeżeli nie to znaczy że to jest drugie wciśnięcie i "if" się nie spełni. :)
Kiedy puścisz, to wtedy się wyzerują wszystkie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 20:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

niech program myśli tak jak Ty.
Taki mój pomysł. :D
Wciskam i pamiętam czy to pierwszy przycisk naciśnięty czy drugi. Pozwólmy mu pamiętać. :)
W tym celu musimy utworzyć jakąś/jakieś zmienne, żeby tam to sobie zapisywał.

Wciskam następny i pamiętam co przed chwilą naciskałem. Pozwólmy mu pamiętać. :)
Przecież wie co wciskamy, bo mu daliśmy do tego funkcję. Wiec niech sobie zapamiętuje.

A jak zauważy że coś było naciśnięte wcześniej, przecież wie co,- to niech coś wykona, w zależności co wciskamy, kasuje zapamiętane, i czeka na zapamiętywanie następnych kombinacji, żeby mógł zrobić to co chcemy.

Takie trochę masło maślane, ale może pomoże. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 22:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

@Daro69, a czytałeś mój post troszkę wyżej ;) Zmiennych musi być tyle ile klawiszy i najlepiej ponumerować je rosnąco dla większej czytelności. Resztę opisałem już wcześniej.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 22:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

@SylwekK,
Tak czytałem. :)
Podpowiadałem koledze podobnie w 4-tym poście, ale bezskutecznie.
Dlatego próbuję na różne sposoby, by przekazać myśl. ;)

Nie upieram się że muszą być trzy zmienne, ponieważ można to załatwić na upartego jedna, rozbijając ją na bity, gdzie każdy bit to naciśnięty konkretny klawisz. Reszta to operacje na tej zmiennej.
Takie pomysły też w innych wątkach się przewijały.

Ale wiadomo, każdy możne wymyślić jakiś sposób,
każdy następny może być praktyczniejszy od poprzedniego.

Ja myślę że nie raz jeszcze w tym wątku zdublujemy nawzajem swoje rozważania,
zanim autor wyłapie to co potrzebne do prawidłowego działania tego projektu. ;)

Oczywiście dla kolegi Mortis, najprostszym sposobem będzie powołanie tyle zmiennych ile ma klawiszy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2016, o 22:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Daro69 napisał(a):
Ja myślę że nie raz jeszcze w tym wątku zdublujemy nawzajem swoje rozważania,

No cóż, czasem tak jest, że szyk zdania się nieco przestawi i niby mowa o tym samym, a każdy różnie interpretuje :)

Rozbijanie na bity miało by może sens przy większej liczbie klawiszy, bo dla trzech to sama obsługa ich wyciągania/ustawiania/itd. zajęła by więcej niż te trzy bajty ramu :)

W sumie @Mortis dostał już całe rozwiązanie, niech może pokaże co wywalczył...

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2016, o 10:21 
Offline
Nowy

Dołączył(a): 26 maja 2016
Posty: 18
Pomógł: 0

Panowie dzięki za propozycje, postaram się wdrożyć je w życie :) Jak tylko napiszę kod który mam nadzieję będzie działał to się pochawale :) Albo przyjdę z prośbą o kolejną pomoc :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO