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

[Atmega8][C] Przerwanie zewnętrze INT0 nieoczekiwane wyowłanie

y0yster 14 Cze 2011 10:14 1565 2
REKLAMA
  • #1 9609887
    y0yster
    Poziom 19  
    Witam,

    Używam przerwania zewnętrznego na INT0 w konfiguracji na zbocze opadające.

    Funkcja przerwania jest definiowana w ten sposób:

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


    Wszystko działa bardzo dobrze, oprócz jednej rzeczy. W przerwaniu wykonuje się kod, który powoduje powstanie zbocza opadającego na pinie, z którego jest wywoływane przerwanie. Jest on wykonywany tylko raz. Przy kolejnym wejściu do przerwania INT0 nie jest wykonywany ten kod.

    Pomimo zastosowania parametru ISR_BLOCK uC jeszcze raz wykonuje przerwanie. Wygląda na to, że jest odkładane wywołanie przerwania na stos, a zaraz po zakończeniu pierwszego Atmega wskakuje do tego odłożonego na stosie.

    Co można w takiej sytuacji zrobić?

    Dodam również, że wszystkie zmienne używane w ciele przerwania są zaopatrzone słowem violatile, także proszę nie szukać tam problemu.
  • REKLAMA
  • Pomocny post
    #2 9609949
    BoskiDialer
    Poziom 34  
    Jeśli funkcja obsługi przerwania powoduje ponowne wyzwolenie samego siebie, to jest to wynikiem tego, że flaga przerwania jest kasowana tylko podczas wchodzenia do przerwania. Podczas wykonywania funkcji obsługi przerwania flaga INTF0 może zostać ponownie ustawiona, co spowoduje ponowne wejście do ISR zaraz po zakończeniu (ISR_BLOCK nie powoduje zablokowania źródła przerwania tylko niemożliwość zagnieżdżania przerwań). Rozwiązanie jest proste: na końcu ISR musisz dodać instrukcję postaci:
    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA