PLL Startprobleme beim ATXmega128A1U

OP #3947882
Lesenswert?

Hallo Allerseits,

ich habe hier ein Startproblem mit der PLL im ATxmega128A1U. Dort ist 
ein 16,384MHz Quarz angschlossen mit 2x22pF. Dieser Takt soll per PLL 
vervierfacht werden. Folgender Code wird benutzt.
1
   // PORTR init, kickstart for XO
2
    PORTR.DIR=PIN0_bm;      // XTAL2
3

4
    // CLK init
5
    // external XO with 16.384 MHz
6
    // internal PLL x4
7
    // 65.536 MHz PER2 clock 
8
    // 32.768 MHZ CPU clock
9
    
10
    //TODO workaround for startup trouble
11
    STATUS_LED_RED
12
    OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCPWR_bm | OSC_XOSCSEL_XTAL_16KCLK_gc;
13

14
    PORTR.OUT=PIN0_bm;      // kickstart for XO
15
    PORTR.OUT=0;      // kickstart for XO
16
    PORTR.OUT=PIN0_bm;      // kickstart for XO
17
    PORTR.OUT=0;      // kickstart for XO
18

19
    OSC.CTRL |= OSC_XOSCEN_bm;
20
    while(!(OSC.STATUS & OSC_XOSCRDY_bm));      // wait for XO startup
21
    //OSC.CTRL |= OSC_RC32MEN_bm;
22
    //while(!(OSC.STATUS & OSC_RC32MRDY_bm));      // wait for RC startup
23
    _delay_ms(1);
24
    STATUS_LED_YELLOW
25

26
    CCPWrite( &CLK.PSCTRL, CLK_PSBCDIV_1_2_gc );// Prescaler B/1 C/2
27
    
28
    OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 0x04;    // PLL x4, XO input
29
    //OSC.PLLCTRL = OSC_PLLSRC_RC32M_gc | 0x08;    // PLL x8, RC input
30
    OSC.CTRL |= OSC_PLLEN_bm;                   // enable PLL
31
    while(!(OSC.STATUS & OSC_PLLRDY_bm));       // wait for PLL startup
32
       
33
    CCPWrite( &CLK.CTRL, CLK_SCLKSEL_PLL_gc );  // select PLL as clock source
34
    //CCPWrite( &CLK.CTRL, CLK_SCLKSEL_XOSC_gc );  // select XO as clock source
35
    OSC.CTRL &= ~OSC_RC2MEN_bm;                 // 2M RC OSC OFF
36

37
    STATUS_LED_GREEN
38
    _delay_ms(100);

Das Problem liegt darin, dass nach dem Einschalten oder externen Reset 
per Programmieradapter die Sequenz bei der gelben LED hängen bleibt, 
sprich, die PLL scheint nicht einzurasten. Wenn man jedoch den IC bzw. 
den Quarz mit dem Finger berührt, scheint er anzuschwingen und dann zu 
laufen. Manchmal scheint er nicht ganz sauber anzuschwingen, weil auf 
meinem Terminal (UART @ 115k2) komische Zeichen ankommen. Meisten klappt 
es aber.
Sehr komisch.

Das Anschwingen nach dem Berühren (manchmal reicht es, ca. 5mm nah an 
den IC heranzugehen!) deutet auf einen sehr empfindlichen Oszillator 
hin, der durch minimale kapazitive Einstreuung scheinbar erst loslegt. 
Das sollte aber nicht so sein.

Als Test habe ich versucht, das XTAL2 Pin zuerst auf Ausgang zu schalten 
und ein wenig zu wackeln, damit der Quarz schon gedämpft schwingt, wenn 
der Oszillator aktiviert wird. Scheint aber keine Wirkung zu haben.

Wenn man anstatt des externen Quarzes den internen 32 MHz RC Oszillator 
nutzt, schwingt die PLL problemlos an.

Ich habe auch schon alles optisch geprüft, ob vielleicht Lötfehler 
vorliegen. Ich hab auch alles nochmal nachgelötet (Pins am ATXmega, 
Quarz, Kondensatoren),. Hilft alles nix.

Man muss dazu sagen, dass es bei der Inbetriebnahme ein Problem gab. Die 
VCC/GND Pins 83/84 waren verpolt, damit gab es dort einen satten 
Kurzschluss der 3,3V Versorgung. Der Strom wurde nur vom Spannungsregler 
auf ~1A begrenzt und ist dort minutenlang reingeflossen, die Spannuung 
brach auf ca. 500mV ein. Ggf. ist dabei etwas zu Schaden gekommen. Den 
IC will ich aber jetzt nicht wechseln, das ist eine Scheißarbeit. Die 
Pins habe ich von den Leitungen gelöst und mittels Drähtchen richtig 
angeschlossen, sprich, der zugehörige 100nF Entkoppelkondensator ist 
immer noch aktiv an der Stelle.

Hat jemand ähnliche Erfahrungen gemacht?
Irgendwelche Ideen?

Als Workaround könnte ich einen externen Quarzoszillator anschließen, 
das wäre für meinen Prototypen OK. Aber wird dann die neue Version mit 
Quarz ordentlich laufen? Hmmm?

MFG
Falk
Gast #3947928
Lesenswert?

Stefan Us schrieb:
> es sollen 100pF sein

Eher 10 pF, wenn ich richtig lese:

AVR1003
5
8072E-AVR-11/09
Table 2-1.
Recommended Capacitor Values
Frequency Range
Capacitor Value (C1 and C2)
0.4 – 2 MHz
100 pF
2 – 9 MHz
15 pF
9 – 12 MHz
15 pF
12 – 16 MHz
10 pF


Ich habe nach diesem Tutorial erfolgreich initialisiert ...

http://www.jtronics.de/avr-projekte/xmega-tutorial/xmega-tutorial-clock.html
OP #3948012
Lesenswert?

@ Stefan Us (stefanus)

>Moment mal. Ich war von 16kHz ausgegangen.

Es sind 16 MHz, steht auch so in meinem Beitrag. Einen 16 kHz Quarz muss 
man erstmal finden ;-)

> Wenn er 16Mhz vervierfachen
>würde, dann käme er ja auch 64Mhz Taktfrequenz!

Das ist auch so, es sind sogat 65,536 MHz.

> So viel kann der doch gar nicht. Oder doch?

Oder doch. Diese 65 MHz werden nur für den SDRAM benutzt, die CPU 
bekommt nur die Hälfte, also ~32 MHz. Das ist voll OK.
OP #3948035
Lesenswert?

Die Frage ist, warum scheint der Xmega zu meinen, dass der XO normal 
läuft,

    while(!(OSC.STATUS & OSC_XOSCRDY_bm));      // wait for XO startup
    _delay_ms(1);
    STATUS_LED_YELLOW

 wo er das anscheinend doch nicht tut. Messen kann ich im Moment leider 
auch nicht, ich hab im Moment kein Oszi para :-0

Stochern im Nebel.
OP #3948065
Lesenswert?

@ Dieter Frohnapfel (jim_quakenbush)

>Pack den mal hinter Deine "gelbe-LED-Anweisung"

>CCP = CCP_IOREG_gc;                                          //
>Ermöglicht das Beschreiben geschützter IO-Register

Wozu? Dafür gibt es die Funktion CCPWrite, dort steckt ein ASM-Makro 
drin, damit das Timing unabhängig von der Optimierungseinstellung des 
Compilers sichergestellt ist. Und die funktioniert auch, sieht man auch 
im Assemblerfile.
OP #3948087
Lesenswert?

Wie gesagt, mit internem 32 MHz RC Takt als Quelle für die PLL läuft es 
problemlos. D.h. auch der Zugriff auf CCP funktioniert. ISt aus eine 
App-Note rauskopiert.
1
/*! \brief CCP write helper function written in assembly.
2
 *
3
 *  This function is written in assembly because of the timecritial
4
 *  operation of writing to the registers.
5
 *
6
 *  \param address A pointer to the address to write to.
7
 *  \param value   The value to put in to the register.
8
 */
9
void CCPWrite( volatile uint8_t * address, uint8_t value )
10
{
11
  volatile uint8_t * tmpAddr = address;
12
#ifdef RAMPZ
13
  RAMPZ = 0;
14
#endif
15
  asm volatile(
16
    "movw r30,  %0"        "\n\t"
17
    "ldi  r16,  %2"        "\n\t"
18
    "out   %3, r16"        "\n\t"
19
    "st     Z,  %1"       "\n\t"
20
    :
21
    : "r" (tmpAddr), "r" (value), "M" (CCP_IOREG_gc), "i" (&CCP)
22
    : "r16", "r30", "r31"
23
    );
24
}
Gast #3948156
Lesenswert?

