mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt Byte inkrementieren


Autor: Christan K. (rumpi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: APW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist denn das für ein uC ?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
org   $4000
Start lds   #$3FFF ;Stackpointer ab 3FFFh abwärts

      ldaa  #$7E   ;Sprung Code 7E
      staa  $00C4  ;in Sprungtabelle schreiben
      ldd   #Inter ;Adresse der Interrupt Service Routine
      std   $00C5  ;hinter Sprung Code schreiben

      ldaa  Pactl  ;RTI Steuerung laden
      oraa  #$01   ;Einstellung vornehmen
      staa  Pactl  ;Einstellung speichern

      ldaa  #$40   ;RTI Freigabe lokal
      staa  Tmsk2  ;speichere Einstellung

      cli          ;globale Interruptfreigabe

Loop  bra Loop     ;Endlosschleife

Inter ldaa #$40    ;Einstellung vornehmen
      staa TFLG2   ;RTI Einstellung speichern
      inc $5000    ;5000h = 5000h + 1
      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.

Autor: Assembler-Freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christan K. (rumpi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.