Forum: Mikrocontroller und Digitale Elektronik Arduino Interrupt-Prioritäten


von David S. (david_sch)


Lesenswert?

Hallo,

ich habe folgendes Problem:

Ich arbeite  mit einem Arduino Uno, dabei verwende ich sowohl einen 
Timer Interrupt als auch einen externen Interrupt. Das Problem ist, dass 
der Timer Interrupt sehr häufig auslöst und die Priorität anscheinend 
höher ist als jene des externen Interrupts. Leider bringt der externe 
Interrupt so nicht mehr die gewünschte Funktion.

Ich habe bereits im Internet gestöbert und dabei gefunden, dass die 
Priorität von der Vektoradresse des Interrupts abhängt. Gibt es beim 
Mega328P die Möglichkeit, die Interruptprioritäten einzustellen? Aus dem 
Datenblatt konnte ich leider nicht schlauer werden.

Vielen Dank!

mfG

von Georg G. (df2au)


Lesenswert?

Kann es sein, dass du das Datenblatt falsch interpretierst?
Die ATMega haben lassen nur einen Interrupt zur Zeit zu. Die Prioritäten 
beziehen sich nur auf Anforderungen, die exakt zur gleichen Zeit kommen. 
Und auch dann werden beide Anforderungen nacheinander abgearbeitet.

Im normalen Betrieb gilt "wer zuerst kommt, wird zuerst bearbeitet"

Wenn du "nestet Interrupts" haben möchtest, geht das nur per Software 
mit viel Gehirnschmalz und Aufwand.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

David S. schrieb:
> Leider bringt der externe Interrupt so nicht mehr die gewünschte
> Funktion.
Was machst du in deinem Timerinterrupt?

> Gibt es beim Mega328P die Möglichkeit, die Interruptprioritäten
> einzustellen?
Nein. Und das bringt auch nichts, denn wenn auf einem AVR 1 Interrupt 
läuft, dann kannst du den (ohne üble Tricks) nicht nochmal unterbrechen. 
Aber vermutlich lässt sich deine Aufgabe ganz ohne solche Tricks lösen. 
Man müsste nur mehr von dieser Aufgabe und dem derzeitigen Problem 
wissen...

von Cyblord -. (cyblord)


Lesenswert?

Man kann auf jeden Fall Interrupts verschachteln in dem man in einer ISR 
das I-Bit gleich wieder manuell setzt. So kann man durchaus Interrupts 
in gewissen Grenzen priorisieren. Dabei sollte man aber wissen was man 
tut und das muss ich dir als Arduino-Nutzer leider absprechen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Cyblord -. schrieb:
> Man kann auf jeden Fall Interrupts verschachteln in dem man in einer ISR
> das I-Bit gleich wieder manuell setzt.
Aber nur 1 von 100 macht solche schrägen Dinger und eigentlich nur 1 
von 1000 braucht sie tatsächlich.

Ich habe es bisher immer geschafft, mit Nachdenken und einer sinnvollen 
Interrupt-Länge mit der "normalen" Interruptverwaltung auszukommen.

von David S. (david_sch)


Lesenswert?

Georg G. schrieb:
> Kann es sein, dass du das Datenblatt falsch interpretierst?
> Die ATMega haben lassen nur einen Interrupt zur Zeit zu. Die Prioritäten
> beziehen sich nur auf Anforderungen, die exakt zur gleichen Zeit kommen.
> Und auch dann werden beide Anforderungen nacheinander abgearbeitet.

Ich verwende normalerweise Mikrocontroller, bei welchen die Prioritäten 
per Register festlegbar sind, ich wusste nicht, dass dies bei ATMega 
Mikrocontrollern nicht möglich ist. Danke!

Lothar M. schrieb:
> Was machst du in deinem Timerinterrupt?

Ich erzeuge mit meinem Arduino eine 3-phasige Wechselspannung, dazu 
werden im Timer-Interrupt die neuen PWM-Werte der einzelnen Stützstellen 
ausgegeben. Mit dem externen Interrupt möchte ich die Dauer eines 
Rechteckimpulses messen, indem ich die steigende sowie die fallende 
Flanke erkenne, die Systemzeit zu diesen Zeitpunkten erfasse und diese 
dann subtrahiere. Leider funktioniert das nicht mehr, wenn sich der 
externe Interrupt "hinten anstellen" muss.

Cyblord -. schrieb:
> Dabei sollte man aber wissen was man
> tut und das muss ich dir als Arduino-Nutzer leider absprechen.

Interessanter Ansatz. Ich wusste nicht, dass das Verwenden eines 
Arduinos sofort darauf schließen lässt, dass ihn ein Anfänger 
programmiert :)

von Falk B. (falk)


Lesenswert?

@David Schatzko (david_sch)

>ausgegeben. Mit dem externen Interrupt möchte ich die Dauer eines
>Rechteckimpulses messen, indem ich die steigende sowie die fallende
>Flanke erkenne, die Systemzeit zu diesen Zeitpunkten erfasse

Nutze dazu die Input Capture Funktion und du hast fast alle Zeit der 
Welt.

von Cyblord -. (cyblord)


Lesenswert?

David S. schrieb:
> Interessanter Ansatz. Ich wusste nicht, dass das Verwenden eines
> Arduinos sofort darauf schließen lässt, dass ihn ein Anfänger
> programmiert :)

DAS und die Tatsache dass dich ein ATMega Datenblatt nicht weiter 
bringt, sprechen Bände.
Mehr muss man nicht wissen.

Und natürlich, bevor du damit anfängst, du hast jahrelange Erfahrung in 
allen möglichen Controllern jeder Bauart. Wie jeder 3. Vollnoob nach 
eigener Aussage der hier aufschlägt.

von Norbert (Gast)


Lesenswert?

Lothar M. schrieb:
> Cyblord -. schrieb:
>> Man kann auf jeden Fall Interrupts verschachteln in dem man in einer ISR
>> das I-Bit gleich wieder manuell setzt.
> Aber nur 1 von 100 macht solche schrägen Dinger und eigentlich nur 1
> von 1000 braucht sie tatsächlich.
>
> Ich habe es bisher immer geschafft, mit Nachdenken und einer sinnvollen
> Interrupt-Länge mit der "normalen" Interruptverwaltung auszukommen.

Ich melde mich mal als der eine von Eintausend! (Stichwort 
Latenzverminderung)

Allerdings sollte man nicht nur global Interrupts wieder zulassen, 
sondern auch die spezielle, gerade aktive Interruptquelle bis zum Ende 
der ISR auf disable setzen.

Ich gebe aber jedem Recht der sagt das man wirklich wissen sollte was 
man gerade macht.

von David S. (david_sch)


Lesenswert?

Falk B. schrieb:
> Nutze dazu die Input Capture Funktion und du hast fast alle Zeit der
> Welt.

Aha, genau so eine Lösung habe ich gesucht. Vielen Dank für deine Hilfe!

Cyblord -. schrieb:
> DAS und die Tatsache dass dich ein ATMega Datenblatt nicht weiter
> bringt, sprechen Bände.
> Mehr muss man nicht wissen.
>
> Und natürlich, bevor du damit anfängst, du hast jahrelange Erfahrung in
> allen möglichen Controllern jeder Bauart. Wie jeder 3. Vollnoob nach
> eigener Aussage der hier aufschlägt

Danke für deinen sinnvollen Beitrag zu meinem Problem. Du hast den Sinn 
eines Forums definitiv verstanden!

von Peter D. (peda)


Lesenswert?

Timer-Interrupts sind die einzigen Interrupts, die man als ISR_NOBLOCK 
definieren darf (außer Input Capture). Dann können sie durch andere 
unterbrochen werden. Vorausgesetzt, die Zeit bis zum nächsten 
Timer-Interrupt ist lang genug.
Alle anderen dürfen nicht ISR_NOBLOCK sein oder man riskiert einen 
Stacküberlauf.

von 2. von tausend (Gast)


Lesenswert?

Norbert schrieb:
> Ich melde mich mal als der eine von Eintausend! (Stichwort
> Latenzverminderung)
>
> Allerdings sollte man nicht nur global Interrupts wieder zulassen,
> sondern auch die spezielle, gerade aktive Interruptquelle bis zum Ende
> der ISR auf disable setzen.
>
> Ich gebe aber jedem Recht der sagt das man wirklich wissen sollte was
> man gerade macht.

FACK

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.