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.
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...
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
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.
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.
>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!)
ja ich komme der Sache immer nächer habe gibt spezielle Controlregister wo ich das alles freigeben kann z.B. (GICR, GIFR...)
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.