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
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.
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...
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.
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.
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 :)
@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.
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.
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.
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.