Forum: Mikrocontroller und Digitale Elektronik Frage zum Interrupt-Vector und Reset


von Thomas O. (Gast)


Lesenswert?

Hallo,

ich habe mal einige Fragen zum Interrupt-Vector der ja eigentlich als
aller erstes bei 0x0000 abgelegt wird damit ein entsprechender
Interrupt der diese Adresse anspringt zur eigentlichen Interruptroutine
umgeleitet wird. z.B.

.org 0x0000
rjmp main
rjmp Ext_Int0
rjmp Ext_Int1
...
...

Wenn ich allerdings keine Interrupts verwende, könnte ich doch das
ausfüllen der ganzen Sprünge (außer rjmp main) weglassen und durch
CLI(Clear Globel Interrupt Flag) verhindern das ein Interrupt den
Befehl an seiner Interruptadresse ausführt den ich ja garnicht gesetzt
habe? Oder doch lieber alles mit reti's ausfüllen

Angenommen ich nutze CLI nicht und es wird der Interruptvektor
angesprungen ohne das dort was steht, läuft dann das Programm dort
weiter und trifft irgendwann wieder aufs Main-Programm wodurch ich
einen unerwünschten Neustart habe oder hängt sich der AVR dort auf.

Ich nutze in meinem Programm den ADC frage aber das ADIF-Bit(Wandlung
fertig) manuell ab. Weiterhin nutze ich die 8bit PWM-Einheit im
Fast-PWM Modus und hier wird doch der Pin auch automatisch getoggelt
und es braucht keine Interruptroutine.

Also wie würdet ihr es verhindern das unerwartet ein Interrupt was
durcheinander bringt. Würde gerne auf den Interruptvektor verzichten,
da auf dem Laptop die Auflösung eh nicht so hoch ist und man da eh
immer ne ganze weile blättern muss weil das Prog etwas größer ist.

von Rahul (Gast)


Lesenswert?

Solange du die Interrupt-Enable-Flags UND das I-Flag im SREG nicht
"anfässt" ist es egal, wo dein Code steht.
Solange das I-Flag gelöscht ist (CLI), wird auch kein Interrupt
ausgelöst und somit wird auch nirgends unbeabsichtigt hingesprungen.

(Kann auch sein, dass das I-Flag in einem anderen Register steht.
Zumindest wird es die sei gesetzt ung durch cli gelöscht. "Default"
(Einschaltzustand) ist gelöscht.)
Manche (die meisten?) Interrupt-Flags werden grundsätzlich gesetzt,
wenn das betreffende Ereignis eingetreten ist. Eine Interrupt-Routine
wird aber erst angesprungen, wenn auch das korrespondierende
Enable-Flag (und das I-Flag) gesetzt ist.
Man kann also Programme schreiben, die die Flags auswerten, aber
trotzdem im Poll-Betrieb laufen. Und man kann auch Poll- und
Interrupt-Betrieb mischen.

>Also wie würdet ihr es verhindern das unerwartet ein Interrupt was
>durcheinander bringt. Würde gerne auf den Interruptvektor verzichten,
Nie ein SEI benutzen...

von Bernhard S. (bernhard)


Lesenswert?

Hallo Thomas,


durch "CLI" wird verhindert, dass ein Interrupt ausgeführt werden
kann, desshalb auch "Clear Globel Interrupt Flag".

Wüdest Du trotzdem Interrupt-Vectoren vereinbaren, hätten sie keine
Bedeutung, da sie nie angesprungen werden.

Bernhard

von Thomas O. (Gast)


Lesenswert?

ok danke das hat meine Fragen ausreichend beantwortet.

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Man kann auch die Interruptroutine direkt anstelle des rjmp
unterbringen, damit wird sie um die Dauer des rjmp, also 3 Takte
kürzer, das spart Zeit.
Ich hab das schon gemacht, um einen LCD-Controller mit AVR zu
emulieren. Der Interrupt vom synchronen 2 MBit/s-Ausgang, den ich als
Datenstrom zum seriellen LCD schicke, hat minimal etwa 20 Takte, sonst
wären es 23.

von Thomas O. (Gast)


Lesenswert?

das haut dann aber nur deshalb hin weil du keine anderen Interrupts nutz
oder? Ansonsten würde ein anderer Interrupt unerwünscht in dein
Interruptprogramm springen, weil ja Interrupt nur ein Befehl Platz hat.

von Rahul (Gast)


Lesenswert?

>Ansonsten würde ein anderer Interrupt unerwünscht in dein
>Interruptprogramm springen, weil ja Interrupt nur ein Befehl Platz
>hat.

Wie soll ein anderer Interrupt auftreten, wenn du ihn nicht freigibst?
Die Programmierer sind bei Mikrocontrollern "Gott" und legen fest,
was passiert und was nicht.
Mikrocontroller führen kein Eigenleben (ausser wenn o.g. "Gott" nicht
weiß, was er programmiert hat!)

von Thomas O. (Gast)


Lesenswert?

ja ich komme der Sache immer nächer habe gibt spezielle Controlregister
wo ich das alles freigeben kann z.B. (GICR, GIFR...)

von Wolfram (Gast)


Lesenswert?

>Angenommen ich nutze CLI nicht und es wird der Interruptvektor
>angesprungen ohne das dort was steht
Dort steht immer was ,die Frage ist nur ob du es hingeschrieben hast
oder ob es schon vorher dort stand. Wenn die Programmausführung an
diese Stelle kommt wird das was da steht als Befehl interpretiert.

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.