• 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
Dźwięk Park Assist z magistrali CAN pojazdu
#4
No ale nie możesz sobie wstawić funkcji z millis i oczekiwać prawidłowego działania, jeśli w innej części programu wstawisz jakiś delay >>>> tik.
Wszystko co robisz musisz sobie przestawić na takie działanie bez delay.
Np. jeśli komunikujesz się przez modem GSM (czy CAN), wysyłasz komunikat, czekasz na odpowiedź, która może przyjść za 1 do 10s, to nie będziesz zatrzymywał działania programu na 10s, bo w tym czasie nie zadziała czujnik zbliżenia i zdemolujesz dom.
Dzielisz taką pracę na etapy, używasz "maszyny stanów". W loop wywołujesz funkcję obsługaModemu(); i ona się wywołuje co każde okrążenie loop, jak dobrze napiszesz program to tak co 63ns, no wiem, że nie, ale co 20us już powinno być. I nie będziesz w tej funkcji robił co 20us wysłania komunikatu, tylko w niej wstawiasz switch case, etap pierwszy wysłanie komunikatu i przeskoczenie do następnego punktu funkcji, np. odbioru. W sekcji odbioru "czekasz" na literki z UART i zapisujesz je do bufora, co sekundę zwiększasz licznik czasu timeout. No oczywiście nie siedzisz w niej, tylko loop naparza ile umie, a każde wywołanie funkcji obsługaModemu(); kieruje od razu do sekcji odbioru literek i sprawdzania timeout. Jak uzbierasz cały komunikat to przeskakujesz do kolejnej sekcji, gdzie prowadzisz dalszą część dialogu, weryfikujesz komunikat, bo może np. zamiast modem to wysłać odpowiedział jakimś błędem, obsługujesz błąd, albo jeśli to koniec wracasz do pierwszej i zaczynasz od nowa. Jeśli przepełni się licznik timeout, tzn. jeśli jego wartość jest większa od jakiegoś założonego czasu, gdzie powinien się pojawić jakiś komunikat zaczynasz od nowa. Tu też można zliczać liczbę timeoutów, bo może modem został u psa w budzie i nigdy nic nie odpowie, może trzeba zaświecić jakiś czerwony led, albo zapikać buzzerem.
A przynajmniej taką mam koncepcję, bo nigdy nie pisałem takiego skomplikowanego programu Big Grin, więc przykładem się niestety nie podzielę. Ale widziałem gdzieś taki w Internecie do DS18B20, tu komunikat trwa 20ms i ktoś zrobił to maszyną stanu w przerwaniach UART, tak że program nawet nie ma 100us czkawki. Są zresztą przykłady w GOOGLE na hasło "arduino state machin example", nawet bibliotekę widzę, nie trzeba było wymyślać koła.
A do UART jest jeszcze taki przykład SERIAL EVENT, tu na forum też wrzuciłem kilka przykładów gdzie "w tle" są odbierane komunikaty, analizowane, przypisywane na podstawie tej analizy wartości do zmiennych i modyfikowane działanie programu.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Dźwięk Park Assist z magistrali CAN pojazdu - przez kaczakat - 02-02-2022, 16:22

Skocz do:


Przeglądający: 1 gości