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?
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...
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.
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.
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.
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.
@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.
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.
@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...
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.
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.
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);
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
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.