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

ATmega324PA - zmiana taktowania po resecie przez WDT, jak wykonać soft reset?

chlebok 02 Cze 2020 13:49 426 6
  • #1 18734072
    chlebok
    Poziom 10  
    Cześć, po włączeniu wdt i resecie procek jakby zmienia taktowanie , zdaje się że procek przyspiesza.
    Czy może ktoś wie czym to może być spowodowane?

    Szukam rozwiązania aby zrobić programowy reset.

    Załączam filmik.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 18734442
    szelus
    Poziom 34  
    avr-libc manual napisał:
    Note that for newer devices (ATmega88 and newer, effectively any AVR that has the option to also generate interrupts), the watchdog timer remains active even after a system reset (except a power-on condition), using the fastest prescaler value (approximately 15 ms). It is therefore required to turn off the watchdog early during program startup...

    Jednym słowem to, co obserwujesz, to efekt wielokrotnego resetu w różnych miejscach programu po pierwszym zadziałaniu watchdog-a.
  • #3 18735101
    chlebok
    Poziom 10  
    Dzięki za odpowiedź. Z twojego posta wynika , że wystarczy wyłączyć na początku wdt. Może coś nie łapię, ale jak dobrze rozumiem to jednak rozwiązanie tkwi gdzieś indziej.
    Dla jasności , ten kod nie działa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    edit: Nie działa tzn. powoduje ten sam efekt co poprzednio , bez wył. wdt
  • #4 18735201
    jez2000
    Poziom 9  
    Spróbuj wyłączyć wdt w startupie przed main
  • #5 18735755
    chlebok
    Poziom 10  
    jez2000 napisał:
    Spróbuj wyłączyć wdt w startupie przed main

    Jak procesor ma wykonać funkcje poza main?
    Skąd taki pomysł? Patrząc na konsole kompilatora myślę , że sam nie próbowałeś nigdy takiego rozwiązania :P

    Dodano po 38 [minuty]:

    Zrobiłem coś co powinienem zrobić na początku , czyli zajrzałem do dokumentacji :D.
    324PA DATASHEET napisał:
    Note: If the Watchdog is accidentally enabled, for example by a runaway pointer or brown-out condition, the device will be reset and the Watchdog Timer will stay enabled. If the code is not set up to handle the Watchdog, this might lead to an eternal loop of time-out resets. To avoid this situation, the application software should always clear the Watchdog System Reset Flag (WDRF) and the WDE control bit in the initialization routine , even if the Watchdog is not in use.

    Poprawcie mnie proszę , bo mi to nie działa.:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 18736357
    rylu
    Poziom 11  
    Prawie dobrze, tylko trochę nie doczytałeś :) , możesz to zrobić tak jak zacząłeś wpisując sam do rejestru WDTCSR, ale musisz zrobić to w dwóch krokach. Najpierw odblokować zabezpieczenie ustawiając w rejestrze bity WDCE oraz WDE (istotna jest tutaj suma logiczna z zawartością rejestru, żeby nie wyzerować preskalera i nie spowodować kolejnego resetu od watchdog). W drugim kroku wyłączasz watchdog wpisując wartość zero do rejestru WDTCSR.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    lub prościej korzystając z makra
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Odnośnie wykonania jakiś instrukcji przed funkcją main, robisz to tak
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 18738165
    chlebok
    Poziom 10  
    rylu napisał:

    wdt_reset();
    MCUSR &= ~_BV(WDRF);
    wdt_disable();

    Wielkie dzięki, działa.
    wdt_reset(); na początku nie potrzebny , z resztą nota nie wspomina. Nie widzę zastosowania z resetowania licznika watchdog w tym miejscu.

    Dzięki za poradę odnośnie jak wykonać funkcje przed main. W tym przypadku jej nie użyłem, ale będę miał wiedzę na zaś.
REKLAMA