Titelbild Mikrocontroller

12.5. Zugriff auf die 16-bit Register

Das TCNT1, die OCR1A/B und das ICR1 Register sind 16-bit Register, auf die die CPU über den 8-bit Datenbus zugreift. Der Zugriff muss also in zwei Schreib- oder Lesebefehlen erfolgen. Daher hat der 16-bit Timer ein 8-bit Zwischenspeicher, in dem das High-Byte des 16-bit Zugriffes temporär zwischengespeichert wird. Dieses eine temporäre Register wird für alle 16-bit Register des Timers verwendet. Der Zugriff auf das Low-Byte triggert den 16-bit Lese- oder Schreibbefehl. Wenn das Low-Byte eines 16-bit Registers durch die CPU geschrieben wird, wird im gleichen Taktzyklus auch das High-Byte, das im temporären Register enthalten ist, in das 16-bit Register geschrieben. Wenn das Low-Byte eines 16-bit Registers gelesen wird, wird im gleichen Taktzyklus das High-Byte aus dem Register in den temporären Speicher kopiert.

Nicht alle 16-bit Zugriffe verwenden das temporäre Register für das High-Byte. Beim Lesen der OCR1A/B Register wird das temporäre Register nicht verwendet.

Bei einem 16-bit Schreibvorgang muss erst das High-Byte geschrieben werden bevor das Low-Byte geschrieben wird. Bei einem 16-bit Lesevorgang wird erst das Low-Byte gelesen, anschließend das High-Byte.

Das folgende Beispiel zeigt den Zugriff auf das 16-bit Timer Register, wobei unterstellt wird, dass ein zwischenzeitlicher Interrupt das temporäre Register nicht verändern kann. Das gleiche Prinzip kann auch beim Zugriff auf die OCR1A/B Register oder das ICR1 Register angewandt werden. Bei dem „C“ Beispiel handelt es sich um eine 16-bit Adresse.
Codebeispiel Zugriff auf das 16-bit Timer Register

Codebeispiel Zugriff auf das 16-bit Timer Register


Es ist wichtig zu beachten, dass die Zugriffe auf das Low- und High-Byte zwei zusammenhängende Befehle sind. Tritt während der beiden Befehle, mit denen auf das 16-bit Register zugegriffen wird, ein Interrupt auf, in dessen Bearbeitung ebenfalls auf eines der 16-bit Register zugegriffen wird, so wird der durch den Interrupt unterbrochene Zugriff fehlerhaft werden. Daher sollte in den Fällen, in denen das Hauptprogramm und eine Interruptroutine auf die 16-bit Register zugreifen, im Hauptprogramm die Interrupts vor dem Zugriff gesperrt werden.

Das nachfolgende Beispiel zeigt die beiden zusammenhängenden Befehle zum Auslesen des TCNT1 Registers. Das Auslesen der OCR1A/B und des ICR1 Registers kann nach dem gleichen Prinzip erfolgen.
Codebeispiel Auslesen des TCNT1 Registers

Codebeispiel Auslesen des TCNT1 Registers


Das Assembler Beispiel schreibt den Wert des TCNT1 in das Registerpaar R17:R16 zurück.
Das nachfolgende Beispiel zeigt die beiden zusammenhängenden Befehle zum Schreiben des TCNT1 Registers. Das Schreiben der OCR1A/B und des ICR1 Registers kann nach dem gleichen Prinzip erfolgen.
Codebeispiel Schreiben des TCNT1 Registers

Codebeispiel Schreiben des TCNT1 Registers


Das Assembler Beispiel unterstellt, dass im Registerpaar R17:R16 der Wert enthalten ist, der in das TCNT1 Register schrieben werden soll.

Wenn mehrere 16-bit Register nacheinander beschrieben werden sollen und das High-Byte in allen Fällen gleich ist, so muss das High-Byte nur einmal beschrieben werden.
« zurück:
12.4. Kompatibilität
» weiter:
12.6. Taktquellen
Impressum