• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pierwszy samodzielny program. Pomocy!
#7
Wystarczy zrozumieć jak działa program. Pętla główna loop ma działać możliwie szybko bez żadnych delay. Dopóki jest pusta jest OK, teoretycznie kręci się tak szybko jak zegar czyli 16MHz, 16mln razy na sekundę nic nie robi, wchodzi do pętli i przeskakuje na początek (to też faktycznie coś trwa, ale pomijam). Po dodaniu każdej funkcji obrót pętli zwalnia tyle ile instrukcji musi wykonać, np. jeśli 10 funkcji zajmuje 1600 cykli zegara to pętla potrafi powtórzyć funkcje w loop już tylko 10000 razy/s. Masz przykład w Arduino do millis, 02. DIGITAL "blinkWithoutDelay".  Jeśli do takiej pętli bez kontroli czasu wstawisz funkcję zaświecenia diody i zgaszenia to nie zauważysz jej działania. LED będzie migał 10 tysięcy razy/s, zmiana co 500us jest nie do zauważenia. Po to jest delay, najbardziej prymitywny, mignięcie zauważalne to >50ms. Ale pętla wtedy zwalnia do 20 obiegów/s, co już jest nieakceptowalne. Można napisać tak program, że niektóre rzeczy wydarzą się dopiero wtedy, gdy upłynie określony czas, ale bez blokowania. Tu przydają się instrukcje if i funkcja millis(). Wynikiem działania funkcji millis jest ilość ms od początku działania programu. Przykładowo w tym szkicu blinkWithoutDelay pętla kręci się pierdylion razy/s i sprawdza czy od ostatniej zmiany pinu LED upłynęło 1000ms, jedna sekunda. Jeśli tak to zmienia jej stan na przeciwny. Analogicznie robi się wszystko, masz cały blok programu, który wykona się gdy minęło 10ms, 100ms, 2 minuty, sekundy parzyste, podzielne bez reszty przez 3 - do wszystkiego są odpowiednie operatory, porównania, itd. Gadasz z modemem, to jak mu zadasz pytanie nie czekasz 10s na odpowiedź, bo wiesz, że za tyle zwykle odpowiada, pętla się kręci i w każdym obrocie sprawdza czy odpowiedź przyszła, nie to zlicza czas timeout. Zliczy sobie 10s to powinna porzucić zadanie i rozpocząć od nowa. Zrobisz program tak, że czeka na odpowiedź i już nic się w nim nie wydarzy do końca świata, bo modem jest uszkodzony, niepodłączony, sam się zawiesił. Gdy sprawdzasz czy przycisk został wciśnięty to tak samo, nie robisz pauzy delayem na 30ms by wyeliminować drganie styków, odnotowujesz w zmiennej pierwsze zauważenie wciśnięcia i lecisz dalej, za 10ms sprawdzasz znowu, stan się zmienił to zerujesz ten blok programu i liczysz od nowa, wciśnięty dalej to podbijasz zmienną wciśnięcia, za trzecim razem jak dalej wciśnięty to znowu podbijasz wyżej. Inny blok programu odczytuje tę zmienną i jak ma więcej>2 to znaczy, że ma wykonać akcję od wciśnięcia tego przycisku i wyzerować zmienną, żeby znowu akcja nie wykonała się 10000x po wciśnięciu. Do wielu rzeczy są gotowe biblioteki, np. do przycisków bounce2, ale jak użyjesz gdzieś delay to wszystko się rozsypie, więc wszystko trzeba pisać w ten sposób.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Pierwszy samodzielny program. Pomocy! - przez kaczakat - 22-01-2019, 00:53

Skocz do:


Przeglądający: 1 gości