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
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
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
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.