logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega164P - Jak poprawnie zrealizować programowy reset za pomocą watchdog'a?

Danoda 24 Mar 2013 15:14 1407 3
REKLAMA
  • #1 12105166
    Danoda
    Poziom 10  
    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:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    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++
    Zaloguj się, aby zobaczyć kod


    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
  • REKLAMA
  • #2 12106984
    akajarz
    Poziom 23  
    Wszystko co przychodzi mi do głowy to zmienić kolejność
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jak wygląda układ od strony sprzętowej, możesz pokazać schemat?
  • REKLAMA
  • Pomocny post
    #3 12107182
    Krauser
    Poziom 26  
    W wielu nowszych AVRach jeśli watchdog był źródłem resetu to zostaje włączony automatycznie, bo bit WDE jest ustawiany tak jak WDF z rejestru MCUSR. Pozostałe bity rejestru WDTCSR są wyzerowane, a to oznacza, że ustawiony jest minimalny czas. Wyłączenie watchdoga należy wykonać przed funkcją main. Służą do tego sekcje .initx. Ponieważ będzie to funkcja w C to należy ją umieścić w .init3
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodatkową zmienną MCUSR_copy można wykorzystać do sprawdzenia źródła resetu.
  • #4 12107259
    Danoda
    Poziom 10  
    Cześć
    Nie żebym "żydził" pokazania schematu, ale nie sądzę, że problem jest sprzętowy gdyż działanie urządzenia jest poprawne w stopniu takim, że watchdog mógłby być zbędny, ale chciałem go użyć eksperymentalnie, żeby coś tam sprawdzić w działaniu programu. Czy nadal chciałbyś żebym zamieścił schemat? Może napisz co Ci chodzi po głowie.

    Dodano po 1 [godziny] 49 [minuty]:

    Krauser dzięki, to pomogło. Przy okazji pozwól, że zapytam bez googlowania tematu, gdzie mogę zasięgnąć więcej informacji o sekcjach initx?
    Już wiem gdzie szukać informacji o sekcjach :).

    Pozdrawiam
REKLAMA