mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMega Clksystem


Autor: Helmut R (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifdef CLK_EXT // 16 MHz external Osc
CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 4); // Factor 4: 4x 16 MHz = 64MHz
CLKSYS_Enable( OSC_PLLEN_bm );
CLKSYS_Prescalers_Config( CLK_PSADIV_2_gc, CLK_PSBCDIV_1_1_gc );
do 
{
  ulTimeOut--;
} while (( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0) && ulTimeOut);
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );  
#endif

Danke,

Gruß
Helmut

Autor: Mikes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//************************************************
//OSC
   //OSC XOSCCTRL      XOSC Controll Register
     //Frequence Range
      #define    _04TO2   0x00    //100pF
      #define    _2TO9    0x40    //15pF
      #define    _9TO12   0x80    //15pF
      #define    _12TO16  0xC0    //10pF
     //+ Clock source
      #define   EXTCLK      0x00  //Oscillator
      #define   TOSC_32KHz  0x02  //Quarz
      #define   XTAL_256CL  0x03  //Quarz
      #define   XTAL_1KCL   0x07  //Quarz
      #define   XTAL_16KCL  0x0B  //Quarz

   //OSC PLLCTRL
     //PLL source
      #define PLLSRC_2MHz_internal    0x00   //(0<<6)
      #define PLLSRC_32MHz_internal   0x80   //(2<<6)
      #define PLLSRC_external         0xc0   //(3<<6)
     //+ Factor

//************************************************
//CLK
   //CLK CTRL
     #define CLK_RC2MEN_bm   0x00
     #define CLK_RC32MEN_bm  0x01
     #define CLK_RC32KEN_bm  0x02
     #define CLK_XOSCEN_bm   0x03
     #define CLK_PLLEN_bm    0x04

// Initialisierung des CPU Taktes
unsigned char init_OSC(unsigned char *buff){
    unsigned int ctr=0;

    sprintf(buff,"XOSCCTRL:%2x",OSC.STATUS);
    send_to_sniffer(buff);

    OSC.XOSCCTRL = _2TO9|XTAL_16KCL;            //externer 2-9MHz    16clk bis Anlauf
    OSC.CTRL     = OSC_XOSCEN_bm;               //externer_Osc enable
    while(!(OSC.STATUS & OSC_XOSCRDY_bm)){      //wait for stabilizing externer Osc
        ctr--;
        delay_ms(1);
        if(!ctr)     return 0;                  // 0=error
    }

    OSC.PLLCTRL  = PLLSRC_external | 4;         //PLL source  /  Faktor
    OSC.CTRL    |= OSC_PLLEN_bm;                //PLL enable
     while(!(OSC.STATUS & OSC_PLLRDY_bm)){      //wait for stabilizing
        ctr--;
        delay_ms(1);
        if(!ctr)     return 0;  // 0=error
    }

    //CCP_IO();
    //OSC.XOSCFAIL = OSC_XOSCFDEN_bm;           //enable error/ISR handling if a fail occur

    CCP_IO();
    CLK.CTRL = CLK_PLLEN_bm;            // PLL
    //CLK.CTRL = CLK_XOSCEN_bm;           // extern OSC
    //CLK.CTRL = CLK_RC32KEN_bm;          // 32kHz
    //CLK.CTRL = CLK_RC32MEN_bm;          // 32MHz
    //CLK.CTRL = CLK_RC2MEN_bm;           // 2MHz

    return 1;  // 1=ok
}


Autor: Ssssss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bittesehr:
  //select external 16MHz oscillator as clock source (with 256 clks startup time)
  OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_256CLK_gc;

  //enable XOSC & PLL
  OSC.CTRL |= OSC_XOSCEN_bm;

  //wait for osc to become ready
  while( (OSC.STATUS & OSC_XOSCRDY_bm) == 0){
    //PORTF.OUTTGL = (1<<6);
    PORTK.OUTTGL = (1<<0); //toggle led   //toggle led  
  }

  //set PLL source to XOSC & factor to x2
        OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (2 << OSC_PLLFAC_gp);
  
  //set up prescalers (=1)
  #define PSCTRL_PRESCALER_SET (CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc)
  hwcontrol_ccpwrite(&CLK.PSCTRL, PSCTRL_PRESCALER_SET);
  CLK.PSCTRL = PSCTRL_PRESCALER_SET;

  //enable pll
  OSC.CTRL |= OSC_PLLEN_bm;
  

  //wait for pll to become ready
  while( (OSC.STATUS & OSC_PLLRDY_bm) == 0){
    //nop
  } 

  //select PLL as clock source (2x16mhz)
  hwcontrol_ccpwrite(&CLK.CTRL, CLK_SCLKSEL_PLL_gc);
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;

Gruss,
Simon

Autor: Helmut R (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut Ru (heru01)
Datum:

Bewertung
0 lesenswert
nicht 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:
CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc,
                   false,
                   OSC_XOSCSEL_XTAL_16CLK_gc );
CLKSYS_Enable( OSC_XOSCEN_bm );
do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );

// Configure the PLL
CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 2); // -> PLL running at 32 MHz

CLKSYS_Enable(OSC_PLLEN_bm);
CLKSYS_Prescalers_Config( 0, CLK_PSBCDIV_1_1_gc );  // No prescaller division -> PLL running at 32 MHz
do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benutze besser die Funktion, CCP geht oft daneben, sobald man 
Optimierung verwendet:
uint8_t CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_t clockSource ) 
{
        uint8_t clkCtrl = ( CLK.CTRL & ~CLK_SCLKSEL_gm ) | clockSource;

        asm("ldi  r16,  0xD8");
   asm("out  0x34, r16");
        CLK.CTRL = 0x001;
   return clkCtrl;
}

Autor: Helmut Ru (heru01)
Datum:

Bewertung
0 lesenswert
nicht 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 +
CLKSYS_Disable(OSC_RC2MEN_bm);    
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

Autor: GG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sevus,

zum Thema Atxmega128a1 16 Mhz Quarz:

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

Gruß GG

Autor: GG (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
  */

Autor: Steffen H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen H. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.