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

Arbeitsregister (GPR) und Befehlslisten

Die 32 Arbeitsregister (general purpose register) werden mit den vorbelegten Bezeichnern R0 - R31 angesprochen. Dabei gilt:

  • R0 steht für die Instruktionen LPM und MUL zur Verfügung.
  • R1:R0 ist Produktregister für Multiplikationsbefehle
  • R0 bis R15 lassen sich nicht direkt adressieren
  • R0 bis R31 lassen sich für die hier benutzten AVR-Controller unter den SRAM-Adressen 0x00 - 0x1F ansprechen.
  • Für R16 bis R31 sind alle Register Adressierungsarten möglich
  • Es gibt vier Wort-Register (16-Bit): R25:R24, XH:XL, YH:YL und ZH:ZL.

1 - Datenblatt - Instruction Set Summary

In jedem Datenblatt zu einem bestimmten AVR-Controller findet sich auch eine Zusammenfassung aller Befehlssätze dieses Controllers (Instruction Set Summary). Um die Darstellung dort zu verstehen sind ein paar Vorbemerkungen notwendig.

 

  • Zielregister werden mit Rd, Quellregister mit Rr oder Rs, Ports mit P bezeichnet.
  • Konstante erscheinen in der Operandenspalte als k oder als kx, wobei x eine natürliche Zahl ist, die die Bitlänge angibt.
  • Die Spalte Flags gibt an, welche Statusbits im Statusregister SREG betroffen sind und bei Anwendung des Befehls verändert werden.
  • Die letzte Spalte #Clocks gibt die Ausführungszeit in der Anzahl der Takte an.

 

Das Instruction Set Summary umfasst sechs Spalten:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 1 - Auszug aus einem Instruction Set Summary des ATmega8; in der Spalte Flags werden bei der Instruktion MUL das Z(ero) und C(arry) Flag beeinflusst.

Die Arbeitsregister R0 bis R31 (General Purpose Register)

  • Eine unmittelbare Adressierung der GPR R0 bis R15 (0x00 bis 0x0F) ist nicht möglich. Bei Anwendung der Multiplikationsbefehle ist R1:R0 das Produktregister.
  • Die GPR R16 bis R31 lassen sich über alle Adressierungsarten ansprechen. Es gibt vier Wort-Register (16-Bit): R25:R24, XH:XL, YH:YL, ZH:ZL.

In den folgenden kleinen - teils sinnfreien - Übungen betrachten wir aus den fünf Kategorien des Instruction Set Summary

  1. arithmetische und logische Instruktionen (Arithmetic and Logic Instructions)
  2. Verzweigungs-Instruktionen (Branch Instructions)
  3. Instruktionen zur Datenübertragung (Data Transfer Instructions)
  4. Bit- und Bit-Test Instruktionen
  5. MCU-Kontrollinstruktionen

eine Auswahl an Instruktionen, machen uns mit ihnen näher vertraut und besprechen sie ausführlich.

 

Einige Instruktionen haben wir bereits im AVR Assembler - Teil 1 kennengelernt:

  • LDI, OUT, STS
  • SBI, CBI
  • RJMP
  • ADD, ADC, SER, COM

 

Die folgenden Programme können tlw. mit einem STK200 oder mit einem Simulationsprogramm ausgeführt werden. Der eingesetzte Prozessor ist in allen diesen Übungen ein ATmega8.

Übung 1 - Instruktionen CPI, DEC, BRNE

Übung 1 - Instruktionen CPI, DEC, BRNE
Material
  • 1x Debugger unter AVRStudio 4.x oder AVR Simulator
  • 1x Datenblatt ATmega8 Register Summary
  • 1x Datenblattauszug ATmega8 Instruction Set Summary
Aufgabe
  • Welche Angaben werden im Instruction Set Summary (ISS) über den Befehl CPI (compare with immediate) und BRNE (Branch not equal) gemacht?
  • Wieviel Takte werden zur Ausführung benötigt und welche Flags im SREG können beeinflusst sein?
  • Gib das Programm CPI.asm in den Editor des AVRStudio 4.x ein und speichere es ab.
  • Mit STRG + F7 (Build and Run) kompiliere das Programm und starte den Debugger. Alternativ: Kompiliere mit F7 (Build) das Programm, beende AVRStudio und starte den AVR Simulator.
  • Mit Simulation - Start wird über das Hauptmenü in der AVR Simulator IDE der Simulationsvorgang gestartet.
  • Mit F2 gelangt man zeilenweise durch das Programm.

Das Programm CPI.asm

Abb. 2 - Das Programm CPI.asm demonstriert die Arbeitsweise der Instruktionen CPI und BRNE.

Auszüge aus dem Instruction Set Summary

  • Im Kapitel AVR Assembler - Teil 1 wurden bereits die nachfolgenden fünf Instruktionen eingeführt (siehe Abb. 2a - "Auszug aus Instruction Set Summary");
  • in Kapitel "Speicher Info" zusätzlich der Befehl OUT (siehe Abb. 2b - "Auszug aus Instruction Set Summary").
  • In Übung 1 wurden die drei Instruktionen CPI, DEC und BRNE eingeführt (siehe Abb. 2c - "Auszug aus Instruction Set Summary").
