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



Teraz jest 24 gru 2024, o 14:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 18 cze 2013, o 21:51 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Witam Kolegów i być może koleżanki ;-)
Mam mały problem, który nie daje mi spokoju, mianowicie napisałem sobie obsługę przycisku w dwojaki sposób:
z wykorzystaniem 'zwykłej' zmiennej:
uint8_t d=3;
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

gdzie funkcje obsługi przycisków zdefiniowane mam następująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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


Przyciski obsługują pewną funkcję do rysowania (i przemieszczania) się linii pionowej na wyświetlaczu graficznym 64x128.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


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


wszystko pięknie działa, linia pięknie (i szybko) się przesuwa. Natomiast w przypadku rysowania linii za pomocą przycisku
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

działa to w ten sposób, że przyciskając przycisk linia się przesuwa o 1 (czyli OK) ale aby następnie przycisk zadziałał muszę odczekać około 3sekund. Dodam jeszcze, że komentując w programie funkcję
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

zmienna 'd' obsługiwana w 'przyciskach' (zmienna d wyświetlana na LCD) w obu przypadkach zmienia swoją wartość płynnie.
Co może być powodem 'powolnego' działania funkcji w przypadku obsługi za pomocą 'klawisza ze wskaźnikiem' ?
Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 cze 2013, o 22:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
w przykładzie z wskaźnikiem masz zmienną key_lock która blokuje ci kolejne wciśnięcie (eliminacja drgań styków).
Twoja funkcja jest wywoływana dość wolno więc masz takie duże opóźnienie. Wstaw zamiast key_lock=1 np. key_lock=200 i zobacz czy będzie ok.

Pozdrawiam
R.L.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2013, o 23:17 
Offline
Użytkownik

Dołączył(a): 22 gru 2012
Posty: 256
Lokalizacja: Rumia
Pomógł: 22

Fachowcem nie jestem, sam obecnie walczę z obsługą przycisków, ale zmiana key_lock=1 na key_lock=200 raczej nic nie zmieni.
Zmienna key_lock jest chyba obsługiwana jako zero jedynkowa, czyli fałsz lub prawda. Przynajmniej tak mi się wydaje i takie odnoszę wrażenie bawiąc się obsługą przycisków w swoim programie.
To że Ci działa płynnie w pierwszym przypadku to dlatego że jak naciśniesz przycisk to jego stan jest odczytywany non stop, stąd płynne rysowanie linii.
W drugim przypadku jedno naciśnięcie = jedno zwiększenie wartości.
Jak usuniesz zmienną key_lock to też będziesz miał płynny ruch tak jak w pierwszym przypadku, tyle że wartość będzie zwiększana raczej przypadkowo.
Zmienną key_lock można z powodzeniem zastąpić timerem programowym, o ile zależy nam na zwiększaniu/ zmniejszaniu wartości trzymając wciśnięty przycisk. Do takich wniosków doszedłem bawiąc się diodą RGB, PWM-em i przyciskami właśnie.

_________________
http://www.marcingibas.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2013, o 23:20 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27319
Lokalizacja: Szczecin
Pomógł: 1041

Marcin_G napisał(a):
Zmienna key_lock jest chyba obsługiwana jako zero jedynkowa, czyli fałsz lub prawda. Przynajmniej tak mi się wydaje i takie odnoszę wrażenie bawiąc się obsługą przycisków w swoim programie.


