xmega externer Quarz stabilisiert sich nicht

Ich verwende einen ATxmega64A3U, ich habe einen externen 4-MHz-Quarz und zwei 18-pF-Lastkappen angeschlossen . Ich verwende das ASF-Modul zur Uhrenkonfiguration, aber beim Start kann ich sehen, dass der Code an der folgenden Stelle hängt:

static inline void osc_wait_ready(uint8_t id)
{
    while (!osc_is_ready(id)) {
        /* Do nothing */
    }
}

Der While wartet darauf, dass sich die Taktquelle stabilisiert, aber das passiert nie. Hat jemand Vorschläge woran das liegen könnte?

Zusatz

Der Code, den ich oben gepostet habe, stammt von der ASF. Um sicherzustellen, dass ich weiß, was ich ausführe, habe ich den folgenden Code geschrieben und konnte sehen, dass der Code in der While-Schleife hängen bleibt, die darauf wartet, dass sich der Oszillator stabilisiert.

OSC_CTRL |= OSC_XOSCEN_bm;
while(!(OSC_STATUS & OSC_XOSCRDY_bm));
CCP = CCP_IOREG_gc;
CLK_CTRL = (CLK_CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_XOSC_gc;
OSC_CTRL &= ~OSC_RC2MEN_bm;

Ich aktiviere den externen Oszillator, warte, bis er stabil wird, deaktiviere die Sperrung des Registers, schalte auf den externen Oszillator um, deaktiviere den internen 2-MHz-Oszillator.

Wie rufst du die Funktion auf? Ist "ID" gültig?
@KevinWhite Code ist Form ASF, sollte in Ordnung sein. Ich habe der ursprünglichen Frage meinen eigenen Code hinzugefügt. Es bleibt an der gleichen Stelle hängen.
Nicht, dass es wirklich relevant wäre, aber gab es nicht eine Art internen RC-Oszillator-Fallback-Modus, falls der externe Quarz nicht richtig startet? Ich wundere mich nur, dass es "einfach hängt". Aber es ist schon eine Weile her, seit ich das benutzt habe.
@Rev1.0 Nun, es gibt einen Sicherheitsfallback, aber Sie müssen ihn im XOSCFAIL-Register aktivieren. Ich hab nicht.

Antworten (3)

Beachten Sie, dass eine Lastkapazität von 18 pF aus dem Datenblatt nicht bedeutet, zwei 18-pF-Kondensatoren auf der Platine zu platzieren.

Es ist die Gesamtkapazität, die der Kristall "sehen" sollte. Unter der Annahme einer Streukapazität von 5 pF hätten Sie

Kl = (18pF*18pF)/(36pF) + 5pF = 14pF

Vielleicht möchten Sie etwas wie 24 pF für die Lastkondensatoren versuchen.

Außerdem wählt man den ESR des Quarzes ziemlich hoch. Dies kann zu einem Problem werden, wenn die Oszillatorschaltung den Kristall nicht angemessen ansteuern kann.

Kristalle mit höheren Frequenzen haben tendenziell einen niedrigeren ESR, versuchen Sie es also mit einem Kristall mit 8 oder 16 MHz aus dieser Serie.

Ich weiß tatsächlich, dass Sie Kapazität von den Spuren hinzugefügt haben, aber ein bisschen daneben sollte die Betriebsfrequenz beeinflussen. des Oszillators nicht die Stabilität AFAIK. Sie haben jedoch etwas gesagt, das ich übersehen habe, die Tatsache, dass höhere Frequenzen. Kristalle haben einen niedrigeren ESR, was erklären könnte, warum das Board Schwierigkeiten hat, dieses zu fahren! Ich denke, ich kann den Xmega entsperren, um mehr Strom an die Schaltung zu liefern, und vielleicht könnte das hier helfen. Danke!

Platzieren Sie die Oszilloskopsonde, isoliert durch einen Dollarschein (Dicke 3 mil oder 1/11 mm), am Ausgangsknoten des Oszillators (größte, aber verzerrte Spannung). Dies implementiert eine Spannungsteiler-Oszilloskopsonde mit wenig zusätzlichem C an den XTAL + PI-Kondensatoren, sodass jede Amplitude unverändert bleiben sollte. Die Kapazität durch das Papier der Rechnung ist

C = E 0 E R A R e A / D ich S T A N C e
C = 9 10 12 2 ( C Ö T T Ö N P A P e R ) ( 1 M M 1 M M S C Ö P e T ich P A R e A ) / 0,075 M M
C   2 10 11 0,013 = 0,26 P F

Wenn Ihre Oszilloskopsonde im 10X-Modus 13 pF beträgt, haben Sie einen 50:1-Teiler.

Stellen Sie das Oszilloskop auf 20 mV/Teilung ein, und Ihre tatsächliche Empfindlichkeit beträgt 1 Volt/Teilung. Mit nur 0,26 pF Cload auf den Oszillator.

Untersuchen Sie die beiden XTAL-Pins. Gesunde 1vpp-, 2vpp-, 3vpp-Signale finden? bei 4.000 MHz?

Schauen Sie sich zum Spaß andere MCU-Oszillatoren an, für Amplitude und Sündhaftigkeit und Verzerrung?

Barkhausen gibt uns 2 Voraussetzungen für eine erfolgreiche Oszillation:

(1) Spannungsverstärkung > 1

(2) GENAU ------- genau ------- N*360 Grad Phasenverschiebung.

Einige Kristalloszillatoren erreichen nur GENAU N*360 Grad, mit einem gewissen Widerstand vom Vout-Pin zum PI_network-Kondensator. Versuchen Sie es mit 100_Ohm oder 1.000_Ohm.

Es stellte sich also heraus, dass es sich um ein Softwareproblem handelte! Es stellte sich heraus, dass es auch notwendig ist, die Anzahl der Zyklen einzustellen, die der AVR wartet, bis der Oszillator stabil wird. Ich habe dies nicht eingestellt, was offensichtlich zu Problemen führte. Hier ist der aktualisierte Code, der 16.000 Zyklen wartet, weil ich kein schnelles Aufwachen benötige, und das sind ungefähr 4 ms.

OSC_XOSCCTRL = ((OSC_XOSCCTRL & ~OSC_FRQRANGE_gm) | OSC_FRQRANGE_2TO9_gc) |
               ((OSC_XOSCCTRL & ~OSC_XOSCSEL_gm) | OSC_XOSCSEL3_bm | OSC_XOSCSEL1_bm | OSC_XOSCSEL0_bm);
OSC_CTRL |= OSC_XOSCEN_bm;
while(!(OSC_STATUS & OSC_XOSCRDY_bm));
CCP = CCP_IOREG_gc;
CLK_CTRL = (CLK_CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_XOSC_gc;
OSC_CTRL &= ~OSC_RC2MEN_bm;
Wenn vorhanden, sollten Sie trotzdem ein Oszilloskop verwenden, um die Startzeit und die Wellenform zu überprüfen. Wenn es sich erst nach etwa 15.000 Zyklen stabilisiert, funktioniert der "nächste" Kristall aufgrund leicht unterschiedlicher Eigenschaften möglicherweise nicht richtig.
@Rev1.0 Das ist wahr. Für den nächsten Build werde ich eine höhere Frequenz verwenden. Xtal und teilen Sie es nach unten.