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



Teraz jest 3 cze 2026, o 22:15


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 14 lut 2014, o 17:29 
Offline
Użytkownik
Avatar użytkownika

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

I znowu natknąłem się przez przypadek na coś co mi spokoju nie daje, a mam już ciemnicę i kompletnie nie wiem o co biega. Oto fragment programu odpowiedzialny za zwykłe (jedno z popularniejszych tyle, że zamiast delay użyty jest timer programowy) badanie przycisku. Generalnie to nie będzie przycisk i przygotowywałem się do zupełnie czegoś innego, ale o co chodzi... ?? A no o to, że kiedy wciskam przycisk i trzymam go to zmienna kier zmieni swój stan na przeciwny ale po 20ms wróci z powrotem do stanu przed wciśnięciem wciskadełka(!) Jeśli się wstrzelę w czas między badaniem pinu (czyli muśnięcie krótsze niż 20ms) to wtedy zmienna kier zmieni stan na przeciwny tak jak powinna i pozostanie w tym stanie do następnego... muśnięcia, bo przyciśnięcie co prawda blokuje powtórne wykonanie operacji XOR (odpowiada za to zmienna z_key), ale przytrzymanie guzika daje efekt opisany już wyżej.
Fragment pętli głównej:

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


(kier i z_key to globalne uint8_t)

Natomiast kiedy użyłem mojego ulubionego sposobu badania klawisza, który stosuję od czasów bascoma wszystko jest w najlepszym porządku:
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 niech mi ktoś wyjaśni gdzie się walnąłem w programie...
I proszę nie piszcie mi "dlaczego nie użyjesz drugiego rozwiązania?", bo inne rozwiązanie praktycznie każdego problemu to ja zawsze znajdę. Ja chcę zrozumieć filozofię C, żebym w większym projekcie nagle nie zawiesił się na jakimś teoretycznie oczywistym rozwiązaniu jak to, które tu opisuję.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2014, o 18:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

W twoim przypadku oby dwa warunki sprawdzające stan pinu będą sprawdzone od razu.
Jeśli przycisk będzie wciśnięty to wykona się warunek w linii nr 1.
Następnie warunek w linii nr 2 bo zmienna t2 będzie równa zeru.
Do t2 zostanie wpisana wartość 200.
Następnie program przejdzie do sprawdzenia warunku w linii nr 4, który też się wykona bo przycisk nadal jest wciśnięty. I cała reszta też się wykona.
Aby drugie sprawdzenie przycisku nastąpiło dopiero po 20ms spróbuj może zrobić tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 14 lut 2014, o 19:01 przez jacekk232, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2014, o 18:59 
Offline
Użytkownik
Avatar użytkownika

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

Niestety taki zapis nic nie poprawi i drugi warunek nigdy nie będzie spełniony, bo t2 ciągle jest odświeżane linijkę wcześniej. To, że reaguje od razu jak piszesz, to mi w sumie nie przeszkadza choć warto na to zwrócić uwagę, bo takie rozwiązanie jest bardziej podatne na zewnętrzne czynniki, zakłócenia, itp.). Dałeś mi jednak do myślenia co do samego algorytmu... coś sobie muszę jeszcze przetestować ;)

------------------------ [ Dodano po: 22 minutach ]

Aż zajrzałem w swe bascomowe zbiory do programu pozycjonera gdzie badałem krańcówki i okazało się, że licznik odpowiedzialny za opóźnienie odświeżałem kiedy nie było sygnału z zewnątrz (czyli wciśniętego przycisku w tym przypadku) :)


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 w powyższej wersji oczywiście wszystko działa czyli po wciśnięciu klawisza docelowe instrukcje wykonają się tylko raz. Podejrzewam, że właśnie drgania styków były brane pod uwagę i pierwsze wciśnięcie natychmiast robiło XOR mojej zmiennej, a po 20 ms jeśli klawisz nadal wciśnięty to XOR wykonywał się drugi raz. Zmienna blokująca z_key w takim razie musiała dostać jedynkę przy jakimś drganiu praktycznie już w drugim obiegu, bo inaczej nie pozwoliła by na ponowne spełnienie warunku. Cała tajemnica... :D

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2014, o 20:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Faktycznie mój przykład nie zadziała. Pisałem go na szybkiego i do końca wszystkiego nie przemyślałem.

Ale cieszę się, że mój post choć w małym stopniu przyczynił się do rozwiązania problemu :-)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2014, o 20:52 
Offline
Użytkownik
Avatar użytkownika

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

Klkłem już wcześniej pomógł, ale coś z forum się dziwnego czasem dzieje i wyskoczył mi jakiś błąd bazy danych czy coś... Od rana siedziałem nad algorytmami nowego sterownika (akurat nie miały nic wspólnego z tym tematem - to wyszło przez przypadek jak jedną z funkcji chciałem przetestować :) ) i chyba glaca mi się przegrzała ;) Taki powiew informacji od kogoś z zewnątrz troszkę naprowadził lokomotywę na właściwe tory, a to znak, że na dziś trza kończyć i napić się piwa :D

_________________
http://www.sylwekkuna.com



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

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