Neuer Interrupt wähernd SIGNAL-Funktion läuft

Gast #177204
Hallo,

ich habe zwei SIGNAL()-Funktionen. Eine wird ausgelöst, wenn über die
USART ein Zeichen empfangen wurde, um das zu verarbeiten und die andere
wird in regelmässigen Abständen durch einen internen Timer-Interrupt
ausgelöst.

Während der Abarbeitung einer SIGNAL-Funktion wird ja nicht in eine
andere Interrupt-Funktion gesprungen.

Die Frage ist nun, wird denn danach gesprungen? Also, wenn ein
Timer-Interrupt ausgelöst wird, aber nicht in die Routine gesprungen
wird, weil gerade meine USART-SIGNAL-Funktion läuft, wird dann nach der
Abarbeitung der USART-Funktion noch die Timer-Funktion abgearbeitet?
Oder fällt die dann unter den Tisch? (Die Genauigkeit des Timers ist
hier nicht soo wichtig).

Falls es eine Rolle spielt: ATMega32.

Danke,
Sebastian
Gast #177207
Der 2. Interrupt wird abgearbeitet, wenn der erste beendet ist, genauer:
wenn das I-Flag im Register SREG (gloabal IR enable) wieder 1 ist.

Ein IR geht deshalb nicht verloren (höchstens Du wartest solange, dass
schon der 2.Timer-IR aufgetreten ist).

Stefan
Gast #177209
>> genauer:
>> wenn das I-Flag im Register SREG (gloabal IR enable) wieder 1 ist.
ich mag mich ja täuschen, aber dazwischen wird noch eine Instruction
aus dem laufenden Programm abgearbeitet.
Also für genaues Timing sollte man wirklich das Datenblatt hernehmen,
und so gesehen ist Peters Antwort absolut richtig.

grüsse leo9
Gast #177212
> Eine Interrupt-Funktion kannst du unterbrechbar machen indem du am
> Anfang der Funktion ein SREG |= 128; schreibst.

Das dürfte so ziemlich der ineffektivste Weg sein.  Davon abgesehen,
daß die hartcodierte Konstante 128 Sch***e ist (wenn schon, solltest
Du (1 << SREG_I) schreiben, damit man auch weiß, wofür's überhaupt
gut
ist), diese Operation braucht 3 Befehle (IN, ORI, OUT), da SREG nicht
mehr in dem Bereich ist, der durch SBI addressiert werden kann.

Was glaubst Du, wofür's einen SEI Befehl gibt (in C: sei();)?  Der
braucht nur einen Befehl.

Wenn Du das wirklich gleich am Anfang Deiner ISR haben willst (vorher
bitte genau drüber nachdenken -- bei der UART Rx Routine
beispielsweise ist das völlig tödlich!), dann kannst Du die ISR auch
gleich als INTERRUPT() deklarieren, dann kümmert sich der Compiler
bereits darum, bei erster sich bietender Gelegenheit ein SEI
einzubauen.
Gast #177213
Hallo nochmal. Interessant. Ich wusste nicht (hab auch nicht drüber
nachgedacht, wenn ich ehrlich bin), dass man sei() in einer
USART-SIGNAL-Funktion aufrufen kann, wenn man (wegen USART) keine
INTERRUPT-Routine draus machen kann. Eigentlich logisch. Hab ich aber
dieses Mal nicht gemacht. Wie gesagt, so kritisch ist das Timing für
mich nicht.

Wie auch immer, habe meinen Fehler gefunden (der mich überhaupt zu
dieser Frage verleitet hat). War elektrischer Natur (grrrr. Da sucht
man tagelang vergeblich nach Fehlern im Code und dann sowas).

Danke.

Gruß,
Sebastian

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.