beautypg.com

Atmega162/v – Rainbow Electronics ATmega162V User Manual

Page 109

background image

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

(1)

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

(1)

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;

}