Atmega162/v – Rainbow Electronics ATmega162V User Manual
Page 109

109
ATmega162/V
2513E–AVR–09/03
Therefore, when both the main code and the interrupt code update the temporary regis-
ter, the main code must disable the interrupts during the 16-bit access.
The following code examples show how to do an atomic read of the TCNTn Register
contents. Reading any of the OCRnA/B 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
n
L
in
r17,TCNT
n
H
; 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;
}