
72
8127B–AVR–08/09
Note: See “Code Examples” on page 5.
The code example returns the TCNT0 value in the r17:r16 register pair.
It is important to notice that accessing 16-bit registers are atomic operations. If an interrupt
occurs between the two instructions accessing the 16-bit register, and the interrupt code
updates the temporary register by accessing the same or any other of the 16-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 temporary register, the main code must disable the
interrupts during the 16-bit access.
The following code example shows how to do an atomic read of the TCNT0 Register contents.
Reading any of the OCR0A/B or ICR0 Registers can be done by using the same principle.
Note: See “Code Examples” on page 5.
The code example returns the TCNT0 value in the r17:r16 register pair.
The following code example shows how to do an atomic write of the TCNT0 Register contents.
Writing any of the OCR0A/B or ICR0 Registers can be done by using the same principle.
Assembly Code Example
...
; Set TCNT0 to 0x01FF
r17,0x01
r16,0xFF
TCNT0H,r17
TCNT0L,r16
; Read TCNT0 into r17:r16
r16,TCNT0L
r17,TCNT0H
...
Assembly Code Example
TIM16_ReadTCNT0:
; Save global interrupt flag
r18,SREG
; Disable interrupts
cli
; Read TCNT0 into r17:r16
in r16,TCNT0L
in r17,TCNT0H
; Restore global interrupt flag
out SREG,r18
ret
Kommentare zu diesen Handbüchern