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



Teraz jest 29 sty 2026, o 19:02


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 28 lip 2016, o 18:24 
Offline
Nowy

Dołączył(a): 28 lip 2016
Posty: 3
Pomógł: 0

Witam!

Mam nurtujący mnie problem z obsługą dwóch i więcej klawiszy podłączonych do ATMega32.
Polega on na tym, że w poniższym programie (w zasadzie jego części, ale ta część właśnie nie działa jak należy) dzieją się rzeczy, których ogarnąć nie potrafię.

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


Po starcie programu od razu zapala mi się dioda podłączona do wyjścia PD5 co sygnalizuje, że został wciśnięty jeden z dwóch klawiszy (zasadniczo żaden klawisz wciśnięty nie został). Dziwniejsze natomiast jest to, że gdy w funkcji pobierz_klawisz() zakomentuje część kodu odpowiedzialną za obsługę klawisza UP i zostawię tylko to co odpowiada za klawisz OK to funkcja śmiga jak ta lala czyli gdy trzymam guzik to dioda się pali, a gdy go puszcze to gaśnie.
Nie wiem co robię źle i stąd moja prośba o pomoc i nakierowanie mnie na właściwe tory by móc obsłużyć dwa guziki, a docelowo cztery.

Z góry dziękuje serdecznie!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2016, o 11:32 
Offline
Użytkownik

Dołączył(a): 04 paź 2014
Posty: 46
Lokalizacja: okolice JOWISZA czasami PL
Pomógł: 7

Język C wykonuje skrócone obliczanie wyrażeń logicznych - to znaczy, oblicza wyrażenie tylko tak długo, jak nie wie, jaka będzie jego ostateczna wartość. To znaczy, idzie od lewej do prawej obliczając kolejne wyrażenia (dodatkowo na kolejność wpływ mają nawiasy) i gdy będzie miał na tyle informacji, by obliczyć wartość całości, nie liczy reszty. Może to wydawać się niejasne, ale przyjrzyjmy się wyrażeniom logicznym:

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

Jeśli A jest fałszywe, nie trzeba obliczać B w pierwszym wyrażeniu, bo koniunkcja fałszu i dowolnego wyrażenia zawsze da fałsz


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

Analogicznie, w drugim przykładzie, jeśli A jest prawdziwe, to całe wyrażenie jest prawdziwe i wartość B nie ma znaczenia.

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



Innymi słowy przemyśl jakim warunkiem logicznym osiągniesz to co zamierzasz (logiczne "i" czy "lub").



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2016, o 15:12 
Offline
Nowy

Dołączył(a): 28 lip 2016
Posty: 3
Pomógł: 0

Rozumiem, że chodzi o to że jak wcisnąłem jeden guzik to nie ma sensu sprawdzać drugiego, trzeciego i czwartego i dokładnie o to mi chodzi. Problem w tym że gdy program startuje i żaden przycisk nie jest wciśnięty czyli oba wyrażenia (klawisz.ok_key, klawisz.up_key) są false ( bo z taką wartością są inicjowane) to funkcja pobierz_klawisz i tak w wyniku daje true co według mnie nie jest poprawnym zachowaniem chyba, że kompletnie nie rozumiem tego co napisałeś wyżej.

Generalnie moim zamierzeniem jest osiągnięcie wartości logicznej true jako wynik funkcji pobierz_klawisz() jeśli wcisnę którykolwiek klawisz, a gdy żaden nie jest wciśnięty wynikiem ma być false.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2016, o 15:55 
Offline
Użytkownik

Dołączył(a): 29 mar 2012
Posty: 595
Lokalizacja: Jaworzno
Pomógł: 39

Spróbuj dać na początku funkcji main jakiegoś krótkiego delay'a np. 50ms i zobacz czy będzie lepiej.

_________________
Pozdrawiam
PP



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2016, o 16:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Przynajmniej dla pewności i czytelności oddziel nawiasami właściwe pary w wyrażeniu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdr.



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

Dołączył(a): 28 lip 2016
Posty: 3
Pomógł: 0

Problem rozwiązany!

Przyczyną takiego zachowania wejść było użycie portu na którym aktywny był JTAG, wystarczyło go wyłączyć i wszystkie wejścia zaczęły działać jak ta lala.
Guzik OK działał bo jako jedyny nie był podłączony pod piny interfejsu JTAG.

Dzięki za wszelką pomoc!
Pozdrawiam!



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

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