skriptum „mikrocontroller-systeme“ kapitel 6geju0001/mikrocontroller-skript/6_7... ·...

45
Hochschule Karlsruhe Fakultät Elektro- und Informationstechnik Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann Inhalt: 6 Befehlssatz des Mikrocontrollers C517 ...................................................... 2 6.1 Aufbau und Handhabung einer Befehlsliste ................................................... 2 6.2 Die Befehlsgruppen im Einzelnen .................................................................. 4 7 Programmiertechnik in Assembler ............................................................ 14 7.1 Assembler-Symbolik und Segmente ............................................................. 14 7.2 Lineare Programme, Iterationen.................................................................... 22 7.3 Unterprogrammtechnik ................................................................................. 24 7.4 Interrupts ....................................................................................................... 30 Skriptum „Mikrocontroller-Systeme“ Kapitel 6: Befehlssatz des Mikrocontrollers C517 Kapitel 7: Programmiertechnik in Assembler

Upload: dinhquynh

Post on 05-Mar-2018

232 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Hochschule Karlsruhe Fakultät Elektro- und Informationstechnik Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

Inhalt:

6 Befehlssatz des Mikrocontrollers C517 ......................................................2

6.1 Aufbau und Handhabung einer Befehlsliste ...................................................2 6.2 Die Befehlsgruppen im Einzelnen ..................................................................4

7 Programmiertechnik in Assembler............................................................14 7.1 Assembler-Symbolik und Segmente .............................................................14 7.2 Lineare Programme, Iterationen....................................................................22 7.3 Unterprogrammtechnik .................................................................................24 7.4 Interrupts .......................................................................................................30

Skriptum „Mikrocontroller-Systeme“

Kapitel 6:

Befehlssatz des Mikrocontrollers C517

Kapitel 7:

Programmiertechnik in Assembler

Page 2: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

6 Befehlssatz des Mikrocontrollers C517

6.1 Aufbau und Handhabung einer Befehlsliste

• Der Befehlssatz des C517 umfasst 111 Befehle. Wie bereits in Kapitel 4.4 an den OPCODE-Beispielen für die einzelnen Adressierungsarten sichtbar wurde, stellt jede Variante eines Befehls einen eigenen Befehlscode dar, wobei die Adressierungsart zu unterschiedlich langen Befehlen führt: es gibt 49 Ein-Byte-Befehle, 45 Zwei-Byte-Befehle und 17 Drei-Byte-Befehle.

• Die Befehle des C517 sind vollständig kompatibel zum "Urahn", dem 8051-Prozessor.

• Die Befehle lassen sich nach ihrer Funktion in Befehlsklassen einteilen:

Transferbefehle Verzweigungsbefehle und Unterprogrammaufrufe Logische Befehle Arithmetikbefehle

• Im folgenden werden die einzelnen Befehlsklassen kurz vorgestellt. Zu jeder Befehlsklasse werden jeweils alle Befehlsvarianten in einer Übersichtstabelle aufgelistet.

• Diese Übersichtstabellen können zum Entwurf eines Assemblerprogramms verwendet werden - wenn es z.B. darum geht, ob eine bestimmte Befehlsvariante überhaupt existiert. Zum Ausprogrammieren ("Codieren") eines Assemblerprogramms ist es jedoch empfehlenswert, grundsätzlich die Befehle in einer ausführlichen Befehlsliste (Instruction Set) nachzuschlagen. Dabei sollte nach Möglichkeit die Original-Befehlsliste des Prozessor-Herstellers verwendet werden; diese ist zwar meist in englischer Sprache, enthält aber dafür keine Übersetzungs- und Druckfehler.

• Die ausführliche Befehlsliste für den C517 ist über die Homepage für das Mikrocontrollerlabor erhältlich unter:

www.home.fh-karlsruhe.de/~rege0001 dort: Dokumente --> Datenblätter --> User's Manual

• Befehlslisten sind meist alphabetisch sortiert. Zu jeder Befehlsklasse wird in einer kurzen Übersicht beschrieben, welche gemeinsame Funktionen die Einzelbefehle besitzen; darauf folgen dann die Einzelbefehle mit folgenden Detailinformationen:

Mnemonische Darstellung Pseudocode ("Operation") OPCODE ("Encoding") Anzahl der Bytes Anzahl der Maschinenzyklen ("Cycles")

Befehls-klassen Befehlsliste (Instruction Set) im Internet Aufbau der Befehlsliste

Page 3: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 3 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Die Angabe "Maschinenzyklen" ermöglicht es, bei bekanntem Prozessortakt die Laufzeit eines jeden Befehls zu berechnen.

• Die Angabe "Bytes" gibt den Speicherplatzbedarf im Codespeicher eines jeden Befehls an.

• Die Angabe "Pseudocode" legt in einer allgemein verständlichen Beschreibung den sequentiellen Ablauf innerhalb eines Befehls fest.

Beispiel: Die folgende Abbildung zeigt zunächst die Übersicht über die Befehlsklasse DJNZ aus der Befehlsliste des C517. Aus dieser allgemeinen Beschreibung kann lediglich entnommen werden, dass der Befehl einen Operanden dekrementiert und - falls der Operand nicht den Wert "0" hat - zu einer angegebenen Adresse springt. Der darunter abgebildete Einzelbefehl "DJNZ direct, rel" zeigt jetzt im Pseudocode ("Operation"), dass z.B. zuerst der Operand dekrementiert wird, dann die Bedingung für einen Sprung geprüft wird. Ebenso wird hier sichtbar, dass auch ein "Unterlauf" als erfüllte Sprungbedingung gewertet wird.

Mnemonik

Pseudocode

Abbildung 6-1: Beispiel aus der Befehlsliste

Hinweis: Wenn man noch nicht viel Erfahrung mit der Programmierung eines Prozessors in Assembler hat, sollte man vorsichtshalber am Anfang jeden einzelnen Befehlstyp in der Befehlsliste nachschlagen; findet man ihn dort nicht, so exisiert diese Variante auch nicht!

Handhabung der Befehlsliste Pseudocode

Page 4: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.2 Die Befehlsgruppen im Einzelnen Seite 4 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

6.2 Die Befehlsgruppen im Einzelnen • In den Übersichtstabellen für die einzelnen Befehlsklassen werden die folgenden

symbolischen Bezeichnungen für die Operanden verwendet:

Abbildung 6-2: Bedeutung der symbolischen Operanden der Befehlsliste

• Die Abbildung 6-3 zeigt die Klasse der Transferbefehle (MOV Ziel , Quelle). Sie ist als Beispiel für die Adressierungsarten bereits immer wieder verwendet worden, deshalb hier nur kurz zusammengefasst die Eigenschaften:

MOV-Befehle kopieren von Quelloperand zu Zieloperand Der Quelloperand wird nicht verändert, der Zieloperand wird

überschrieben. Es werden keine Flags beeinflusst; Ausnahme: Befehle, die als Zieloperanden den Akku haben, beeinflussen

das Parity-Flag (A-Inhalt ist "odd"--> P=1)

Beispiele: Annahmen: Speicherzelle 30H im DSEG enthält den Wert 40H, Speicherzelle 40H im DSEG enthält den Wert 10H Am Port P4 liegt das Bitmuster 11001010 an. MOV R0 , #30H ; Register R0 enthält dann 30H MOV A , @R0 , Akku enthält dann 40H MOV R1 , A , R1 enthält dann 40H MOV B , @R1 , B enthält dann 10H MOV @R1 , P4 ; Speicherzelle 40H enthält dann 0CAH

Transfer-Befehle MOV

Page 5: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.2 Die Befehlsgruppen im Einzelnen Seite 5 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Abbildung 6-3: Transferbefehle

Beispiele (Forts.) Annahme: Im Externen RAM mit der Adresse 0010H ist der Wert 7FH gespeichert. MOV DPTR , #0010H ; DPTR mit 16-Bit-Wert laden MOVX A , @DPTR ; A enthält jetzt 7FH

• Exchange-Befehle (XCH) vertauschen den momentanen Inhalt der beiden Operanden. Dabei muss der Akku verwendet werden.

Beispiel: XCH A , R0 ; Tauscht Inhalt von Akku mit Inhalt von ; Register R0

• Der Befehl XCHD vertausch das Low-Nibble (Bit 0-3) des Akku mit einem indirekt adressierten Nibble im ISEG.

Beispiel: Annahme: R0 enthalte 20H, im Akku steht 36H, im ISEG, Adresse 20H steht der Inhalt: 75H XCHD A , @R0 ; Im ISEG bei Adresse 20H steht jetzt: 76H, ; im Akku steht jetzt 35H

XCH-Befehle

XCHD-Befehl

Page 6: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.2 Die Befehlsgruppen im Einzelnen Seite 6 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Für das Kopieren von Bit-Operanden stehen ebenfalls MOV-Befehle zur Verfügung. Allerdings muss einer der Operanden das Carry-Flag sein:

Abbildung 6-4: Bit-Transferbefehle

Beispiele: MOV P4.1 , C ; Carry in Portbit 4.1 kopieren MOV C ; E0H ; Akku-Bit 0 in Carry kopieren MOV C , ACC.0 ; Akku-Bit 0 in Carry kopieren Hinweis: Die Befehle PUSH und POP werden im Kapitel 7.3, Unterprogrammtechnik, behandelt

• Die Abbildung 6-5 zeigt die Klasse der Arithmetikbefehle des C517. Auch hier gilt: der rechte Operand stellt die Quelle dar, die zum linken Operanden addiert, subtrahier usw. wird. Der Quelloperand wird dabei nicht verändert, der Zieloperand wird überschrieben.

• Hier wird der C517 zur "Akku-Maschine": Addition und Subtraktion erfordern den Akku als Ziel.

Abbildung 6-5: Arithmetikbefehle und NOP

MOV-Befehle für Bitoperanden

Arithmetik-Befehle "Akku-Maschine"

