Witam
Proszę o pomoc w zindentyfikowaniu problemu. Otóż jestem w trakcie nauki programowania uC AVR i chciałbym w swoim programie umieścić programowy reset za pomocą watchdog'a. Zależy mi na kompletnym resecie żeby program "na świeżo" wystartował. Po zasięgnięciu do noty katalogowej uC znalazłem opis jak to działa i jak to zdefiniować. Ponieważ korzystam z WINAVR to również korzystam z gotowej biblioteki wdt.h i wykorzystuję funkcje:
Nie korzystam z funkcji restartu licznika wdr, gdyż chcę żeby reset wykonał się od razu gdy to zadeklaruję w programie. Może jednak tu jest coś nie tak w moim toku rozumowania. W każdym razie robię tak, że na samym początku funkcji głównej wyłączam watchdog'a, a potem chcę (w warunku który znajduje się w nieskończonej pętli) włączyć watchdog'a, żeby zrobił reset. Oczywiście wcześniej wyłączam globalne przerwania cli();
W skrócie wygląda to tak:
Problem polega na tym, że program wykonuje się poprawnie do momentu gdzie napotyka na funkcję włączenia watchdog'a, ale jakby się zawieszał i nie podejmuje pracy od początku. Jakby pozostawał w tym zawieszeniu. Po tym uruchomienie programu jest możliwe tylko po przeprogramowaniu na nowo uC i to po uprzednim odpięciu zasilania. Podejrzewam, że watchdog ustawia sobie flagę(do końca nie potrafię sprecyzować jaką flagę) i póki "coś" nie nastąpi nie pozwala na przywrócenie pracy uC. Tylko nie wiem czym jest to "coś". Proszę o support.
P.S. Nie włączałem fusebitu WDTON. W przerwaniu odbieram znaki z UART'a.
Z góry dzięki za pomoc
Pozdrawiam Daniel
Proszę o pomoc w zindentyfikowaniu problemu. Otóż jestem w trakcie nauki programowania uC AVR i chciałbym w swoim programie umieścić programowy reset za pomocą watchdog'a. Zależy mi na kompletnym resecie żeby program "na świeżo" wystartował. Po zasięgnięciu do noty katalogowej uC znalazłem opis jak to działa i jak to zdefiniować. Ponieważ korzystam z WINAVR to również korzystam z gotowej biblioteki wdt.h i wykorzystuję funkcje:
Kod: C / C++
Nie korzystam z funkcji restartu licznika wdr, gdyż chcę żeby reset wykonał się od razu gdy to zadeklaruję w programie. Może jednak tu jest coś nie tak w moim toku rozumowania. W każdym razie robię tak, że na samym początku funkcji głównej wyłączam watchdog'a, a potem chcę (w warunku który znajduje się w nieskończonej pętli) włączyć watchdog'a, żeby zrobił reset. Oczywiście wcześniej wyłączam globalne przerwania cli();
W skrócie wygląda to tak:
Kod: C / C++
Problem polega na tym, że program wykonuje się poprawnie do momentu gdzie napotyka na funkcję włączenia watchdog'a, ale jakby się zawieszał i nie podejmuje pracy od początku. Jakby pozostawał w tym zawieszeniu. Po tym uruchomienie programu jest możliwe tylko po przeprogramowaniu na nowo uC i to po uprzednim odpięciu zasilania. Podejrzewam, że watchdog ustawia sobie flagę(do końca nie potrafię sprecyzować jaką flagę) i póki "coś" nie nastąpi nie pozwala na przywrócenie pracy uC. Tylko nie wiem czym jest to "coś". Proszę o support.
P.S. Nie włączałem fusebitu WDTON. W przerwaniu odbieram znaki z UART'a.
Z góry dzięki za pomoc
Pozdrawiam Daniel