If a write is performed to any of the five Timer/Counter2 Registers while its update busy
flag is set, the updated value might get corrupted and cause an unintentional interrupt to
occur.
The mechanisms for reading TCNT2, OCR2A, OCR2B, TCCR2A and TCCR2B are dif-
ferent. When reading TCNT2, the actual timer value is read. When reading OCR2A,
OCR2B, TCCR2A and TCCR2B the value in the temporary storage register is read.
Asynchronous Operation of
Timer/Counter2
When Timer/Counter2 operates asynchronously, some considerations must be taken.
•
Warning: When switching between asynchronous and synchronous clocking of
Timer/Counter2, the Timer Registers TCNT2, OCR2x, and TCCR2x might be
corrupted. A safe procedure for switching clock source is:
1. Disable the Timer/Counter2 interrupts by clearing OCIE2x and TOIE2.
2. Select clock source by setting AS2 as appropriate.
3. Write new values to TCNT2, OCR2x, and TCCR2x.
4. To switch to asynchronous operation: Wait for TCN2UB, OCR2xUB, and
TCR2xUB.
5. Clear the Timer/Counter2 Interrupt Flags.
6. Enable interrupts, if needed.
•
•
The CPU main clock frequency must be more than four times the Oscillator
frequency.
When writing to one of the registers TCNT2, OCR2x, or TCCR2x, the value is
transferred to a temporary register, and latched after two positive edges on TOSC1.
The user should not write a new value before the contents of the temporary register
have been transferred to its destination. Each of the five mentioned registers have
their individual temporary register, which means that e.g. writing to TCNT2 does not
disturb an OCR2x write in progress. To detect that a transfer to the destination
register has taken place, the Asynchronous Status Register – ASSR has been
implemented.
•
When entering Power-save or ADC Noise Reduction mode after having written to
TCNT2, OCR2x, or TCCR2x, the user must wait until the written register has been
updated if Timer/Counter2 is used to wake up the device. Otherwise, the MCU will
enter sleep mode before the changes are effective. This is particularly important if
any of the Output Compare2 interrupt is used to wake up the device, since the
Output Compare function is disabled during writing to OCR2x or TCNT2. If the write
cycle is not finished, and the MCU enters sleep mode before the corresponding
OCR2xUB bit returns to zero, the device will never receive a compare match
interrupt, and the MCU will not wake up.
•
If Timer/Counter2 is used to wake the device up from Power-save or ADC Noise
Reduction mode, precautions must be taken if the user wants to re-enter one of
these modes: The interrupt logic needs one TOSC1 cycle to be reset. If the time
between wake-up and re-entering sleep mode is less than one TOSC1 cycle, the
interrupt will not occur, and the device will fail to wake up. If the user is in doubt
whether the time before re-entering Power-save or ADC Noise Reduction mode is
sufficient, the following algorithm can be used to ensure that one TOSC1 cycle has
elapsed:
1. Write a value to TCCR2x, TCNT2, or OCR2x.
2. Wait until the corresponding Update Busy Flag in ASSR returns to zero.
3. Enter Power-save or ADC Noise Reduction mode.
190
ATmega640/1280/1281/2560/2561
2549A–AVR–03/05