Hier mal ein Zwischenstand. Ich habe einen ATXMega32A4 mit einem 8Mhz 
Quarz. Ich prüfe am Oszi an C7. (Die _delay sind natürlich ein Witz, da 
kein F_CPU angegeben ist / angepasst wird).

OSC_XOSCPWR_bm kennt mein Atmel-Studio für meinen Prozessor nicht - habe 
ich mal weggelassen.

Gestartet wird mit 2MHz internem Takt.  O.K.

Dann wird der externe 8Mhz Quarz als Taktquelle genommen -> 8 MHz Takt 
O.K.

Dann schaltet er auf 16 MHz ...  O.K.

Würde also bei einem 16,384 MHz Quarz auf 32,768 MHz gehen. Passt aus 
meiner Sicht - scheinbar doch die Hardware.

1
/*
2
 * Falks_ATXMEGA.c
3
 *
4
 * Created: 02.01.2015 15:23:26
5
 */ 
6

7

8
#include <avr/io.h>
9
#include "clksys_driver.h"
10

11

12

13
int main(void)
14
{
15
   PORTC.DIR=PIN7_bm;      // 
16
   PORTC.OUT=PIN7_bm;      //  
17
  
18
   PORTCFG.CLKEVOUT = PORTCFG_CLKOUT_PC7_gc; 
19

20
   _delay_ms(10000);
21

22

23
        
24
   OSC_XOSCCTRL = OSC_XOSCSEL_XTAL_16KCLK_gc | OSC_FRQRANGE_2TO9_gc;
25
   OSC.CTRL |= OSC_XOSCEN_bm;
26
   while(!(OSC.STATUS & OSC_XOSCRDY_bm));      // wait for XO startup
27
   
28
   CCP = CCP_IOREG_gc;
29
   CLK.CTRL = CLK_SCLKSEL_XOSC_gc;
30
   
31
   _delay_ms(10000);
32

33
   
34
   
35
   CCPWrite( &CLK.PSCTRL, CLK_PSBCDIV_1_2_gc );// Prescaler B/1 C/2
36
   
37
   OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 0x04;    // PLL x4, XO input
38
   OSC.CTRL |= OSC_PLLEN_bm;                   // enable PLL
39
   while(!(OSC.STATUS & OSC_PLLRDY_bm));       // wait for PLL startup
40
   
41
   CCPWrite( &CLK.CTRL, CLK_SCLKSEL_PLL_gc );  // select PLL as clock source
42
   OSC.CTRL &= ~OSC_RC2MEN_bm;                 // 2M RC OSC OFF
43

44
  
45
  
46
   while(1)
47
   {
48
        //TODO:: Please write your application code 
49
   }
50
}
OP #3948163
Lesenswert?

@ Dieter Frohnapfel (jim_quakenbush)

>Würde also bei einem 16,384 MHz Quarz auf 32,768 MHz gehen. Passt aus
>meiner Sicht - scheinbar doch die Hardware.

Danke für den Test, ich werde wohl als Workaround erstmal nen XO 
dranpappen, den IC wechseln ist mir zuviel Arbeit.
Persönliche Seite #3948193
Lesenswert?

> ich habe hier ein Startproblem mit der PLL im ATxmega128A1U. Dort ist
> ein 16,384MHz Quarz angschlossen mit 2x22pF.

> Hat jemand ähnliche Erfahrungen gemacht?
> Irgendwelche Ideen?

Wir hatten Ende letzten Jahres ein ähnliches Problem bei einer Baugruppe 
mit dem gleichen Chip und einem 16Mhz Quarz. Mit 2x10pF lief diese aber 
dann problemlos. Die meisten ATXmega-Baugrupppen laufen bei uns mit 
einem 8MHz Quarz und dann x4 per PLL, was bisher völlig unempfindlicher 
war gegen nicht 100%ig angepasste Quarzbeschaltungen. Nur auf der 
besagten Platine waren sowieso schon 16MHz Quarze verbaut, weswegen sich 
das anbot, alles einheitlich zu bestücken.
Persönliche Seite #3948211
Lesenswert?

Welchen Quarz hast du denn dort angeschlossen? Vor allem bei den kleinen 
SMD Quarzen kann es vorkommen, dass diese wesentlich weniger 
Lastkapazität benötigen. Möglicherweise liegt es daran. Bedenke auch, 
dass der Chip alleine schon eine parasitäre Last besitzt (z.B. 3.16 bei 
einem ATxmegaA4U) und auch noch auf der Platine das eine oder andere 
Picofarad dazu kommt.

Hast du keinen Zugriff auf eine Heißluftstation zum Auslöten? Damit geht 
es wirklich fix.
Gast #3948245
Lesenswert?

Matthias Sch. schrieb:
> Oszillator schwingt auf jeden Fall und
> treibt den XMega sicher an

Hmm, ja, nur wenn da drin viel "Schmurgel" ist, dann kann nichts 
angetrieben werden - oder?

Wenn ich (bei einem ATMega oder ATTiny) "verfused" habe - O.K., aber bei 
einem ATXMega... ? Nun , ich bin da etwas unbedarft - kannst Du mir das 
bitte erklären?
Gast #3948262
Lesenswert?

isidor schrieb:
> Sogar
> in der Klima-Kammer bei -10°C bis +80°C.

So etwas (Klima-Kammer) habe ich nicht - aber ich denke auch, dass 
gewisse Toleranzen O.K. sind. Warum nimmst Du 18 pF Kondensatoren und 
keine 10 pF Kondensatoren - wie empfohlen?

Sind die gängiger?
Persönliche Seite #3948349
Lesenswert?

isidor schrieb:
> Ich fahre seit gut einem Jahr den ATxMega128A1 mit 16 Mhz (siehe
> Bild, Standard-Billig-Quarz) mit 2x 18pF ohne Probleme. Sogar
> in der Klima-Kammer bei -10°C bis +80°C.
> Interne Taktfrequenz 32 Mhz.

Wie Simon es bereits beschrieben hat, ist das Anschwingproblem bei 
kleinen Bauformen tendenziell stärker ausgeprägt. Denn je kleiner das 
Gehäuse ist, desto höher ist meist der ESR-Wert. Wir haben auf 
Baugruppen, die vom Platz her unkritisch sind, zum Beispiel noch oft 
HC49U-Quarze. Die haben bei gleicher Frequenz oftmals nur die Hälfte des 
ESR-Wertes als beispielsweise 3,2x2,5mm² Quarze. Mit (zu) großen 
Lastkapazitäten schwingen die dann oftmals garnicht mehr an.
Gast #3948386
Lesenswert?

Dieter Frohnapfel schrieb:
> Entweder bin ich zu doo.. oder mein Oszi
> spielt da nicht mit ..

Das ist Analog-Technik! Da kommt kein Rechteck mit 3.3V Pegel.

Vermutlich musst du deinen Oszi stark "aufdrehen" (emfindlicher
machen), eine gute Masse in der Nähe deines Controllers verwenden.

Dann, nach langem Suchen wirst du irgendeinen kleinen Sinus finden
(wenn der Oszillator sich nicht durch die Last des Tastkopfes
zu Tode erschrocken hat)
OP #3948910
Lesenswert?

@ Dieter Frohnapfel (jim_quakenbush)

>> Oszillator schwingt auf jeden Fall und
>> treibt den XMega sicher an

Genau.

>Hmm, ja, nur wenn da drin viel "Schmurgel" ist, dann kann nichts >
>angetrieben werden - oder?

so viel Schmurgel wird es nicht sein, denn die PLL läuft ja mit einer 
anderen Taktquelle (interner 32 Mhz RC Oszillator) problemlos.

Ich vermute, dass durch die Verpolung der Verstärker des XOs gelitten 
hat und nun einige kritische Parameter arg verändert sind. Mit einer 
sanften Berührung kommt er allerdings in Trab.
#3948930
Lesenswert?

Es kann auch einfach ein schlechter Quarz sein. Auch da gibt es ggf. 
Ausreißer oder halt Typen die weniger Kapazität brauchen.

Das nachmessen am Quarz ist gar nicht so einfach. Das Oszilloskop ist 
nicht das Problem, sondern die Kapazität des Tastkopfes.  5 pF und etwas 
Dämpfung vom Tastkopf können da einen großen Unterschied ausmachen.

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