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



Teraz jest 2 gru 2024, o 14:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 28 sty 2016, o 18:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lis 2015
Posty: 219
Pomógł: 20

Witam wszystkich!

Zafascynowała mnie funkcja do obsługi drgań styków z forum Mirka.
Chciałbym ją zmodyfikować w ten sposób żeby zwracała mi rezultat w zależności od wciśniętego klawisza. Jednak napotkałem problem którego chyba nie uda mi się rozwiązać bez Waszej pomocy.
Otóż zmodyfikowana funkcja wygląda jak poniżej:

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


Problem jest w tym, że przycisk nie reaguje prawidłowo. Tzn. dioda zmienia stan na przeciwny, ale nie za każdym razem np po dwóch naciśnięciach.

Postanowiłem zrobić mały test.
Użyłem dodatkowo jednej diody żeby zobaczeć co się dzieje w poszczególnych fragmentach funkcji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w tym przypadku dioda pomocnicza działa prawidłowo, za każdym wciśnięciem reaguje. A w funkcji głównej nie działa dioda 2. tzn działa ale dioda pomocnicza zmienia się tak jak powinna (za każdym nacisnieciem) a dioda led1 za np 2 albo 3

Poniżej funkcja main

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


Proszę, nakierujcie mnie gdzie robię błąd:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2016, o 21:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 lis 2013
Posty: 108
Pomógł: 0

Mam pytanie masz zdefiniowany jeden ,czy dwa przyciski?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2016, o 21:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lis 2015
Posty: 219
Pomógł: 20

zdefiniowane oba. Ustawione jako wejscia i podciagniete



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2016, o 21:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 lis 2013
Posty: 108
Pomógł: 0

Sorry z kodu wynika , że masz dwa klawisze .A diody nie zmieniają stanu jak naciskasz klawisz szybko , wolno , czy to nie ma znaczenia ?.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2016, o 22:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lis 2015
Posty: 219
Pomógł: 20

chyba to nie jasno opisalem. dioda 3 reaguje prawidlowo. tzn za kazdym przycisnieciem zmienia stan na przeciwny. diody 1 i 2 reaguja ale za dwoma albo trzema nacisnieciami. czy szybko czy wolno naciskam jest to samo



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sty 2016, o 00:42 
Offline
Użytkownik
Avatar użytkownika

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

Z ciekawości przetestowałem twój program i faktycznie objawy są takie jak opisałeś. W czasie szukania przyczyn takiego działania zakomentowałem jeden warunek w pętli while i dioda z drugiego warunku zaczęła działać prawidłowo. To nasunęło mi odpowiedź dlaczego jeden warunek działa dobrze a dwa już nie.

Załóżmy, że wciśnięty jest klawisz 1 a program zaczyna sprawdzać drugi warunek w pętli while. Po wejściu do funkcji wykona się pierwszy warunek if
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zmienna wynik zostanie ustawiona na jeden i tą wartość zwróci funkcja.
Po wyjściu z funkcji ta wartość zostanie przyrównana do 2 (bo program sprawdzał drugi warunek w while).
Ten if się nie wykona bo funkcja zwróciła wartość 1.

Chwilę później program zacznie sprawdzać pierwszy warunek w while. Wewnątrz funkcji, pierwszy if już nie będzie spełniony bo chwilę wcześnie zmienna key_lock1 została ustawiona na 1. Klawisz jest nadal wciśnięty więc żaden warunek wewnątrz funkcji nie będzie spełniony i funkcja zwróci 0.

A dlaczego zero skoro wcześniej zmienna wynik została ustawiona na 1? Ano dlatego, że zmienna wynik to zmienna lokalna, której wartość jest tracona po wyjściu z funkcji.

W poprzednim wywołaniu funkcji jej wartość została ustawiona na 1. I ta wartość została zwrócona. Jednak po ponownym wywołaniu funkcji zmienna wynik została utworzona na nowo i zainicjowana wartością 0. Skoro żaden warunek wewnątrz funkcji się nie wykona to funkcja zwróci 0. Ta wartość zostanie porównana z wartością równą 1 (pierwszy warunek w while).
I tym sposobem żadna dioda nie zmieni swego stanu.

Program dobrze zadziała jeśli podczas wciśnięcia któregoś z klawiszy najpierw zostanie sprawdzony warunek (w pętli while) odpowiadający temu klawiszowi.


Autor postu otrzymał pochwałę


Ostatnio edytowano 29 sty 2016, o 16:28 przez jacekk232, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sty 2016, o 02:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

jez2000 napisał(a):
Proszę, nakierujcie mnie gdzie robię błąd:)


W pętli głównej.
Myślę, że powinieneś powołać sobie jeszcze jedną zmienną i do niej przypisywać to co zwraca funkcja press1().
Dopiero po tym "zabiegu" sprawdzać warunki.

Ja bym to 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.


Poza tym dla lepszej czytelności kodu #define LED1_TOG zamiast #define led1_tog, oraz if(1 == temp) zamiast if(temp == 1).
Myślę, że lepiej jest również zastosować uint16_t dla key_lock1 i key_lock2 zamiast uint8_t.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sty 2016, o 07:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lis 2015
Posty: 219
Pomógł: 20

Dzieki za pomoc!
Jak wrócę do domu to pokombinuję i zobaczę co się dzieje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sty 2016, o 10:06 
Offline
Moderator
Avatar użytkownika

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

tylko, że takie coś:

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


spowoduje, że albo jedna albo druga dioda będzie świecić połową swojej jasności czyli 50% PWM, zamiast zmienić swój stan po wciśnięciu klawisza.....

trzeba jeszcze ew kasować stan:

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


to ma szanse działać być może zgodnie z oczekiwaniami autora, ale powiem tak .... te funkcje z bloga były myślane tak aby stosować je nieco inaczej ... przede wszystkim do obsługi kilku pojedynczych klawiszy, a robienie klawiatury - hmmm myślę że warto byłoby wtedy podejść całkowicie inaczej ...

_________________
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: 29 sty 2016, o 10:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Przetestowałem i diody świecą zgodnie z oczekiwaniem. Wciskamy klawisz pierwszy i dioda zmienia stan na przeciwny. Wciskamy klawisz drugi i druga dioda zmienia stan na przeciwny. Diody świecą pełnym światłem.

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


W funkcji press1() jest zerowanie zmiennej wynik, gdy żaden z klawiszy nie zostanie wciśnięty to funkcja ta zwraca nam wartość 0. Czyli zmienna temp w wyniku wywołania funkcji otrzyma wartość 0. Żaden z warunków nie będzie spełniony, diody zmienią stan dopiero po wciśnięciu klawiszy.

Panie Mirku, dlaczego pana zdaniem diody powinny świecić połową jasnośći?
Wydaje mi się, że świecą pełną jasnością. No chyba, że mi się tylko wydaje! :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sty 2016, o 11:16 
Offline
Moderator
Avatar użytkownika

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

anshar napisał(a):
Panie Mirku, dlaczego pana zdaniem diody powinny świecić połową jasnośći?

bo nie zauważyłem tego ;)
anshar napisał(a):
W funkcji press1() jest zerowanie zmiennej wynik


anshar napisał(a):
Wydaje mi się, że świecą pełną jasnością. No chyba, że mi się tylko wydaje!

Wcale ci się nie wydaje ... masz rację ;)

_________________
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: 29 sty 2016, o 12:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

;) Dziękuje! Pozdrawiam serdecznie!



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

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