• 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
Niedokładność pomiarowa - problem z odczytywaniem impulsow
#30
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.
Kod:
//threads  
timer.attach(0,1,measureInjectorImpuls);
timer.attach(1,500,calculateSpeedAndFuelConsumption);
timer.attach(2,1,calculateDistance);
timer.attach(3,1000,displayDistance);
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.
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Niedokładność pomiarowa - problem z odczytywaniem impulsow - przez es2 - 18-08-2018, 12:07

Skocz do:


Przeglądający: 3 gości