Forum: Mikrocontroller und Digitale Elektronik Wenn sich ein Timer und ein ext Interupt in die Quere kommen


von Stefan (Gast)


Lesenswert?

Hallo

Ich habe mich gefragt, wie könnte ich es beim AVR machen, das ein 
externer Interupt Vorrang hat zum Timer. Muß jetzt nicht unbedingt ein 
externer Interupt sein. Frage mich auch, wie ich bei 2 Timern sagen 
kann, das einer von Ihnen Vorrang hat, obwohl der andere Timer gerade 
beim Ablauf ist.

Ist das irgendwie möglich? Gibts da Tricks so wie bei den 8051'ern?

von Peter D. (peda)


Lesenswert?

Stefan wrote:

> Ist das irgendwie möglich? Gibts da Tricks so wie bei den 8051'ern?

Nein, einstellbare Interruptprioritäten gibt es leider nicht.

Man kann zwar innerhalb eines Interrupts die Interrupts wieder 
freigeben, aber damit sind alle wieder aktiv, was die Gefahr eines 
Stacküberlaufs heraufbeschwört.
Ich habe damit schlechte Erfahrungen gemacht und mache es nicht mehr.

Beim AVR bleibt nur, die Interrupthandler möglichst kurz zu halten und 
den nicht so eiligen Rest in der Mainlop zu machen.


Peter

von Willi W. (williwacker)


Lesenswert?

Man kann im Interrupt auch nur einen speziellen Interrupt freigeben, das 
ist aber ein Mordsgebastel:

Also alle nicht erwünschten Interrupts sperren, Globale Interrupts 
freigeben.

Damit kann der freigegebene Interrupt den jetzt laufenden Interrupt 
interrupten.

Am Ende alles wieder rückgängig.

Mich wundert, dass ich bisher noch nicht über dieses Problem gestolpert 
bin, aber irgendwie habe ich immer eine andere, bessere Lösung gefunden. 
Vielleicht denkst Du nochmal darüber nach und postest eventuell 
nochmals.

Generell würde mich interessieren, wie Du Dein Problem gelöst hast.

Ciao
Willi

von Ralph (Gast)


Lesenswert?

Wenn Interupt Prioritäten in einem Projekt notwendig sind und der 
gewählte µC das nicht bietet, dann hast du den falschen µC ausgesucht.

von Detlef _. (detlef_a)


Lesenswert?

Ralph wrote:
> Wenn Interupt Prioritäten in einem Projekt notwendig sind und der
> gewählte µC das nicht bietet, dann hast du den falschen µC ausgesucht.

Priorisierung geht auch in Software wenn der Prozessor das hardwaremäßig 
nicht unterstützt: Eine gemeinsame Interupt Service Routine, auf die von 
allen Interrupts verzweigt wird. Sich merken, woher der Interrupt kam. 
Diese Routine checkt dann die Prioritäten und verzweigt ggf. auf die 
interruptspezifische ISR.

So hab ich das jedenfalls immer gemacht.

Cheers
Detlef

von crazy horse (Gast)


Lesenswert?

sicher gibts Lösungsmöglichkeiten - nötig wars bei mir noch nie. Was 
nutzt mir eine grosse Software-Verzweigung, die zwar letztendlich 
Prioritäten setzt, insgesamt dann aber doch länger dauert, als wenn die 
direkt hintereinander abgearbeitet werden, da kurz und knackig.
Wirklich wichtig ist mir exaktes Timing bei Zeitmessungen - dafür gibts 
ja die ICP-Funktion, also völlig unabhängig von anderen Ints. Kritisch 
wirds natürlch da auch, wenn beispielsweise die Triggerflanke 
umgeschaltet werden muss und das nächste Signal sehr schnell kommt.
Ich hätte gerne mal ein Anwendungsbeispiel, wo die Interruptstruktur des 
AVR überfordert wäre, obwohl der Chip ansonsten gut zur Applikation 
passt. Natürlich kann man Anwendungsfälle erfinden.

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.