Forum: Mikrocontroller und Digitale Elektronik XMEGA A nur 500mVss Quarz-Amplitude


von Holler (Gast)


Lesenswert?

Hallo,

betreibe einen Atmel XMEGA 32A4 mit externem 16MHz Quarz.
Schien auch gut zu laufen, aber aus der UART kommt nur Schrott raus.
Ursache ist die hohe Abweichung von der Soll-Baudrate von über 15%.

Bei der Ursachenforschung bin ich jetzt beim Quarz, da die diversen 
Register der UART und des Takt/Oszillator-System korrekt scheinen.

Der Pegel ist Vss = 500mV (Spitze-Spitze), gemessen mit 1:10 Teiler und 
einem ziemlich guten Oszi. Bin da deutlich mehr gewohnt, allerdings 
nutze ich einen XMEGA das erste Mal. Die Frequenz passt bis auf vier 
Stellen hinterm Komma.

Frage: kann der geringe Pegel Urache der Ablage sein ?
Die XOSCFAIL Bits wurden nicht gesetzt.

Kenn das jemand oder muss ich doch zum x-ten Mal die Register prüfen?

von Willi S. aus M. (Gast)


Lesenswert?

Kennen tue ich dein Problem zwar nicht, aber ohne den Code ist hilfe 
schwer zu geben.

Was ich beantworten kann ist, dass Atmel auch einen half-swing-OC-modus 
(oder wie der auch immer heißen mag) hat, bei dem des Vss am Quarz zum 
energiesparen ziemlich gering gehalten wird. 500mV meine ich da auch bei 
mir mal gemessen zu haben, aber da leg ich mich jetzt nicht fest.

Dein Problem wird (sofern die frequenz wirklich stimmt) wohl die 
Software sein. Aber ohne Input (von dir) gibts kein Output (von mir). So 
einfach...

von Michael A. (Gast)


Lesenswert?

Holler schrieb:
> Frage: kann der geringe Pegel Urache der Ablage sein ?

Wenn das ein reiner Quarz ohne irgendeinen Oszillator ist, würden dem 
bei größerer Amplitude die Backen wegfliegen. Schließlich ist das ein 
mechanischer Schwinger.
Guck dir lieber die Symboldauer eines über USART gesendeten Zeichens an 
und vergleich das mit der Symboldauer der von deinem Gegen-USART 
gesendeten Zeichen. Der Schrott entsteht meist bei der Interpretation 
der Zeichen, nicht beim Senden.

von Holler (Gast)


Lesenswert?

Es geht mir nur um einen Kommentar zur Amplitude des Quarzoszillators. 
Vielleicht kann ja mal jemand an seinem XMAGA A messen.

Mit Code möchte ich das Forum verschonen, nutze die ASF (auch das erste 
Mal).
Habe aber einen Breakpoint gesetzt und dann die Registerbänke auf 
Plausibilität mit dem Datenblatt verglichen.

von Holler (Gast)


Angehängte Dateien:

Lesenswert?

Michael A. schrieb:
> Der Schrott entsteht meist bei der Interpretation
> der Zeichen, nicht beim Senden.

Ok, überredet: sieht weniger nach einem Taktproblem als eines der UART 
aus.
Die UART-Register bin ich noch nicht im Detail durchgegangen.

Anbei ein Screenshot vom Oszi, der gelbe Kanal ist ein Space mit 
19200N81 vom PC gesendet, der XMEGA empfängt und sendet das 
interpretierte Zeichen auf blau zurück. Das passt nicht, umd das 
Terminalprogramm des PC zeigt Schrott.

Danke erstmal, die ASF scheint da doch keine große Hilfe. Jedenfalls 
nicht bei der UART-Initialisierung.

von Michael A. (Gast)


Lesenswert?

Holler schrieb:
> Anbei ein Screenshot vom Oszi, der gelbe Kanal ist ein Space mit
> 19200N81 vom PC gesendet

Dann stell doch dein Oszi mal so ein, dass man beide Zeichen voll sehen 
kann. Und wenn du dir einen Gefallen tun willst, sende erstmal nicht das 
interpretierte Zeichen, sondern ein festes Zeichen zurück.

von Spess53 (Gast)


