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.
Hi
> sondern ein festes Zeichen zurück.
Am besten 0x55 oder 0xAA.
MfG Spess
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.