Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AVR, C, Arduino - Sprawdzanie stanu wejścia, pinu. Układ czasowy.

TDA2593 20 Lut 2016 11:25 930 4
  • #1 20 Lut 2016 11:25
    TDA2593
    Poziom 9  

    Witam.
    Nie mogę znaleźć jasnej dla mnie odpowiedzi...

    Chciałbym, aby program kontrolował co jakiś czas stan dwóch pinów w nst. sposób:
    Po podaniu sygnału na pin PA0, program powinien wysterować wyjście procka pin PB0 przez np.:30s (zTymToNieMamProblemu...), a następnie po upływie tego czasu zdjął wysterowanie z wyjścia i co np.: minutę sprawdzał stan wejścia i gdyby było ono załączone to ma znowu wysterować wyjście np.: na 10s...
    To samo dla drugiego wejścia/ wyjścia(pin PA1/PB1).
    Przypuszczam, że potrzebny byłby do tego Timer.

    Proszę o pomoc w tym temacie. Przedstawienie najlepiej szkieletu programu (język C, Arduino), lub algorytmu.

    Pozdrawiam

    0 4
  • Arrow Multisolution Day
  • #2 20 Lut 2016 12:22
    2675900
    Użytkownik usunął konto  
  • Arrow Multisolution Day
  • Pomocny post
    #3 20 Lut 2016 13:23
    bgolab
    Poziom 22  

    Algorytm jest już prawie gotowy bo opisałes co ma być zrobione. Mozesz sobie to narysować w postaci schematu blokowego. Gdyby monitorować 1 pin i sterowac 1 wyjście sprawa wtedy jest prosta i da się to zrobić bez timera dokłądnie realizując zapisany algorytm i "czekająć" określony czas.

    Gdy się ma juz wiecej wejśc/wyść obsłużyć w ten sposob to jednym z rozwiazań bez timera jest skonstruowanie maszyny stanów.

    Czyli alokujemy zmienne przechowujące stan wejścia A , wejścia B, i zmienne odpowiednie czasy hjakie są potrzebne. ZAMIAST czekac (odmierzać czas i blokując ine zadania - obsługę drugiego pinu) korzystamy z funkcji milis() by sprawdzac jaki jest aktualny czas i czy nie trzeba czegoś zrobić (zmienić stan wyjscia, ustawić nowy tier skoro np. zakończył się czas 30s to teraz trzeba sprawdzć upływ kolejnych 10s). Wszystko oczywiscie w pętli.


    Uzyskalismy nieblokowanie drugiego zadania potrzez sprawdzanie warunków (stanu system) bez uzywania blokujących funkcji odmierzających czas.

    Oczywiście można to zrobić na timerach (chyba w arduino jest dostepny timer 1, timer 3). Ale takie podejście jest juz wiele razy opisane na elektrodzie.

    Dodano po 3 [minuty]:

    Program można ladnie ustrukturyzować tworząć odrebne funkcje dla każdej pary we/wy działające z uzyciem milis() do sprawdzania momentu w którym trzeba cos zmienić.
    Funkcje te trzeba kolejno wywoływac w loop().

    0
  • #4 20 Lut 2016 19:04
    TDA2593
    Poziom 9  

    Niestety nadal nie mogę poradzić sobie z tym tematem. Zajmuje się od długich lat elektronika analogową i budowanie w tej chwili nawet nieskomplikowanych programów jest za trudne. :cry: Nie mogę znaleźć tez odpowiedniego dla mnie tematu na forach...
    Poproszę o bardziej praktyczny szkic, schemat programu...
    Pozdrawiam.

    0
  • Pomocny post
    #5 20 Lut 2016 19:49
    bgolab
    Poziom 22  

    Proszę nie traktować tego jako działający program. Napisalem szkielet na szybko.

    Przedstawię zarys programu dla jednego tasku z użyciem maszyny stanów (stany odzwierciedlają fazy oczekiwania na poszczególne fazy: faza I - 30s, faza II - probkowania wejscia co 60s, faza III - sterowania na 10s).
    Program wymaga dopracowania i uzycia wlasciwych dla arduino funkcji. Analogicznie trzeba napisac taskB(potrezbne sa oczywiscie oddzielne zmienne).

    Po podaniu sygnalu na pin PA0, program powinien wysterowac wyjscie procka pin PB0 przez np.:30s, a nastepnie po uplywie tego czasu zdjal wysterowanie z wyjscia i co np.: minute sprawdzal stan wejscia i gdyby bylo ono zalaczone to ma znowu wysterowac wyjscie np.: na 10s...

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 2 [minuty]:

    To może wyglądac skomplikowanie ale np. do programowania protokolow dosc dobrze sie sprawdza technika z maszyna stanow.

    0