Forum: Mikrocontroller und Digitale Elektronik UART hält sein Versprechen nicht


von Julia (Gast)


Lesenswert?

Hi!

Also ich hab um ein Byte zu senden den UART auf 19200 Baud gestellt und
mal gemessen wie lang es dauert: 2 ms. Sende ich ein Word dauert es 4
ms. Kommt also auf etwa 4000 Bit pro Sekunde. Warum ist das so langsam
und was kann ich dagegen tun? Die eingestellte Datenrate verspricht
doch das Fünffache! Und selbst mit 9600 wäre es noch mehr als das
Doppelte.
Ich verwende Bascom und der restliche Code dauert nur 100 us.

MvG Julia

von Stefan Kleinwort (Gast)


Lesenswert?

Richtige Taktquelle gewählt?
Externer Quarz oder interner Oszillator (-> default!!)?
Welchen Takt benutzt Du?

Baudraten-Register richtig gesetzt?
Auf welchen Wert hast Du eingestellt?

von Rufus T. Firefly (Gast)


Lesenswert?

Wie misst Du?
Verwendest Du die Hardware-UART oder die Software-Emulation, die BASCOM
anbietet?
Mal ein Oszilloskop an die TxD-Leitung gehängt, sind Pausen zwischen
den einzelnen Bytes zu sehen?
Könntest Du Deinen Quellcode posten?

von dave (Gast)


Lesenswert?

Ein Byte dauert (1/19200)*10 Sekunden.. 1 Startbit und 1 Stopbit.

Mich würde auch interessieren, WIE du misst.. Wer misst, der misst Mist
:)

dave

von Läubi (Gast)


Lesenswert?

Ich dachte wer mit Mist mißt, mißt mist? ;)

von dave (Gast)


Lesenswert?

[es geht weiter:]
Misst Miss __ Mist? ;)

dave

von dave (Gast)


Lesenswert?

Lassen wir sie erstmal antworten.. ;) bevor wir mit dem Mist weiter
machen G

dave

von Julia (Gast)


Lesenswert?

Also mit dem Oszilloskop in die TxD reingeschnuppert ergibt ein sehr
seltsames Muster welches sich nicht wiederholt aus einzelnen Bits und
Pausen/mehreren Bits mit dem gleichen Wert dazwischen. Scheint sich
aber nicht richtig zu wiederholen obwohl jedes Byte auf &B01010101
gesetzt ist. Jedes einzelne Bit ist 0,05 ms also 19200 kommen auch
raus. Quellcode kann ich nicht posten weil der auf dem Notebook ist und
ich meinen USB Key versaut habe. (Wilde Silvesterparty...) Er bersteht
aber zu Testzwecken aus in etwa:

Do
Portd.4 = 1  'Zur Kontrolle wie lang ein Zyklus dauert, daher meine
waitus 10    'Angaben
Portd.4 = 0
M = &B01010101 ' M isn Byte
Print M
Loop

von Julia (Gast)


Angehängte Dateien:

Lesenswert?

Hi

hier ist was über die TxD Leitung fließt, wenn ich eine Pause einlege.
Wenn ich den AVR nicht warten lasse folgt exakt die gleiche Sequenz
ohne Abstand über die komplette Sendedauer. Dauert also für das Byte
01010101 insgesamt 2 ms (die Länge der Pulssequenz im Bild)

Viele Grüße,
Julia

von Jens123 (Gast)


Lesenswert?

bekommst du denn die daten sauber uebertragen??
wenn nicht such mal die einstellung, die passt

von Rufus T. Firefly (Gast)


Lesenswert?

Das Oszillogramm scheint die Übertragung mehrerer Bytes darzustellen,
sieht aber sehr seltsam aus.

Statt Portd.4 auf 1 zu setzen, 10 µs zu warten und dann Portd.4 wieder
auf 0 zu setzen, könntest Du ja vor jedem Print (also vor jedem Senden
eines Bytes) den Zustand von Portd.1 invertieren.
Wenn das so erhaltene Ausgangssignal auch noch in Deinem Oszillogramm
auftauchen würde ...
Eine Zeitachse o.ä. wäre auch hilfreich.

von Julia (Gast)


Lesenswert?

Also die Dten werden einwandfrei übertragen nur halt zu langsam.
Aber auf das Oszillogramm kann ich mir auch keinen Reim machen. Wie
gesagt, das ist nur ein ganz simples Oszi und die Grafik ist matlab.
Wie gesagt, der pulsetrain ist 2 ms lang, ein einzelnes Bit 0,2 ms und
es wird exakt die im Bild gepostete Zeichenfolge immer und immer
wiederholt, der invertierende spike liegt genau zwischen zwei bits.
Leider kann ich schlecht noch ein Bild posten bis der Kamerakku wieder
voll ist (wie bereits erwähnt, der USB Key ist ner Party zum Opfer
gefallen).
Ich kann in dem Oszigramm absolut nicht die einzelnen Elemnte von 19200
8 Datenbits ein Stoppbit und keine Parität erkennen.

Viele Grüße,
Julia

von Julia (Gast)


Lesenswert?

Oh, der invertierte Spike liegt zwischen zwei "Bytes" also zwischen
exakt zwei von den Pulsetrains wie im Bild

von Julia (Gast)


Lesenswert?

Genau, das ist ja das setsame, denn dass sieht mir so gar nicht wie ein
"Byte" aus. Was könnte das sein?

Viele Grüße,
Julia

von Julia (Gast)


Lesenswert?

Hi, ich hab den Printbin Befehl ausprobiert, und der funktioniert
anscheinend für ein Byte ganz gut, auch wenn ich mir da nicht so ganz
sicher bin ob da evtl. der invertierte Wert ankommt, aber für ein
Single, Integer oder Word geht es nicht. Und wenn ich zwei Bytes
nacheinander sende geht auch nur noch Mist durch die Leitung.
Wie kann es sein dass Printbin schneller als Print ist???

von Rufus T. Firefly (Gast)


Lesenswert?

Print liefert nicht ein Byte, sondern mehrere - nämlich die
ASCII-Repräsentation des (dezimal-)Wertes. Deren Länge ist vom Wert
abhängig.
Ist der Wert beispielsweise (dezimal) 65, dann liefert Print zwei Bytes
an der seriellen Schnittstelle ab, nämlich 0x36 und 0x35, '6' und
'5'.
Bei (dezimal) 204 sind's bereits drei Bytes (0x32, 0x30 und 0x34, halt
'2', '0' und '4'.

Steht hinter dem Variablennamen kein Semikolon, so wird noch ein
Zeilenvorschub angehängt, was ein oder zwei weitere Bytes (0x0d und
eventuell 0x0a) zur Folge hat.
Damit gibt

  Dim a As Byte
  A = 65
  Print A

deutlich mehr als nur ein Byte an der seriellen Schnittstelle aus,
nämlich den String 0x36, 0x35, 0x0d (0x0a).

Printbin gibt hingegen eine definierte Anzahl an Bytes, die vom Typ der
Variablen abhängt; ein Byte resultiert in einem Byte, ein Integer
resultiert in zwei Bytes und ein Long resultiert in vier Bytes.

(Das ist in der BASCOM-Dokumentation beschrieben)

Das dürfte das Phänomen klären - und darauf hinweisen, daß irgendwas
mit der Baudrate der seriellen Schnittstelle überhaupt nicht stimmt.

Vermutlich läuft der Controller mit einer anderen Taktfrequenz als
angenommen.

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.