
115
8272E–AVR–04/2013
ATmega164A/PA/324A/PA/644A/PA/1284/P
The following code examples show how to do an atomic read of the TCNTn Register contents.
Reading any of the OCRnA/B/C or ICRn Registers can be done by using the same principle.
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.
Assembly Code Example
TIM16_ReadTCNT
n:
; Save global interrupt flag
in
r18,SREG
; Disable interrupts
cli
; Read TCNT
n into r17:r16
in
r16,TCNT
nL
in
r17,TCNT
nH
; Restore global interrupt flag
out
SREG,r18
ret
C Code Example
unsigned int
TIM16_ReadTCNT
n( void )
{
unsigned char
sreg;
unsigned int
i;
/* Save global interrupt flag */
sreg = SREG;
/* Disable interrupts */
_CLI();
/* Read TCNT
n into i */
i = TCNT
n;
/* Restore global interrupt flag */
SREG = sreg;
return
i;
}