Próbuję owinąć głowę wokół timera nadzorującego w serii ATTinyX5. Więc rzeczy, które przeczytałem, sprawiły, że wydawało się, że możesz go użyć do zrobienia czegoś konkretnego zawsze N sekund, ale nigdy tak naprawdę nie pokazał, jak to zrobić. Inni sprawiali wrażenie, jakby resetował tylko układ, chyba że coś w kodzie resetowania jest w międzyczasie liczone (co wydaje się być „normalnym” użyciem).
Czy jest jakiś sposób korzystania z WDT, tak jak TIMER1_COMPA_vect lub podobny. Zauważyłem, że ma on tryb 1-sekundowego limitu czasu i naprawdę chciałbym móc go użyć, aby coś działo się co 1 sekundę w moim kodzie (i najlepiej spać pomiędzy nimi).
Myśli?
* Aktualizacja: * Odkąd zostało zadane pytanie, mam na myśli sekcję 8.4 karty danych ATTinyX5 . Nie do końca to rozumiem, co jest moim problemem ...
Odpowiedzi:
Z pewnością możesz. Zgodnie z arkuszem danych, zegar nadzoru może być ustawiony tak, aby resetował MCU lub powodował przerwanie po uruchomieniu. Wygląda na to, że bardziej interesuje Cię możliwość przerwania.
WDT jest w rzeczywistości łatwiejszy do skonfigurowania niż zwykły Timer z tego samego powodu, dla którego jest mniej przydatny: mniej opcji. Działa na wewnętrznie skalibrowanym zegarze 128 kHz, co oznacza, że na jego taktowanie nie ma wpływu szybkość głównego zegara MCU. Może także działać w najgłębszych trybach uśpienia, aby zapewnić źródło budzenia.
Przejdę przez kilka przykładów arkusza danych, a także kod, którego użyłem (w C).
Dołączone pliki i definicje
Aby rozpocząć, prawdopodobnie będziesz chciał dołączyć następujące dwa pliki nagłówkowe, aby wszystko działało:
Ponadto używam makra <_BV (BIT)>, które jest zdefiniowane w jednym ze standardowych nagłówków AVR jako następujące (które mogą być dla ciebie bardziej rodzinne):
Początek kodu
Kiedy MCU jest uruchamiane po raz pierwszy, zwykle inicjujesz I / O, ustawiasz timery itp. Gdzieś tutaj jest dobry moment, aby upewnić się, że WDT nie spowodował resetu, ponieważ mógł to zrobić ponownie, utrzymując program w niestabilna pętla.
Konfiguracja WDT
Następnie, po skonfigurowaniu reszty układu, wykonaj ponownie WDT. Konfiguracja WDT wymaga „sekwencji czasowej”, ale jest to naprawdę łatwe do zrobienia ...
Oczywiście, twoje przerwania powinny być wyłączone podczas tego kodu. Pamiętaj, aby je później ponownie włączyć!
Procedura przerwania usługi WDT Następną rzeczą, o którą należy się martwić, jest obsługa WDT ISR. Odbywa się to w ten sposób:
MCU Sleep
Zamiast uśpienia MCU w WDR ISR, zalecam po prostu włączenie trybu uśpienia na końcu ISR, a następnie program MAIN uśpienie MCU. W ten sposób program faktycznie opuszcza ISR, zanim przejdzie w tryb uśpienia, a następnie obudzi się i przejdzie bezpośrednio do WDT ISR.
źródło
Według arkusza danych jest to możliwe. Możesz nawet włączyć zarówno przerwanie, jak i zresetowanie. Jeśli oba są włączone, pierwszy limit czasu watchdoga wyzwoli przerwanie, co spowoduje, że bit Aktywacji Przerwania zostanie rozbrojony (przerwanie wyłączone). Następny limit czasu spowoduje zresetowanie procesora. Jeśli włączysz Przerwanie bezpośrednio po jego wykonaniu, następny limit czasu (ponownie) wyzwoli tylko przerwanie.
Możesz także włączyć przerwanie i w ogóle nie włączyć resetowania. Będziesz musiał ustawić bit WDIE za każdym razem, gdy nastąpi przerwanie.
źródło
Jest to o wiele łatwiejsze niż sugerowano powyżej i gdzie indziej.
Dopóki
WDTON
bezpiecznik nie jest zaprogramowany (nie jest zaprogramowany domyślnie), wystarczy tylko ...Oto przykład kodu, który będzie wykonywał ISR raz na 16ms ...
To jest naprawdę to. Ponieważ nigdy nie włączamy resetowania watchdoga, nigdy nie musimy bawić się sekwencjami czasowymi, aby je wyłączyć. Flaga przerwania watchdoga jest automatycznie usuwana po wywołaniu ISR.
Jeśli chcesz okres inny niż co 1 sekundę, możesz użyć tych wartości tutaj, aby ustawić odpowiednie bity w
WDTCR
...Pamiętaj, że musisz wykonać sekwencję czasową, aby zmienić limit czasu. Oto kod, który ustawia limit czasu na 1 sekundę ...
źródło