Forum: Mikrocontroller und Digitale Elektronik Interruptstrukturen


von Ralf (Gast)


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

von Andre Groß (Gast)


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

von Ralf (Gast)


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.

von Dieter Götz (Gast)


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

von Ralf (Gast)


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

von Peter D. (peda)


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

von Andre Groß (Gast)


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

von Ralf (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.