Hey, Ich wollte mich mal mit dem eintreten eines Interrupts beschäftigen, jedoch von der Seite des µC und nicht der Programmierung. Und da sind bei mir mal ein paar kleine Fragen aufgekommen, wo ich bisher keine Antwort gefunden habe. Zum einen mal der Ablauf. Also, wenn ein Interrupt auftritt, dann wird PC auf den Stack gespeichert und das globale Interrupt Flag wird auf Low gesetzt. Danach wird PC auf die Interrupt Vektor Tabelle gesetzt an die Adresse wo sich der Interrupt befindet. Dort wird dann das eine Wort, in meinem Fall (ATmega8) 2 Byte oder 16Bit, ausgeführt. Dies sollte ja meistens ein rjmp Befehl sein. Dann wird PC auf unsere ISR gesetzt und das Ding wird ausgeführt. Nach dem Aufruf von reti lade ich dann meine Adresse von dem Stack und schalte die Interrupts wieder ein. Ich hoffe mal, dass das so weit richtig ist. Wenn nicht, dann bitte ich darum mich in dem Fall aufzuklären. ^^ Meine eigentliche Frage ist nun eigentlich: Was passiert, wenn gerade ein Assembler Befehl ausgeführt wird, welcher länger als einen Takt benötigt, und in dieser Zeit ein Interrupt auftritt? Mal ein kleines Bsp. Der µC hat angefangen ein BREQ abzuarbeiten. Es prüft nun das Bit Z in SREG in einem Takt und sollte ja dann in dem nächsten Takt springen. Nun aber kommt ihm der Interrupt zuvor und bevor BREQ springen kann, wird der Interrupt ausgelöst. Die Adresse von BREQ wird auf den Stack geschrieben und der Interrupt wird ausgeführt. So. nun ist der Interrupt abgehandelt und ich springe zu der Adresse im Stack plus 1. Also, der Befehl zum springen von BREQ konnte ja nie ausgeführt werden und nun setzte ich danach weiter. Ist das so, wie ich beschrieben habe, oder wartet ein Interrupt immer so lange, bis eine Anweisung ausgeführt wurde? Und zu dem Beispiel ganz oben noch mal eine Frage, wie viele Takte braucht ein Interrupt, um einzutreten? Also, abschalten der globalen Interrupts 1 Takt und springen zu der Interrupt Vektor Tabelle 1 Takt, oder wird das alles vom µC übernommen und es vergeht kein Takt beim eintreten in einen Interrupt? Danke schon mal fr eure Antworten. MfG Sep
Die erste Haelfte ist richtig. ASM Befehle, die laenger wie einen Takt brauchen werden natuerlich nicht unterbrochen. Ein interrupt braucht natuerlich auch Zeit. Daruber sollte das Datenblatt Auskunft geben.
sep schrieb: > Ist das so, wie ich beschrieben habe, oder wartet ein Interrupt immer so > lange, bis eine Anweisung ausgeführt wurde? Es gibt auch Prozessoren, bei denen einzelne viele Takte dauernde Befehle ggf. abgebrochen werden, um kurze Latenzzeiten für Interrupts gewährleisten zu können. Entweder werden diese Befehle dann erneut ausgeführt, oder am unterbrochenen Punkt fortgesetzt. > Also, abschalten der globalen Interrupts 1 Takt Das macht der AVR gratis. Über den Daumen gepeilt kann man heute die Anzahl Speicherzyklen zählen, die dabei bis zur Ausführung des Interrupt-Handlers ablaufen müssen.
Gut, danke für eure Antworten. Ich glaub, ich zieh mich mal zurück zum lesen! ;)
Hi Daes sich hier offensichtlich um einen AVR handelt, hilft das Datenblatt unter 'Reset and Interrupt Handling->Interrupt Response Time' weiter. MfG Spess
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.