Page 7: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.2 Die Befehlsgruppen im Einzelnen Seite 7 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Die Arithmetik wurde bereits im Kapitel 2.2 und 2.3 dargestellt. Die Bedeutung von Carry- und Overflow-Flag, die der Prozessor bei Addition und Subtraktion bildet, ist in diesen Kapiteln am Zahlenstrahl erläutert worden. Die im Manual des Prozessors verwendeten Definitionen (z.B. "Overflow is set if there is a carry out of bit 6 but not out of bit 7, or a carry out of bit 7 but not out of bit 6....") beschreibt zwar, wie der Prozessor in der ALU die Flags bildet, dient jedoch nicht dem Verständnis der Anwendung dieser Flags.

Beispiel: Annahme: im Akku stehe der Wert 0C3H, in R0 der Wert 0AAH

ADD A , R0 ; im Akku steht dann: 6DH, C=1, OV=1, ; AC=0 Versuchen Sie, das Ergebnis anhand des Zahlenstrahls zu erklären!

• Der Befehl "ADDC" addiert zusätzlich zum angegebenen Quelloperanden den Inhalt des Carry-Flags zum Akku: Übertrags-Rechnung ist also möglich.

• Der Befehl "SUBB" subtrahiert den Quelloperanden immer zusammen mit dem Carry-Inhalt (Quelloperand + Carry) vom Akku.

Hinweis: Vor einer Subtraktion sollte immer das Carry-Flag explizit gelöscht werden, da es zwangsweise mit-subtrahiert wird! Beispiel: Annahme: im Akku sei der Wert 0C9H, in R2 der Wert 54H, C=1

SUBB A , R2 ; Ergebnis der Subtraktion mit Carry: ; im Akku: 74H; C=AC=0; OV=1

• Die Befehle "INC" bzw. "DEC" inkrementieren (+1) bzw. dekrementieren (-1) den angegebenen Operanden. Typische Anwendung dieser Befehle: Schleifenzähler.

Hinweis: Da INC und DEC keine Flags beeinflussen, können sollten sie nicht für Arithmetik verwendet werden (lediglich das Parity-Flag wird beeinflusst, jedoch nur dann, wenn der Akku als Operand verwendet wird).

• Mit INC DPTR kann der Datapointer (also ein 16-Bit-Register) verändert werden. Jedoch nur in aufsteigende Richtung, da es keinen Befehl zum Dekrementieren des DPTR gibt - hier muss man dann z.B. den Low-Teil, DPL, dekrementieren.

• Der Befehl "No Operation" (NOP) beeinflusst lediglich den Program Counter. Er wird häufig zur Bildung von kurzen Zeiten verwendet (Laufzeit des Befehls).

Carry, Overflow: siehe Zahlenstrahl in Kapitel 2

ADD ADDC

SUBB

INC DEC

INC DPTR

NOP

Page 8: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.2 Die Befehlsgruppen im Einzelnen Seite 8 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Der Befehl "MUL AB" multipliziert den Akku mit dem Register B. Dabei werden beide Operanden als vorzeichenlose, ganzzahlige 8-Bit-Werte aufgefasst. Das daraus entstehende Produkt ist ein 16-Bit-Wert, dessen Low-Byte im Akku und desseh High-Byte im Register B erscheint. Als Zeichen dafür, dass das Produkt auf Akku und B verteilt ist, wird das Overflow-Flag gesetzt (Der Wert des Produktes ist also größer als FFH). Das Carry-Flag wird immer gelöscht.

Hinweis: Carry und Overflow haben bei der Multiplikation eine andere Bedeutung als bei ADD / SUBB!

Beispiel: Annahme: in Akku sei der Wert 50H (80dez.), im Register B der Wert 0A0H (160dez).

MUL AB ; Ergebnis ist 3200H (12800dez.), ; also Akku=00H, B=32H, OV=1, C=0

• Der Befehl "DIV AB" dividiert den Akku durch das Register B. Dabei werden beide Operanden als vorzeichenlose, ganzzahlige 8-Bit-Werte aufgefasst. Der ganzzahlige Teil des Quotienten steht anschließend im Akku, der Rest steht in B. Die Flags C und OV werden immer gelöscht.

Hinweise: Carry und Overflow haben bei der Division eine andere Bedeutung als bei ADD / SUBB! Division durch "0": OV=1, C=0, Achtung: Akku- und B-Inhalt sind dann undefiniert!

• Der Befehl "DA A" korrigiert nach einer Addition zweier gepackter BCD-Zahlen (siehe Kapitel 2.3) das Ergebnis im Akku so, dass eine korrekte, gepackte BCD-Codierung entsteht.

Beispiel: Annahme: im Akku sei die gepackte BCD-Zahl "56" (entsprechend 56H), im Register R3 sei die gepackte BCD-Zahl "67" (entsprechend 67H), das Carry-Flag sei =1.

ADDC A , R3 ; Addiditon mit Carry; ; Ergebnis: im Akku ist der Wert 0BEH DA A ; Ergebnis: im Akku ist der Wert 24H, C=1 ; dies entspricht dem BCD-Ergebnis: "124" Hinweis: Der Befehl stellt keine allgemeine Dual-BCD-Wandlung dar; er ist nicht nach einer BCD-Subtraktion anwendbar

MUL AB

DIV AB Division durch "0"

BCD-Korrektur DA A

Page 9: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.2 Die Befehlsgruppen im Einzelnen Seite 9 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Die Abbildung 6-6 zeigt die Klasse der Logischen Befehle. Hier zeigt sich eine für Mikrocontroller typische Eigenschaft: es gibt einen (kleinen) Befehlssatz zur Hantierung und Verknüpfung einzelner Bit-Operanden.

• Die Befehle "ANL C, bit", "ORL C,bit", verknüpfen das Carry-Flag mit einem Bit aus dem Bit-Adressierbaren Bereich (BSEG) entsprechend "UND" bzw. "ODER". Die Befehle "SETB" "CLR" setzen bzw. löschen ein Bit,"CPL" invertiert den Zustand eines Bitoperanden und "MOV C, bit" kopiert einen Bitoperanden in das Carry-Flag.

Abbildung 6-6: Logische Befehle

Logische Befehle: Bitbefehle: ANL, ORL, SETB, CLR, CPL, MOV

Page 10: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.2 Die Befehlsgruppen im Einzelnen Seite 10 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Die Befehle "ANL", "ORL", "XRL" verknüpfen die beiden Byte-Operanden bitweise nach den bekannten Funktionen "UND", "ODER", "EXKLUSIV-ODER" miteinander; dabei bleibt der Quelloperand unverändert, der Zieloperand wird überschrieben. Flags werden keine beeinflusst. Diese Befehle existieren auch bei den Standard-Mikroprozessoren; dort ist man dann für die Beeinflussung einzelner Bits auf die "Maskentechnik" angewiesen.

Beispiel zur "Maskentechnik": Wenn die Bits 7, 3, und 2 eines Ausgangsports P4 gelöscht werden sollen, jedoch die anderen Bits unverändert bleiben sollen, definiert man eine sogenannte "Maske", hier: #0111 0011 entspr. 73H, die mit dem Operanden UND-Verknüpft wird:

ANL P4 , #73H ; Ergebnis: P4.7=P4.3=P4.2=0, ; P4.6, P4.5, P4.4, P4.1, P4.0: sind ; unverändert

• Die Befehle "CLR A" bzw. "CPL A" setzen den kompletten Akku auf "0" bzw. invertieren den Akku-Inhalt bitweise

• Die "Rotate-Befehle" verschieben das Bitmuster des Akku bei jedem Aufruf um eine Position nach links (RL) oder nach rechts (RR). Dabei kann das Carry-Flag miteinbezogen werden (RRC, RLC). Weitere Flags werden nicht beeinflusst.

Hinweis: Neben der bitweisen Ausgabe eines Byte-Operanden z.B. über eine serielle Schnittstelle können die Rotate-Befehle zum Multiplizieren mit Faktor 2 bzw. Dividieren durch 2 verwendet werden.

Abbildung 6-7: Rotate-Befehle

• Der Befehl "SWAP" vertauscht die beiden Nibbles (Halbbytes) im Akku

Befehle zur logischen Verknüpfung von Bytes: ANL, ORL, XRL

"Maskieren" CLR A CPL A Rotate-Befehle SWAP

Page 11: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.2 Die Befehlsgruppen im Einzelnen Seite 11 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Die Abbildung 6-8 zeigt die Klasse der Verzweigungsbefehle (Sprungbefehle und Unterprogramm-Aufrufe) des C517. Sprungbefehle ("JUMP") bewirken, dass der Program Counter mit einer neuen Adresse geladen wird: an dieser Adresse wird also das Programm fortgesetzt.

Hinweise: Die Befehle ACALL, LCALL, RET und RETI werden im Kapitel 7, Unterprogrammtechnik, behandelt

• Diese neue Adresse kann entweder absolut angegeben werden ("springe zu Adresse 7A40H im Programm") oder relativ zur momentanen Stelle im Programm ("springe um 25 Adressen zurück"). In letzterem Fall zählt der Prozessor zur momentanen Befehlsadresse zunächst die Anzahl Bytes des Sprungbefehls selbst dazu, bevor er die Sprungdistanz (z.B. -25) dazuaddiert und damit diejenige Adresse erhält, an der das Programm forzusetzen ist. Die Sprungdistanz ist entsprechend kurz bei den relativen Sprüngen:-128 bis +127.

• Mit Sprungbefehlen reagiert man programmtechnisch auf Ereignisse wie z.B. Rechenergebnisse, Vergleichsergebnisse, Zustände von Signalen usw. Dafür werden bedingte Sprünge benötigt, die abhängig vom Zustand eines Flag oder auch dem Zustand eines Bitoperanden ausgeführt werden (oder nicht ausgeführt werden). Bedingte Sprünge gibt es bei dem C517 nur als relative Sprungbefehle.

Abbildung 6-8: Verzweigungsbefehle und Unterprogrammaufrufe

Sprünge und Unterprogr.-Aufrufe absolute Sprünge relative Sprünge bedingte Sprünge

Page 12: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.2 Die Befehlsgruppen im Einzelnen Seite 12 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Sprungziele werden im Allgemeinen nicht als (absolute oder relative) Adresswerte im Assemblerprogramm eingegeben, sondern in symbolischer Form als sogenannte "Marken" ("Label"). Der Assembler (zusammen mit dem Linker/Locater) ersetzt dann diese Symbolik durch die Adresswerte (siehe nachfolendes Beispiel).

Hinweis: Syntaxregeln zur Assemblersprache sind im Kapitel 7.1 ausführlich beschrieben.

• Der Befehl "LJMP" springt unbedingt zu einer 16-Bit-Adresse, kann also im gesamten Adressraum des CSEG verwendet werden.

Beispiel:

MOV A , R1 AJMP weiter ; "weiter" ist die symbolische ; Sprungmarke im Programm

- - -

weiter: MOV R4 , A ; hier wird das Programm ; fortgesetzt

• Der Befehl "SJMP" springt ebenfalls unbedingt, jedoch zu einer relativen Adresse; damit darf die Sprungmarke nicht mehr als +127 oder -128 Byte von der momentanen Adresse entfernt liegen.

Beispiel für eine "Endlos-Schleife":

- loop: SMP loop ; Sprung auf sich selbst ; (Sprungdistanz ist dann: FEH)

• Der Befehl "JMP @A+DPTR" ermöglicht die Konstruktion eines "Sprung-verteilers" (ähnlich wie in C die "switch...case"-Konstruktion). Eine Variable (Größe: 8 Bit, unsigned, muss im Akku sein), die im Programm vor dem JMP berechnet wurde, steuert die Fortsetzung des Programms. Dazu wird diese Variable im JMP-Befehl zum DPTR addiert, die Summe ergibt dann diejenige Adresse, an der das Programm fortgesetzt wird. Der DPTR muss also zuvor auf den Anfang einer Tabelle eingestellt werden; in dieser Tabelle stehen dann die "Weitersprünge" zu den eigentlich zu bearbeitenden Einzelprogrammen. Wenn die Variable Werte von z.B. 0, 1, 2 usw. annimmt, würde der JMP-Befehl damit zu der Anfangsadresse der Tabelle +0, bzw. +1 bzw. +2 springen. Da die Befehle in der Tabelle aber meist aus AJMP-Befehlen bestehen, die eine Länge von 2 Byte haben, muss die Variable zuvor mit 2 multipliziert werde (siehe Beispiel auf der folgenden Seite).

symbolische Sprungziele

LJMP

SJMP

Sprung-verteiler mit JMP@A+DPTR

Page 13: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 6.2 Die Befehlsgruppen im Einzelnen Seite 13 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Beispiel für Sprungverteiler: Annahme: case_variable (symbolische Bezeichnung einer Variablen im DSEG, siehe Kapitel 7.1) wird im Programm berechnet und kann dabei Werte von 0 bis 3 annehmen. Abhängig von dieser case_variablen soll das Programm an den Adressen case_0 oder case_1 oder case_2 oder case_3 fortgesetzt werden.

MOV DPTR , #sprungtabelle MOV A , case_variable RL A ; Multipl. mit 2 JMP @A+DPTR - - sprungtabelle: AJMP case_0 ; AJMP case_1 AJMP case_2 AJMP case_3 - - case_0: MOV..... ; hier beginnt das Programm zur , Reaktion auf case_variable=0 - - case_1: usw. ; hier beginnt das Programm zur , Reaktion auf case_variable=1 Hinweis: Dynamische Sprungverteiler sind gefährliche Konstruktionen: wenn die case_variable im obigen Beispiel falsche Werte annimmt, z.B. größer 4 wird, werden Sprünge fehlgeleitet! Solche Konstruktionen sind deshalb grundsätzlich programmtechnisch gegen falsche Werte abzusichern und im Einzelschrittverfahren auszutesten!

• Mit den bedingten Sprungbefehlen kann auf vielfältige Weise auf Vergleichsergebnisse oder Rechenergebnisse reagiert werden. Sind die Sprungziele zu weit entfernt, müssen "Stützstellen" mit LMP-Befehlen eingeführt werden. Auf die genaue Funktion des Befehls "DJNZ" wurde in Abbildung 6-3 bereits verwiesen.

Sprung-verteiler

Page 14: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.1 Assembler-Symbolik und Segmente Seite 14 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

7 Programmiertechnik in Assembler

7.1 Assembler-Symbolik und Segmente

• In den Programmbeispielen wurde bisher - ausser der mnemonischen Darstellung von Befehlen und Registeroperanden (z.B. MOV A, R1) - nur die absolute Angabe von Adressen (z.B. 0AC71H) und Konstanten (z.B. #0E0H) verwendet. Dies macht ein Assemblerprogramm natürlich schwer lesbar.

• Ein moderner Assembler bietet darüber hinaus weitere Möglichkeiten, ein Programm lesbarer zu gestalten durch:

frei definierbare Symbole für Adressen und Konstanten Verwaltung von Daten in Segmenten Unterstützung von Registerbänken Unterstützung von verteilter Programmerstellung

• Im Folgenden werden einige Elemente des "Assembler A51" kurz vorgestellt.

Hinweis: Eine Assembler-Programmiersprache ist in ihren Sprachelementen nicht nur zugeschnitten auf den jeweiligen Prozessor, sondern - anders als Hochsprachen, die international genormt sein können - immer auch im Detail von dem jeweiligen Hersteller des Asssemblers abhängig (hier: Assembler A51 der Fa. Hitex, Karlsruhe).

• Die Elemente eines Assemblerprogramms sind:

Befehlszeile (instruction line) Kommentar (comment) Assembler-Direktive (directive) Assembler-Steuerzeichen (control)

• Allgemeiner Aufbau einer Befehlszeile (Angaben in [ ] sind optional):

[label:] mnemonic [operand] [,operand] [,operand] [;Kommentar]

• Ein label ist der symbolische Namen derjenigen Adresse, an der der Befehl im Programmspeicher steht ("Marke"). Zur Bildung des symbolischen Namens: siehe Abbildung 7-1. Eine Marke muß im ersten Teil einer Zeile stehen; führende Leerzeichen und Tabulatorzeichen sind erlaubt. Eine Marke muß mit ":" abgeschlossen werden; in einer Zeile ist nur eine Marke erlaubt. Der numerische Wert einer Marke ist der momentane Stand des Adreßzählers im gerade aktiven Segment. Vor einer ORG-Anweisung ist keine Marke zulässig.

• Mnemonic: Name des Befehls; symbolische Bezeichnung für das Bitmuster seines Maschinencodes im Programmspeicher

• Der Operand ist die Größe, auf die sich die Befehlsfunktion bezieht

• Kommentar: Erläuterung zur Befehlszeile, geht vom Semikolon bis zum Zeilenende (nächstes Carriage Return (CR)).

Elemente des Assembler-Programms: Befehlszeile label (Marke) Mnemonik Operand Kommentar

Page 15: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.1 Assembler-Symbolik und Segmente Seite 15 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Beispiel:

Marke: MOV A , R0 ; Register R0 in Akku laden ; z.B.: weiterer Kommentar als Zeile JMP Marke

• Symbole dienen in der Assemblersprache zur Darstellung von:

Zahlen Adressen Registern

• Symbole werden mit "Assembler-Direktiven" vereinbart. Dies sind Anweisungen, die lediglich den Assemblierungsvorgang steuern; sie erzeugen also keinen Maschinencode für den Mikroprozessor

• Die einfachste Form, ein Symbol zu vereinfachen, ist die Equate-Direktive:

Symbolname EQU Ausdruck Symbolname EQU Registersymbol

• "Symbolname" stellt dabei eine frei wählbare Bezeichnung dar (Konventionen zur Bildung: siehe Abbildung 7-1). Sie wird bei jedem Auftreten im Programm vom Assembler ersetzt durch Ausdruck/Register. "Ausdruck" kann ein numerischer Ausdruck oder auch ein Symbol sein. Es darf keine Vorwärts-Referenz darin enthalten sein.

Hinweis: Ein einmal definiertes Symbol darf im weiteren Verlauf nicht umdefiniert werden (Ausnahme: wenn das Symbol mit der Direktive SET definiert wurde, siehe Assembler-Handbuch).

Abbildung 7-1: Symbolik in Assembler

Symbole Assembler-Direktiven: EQU

Page 16: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.1 Assembler-Symbolik und Segmente Seite 16 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Beispiele für Symbole mit EQU-Direktive:

LIMIT EQU 120 VALUE EQU LIMIT – 40 BUCHSTABE EQU 'A' AKKU EQU A PORT_4 EQU 0E8H

MOV AKKU, #LIMIT MOV PORT_4, BUCHSTABE

• Will man Symbole für die einzelnen Speicherklassen des C517 definieren, stehen hierfür die folgenden Direktiven zur Verfügung:

Symbolname BIT Adresse eines Bit im BIT-Bereich 20H – 2FH oder SFR-Adr. 80H – 0FFH Symbolname DATA Adresse im DATA-Bereich 0 – 7FH oder SFR-Adr. 80H – 0FFH Symbolname IDATA Adresse im IDATA-Bereich 0 – 0FFH Symbolname XDATA Adresse im XDATA-Bereich 0 – 0FFFFH Symbolname CODE Adresse im Programmspeicher 0 – 0FFFFH

Beispiele:

EIN BIT 24H.2 ; Bitadresse AUS BIT 24H.3 ; Bitadresse SCHALTER BIT 0EAH ; Port 4.2 als neues ; Symbol im SFR-Bereich

• Symbole, die mit diesen Direktiven definiert werden, können anschließend nicht umdefiniert werden.

• Mit den bis jetzt beschriebenen Direktiven (EQU, BIT, DATA, IDATA, XDATA, CODE) werden lediglich symbolische Bezeichnungen für Objekte festgelegt, die genausogut mit den absoluten Zahlen, Adressen, Registernamen im Programm erscheinen könnten. Beim Übersetzen ersetzt der Assembler hier lediglich die Symbole durch die Absolutwerte; der Programmierer muß die Adressen selbst verwalten; wenn man also wie im obigen Beispiel z.B. Bitoperanden symbolisch verwendet, muss man selbst eine Liste führen (oder sie sich als "MAP-file" vom Assembler ausgeben lassen): welche Bitadressen denn schon bereits belegt sind.

• Die folgenden Direktiven reservieren bei der Definition von Symbolen gleichzeitig den entsprechenden Speicherplatz ; dies entspricht der Variablendeklaration bei höheren Sprachen (z.B. in der Sprache C: int ANNA; ). Der Assembler verwaltet hier die Zuordnung zwischen Symbol und Adressen selbst.

[label:] DBIT Audruck ; für Bits in einem BIT-Segment [label:] DS Audruck ; für Bytes im Code- oder int./ext. ; Datensegment

• Dabei ist "label" die symbolische Bezeichnung für diejenige Adresse, bei der der reservierte Speicherplatz beginnt, "Ausdruck" die Anzahl der zu reservierenden Bits (bei DBIT) bzw. der zu reservierenden Bytes (DS).

Symbole für Speicher-klassen

Symbole mit Speicherplatz-Reservierung

Page 17: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.1 Assembler-Symbolik und Segmente Seite 17 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Diese symbolischen Operanden werden mit den Direktiven DBIT / DS vom Assembler in den jeweils aktuellen Segmenten automatisch an freien Plätzen einsortiert (zum Segmentbegriff: siehe weiter unten).

Beispiel:

EIN: DBIT 1 ; Bit-Reservierung im ; Bitsegment AUS: DBIT 1 ; reserviert das nächste Bit im ; Bitsegment PUFFER: DS 20 ; reserviert 20 Byte z.B. als ; Pufferspeicher NIBBLE: DBIT 4 ; CSEG ; öffnet das Codesegment ; (siehe unten)

MOV C, EIN

• Die folgenden Direktiven reservieren und initialisieren den entsprechenden Speicherplatz. Sie können nur für den Programmspeicher verwendet werden. Dies entspricht der kombinierten Variablendeklaration mit Initialisierung bei höheren Sprachen (z.B. in der Sprache C: int ANNA=0; ).

[ label:] DB Ausdruck [,Ausdruck,....] ; initialisiert eine Folge von ; Bytes im Progr.-Speicher [ label:] DW Ausdruck [,Ausdruck,....] ; initialisiert eine. Folge von ; Worten im Progr.-Speich.

Beispiele: Die folgende Zeile legt einen Textstring+Carriage Return+Line Feed im Programmspeicher ab:

MELDE_TEXT_1: DB 'Bitte Taste x betätigen', 0DH, 0AH

weiterer Teststring:

MELDE_TEXT_2: DB 'Allgemeine Schutzrechtsverletzung!' Ablage von wortgroßen Sprungadressen:

SPRUNGADRESSEN: DW 0ABCDH, 0100H, 01070H

• Wenn mit den Direktiven zur Definition von Symbolen (DBIT, DS, DB, DW) Speicherplatz reserviert wird, ist damit nicht sofort eine Belegung des physikalischen Speichers im µController-System verbunden; vielmehr sammelt der Assembler diese Elemente zunächst einmal in mehreren "Behältern", den Segmenten. Beim Erstellen eines Programms (genau: eines Moduls eines Gesamt-Programms) verwaltet der Assembler gleichzeitig fünf dieser "Behälter", für jede Speicherklasse des µControllers jeweils ein Segment (ein sechstes Segment ist für den Stack reserviert, s. später).

Symbole mit Speicherplatz-reservierung im Segment

Symbole mit Speicherplatz-Reservierung und -Initialisierung Segmente

Page 18: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.1 Assembler-Symbolik und Segmente Seite 18 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Diese "Behälter" (Segmente) muss man vor der Definition von Symbolen, die darin einsortiert werden sollen, öffnen; dies geschieht mit der Angabe einer Segment-Direktiven, die auch gleichzeitig die Anfangsadresse dieses Segmentes festlegt:

Abbildung 7-2: Definition absoluter Segmente

Hinweis: Die optionale Direktive "AT address" legt fest, dass das nachfolgende Segment später im Speicher des Mikrocontrollers ab dieser Adresse angelegt wird. Beispiele:

BSEG AT 20H ; Eröffnet ein Bit-Segment ab Adresse 20H EIN: DBIT 1 ; reserviert ein Bit mit dem symb. Namen EIN ; im Bitsegment AUS: DBIT 1 ; reserviert ein weiteres Bit mit Namen AUS CSEG AT 100H ; Code-Segment ab Adresse 100 H öffnen START: MOV C, EIN ; Dieser Befehl wird im Codesegment ab Adr. ; 100H abgelegt. Symbol START ist identisch ; mit Adr. 100H. MOV AUS, C ; Dieser Befehl liegt im Codesegment ab Adr. ; 102H DSEG AT 40H ; Daten-Segment ab Adresse 40H öffnen PUFFER: DS 20 ; reserviert 20 Byte für symb. Variable ; PUFFER ab 40H CSEG ; obiges Code-Segment wird fortgesetzt MOV A, #100H ; dieser Befehl wird im Codesegment nach dem ; Befehl "MOV AUS,C" eingetragen

• Der Assembler führt für jedes Segment einen eigenen Adreßzähler. Mit der Angabe "AT" wird das zuletzt eingestellte Segment geschlossen und ein neues Segment mit dem angegebenen Adreßzählerstand eröffnet. Fehlt diese AT-Angabe, so wird ein früher definiertes Segment gleichen Typs fortgesetzt, d.h. der Adreßzähler wird weitergezählt.

absolute Segmente öffnen

Page 19: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.1 Assembler-Symbolik und Segmente Seite 19 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Der Vorteil der Segment-Verwendung liegt darin, daß der Programmierer sich nicht um die absoluten Adressen der einzelnen Operanden kümmern muß: nach der Festlegung einer Segment-Anfangsadresse können die Operanden fortlaufend definiert werden; die Zuordnung der µController-Speicheradressen zu den einzelnen Operanden übernimmt der Assembler mit Hilfe seines Segment-spezifischen Adreßzählers.

• Die oben beschriebenen Direktiven (CSEG, DSEG, XSEG, ISEG, BSEG) erzeugen absolute Segmente, deren Anfangsadresse im Speicher des µController-Systems bereits bei der Programmierung (mit der Direktive AT) festgelegt wird. Absolute Segmente sind allerdings nur für kleinere Programme sinnvoll. Bei komplexen Programmieraufgaben wird die Gesamtaufgabe in voneinander möglichst unabhängige Teilaufgaben zerlegt, und diese Teilaufgaben dann in entsprechenden Programm-Modulen ausprogrammiert. Jedes Modul, das oft auch von einem eigenen Programmierer realisiert werden soll, benötigt also eigene Speicherbereiche im Code- Bit- Daten- usw.-Speicher. Würde man hier jedem Modul einen eigenen Satz von absoluten Segmenten zuteilen, müßten dabei bereits die Segment-Anfangsadressen im Speicher des µControllers auf alle Module verteilt werden. Falls man dabei z.B. den Speicherbedarf für das Datensegment eines Moduls unterschätzt, müssen später die Datensegment-Anfangsadressen der anderen Module geändert werden.

• Dieses Problem löst man durch die Verwendung von relokatiblen Segmenten. Jedes relokatible Segment erhält bei der Definition einen Namen und die Angabe, welchen Speichertyp es repräsentiert ( BIT, IDATA, DATA, XDATA, CODE). Von da an können in diesen Segmenten – die alle mit dem Segment-Adreßzähler 0 beginnen – beliebig Befehle und symbolische Operanden angelegt werden. Die absoluten Speicheradressen werden erst später, beim Zusammenbinden festgelegt (LINK, LOCATE).

• Die folgende Direktive definiert ein relokatibles Segment:

Segmentname SEGMENT Segment-Typ [Reloc-Typ]

• Dabei ist der Segmentname der Name des Segments; er kann beliebig festgelegt werden Mit diesem Namen kann das Segment später jederzeit wieder geöffnet werden (Direktive: RSEG). Der Locater kann Segmente gleichen Namens (und verträglichen Speichertyps) aus verschiedenen Programm-Modulen zu einem Segment kombinieren.

• Der Segment-Typ ist der Speichertyp, in dem das Segment angelegt werden soll:

Abbildung 7-3: Segmenttypen für relokatible Segmente

[Reloc-Typ] (Siehe Handbuch Assembler A51)

Nachteil von absoluten Segmenten bei modularen Programmen

Relokatible Segmente

Definition eines relokatiblen Segments: SEGMENT RSEG

Page 20: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.1 Assembler-Symbolik und Segmente Seite 20 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Beispiel für relokatible Segmente: ; ein relokatibles Codesegment und ein relok. Datensegment definieren:

MAIN SEGMENT CODE ALLE_DATEN SEGMENT DATA

; das relokatible Datensegment auswählen:

RSEG ALLE_DATEN SUMME DS 1 ; reserviert 1 Byte im Segment ; ALLE_DATEN ANZAHL DS 2

; das relokatible Codesegment auswählen:

RSEG MAIN MAIN: MOV A, SUMME ; Befehle werden im Codesegment ; ab der relativen ADD A, ANZAHL ; Adresse MAIN abgelegt

MOV usw.

• Jedes Programm, das die Befehle CALL, PUSH, POP verwendet oder Interrupts benutzt, benötigt einen Stack (dieser Begriff wird im Kapitel 7 näher erläutert). Für diesen RAM-Bereich ist ein eigenes Stack-Segment vorgesehen, jedoch kein eigener Speicherbereich des 80517.Als Speichertyp für das Stacksegment kann deshalb ein beliebiger DATA- oder IDATA-Bereich verwendet werden.

Beispiel:

STACK SEGMENT IDATA ; Relokatible Definition des ;Stacksegments RSEG STACK ; Segment auswählen DS 10H ; 16 Byte für den Stack ;reservieren CSEG AT 0H ; Absolutes Codesegment ab ; Adresse 0000H JMP START ; Sprung zum ; Programmstart CSEG AT 100H ; Programmbeginn START: MOV SP, #STACK-1 ; Stackpointer initialisieren

Forts. Relok. Segmente

Stacksegment

Page 21: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.1 Assembler-Symbolik und Segmente Seite 21 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Einige weitere Direktiven, die für die Arbeit im Mikrocontroller-Labor benötigt werden:

NAME Modulname

Modulname Name für das Objektmodul, max. 40 Zeichen, falls im Quellcode nicht vorhanden, wird der Dateiname der Quelldatei (ohne Namenserweiterung) verwendet.

ORG Audruck Ausdruck Absoluter oder einfach-relokatibler Wert, der vom

Assembler berechnet wird. Wirkung in absoluten Segmenten: der Adreßzähler wird auf den errechneten Wert eingestellt

Wirkung in relokatiblen Segmenten: der errechnete Wert wird als Offset zum momentanen Adreßzähler dieses Segments addiert (vorzeichengerecht).

Mit ORG wird lediglich der Adreßstand verändert, es wird kein neues Segment erzeugt. Eine mögliche Adreßlücke wird Teil des aktuellen Segmentes. In absoluten Segmenten kann der Adreßzähler nicht unter die Segmentbasisadresse gelegt werden. Eine Zeile mit ORG-Direktive darf nicht mit einer MARKE: versehen werden!

USING Ausdruck Audruck Nummer der mit USING auszuwählenden Registerbank (0 –

3). Ab der mit USING gewählten Registerbank berechnet der Assembler aus den symbolischen Angaben für die Register R0 bis R7 die absoluten Adressen.

ACHTUNG: die Registerbank selbst wird dadurch nicht umgeschaltet,dies muß per Befehl ausprogrammiert werden!

END

Die END-Direktive muß in der letzten Zeile eines jeden Quellprogramms stehen und zeigt dem Assembler das Ende des zu übersetzenden Moduls an. Fehlt sie, ist das ein "fataler Fehler"; steht sie zu früh im Quelltext, wird alles nach der END-Direktive ignoriert.

Direktive für Modulname ORG

USING

END

Page 22: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.2 Lineare Programme, Iterationen Seite 22 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Hinweis: Informationen zu den Mehr-Modul-Direktiven PUBLIC EXTRN sowie zu den Assembler-Steueranweisungen (Controls) $ XREF $ DEBUG $ NOMOD51 $ EJECT u.s.w. finden sich im Assembler-Handbuch A51 / HITEX

7.2 Lineare Programme, Iterationen

• Lineare Programme bestehen aus Befehlen, die in der Reihenfolge, wie sie im Programmspeicher stehen, abgearbeitet werden. Als Gesamtstruktur eines Mikrocontrollerprogramms dürfte dies wohl eher selten auftreten; z.B. bei einem Transponder, der nach dem Einschalten lediglich eine kurze Signalsequenz sendet und sich dann ausschaltet. In Kombination mit Verzweigungen sind lineare Programmstrukturen jedoch gerade im Bereich von Steuerungen relativ häufig anzutreffen.

• Iterationen (Bildung von Programm-"Schleifen") ermöglichen als Programmkonstrukt

die wiederholte Bearbeitung eines Programmabschnittes das "beschäftigte Warten" auf ein äußeres Ereignis

Beispiel für eine Iteration zur Zeitbildung: Es soll das Ausgangs-Portbit 4.7 mit einer bestimmten Frequenz ein/aus getaktet werden:

SETB C MOV 20H.0 , C blink: MOV R2 , #0FFh loop_2: MOV R1 , #0FFh loop_1: DJNZ R1 , loop_1 DJNZ R2 , loop_2 CPL 20H.0 MOV C , 20H.0 MOV P4.7 , C AJMP blink Frage: mit welcher Frequenz wechsel P4.7 seinen Zustand, wenn ein Maschinenzyklus 1 Mikrosekunde dauert?

Page 23: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.2 Lineare Programme, Iterationen Seite 23 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Beispiel für beschäftiges Warten: Solange das Eingangs-Portbit P4.0 = 0 ist, soll die Taktung von P4.7 angehalten werden:

SETB C MOV 20H.0 , C blink: MOV R2 , #0FFh loop_2: MOV R1 , #0FFh loop_1: DJNZ R1 , loop_1 DJNZ R2 , loop_2 CPL 20H.0 MOV C , 20H.0 MOV P4.7 , C wait: JNB P4.0 , wait AJMP blink

• Diese Schleifenkonstruktion, in der auf ein Ereignis dadurch gewartet wird, dass man das Ereignis immer wieder abfrägt (engl.: polling), nennt man deshalb "beschäftiges Warten", weil die gesamte Rechenleistung des Prozessors auf dieses "Polling" verwendet wird. Prinzipiell kann man die obige "wait"-Schleife, die ja nur aus einem JNB-Befehl besteht, natürliche erweitern, indem man zusätzlich zur eigentlichen Abfrage des Signals noch andere Tätigkeiten ausprogrammiert. Dies geht dann jedoch auf Kosten des Echtzeitverhaltens: je länger die Poll-Schleife wird, umso seltener wird das Ereignis abgefragt, um so langsamer ist die Reaktion darauf.

• Will man eine einmal ausprogrammierte und getestete Funktion - wie im ersten Beispiel die Taktung eines Ausgangssignals - mehrfach verwenden, gibt es zwei Möglichkeiten:

1. die Makrotechnik 2. die Unterprogrammtechnik: siehe nächstes Kapitel

• Zu 1.: Die Makrotechnik ist - vereinfacht dargestellt - die Möglichkeit, beliebige Assembler-Befehlssequenzen zusammenzufassen als "Makrobefehl". Dieser Makrobefehl kann dann einfach oder mehrfach in ein Assemblerprogramm eingestreut werden. Vorausgesetzt, der Assembler unterstützt diese Technik (z.B. der im Labor verwendete "Keil A51-Assembler" ist ein sog. "Makroassembler"), dann kann der Anwender sich ganze Bibliotheken mit solchen Makros aufbauen. Damit werden die Programme entsprechend besser lesbar.

• Makros werden beim Assemblieren "expandiert" - im eigentlichen Maschinenprogramm sind sie also nicht mehr sichtbar. Diese Übersetzung kann durch zusätzliche Direktiven (z.B. für bedingte Übersetzung) gesteuert werden. Dabei ist allerdings zu berücksichtigen, dass diese Bedingungen zum Übersetzungszeitpunkt ausgewertet werden, also nicht im späteren Ablauf des Programms im Mikrocontroller.

• Vor- und Nachteil der Nutzung der Makrotechnik zur Mehrfachverwendung von Programmteilen:

Laufzeitoptimal, da keine Aufrufbefehle / Rücksprungbefehle benötigt (siehe Unterprogrammtechnik)

Mehrfache Expansion eines Makros verlängert jedesmal den Programmcode entsprechend

Polling

Makro

Page 24: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.3 Unterprogrammtechnik Seite 24 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

7.3 Unterprogrammtechnik

• Ein mehrfach zu verwendentes Programm kann mit einem spezielle Befehl, dem CALL-Befehl, mehrfach aufgerufen werden. Dieses Unterprogramm steht also nur einmal als Codesequenz im Codespeicher; seine Anfangsadresse wird bei dem CALL-Befehl als Sprungzieladresse angegeben.

• Der CALL-Befehl entspricht dem Aufruf einer Function / Procedure in einer höheren Programmiersprache. Während man sich dort nicht darum kümmern musste, wie der Prozessor am Ende einer aufgerufenen Function wieder zurückfand in das aufrufende Programm, das ja fortgesetzt werden soll, muss dieses Verfahren in der Mikroprozessorwelt näher erläutert werden.

• Bei jedem CALL-Befehl schreibt der Prozessor über einen Stackpointer SP die Rückkehr-Adresse, also die Adresse des nach dem Rücksprung auszuführenden, nächsten Befehls, in den Stack. Dann wird in den Program Counter PC die Anfangsadresse des Unterprogramms eingetragen.

• Ein Unterprogramm wird immer beendet durch den RETURN-Befehl "RET". Dieser holt über den Stackpointer die Rückkehradresse aus dem Stack und schreibt sie in den Program Counter.

• Der Stack ist ein vom Anwender festzulegender RAM-Speicherbereich (Festlegen durch Initialisierung des Stackpointers).

• Der Stack (auch "Stapelspeicher" bzw. "Kellerspeicher" genannt) wird vom Prozessor selbständig über den Stackpointer verwaltet. Sein Speicherprinzip ist das "LIFO"-Prinzip: last in - first out.

• Die genaue Arbeitsweise des vom Prozessor selbst verwalteten Stack zeigt die folgende Abbildung.

• Jedes Unterprogramm muss mit RETURN beendet werden; CALL- und RETURN-Befehl müssen immer zusammen verwendet werden! Würde man ein Unterprogramm durch einen direkten Rücksprung in das aufrufende Programm verlassen, bliebe im Stack ein nichtgenutzten Eintrag übrig!

• Unterprogramme sind schachtelbar. Die Verschachtelungstiefe ist nur durch die Größe des Stack-Speicherbereichs begrenzt.

Hinweis: Der Befehl "CALL" existiert in der Befehlsliste nicht; der Assembler versteht ihn trotzdem ("generic call") und wählt - je nach Abstand des Sprungzieles - den Befehl "ACALL addr11" oder den Befehl "LCALL add16" aus. In der nachfolgenden Abbildung ist ein LCALL als Beispiel verwendet worden.

Unter-programm: CALL-Befehl Stackpointer SP Return-Befehl: RET Stack LIFO-Prinzip Unterprogr.-Schachtelung CALL, ACALLaddr11 LCALLaddr16

Page 25: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.3 Unterprogrammtechnik Seite 25 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

0102h

0100h MOV A,20h

ADD A,R1

MOV R2,A

CALL 0100h

MOV R1,21h

ADD A,R1

MOV R2,A

SUBB A,R0

RETURN

MOV R2,A

xxh xxh

0103h

0104h

0107h

0108h

E2h

07h

E2h

07h

07h

01h

07h 07h

08h

09h

0Ah

0Bh

08h

09h

xxh 07h SP

SP

SP

Stack vor Ausführung des CALL-Befehls

Stack vor Ausführung des CALL-Befehls

Hauptprogramm Unterprogr. 1 Unterprogr. 2

MOV A,B

ADD A,R1

MOV R2,A

RETURN

0200h

0202h

0203h

0204hCALL 0200h

Stack vor Ausführung des Return-Befehls

Abbildung 7-4: Call- / Return-Befehle und Stackaufbau

Erklärung: Der SP zeigt vor dem ersten CALL-Befehl auf einen irrelevanten Eintrag (Grundstellung). Durch einen CALL-Befehl wird zuerst der SP weitergezählt, dann die Rücksprungadresse eingetragen. Ein RETURN-Befehl holt zuerst die Rücksprungadresse aus dem Stack, dann wird der SP zurückgezählt.

• Betrachtet man Unterprogramme als Ersatz für "function" oder "procedure" einer höheren Programmiersprache, kommen zusätzlich zu dem Aufrufverfahren mittels CALL-RETURN-Befehlen weitere Anforderungen an Unterprogramme hinzu:

Datenneutralität Parameterübergabe Lokale Variable

• Datenneutralität: Variable, die das aufrufende Programm (im Folgenden als "Hauptprogramm" bezeichnet) verwendet, dürfen durch den Aufruf des Unterprogramms nicht verändert werden - das Unterprogramm muss also völlig neutral gegenüber dem Hauptprogramm sein. Diese Aufgabe muss grundsätzlich im Unterprogramm gelöst werden. Dazu bieten die Mikroprozessoren die Befehlskombination "PUSH" - "POP" (siehe Abbildung 6-3, Transferbefehle).

PUSH direct kopiert die per direkter Adressierung angegebene Speicherstelle aus dem DSEG über den Stackpointer in den Stack.

POP direct holt über den momentanen Stackpointerstand ein Byte aus dem Stack und kopiert es in die per direkter Adressierung angegebene Speicherstelle im DSEG.

Anforderung an Unter-programme: Daten-neutralität mit PUSH POP

Page 26: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.3 Unterprogrammtechnik Seite 26 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Zur Datenneutralität muss also zu Beginn des Unterprogramms jede Variable, die das Unterprogramm benützt, mit PUSH in den Stack gerettet werden. Dann erst darf sie im UP verändert werden.

• Am Ende des Unterprogramms müssen die in den Stack geretteten Variablen wieder restauriert werden mittels POP. Wegen des LIFO-Prinzips des Stack muss die Reihenfolge beim Restaurieren umgekehrt sein gegenüber der Reihenfolge beim Retten der Variablen.

Beispiel: In der folgenden Abbildung werden der DPTR, der Akku und das Register R0 gerettet / restauriert.

07E2h

0100hMOV A,20h

ADD A,R1

MOV R2,A

CALL 0100h

PUSH DPH

PUSH DPL

PUSH ACC

SUBB A,R0

eigentl. UP

Beginn des

xxh 07h SP

Stack im HP vor Ausführung des CALL-Befehls

Hauptprogramm Unterprogr. 1

PUSH 00h

POP 00h

RETURN

POP ACC

POP DPL

POP DPH

Stack im UP1 vor Ausführung des Return-Befehls

xxh

E2h

07h

(DPH)

(DPL)

07h

08h

09h

0Ah

0Bh

SP

(Akku)

(R0) 0Ch

0Dh

Abbildung 7-5: PUSH- und POP-Befehle zur Datenneutralität

Hinweise: 1.) Wegen der direkten Adressierung bei PUSH und POP muss anstelle der Register die direkten Adressen verwendet werden, also ACC anstelle von A für Akku 00h anstelle von R0 (oder entsprechender Symbolname) DPH, DPL anstelle von DPTR 2.) Zu jedem PUSH-Befehl muss ein POP-Befehl existieren! Ansonsten trifft der Stackpointer beim Return-Befehl nicht auf die Rücksprungadresse. 3.) Für die richtige LIFO-Reihenfolge ist der Programmierer verantwortlich!

