Forum: Mikrocontroller und Digitale Elektronik XMega Clksystem


von Helmut R (Gast)


Lesenswert?

Hallo Forum,

ich benutze einen AtXMega128A1 Rev.H mit GCC 4.3.2 und Studio 4.17.666
Seit gestern versuche ich, nicht den internen 2MHz oder 32MHz RC Osc zu 
verwenden, sondern einen externen 16Mhz Oszillator. Ich brauche für 
Frequenzmessungen einen genaueren Takt als 32Mhz +/- 1% bei 25°C; also 
eher ppm durch Quarz oder Oszillator.... Angeschlossen ist der 
Oszillator richtig und ich sehe 16 MHz mit dem Oszi. Hat jemand bisschen 
Code zur Initialisierung der PLL (Faktor 2 oder 4 o.ä.) um aus den 16 
MHz ext. einen 32Mhz Systemtakt zu zaubern? Alle Versuche (z.B. Appnote 
1003 Clksystem, Beispiel 5 (adaptiert)) schlagen fehl - der XMega muckt 
sich erst mal nicht mehr. Die Appnotes kenne ich und ein Oszi habe ich 
neben mir.

Hier der Code:
1
#ifdef CLK_EXT // 16 MHz external Osc
2
CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 4); // Factor 4: 4x 16 MHz = 64MHz
3
CLKSYS_Enable( OSC_PLLEN_bm );
4
CLKSYS_Prescalers_Config( CLK_PSADIV_2_gc, CLK_PSBCDIV_1_1_gc );
5
do 
6
{
7
  ulTimeOut--;
8
} while (( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0) && ulTimeOut);
9
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );  
10
#endif

Danke,

Gruß
Helmut

von Mikes (Gast)


Lesenswert?

1
//************************************************
2
//OSC
3
   //OSC XOSCCTRL      XOSC Controll Register
4
     //Frequence Range
5
      #define    _04TO2   0x00    //100pF
6
      #define    _2TO9    0x40    //15pF
7
      #define    _9TO12   0x80    //15pF
8
      #define    _12TO16  0xC0    //10pF
9
     //+ Clock source
10
      #define   EXTCLK      0x00  //Oscillator
11
      #define   TOSC_32KHz  0x02  //Quarz
12
      #define   XTAL_256CL  0x03  //Quarz
13
      #define   XTAL_1KCL   0x07  //Quarz
14
      #define   XTAL_16KCL  0x0B  //Quarz
15
16
   //OSC PLLCTRL
17
     //PLL source
18
      #define PLLSRC_2MHz_internal    0x00   //(0<<6)
19
      #define PLLSRC_32MHz_internal   0x80   //(2<<6)
20
      #define PLLSRC_external         0xc0   //(3<<6)
21
     //+ Factor
22
23
//************************************************
24
//CLK
25
   //CLK CTRL
26
     #define CLK_RC2MEN_bm   0x00
27
     #define CLK_RC32MEN_bm  0x01
28
     #define CLK_RC32KEN_bm  0x02
29
     #define CLK_XOSCEN_bm   0x03
30
     #define CLK_PLLEN_bm    0x04
31
32
// Initialisierung des CPU Taktes
33
unsigned char init_OSC(unsigned char *buff){
34
    unsigned int ctr=0;
35
36
    sprintf(buff,"XOSCCTRL:%2x",OSC.STATUS);
37
    send_to_sniffer(buff);
38
39
    OSC.XOSCCTRL = _2TO9|XTAL_16KCL;            //externer 2-9MHz    16clk bis Anlauf
40
    OSC.CTRL     = OSC_XOSCEN_bm;               //externer_Osc enable
41
    while(!(OSC.STATUS & OSC_XOSCRDY_bm)){      //wait for stabilizing externer Osc
42
        ctr--;
43
        delay_ms(1);
44
        if(!ctr)     return 0;                  // 0=error
45
    }
46
47
    OSC.PLLCTRL  = PLLSRC_external | 4;         //PLL source  /  Faktor
48
    OSC.CTRL    |= OSC_PLLEN_bm;                //PLL enable
49
     while(!(OSC.STATUS & OSC_PLLRDY_bm)){      //wait for stabilizing
50
        ctr--;
51
        delay_ms(1);
52
        if(!ctr)     return 0;  // 0=error
53
    }
54
55
    //CCP_IO();
56
    //OSC.XOSCFAIL = OSC_XOSCFDEN_bm;           //enable error/ISR handling if a fail occur
57
58
    CCP_IO();
59
    CLK.CTRL = CLK_PLLEN_bm;            // PLL
60
    //CLK.CTRL = CLK_XOSCEN_bm;           // extern OSC
61
    //CLK.CTRL = CLK_RC32KEN_bm;          // 32kHz
62
    //CLK.CTRL = CLK_RC32MEN_bm;          // 32MHz
63
    //CLK.CTRL = CLK_RC2MEN_bm;           // 2MHz
64
65
    return 1;  // 1=ok
66
}

