Forum: Mikrocontroller und Digitale Elektronik Interrupt Byte inkrementieren


von Christan K. (rumpi)


Angehängte Dateien:

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

von APW (Gast)


Lesenswert?

Was ist denn das für ein uC ?

von Falk B. (falk)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Assembler-Freak (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Christan K. (rumpi)


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.

von Reinhard Kern (Gast)


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

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
Noch kein Account? Hier anmelden.