Page 27: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.3 Unterprogrammtechnik Seite 27 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Parameterübergabe: Will das aufrufende Programm (Hauptprogramm HP) dem Unterprogramm Werte übergeben, die dort bearbeitet werden, kann dies über die folgenden Verfahren geschehen:

Übergabe über Register Übergabe über Speichervariable Übergabe über den Stack

• Bei der Übergabe von Parametern über Register schreibt das HP die Werte in Register, aus denen sie das Unterprogramm dann ausliest.

Vorteile: schnell Parameter sind statische Variable

Nachteile:

Anzahl der Parameter durch geringe Registerzahl begrenzt

Parameter sind globale Variable

• Bei der Übergabe von Parametern über Speichervariable schreibt das HP die Werte in Externe RAM-Speicherzellen, aus denen sie das Unterprogramm dann ausliest.

Vorteile: Anzahl der Parameter nur durch ext. Speicher begrenzt Parameter sind statische Variable (zu jedem Zeitpunkt

vorhanden, auch wenn das UP nicht in Arbeit ist)

Nachteile: Wegen DPTR-Zugriffe extrem langsam Parameter sind globale Variable (können von anderen

Programmteilen verändert werden).

• Bei der Übergabe von Parametern über den Stack schreibt das HP mittels PUSH-Befehlen die Parameter über den Stackpointer in den Stack. Das Unterprogramm liest sie über Pointerzugriffe, die am momentanen Stackpointer orientiert sind, dort wieder aus.

