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



Teraz jest 27 lis 2024, o 05:15


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
 Tytuł: Cuda dziwy?
PostNapisane: 23 paź 2021, o 12:05 
Offline
Nowy

Dołączył(a): 05 paź 2021
Posty: 24
Pomógł: 0

Tak sobie raczkuję w świecie AVR i natknąłem się na wpis na blogu Mirka o debouncingu przycisków. Wrzuciłem jego kod do zabawy z wyrzucaniem efektów do terminala i być może czegoś nie widzę z niedospania, ale jakim cudem kiedykolwiek "BUTTON_PRESSED" jest "0" po naciśnięciu przycisku???

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Cuda dziwy?
PostNapisane: 23 paź 2021, o 13:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1164
Lokalizacja: Kraków
Pomógł: 93

Jeśli:
1) podłączysz przycisk pomiędzy pin (u Ciebie) PC5 i GND
2) ustawisz wewnętrzne podciągnięcie do Vcc na tym pinie
3) wciśniesz przycisk
to właśnie wtedy BUTTON_PRESSED będzie miało wartość 0 :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Cuda dziwy?
PostNapisane: 23 paź 2021, o 17:07 
Offline
Nowy

Dołączył(a): 05 paź 2021
Posty: 24
Pomógł: 0

Hm, tylko wówczas pierwszy warunek [if] powinien być przecież niespełniony, czyli na terminal w ogóle nie powinno pójść [Serial.print]. A tu zazwyczaj, kiedy naciskam przycisk BUTTON_PRESSED jest 1, czyli tak jak powinno być, skoro jest negacją [!(PINC & BUTTON)]. Czyli domyślny stan linii to 1, zwieram przyciskiem = 0, PINC to same 1 co z zanegowaną maską przycisku daje 1&&1. A tu jednak wypisuje 0 i w ogóle wykonuje ten fragment kodu.
To wszystko w terminalu to efekt po naciśnięciu przycisku.

ps. jeśli ostatni linijka dodaje "zwłokę" postaci: else if (key_lock && !BUTTON_PRESSED) key_lock++; to wszystko jest w porządku. Tzn. jak dotychczas nie udało mi się wyłapać "zera".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Cuda dziwy?
PostNapisane: 23 paź 2021, o 19:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 mar 2015
Posty: 315
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

Bo to jest reakcja na wciśnięcie przycisku. To i zawsze po wciśnięciu dostaniesz 1 czyli naciśnięto przycisk. Jak chcesz wyłapać zero, to po else if zrób klamry i te twoje serial.print i powinno pokazać zero.
Tak jak piszę, to jest TYLKO reakcja na wciśnięcie przycisku a nie na jego zwolnienie.
Mirek dokładnie wyjaśnia to na swoim blogu.

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

Z resztą, ty nie masz oczekiwać zera, ty masz wykonać jakieś zadanie pod wpływem jakieś reakcji. I teraz już zgłupiałem o jakie zero ci chodzi? Zero będziesz miał nie naciskając klawisza.

_________________
http://www.avrboss.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Cuda dziwy?
PostNapisane: 24 paź 2021, o 05:03 
Offline
Nowy

Dołączył(a): 05 paź 2021
Posty: 24
Pomógł: 0

No to wyspałem się i widzę gdzie była pułapka - w potraktowaniu makra BUTTON_PRESSED jako stałej/przypisanej wartości na czas wykonywania jednej pętli. Przecież to jest odczyt aktualnego/chwilowego stanu portu. O ile w chwili wciśnięcia przycisku, spełnia warunek w pierwszym {if}, więc program jest "wpuszczany" do tego bloku warunkowego, to będąc już w nim, wskutek drgań styków, daje się podczas wykonywania "przyłapać" na rozwartych, co pokazuje ponowny odczyt rejestru z maską [BUTTON_PRESSED to przecież (PINC & (1<<PC5))] na potrzeby wypisania do terminala.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Cuda dziwy?
PostNapisane: 24 paź 2021, o 09:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1164
Lokalizacja: Kraków
Pomógł: 93

Zauważ, że warunek (PINC & (1<<PC5)) to jest iloczyn bitowy, czyli sprawdzasz TYLKO wejście PC5, ignorując pozostałe



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Cuda dziwy?
PostNapisane: 24 paź 2021, o 15:46 
Offline
Nowy

Dołączył(a): 05 paź 2021
Posty: 24
Pomógł: 0

@Mahref, tak, tak, oczywiście - stąd maska. W sumie nie interesują mnie stany pozostałych bitów. Ale przynajmniej snu z powiek nie mam spędzonych tym, dlaczego (pozornie) nie spełniając warunku {if'a} to działało ;)



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

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO