26-08-2018, 13:49
Użyj trybu CTC dla timera 1.
Jak już używasz (co nie jest rozsądne) zliczania od okeślonej wartości do przepełnienia, to licznik powinieneś ładować w przerwaniu na jego początku a nie końcu. Przy małym podzielniku trzeba by jednak uwzględnić czas jaki minie zanim wejdziesz w przerwania (czas ten jest nieznany. bo może akurat obsługiwane jest inne przerwanie) i czas jaki jest poświęcony na odłożenie rejestrów na stos (ten czas mozna obliczyć). Można tez dać wstawkę ASM i załadować rejestr TCNT1 zaraz po wejściu w przerwanie (niestety musisz w ASM odłożyć co nieco na stos).
Po co więc kombinować, użyj CTC.
W przerwaniu zmieniaj sobie jakieś GPIO i sprawdź czy masz przerwanie dokładnie co 500ms.
Z obliczeń w przerwaniu zrób tylko coś w rodzaju:
Resztę obliczeń rób w petli głównej.
Jak już używasz (co nie jest rozsądne) zliczania od okeślonej wartości do przepełnienia, to licznik powinieneś ładować w przerwaniu na jego początku a nie końcu. Przy małym podzielniku trzeba by jednak uwzględnić czas jaki minie zanim wejdziesz w przerwania (czas ten jest nieznany. bo może akurat obsługiwane jest inne przerwanie) i czas jaki jest poświęcony na odłożenie rejestrów na stos (ten czas mozna obliczyć). Można tez dać wstawkę ASM i załadować rejestr TCNT1 zaraz po wejściu w przerwanie (niestety musisz w ASM odłożyć co nieco na stos).
Po co więc kombinować, użyj CTC.
W przerwaniu zmieniaj sobie jakieś GPIO i sprawdź czy masz przerwanie dokładnie co 500ms.
Z obliczeń w przerwaniu zrób tylko coś w rodzaju:
Kod:
zliczne impulsy = speedImpulseCounter;
speedImpulseCounter = 0;
Resztę obliczeń rób w petli głównej.