Vorteile: Anzahl der Parameter ist nur durch Stack-Größe begrenzt Parameter sind temporäre Variable (benötigen nur

Speicherplatz, solange das UP in Bearbeitung ist). Parameter sind lokale Variable (sind nur im UP sichtbar,

da sie nach Beendigung des UP nicht mehr vorhanden sind, können sie von anderen Programmteilen auch nicht mehr verändert werden).

Nachteile:

langsam wegen Pointer-Zugriffen Parameter sind nicht beobachtbar (da temporär)

Parameter an Unterprogr. übergeben: über Register über Ext. RAM über den Stack

Page 28: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.3 Unterprogrammtechnik Seite 28 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Abbildung 7-6: Beispiel für die Parameterübergabe über den Stack

Hinweis: Von Hochsprachen-Compilern (wie"C") wird meist nur diese Parameterübergabe über den Stack verwendet Grund: jeder Prozessor besitzt einen Stack, der über den Stackpointer adressiert werden kann: damit benötigt der Compiler sonst weiter keine Kenntnis über die Speicher bzw. Registerwelt des Zielprozessors.

Parameter über Stack übergeben

Page 29: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.3 Unterprogrammtechnik Seite 29 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Dieses Verfahren, sich im Stack dort, wo gerade der SP steht, Speicher über einen am SP angehängten Zeiger zu reservieren, wird von Compilern auch für allgemeine Speicher-"Allokierung" verwendet. So kann z.B. der SP nach Einrichten des "Parameter-Zeigers" nach oben, also in Richtung steigender Adressen verschoben werden. Damit wird auf dem Stack Platz allokiert; in diesem kann das Unterprogramm lokale, temporäre Variable anlegen. Für die Zugriffe auf diese Variable muss ein zweiter Zeiger eingerichtet werden, der zunächst auf dieselbe Position wie der Zeiger für Parameter-Zugriffe gesetzt wird und mit dem man "nach oben" (also in Richtung steigender Adressen) auf lokale Variable zugreifen kann.

Vorteile: Stack-Variable benötigen nur Speicherplatz, wenn das

Unterprogramm bearbeitet wird (temporäre Variable). Stack-Variable sind lokal

Nachteile:

langsam wegen Pointerzugriff Stack "atmet", je nach Verschachtelung der Unterprogramme

wird mehr oder weniger Stack benötigt; Gefahr des "Stack-Überlaufs"

Lokale Variable im Stack

Page 30: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 30 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

7.4 Interrupts

• Die folgenden Betrachtungen zum Interrupt-Verfahren gelten zunächst allgemein für alle Mikroprozessor-Systeme; also nicht nur für den C517. Anschließend wird dann speziell auf das Interrupt-System des C517 eingegangen.

• Soll ein Mikrocontrollersystem auf externe Ereignisse (Signale) reagieren, gibt es dazu zwei Verfahren:

Polling Interrupt

• Polling (siehe Kap. 7.3) bedeutet, das externe Ereignis im Programmablauf immer wieder abzufragen und bei Auftreten des Ereignisses in das entsprechende Programmteil bzw. Unterprogramm zu verzweigen. Polling führt zu zyklischen Programm-Architekturen.

Vorteil: Polling kann deterministisch ausgelegt werden; die

Reaktionszeiten für den "best case" und den "worst case" sind berechenbar.

Nachteile:

Polling bedeutet immer auch: "beschäftigtes Warten"; jede Abfrage eines nicht eintretenden Ereignisses kostet unnötige Rechenzeit: ungünstig besonders dort, wo Ereignisse selten auftreten.

Die Reaktionszeit auf ein Ereignis wird bestimmt von der Summe der Programmlaufzeiten, die zwischen zwei Abfragen dieses Ereignisses auftreten können: langsam besonders dann, wenn um Rechenzeit zu sparen, selten gepollt wird.

• Interrupt bedeutet, dass das externe Ereignis über ein eigenes Signal sich bei dem Mikroprozessor meldet, dieser daraufhin das gerade in Arbeit befindliche Programm unterbricht und ein dem Signal zugeordnetes Unterprogramm aufruft. In diesem Unterprogramm ("Interrupt-Service-Routine") ist dann die Reaktion auf das Interrupt-Signal ausprogrammiert. Am Ende der Interrupt-Routine wird das unterbrochene Programm weiterbearbeitet. Wenn das externe Ereignis nicht auftritt, verursacht es somit keinerlei Programmlaufzeit.