von Ssssss (Gast)


Lesenswert?

bittesehr:
1
  //select external 16MHz oscillator as clock source (with 256 clks startup time)
2
  OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_256CLK_gc;
3
4
  //enable XOSC & PLL
5
  OSC.CTRL |= OSC_XOSCEN_bm;
6
7
  //wait for osc to become ready
8
  while( (OSC.STATUS & OSC_XOSCRDY_bm) == 0){
9
    //PORTF.OUTTGL = (1<<6);
10
    PORTK.OUTTGL = (1<<0); //toggle led   //toggle led  
11
  }
12
13
  //set PLL source to XOSC & factor to x2
14
        OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (2 << OSC_PLLFAC_gp);
15
  
16
  //set up prescalers (=1)
17
  #define PSCTRL_PRESCALER_SET (CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc)
18
  hwcontrol_ccpwrite(&CLK.PSCTRL, PSCTRL_PRESCALER_SET);
19
  CLK.PSCTRL = PSCTRL_PRESCALER_SET;
20
21
  //enable pll
22
  OSC.CTRL |= OSC_PLLEN_bm;
23
  
24
25
  //wait for pll to become ready
26
  while( (OSC.STATUS & OSC_PLLRDY_bm) == 0){
27
    //nop
28
  } 
29
30
  //select PLL as clock source (2x16mhz)
31
  hwcontrol_ccpwrite(&CLK.CTRL, CLK_SCLKSEL_PLL_gc);
32
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;

Gruss,
Simon

von Helmut R (Gast)


Lesenswert?

Vielen Dank Euch beiden für den Code!
Inzwischen hat auch Atmel reagiert und mir ebenfalls eine 
Initialisierung geschickt.
NUR: ich habe den starken Eindruck, dass der Chip immer noch auf dem 
internen Oszillator steht. Dazu teste ich mit Kältespray, das nur auf 
den XMega geht, ob der Chip 'wegläuft'. Dem ist leider so. die 
Frequenzmessung geht um 0,4 kHz daneben. Ich achte sehr darauf, dass 
sich der ext. Oszillator in der Temperatur nicht ändert.
Das was ich noch prüfen muss (mache ich alles ohne JTAG ICE):
* wo der XMega stehenbleibt. (ohne ctr-- bleibt er sonst in der Schleife 
hängen.)
* ob das daran liegt, dass der Code aus dem Bootloader gestartet ist 
(Stichwort CCP) Nächster Test: Code aus dem AppFlash ausführen.
Am Mo. komme ich hoffentlich dazu. Ich werde meine Ergebnisse dann 
posten.

Gruß
Helmut

von Helmut R. (heru01)


Lesenswert?

Hallo Mikes, hallo Sssssss,


ich habe nun mehrfach getestet und komme immer wieder zu dem Punkt: der 
Chip schaltet mir nicht auf den externen Oszillator. Benutzt: 
ATxMega128A1 Rev H in BGA Gehäuse. Ext Osc ist angeschlossen - ist mit 
dem Oszu meßbar.
Hier der Code von Atmel:
1
CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc,
2
                   false,
3
                   OSC_XOSCSEL_XTAL_16CLK_gc );
