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:
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
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
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
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
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.
*/
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
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.
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
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.
>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