Hi,
ich nutze IAR zur Entwicklung des AVR. Um mit genaueren UART-Baudraten
(z. B. 9600) arbeiten zu können, muß die Frequenz häufig von 1MHz auf
2MHz umgestellt werden. Deswegen wird folgende Funktion erstellt:
1 | void clock_init(unsigned char clock)
|
2 | {
|
3 | if (clock == 1)
|
4 | {
|
5 | CLKPR = (1<<CLKPCE); // set Clock Prescaler Change Enable
|
6 |
|
7 | // set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
|
8 | CLKPR = (1<<CLKPS1) | (1<<CLKPS0);
|
9 | }
|
10 | else if (clock == 2)
|
11 | {
|
12 | CLKPR = (1<<CLKPCE); // set Clock Prescaler Change Enable
|
13 |
|
14 | // set prescaler = 8, Inter RC 8Mhz / 4 = 2Mhz
|
15 | CLKPR = (1<<CLKPS1);
|
16 | }
|
17 | else if (clock == 4)
|
18 | {
|
19 | CLKPR = (1<<CLKPCE); // set Clock Prescaler Change Enable
|
20 |
|
21 | // set prescaler = 8, Inter RC 8Mhz / 2 = 4Mhz
|
22 | CLKPR = (1<<CLKPS0);
|
23 | }
|
24 | }
|
Das Problem its nur, manchmal funktioniert diese Umstellung nicht. Hat
jemand gleiche Erfahrungen gehabt?
Ich weiss nicht, ob es sinnvoller ist, diese Routine im Assembler
umzuschreiben.
Zitat aus dem Handbuch vom AVR:
1. Write the Clock Prescaler Change Enable (CLKPCE) bit to one and all
other bits in
CLKPR to zero.
2. Within four cycles, write the desired value to CLKPS while writing a
zero to CLKPCE.
Gruss
Owen