18-08-2018, 12:07
Rzadko oglądam długie kody źródłowe na tym forum, bo ich wyświetlanie jest niedopracowane jak Arduino (nie można wyświetlić całości kodu, nie można jednym kliknięciem zaznaczyć całości aby obejrzeć w edytorze tekstu, itd). Administratorzy powinni zajrzeć na Elektrodę, tam jest to zrobione bardzo dobrze.
Poświęciłem się i obejrzałem kod. Masz poważny błąd w idei jego działania. Czasochłonne operacje robisz na przerwaniach.
Nie ważne, że wyświetlanie jest wykonywane co sekundę, ważne, ze wykonuje się ponad 1ms. Biblioteki obsługi LCD dla Arduino sa tak kiepskie, że szkoda gadać. Przeważnie znajdziesz tam delay a to dyskwalifikuje ich użycie w przeraniach w tym przypadku. AVR nie ma wielopoziomowego systemu przerwań. Gdyby miał, to dla wyświetlania ustawiasz niski priorytet i po sprawie. Pseudo wielopoziomowość (w Arduino wszystko jest pseudo: pseudo debugowanie, pseudo wielopoziomowość) możesz uzyskać odpowiednio deklarując przerwania ale może być problem z USART.
Wywal czasochłonne operacje do pętli głównej. W niej, korzystając z millis np sekundę i wyświetlaj wyniki pomiarów.
ZAPAMIĘTAJ generalna zasadę "Przerwania powinny wykonywać się szybko". Są oczywiście pewne odstępstwa ale nie w tym przypadku.
W przerwaniu zliczaj więc impulsy, w przerwaniu co np sekundę przepisuj wynik zliczania do zmiennej dostępnej w programie głównym i przygotuj następny pomiar.
Poświęciłem się i obejrzałem kod. Masz poważny błąd w idei jego działania. Czasochłonne operacje robisz na przerwaniach.
Kod:
//threads
timer.attach(0,1,measureInjectorImpuls);
timer.attach(1,500,calculateSpeedAndFuelConsumption);
timer.attach(2,1,calculateDistance);
timer.attach(3,1000,displayDistance);
Wywal czasochłonne operacje do pętli głównej. W niej, korzystając z millis np sekundę i wyświetlaj wyniki pomiarów.
ZAPAMIĘTAJ generalna zasadę "Przerwania powinny wykonywać się szybko". Są oczywiście pewne odstępstwa ale nie w tym przypadku.
W przerwaniu zliczaj więc impulsy, w przerwaniu co np sekundę przepisuj wynik zliczania do zmiennej dostępnej w programie głównym i przygotuj następny pomiar.