Abb. 2a - Auszug aus dem "Instruction Set Summary (siehe dort S. 311ff)" eines ATmega8. Die Instruktionen stammen aus "AVR Assembler - Teil 1". Rot markierte Flags werden von der jeweiligen Instruktion verändert.
Abb. 2b - Auszug aus dem "Instruction Set Summary (siehe dort S. 311ff)" eines ATmega8. Die Instruktionen wurden erstmals eingesetzt in "AVR Assembler - Teil 1 / Speicher Infos". Rot markierte Flags werden von der jeweiligen Instruktion verändert.
Abb. 2c - Auszug aus dem "Instruction Set Summary (siehe dort S. 311ff)" eines ATmega8. Die Instruktionen wurden erstmals eingesetzt in Übung 1 unter "AVR Assembler - Teil 1 / GPR und Befehlslisten". Die rot markierten Flags werden von der jeweiligen Inst

Simulation des Programmablaufs

 

 

 

 

 

 

 

 

 

 

Abb. 3a - Instruktions-zählerstand 0, Start der Simulation.

Der erste auszuführende Befehl ist LDI R17,$30.

 

 

 

 

 

 

 

 

 

Abb. 3b - Instruktions-

zählerstand: 1

R17 <- 0x30

wurde ausgeführt.

Die nächste Instruktion ist

LDI R18, 0x2D

 

 

 

 

 

 

 

 

 

 

Abb. 3c - Instruktions-

zählerstand 2

R18 <- 0x2D wurde ausgeführt. Die nächste Instruktion:

DEC R17

Im weiteren Verlauf der Programmausführung wird

  1. R17 dekrementiert (-1) und anschließend
  2. R17 mit R18 bitweise verglichen

und - wenn keine Gleichheit festgestellt wird - kehrt das Programm an den Anfang der Schleife (schleife:) zurück.

Die Spiegelpunkte 1. und 2. werden wieder durchlaufen, bis Gleichheit zwischen R17 und R18 festgestellt wird. Der Controller erkennt dies, da im SREG nach Ausführung der CPI-Instruktion das Z-Flag (Gleichheit liegt vor) gesetzt wurde (s. Abb. 3d).

Die Schleife wird verlassen, es geht weiter mit: rjmp wdh.

 

 

 

 

 

 

 

Abb. 3d

Nach 10 Instruktionsschritten  sind die Registerinhalte von R17 und R18 gleich.

Die Instruktion CPI erkennt dies, setzt das Z-Flag im SREG und die Schleife wird wegen der Instruktion BRBC verlassen.

Übung 2 - Instruktionen IN, OUT, CLR, EOR, BREQ

In der folgenden Übung 2 wird der CPI Befehl angewendet. Es wird die Aufgabe sein, die acht LEDs an PortB als Indikatoren für die acht Taster sw0 bis sw7 an PortD auf einem STK200 Board zu nutzen. Eine entsprechende LED soll aufleuchten, wenn der dazu entsprechende Taster (es geht um die Position: 0, 1, ..., 7) gedrückt wird. Mehrere Taster dürfen gleichzeitig gedrückt werden.

Taster und LEDs werden synchronisiert
Material
  • 1x STK200 mit ATmega8 Prozessor, Schaltnetzteil und USB-Kabel
  • 1x Datenblatt ATmega8 Register Summary
  • 1x Datenblattauszug ATmega8 Instruction Set Summary
  • 1x Debugger unter AVRStudio 4.x oder AVR Simulator
Aufgabe
  • Gib das Programm in den Editor des AVRStudio 4.x ein und speichere es ab.

 

Das Programm TasterLed.asm

Abb. 4 - Programmkopf für alle Beispielprogramm-Übungen mit dem STK200 Board mit Pinbelegung des ATmega8 Prozessors
Abb. 4a - Hauptprogrammteil mit Initialisierungsblock; Programmkopf siehe Abb. 4.

Das Ergebnis auf dem STK200 sichtbar gemacht

 

 

 

 

 

 

 

 

 

 

 

Abb. 5

Werden die Taster SW0, SW3 und SW6 gedrückt, leuchten auch die entsprechenden LEDs der Bargrafanzeige.

Auszüge aus dem Instruction Set Summary

Abb. 5 - Auszüge aus dem Instruction Set Summary des ATmega8. Rot markierte Flags werden von der jeweiligen Instruktion verändert.

Wie arbeitet das Programm TasterLed.asm?

Der Programmkopf für das STK200 mit einem ATmega8 wird bei allen weiteren Übungen zu diesem Thema beibehalten (siehe Abb. 4).

  • PORTB ist mit der LED-Bargrafanzeige verbunden.
  • PORTD ist mit den acht Tastern des STK200 verbunden. Diese sind vom Hersteller active low geschaltet.

Schleife "Taster_aus"

  • Es werden wiederholt die Potentiale an den Eingangsportpins D0 bis D7 eingelesen und an das Register R17 (taster) übergeben. Die Taster sind active low geschaltet, somit im Ruhezustand auf HIGH Potential. R17 <- 1111 1111.
  • Im Initialisierungsteil des Programms wurde PORTB bereits auf 1111 1111 gelegt. Damit steht in R16 1111 1111.
  • Die EXOR-Auswertung von R17 (taster) mit R16 (leds) ergibt 0000 0000, solange keine Taste gedrückt wird.

Schleife "Taster_ein"

  • Diese Schleife wird erreicht, sobald die EXOR-Auswertung ungleich 0x00 ist oder mindestens eine Taste gedrückt wurde.
  • Es werden die Potentiale an den PORTD-Pins eingelesen und an R17 übergeben. Mindestens ein Bit von PORTD ist dann 0.
  • Die EXOR-Auswertung ergibt an dieser Stelle eine 1 und sonst Nullen; die entsprechende LED leuchtet auf (siehe Abb. 5).
Druckversion | Sitemap
© Reinhard Rahner - Gettorf