Lesenswert?

Hi

> sondern ein festes Zeichen zurück.

Am besten 0x55 oder 0xAA.

MfG Spess

von Holler (Gast)


Lesenswert?

@Michael A.: es sind beide Zeichen voll drauf.

@Spess: habe ein "U" gesendet, und es kam sauber raus ...

Um es kurz zu machen: der Beispielcode im ASF enthält einen kleinen 
Fehler, siehe screenshot ASF-Beispiel.

Richtig ist:
usart_serial_putchar(USART_SERIAL, *received_byte);
Und dann gehts auch.
Ich verwendete zum Testen die Leertaste (Space), das fehlerhaft 
empfangene Zeichen war eine Art kleines y mit zwei Punkten drüber (ASCII 
152). Das sieht im Oszi wie eine Symbolverzerrung von ASCII 32 aus.

Der Compiler gibt keine Warnung aus. Muss mal die Einstellungen prüfen.

Die Funktionsdeklaration:
static inline enum status_code usart_serial_putchar(usart_if usart, 
uint8_t c)

@Michael A. und @Spess

Danke für die Tipps. Und 500mVss am externen Quarz sind wohl für einen 
XMEGA ok, eben EMV-optimiert.

von Holler (Gast)


Angehängte Dateien:

Lesenswert?

Screenshot ASF-Doku

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Holler schrieb:
> Und 500mVss am externen Quarz sind wohl für einen
> XMEGA ok, eben EMV-optimiert.

Dir sollte auch klar sein, das, wenn der Pegel nicht stimmt und du auf 
den Quarzoszillator umschaltest, der XMega nicht mehr laufen würde, da 
das Prescalersystem aussetzt. Also alles ok.

von Basti M. (counterfeiter)


Lesenswert?

@Holler das sieht mir nicht nach einem Fehler von Atmel aus, sondern 
eher ein Missverständnis von Pointern deinerseits!

Aber mit 3 Zeilen Code kann man nur spekulieren...

von Peter R. (pnu)


Lesenswert?

Eine Messung mit dem Scope direkt am Quarz kann bestenfalls ein 
"schwingt" als Antwort bringen

Die ca. 5pF Eingangskapazität können an dem Oszillator eines 
Mikrokontrollers erhebliche Messfehler verursachen.

Grund: die Zusätzliche kapazitive Last kann die Amplitude auf die Hälfte 
oder noch weniger herabsetzen.

Je nach Anschluss (X1 oder X2 bzw Ein-oder Ausgang) am Oszillator ist 
die Amplitude kleiner: Am Eingang doch deutlich kleiner als am Ausgang 
des Oszillators.

Aus Stromspargründen arbeitet der Oszillator oft mit veringerter 
Amplitude und nicht mit full swing.

500mV Uss würden mich nicht im geringsten stören.

von Holler (Gast)


Lesenswert?

Basti M. schrieb:
> @Holler das sieht mir nicht nach einem Fehler von Atmel aus, sondern
> eher ein Missverständnis von Pointern deinerseits!
>
> Aber mit 3 Zeilen Code kann man nur spekulieren...

Habe kein Problem mit den Pointern, hier eine Online-Version des Atmel 
ASF USART Beispielcodes:
http://asf.atmel.no/docs/latest/mega.drivers.usart.unit_tests.atmega128rfa1_stk600-rc128x_rfx/html/group__megarf__usart__group.html

Ganz unten, unter "Usage steps" / "Example code": ist immer noch falsch!

Das Header-file ist im meiner lokalen Version der ASF 3.5.? von Ende 
letzten Jahres ebenfalls fehlerhaft, online gibts eine korrigierte 
Version: hier findet man den "*":

static void   usart_serial_getchar (usart_if usart, uint8_t *data)
http://asf.atmel.com/docs/latest/xmegab/html/usart__serial_8h.html

Die Deklaration in meinem Headerfile habe ich weiter oben schon genannt, 
halt ohne den Stern (De-Referenzierung).

Deshalb unbedingt der Atmel-Empfehlung folgen, immer die aktuellen 
ASF-Header besorgen...


Zur Quarzmessung:
weiss sehr wohl wie man an Oszillatoren misst: den Pegel habe ich am 
Ausgang direkt mit dem 1:10 Teiler abgegriffen. Ich finde 500mVss wenig, 
der 14,xy MHz Quarzoszillator des Microchip-Cancontrollers auf dem 
selben Board hat über 2Vss.

Und zur Frequenzmessung habe ich das Signal mit 2x 1p in Serie 
ausgekoppelt ... 0,5pF Ankopplung stören nicht so sehr am Ausgang.

von Basti (Gast)


Lesenswert?

Verstehe was du meinst wer will... oben hast du folgendes geschrieben:

>Richtig ist:
>usart_serial_putchar(USART_SERIAL, *received_byte);

und das ist ja nun blödsinn wenn du ein
uint8_t received_byte; wie im Beispiel übergibst...

Wenn du die get benutzt und es gibt kein returnwert, dann ist es 
logisch beim übergeben dies zu tun:

usart_serial_getchar(USART_SERIAL, &received_byte);

von Holm T. (Gast)


Lesenswert?

Quarze werden stabiler wenn sie mit geringerer Amplitude schwingen und 
der Stromverbrauch sinkt auch. Was Dein PIC da macht, ist eine völlig 
andere Baustelle. Die 500mVss gehen in Ordnung.

Gruß,

Holm

von Wilhelm F. (Gast)


Lesenswert?

Holm Tiffe schrieb:

> Die 500mVss gehen in Ordnung.

Das sehe ich auch so. Die Quarzschaltung ist ein Analogverstärker, auch 
wenn der Inverter im µC im Grunde ein digitales Element ist.

Jedes Digitalgatter wie z.B. ein 74HC00 kann man auch als 
Analogverstärker betreiben. Die Beschaltung und Berechnung der 
Impedanzen ist wie beim invertierenden OP: v = -R2 / R1. Wobei R2 ein 
Parallelwiderstand zum Gatter ist, und R1 die Quarzschaltungsimpedanz.

Wenn man in einer Schaltung mal eine Verstärkung braucht, die nicht hoch 
präzise sein muß, und man noch ein Gatter eines Gatterbausteines übrig 
hat, kann man damit durchaus einen Verstärker bauen. Z.B., wenn jemand 
einen 50mV-Sinus mit 500mV braucht, und vielleicht mit einem weiteren 
Gatter auch ein Digitalsignal daraus formen möchte. Allerdings hat das 
Grenzen: Die Verstärkung sollte nicht besonders hoch sein, und 
Ausgangsamplituden nicht in die Nähe der Betriebsspannungsgrenzen 
kommen. Es ist eben kein richtiger Verstärker mit OP. Im Nulldurchgang 
könnte er auch stark rauschen, weil dort sein Arbeitspunkt am 
instabilsten ist. Brauchbare Anwendungen wären hier z.B. eher die 
Signalkonditionierung, ein schwaches Wechselspannungssignal etwas 
verstärken, aber niemals einen HiFi-Verstärker.

Im CMOS-Kochbuch bspw. ist diese Sache komplett beschrieben, anhand 
eines 4000B, die gegenüber den ersten Serien 4000A sogar dreifach 
gepuffert sind, und es ist über 30 Jahre alt. 4000A gab es in den 
1970-ern, sie wurden ca. 1980 durch die verbesserten B-Serien abgelöst. 
Manchmal gibt es auch heute noch z.B. 4000UB, das heißt unbuffered, sind 
dann wie die alten A-Typen. Anstatt 4000A heißen sie eben 4000UB.

Manchmal, wenn ich früher z.B. bei Reichelt einen 40xx bestellte, bekam 
ich als Überraschung einen 40xxUB. Ich beschwerte mich nie, die Steine 
erfüllten auch voll ihren Zweck, fand es einfach für mich dann als 
Rarität.

An ollen µC wie dem 8051, der keine einstellbaren Quarzpower-Modes hat, 
hatte ich auch schon solch anscheinend geringe Spannungen gemessen. Das 
hängt dann ein wenig auch vom Quarz und dessen Frequenz ab. Manch einer 
schaltet absichtlich noch einen Serienwiderstand an den Inverterausgang, 
um die Energie der Quarzschaltung zu drosseln.

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.