Protože systémy na Atxmega jsou velice rozmanité, nebude v mých silách popsat vyčerpávající návod každého z nich. Plovičaté řešení by ale také nebylo to pravé ořechové. Koncepce návodů tedy bude vypadat formou komentovaných příkladů. Nejprve ve stručnosti shrnu některé z možností Xmegy a pak předložím vzorové příklady u kterých se pokusím okomentovat postup jak pracují.
Clock managment (správa taktovacího signálu) je na procesorech Atxmega výrazně komplexnější než na AVR. Svým způsobem je ale jednodušší. Protože vešekerá konfigurace clocku probíhá ryze softwarově nehrozí vám "zaseknutí" procesoru nevhodnou volbou fuses. S fuses totiž u Xmegy běžně nepřijdete do styku. Krom toho je použití velice podobné i různým ARMům, takže zkušenosti s clockem na Xmegách nepřijdou vniveč ani těm, kteří v budoucnu přejdou na platformu ARM. V čipu máte k dispozici několik interních oscilátorů.
K tomuto výběru přibude několik dalších možností externích clocků.
To samo o sobě je docela pěkný výběr. Ale tím to ještě zdaleka nakončí. Navíc máte v čipu PLL násobičku frekvence s rozsahem 20-128MHz. A kromě toho mají interní RC osciátory (2MHz a 32MHz) možnost tzv. "run-time" kalibrace.Schéma clocku je přehledně zakresleno v datasheetu. Kopii schématu můžete vidět na obrázku a1. Kromě signálu pro Watchdog, USB a brown-out detektor je clock veden skrze děličku (System Clock Prescaler), který vám umožňuje signál dle potřeby dělit. Smysl děličky je stejný jako u některých členů rodiny AVR. Můžete si díky ní připravit relativně širokou paletu frekvencí tak aby hráli do karet vaší aplikaci. Krom toho můžete chytrým snižováním clocku dynamicky měnit odběr čipu. Když nemá čip nic náročného na práci, můžete mu clock snížit. V okamžiku kdy potřebujete výpočetní výkon tak clock zase zvýšíte. Předdělička má celkem tři stupně A,B a C (viz obrázek a2). Na první pohled se vám to může zdát zbytečné. Přirozeně to zbytečné není :D V Atmelu jsou totiž minimálně dvě periférie, které si zaslouží pracovat s vyšším taktem než jádro (které smí běžet maximálně na 32MHz). První z nich jsou časovače, přesněji řečeno jejich Hi-Res modul. Ten smí pracovat až na 128MHz a vyšší frekvence mu umožňuje jemnější PWM regulaci při zachování relativně vysoké opakovací frekvence. Druhou periferií je EBI - tedy modul umožňující připojení externích pamětí. Ten může také pracovat s vyšší frekvencí než jádro aby komunikace s externí RAM zbytečně nezdržovala. EBI využívá CLKPer2 a časovače CLKper4. Jaké jsou povolené dělící poměry děliček vidíte také na obrázku a2. Výstupy z předděličky CLKcpu a CLKper jsou to nejdůležitější, tedy clock pro jádro a pro všechny periferie (USART,DAC,TWI ...).
Pokud ve vaší alikaci nepotřebujete nijak přesnou hodnotu clocku a nevadí vám že se s teplotou může docela měnit (desetiny až jednotky %) a vystačíte si s 32MHz (tedy nevyužíváte CLKper4 nebo CLKper2), je interní 32MHz RC oscilátor jasná volba. Ke svému chodu nepotřebuje žádné externí komponenty. Čip po startu běží na interní 2MHz oscilátor a 32MHz oscilátor je vypnutý. Nejprve ho tedy musíte zapnout. To nějákou dobu trvá, takže si musíte počkat na nastavení vlajky RC32MRDY, která signalizuje, že oscilátor běží. Poté už stačí přepnout zdroj clocku. Jeho přepnutí se provádí v registru CLK.CTRL. Ten je chráněn proti náhodnému přepsání, takže pro jeho změnu musíte nejprve zapsat kód do registru CCP a bezprostředně potom smíte obsah CLK.CTRL změnit. A to je vlastně vše :) Následuje zdrojový kód ukázky. Několik řádků je zakomentovaných a slouží jen jako "možnosti". Odkomentováním posledního řádku vypnete interní 2MHz oscilátor (vyplatí se v případě že spoříte energii), jinak se jím nemusíte zabývat. První dva zakomentované řádky v ukázce slouží k přenastavení děličky (jejíž změna je také chráněna proti náhodnému přepsání).
// internal 32MHz RC oscillator void clock_init(void){ //CCP=CCP_IOREG_gc; // unlock writing to CLK.PSCTRL (option) //CLK.PSCTRL = CLK_PSADIV_2_gc; // Set up prescalers (option) // after reset all prescalers are /1 OSC.CTRL |=OSC_RC32MEN_bm; // enable internal 32MHZ oscillator while (!(OSC.STATUS & OSC_RC32MRDY_bm)){}; // wait until 32MHz is on CCP=CCP_IOREG_gc; // unlock writing to CLK_CTRL CLK.CTRL = CLK_SCLKSEL_RC32M_gc; // select 32MHz as system clock //OSC.CTRL &=~(OSC_RC2MEN_bm); // disable unused 2MHz oscillator (option) }
Představte si situaci, kdy potřebujete připravit nějákou specifickou hodnotu frekvence. Dejme tomu, že chcete clock 30MHz. Nelpíte-li na přesnosti můžete si opět vystačit s vybavením uvnitř čipu. Můžete využít interní 2MHz oscilátor jako zdroj pro PLL a pomocí PLL si frekvenci vynásobit.