CLKPR

Z MAM wiki

Přejít na: navigace, hledání

Registr CLKPR (CLocK PRescaler) určuje, jakou hodnotou bude dělen kmitočet RC oscilátoru (či krystalu). Teprve takto vydělený kmitočet řídí rychlost výpočtů. Základní nastavení je dělení osmi, takže při základním 8MHz kmitočtu RC oscilátoru jsou instrukce vykonávány s taktem 1MHz. (U některých procesorů lze kmitočet dokonce i násobit pomocí PLL.)

Počáteční hodnota CLKPR záleží na konfiguračním bitu (fuse) CKDIV8 - lze zvolit hodnoty 1 či 8.

Do CLKPR může také zapisovat sám program a zrychlovat či zpomalovat svůj běh. Osminásobné zrychlení lze zkusmo provést touto dvojicí instrukcí (platí pro ATmega168, pro ATtiny45 a nejspíš i pro jiné procesory):

CLKPR=0x80;
CLKPR=0x00;

Druhý zápis je ale třeba provést do čtyř hodinových cyklů po prvním, takže pro spolehlivou funkci je nutno tuto sekvenci napsat v assembleru a před jejím prováděním zakázat přerušení.

Funkce, které nám v jazyce C teď náhodou fungují, ale při troše smůly by v budoucnu nemusely (protože je novější překladač třeba přeloží jinak), můžeme prostě "zakonzervovat" tak, že si je necháme přeložit do assembleru (gcc -S) a po kontrole si tuto verzi uschováme. Dobrý překlad funkce set_8x_speed() je třeba tento:

.global	set_8x_speed
	.type	set_8x_speed, @function
set_8x_speed:
	ldi r30,lo8(CLKPR)
	ldi r31,hi8(CLKPR)
	ldi r24,0x80
	st Z,r24
	st Z,__zero_reg__
	ret
	.size	set_8x_speed, .-set_8x_speed

Podobné fragmenty prostě shromáždíme v soubory s příponou .S a přeložíme je překladačem gcc spolu se zbytkem programu v C. Začátek souboru typu .S by mohl vypadat takto:

#include <avr/io.h>
__zero_reg__ = 1
	.section .text


CLKPR může mít u ATtiny45 v nejnižších čtyřech bitech hodnoty 0000, 0001, ... 0111, 1000 a je tím nastaveno dělení číslem 1, 2, ... 128, 256.

Osobní nástroje