Frage zum Interrupt-Vector und Reset

Gast #342791
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.
Gast #342792
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...
Gast #342795
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.
Gast #342796
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.
Gast #342797
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!)
Gast #342799
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren