Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Forsowanie zmiennej w przerwaniu

Przemolinho 07 Oct 2020 13:53 324 4
  • #1
    Przemolinho
    Level 2  
    Cześć, mój program na Arduino Uno ma za zadanie w pętli loop dokonywać pomiaru odległości (czujnik hc-sr04, biblioteka newping), w momencie gdy zadziała fotokomórka, następuje przerwanie i wykonuje się przeliczenie odległości na wartość współczynnika kąta tarcia
    Code: c
    Log in, to see the code

    Pętla główna, pomiar odległości:
    Code: c
    Log in, to see the code

    Poniżej funkcja przerwania, która działa w pętli do momentu wciśnięcia przycisku Pin7 (czas na spisanie wartości):
    Code: c
    Log in, to see the code

    Mój problem polega na tym, żeby funkcja przerwania wyświetliła się raz. Używam do tego flagi która zmienia swoją wartość na false po wykonaniu. Jednakże w monitorze portu szeregowego po uruchomieniu przerwania nie wykonuje się cała funkcja void kat() tylko wyświetlane są dwa znaki "Od".
    Forsowanie zmiennej w przerwaniu Gdy kliknę przycisk pin7 dokończa ta funkcje, czyli wypisuje wartości kąta i wchodzi w pętle główną.
    Chciałbym żeby wykonała się cała funkcja kat() i dopiero po wciśnięciu przycisku wróciło do pętli głównej. Możecie jakoś pomóc?
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    japycz321
    Level 26  
    Przemolinho wrote:
    Poniżej funkcja przerwania, która działa w pętli do momentu wciśnięcia przycisku Pin7

    Wiesz że przerwanie to funkcja która z założenia powinna wykonywać się maksymalnie szybko? Używanie komunikacji, pętli oczekujących na coś lub funkcji delay to proszenie się o kłopoty. Poczytaj najpierw o idei używania przerwań a potem napisz to tak jak powinno być.
  • #3
    mpier
    Level 28  
    Przemolinho wrote:
    Chciałbym żeby wykonała się cała funkcja kat() i dopiero po wciśnięciu przycisku wróciło do pętli głównej. Możecie jakoś pomóc?
    Tak się nie da. Nazwa "przerwanie" nie jest przypadkowa. Przerwanie zatrzymuje wykonywanie Twojego kodu, więc musisz zrezygnować z Serial.print i z nieskończonej pętli for i jeśli coś w tym przerwaniu zostanie, to np pobranie aktualnej, przefiltrowanej wartości z czujnika odległości.
  • #4
    Przemolinho
    Level 2  
    Dzięki za sugestie. Właśnie najważniejsza rzecz, aby czujnik przestał dalej zliczać, w momencie wykrycia na fotokomórce, a procesor przetwarzał ta liczbę. Więc w przerwaniu mogę tylko pozostawić czujnik
  • #5
    khoam
    Level 41  
    Przemolinho wrote:
    Właśnie najważniejsza rzecz, aby czujnik przestał dalej zliczać, w momencie wykrycia na fotokomórce, a procesor przetwarzał ta liczbę. Więc w przerwaniu mogę tylko pozostawić czujnik

    W przerwaniu to raczej powinieneś pozostawić sam licznik, a to czy będzie on zerowany i jak to będzie dalej przeliczane może odbywać się już w programie głównym, gdzie będzie obsługa czujnika. Można również podłączać/odłączać pin od przerwania zewnętrznego.