mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ist Priorität der Interrupt's = Interruptadresse?


Autor: Sepp -O- (Sepp_O) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salve

Kann ich davon ausgehen dass die Priorität der einzelnen Interrupts der
Interruptadresse entspricht wobei 0x00 dem Interrupt mit der höchsten
Priorität entspricht?

Was passiert eigentlich wenn ein Interrupt von hoher Prorität
ausgeführt wird und ein Interrupt von niederer Priorität auftritt?

Diese Informationen konnte ich leider nicht im Datenblatt finden.

mfg Sepp

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
von welchem Prozessor redest du??

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin, Sepp,

Mit hoher Wahrscheinlichkeit kannst Du davon ausgehen, aber schau
besser in das Datenblatt.

"Was passiert eigentlich wenn ein Interrupt von hoher Prorität
ausgeführt wird und ein Interrupt von niederer Priorität auftritt?"

Das hängt nicht nur von der Hardware des Prozessors ab, sondern auch
vom Compiler und von Deinen Interrupt-Routinen.

Daher kein Versäumnis der Datenblatt-Autoren.
Mit meinem Compiler (GCC für AVR) kann ich zwei Arten von Routinen
schreiben. Eine davon wird vom Interrupt höherer Priorität
unterbrochen, die andere nicht.

Ciao, und viel Spaß beim Programmieren und Debuggen :-)

Wolfgang Horn

Autor: Sepp -O- (Sepp_O) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tschuldigung.

Hab ich ganz vergessen zu schreiben.

Mich interresiert es wies generell bei den AVR-Risc aussieht.

Speziell interresiert's mich bei den Controllertypen ATmega8 und
ATtiny15.

mfg Sepp

Autor: Sepp -O- (Sepp_O) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Wolfgang Horn

Ich programiere aAssambler mit AvrStudio und C mit Code Vision.

Wie und wo kann ich ersehen ob der Interrupt unterbrochen wird?

Ich hab's schon mit simulieren versucht, aber da hab ich's noch nicht
geschafft dass ich 2 Interrußt's gleichzeitig auslöse.

mfg Sepp

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beim AVR gibt es keine echten Prioritäten. Treten allerdings mehrere
Ints gleichzeitig auf, so wird die mit der kleineren Interruptadresse
zuerst ausgeführt.
Sind also Int0 und 1 freigegeben und treten beide gleichzeitig auf,
wird zuerst Int0 ausgeführt. Kommt Int1 früher, wird dieser zuerst
ausgeführt, ein in dieser Zeit auftretender Int0 interbricht NICHT die
Ausführung von Int1.
Ausnahme von dieser Regel: du gibst explizit weitere Interrupts in
einer ISR frei ("sei"). Normalerweise wird bei Annahme eines
Interrupts automatisch das i-flag gelöscht und damit weitere Interrupts
unterbunden. Die Freigabe ermöglicht allerdings allen anderen Interupts,
die gerade laufende ISR zu unterbrechen.
Sowas wirklich korrekt zu programmieren, ist nicht ganz einfach und
normalerweise nicht nötig. Ich habs noch nie gebraucht. Und wenn du
eine einfache Regel beherzigst, wirst du es auch nicht brauchen:
Interupt-Programme so kurz wie möglich halten!

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Freunde, aus meinem Compiler:

INTERRUPT() ist eine Routine, die selbst unterbrochen werden kann.
Ich habe das noch nicht benutzt, aus Faulheit wegen der Risiken.

Ciao
Wolfgang Horn

"SIGNAL(signame);

Return Value
Parameters
signame Predetermined signal name

Remarks
Introduces an interrupt handler function that runs with global
interrupts initially dis-abled."

"INTERRUPT(signame);

Return Value
Parameters
signame Predetermined signal name

Remarks
This macro creates the prototype and opening of a function that is to
be used as an interrupt. The routine will be executed with interrupts
enabled."

Autor: Sepp -O- (Sepp_O) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Hilfe

Dass hat mir etwas weitergeholfen.

Da ich mehrere Interrupt's verwende die leider etwas länger sind, muß
ich mir wie's aussieht selbst eine Verriegelung programmieren.

Gibt eigentlich eine Möglichkeit alle Interrupt's kurzfristig sauber
abzudrehen und danach wieder zu aktivieren?

mfg Sepp

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Sepp,

"Gibt eigentlich eine Möglichkeit alle Interrupt's kurzfristig
sauber
abzudrehen und danach wieder zu aktivieren?"

Das ist eine Frage der Grundstruktur des Programms - ich benutze - aus
Faulheit -
* eine schnelle Schleife in main(),
* Jede Interrupt-Routine macht nicht mehr als daß sie beispielsweise
vom UART ein empfangenes Byte und die Fehlerflags liest und in einem
Ringpuffer ablegt.
* Main()-Routine fragt dann die Zeiger auf den Ringpuffer ab, ob es was
Neues gibt.


Aber ist das was Neues?
Was könnte uns zwingen, Interrupt-Routinen so aufwendig zu machen, daß
die sich schachteln müssen?

Ciao
Wolfgang Horn

Autor: Sepp -o- (sepp_o)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salve

Ungefär so, wie du es beschrieben hast hatte ich es auch vor.

Wir haben das Problem dass im aktuellen Fall alles über Interrupt's
läuft.

Und da der Mikrokontroller als Fail-Save funktioniert, sollten doch so
viele Fehlermöglichkeiten wie möglich untersucht, bewertet und soweit
wie möglich vermieden werden.

Ich möchte also ganz genau wissen was der Mikrocontroller wie macht.

Und die Interupt's sind ein Bereich den ich mir jetzt ganz genau
anschaue.

mfg Sepp

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sepp,

"Gibt eigentlich eine Möglichkeit alle Interrupt's kurzfristig
sauber abzudrehen und danach wieder zu aktivieren?"

Jo, das nennt sich cli() und sei().

Ist z.B. nötig, wenn man Variablen mit Interrupts austauscht, auf die
nicht atomar zugegriffen werden kann (16 oder 32 Bit).


"Wir haben das Problem dass im aktuellen Fall alles über Interrupt's
läuft."

Dann verschenkst Du aber eine Ausführungsebene.

Es programmiert sich einfacher, wenn man alle nicht eilige Sachen im
Main macht, da dann nicht soviel gepusht und gepopt werden muß. D.h.
der Code wird kleiner und schneller.


Peter

Autor: Sepp -o- (sepp_o)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salve

Klar sollte man so viel wie möglich im Main machen.

Leider kann ich in dieser Anwendung nur mit Interrupts arbeiten.
Ich muz dabei genaue Zeitintervalle einhalten und auf Pegeländerungen
eines externen Eingangs reagieren.

Ich habe in diesem Fall eigentlich keine Aufgaben die im Main
abgearbeitet werden können.
Es gibt da leider nur eilige sachen deren Dringlichkeit aber unterstuft
ist.

Danke für den Tipp mit cli().
Das werd ich gleich mal ausprobieren.

mfg Sepp

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.