Schlaufuchs Logo

Register der AVR® Mikrocontroller-Familie

Wozu Register?

Register (bei anderen Mikrocontroller-Herstellern auch als Ports bezeichnet) sind festgelegte Bereiche im Speicher, die für die korrekte Funktion Mikrocontroller benötigt werden. Zum einen muss die CPU Zwischenergebnisse während der Ausführung eines Programms zwischenspeichern, zum anderen müssen Funktionsblöcke des Mikrocontrollers korrekt konfiguriert und angesprochen werden. Dies läuft über das Lesen und Schreiben in dafür zuständige Register. Wo sich ein bestimmtes Register im (RAM-) Speicher des Mikrocontrollers befindet, steht im Handbuch.

Besondere Register

Die meisten Register werden für die Konfiguration der Funktionen des Mikrocontrollers verwendet. Man bezeichnet sie auch als Sonderregister.

Register, die die Konfiguration der I/O-Pins übernehmen werden auch als I/O-Register bezeichnet.

Benennung der Register

Wenn man im Handbuch eines Mikrocontrollers liest, stellt man fest, dass Registern eine feste Bezeichnung, die zumeist aus Abkürzungen besteht zugeordnet wird. Dies erleichtert die Programmierung, da man sich sonst die Speicheradresse des Registers und dessen Funktion auswendig merken müsste.

Beispielsweise befindet sich beim ATmega328p das Statusregister mit der Handbuch-Bezeichnung SREG in der Speicheradresse 0x5F.

Im avr-gcc Compiler fügt man vor Beginn des eigentlichen Codes ein Include-File ein, in dem die Register mit den im Handbuch identischen Abkürzungen definiert werden.

#include <avr/io.h>

Die Register können dann mit ihren Abkürzungen angesprochen werden, was die Übersichtlichkeit des Quellcodes deutlich verbessert.

Bit-Schema der Register

Ein Register besteht beim AVR Mikrocontroller aus 8 Bits. Die Bits werden von Null beginnend von rechts nach links gezählt.

Das Bit 7 wird auch als höchstwertigstes Bit oder Most Significant Bit (MSB) bezeichnet.

Das Bit 0 wird auch als niederwertigstes Bit oder Least Significant Bit (LSB) bezeichnet.

Zählweise der Bits eines Registers

Der Inhalt des oben abgebildeten Registers kann in

binärer Schreibweise: 0b10110011
dezimaler Schreibweise:     179
hexadezimaler Schreibweise: 0xB3

angegeben werden.

Zugriff auf die Register

Der Zugriff auf die Register erfolgt normalerweise immer byteweise, d.h. es wird immer das gesamte Byte des Registers gelesen oder geschrieben, da das Register am Datenbus des Mikrocontrollers hängt.

Lese-Zugriff

Der Lese-Zugriff erfolgt auf das gesamte Byte des Registers. Ob ein bestimmtes Bit gesetzt ist oder nicht lässt sich dann mit einer Bitmaske prüfen.

Schreib-Zugriff

Auch der Schreib-Zugriff erfolgt immer auf das gesamte Byte des Registers.

Oft muss man aber nur einzelne Bits des Registers setzen oder löschen. Dabei ist man auf eine passende Schreib-Bitmaske angewiesen, denn die anderen Bits sollen ja unverändert bleiben, da sie eventuell bestimmte Funktionen im Mikrocontroller steuern.

Setzen eines Bits

Nehmen wir an, dass das Bit2 eines Registers gesetzt werden soll. Die anderen Bits des Registers sollen nicht verändert werden.

Dies kann man mit einer bitweisen ODER-Verknüpfung des Registers mit einer Bitmaske erreichen.

Bit eines Registers setzen
durch ODER-Verknüpfung mit einer Bitmaske

Im avr-gcc Compiler erreicht man dies durch folgenden Quellcode:

REGx |= 0b00000100;

Löschen eines Bits

Nehmen wir an, dass das Bit2 eines Registers gelöscht werden soll. Die anderen Bits des Registers sollen nicht verändert werden.

Dies kann man mit einer bitweisen UND-Verknüpfung des Registers mit einer Bitmaske erreichen.

Bit eines Registers löschen
durch UND-Verknüpfung mit einer Bitmaske

Im avr-gcc Compiler kann man dies durch folgenden Quellcode erreichen:

REGx &= 0b11111011;

Man erkennt, dass die Bitmaske für das Löschen eines Bits genau der invertierten Bitmaske für das Setzen des Bits entspricht. Dies nutzt man aus, um einen einheitlich aussehenden Code zu erzeugen:

REGx &= ~0b00000100;