beautypg.com

10 accessing 10-bit registers – Rainbow Electronics ATtiny861_V User Manual

Page 110

background image

110

2588B–AVR–11/06

ATtiny261/461/861

16.10 Accessing 10-Bit Registers

If 10-bit values are written to the TCNT1 and OCR1A/B/C/D registers, the 10-bit registers can be
byte accessed by the AVR CPU via the 8-bit data bus using two read or write operations. The
10-bit registers have a common 2-bit Timer/Counter1 High Byte Register (TC1H) that is used for
temporary storing of the two MSBs of the 10-bit access. The same TC1H register is shared
between all 10-bit registers. Accessing the low byte triggers the 10-bit read or write operation.
When the low byte of a 10-bit register is written by the CPU, the high byte stored in the TC1H
register, and the low byte written are both copied into the 10-bit register in the same clock cycle.
When the low byte of a 10-bit register is read by the CPU, the high byte of the 10-bit register is
copied into the TC1H register in the same clock cycle as the low byte is read.

To do a 10-bit write, the high byte must be written to the TC1H register before the low byte is
written. For a 10-bit read, the low byte must be read before the high byte.

The following code examples show how to access the 10-bit timer registers assuming that no
interrupts updates the TC1H register. The same principle can be used directly for accessing the
OCR1A/B/C/D registers.

Note:

1. The example code assumes that the part specific header file is included.

For I/O registers located in extended I/O map, “IN”, “OUT”, “SBIS”, “SBIC”, “CBI”, and “SBI”
instructions must be replaced with instructions that allow access to extended I/O. Typically
“LDS” and “STS” combined with “SBRS”, “SBRC”, “SBR”, and “CBR”.

The assembly code example returns the TCNT1 value in the r17:r16 register pair.

Assembly Code Example

...

; Set TCNT

1 to 0x01FF

ldi

r17,0x01

ldi

r16,0xFF

out

TC

1H,r17

out

TCNT

1,r16

; Read TCNT

1 into r17:r16

in

r16,TCNT

1

in

r17,TC

1H

...

C Code Example

unsigned int

i;

...

/* Set TCNT1 to 0x01FF */

TC1H = 0x01;

TCNT1 = 0xFF;

/* Read TCNT1 into i */

i = TCNT1;

i |= ((unsigned int)TC1H << 8);

...