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



Teraz jest 8 lis 2024, o 20:05


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 1 paź 2016, o 23:37 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Witajcie.

Potrzebuje użyć 2 lub więcej przyciksów w projekcie i dlatego napisałem funkcję do której przekazuję numer klawisza oraz czas zwłoki
Funkcja daje nam w wyniku 10 jeśli krótkie naciśnięcie lub 20 jeśli długie naciśnięcie..
Wszystko działa jak tylko jedna funkcja
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
jest wywoływana. Jeśli wywołam drugą taką funkcję jak w poniższym przykładzie to nie działa w ogóle. Czyli wystarczy zakomentować 53 lub 54 linię i z jednym przyciskiem działa idealnie.
Funkcja przetestowana na wiele sposobów i przy pojedynczym klawiszu działa idealnie. Nieważne z którym aby był jeden.
Gdzie jest błąd. Po włączeniu drugiego klawisza Funkcja uruchamia się automatycznie na długie naciśnięcie czyli daje w wyniku dla obu klawiszy 20.


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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2016, o 00:15 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

Nie działa Ci bo tą samą zmienną t_pressDelay ustawiasz albo zerujesz w dwóch różnych funkjach



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2016, o 07:56 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Mozna by jakoś tą zmienną zadeklarować w funkcji? Zapewne specyfikator static trzeba dodać



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2016, o 11:38 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

hmm...wydaje mi sie ze tak prosto to nie bedzie....W funkcje masz kilka zmiennych, ktorych używasz raz w przy sprawdzaniu jednego klawisz a raz przy sprawdzaniu drugiego. W ten sposób nie będzie działać to dobrze. Moim zdaniem trzeba zrobić strukturę w której będą znajdować się wszystkie potrzebne zmienne wykorzystywane w funkcji iwi_debounce. Później w programie dla każdego użytego przycisku, tworzy się nową strukturę i podaje przez wskaźnik do Twojej funkcji. W ten sposób mozesz użyć nawet 100 przycisków ale każdy z nich będzie miał swoją strukturę, w której będą trzymane aktualne wartości zmiennych, ale to tylko moje zdanie, może bardziej doświadczeni doradzą coś lepszego :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2016, o 11:49 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

chyba masz rację. Przeniosłem zmienne wewnątrz funkcji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i teraz działa funkcja pojedynczego klawisza, ale nie działa przy 2 i więcej.

Na razie nie wiem jak się za to zabrać z strukturą i wskaźnikami więc do 3 klawiszy stworzę 3 funkcje a może w przyszłości wrócę do tematu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2016, o 11:59 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

iwi napisał(a):
Na razie nie wiem jak się za to zabrać z strukturą i wskaźnikami więc do 3 klawiszy stworzę 3 funkcje a może w przyszłości wrócę do tematu


Słuchaj to nic trudnego naprawdę, nie odkładaj na potem, wyrabiaj w sobie od razu dobre nawyki programowania. Zaraz sprubuję Ci nakreślić przynajmniej jak to powinno wyglądać. Chwila.

Nie wiem czy działa bo nie mam jak wytestować ale tak to ma wyglądać mniej więcej. Widzisz, nie ma w tym nic trudnego tylko na spokojnie sobie przeanalizuj

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2016, o 21:41 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Dziękuję CI serdecznie za wskazówki. Przyznam że już wczoraj siedziałem mocno, zeby wynikiem funkcji debounce było wykonanie funkcji i 2 jak to zrobił Mirek, ale niestety w Arduino trochę rzeczy jest prostszych a trochę przez tą automatyzację nie do końca jasnych. Niemniej po paru godzinach walki z dziwnymi błędami musiałem sobie odpuścić.

Wersję ze strukturą też przerabiałem, ale wyskakuje błąd kompilacji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Arduino nie ropzoznaje że to jest zadeklarowane wcześniej struktura.

Ale pomyślałem że zadeklaruję wcześniej funkcję a definicję zrobię na końcu i poszło. Tylko teraz mimo że działa to nie działa tak jak powinna.
tzn po wciśnięciu klawisza cały czas z prędkością zegara ten klawisz jest repetowany.
A analizując program.
wciśnięcie przycisku rozpoczyna odliczanie czasu i nic więcej.
puszczenie przycisku - w zależności od czasu (jeśli za krótki to nic nie robi) wykonuje instrukcję od krótkiego naciśnięcia lub długiego.

Analizując kod doszedłem że niepotrzebnie wynik funkcji zapisywany jest do struktury. W końcu to funkcja uint8_t i wywalając to ze struktury i przerabiając działa. UFFF. dzięki bo po pierwszuch błędach kompilacji myślałem ze nic z tego nie będzie.

Ale idąc dalej czy nie dałoby się przekazac wskaźnik na funkcję SHORT oraz LONG zamiast 10 lub 20?

Dziękuję za pomoc - Tak na razie wygląda działający kod, ale młoda godzina więc idę walczyć dalej.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2016, o 22:06 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

iwi napisał(a):
Ale idąc dalej czy nie dałoby się przekazac wskaźnik na funkcję SHORT oraz LONG zamiast 10 lub 20?

Dziękuję za pomoc - Tak na razie wygląda działający kod, ale młoda godzina więc idę walczyć dalej.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


o to chodzi?

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2016, o 22:20 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

W zasadzie wszystko działa więc trzeba by zapisać jako bibliotekę i rozdzielić na 2 pliki - później podrzucę zip'a.

Funkcja teraz działa jak należy - bardzo dziękuję za pomoc wszystkim i za otuchę.

Jakby ktoś potrzebował to to jest nieblokująca funkcja która realizuje 2 zadania: krótkie naciśnięcie oraz długie naciśnięcie.
W strukturze jest dodatkowo przechowywany wskaźnik na funkcje, które wystarczy sobie napisać i do głównej funkcji LOOP nie musimy nic dodawać (żadnych ifów itp).

Kod na razie w takiej formie, ale jeszcze rozdzielę na plik nagłówkowy i spróbuje zrobić bibliotekę.
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 31 minutach ]

Jarecki napisał(a):
o to chodzi?

Chyba nie - zobacz na przykład który wyżej podałem.
Chodziło mi o to żeby za pomocą wskaźnika naciśnięcie klawisza wykonało określoną funkcję. Mirek to ładnie opisał w książce i na blogu, ale nie tak łatwo było to przepisać do Arduino. Dzięki Twojej pomocy naprowadziłeś mnie jak to zrobić i się udało.

------------------------ [ Dodano po: 45 minutach ]

Uff - chyba się udało pozbyć błędów. Muszę tylko przetestować.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 paź 2016, o 18:49 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Biblioteka w ZIP z przykładem


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



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: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO