The clock switching is performed by a sequence of commands. First, the user (code) must
make sure that the new clock source is operating. Then the ‘Clock Source Switching’ com-
mand can be issued. Once this command has been successfully completed using the
‘Recover System Clock Source’ command, the user (code) may stop the previous clock
source. It is strongly recommended to run this sequence only once the interrupts have been
disabled. The user (code) is responsible for the correct implementation of the clock switching
sequence.
Here is a “light” C-code that describes such a sequence of commands.
C Code Example
void ClockSwiching (unsigned char clk_number, unsigned char sut) {
#define CLOCK_RECOVER
#define CLOCK_ENABLE
#define CLOCK_SWITCH
#define CLOCK_DISABLE
0x05
0x02
0x04
0x01
unsigned char previous_clk, temp;
// Disable interrupts
temp = SREG; asm ("cli");
// Save the current system clock source
CLKCSR = 1 << CLKCCE;
CLKCSR = CLOCK_RECOVER;
previous_clk = CLKSELR & 0x0F;
// Enable the new clock source
CLKSELR = ((sut << 4 ) & 0x30) | (clk_number & 0x0F);
CLKCSR = 1 << CLKCCE;
CLKCSR = CLOCK_ENABLE;
// Wait for clock validity
while ((CLKCSR & (1 << CLKRDY)) == 0);
// Switch clock source
CLKCSR = 1 << CLKCCE;
CLKCSR = CLOCK_SWITCH;
// Wait for effective switching
while (1){
CLKCSR = 1 << CLKCCE;
CLKCSR = CLOCK_RECOVER;
if ((CLKSELR & 0x0F) == (clk_number & 0x0F)) break;
}
// Shut down unneeded clock source
if (previous_clk != (clk_number & 0x0F)) {
CLKSELR = previous_clk;
CLKCSR = 1 << CLKCCE;
CLKCSR = CLOCK_DISABLE;
}
// Re-enable interrupts
SREG = temp;
}
Warning:
In the Atmel® ATtiny87/167, only one among the three external clock sources can be enabled
at a given time. Moreover, the enables of the external clock and of the external low-frequency
oscillator are shared with the asynchronous timer.
58 Atmel ATA6616/ATA6617
9132D–AUTO–12/10