www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interruptstrukturen


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich möchten mit einem Mikrocontroller, der keine gegenseitgig
unterbrechbaren Interrupts (wie z.B. der C166) unterstützt
programmieren und dabei eine ähnliche Interruptstruktur erzeugen wie
sie der C166 hardwareseitig besitzt. D.h. die Abarbeitung der
Interrupts soll Priotirätengesteurt funktionieren und wenn ein
Interrupt gerade abgearbeitet wird und es kommt einer mit höherer
Priorität, dann soll dieser zwischengeschoben werden.
Habt ihr eine Idee, wie man dieses am günstigsten machen kann?
Habe mir schon überlegt, dass ich vielleicht gleich nach dem springen
in die ISR ein Flag setze und dann alle Ints wieder frei gebe. Und wenn
dann ein neuer kommt prüfe ich dann ob die Priorität des neuen Ints
höher ist.
Oder vielleicht könnte man auch alle Vektoren auf eine Funktion legen,
die dann entscheidet. Also so ne Art switch case Struktur, die nach
Prioritäten sortiert ist.

Habt Ihr da vielleicht schonmal was in der Richtung gemacht und kennt
vielleicht eine gute Lösung? Um so eine Struktur komme ich glaube ich
nicht herum , da ich hohe Echtzeitanforderungen habe.

Viele Grüße,

Ralf

Autor: Andre Groß (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Möglichkeit währe vielleicht, wie du schon gesagt hast,
über eine gemeinsame funktion zu gehen, dir zu merken welcher
Interrupt gerade ausgeführt wird.
Prüfe dann immer ob ein höherer INT gerade in der Ausführung ist.
Wenn ja wird nur ein Merker gesetzt und die höhere INT-Fkt. muss am
Ende prüfen, ob niedrigere INTs noch ausgeführt werden sollen..
Ansonsten wird sofort ausgeführt und erst danach mit der niedrigeren
Funktion fortgefahren.

Problem ist nur, wenn mehrmals der gleiche INT in diesem Zeitraum
kommt, falls dies überhaupt möglich ist.

Hoffe ich konnte helfen.

Andre

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der gleiche Int sollte eigentlich nicht zwei mal gleich hintereinander
kommen, es sei denn, meine Signale sind gestört. Ist diese Lösung denn
aus zeitlicher Hinsicht gut, oder gibt es vielleicht noch schnellere
Lösungen? Ich muß bestimmte Zeiten sehr genau messen und habe keinen
Capture mehr frei.

Autor: Dieter Götz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das ist eigentlich ganz einfach.
Halte ein Kopie aller Interrupt Mask Register (TIMSK dund EIMSK) im
RAM. Sobald Du in einem Interrupt bist, kannst Du in den beiden
Registern alle Interrupts freigeben, die den momentan aktiven Interrupt
unterbrechen dürfen. Danach einfach wieder alle Interrupts freigeben.
Am Ende des Interrupts müssen dann die ursprünglichen Werte aus dem RAM
zurückgeschrieben werden.

Gruß
Dieter

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe vergessen zu sagen, dass es sich um einen Hitachi H8 handelt, den
ich programmieren muß. Bei diesem Controller sind die Interrupt-Enable
Register über eine ganze Reihe von Registern verteilt, die ich dann
alle zunächst zwischenspeichern müsste um sie dann wieder am Ende
freigeben zu können.

Gruß,

Ralf

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Ralf,

das gefällt mir am AVR auch nicht, da ist es genauso.
Zu allem Übel sind da manchmal auch die Interruptflags mit drin. D.h.
die muß man dann noch extra rausmaskieren.

Auch müssen beim AVR die UART und I2C-Interrupts sich erst selber
sperren, da sie nicht beim Eintritt gelöscht werden. Sonst würden sie
sich immer wieder selbst aufrufen, bis der Stack überläuft.


Beim 8051 sind die Interruptbits ins 1-2 Bytes mit der globalen
Interruptfreigabe zusammengefaßt. Aber der hat ja schon 2..4
Prioritäten in Hardware.


Ist schon verrückt. Da wo es bequem wäre, braucht mans nicht. Und da wo
mans braucht, ist es maximal umständlich :-(


Peter

Autor: Andre Groß (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeitlich gesehen ist die von mir vorgeschlagene Lösung eher
im Mittelfeld.. im oberen Feld währe wohl einfach ein anderer MC. ;-)
Du solltest sie halt einfach mal (zumindest teilweise)implementieren
und dann die Laufzeit bzw. Verzögerung messen.
Danach kannst du ja entscheiden, ob diese für dein Projekt
ausreichend ist.

Andre

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, werde wohl nicht drumherum kommen es zu probieren. Ein anderer uC
wäre zwar schön aber man bekommt halt nicht immer das was man will
:-(.

Danke für eure Hilfe!

Ralf

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.