No to niestety się koledze tylko tak wydaje :(

zmienna key_lock nie jest obsługiwana zero-jedynkowo .... dokładniej opisałem to tutaj:

http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html

warto zajrzeć.

Zwróć na uwagę na warunek:

if( key_lock && (PIND & key) ) key_lock++;

i poczytaj na blogu co ona daje (zresztą wyżej kolega Lemosek napisał to w zasadzie) .... i jak można nią regulować czas.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2013, o 23:36 
Offline
Użytkownik

Dołączył(a): 22 gru 2012
Posty: 256
Lokalizacja: Rumia
Pomógł: 22

Czytałem informacje na blogu, faktycznie zapomniałem o inkrementacji , u siebie mam key_lock=0.
Sprawdziłem jednak co daje zmiana z 1 na 200. Nie zauważyłem zmian w działaniu przycisku, jedno naciśnięcie = zwiększenie wartości o jeden. Może coś źle robię.

_________________
http://www.marcingibas.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2013, o 06:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Antystatyczny napisał(a):
Całkiem mozliwe, że powinieneś wpisać 20000 , a nie 200... Pamiętaj, że pętla główna okrutnie szybko zaczyna pracować od nowa ;)


Chyba kolega coś namieszał :) przecież zmienna key_lock jest uint8_t więc 8 bitów bez znaku czyli 255.

Kolego Marcin_G jeśli nie widzisz różnicy zrób proszę taki test:
opóźnij wywołanie funkcji co np. 500ms i wtedy zobacz jak będzie reagował przycisk z 1 i z 200.

Pozdrawiam
R.L.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2013, o 07:43 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27319
Lokalizacja: Szczecin
Pomógł: 1041

Cytuj:
Chyba kolega coś namieszał przecież zmienna key_lock jest uint8_t więc 8 bitów bez znaku czyli 255.


Nie nie, nie namieszał ;) Nasz kolega Antystatyczny to na prawdę dobry "że tak niefachowo się wyrażę mając nadzieję że Anty się nie obrazi" ... więc z niego to na prawdę dobry analizator takich przypadków ...

Jeśli chodzi o 20 000 zamiast 200 to można spokojnie dać wystarczy zmienić typ zmiennej key_lock na uint16_t i tym sposobem znacznie wydłużyć czas obsługi drgań styków - co może być SZCZEGÓLNIE istotne gdy procek jest taktowany nie 8 MHz ale np 20 MHz ..... Na blogu opisuję taki przypadek i tam proponuję tę wartość dać na początek rzędu np 50 000 pamiętając, że timer zlicza w górę - więc wtedy key_lock, będzie tykał tylko 15635 razy (do końca pojemności zmiennej 65535)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 cze 2013, o 07:44 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Dzięki za odpowiedzi.
Rzeczywiście problem był w zmiennej key_lock, która miała przypisaną nie prawidłową wartość.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 cze 2013, o 12:46 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Witam ponownie, jak zwykle mam mały problem z przyciskami, ale tym razem z wykorzystaniem callbacków :)
Ale po kolei:
W pliku przyciski.h mam deklaracje klawisza którego argumentem jest wskaźnik na funkcję oraz przycisk za pomocą którego chciałbym aby ona się wykonała.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W pliku przyciski.c mam oczywiście ciało funkcji klawisz_D_2
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Następnie mam plik main.c a w niej zadeklarowane i od razu zdefiniowane dwie funkcje, oraz pętle while(1) :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Żeby nie 'zaciemniać' kodu pomijam wszelkie definicje przycisków itd. bo wydaje mi się, że nie w tym tkwi problem. A problem mam następujący. Jeżeli w pętli while zakomentuje jeden z klawiszy, to drugi działa poprawnie tzn. wciskam go i następuje JEDNOKROTNE (mimo cały czas wciśniętego przycisku) zwiększenie (zmniejszenie) zmiennej VLineCoordinate. Natomiast jeżeli oba klawisze są nie zakomentowane (tak jak powyżej w kodzie) to w zależności który klawisz (plus, czy minus) jest wciśnięty to następuje WIELOKROTNE zwiększanie (lub zminejszanie) zmiennej VLineCoordiante tzn. w 'ułamku' sekundy zmienna VLineCoordinate przyjmuje maksymalną lub minimalną wartość. Z czym to może być związane ?
Z góry dziękuję za pomoc.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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