www.mikrocontroller.net

Forum: Compiler & IDEs Neuer Interrupt wähernd SIGNAL-Funktion läuft


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon wieder ein typischer Fall von Nichtlesen des Datenblattes !!!

Darin stehts nämlich:

"Reset and Interrupt Handling"


Peter

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Peter ist ja wieder gut drauf :)

@Sebastian
Ja, sie wird noch abgearbeitet.

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Interrupt-Funktion kannst du unterbrechbar machen indem du am
Anfang der Funktion ein SREG |= 128; schreibst.
Michael

Autor: leo9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> 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

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@leo9:
Du hast natürlich Recht.

Stefan

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke an alle Antwortenden.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.