Register der AVR® Mikrocontroller-FamilieWozu 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 RegisterDie 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 RegisterWenn 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 <avr/io.h>
Die Register können dann mit ihren Abkürzungen angesprochen werden, was die Übersichtlichkeit des Quellcodes deutlich verbessert. Bit-Schema der RegisterEin 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
Das Bit 0 wird auch als niederwertigstes Bit oder Der Inhalt des oben abgebildeten Registers kann in
angegeben werden. Zugriff auf die RegisterDer 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-ZugriffDer 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-ZugriffAuch 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 BitsNehmen 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. Im avr-gcc Compiler erreicht man dies durch folgenden Quellcode:
Löschen eines BitsNehmen 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. Im avr-gcc Compiler kann man dies durch folgenden Quellcode erreichen:
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:
|