Forum: Mikrocontroller und Digitale Elektronik Taktfrequenz umstellen


von Owen S. (senmeis)


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
von ozo (Gast)


Lesenswert?

Mir dünkt der obige Code entspricht nicht den Zitaten aus dem 
Datenblatt.
CLKPS und CLKPR?
von eisace (Gast)


Lesenswert?

Hallo Owen,

nicht vergessen cli() und sei() zu benutzen damit Dir kein Interrupt 
dazwischen funkt.

Du kannst ja Dir mal den Assemblerlisting angucken ob es länger dauert 
als 4 Zyklen.

MfG

eisace
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.