Taktfrequenz umstellen

OP #2484612
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren