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

Kod w języku C z wstawką asemblerową dla ATmega2560 - przerwanie od watchdoga

imaiden 17 Lut 2022 01:36 447 3
REKLAMA
  • #1 19888856
    imaiden
    Poziom 4  
    Witam wszystkich, proszę o pomoc w rozwiązaniu problemu w kodzie w języku C ale ze wstawką asemblerową. Poniżej zamieszczam kod.

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


    Opis działania kodu. Za każdym razem, kiedy występuje przerwanie od watchdoga zwiększa się o jeden wartość w rejestrze r23. To jest zliczanie ilości resetów. Wartość rejestru r21 informuje nas o źródle wystąpienia przerwania od watchdoga. Za każdym razem, kiedy ono występuje uC wprowadzany jest w stan uśpienia przez komendę "SLEEP_MODE_IDLE;" I teraz pojawia się problem, którego nie potrafię rozwiązać. Być może dla większości z Was to żaden problem, ale jeśli o mnie chodzi o to procesorami mam po raz pierwszy w życiu do czynienia. Rzecz w tym, żeby kiedy r23 osiągnie wartość 4 lub większą, żeby uC nie wchodził już w stan uśpienia. Instrukcja if raczej nie wchodzi tutaj w grę. Czy ktoś z Was ma może pomysł jak rozwiązać problem? Będę wdzięczny za podpowiedzi.
  • REKLAMA
  • #2 19888978
    mpier
    Poziom 29  
    Witam,
    jaki problem chcesz rozwiązać? Pokaż treść zadania.
    Temat podobny do poprzedniego, w którym też brakuje pytania.

    Pozdrawiam.
  • REKLAMA
  • #3 19889107
    excray
    Poziom 41  
    Nie za bardzo wiadomo co chcesz osiągnąć i czemu mieszasz w tym celu C z asemblerem. Napisz coś więcej o tym projekcie, co, po co i dlaczego.
  • #4 19889230
    imaiden
    Poziom 4  
    Okej, wklejam zatem treść polecenia.

    "Napisać program, który po uruchomieniu konfiguruje licznik WDT w tryb Interrupt and System
    Reset Mode z czasem przepełnienia 1000 mikrosekund. Wykorzystać jeden z rejestrów
    ogólnego przeznaczenia do zliczania liczby wystąpień przerwań od WDT. Drugi z rejestrów
    wykorzystać do odczytania wartości z rejestru MCUSR, w którym przechowywana jest informacja
    o źródle poprzedniego resetu. Odczyt ten należy wykonać tylko na początku programu.
    Wprowadzić mikrokontroler w jeden stanów uśpienia (bez znaczenia, który gdyż przerwanie od
    WDT wybudza mikrokontroler z każdego trybu uśpienia) a po każdym wystąpieniu przerwania
    wprowadzać mikrokontroler w tryb uśpienia ponownie. Zaimplementować warunek, w którym po
    czwartym przerwaniu od WDT, mikrokontroler nie wchodzi w tryb uśpienia. Należy program
    zapętlić aby nie zawiesić mikrokontrolera i poczekać na przepełnienie WDT, które powinno
    zresetować mikrokontroler. Po resecie sprawdzić czy w rejestrze przechowującym wartość rejestru
    MCUSR znajduje się informacja o resecie, którego źródłem był WDT.
    Sprawdzić w jaki sposób
    uniemożliwia się wystąpienie resetu po wywołaniu przerwania w przypadku prawidłowo
    działającego programu. Wykorzystać to do celowego umożliwienia przepełnienia WDT po
    czwartym wystąpieniu przerwania od WDT."


    Czas na razie ustawiony jest najmniejszy możliwy. Liczba przerwań ktore wystapiły zliczana jest w r23. W kolejnym rejestrze odczytuje się MCUSR. Teraz mam problem, jak zaimplementować warunek, żeby uśpienie nie włączało się po czwartym przerwaniu wdt. Czy może ktoś z Was ma na to pomysł?

    Edit:
    Nieważne, nie było tematu. Prowadzący zmienił treść polecenia. Temat do zamknięcia.
REKLAMA