Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Das Statusregister (SREG) - 1

Dem Instruction Set Summary kann man entnehmen, dass bis auf wenige Ausnahmen die

  • Bit-Instruktionen
  • arithmetischen-Instruktionen
  • logischen Instruktionen

die Flags im Statusregister (SREG) verändern. Welche Flags gesetzt und ggf. auch wieder wann gelöscht werden, soll an Beispielen mit dem AVR Simulator gezeigt werden.

Das Statusregister SREG

Das 8-Bit breite Statusregister enthält Informationen über das Ergebnis der zuletzt ausgeführten arithmetischen Anweisung. Diese Informationen können zum Ändern des Programmflusses verwendet werden, um bedingte Operationen auszuführen.

Abb. 1 - Das Statusregister

I-Flag - Bit7 (Global Interrupt Enable)

  • Das 7. Bit Global Interrupt Enable muss gesetzt werden, damit Interrupts freigegeben werden. Es ist kein Flag des Controllers.
  • Ist das I-Flag gelöscht, wird kein Interrupt in einem Programm freigegeben.
  • Das I-Bit wird durch Hardware gelöscht, nachdem ein Interrupt aufgetreten ist, und durch den RETI-Befehl gesetzt, um nachfolgende Interrupts freizugeben.
  • Das I-Bit kann auch von einer Anwendung mit den Befehlen SEI und CLI gesetzt bzw.  gelöscht werden (siehe ISS). Es kontrolliert das MCU Control Register.

T-Flag - Bit6 (Bit Copy Storage)

  • Bit Copy Speicher Flag wird später besprochen. Es ist kein Controller-Flag.

H-Flag - Bit5 (Half Carry Flag)

  • Zeigt bei einigen arithmetischen Operationen (Addition, Subtraktion, Inkrement, Dekrement und Vergleiche) einen Übertrag vom lower nibble Bit3 zu Bit4 im upper nibble an.

S-Flag - Bit4 (Sign Bit)

  • Das S-Bit ist immer eine EXOR Verknüpfung zwischen dem Negativ-Flag N und dem Zweierkomplement-Überlauf-Flag V. Damit lassen sich vorzeichenbehaftete Werte miteinander vergleichen. Ist Bit7 vom Wert 1, so wird die Zahl als negativ interpretiert (-1 ... -128), ist sie vom Wert 0, ist sie eine positive Zahl (0 ... 127).

V-Flag - Bit3 (Two´s Complement Overflow)

  • Das Zweierkomplement-Überlauf-Flag V unterstützt die Zweierkomplement-Arithmetik. Es wird gesetzt, wenn es einen Über- oder Unterlauf gegeben hat. Nach logischen Befehlen ist das V-Flag immer 0.

N-Flag - Bit2 (Negative Flag)

  • Zeigt ein negatives Ergebnis nach einer arithmetischen oder logischen Instruktion an. Bei der 2er-Komplement-Arithmetik entspricht eine 1 in Bit7 einer negativen Zahl.

C-Flag - Bit1 (Carry Flag)

  • Gibt es bei der zuletzt ausgeführten Instruktion einen Über- oder Unterlauf, wird das Flag gesetzt. Bei einer Addition, Subtraktion. logischen Operation (wenn der erste Operand kleiner als der zweite ist) oder zyklischem Schieben wird das C-Flag gesetzt.

Z-Flag - Bit0 (Zero Flag)

  • Das Flag wird bei einem Ergebnis 0 nach einer arithmetischen oder logischen Instruktion gesetzt.

Übung 1 - Das SREG und seine Flags - Addition

Das Statusregister (SREG) und seine Flags
Material
  • Debugger der Programmoberfläche AVR Studio; alternativ: AVR Simulator
  • Datenblatt des ATMega 8
  • AVR Instruction Set Manual
Aufgaben
  • Gib das Programm SREG1.asm (siehe Abb. 2) in den Editor der Bearbeitungssoftware ein und speichere es ab.
  • Starte die Simulation und schalte in die Zeilensteuerung.
  • Notiere dir nach jeder Programmzeile welche Flags gesetzt/rückgesetzt wurden.
  • Versuche selbst zu beantworten, warum das Flag gesetzt wurde.

Das Programm SREG1.asm

Abb. 2 - Assemblerprogramm SREG1.asm

Wie arbeitet das Programm SREG1.asm ?

Betrachten wir die einzelnen Instruktionen. Schlage im Datenblatt des ATMega 8 das Instruction Set Summary (ISS) auf.

  • Gestartet wird die Simulation in Programmzeile 26 mit der Instruktion OUT. Sie löscht alle Flags in SREG.
  • Die nachfolgenden beiden Instruktionen LDI speichern jeweils eine Zahl in A (R19) und B (R20). Flags werden laut ISS nicht gesetzt.
  • Der Additionsbefehl ADD in Programmzeile 30 setzt in SREG die Flags (Halfcarry Flag) und C (Carry Flag) -> siehe Abb. 3.
  • Das H-Flag wird gesetzt, weil Bit4 von vorher 0 auf 1 wechselt. Es erfolgte ein Übertrag vom lower nibble zu Bit4 im upper nibble.
  • Das C-Flag wird gesetzt, weil die Summe aus E9 und 4E dezimal 311 ergibt oder binär: 1 0011 0111. Es erfolgt ein Übertrag in das neunte Bit, angezeigt durch das C-Flag.
  • Das Z-Flag ist nicht gesetzt; es erfolgt ein Rücksprung in Programmzeile 26. Alles beginnt von vorn.

 

 

 

 

 

 

Abb. 3

H und C Flag wurden nach Ausführung der ADD-Instruktion gesetzt.

Übung 2 - Das SREG und seine Flags - Subtraktion

Das Statusregister (SREG) und seine Flags
Material
  • Debugger der Programmoberfläche AVR Studio; alternativ: AVR Simulator
  • Datenblatt des ATMega 8
  • AVR Instruction Set Manual
Aufgaben
  • Gib das Programm SREG2.asm in den Editor der Bearbeitungssoftware ein und speichere es ab.
  • Starte die Simulation und schalte in die Zeilensteuerung.
  • Notiere dir nach jeder Programmzeile welche Flags gesetzt/rückgesetzt wurden.
  • Versuche selbst zu beantworten, warum das Flag gesetzt wurde.

Das Programm SREG2.asm

Abb. 4 - Assemblerprogramm SREG2.asm

Wie arbeitet das Programm SREG2.asm ?

  • Gestartet wird die Simulation in Programmzeile 26 mit der Instruktion OUT. Sie löscht alle Flags in SREG.
  • Die nachfolgenden beiden Instruktionen LDI speichern jeweils eine Zahl in A (R19) und B (R20). Flags werden laut ISS nicht gesetzt (siehe Abb. 5a).

Abb. 5a

Nach drei Programmschritten sind die Zahlen 0x09 und 0x0D in R19 und R20 gespeichert.

Flags wurden nicht gesetzt.

Der nächste auszuführende Befehl SUB steht in Programmzeile 30.

  • Der Subtraktionsbefehl SUB in Programmzeile 30 setzt in SREG die Flags HSNC (siehe Abb. 5b).
  • Das H-Flag wird gesetzt, weil Bit4 von vorher 0 auf 1 wechselt. Es erfolgt ein Übertrag vom lower nibble zu Bit4 im upper nibble.
  • Das C-Flag wird bei einer SUB-Instruktion gesetzt, wenn der Absolutwert vom Subtrahend B (R20) größer ist als der Absolutwert vom Minuend A (R19). Wenn das nicht der Fall ist, wird das C-Flag gelöscht.
  • Das N-Flag wird bei einer SUB-Instruktion gesetzt, wenn das MSB der Differenz (Bit7 in R19) gesetzt ist.
  • Das S-Flag errechnet sich aus EXOR(N,V). Mit N = 1 und V = 0 wird S = 1.
  • Das Z-Flag ist nicht gesetzt; es erfolgt ein Rücksprung zu Programmzeile 26. Alles beginnt von vorn.

 

 

 

 

Abb. 5b

Nach Ausführung der Subtraktion ist der Zustand des SREG:

00HS0N0C.

Mit Hilfe eines Simulationsprogramms lässt sich auf diese Weise sehr genau das Verhalten eines Controllers und der Flags bei Ausführung jeder einzelnen Instruktion beobachten. Neben den Datenblättern ein sehr nützliches Werkzeug, um Programmierfehler auszumerzen oder einzukreisen.

  • Zum Abschluss ein kleiner Selbsttest. Finde heraus, welche Flags nach Ausführung der Instruktion ADD gesetzt wurden und warum.
  • Betrachte dazu das Programm in Übung 3.

Übung 3 - Selbsttest

Abb. 6 - Finde heraus, welche Flags nach Ausführung des ADD-Befehls gesetzt wurden und warum.
Druckversion | Sitemap
© Reinhard Rahner - Gettorf