4
CLKSYS_Enable( OSC_XOSCEN_bm );
5
do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
6
7
// Configure the PLL
8
CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 2); // -> PLL running at 32 MHz
9
10
CLKSYS_Enable(OSC_PLLEN_bm);
11
CLKSYS_Prescalers_Config( 0, CLK_PSBCDIV_1_1_gc );  // No prescaller division -> PLL running at 32 MHz
12
do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
13
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );
Resultat: tut(et) net...
Ich fange die Endlosschleifen ab und habe auch testweise ISR 
(OSC_XOSCF_vect) eingeschaltet, in die der Chip hüpft. (ist ein NMI, der 
bei Fail ext osc aktiv wird)
Kann jemand von Euch den Code mal in einen XMega zischen und eine 
Frequenzmessung mit Kältespray (auf den Chip) durchführen? Also egal was 
ich mache komme ich immer wieder auf das Resultat: ext Osc funktioniert 
nicht. (Piep, Hilfe!!)

Gruß
Helmut

von Gast (Gast)


Lesenswert?

Benutze besser die Funktion, CCP geht oft daneben, sobald man 
Optimierung verwendet:
1
uint8_t CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_t clockSource ) 
2
{
3
        uint8_t clkCtrl = ( CLK.CTRL & ~CLK_SCLKSEL_gm ) | clockSource;
4
5
        asm("ldi  r16,  0xD8");
6
   asm("out  0x34, r16");
7
        CLK.CTRL = 0x001;
8
   return clkCtrl;
9
}

von Helmut R. (heru01)


Lesenswert?

Hallo Forum,

jetzt bin ich den entscheidenden Schritt weiter:
(gestern waren wir noch am Abgrund...)

Die Initialisierungsroutine war/ist (fast) korrekt. Nur habe ich 
zusätzlich den / die internen Oszillatoren abgeschaltet. Resultat: es 
tut!!
Aber: NUR dann!
Code wie oben +
1
CLKSYS_Disable(OSC_RC2MEN_bm);    
2
CLKSYS_Disable(OSC_RC32MEN_bm);

Warum nur, warum??  Das konnte auch Atmel (bis jetzt) nicht beantworten.
Der Test: Frequenzgenrator als ext clock + Blinkled mit Timer ISR + 
Oszi.
Wenn ich jetzt die Frequenz am FG verstelle, sehe ich das am Oszi.
Andere Initialisierungen: keine Chance, er springt immer auf den 
internen 2Mhz RC Osz.
Verwendet AVR GCC 4.3.2 (WINAVR 2090313) mit allen untersch. 
Optimierungen auf XMega 128A1, BGA, Rev. H


Gruß
Helmut

von GG (Gast)


Lesenswert?

Sevus,

zum Thema Atxmega128a1 16 Mhz Quarz:

Ich habe Dir eine Datei angefügt. Der Code läuft bei mir astrein.

Gruß GG

von GG (Gast)


Lesenswert?

Servus nochmals,



Hier nochmals der Code als Text


 /******************************************************************
   * System Clock 32MHz (XOSC Quarz 16MHz, PLL Faktor 2)
   ******************************************************************/

  /* Nach dem Reset ist die Quelle des Systemtaktes der interne
     2MHz RC-Oszillator (System Clock Selection: RC2MHz)
  */

  // Oszillator XOSC konfigurieren (12..16MHz, 256 clocks startup time)
  CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc,
                      false,
                      OSC_XOSCSEL_XTAL_256CLK_gc );

  // Oszillator XOSC enable
  CLKSYS_Enable( OSC_XOSCEN_bm );

  // Warten bis der Oszillator bereit ist
  do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );

  // PLL source ist XOSC, Multiplikator x2
  CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 2 );

  // Enable PLL
  CLKSYS_Enable( OSC_PLLEN_bm );

  // Prescalers konfigurieren
  CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );

  // Warten bis PLL locked
  do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );

  // Main Clock Source ist Ausgang von PLL
  CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );

  // Nun ist der System Clock 32MHz !

  /* Hinweis:
     32kHz TOSC kann nicht in Verbindung mit PLL genutzt werden, da
     die minimale Eingangsfrequenz des PLLs 400kHz beträgt.
  */

