Forum: Mikrocontroller und Digitale Elektronik Interrupt prioritäten änder bei atmega32


von micro1 (Gast)


Lesenswert?

Hallo,
kann man die Interrupt prioritäten ändern beim atmega32?
Ich möchte gerne den komperator interrupt auf stelle 2 legen
ist das möglich?

Damit mache ich nämlich eine Akkuumschaltung.
Und wenn der Atmega noch im timer0 oder 1 int ist dauert es zu lange um
in den komperator int zu kommen.

von A.K. (Gast)


Lesenswert?

In den Timer-Interrupts die Interrupts wieder einschalten. Geht bei den
meisten AVR-Interrupts, nämlich allen, deren Flag implizit mit dem
Aufruf der Interrupt-Routine zurückgesetzt wird.

von leo9 (Gast)


Lesenswert?

>> Geht bei den meisten AVR-Interrupts, nämlich allen,
>> deren Flag implizit mit dem Aufruf der Interrupt-
>> Routine zurückgesetzt wird.

.. und bei den anderen gehts auch wenn man das Flag per SW
zurücksetzt.
Generell sollte man aber schon recht genau wissen was man dabei tut
sonst endets in einem Aufruf- und Rücksprungchaos.

grüße leo9

von micro1 (Gast)


Lesenswert?

Ich habe aller interrupts als SIGNAL realisiert.
Geht das dann auch?
Aber wenn ich in der Timer ISR bin und in der ISR interrupts wieder
zulasse und mein komperator interrup löst aus.
Wird dann die timer ISR unterbrochen?
Weil die ist doch von höherer priorität?

Weil ich hätte es gerne so. Egal was gerade läuft.
Wenn der komperator auslöst soll sofort auf akku umgeschaltet werden

von A.K. (Gast)


Lesenswert?

"auch wenn man das Flag per SW zurücksetzt."

Bei manchen Komponenten, wie I2C/USI, kann das etwas haarig sein - den
Interrupt ausschalten ist ok, aber das Flag zurücksetzen löst manchmal
eine Aktion aus.

"Ich habe aller interrupts als SIGNAL realisiert."

Ist ok, kannst in der Routine ja das Interrupt-Flag setzen.

"Weil die ist doch von höherer priorität?"

Nein, es gibt bei AVR keine echten Prioritäten - die im Handbuch
genannten "Prioritäten" beziehen sich nur auf die Entscheidung,
welcher Vektor verwendet wird, wenn gleichzeitig mehrere anstehen.
Jeder Interrupt kann jeden unterbrechen, wenn man ihm das erlaubt.
Folglich muss man damit vorsichtig umgehen und braucht genug Platz für
den Stack.

Eine andere Frage ist übrigens, ob dein Grundansatz sinnvoll ist. Es
hat hier schon Leute gegeben, die in der Interrupt-Routine eine ewig
lange Warteschleife gebaut haben. Generell gilt, dass in
Interrupt-Routinen nur einfache schnelle Aktivitäten reingehören. Was
länger dauert, gehört ins Hauptprogramm, der Interrupt löst das dann
per Flag nur aus.

von A.K. (Gast)


Lesenswert?

"soll sofort auf akku umgeschaltet werden"

Sorg in der Auslegung der Stromversorgung und der Messschaltung dafür,
dass der Controller das schon ein paar Millisekunden vor Ultimo merkt -
also nicht die 5V messen, sondern die Spannung vor dem Regler, oder ggf.
auch die Netzspannung. Dann langt es bei jedem auch nur halbwegs
vernünftig arbeiteten Interrupt-System auch ohne verschachtelte
Interrupts.

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.