ATNEL tech-forum
https://forum.atnel.pl/

Cuda dziwy?
https://forum.atnel.pl/topic23992.html
Strona 1 z 1

Autor:  Rnext [ 23 paź 2021, o 12:05 ]
Tytuł:  Cuda dziwy?

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

Autor:  Marhef [ 23 paź 2021, o 13:34 ]
Tytuł:  Re: Cuda dziwy?

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

Autor:  Rnext [ 23 paź 2021, o 17:07 ]
Tytuł:  Re: Cuda dziwy?

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".

Autor:  mario2015 [ 23 paź 2021, o 19:18 ]
Tytuł:  Re: Cuda dziwy?

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.

Autor:  Rnext [ 24 paź 2021, o 05:03 ]
Tytuł:  Re: Cuda dziwy?

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.

Autor:  Marhef [ 24 paź 2021, o 09:18 ]
Tytuł:  Re: Cuda dziwy?

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

Autor:  Rnext [ 24 paź 2021, o 15:46 ]
Tytuł:  Re: Cuda dziwy?

@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 ;)

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/