www.mikrocontroller.net

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


Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke das hat meine Fragen ausreichend beantwortet.

Autor: Christoph Kessler (db1uq) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!)

Autor: Thomas O. (Gast)
Datum:

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

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.