Hallo, ich hätte mal eine Frage zum Thema Interrupt. Das angehängte Programm inkrementiert bei jedem Interrupt Aufruf die Adresse $5000. Könnte mir jemand erklären wo der Sprung statt findet und wo das Programm weitergeht wenn der RTI beendet ist? Also ich weiß jetzt nicht ob das Programm schon bei "ldd #Inter" springt oder erst ab cli Viele Grüße
@ Christan K. (rumpi) > Proggi.pdf | anzeigen Lies mal was über Netiquette. Quelltexte als PDF? Nicht wirklich. >Das angehängte Programm inkrementiert bei jedem Interrupt Aufruf die >Adresse $5000. Siehe nach 68HC11 oder so aus. >Könnte mir jemand erklären wo der Sprung statt findet und wo das >Programm weitergeht wenn der RTI beendet ist? Dort, wo der Interrupt ausgelöst wurde, siehe Artikel. MG Falk
Das ist ein Mitglied der 6800-Familie, vermutlich ein HC12. Quellcode bitte als TEXT anhängen, nicht als PDF-Datei. Die Kommentare sind weitestgehend vollkommen nutzlos.
1 | org $4000 |
2 | Start lds #$3FFF ;Stackpointer ab 3FFFh abwärts |
3 | |
4 | ldaa #$7E ;Sprung Code 7E |
5 | staa $00C4 ;in Sprungtabelle schreiben |
6 | ldd #Inter ;Adresse der Interrupt Service Routine |
7 | std $00C5 ;hinter Sprung Code schreiben |
8 | |
9 | ldaa Pactl ;RTI Steuerung laden |
10 | oraa #$01 ;Einstellung vornehmen |
11 | staa Pactl ;Einstellung speichern |
12 | |
13 | ldaa #$40 ;RTI Freigabe lokal |
14 | staa Tmsk2 ;speichere Einstellung |
15 | |
16 | cli ;globale Interruptfreigabe |
17 | |
18 | Loop bra Loop ;Endlosschleife |
19 | |
20 | Inter ldaa #$40 ;Einstellung vornehmen |
21 | staa TFLG2 ;RTI Einstellung speichern |
22 | inc $5000 ;5000h = 5000h + 1 |
23 | rti ;Ende RTI |
Die Umgebung dieses Controllers (vermutlich ein ROM-Monitor o.ä.) sieht vor, daß die Interruptroutine an Adresse 0x00C4 im RAM beginnt. Hier wird ein JMP mit absoluter 16-Bit-Adresse eingetragen. Dann wird der Timer des µC initialisiert (das ist der Abschnitt, in denen von "Pactl" und "Tmsk2" die Rede ist), und schließlich werden Interrupts global freigegeben und in einer Endlosschleife (Label "Loop") verharrt. Der erste Aufruf der Interruptroutine kann erst nach der globalen Interruptfreigabe erfolgen, der µC befindet sich also bereits in der Endlosschleife. Die Interruptroutine verändert wiederum ein zum Timer gehörendes Register, erhöht dann den an der Adresse 0x5000 gespeicherten Wert und beendet sich. Das Programm selbst läuft dann in der Endlosschleife ("Loop") weiter, bis der nächste Interrupt auftritt. Aufgabe Besorge Dir ein Datenblatt/Programmierhandbuch des HC12, bestimme die Funktionen der Register PACTL, TMSK2 und TFLG2 und bestimme die Bedeutung der von Deinem Programm in diesen Registern gesetzten Werte.
Christan K. schrieb: > Könnte mir jemand erklären wo der Sprung statt findet und wo das > Programm weitergeht wenn der RTI beendet ist? Also ich weiß jetzt nicht > ob das Programm schon bei "ldd #Inter" springt oder erst ab cli Der Timer löst regelmässig einen IRQ aus, der die ISR an Adresse "Inter" abarbeitet, sobald dem uC das erlaubt wird (Mnemonic "cli"). Das Hauptprogramm hängt in der Tu-Nix-Schleife bei Adresse "Loop" fest.
Assembler-Freak schrieb: > Der Timer löst regelmässig einen IRQ aus, der die ISR an Adresse "Inter" > abarbeitet, sobald dem uC das erlaubt wird (Mnemonic "cli"). Wobei die ISR hier bei Adresse 0x00C4 beginnt, und nicht erst an der Adresse "Inter". Sollte sie das tun, müsste in der Interruptvektorentabelle, die bei 0xFFCE beginnt, der betreffende Vektor geändert werden.
Hallo, Vielen Dank für die schnellen Antworten. Das mit dem Interrupt habe ich nun verstanden. Und auch das mit der Endloschleife. Ich habe mir nämlich die Endlosschleife so vorgestellt, das der Controller dann nichts mehr machen kann (sozusagen Ende). Aber wie ich es verstanden habe wird das Programm durch den eingestellten Interrupt aus der Schleife "genommen" Ja der µController ist der 68hc11.
Christan K. schrieb: > Ich habe mir nämlich die Endlosschleife so vorgestellt, > das der Controller dann nichts mehr machen kann (sozusagen Ende). Hallo, das gibt es eigentlich garnicht, nur manche Prozessoren kann man schlafen legen oder abschalten. Bei einer Endlosschleife werden dagegen die Befehle der Schleife immer wieder ausgeführt, im einfachsten Fall wie hier nur einer: springe zurück nach Loop (der Programmzähler ist ja nach dem Lesen des Befehls schon weiter, das ist daher ein echter Rücksprung). Nur zugelassene Interrupts können diesen Ablauf unterbrechen, aber wenn sie korrekt programmiert sind nur vorübergehend, da sie ja nach Fertigstellung in die Schleife zurückspringen. Daher heisst es bei unbeabsichtigten Endlosschleifen "mein Prozessor ist eingefroren" oder "mein Prozessor ist abgestürzt", er tut natürlich nichts dergleichen, er hat bloss keine Zeit. Gruss Reinhard
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.