Klasycznie chciałem uzyskać przerwanie co sekundę do odmierzania czasu, na płytce UNO, procesor 328, zegar 16Mhz.
Przyjąłem preskaler 1024, dalej wyszło mi 16e6/1024 = 15625 i do tylu chciałem "skrócić" licznik,
Niestety coś mi nie działało, liczyło mi znacznie szybciej (kilka rzędów wielkości) niż obliczyłem. Po podłączeniu oscyloskopu wyszło że OCR1A musi być rzędu 0.
Wyświetliłem Serial.print(OCR1A) zaraz po zapisaniu tam 15625 i rzeczywiście podawało 0. Kombinowałem z dzieleniem na rejestry H i L, ale to nic nie dawało.
Okazuje się że dopiero po zmianie kolejności uruchomienia licznika i zapisu OCR1A wartość tam wpisana zostaje zapamiętana. Dlaczego? Jest w dokumentacji coś o podwójnym buforowaniu, ale u mnie to pracuje cyklicznie i nawet jak pierwszy cykl po resecie wyjdzie nie pełny czy za długi, to za bardzo nie przeszkadza. Jeśli dobrze rozumiem to podwójne buforowanie, to po kolejnym "przepełnieniu" rejestr powinien się samoczynnie zaktualizować? A zakładam że przepełnienia były, bo miałem przerwania. No i jest napisane że buforowanie nie działa w trybie CTC, ale CTC robi się po zapisie do TCCR1B i tu widzę możliwości jeśli chodzi o znacznie kolejność wpisów do rejestrów.
Działa:
nie działa:
przerwanie w użyciu: TIMER1_COMPA_vect , które się wywołuje i tu nie ma problemu.
Przyjąłem preskaler 1024, dalej wyszło mi 16e6/1024 = 15625 i do tylu chciałem "skrócić" licznik,
Niestety coś mi nie działało, liczyło mi znacznie szybciej (kilka rzędów wielkości) niż obliczyłem. Po podłączeniu oscyloskopu wyszło że OCR1A musi być rzędu 0.
Wyświetliłem Serial.print(OCR1A) zaraz po zapisaniu tam 15625 i rzeczywiście podawało 0. Kombinowałem z dzieleniem na rejestry H i L, ale to nic nie dawało.
Okazuje się że dopiero po zmianie kolejności uruchomienia licznika i zapisu OCR1A wartość tam wpisana zostaje zapamiętana. Dlaczego? Jest w dokumentacji coś o podwójnym buforowaniu, ale u mnie to pracuje cyklicznie i nawet jak pierwszy cykl po resecie wyjdzie nie pełny czy za długi, to za bardzo nie przeszkadza. Jeśli dobrze rozumiem to podwójne buforowanie, to po kolejnym "przepełnieniu" rejestr powinien się samoczynnie zaktualizować? A zakładam że przepełnienia były, bo miałem przerwania. No i jest napisane że buforowanie nie działa w trybie CTC, ale CTC robi się po zapisie do TCCR1B i tu widzę możliwości jeśli chodzi o znacznie kolejność wpisów do rejestrów.
Działa:
Kod: C / C++
nie działa:
Kod: C / C++
przerwanie w użyciu: TIMER1_COMPA_vect , które się wywołuje i tu nie ma problemu.
