Witam. Pisząc program natknąłem się na pewien problem, który uniemożliwia mi pójście dalej. Otóż potrzebuję wykonać określone operacje w równych odstępach czasu. Docelowo będzie to coś koło 2-5 minut, ale w czasie testów pracuję z mniejszymi odstępami. Ustawiłem Timer1 w tryb CTC i ustawiłem rejestr OCR1A na 15625, co przy taktowaniu 16MHz daje przerwanie co 1 sekundę. Oto istotne fragmenty kodu:
Po odpaleniu komputer faktycznie odbiera kolejne liczby. Napisałem skrypt, który dokładnie zmierzy czas odbierania pierwszych 100 liczb. Liczby, rzecz jasna, powinny wysyłać się co 5 sekund. Wynik całkowicie mnie zadowala, bo okazuje się że między odebraniem pierwszej i setnej liczby minęło 499.982 sekund.
Problem natomiast pojawia się wówczas, gdy funkcja obsługi przerwania wykonuje się długo. Docelowo będzie sterować portami przez około 16 sekund. Bezpośrednio pod USART_Transmit(z); wstawiłem linijkę która będzie udawać właśnie takie opóźnienie:
oraz zmieniłem warunek z if (x == 5) na if (x == 30). Odpaliłem skrypt ponownie. Spodziewałem się, że liczby będą przychodzić równo co 30 sekund, a tu niestety klops - przychodzą co 46 sekund!
Nie do końca rozumiem dlaczego tak się dzieje... przecież w przerwaniach chodzi właśnie o to, żeby wykonywały się równo co zadaną ilość taktów, bez względu na to co jest wewnątrz funkcji obsługi przerwania...
Czy ma ktoś jakiś pomysł jak można temu zaradzić? Taki bubel całkowicie krzyżuje mi plany. Na chwilę obecną równie dobrze mógłbym wykonywać te 16-sekundowe operacje a następnie po prostu czekać odpowiednią ilość czasu - wyszłoby to na plus, bo różnica wynosiłaby kilka sekund po 100 wywołaniach, a nie po 16 za każdym następnym.
Dzięki i pozdrawiam
mopsiok
Kod: C / C++
Po odpaleniu komputer faktycznie odbiera kolejne liczby. Napisałem skrypt, który dokładnie zmierzy czas odbierania pierwszych 100 liczb. Liczby, rzecz jasna, powinny wysyłać się co 5 sekund. Wynik całkowicie mnie zadowala, bo okazuje się że między odebraniem pierwszej i setnej liczby minęło 499.982 sekund.
Problem natomiast pojawia się wówczas, gdy funkcja obsługi przerwania wykonuje się długo. Docelowo będzie sterować portami przez około 16 sekund. Bezpośrednio pod USART_Transmit(z); wstawiłem linijkę która będzie udawać właśnie takie opóźnienie:
Kod: C / C++
oraz zmieniłem warunek z if (x == 5) na if (x == 30). Odpaliłem skrypt ponownie. Spodziewałem się, że liczby będą przychodzić równo co 30 sekund, a tu niestety klops - przychodzą co 46 sekund!
Nie do końca rozumiem dlaczego tak się dzieje... przecież w przerwaniach chodzi właśnie o to, żeby wykonywały się równo co zadaną ilość taktów, bez względu na to co jest wewnątrz funkcji obsługi przerwania...
Czy ma ktoś jakiś pomysł jak można temu zaradzić? Taki bubel całkowicie krzyżuje mi plany. Na chwilę obecną równie dobrze mógłbym wykonywać te 16-sekundowe operacje a następnie po prostu czekać odpowiednią ilość czasu - wyszłoby to na plus, bo różnica wynosiłaby kilka sekund po 100 wywołaniach, a nie po 16 za każdym następnym.
Dzięki i pozdrawiam
mopsiok