Vorteile: Laufzeit-optimal: Ereignisse, die nicht auftreten, verursachen

keine Laufzeit. Minimale Reaktionszeit: die Reaktionszeit ist im "best case"

gleich der Laufzeit des kürzesten Befehls eines Prozessors (Befehle selbst sind nicht unterbrechbar durch Interrupt); im "worst case" ist sie bestimmt durch den längsten Befehl eines Prozessors (oder durch die längeste Interrupt-Sperrzeit, siehe folgende Betrachtungen).

Mehrere Ereignisse, die selten auftreten, können per Interrupt bearbeitet werden

Interrupts können per Befehl / Steuerbit gesperrt werden, um kritische Programmteile zu schützen.

Polling-Verfahren

Interrupt-Verfahren, Übersicht

Page 31: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 31 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Nachteile des Interruptverfahrens: für jedes Ereignis wird ein eigenes Signal benötigt. Die Datenneutralität (siehe Kapitel 7.3) muss vollständig

gewährleistet sein: wo das Interrupt-Unterprogramm das laufende Programm unterbricht, also eingeschachtelt wird, ist nicht vorhersehbar!

Seiteneffekte sind auch bei vollständiger Datenneutralität nicht vermeidbar: z.B. ändert ein Programm je nachdem, wo es durch eine Interrupt-Bearbeitung unterbrochen wird, seine Laufzeit!

Wird mehr als ein Interrupt verwendet, benötigt man zusätzliche Mechanismen, um die gegenseitige Unterbrechung zu steuern (wird im Folgenden vorgestellt).

Die Testbarkeit eines Programmsystems nimmt ab: ein 100-%-Test müsste die Einschachtelung eines Interrupt-Unterprogramms an jedem Befehl des Hauptprogramms einmal testen! Diesen Aufwand kann man als Programmierer in der Praxis nicht treiben; ein laufendes Mikrocontrollersystem hat aber den ganzen Tag Zeit, diese Einschachtelungen "zu testen" und findet - manchmal nach Jahren erst - diejenige Stelle, an der ein Seiteneffekt zu einem Fehler führt!

Je mehr Interrupts verwendet werden, umso unkalkulierbarer wird das Zeitverhalten des Systems (z.B. bei gleichzeitigem Auftreten aller Interrupts): die Deterministik nimmt ab.

• Eine Interrupt-Service-Routine (ISR) stellt also nichts anderes dar, als ein Unterprogramm, das ohne einen Call-Befehl, lediglich durch ein Hardware-Signal gesteuert, in ein laufendes Programm (im Folgenden wieder "Hauptprogramm HP" genannt) eingeschachtelt wird. Dabei verwaltet der Prozessor die Rückkehr-Adresse wie üblich über einen Stackpointer im Stack.

• Eine ISR wird - wie ein Unterprogramm - mit PUSH-POP-Befehlen datenneutral ausprogrammiert. Auch wenn es keinen Call-Befehl zum Aufruf gibt: am Ende der ISR muss ein RETURN-Befehl die Rückkehr in das HP ermöglichen. Je nach Prozessor ist dies der RET-Befehl oder z.B. bei dem C517, ein spezieller Return-Befehl "RETI" (Return from Interrupt).

• Während Unterprogramme an beliebigen Stellen im Codespeicherbereich liegen können (die Anfangsadresse eines Unterprogramms wird ja bei dem CALL-Befehl mitangegeben), muss der Prozessor die Anfangsadressen aller ISR kennen.

• Anfangsadressen von Interrupt-Service-Routinen werden als "Interrupt-Vektoren" bezeichnet. Von den möglichen Verfahren, wie ein Prozessor von einem bestimmten Interrupt-Signal zu der zugeordneten Interrupt-Einsprungadresse (also zum Interruptvektor) findet, werden nur die folgenden zwei Verfahren betrachtet:

1. Feste Interrupt-Vektoren

2. Interrupt-Vektortabelle

Interrupt-Service-Routine ISR Ende der ISR: RETI Interrupt-Vektor Verfahren zur Ermittlung der Interrupt-Einsprung-Adressen

Page 32: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 32 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Zu 1.: Feste Interrupt-Vektoren: Hier bekommt jede externe Interruptquelle einen eigenen Signalanschluss am Prozessor und - zusammen mit den Prozessor-internen Interruptquellen - jeweils eine fest zugeordnete Anfangsadresse. Tritt das Interrupt-Ereignis auf, wird das laufende Programm unterbrochen und das Interrupt-Unterprogramm an dieser festen Einsprungadresse begonnen. Am Beispiel des C517 ist dies in der folgenden Abbildung dargestellt:

Abbildung 7-7: Interrupt-Quellen und Interrupt-Vektoren des C517

Erklärung: Die festen Interrupt-Einsprungadressen ("Interrupt Vector Address") und die zugeordneten internen und externen Ereignisse sind hier für den C517 aufgelistet. Vergleich der Einsprungadressen zeigt: Der Abstand zwischen zwei Interrupt-Vektoren ist lediglich 8 Byte: hier ist kein Platz für eine größere Interrupt-Service-Routine, sondern lediglich für einen Sprung zu der jeweiligen ISR! Hinweis: Der "Sprung" zu diesen festen Interrupt-Einsprungadressen ist in Wirklichkeit ein von der Hardware ausgeführter Unterprogrammaufruf "LCALL"; d.h. z.B. dass die ISR des External Interrupt 0 bereits bei der Adresse 0003H beginnt; auch wenn man bei 0003H lediglich wenige Befehle programmiert, muss das Programm dann mit einem RETI-Befehl beendet werden.

1. Verfahren zur Ermittlung der Interrupt-Einsprung-adresse: Feste Interrupt-Vektoren

ISR-Aufruf ist ein LCALL

Page 33: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 33 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Vorteile der festen Interrupt-Vektoren: einfach, wenig Aufwand schnell

Nachteile der festen Interrupt-Vektoren: Der gesamte Adressbereich der Interrupt-Vektoren muss im

Codespeicher reserviert werden, auch wenn nur ein Interrupt benutzt wird.

Der Prozessor benötigt für jedes externe Interrupt-Signal einen eigenen Anschluss: Gehäuse-Größe!

Die Interrupt-Verwaltung muss vom Prozessor selbst durchgeführt werden.

• Zum 2. Verfahren zur Ermittlung der Interrupt-Einsprungadresse: Die Interrupt-Vektortabelle (Beispiel 80x86) Bei diesem Verfahren besitzt der Prozessor lediglich einen Eingang für ein externes Interruptsignal. An diesem Eingang, der als Interrupt-Sammelsignal dient, meldet sich ein zusätzlicher Baustein, der sogenannte "Interrupt-Controller" (siehe übernächste Abbildung).

• Dieser Interruptcontroller hat selbst z.B. 8 Interrupt-Eingänge, an denen die Signalquellen ihre Interrupt-Anforderungen stellen können. Der Interruptcontroller ermittelt daraus den höchstprioren Interrupt und stellt eine Interrupt-Anforderung INTR an den Mikroprozessor.

• Der Mikroprozessor quittiert die Anforderung (INTA-Signal); daraufhin liefert der Interruptcontroller dem Mikroprozessor über den Datenbus die Information, welche der Interruptquellen die Anforderung gestellt hat. Diese Information ist der Interruptvektor, er ist eine Nummer zwischen 0 und 255.

2. Verfahren zur Ermittlung der Interrupt-Einsprung-adresse: Interrupt-Vektortabelle mit Interrupt-Controller Interrupt-Vektor

Page 34: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 34 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Abbildung 7-8: Prinzip der Vektortabelle (80x86)

Erklärung: Die festen Interrupt-Einsprungadressen (00000H, 00004H...) liegen am Anfang des Adressraumes dieses Prozessors. Durch Multiplikation mit 4 findet der Prozessor aus der ihm mitgeteilten Vektornummer die diesem Interrupt zugeteilte Anfangsadresse der Interrupt-Service-Routine ISR. Bei diesem Prinzip sind also zusätzlichen Sprung-Befehle mehr nötig. Die ISR-Anfangsadressen können damit beliebig im Speicher liegen; sie müssen im Initialisierungsteil des Programms in die Vektortabelle eingetragen werden (oder das Ladeprogramm übernimmt dieses).

• Die folgende Abbildung zeigt das Zusammenspiel zwischen einem externen Interrupt-Controller und dem Mikroprozessor 80x86.

• Zusätzlich zu dem einen, externen Sammel-Interrupteingang INTR besitzt der Prozessor einen Nicht-sperrbaren Interrupt NMI (Non Mascable Interrupt), der für Notsignale reserviert sein sollte; hier kann z.B. die Stromversorgung einen beginnenden Netzausfall frühzeitig ankündigen.

• Darüber hinaus besitzt dieser Prozessor eine Reihe von internen Interruptquellen. Für diese (und den NMI) sind die ersten fünf Plätze der Vektortabelle reserviert.

Interrupt-Vektortabelle

NMI

Page 35: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 35 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Abbildung 7-9: Interruptsystem mit externem Interrupt-Controller

Erklärung: INTR: Sammelinterrupt vom Interrupt-Controller INTA: Acknowledge-Signale vom Mikroprozessor Vektor-Nr.: wird vom Interrupt-Controller auf den Datenbus aufgelegt; Zuordnung zu IR0-IR7 muss bei der Initialisierung des Interrupt-Controllers diesem als Parameter mitgeteilt werden. NMI Non Mascable Interrupt INT n Interrupt-Befehl INT0 Interrupt bei gesetztem Overflow-Flag Division Interrupt bei Division durch 0 Single Step Interrupt nach jedem Befehl (nur bei gesetztem "Trap- Flag")