von Steffen H. (Gast)


Lesenswert?

Hallo

Hab mal ne Frage zum PLL. Ich müsste den Xmega CPU-Takt bei ca 160MHz 
laufen lassen. Geht das wirklich über einen XTAL von 16MHz und einer mul 
der PLL von 10 ???

Also ich brauch einen Takt von 5,33MHz an einem Port-Pin. Den würd ich 
dann bei 160Mhz alle 15Takte toggeln. Was meint Ihr, ist das möglich?

Grüße Steffen

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Der XMega Core läuft mit maximal 40 getesteten Mhz, alles andere kannst 
Du vergessen. Das SRAM-Interface macht maximal 80Mhz, spezifiziert sind 
64. Die PLL selbst läuft bis 200 Mhz, macht aber nur mit 
nachgeschalteten Prescalern wieder Sinn.

Den 5.33Mhz Takt bekommst Du mit 10.66Mhz CPU-Clock und Timer auf 
Periode 0 hin, im output toggle modus.

von Steffen H. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Travel Rec.

Ich hab den XMega Core schon auf 48Mhz gehabt. Aber wie stabiel er dann 
noch läuft, kann ich noch nicht sagen, da ich nur einen Timer mit IRQ 
und gleichzeitig einen Ringzähler aus Registern laufen hatte. Jedenfalls 
hat den XMega dabei die 48Mhz nicht aus dem Tritt gebracht. Doch ich 
denk mal, dass ist alles ausserhalb seiner Specs.

Ich hab es jetzt anders gelöst. TimerD0 läuft im Single Slope PWM Mode 
und tongelt mir mit einem Durty -Cycle von 50% den PIN autark und löst 
sogar noch bei jeder Periode den Event-Channel 0 aus.

Mein Vorhaben:
Ich will mal versuchen ein Timing zur TFT-Ansteuerung zu bekommen. Das 
TFT was ich dazu benutzen werde ist ein HITACHI TX14D12VM1CAA. Das 
braucht komischerweise keine Timings für H-sync und V-sync. Hab mal das 
Datasheet mit im Anhang gepostet. Ich programmiere übrigens in ASM.
Mit dem Event-Channel 0 takte ich jetzt noch den TimerD1 der mir den 
DTMG-Takt zur Verfügung stellen soll. Doch irgendwie komm ich jetzt 
wieder mal nicht weiter, da ich das Timing des TFT nicht mehr verstehe. 
Ich verstehe z.B. nicht wie lange und wann DTMG auf High sein muss.

Vielleicht kann mir da jemand weiter helfen.

Steffen

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Steffen H. schrieb:
> Ich hab den XMega Core schon auf 48Mhz gehabt. Aber wie stabiel er dann
> noch läuft, kann ich noch nicht sagen, da ich nur einen Timer mit IRQ
> und gleichzeitig einen Ringzähler aus Registern laufen hatte. Jedenfalls
> hat den XMega dabei die 48Mhz nicht aus dem Tritt gebracht. Doch ich
> denk mal, dass ist alles ausserhalb seiner Specs.

Das hat bei mir nur mit den EvaluationSamples des XMegas funktioniert, 
die gingen über 50Mhz noch, bei den Serien-Revisionen G und H war bei 
etwa 44Mhz Schluß, Aussetzer und Neustart alle paar Sekunden. 40Mhz 
werden stabil durchgehalten, sämtliche Peripherie läuft einwandfrei. Bei 
meinem SD-Recorder nutze ich knapp über 36Mhz seit über einem Jahr ohne 
Probleme.

von Hagen R. (hagen)


Lesenswert?

>Den 5.33Mhz Takt bekommst Du mit 10.66Mhz CPU-Clock und Timer auf
>Periode 0 hin, im output toggle modus.

Oder gleich CPU Takt auf 5.33MHz setzen und an den Pins PC7,PD7,PE7 
ausgeben lassen.

Gruß Hagen

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.