-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Interrupts bei AVRs

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    14.01.2007
    Beiträge
    73

    Interrupts bei AVRs

    Anzeige

    Hallo,

    was ich schon mal wissen wollte, was passiert wenn in einer Interruptroutine ein aderer Interrupt (sollte wieder in eine andere Interruptroutine springen) ausgelöst wird?

    Wird die dann nachdem die andere beendet ist abgearbeitet oder wird die gar nicht ausgeführt?

    Denn während einer ISR sind ja die interrupts global deaktiviert

    Anwendung z.B bei Drehzahlmessung: wenn ein ext. Interrupt auftritt soll ein Timer gestartet werden und gestoppt werden, wenn der nächste ext. Interrupt auftritt. Beim Timer müsste ich aber bei jedem Overflow eine Variable erhöhen, damit ich nachher die Zeit und somit auch die Drehzahl berechnen kann.

    Wenn nun aber gerade während der Overflow Routine ein ext. Interrupt auftritt, funktioniert das ganze dann noch?

    Wenn nein, gibt es eine andere Lösung?

    Guß Stefan

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    29
    Beiträge
    2.624
    Hallo Stefan,
    wenn während eine Interruptroutine ausgeführt wird, ein weiterer Interrupt ausgelöst wird, wird die dazugehörige Interruptroutine danach abgearbeitet, denn das dazugehörige Flag in der Interruptvektortabelle ist gesetzt.
    Sollten gleichzeitig zwei oder mehr Interrupts ausgelöst werden, wird zuerst die Interruptroutine aufgerufen, die höher/früher in der Interruptvektortabelle steht.

    Ich hoffe ich konnte Dir weiterhelfen!?

    Viele Grüße
    Florian

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    das hängt davon ab. Du kannst natürlich in der ISR die Interrupts wieder einschalten. Dann wird ggfs. endlos zwischen ISRs hin und her gesprungen.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    14.01.2007
    Beiträge
    73
    Ok, danke. Ist das bei allen AVRs so?
    In der Interruptvektortabelle stehen die interrupts der Reihe nach, in der sie aufteten?

    Gruß Stefan

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    Die Interruptvektortabelle ist eine Adresstabelle wohin das Programm springt wenn der dazugehörige Interrupt ausgelöst wird, in Assembler ist das ganz eindeutig.
    Darum sollten Interruptroutinen so kurz wie möglich gehalten werden um den nächsten nicht zu behindern.
    Wenn wärend deiner Overflow-Routine ein ext. Interrupt auftritt wird zuerst die Variable erhöht und dann erst die Routine des ext.Interrupts abgearbeitet.
    Das ist bei allen Tiny und Mega so bei den 8051 nicht.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    14.01.2007
    Beiträge
    73
    was passiert jedoch wenn ich cli() irgendwo im programm schreibe? werden die ganzen interrupts die in der zwischenzeit auftreten dann nachdem ich wieder sei() schreibe ausgeführt?

    oder kann man die interrupts hiermit deaktivieren und somit verwerfen?

    Gruß Stefan

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Soweit ich weiß wird für jeden Interrupt ein Flag gesetzt.
    Stehen also mehrere Interrupts nach einem "SEI" an, werden diese nach ihrer Reihenfolge in der Interrupt Vektortabelle abgearbeitet.
    Wenn man also vor einem "SEI" anstehende Interrupts unterbinden will, muß man das entsprechende Flag des Interrupts löschen, dann wird dieser Interrupt nach einem "SEI" nicht ausgeführt.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    29
    Beiträge
    2.624
    Hallo Stefan,
    die Interruptflags der Interruptvektortabelle bleiben so lange gesetzt, bis sie entweder manuell gelöscht oder durch die dazugehörige Interruptroutine zurückgesetzt werden.
    Wenn Du den Befehl cli (Global Interrupt Disable) bzw. die C-Funktion cli() verwendest, wird nur das globale Interrupt-Flag im Statusregister gelöscht, und somit der Aufruf der Interruptvektortabelle unterbunden, die einzelnen Interruptflags bleiben aber, soweit ich weiß, erhalten.

    Viele Grüße
    Florian

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Zitat Zitat von Florian
    die Interruptflags der Interruptvektortabelle bleiben so lange gesetzt, bis sie entweder manuell gelöscht oder durch die dazugehörige Interruptroutine zurückgesetzt werden.
    Darüber hinaus gibt es es IRQs, die nur solange getriggert werden, wie eine Bedingung erfüllt ist. Level-getriggerte externe IRQs gehören zB dazu.

    Die IRQ-Flags werden in speziellen SFRs gespeichert: den Flag-Regs. Diese gehören zu den jeweiligen Peripherie-Komponenten, zB TIFR, GIFR, EIFR, ...
    Disclaimer: none. Sue me.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    14.01.2007
    Beiträge
    73
    Das heißt wenn ich nach dem cli() wieder ein sei() schreibe, werden dann alle interruptroutinen von den interrupts ausgeführt die in der zwischenzeit aufgetreten sind?

    Gruß Stefan

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •