Forum: Mikrocontroller und Digitale Elektronik rpi <--> avr uart Übertragungsfehler bei Quarzbetrieb


von Harald (hasanus)


Lesenswert?

Liebe Leute,

ich versuche mich an einer Motorsteuerung, bestehend u.a aus einem avr 
m328pb und einem SBC, derzeit ein rpi02W.
Sie sollen über uart miteinander kommunizieren: Status und Kommandos 
sind in beide Richtungen austauschen, zudem sollen vom avr debug - 
Meldungen zum rpi versendet werden. Das ganze muss recht fix passieren, 
darum habe ich als baudrate > 300000 anvisiert.

Der avr sitzt auf einer Platine die auch den SBC huckepack über die 
40poligen Pfostenleiste hält. Die Stromversorgung des SBC erfolgt 
mittels eines 5V - Abwärtsregler. Der avr wird mit den 3V3 des rpi 
gespeist. Seine Peripherie besteht nur aus zwei Tastern und zwei LED.

Das Problem ist nun: Betreibe ich den avr mit dem 14.7456 MHz - Quarz, 
so ist die höchstmögliche Baudrate für zuverlässige Übertragung 115200. 
Bei >= 234000 ist die Fehlerrate extrem hoch, es kippt regelmäßig nach 
ca 12 kB erfolgreicher Übertragung ein bit.
Keine Aussetzer gibt es jedoch wenn der avr mit dem internen RC - 
Oszillator betrieben wird. Mit dem kann ich mit 500000 baud fehlerfrei 
mehrere Megabytes hin und her schieben.

Derzeit habe ich kein Scope zur Hand und ich bin ratlos.
Hat jemand so was schon mal gehabt?

Schönen Gruß,
H.

von N. M. (mani)


Lesenswert?

Harald schrieb:
> Der avr wird mit den 3V3 des rpi gespeist.

Harald schrieb:
> Betreibe ich den avr mit dem 14.7456 MHz - Quarz

Datenblatt Auszug:
0 - 20MHz @ 4.5 - 5.5V

Harald schrieb:
> Bei >= 234000 ist die Fehlerrate extrem hoch

http://www.gjlay.de/helferlein/avr-uart-rechner.html

Deine Zahlen kurz eingesetzt kommen da teilweise 8% Fehler raus.

Harald schrieb:
> Keine Aussetzer gibt es jedoch wenn der avr mit dem internen RC -
> Oszillator betrieben wird. Mit dem kann ich mit 500000 baud fehlerfrei
> mehrere Megabytes hin und her schieben.

Vermutlich Glückssache. Verändere Mal die Versorgungsspannung oder Fön 
in mal auf 60°C.

von Peter Z. (hangloose)


Angehängte Dateien:

Lesenswert?

Mit 14,7456MHz und 3,3V betreibst du den AVR schon mal außerhalb der 
Spezifikationen...

Speed Grade:

– 0 - 4 MHz @ 1.8 - 5.5V

– 0 - 10 MHz @ 2.7 - 5.5V

– 0 - 20 MHz @ 4.5 - 5.5V



Abgesehen davon hilft ein Blick ins DB

Bei einer Baud Rate von 0.5M und 8MHz hast du 0% Fehler

Bei einer Baud Rate von 0.5M und 14.7456MHz hast du 7,80% Fehler

Also alles ganz normal...

von Chris S. (schris)


Lesenswert?

Probiere 921.6K
Mit normalem 16mhz Quarz sind 2mb möglich, internem osc 1mb.
Rpi geht bis 4mbit.

von Michael D. (nospam2000)


Lesenswert?

Peter Z. schrieb:
> Bei einer Baud Rate von 0.5M und 8MHz hast du 0% Fehler
> Bei einer Baud Rate von 0.5M und 14.7456MHz hast du 7,80% Fehler

Genau!

Zusätzlich sollte man die Abweichung auf beiden Seiten betrachten. Die 
nominelle Baudrate ist ziemlich wurst, wichtig ist, dass die 
tatsächliche Baudrate zwischen beiden Seiten zusammenpasst wenn 
unterschiedliche Chips mit unterschiedlichen Formeln und Quarzen 
verwendet werden.

Ich hatte das mal hier beschrieben: 
https://github.com/nospam2000/ch341-baudrate-calculation?tab=readme-ov-file#problem-b-the-calculated-baudrate-is-now-nearer-to-nominal-rate-but-farer-from-the-baud-rate-of-communication-partner

  Michael

von Harald (hasanus)


Lesenswert?

Sorry, ich habe unklar geschrieben.
Die Baudratenfehler sind immer 0, da ich mit Quarz 115200, 230400 und 
auch 921600 probiert habe. Nur mit 115200 klappt's mit Quarz fehlerfrei.
Die 500000 funktionieren mit 8 MHz Takt aus dem internen RC - 
Oszillator.

Allerdings: Ein Blick ins richtige Datenblatt zeigt tasächlich dass 
3.3V maximal für 13 MHz erlaubt sind... Wie man sich doch täuschen kann.
Ich werde auf 11 MHz runtergehen und 460800 baud probieren.

Danke für euere Aufmerksamkeit!

von Spess53 .. (hardygroeger)


Lesenswert?

Hi

>Die 500000 funktionieren mit 8 MHz Takt aus dem internen RC -
>Oszillator.

Dann ändere mal mit Kältespray/Heißluft die Temperatur des Atmega.

MfG Spess

von Rainer W. (rawi)


Lesenswert?

Chris S. schrieb:
> Probiere 921.6K
> Mit normalem 16mhz Quarz sind 2mb möglich, internem osc 1mb.
> Rpi geht bis 4mbit.

Millibit wären kein Problem - alles eine Frage der Zeit, Darum geht es 
hier aber nicht. Quarzfrequenzen liegen eher einen Faktor 10^9 über dem 
von dir angegebenen Wert.

In deinem Beitrag offenbaren sich eklatante Defizite bei dem Umgang mit 
Maßeinheiten und ihren Vielfachen.

https://de.wikipedia.org/wiki/Vors%C3%A4tze_f%C3%BCr_Ma%C3%9Feinheiten

: Bearbeitet durch User
von Vanye R. (vanye_rijan)


Lesenswert?

> Derzeit habe ich kein Scope zur Hand und ich bin ratlos.

Verwende entweder Controller die einen fraktionalen Teiler
haben, oder aber achte darauf Bitclocks zu verwenden die
man aus dem Quarz auch runterteilen kann.

Und ja, es schadet wirklich nichts bei den ersten Bytes
mal ein Oszi zur Hand zu haben. .-)

Was mich aber wundert, wenn man sowas programmiert und sich
die Registerwerte ausrechnet, dann sollte man das eigentlich
merken. Wenn man faul ist und nur anderer Leute Libaries verwendet
dann sollte man Rueckgabewerte abfragen. Wenn eine Libarie solche
grobfalschen Werte setzt ohne einen Fehler zurueckzumelden oder
man zu faul ist sowas in seinem Programm abzufragen dann sollte
man daraus auch etwas lernen...

Vanye

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Harald schrieb:
> Ich werde auf 11 MHz runtergehen und 460800 baud probieren.

Genauer: 11,059200MHz

Siehe auch: http://www.hanneslux.de/avr/tipps/baudratenquarz.html

: Bearbeitet durch Moderator
von Bruno V. (bruno_v)


Lesenswert?

14.7456 MHz ist ein Quarz für die serielle Schnittstelle mit 
Vielfachen/Teilern von 115.2kBaud.

Wenn Du mehr willst, nimm 115.2kBaud * 2 (230.4), *4 (460.8) oder * 8 
(921.6)

von Monk (roehrmond)


Lesenswert?

Eventuell schwingt der Quarz nicht stabil. Das kann an den 
angeschlossenen Kondensatoren oder sonstigen Leitungskapazitäten liegen. 
Kommt auch vor, wenn man den Abblock-Kondensator an der Stromversorgung 
weg lässt.

von Monk (roehrmond)


Lesenswert?

Bruno V. schrieb:
> Wenn Du mehr willst, nimm 115.2kBaud * 2 (230.4), *4 (460.8) oder * 8
> (921.6)

So weit war er doch schon. Du bist nicht der Einzige, der das überlesen 
hat.

Die rein rechnerische Abweichung von der Baudrate durch den Takt-Teiler 
ist nicht sein Problem. Das muss noch etwas anderes im Argen sein.

Ich glaube auch nicht, dass die geringe Versorgungsspannung hier der 
Knackpunkt ist. Denn genau diese Kombination (3,3 Volt und 14.7456 MHz) 
habe ich schon öfters bei meinen Basteleien angewendet. Hat bisher noch 
nie Probleme gemacht.

: Bearbeitet durch User
von Monk (roehrmond)


Lesenswert?

Harald schrieb:
> Derzeit habe ich kein Scope zur Hand und ich bin ratlos.

Aber du kannst ein Foto vom Aufbau machen und uns mitteilen, welchen 
Quarz und welche Kondensatoren du an der Stelle verwendet hast.

von Jens M. (schuchkleisser)


Lesenswert?

Warum muss man für zwei Taster und zwei LEDs einen Coprozessor mit 
komplizierter anfälliger Ansteuerung implementieren?
Keine weiteren 2 IOs mehr über am RPi?

von Bruno V. (bruno_v)


Lesenswert?

Monk schrieb:
> Die rein rechnerische Abweichung von der Baudrate durch den Takt-Teiler
> ist nicht sein Problem. Das muss noch etwas anderes im Argen sein.

Wo hat er denn von der Gegenstelle geschrieben? Wenn es mit 500k klappt, 
dann auch mit 230.4.

Es gibt 2 typische Fehlermöglichkeiten:
 * Die Gegenstelle hat keinen Sio-Quartz
 * in einer der beiden Seiten hat sich ein off-by one-Fehler 
eingeschlichen.

Ich würde auf off-by one tippen. Teilerregister 16 statt 15.

von Harald (hasanus)


Angehängte Dateien:

Lesenswert?

Upload von Dateien scheint grad nicht zu klappen:

An internal Error has occured. If this problem persists, please contact 
the administrator of this website (webmaster@embdev.net).

Ein interner Fehler ist aufgetreten. Falls dieses Problem erneut 
auftritt, wende dich bitte an den Administrator 
(webmaster@mikrocontroller.net).

: Bearbeitet durch User
von Harald (hasanus)


Angehängte Dateien:

Lesenswert?

Der Upload ist derzeit nicht möglich?

von Harald (hasanus)


Angehängte Dateien:

Lesenswert?

Jetzt klappt's wieder.
Der problemlos funktionierende Vorläufer dieser Schaltung ist übrigens 
in brutalst möglicher dead bug construction gebaut. Nix mit möglichst 
kleinen Blockkondensatoren maximal 2.54mm vom UC entfernt und so.

von Monk (roehrmond)


Lesenswert?

Ich frage nochmal: Welchen Quarz verwendest du? Die genaue Modellnummer 
bitte.

von Harald (hasanus)


Lesenswert?

Verluste an mehreren Stellen. Mein Text zu den pdf ist auch verloren 
gegangen. Er war in etwa so:

Softwareseitig gibt's keinen Grund zum Zweifeln. Avr und rpi sprechen 
die gleiche Sprache. Die rechnerische Fehlerrate ist immer 0. Die 
Kommunikation klappt bei niedrigen Baudraten. Über 115200 stottert der 
avr bei Quarzbetrieb. Der wackelige RC - Takt jedoch schafft 500k ohne 
Probleme.

Ich habe einige Quarze bestellt um zurück in den spezifizierten Bereich 
zu kommen. Ich glaube auch nicht dass 1.3MHz Übertaktung schlimm sind, 
aber man weiß ja nie.

Beim Lesen des DBs fällt auf dass der 328pb nicht mehr den "full swing 
oscillator" hat. Es ist nur noch die störanfällige low power - Variante 
vorhanden. Nun ist der rpi räumlich nicht weit vom avr entfernt. Da er 
headless betrieben wird ist sein wifi ist immer eingeschaltet und eine 
potentielle Störquelle(?)

Allerdings hört sich der Quarztakt gut an - Frequenzen im Hörbereich 
sind sauber und konstant. Der RC - Oszillator klingt deutlich 
schlechter, kraziger, mit gar nicht seidigen Höhen und spürbar 
unschwarzen Bass!

von Harald (hasanus)


Lesenswert?

Monk schrieb:
> Ich frage nochmal: Welchen Quarz verwendest du? Die genaue Modellnummer
> bitte.

Es ist ein IQD LFXTAL012313 von Reichelt. Die Bürdekapazitäten sind 15p.

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

Was spricht gegen die 500 kBd mit den internen 8 MHz?

von Monk (roehrmond)


Lesenswert?

Harald schrieb:
> Es ist ein IQD LFXTAL012313 von Reichelt. Die Bürdekapazitäten sind 15p.

Im Shop steht, dass der Quarz 30 pF Lastkapazität braucht. Abzüglich 
geschätzter 10pF für die Leitungen und den AVR komme ich auf den Bedarf 
von 2 Kondensatoren mit jeweils 50pF.

Deine 15 pF sind davon weit entfernt.

von Thomas Z. (usbman)


Lesenswert?

Monk schrieb:
> Im Shop steht, dass der Quarz 30 pF
nicht so ganz....

Lastkapazität   16 pF steht im Shop die Werte passen also

von Monk (roehrmond)


Angehängte Dateien:

Lesenswert?

Monk schrieb:
> Im Shop steht, dass der Quarz 30 pF Lastkapazität braucht

Ich dachte, ich zeige mal wo ich die 30 pF her habe.

Nachtrag: Sorry, ich hatte den Screenshot von RS zu weit beschnitten. 
Jetzt korrigiert.

Thomas Z. schrieb:
> Lastkapazität   16 pF steht im Shop

Das wäre mir ehrlich gesagt auch lieber gewesen, weil 30 pF ungewöhnlich 
viel sind. Wo hast du denn die 16 pF gesehen?

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?


von Veit D. (devil-elec)


Lesenswert?

Harald schrieb:
> Die Stromversorgung des SBC erfolgt
> mittels eines 5V - Abwärtsregler. Der avr wird mit den 3V3 des rpi
> gespeist. Seine Peripherie besteht nur aus zwei Tastern und zwei LED.

Wenn du sowieso 5V zur Verfügung hast, warum dann den AVR mit 3,3V 
versorgen? Versorge ihn auch mit 5V und du kannst jeden Quarztakt bis 
16/20MHz verwenden. Du kannst alle Baudraten verwenden die vom Quarztakt 
abgeleitet Ganzzahlig teilbar sind.

Bspw. 16MHz Quarz, kannste bspw. 250k oder 500k Baudrate einstellen - 
0,0% Abweichung.

Auf der Seite vom RPI kann ich nichts dazu sagen, wie fein dieser 
konfigurierbar ist, er sollte dann auch 0% abweichen. Du suchst also den 
Größten gemeinsamen Nenner.  ;-)

: Bearbeitet durch User
von Harald (hasanus)


Lesenswert?

S. L. schrieb:
> Was spricht gegen die 500 kBd mit den internen 8 MHz?

Letztendlich nur die Temperaturdrift. Selbst wenn die Langzeitdrift nur 
+- 1% ist, so könnte unter ungünstigen Umständen (Geschlossenes Gehäuse, 
Sommersonne etc) der Temperaturgang zum Problem werden.

Die Idee war halt, nimm 'nen Quarz und alles wird gut. Spart Frickelei. 
Der avr hat ja einen Temperatursensor eingebaut, den könnte man zur 
Kompensation, also zum Nachtrimmen des RC - Oszillators nutzen...

Spaßeshalber werde ich mal den Kühlschranktest machen (Kältespray hab 
ich gerade nicht).

von Harald (hasanus)


Lesenswert?

Veit D. schrieb:
> Wenn du sowieso 5V zur Verfügung hast, warum dann den AVR mit 3,3V
> versorgen?

Die gpio des rpi arbeiten mit 3.3V, ohne Pegelwandelung bringt man die 
beiden nicht zusammen wenn der avr mit 5V läuft.

von Axel S. (a-za-z0-9)


Lesenswert?

Monk schrieb:
> Harald schrieb:
>> Es ist ein IQD LFXTAL012313 von Reichelt. Die Bürdekapazitäten sind 15p.
>
> Im Shop steht, dass der Quarz 30 pF Lastkapazität braucht. Abzüglich
> geschätzter 10pF für die Leitungen und den AVR komme ich auf den Bedarf
> von 2 Kondensatoren mit jeweils 50pF.
>
> Deine 15 pF sind davon weit entfernt.

Das ist doch albern. Selbst wenn er ein paar pF neben der optimalem 
Lastkapazität läge, wäre der Einfluß derselben auf die Schwingfrequenz 
des Quarzes doch eher marginal. Damit RS-232 wegen Timingproblemen 
aussteigt, braucht man Abweichungen in der Größenordnung von 10%. Nicht 
100ppm.

OK, der Quarz könnte mit der falschen Lastkapazität gar nicht 
anschwingen. Das würde er dann aber sofort merken.

von Bruno V. (bruno_v)


Lesenswert?

Harald schrieb:
> Avr und rpi sprechen
> die gleiche Sprache. Die rechnerische Fehlerrate ist immer 0.

Kannst Du das mit einem Oszi verifizieren?


> Die Kommunikation klappt bei niedrigen Baudraten.
Auch wenn es sich komisch anhört: die Baudrate ist fast egal. Da es 
offensichtlich keine Signal-Probleme gibt (es funktioniert ja mit 
500kBaud).

Es ist also eher Wahrscheinlich, dass Du einen Fehler bei den Teilern 
hast. Du kannst die Werte posten oder messen.

von Harald (hasanus)


Lesenswert?

Bruno V. schrieb:
> Es ist also eher Wahrscheinlich

Das ist eher unwahrscheinlich. Ich programmiere den avr in C++. Mittels 
consteval errechnet der compiler den ubrr (ich schätze das meinst du mit 
Teiler) und stellt mittels static_assert sicher dass die gewünschte 
Baudrate zur Taktfrequenz passt. Ist eine Abweichung vorhanden, so 
scheitert bereits die Kompilierung.

von S. L. (sldt)


Lesenswert?

Der 'Teiler' ist ja sehr klein, bei einem Versatz bzw. Fehler von 1 
ginge nichts mehr, anstatt

> es kippt regelmäßig nach ca 12 kB erfolgreicher Übertragung ein bit

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Axel S. schrieb:

> Lastkapazität läge, wäre der Einfluß derselben auf die Schwingfrequenz
> des Quarzes doch eher marginal.

Kommt drauf an, wieviel neben dem Optimum er liegt.

> Damit RS-232 wegen Timingproblemen
> aussteigt, braucht man Abweichungen in der Größenordnung von 10%.

Nein. Eher 6%. Und das gilt auch nur dann, wenn der Peer auf ein paar 
ppm die exakte Baudrate hat. Haben beide Teilnehmer Fehler, kann auch 
schonmal bei drei Prozent Abweichung auf einer Seite der Kuchen gegessen 
sein. Wenn halt die andere Seite auch 3% hat, nur in die andere 
Richtung.

> OK, der Quarz könnte mit der falschen Lastkapazität gar nicht
> anschwingen. Das würde er dann aber sofort merken.

Zwischen diesem Fall und dem Fall "läuft mit ein paar ppm Abweichung" 
existiert aber noch eine gewisse Bandbreite, in der der Quarz quasi 
"stottert". Das ist der eigentlich gefährliche Bereich, denn hier 
bemerkt man den Fehler des Taktgebers u.U. eben nur durch solche Effekte 
wie: UART funktioniert nicht richtig.

von Monk (roehrmond)


Lesenswert?

Thomas Z. schrieb:
>> Ich dachte, ich zeige mal wo ich die 30 pF her habe.

> ich diesen hier:
> 
https://www.reichelt.de/standardquarz-grundton-14-7456-mhz-iqd-lfxtal012313-p245415.html?CCOUNTRY=445&LANGUAGE=de

Oh, jetzt sehe ich, dass Reichelt mir einen ganz anderen gezeigt hat, 
obwohl ich die richtige Artikelbezeichnung eingegeben habe. Das habe ich 
nicht erwartet.

Wenn die Lastkapazität 16 pF sein soll, dann komme ich auf 22 pF 
Kondensatoren. Ich schätze mal, dass in diesem Fall die vorhandenen 15 
pF auch noch akzeptabel sind.

Axel S. schrieb:
> Das ist doch albern. Selbst wenn er ein paar pF neben der optimalem
> Lastkapazität läge, wäre der Einfluß derselben auf die Schwingfrequenz
> des Quarzes doch eher marginal.

Das sehe ich auch so. Allerdings sind 50 pF versus 15 pF mehr als "ein 
paar pF". Wie dem auch sei, das hat sich ja inzwischen geklärt.

Ob S. schrieb:
> Zwischen diesem Fall und dem Fall "läuft mit ein paar ppm Abweichung"
> existiert aber noch eine gewisse Bandbreite, in der der Quarz quasi
> "stottert". Das ist der eigentlich gefährliche Bereich, denn hier
> bemerkt man den Fehler des Taktgebers u.U. eben nur durch solche Effekte
> wie: UART funktioniert nicht richtig.

Deswegen hatte ich die Kondensatoren in Frage gestellt.

Harald schrieb:
> Allerdings hört sich der Quarztakt gut an - Frequenzen im Hörbereich
> sind sauber und konstant

Interessante Idee, das so (ohne Oszilloskop) zu verifizieren. 👍

: Bearbeitet durch User
von Harald (hasanus)


Lesenswert?

S. L. schrieb:
> Der 'Teiler' ist ja sehr klein

Genau.
Die uart - Initialierung ist bei 460800

 720:  88 e1         ldi  r24, 0x18  ; 24
 722:  80 93 c1 00   sts  0x00C1, r24  ; 0x8000c1 
<__TEXT_REGION_LENGTH__+0x7e00c1>
 726:  81 e0         ldi  r24, 0x01  ; 1
 728:  90 e0         ldi  r25, 0x00  ; 0
 72a:  90 93 c5 00   sts  0x00C5, r25  ; 0x8000c5 
<__TEXT_REGION_LENGTH__+0x7e00c5>
 72e:  80 93 c4 00   sts  0x00C4, r24  ; 0x8000c4 
<__TEXT_REGION_LENGTH__+0x7e00c4>

Für 921600 ist 0xC4 gleich 0. Im code fallen die letzten vier Befehle 
weg. Gcc ist schlau genug um zu wissen dass die Register nach dem Reset 
ohnehin 0 sind.

von Thomas Z. (usbman)


Lesenswert?

Monk schrieb:
> Wenn die Lastkapazität 16 pF sein soll, dann komme ich auf 22 pF
> Kondensatoren. Ich schätze mal, dass in diesem Fall die vorhandenen 15
> pF auch noch akzeptabel sind.

Die 15pf sind zwar etwas klein. Ich hätte da auch 22pf gewählt aber das 
passt soweit. Allerdings sagt Digikey für diesen Quarz auch 30pf und die 
haben dort auch ein einzelnes Datenblatt bereit gestellt. Nicht so ein 
generisches wie Reichelt

von Harald (hasanus)


Lesenswert?

Ob S. schrieb:
> Zwischen diesem Fall und dem Fall "läuft mit ein paar ppm Abweichung"
> existiert aber noch eine gewisse Bandbreite, in der der Quarz quasi
> "stottert"

Der Meinung war ich bis gerade eben auch. Jetzt sehe ich das etwas 
anders. Tatsache ist, am Quarz steht ein stabiler Sinus mit 2V pp an, 
gemessen mit 1:10 Teiler am Tastkopf. CPU und uart stört das Andocken 
der Tastkopfspitze am Quarz nicht, sie laufen weiter.
Jedoch kommt der uart ins Schleudern wenn ich den Anschluß mit dem 
Finger berühre. Die CPU läuft jedoch ungestört weiter.
Das untermauert OB S.' These des anspruchsvolleren uart, spricht aber 
auch gegen Oszillations - Probleme.

Ich habe eher den rpi im Verdacht: Mit geloopten tx/rx zeigt der rpi 
bereits ohne involviertern avr seltsames Verhalten. Die bislang nur mit 
meiner eigenen software festgestellten Übertragungsfehler zeigen sich 
auch mit anderen Programmen die die serielle Schnittstelle schreiben UND 
lesen. Ich habe https://github.com/cbrake/linux-serial-test.git 
probiert. Es schickt einfach Daten an rx, liest von tx und vergleicht 
sie. Das klappt bis 115200 immer, darüber hinaus treten bei 5% der 
Versuche Fehler auf.

von Bruno V. (bruno_v)


Lesenswert?

Ob S. schrieb:
> Nein. Eher 6%.

Bei 8 Datenbit + Parity, typischer Abtastrate 16-fach, Abtastung bei 7,8 
und 9 16tel und perfekter Leitung wird das Stop-Bit nach 10 + 7,8 und 
9 /16 Bitdauern abgetastet, wovon 2 "OK" sein müssen.

Es bleibt also eine Reserve von 6/16 Bit auf 168/16 bit. Damit sind es 
3,6%. Wenn beide falsch laufen, 1,8%. (Ich glaube, es kommt 
prinzipbedingt noch 1/2 16tel Bit dazu, das wären dann 3,3% bzw. 1,6%)

Wohlgemerkt, wenn die physikalischen Signal perfekt sind, 0 Jitter etc.

Bei 8-facher Abtastung und check bei 3,4,5 8tel kommt man rechnerisch 
auf 2/84 also 2,4 bzw. 1.2%.


Harald schrieb:
> Mittels
> consteval errechnet der compiler den ubrr (ich schätze das meinst du mit
> Teiler) und stellt mittels static_assert sicher dass die gewünschte
> Baudrate zur Taktfrequenz passt.

Es geht ja immer um beide Seiten. Für den RPI sind die 961k "krum". Miss 
einfach per Oszi beide Seiten nach, wenn Du die Möglichkeit hast.

von Axel S. (a-za-z0-9)


Lesenswert?

Ob S. schrieb:
> Axel S. schrieb:
>
>> Lastkapazität läge, wäre der Einfluß derselben auf die Schwingfrequenz
>> des Quarzes doch eher marginal.
>
> Kommt drauf an, wieviel neben dem Optimum er liegt.

Wenn die Schaltung derart auf Kante genäht ist, daß eine Änderung der 
Taktfrequenz um ein paar ppm den Unterschied zwischen "funktioniert" und 
"funktioniert nicht" ausmacht, dann ist sie ohnehin kaputt.

>> Damit RS-232 wegen Timingproblemen
>> aussteigt, braucht man Abweichungen in der Größenordnung von 10%.
>
> Nein. Eher 6%.

Ja toll. Das ist ja so viel besser! 10% zu 100ppm (und 100ppm sind schon 
unrealistisch hoch gegriffen) ist Faktor 1000. Und du willst mir jetzt 
damit kommen, daß es ja nur Faktor 600 ist?

Nein. Wenn trotz quarzstabilem Takt der UART spinnt, dann liegt das 
Problem woanders. Dann stimmt entweder der Realität nicht mit den 
Annahmen überein (Quarz falsch bedruckt?) oder in der Teilerberechnung 
stimmt was nicht. Ein beliebter Fehler ist off-by-one, das wurde ja 
schon gesagt. Auch auf den ersten Blick triviale Probleme, etwa GND 
Bounce sind möglich.

von Harald (hasanus)


Lesenswert?

Bruno V. schrieb:
> Für den RPI sind die 961k "krum"

Du meinst die 921.6k, die sind gerade für ihn, und er kann sie. Das 
zeigt

* Meine SW. Sie macht im realen Einsatz sehr wenig Gebrauch des uart. Es 
werden selten Nachrichten ausgetauscht, aber wenn es passiert soll es 
schnell, sicher und nachvollziehbar vonstatten gehen. Beim Senden stellt 
der rpi sicher dass das letzte byte der Meldung rausgegangen ist.

* Andere Programme, wie das oben verlinkte. Das arbeitet etwas anders, 
es schreibt und liest 1K - Blöcke und wartet bis die Blöcke komplett 
über rx reinkommen.

Beide Programme zeigen mit steigender Baudrate steigende Fehlerraten. 
Unterstellen wir mal dass meine hw und sw mangelhaft sind, wir lassen 
sie außen vor und machen den Idiotentest.

Ich nehme also den originalen rpi zero 2W, getrennt vom board, bestromt 
über USB, setze einen jumper über rx/tx, und sende 5 Sekunden lang mit 
921k Daten zu mir selbst.

Das klappt

/linux-serial-test -f -e -S  -p /dev/ttyAMA0 -b 921600 -i5 -o5
Linux serial test app
Flush RX buffer.
Stopped transmitting.
Stopped receiving.
Terminating ...
/dev/ttyAMA0: count for this session: rx=425994, tx=430115, rx err=0

mehrmals sogar. Doch früher oder später bekomme ich

./linux-serial-test -f -e -S  -p /dev/ttyAMA0 -b 921600 -i5 -o5
Linux serial test app
Flush RX buffer.
Error, count: 12316, expected 1c, got 22 c 8
/dev/ttyAMA0: count for this session: rx=12315, tx=16427, rx err=1

(Etwas zusätzliche CPU - Last erhöht die Chancen)

Ich erwarte 1c, bekomme aber 22.
Warum?

von Bruno V. (bruno_v)


Lesenswert?

Harald schrieb:
> Ich nehme also den originalen rpi zero 2W, getrennt vom board, bestromt
> über USB, setze einen jumper über rx/tx, und sende 5 Sekunden lang mit
> 921k Daten zu mir selbst.
>
> Das klappt

Du machst jetzt Witze, oder?

von Harald (hasanus)


Angehängte Dateien:

Lesenswert?

Nö. Is wirklich so. Ok, habe vergessen zu erwähnen dass noch eine Kamera 
angeschlossen ist. Man weiß ja nie...

von Bauform B. (bauformb)


Lesenswert?

Harald schrieb:
> Doch früher oder später bekomme ich
> ./linux-serial-test -f -e -S  -p /dev/ttyAMA0 -b 921600 -i5 -o5
[...]
> Error, count: 12316, expected 1c, got 22 c 8
> /dev/ttyAMA0: count for this session: rx=12315, tx=16427, rx err=1
> (Etwas zusätzliche CPU - Last erhöht die Chancen)

Da fehlt die Zeile mit "overrun = 156". Aus der schließe ich, dass diese 
Kombination von Hardware, Betriebssystem und Programm schlicht und 
einfach zu langsam ist.

von Bruno V. (bruno_v)


Lesenswert?

Harald schrieb:
>> Für den RPI sind die 961k "krum"
>
> Du meinst die 921.6k, die sind gerade für ihn, und er kann sie. Das
> zeigt

Der Witz war:

Harald schrieb:
> sende [...] Daten zu mir selbst

Für jeden Controller ist jede Baudrate "perfekt", wenn er mit sich 
selbst spricht.

Du hast 3 Probleme:
 * 961k ist für den RPI krumm
 * 500k ist für Deinen Quarz krumm
 * Du verlierst Zeichen beim Empfang.

Nichts davon kannst Du im Loop testen, weil A) es lokal keine 
Baudratenfehler gibt und B) der Sender ggf. langsamer sendet (oder im 
Gegenteil die TX-Interrupts Rechenleistung klauen)

Wenn Du trotzdem im Loop Fehler hast, dann musst Du die vorab beheben. 
Bei mindestens doppelter Baudrate oder Auslastung!

Wenn Du die Baudraten nicht misst (kein Oszi), dann kommen mögliche 
Konfig-Fehler noch hinzu.

Im Übrigen spricht auch nix dagegen, einen glatten Quarz zu nehmen, 
solange die gewünschten Baudraten mit dem RPI matchen. Mitlesen am PC 
ist kein Problem: Seriell-USB-Umsetzer können z.B. 1MBaud perfekt. Und 
wenn sie z.B. 250k nicht können, nimmt man einen zweiten RPI, der auf 
einer Baudrate horcht und das auf einer geeigneten (höheren) rauspustet.

von Harald (hasanus)


Angehängte Dateien:

Lesenswert?

Bruno V. schrieb:
> Für jeden Controller ist jede Baudrate "perfekt", wenn er mit sich
> selbst spricht.

Das ist schon klar. Ich unterstelle dem rpi einfach mal dass auch 921k 
rauskommen wenn ich die verlange, ansonsten rechne ich mit einem 
Fehlercode beim Konfigurieren.
Vor allem gehe ich davon aus dass Sende- und Empfangsrate identisch sind 
(unterschiedliche werden im code auch nicht angefordert).

Wie auch immer, ob nun 961k oder 921k6. Rpi und avr haben halten sich 
daran, siehe Oszillogramme. Ich habe also ein einziges Problem: ich 
bekomme sporadisch falsche Zeichen zum Lesen. Ich weiß nicht einmal ob 
sie falsch rausgehen oder beim Lesen kaputt gehen.

von Bruno V. (bruno_v)


Lesenswert?

Harald schrieb:
> Rpi und avr haben halten sich daran, siehe Oszillogramme.
Super. Die Werte sind perfekt.

> Ich habe also ein einziges Problem: ich
> bekomme sporadisch falsche Zeichen zum Lesen. Ich weiß nicht einmal ob
> sie falsch rausgehen oder beim Lesen kaputt gehen.

"Nicht rausgehen" würde einen SW-Fehler bedeuten, da i.d.R. die Daten 
einer Nachricht komplett vorliegen und der TX-Fertig-Interrupt solange 
aktiv bleibt,  bis das nächste Zeichen geholt oder errechnet worden ist 
und ins Sende-Register eingestellt wurde. Typischer Fehler wäre, wenn 
TX-Interrupt und Main gleichzeitig unveriegelt auf der Nachricht 
arbeiten.

"Nicht empfangen" passiert auch ohne SW-Fehler, einfach weil es an 
Rechenleistung fehlt (bei 1-Byte Fifo muss der Prozessor dauerhaft in 
weniger als 10µs reagieren).
Allerdings gibt es i.d.R. Flags, die das melden. Framing-Error oder 
Overrun. Zähle die einfach mal mit.

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.