XMega Clock Problem

Gast #2207498
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
#2207511
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
Gast #2207539
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
Gast #2207805
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
Gast #2207829
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

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