Dziwny problem z timerem przy pomiarze prędkości - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino) +--- Wątek: Dziwny problem z timerem przy pomiarze prędkości (/watek-dziwny-problem-z-timerem-przy-pomiarze-pr%C4%99dko%C5%9Bci) |
Dziwny problem z timerem przy pomiarze prędkości - johnyNapalm - 14-01-2019 Temat przeniosłem z działu "Instalacja i rozwiązywanie problemów", gdyż z początku myślałem że nie jest on spowodowany problemem w kodzie. A więc tworze autonomicznego robota składającego się z: - dwóch czujników ultradźwiękowych - dwóch czujników szczelinowych - dwóch silników DC - modułu kart mikro SD Kod mojego programu: https://pastebin.com/NgUy9jJu Problem jest z funkcją timera która służy mi do obliczania prędkości obrotu kół robota Kod: void setup() { Natomiast gdy funkcja timera nie jest uruchamiana robot jeździ dobrze. Zaznaczę również że funkcja timera nie działa nawet gdy nie drukuje w niej informacji do karty SD. W załączniku schemat (przepraszam że tak mało czytelny ale jestem początkujący), oraz zdjęcia robota. RE: Dziwny problem z timerem przy pomiarze prędkości - es2 - 14-01-2019 W przerwaniu blokujące funkcje print? Nic dziwnego, że uC cały czas siedzi w przerwaniu. Mam też wątpliwości co do "Timer1.initialize(1000000); " Na pewno argument może być liczbą 32-bit? RE: Dziwny problem z timerem przy pomiarze prędkości - johnyNapalm - 14-01-2019 (14-01-2019, 19:21)es2 napisał(a): W przerwaniu blokujące funkcje print? Nic dziwnego, że uC cały czas siedzi w przerwaniu.Jak ustawiłem Timer1.initialize na 1000 to wydawało mi się że za szybko sczytywał prędkość. Czy ustawienie go na 1000 rozwiąże w jakimś stopniu problem? To jak w inny sposób mógłbym pomierzyć prędkość oraz co sekundę wgrać rzucane informacje na plik? Oczywiście nie proszę o gotowe rozwiązanie ale chociaż o jakąś poradę jaką funkcję powinienem użyć. RE: Dziwny problem z timerem przy pomiarze prędkości - johnyNapalm - 14-01-2019 Zgaduje więc że problem tkwi w użyciu funkcji Timer1.initialize? RE: Dziwny problem z timerem przy pomiarze prędkości - es2 - 15-01-2019 (14-01-2019, 19:41)johnyNapalm napisał(a): To jak w inny sposób mógłbym pomierzyć prędkość oraz co sekundę wgrać rzucane informacje na plik?Tego nie zauważyłem, nie przyszło mi do głowy, że można wpaść na tak nierozsądny pomysł, aby W PRZERWANIU zapisywać dane do pliku! Samo zapisywanie co sekunda to głupi pomysł a w przerwaniu? Wiesz ile wykonuje się zapis do pliku? Wiesz, że zawieszasz program w przerwaniu na koszmarnie długi czas? Wiesz, że timer systemowy stoi w tym czasie, UART i wszystko co jest na przerwaniach? Dane, które chcesz zapisywać na DS musisz zapisywać w RAM. Co np minutę lub lepiej kilka, zapisuj te dane na kartę ale W PROGRAMIE GŁÓWNYM! Oczywiście, w tym czasie, program wisi, jeśli ma być coś robione, to albo na przerwaniach albo użyj RTOS ale AVR i RTOS to zły pomysł. RE: Dziwny problem z timerem przy pomiarze prędkości - marwi1 - 22-01-2019 Przeczytaj to https://majsterkowo.pl/forum/viewtopic.php?f=38&t=1974 nie jest mojego autorstwa ale biblioteka daje nowe możliwości do sterowania i pracy arduino i "można pominąć przerwania!!!!!!" RE: Dziwny problem z timerem przy pomiarze prędkości - es2 - 22-01-2019 (22-01-2019, 07:26)marwi1 napisał(a): Przeczytaj to https://majsterkowo.pl/forum/viewtopic.php?f=38&t=1974 nie jest mojego autorstwa ale biblioteka daje nowe możliwości do sterowania i pracy arduino i "można pominąć przerwania!!!!!!"Wynalazłeś koło na nowo, bo ideę którą zastosowałeś używałem w zeszłym tysiącleciu. Niestety to rozwiązanie nie przyda się autorowi. Standardowo timeout operacji na karcie SD to 500ms. Co sie stanie, jak wywołanie zapisu spowoduje "zawieszenie" uC na 500ms? RE: Dziwny problem z timerem przy pomiarze prędkości - johnyNapalm - 24-01-2019 Problem został rozwiązany za pomocą funkcji millis();. Co 100ms dane dotyczące jazdy zapisywane są do wewnętrznego bufora. Następnie pętlą sprawdzam czy bufor jest przepełniony. Jeżeli jest to zatrzymuje prace robota i zgrywam dane z bufora na kartę SD. |