Die Atmega*U besitzen zusätzlich zu den gewohnten Taktquellen eine PLL. Diese rastet in die gewählte Taktfrequenz ein und dient dazu, die 48MHz für den USB-Takt zu erzeugen.
Laut Datenblatt wird der Chip mit mit aktiviertem internen RC-Oszillator ausgeliefert. Da aber auch bereits ein Bootloader für USB auf den Chips mitgeliefert wird schaltet dieser praktischerweise die Taktquelle auf den externen Quartz um. Das bedeutet, dass der Atmega*U2 nicht zuverlässig (bzw. gar nicht) ohne 8MHz bzw. 16MHz Oszillator anläuft.
Wie oben schon geschrieben „schaltet der Bootloader die Taktquelle um“. Wie funktioniert das denn jetzt? Das ist definitiv neu im Vergleich zu den standard-Atmegas. Prinzipiell ist diese Neuerung essentiell und hat einige gute Gründe:
Folgende Register stehen zur Verfügung:
Name | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
CLKSEL0 | RCSUT1 | RCSUT0 | EXSUT1 | EXSUT0 | RCE | EXTE | - | CLKS |
CLKSEL1 | RCCKSE L3 | RCCKSE L2 | RCCKSE L1 | RCCKSE L0 | EXCKSE L3 | EXCKSE L2 | EXCKSE L1 | EXCKSE L0 |
CLKSTA | - | - | - | - | - | - | RCON | EXTON |
OSCCAL | CAL7 | CAL6 | CAL5 | CAL4 | CAL3 | CAL2 | CAL1 | CAL0 |
CLKPR | CLKPCE | - | - | - | CLKPS3 | CLKPS2 | CLKPS1 | CLKPS0 |
PLLCSR | - | - | - | DIV5 | DIV3 | PINDIV | PLLE | PLOCK |
Unabhängig von den Fuses kann man jetzt zwischen den Taktquellen umschalten. Man hat folgende Quellen zur Auswahl
Für das Umschalten ist Bit0 im CLKSEL0 Register zuständig, 0 wählt den internen RC Oszillator, 1 wählt die externe Taktquelle:
CLKSEL0 |= (1<<CLKS); // Diese Zeile wählt die externe Taktquelle
CLKSEL0 &= ~(1<<CLKS); // Diese Zeile wählt den internen RC-Oszillator
Sollte diese Taktquelle aber gerade schlafen/deaktiviert sein hat man ein Problem. Man sollte also vorher sicherstellen, dass die Taktquelle auch eingeschalten ist:
CLKSEL0 |= (1<<RCE); // Diese Zeile schaltet den RC Oszillator ein
CLKSEL0 |= (1<<EXTE); // Diese Zeile schaltet die externe Taktquelle ein
CLKSEL0 |= (1<<EXTE) | (1<<CLKS); // Diese Zeile schaltet die externe Taktquelle in und wählt sie als CPU-Takt