Forum: Mikrocontroller und Digitale Elektronik XMega Clock Problem


von TSE (Gast)


Lesenswert?

Hallo,

folgender Code läuft auf einem Xmega64A1 auf einem anderen Board ohne 
Probleme. Anderes Board aber ähnlicher Oscillator Aufbau geht dieser 
code jedoch nicht:
1
void Clock_init(void)
2
{
3
  //Config Crystal
4
  OSC.XOSCCTRL=OSC_FRQRANGE_12TO16_gc;
5
  OSC.XOSCCTRL |=OSC_XOSCSEL_XTAL_16KCLK_gc;
6
  //Start Crystal
7
  OSC.CTRL = OSC_XOSCEN_bm;
8
  while((OSC.STATUS & OSC_XOSCRDY_bm) == 0);
9
  
10
  //Config PLL
11
  OSC.PLLCTRL=OSC_PLLSRC_XOSC_gc;
12
  OSC.PLLCTRL|=0x02;
13
  
14
  //Start PLL
15
  OSC.CTRL|=OSC_PLLEN_bm;
16
  while((OSC.STATUS & OSC_PLLRDY_bm) == 0);
17
18
  //Select PLL as Source
19
  _delay_ms(10);
20
  CCP = CCP_IOREG_gc;
21
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;
22
}

Zwar wird das CCP Bit gesetzt jedoch nicht die CLK Source geändert. Ich 
habe das Problem auf die letzten beide Zeilen eingrenzen können.
Setzte ich einen Breakpoint, steppe per Hand durch, und setzte den CLK 
Source  per Hand nach setzten des CCP Bits übernimmt er es.

Ich hoffe ihr könnt mir weiterhelfen.

Gruß
TSE

von Hans W. (hans_w30)


Lesenswert?

Hy,
Also ich benutze fast den gleichen Code.
Sicher das du beim compilieren auf deinen Controller umgestellt hast? Da 
macht er ansonsten Probleme mit der Clock einstellung.

Das ist mein Code.
1
OSC.XOSCCTRL|=  OSC_XOSCSEL_XTAL_16KCLK_gc| OSC_FRQRANGE_12TO16_gc ;
2
OSC.PLLCTRL= OSC_PLLSRC_XOSC_gc | (1<<OSC_PLLFAC1_bp);  // PLL auf externen Osc einstellen & *2
3
    
4
OSC.CTRL |= OSC_PLLEN_bm | OSC_XOSCEN_bm;// PLL & externen OSC enable
5
    
6
while(!(OSC.STATUS & OSC_PLLRDY_bm));
7
8
CCP = CCP_IOREG_gc; //IOProtect
9
CLK.CTRL |= CLK_SCLKSEL_PLL_gc; // PLL als Clock auswählen

Gruß Hans

von TSE (Gast)


Lesenswert?

Hallo Hans,

dein code zeigt den gleichen Fehler.

hab gerade etwas rumgespielt:

Wenn man erst per Hand das Bit für CLK_source setzt dann kann man es mit 
0x00 überschreiben. Will man jedoch was anderes schreiben ändert sich 
das von Hand gesetzte Bit nicht.

Gruß
TSE

von TSE (Gast)


Lesenswert?

Hallo,

Fehler gefunden!

Ich hatte die Optimierung ausgeschalten (-00).
Nach aktivierung auf (-0s) läuft alles wie's soll.

Danke an Alle

Gruß
TSE

von stiller Beobachter (Gast)


Lesenswert?

Der Grund kann es ja nicht sein.
Viel wichtiger wäre doch was wirklich passiert wenn die Optimierung den 
Clock beeinflusst.

Vielleicht ist ja das _delay_ms davon abhängig?

von Ansgar K. (paulderbademeister)


Lesenswert?

1
  CCP = CCP_IOREG_gc;
2
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;

Ohne Optimierung kann es passieren, dass CLK.CTRL nicht innerhalb von 4 
Zyklen geschrieben wird. CCP wird dann zurückgesetzt und es passiert 
nichts.

von stiller Beobachter (Gast)


Lesenswert?

Ansgar K. schrieb:
> nicht innerhalb von 4 Zyklen...

Danke für den Hinweis.
Klingt gewollt, hast Du das irgendwo gelesen?

von TSE (Gast)


Lesenswert?

Das delay kommt noch von der Fehlersuche. habs vergessen zu löschen 
ändert jedoch nichts.

Das ein nichtoptimierter code fürs ausführen einer bitmanipulation soo 
lange braucht hab ich nicht drann gedacht.

mal den assembler code ansehen.

@stiller beobachter

steht im Xmega A datasheet unter 3.12.1

von TSE (Gast)


Lesenswert?

Hallo,

einmal mit optimierung:

  CCP = CCP_IOREG_gc;
0000013D  LDI R24,0xD8    Load immediate
0000013E  OUT 0x34,R24    Out to I/O location
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;
0000013F  LDI R24,0x04    Load immediate
00000140  STS 0x0040,R24    Store direct to data space


einmal ohne:


  CCP = CCP_IOREG_gc;
00000190  LDI R24,0x34    Load immediate
00000191  LDI R25,0x00    Load immediate
00000192  LDI R18,0xD8    Load immediate
00000193  MOVW R30,R24    Copy register pair
00000194  STD Z+0,R18    Store indirect with displacement
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;
00000195  LDI R24,0x40    Load immediate
00000196  LDI R25,0x00    Load immediate
00000197  LDI R18,0x04    Load immediate
00000198  MOVW R30,R24    Copy register pair
00000199  STD Z+0,R18    Store indirect with displacement

Der STD befehlt kommt erst nach 5 Zyklen

von stiller Beobachter (Gast)


Lesenswert?

Tja, Compiler haben's manchmal nicht einfach.
Sie möchten auch mal ein Lob für gutes Optimieren.

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.