Datasheet

161
ATmega16U4/32U4 [DATASHEET]
Atmel-7766J-USB-ATmega16U4/32U4-Datasheet_04/2016
The following code examples show how to access the 10-bit timer registers assuming that no interrupts updates
the TC4H register. The same principle can be used directly for accessing the OCRnA/B/C/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 TCNTn value in the r17:r16 register pair.
It is important to notice that accessing 10-bit registers are atomic operations. If an interrupt occurs between the
two instructions accessing the 10-bit register, and the interrupt code updates the TC4H register by accessing
the same or any other of the 10-bit timer registers, then the result of the access outside the interrupt will be
corrupted. Therefore, when both the main code and the interrupt code update the TC4H register, the main code
must disable the interrupts during the 16-bit access.
Assembly Code Example
...
; Set TCNTn to 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCnH,r17
out TCNTn,r16
; Read TCNTn into r17:r16
in r16,TCNTn
in r17,TCnH
...
C Code Example
unsigned int i;
...
/* Set TCNTn to 0x01FF */
TCnH = 0x01;
TCNTn = 0xFF;
/* Read TCNTn into i */
i = TCNTn;
i |= ((unsigned int)TCnH << 8);
...