Hinweis: Der Befehl "INT n" stellt einen "Software-Interrupt" dar: er wird ausgelöst durch den INT-Befehl, wobei als Parameter n die Vektor-Nummer übergeben wird. Diese Konstruktion stellt einen Speicher-Indirekten Call-Befehl dar. Sie wurde im Betriebssystem MS-DOS verwendet, um Betriebssystem-Programmteile über INT n aufzurufen (bei INT 21 ergänzt um eine weitere Funktions-Kennung, die im Akku übergeben wird).

Realisierung: Vektortabelle und externer Interrupt-Controller

Software-Interrupt INT n in der Vektortabelle

Page 36: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 36 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Vorteile der Interrupt-Vektortabelle: wenig Aufwand im Prozessor, ein externer Interrupt-Controller

übernimmt die Vorverarbeitung der Interrupts. nur ein Sammelinterrupt-Eingang am Prozessor benötigt. die IR-Controller können kaskadiert werden: damit sind bis zu

255 Interrupts möglich.

Nachteile der Interrupt-Vektortabelle: Zusätzlicher Interrupt-Controller mit BUS-Anschluss wird

benötigt.

• Wird in einem System mehr als ein Interrupt verwendet, müssen die Interrupts verwaltet werden; daraus ergeben sich dann folgende Aufgaben:

Priorisierung gleichzeitig auftretender Interrupts Sperren / Freigeben einzelner Interrupts Erkennen von noch nicht bearbeiteten Interrupts ("Pending IR") Erkennen von mehrfach auftretenden Interrupts Verteilung der Rechenzeit auf die Bearbeitung von Interrupt-

Ereignissen

• Als Beispiel für die Lösung obiger Aufgaben wird zunächst wieder der externe Interrupt-Controller (Verfahren 2 von oben: "Vektortabelle") betrachtet:

Abbildung 7-10: Blockschaltbild eines externen Interrupt-Controllers (Intel 8259)

Verwaltung der Interrupts Interrupt-Verwaltung mittels Interrupt-Controller Aufbau eines externen Interrupt-Controllers 8259

Page 37: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 37 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Erklärung: Tritt ein oder mehrere Interrupts auf, wird im Interrupt Request Register

IRR jeweils ein Bit gesetzt. Damit ist die Anforderung der Interruptquelle gespeichert.

Die Prioritätslogik ermittelt nach einem (per Parametrierung einstellbaren) Verfahren die höchste Priorität, dabei werden Signalquellen, die im Interrupt-Maskenregister IMR gesperrt sind, nicht berücksichtigt. Dann wird für den höchstprioren Interrupt das INTR-Signal zum Prozessor gesandt.

Der Mikroprozessor quittiert mit INTA-Signal; damit ist der höchstpriore Interrupt angenommen.

Die Prioritätslogik setzt im Interrupt Service Register ISR das Bit für den in Arbeit befindlichen Interrupt und gleichzeitig wird das entsprechende Bit im IRR zurückgesetzt.

Über ein weiteres INTA-Signal gesteuert, legt der Interruptcontroller den zugehörigen Interrupt-Vektor auf den Datenbus.

Am Ende der Interrupt-Serviceroutine wird das ISR-Bit zurückgesetzt.

• Da die Interrupt-Anforderungen, die in Arbeit befindlichen Interrupts und die gesperrten Interrupts jederzeit durch Auslesen der Register ermittelt werden können, lassen sich die obigen Forderungen zur Interruptverwaltung damit erfüllen.

• So kann z.B. in einem Interruptprogramm jederzeit ermittelt werden, ob derselbe oder andere Interrupts in der Zwischenzeit angefordert wurden (IRR), aber noch nicht in Arbeit sind (ISR). Damit kann auch entschieden werden, ob ein nachträglich aufgetretener Interrupt einen bereits in Arbeit befindlichen Interrupt unterbrechen soll. Dazu muss dieser allerdings ausdrücklich freigegeben werden; dann wird dieser Interrupt eingeschachtelt ("Nesting" von Interrupts).

Hinweis: Beim Eintritt in die Interrupt-Serviceroutine sind alle weiteren Interrupts gesperrt - unabhängig von ihrer Priorität.

• Interruptcontroller unterstützen die Verwaltung von Interrupts und Verteilung der Rechenzeit auf Interrupt-Programme durch eine Vielzahl von Betriebsarten, die per Parametrierung eingestellt werden können. So bietet der 8259 zum Beispiel die Betriebsart "Rotierende Priorität": jede angenommene Interruptquelle sinkt von der höchsten zur niedrigsten Priorität, um eine gleichmäßige Verteilung der Rechenzeit zu erreichen.

• In Betriebssystemen wird allerdings diese Verwaltung der Rechenzeit nicht dem Interruptcontroller überlassen, sondern aufgeteilt auf die verschiedenen Ebenen der Systemsoftware ausprogrammiert.

• Als weiteres Beispiel für die Lösung der Aufgabe "Interruptverwaltung" wird in den folgenden Abbildungen das Interruptsystem des C517 dargestellt: hier ist ein einfacher Interruptcontroller auf dem Chip integriert; seine Funktionen kann man in Form von Blockschaltbildern leicht erklären.

Funktionen des externen Interrupt-Controllers

Nesting

Interrupt-Verwaltung des C517

Page 38: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 38 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Die folgenden drei Abbildungen zeigen den Weg der Interrupt-Signale des C517 über verschiedene Software-Schalter (d.h. Steuerbits in den Sonderfunktionsregistern) bis hin zu vier verschiedenen Prioritäts-Stufen.

Beispiel: Der externer Interrupt 0 (INT0) Mit dem Software-Schalter"IT0" wird in der folgenden Abbildung für den externen Interrupt Nr. 0 (INT0, der Überstrich zeigt an, dass es sich um ein "Low-aktives" Signal handelt) festgelegt, ob der Interrupt bei Low-Pegel des Signals (Stellung wie eingezeichnet) ausgelöst wird ("Pegel-aktiv"), oder ob der Interrupt bei einer negativen Flanke des Signals ausgelöst wird ("Flanken-aktiv"). Das Bit "IE0" zeigt eine vorliegende Interrupt-Anforderung an, es wird von der Interrupt-Verwaltung automatisch dann gelöscht, wenn die Interrupt-Serviceroutine in Bearbeitung ist. Da IT0 und IE0 auslesbare Bits sind, kann also auch hier ein "Pending"-Interrupt erkannt werden. Das Bit "EX0" stellt die Interrupt-Sperre für diesen Interrupt dar. Das Bit "EAL" stellt die Interrupt-Sperre für alle Interrupts dar. Die Bits "IP1.0" und "IP0.0" legen die Prioritätsstufe fest.

Abbildung 7-11: Interruptsystem des C517, Teil 1 / SIEMENS User's Manual /

Pegel-aktiver Interrupt Flanken-aktiver Interrupt Pending Interrupt Interrupt-Sperren

Page 39: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 39 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Hinweise: Die eingezeichneten Schalterstellungen sind nur symbolisch zu verstehen! Welche Funktion einer "1" im Steuerbit zugeordnet ist, muss jeweils aus den detaillierten Darstellungen der Interrupt-Register entnommen werden. Diese sind deshalb in den Abbildungen 7-14 bis 7-19 dargestellt. Die Adressen, die im EAL-Block eingetragen sind, sind die festen Vektoradressen dieses Prozessors.

Abbildung 7-12: Interruptsystem des C517, Teil 2 / SIEMENS User's Manual /

• Ein Interrupt wird nicht aufgerufen, wenn:

Eine Interrupt-Serviceroutine eines gleich- oder höherprioren Interrupts gerade in Arbeit ist

Ein laufender Befehl noch nicht zuende bearbeitet ist Der laufende Befehl ein Return-Befehl ist oder gerade ein

Zugriff auf die Interrupt-Steuerregister erfolgt: in diesen beiden Fällen wird die Interrupt-Serviceroutine um einen Befehl verzögert.

• Die Interrupt-Antwortzeit dieses Prozessors ist also mindestens drei Maschinenzyklen lang: Zwei Zyklen für den Aufruf + 1 Zyklus für den laufenden Befehl.

Interrupt-Verzögerung

Page 40: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 40 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Die "Polling Sequence" innerhalb einer Prioritätsstufe legt durch die Reihenfolge der Abfrage der einzelnen Anforderungen fest, welcher Interrupt bei gleichzeitigem Auftreten als erster bearbeitet wird.

Abbildung 7-13: Interruptsystem des C517, Teil 3 / SIEMENS User's Manual /

Hinweis: Die meisten Interrupt-Anforderungsbits (direkt vor den Interrupt-Einzelsperren) sind bitadressierbar und können damit also auch per Software gesetzt werden. Das Auslösen von Interrupts per Befehl ist beim Testen gelegentlich sehr nützlich.

Page 41: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 41 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

• Die folgenden Abbildungen zeigen eine Auswahl aus den Interrupt-Steuerregistern. Hier ist für jede der Interruptquellen des C517 detailliert aufgelistet, wie die einzelnen Funktionen aus den Übersichtsbildern 7-11 bis 7-13 einzustellen sind.

• Die Stellung der Steuerbits nach dem Einschalten ("Reset Value") ist ebenfalls hier nachzulesen.

Abbildung 7-14: IEN 0 Interrupt-Enable-Register 0

Interrupt-Steuerregister des C517

Page 42: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 42 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Abbildung 7-15: IEN 1 Interrupt-Enable-Register 1

Abbildung 7-16: IEN2 Interrupt-Enable-Register 2

Page 43: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 43 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Abbildung 7-17: TCON

Abbildung 7-18: T2CON

Page 44: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 44 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Abbildung 7-19: IRCON 0

Page 45: Skriptum „Mikrocontroller-Systeme“ Kapitel 6geju0001/Mikrocontroller-Skript/6_7... · Mikrocontroller 6.1 Aufbau und Handhabung einer Befehlsliste Seite 2 von 45 HS Karlsruhe,

Mikrocontroller 7.4 Interrupts Seite 45 von 45

HS Karlsruhe, Studiengang Energie- und Automatisierungstechnik Dr. J. Hülsemann

V 1.00

Abbildung 7-20: IP 0 und IP 1