Interrupt Byte inkrementieren

OP #2102508
Lesenswert?

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
Angehängte Dateien:
#2102576
Lesenswert?

@  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
Persönliche Seite #2102596
Lesenswert?

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.
Gast #2102619
Lesenswert?

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.
Persönliche Seite #2102627
Lesenswert?

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.
OP #2102646
Lesenswert?

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.
Gast #2102694
Lesenswert?

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

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