Forum: Mikrocontroller und Digitale Elektronik ATtiny841 - Quarz notwendig wenn UART benutzt?


von Veit D. (devil-elec)


Lesenswert?

Hallo,

eigentlich wollte ich vom ATtiny841 den internen Oszillator verwenden. 
Nun habe ich im Wiki gelesen, dass man einen externen Quarz nehmen soll, 
wenn man die UART verwendet. Wegen Baudratenfehlern. Nur hat doch der 
841er einen stabilisierten internen Taktgeber laut Datenblatt.
Also, Quarz unbedingt notwendig oder nicht?

Ich bin derzeit verunsichert was ich machen soll.
Die UART soll mit 115kB/s betrieben werden oder noch schneller, soweit 
möglich. Auf der anderen Seite hängt ein µC mit 16MHz Resonator.

Wenn ja, macht es Sinn einen Baudratenquarz zu nehmen, wenn das 
Gegenüber keinen hat.

Wie läuft die Taktsyncronisierung überhaupt ab, wenn alle µC die später 
am Bus hängen immer leichte Taktabweichungen untereinander haben? Da muß 
doch die UART Funktionseinheit sich auf das gegenüber einstellen können. 
Los gelöst vom eigenen internen Takt.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

du kannst den Tiny ja auch Kalibrieren. z.b. anhand vom dem externen 
UART Daten.

Die Oszillator sind zwar stabil aber nicht zwingend genau.

> Wie läuft die Taktsyncronisierung überhaupt ab, wenn alle µC die später
> am Bus hängen immer leichte Taktabweichungen untereinander haben? Da muß
> doch die UART Funktionseinheit sich auf das gegenüber einstellen können.
> Los gelöst vom eigenen internen Takt.

beide Teinehmer müssen das gleiche Wissen darüber haben wie lange ein 
bit ist. Welcher Geschwindigkeit das "wirklich" entspricht spielt keine 
rolle.

Du kannst also auch mit 9600baud (nach Datenblatt) und einen falschen 
Quarz stabil Daten übertragen, wenn die gegenstelle denn gleichen 
falschen Quarz hat.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Da muß doch die UART Funktionseinheit sich auf das gegenüber einstellen
> können.

Das macht sie über die Erkennung der Flanke des Startbits.

Der maximale Fehler ist folglich auch dadurch limitiert, wie weit
sich beide über die 10 Bits (bis zum Stopbit) voneinander zeitlich
entfernt haben.

Summa summarum, normalerweise genügt der interne RC-Oszillator der
AVRs für UART, aber es ist eben nicht über den Temperaturbereich und
über Exemplarstreuungen garantiert.

von S. Landolt (Gast)


Lesenswert?

Datenblatt

Table 25-2. Calibration Accuracy of Internal 8MHz Oscillator:
Factory Calibration  2.7 - 4.0 V,   0 °C - 85 °C:  2 %

Das sollte doch reichen, oder?

von Peter II (Gast)


Lesenswert?

S. Landolt schrieb:
> Das sollte doch reichen, oder?

oder auch nicht

http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART
[...]
Außerdem muss bei der Berechnung von UBRR geprüft werden, ob mit der 
verwendeten Taktfrequenz die gewünschte Baudrate mit einem Fehler von 
<1% generiert werden kann. Das Datenblatt bietet hier sowohl die Formel 
als auch Tabellen unter der Überschrift des U(S)ART an.
[...]

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

S. Landolt schrieb:
> Das sollte doch reichen, oder?

Ja, 2 % sollten genügen.  Das ist die übliche Toleranz, die man für
RS-232 als akzeptabel nimmt.  Allerdings muss man natürlich den
systematischen Fehler dabei mit einbeziehen, sofern man den nicht
durch Kalibrierung des RC-Oszillators auf eine „baudratenfreundliche“
Frequenz eliminiert.

von S. Landolt (Gast)


Lesenswert?

> ...systematischen Fehler...

Das stimmt, die 8 MHz lassen sich mit den oben genannten 115.2 kBd 
schlecht vereinbaren. Da aber nur mit einem anderen uC kommuniziert 
werden soll, ist man ja relativ unabhängig.

von Georg G. (df2au)


Lesenswert?

S. Landolt schrieb:
> Das sollte doch reichen, oder?

Um es mit Radio Eriwan zu sagen: Es kommt darauf an.

<dicker-daumen>
Ein Byte dauert 10 Bit. Am Ende des Bytes darf der zeitliche Versatz 
maximal ein halbes Byte betragen, weil unser UART nur einmal, nämlich in 
der Mitte des Bits, abtastet. Macht nach Adam Riese 5% zulässigen 
Fehler.
<dicker-daumen/>

Den Fehler müssen wir verteilen auf die Taktfrequenz und den nicht 
optimalen Teilerfaktor. Wenn es uns gelingt, eine Baudrate zu finden, 
bei der der Teilerfaktor ganzzahlig ist, können wir alles für den Fehler 
des Oszillators einsetzen.

Und noch etwas müssen wir bedenken: Auch der Partner ist unter Umständen 
nicht optimal im Takt. Wenn das auch nur ein RC-Oszillator ist, wird es 
etwas enger. Zurück nach Kölln: Et it noch immer jot jejange.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Georg G. schrieb:
> Ein Byte dauert 10 Bit. Am Ende des Bytes darf der zeitliche Versatz
> maximal ein halbes Byte betragen

Bit, nicht Byte. ;)

von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> eigentlich wollte ich vom ATtiny841 den internen Oszillator verwenden.
> Nun habe ich im Wiki gelesen, dass man einen externen Quarz nehmen soll,
> wenn man die UART verwendet. Wegen Baudratenfehlern. Nur hat doch der
> 841er einen stabilisierten internen Taktgeber laut Datenblatt.
> Also, Quarz unbedingt notwendig oder nicht?

Das kommt d'rauf an. Hauptsächlich darauf, mit welchen Schwankungen der 
Umgebungstemperatur du in deiner Anwendung rechnen musst, aber auch (in 
weit geringerem Maße) darauf, mit welchen Schwankungen der 
Versorgungsspannung.

Die entsprechenden Diagramme stehen, wer hätte es vermutet, natürlich im 
Datenblatt...

> Ich bin derzeit verunsichert was ich machen soll.
> Die UART soll mit 115kB/s betrieben werden oder noch schneller, soweit
> möglich. Auf der anderen Seite hängt ein µC mit 16MHz Resonator.

Nimm einen Quarz. Das spart dir einen Haufen Probleme, die du mit deinem 
Kenntnisstand nicht lösen kannst.

> Wenn ja, macht es Sinn einen Baudratenquarz zu nehmen, wenn das
> Gegenüber keinen hat.

Gerade dann. Jedenfalls wenn du keine Kenntnisse über das Innenleben des 
Peers hast oder gar Kontrolle darüber ausüben kannst.

> Wie läuft die Taktsyncronisierung überhaupt ab, wenn alle µC die später
> am Bus hängen immer leichte Taktabweichungen untereinander haben?

Garnicht. Es gibt bei einer UART keine Taktsynchronisation, genau das 
ist ihr Trick (z.B. gegenüber SPI), deswegen braucht sie keine 
Taktleitung.

Alles, was es gibt, ist eine einmalige (pro Datenwort) Synchronisation 
auf eine Flanke des Taktes. Das passiert an der Grenze zwischen 
IDLE-Zustand und Startbit. Und dafür, dass es immer einen IDLE-Zustand 
vor einem Startbit gibt, dafür sorgt das oder die Stopbit(s). Das ist 
nix anderes als die Definition einer Mindestdauer für den IDLE-Zustand.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Danke für die Nachhilfe.

Wie beim SPI wäre es doch eigentlich für alle einfacher. Da hier der 
Takt mitgeschickt wird. Es gäbe keine Abweichungen. Man müßte auf nichts 
achten.

Ich fasse zusammen. Man kann es mit dem internen probieren.
Vermutlich klappt es nicht stabil genug auf Dauer.
Zum nachkalibrieren fehlen mir die Mittel.
Besser wäre ein externer Quarz. Hier könnte ich gleich einen 
Baudraten-Quarz verwenden um den Fehler so klein wie möglich zu halten.
Der andere µC kann sein 16MHz Resonator behalten?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Wie beim SPI wäre es doch eigentlich für alle einfacher.

Nein: mehr Strippen.

von S. Landolt (Gast)


Lesenswert?

Wenn sonst nichts dagegen spricht, würde ich die Kommunikation auf z.B. 
250 kBd einstellen und den internen Oszillator des ATtiny841 verwenden, 
dieser ist ab Werk hinreichend genau und stabil.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

gibt es auch Baudraten Resonatoren?
Dann könnte ich den einen austauschen.
Habe bisher nur Quarze gesehen.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Veit D. schrieb:
> Zum nachkalibrieren fehlen mir die Mittel.

was meinst du damit? Ist doch nur eine Software frage.

von drömel (Gast)


Lesenswert?

S. Landolt schrieb:
> Wenn sonst nichts dagegen spricht, würde ich die Kommunikation auf z.B.
> 250 kBd einstellen und den internen Oszillator des ATtiny841 verwenden,
> dieser ist ab Werk hinreichend genau und stabil.

Aber nur, wenn sonst nichts, auch nicht das bisher diskutierte, dagegen 
spricht. Wenn es dann nicht geht, muß man doch etwas anderes machen, 
weil das Werk vielleicht doch nicht hinreichend genau war oder/und es 
mit dem 16MHz des anderen µC nicht paßt.

von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> Wie beim SPI wäre es doch eigentlich für alle einfacher. Da hier der
> Takt mitgeschickt wird.

Nur nicht für den "Strippenzieher", denn der muss eine Leitung mehr 
ziehen.

Aber d'rauf geschissen. Das Ding beim AVR heisst ja nicht UART, sondern 
USART. D.h.: wenn deine Anwendung sagt, es wäre cleverer zusätzlich 
den Takt zu übertragen, dann kannst du auch das machen, weil die USART 
auch einen synchronen Modus unterstützt. Bloß muss dann halt auch der 
Peer dazu in der Lage sein...

> Ich fasse zusammen. Man kann es mit dem internen probieren.
> Vermutlich klappt es nicht stabil genug auf Dauer.
> Zum nachkalibrieren fehlen mir die Mittel.
> Besser wäre ein externer Quarz. Hier könnte ich gleich einen
> Baudraten-Quarz verwenden um den Fehler so klein wie möglich zu halten.

Ja. Wobei vor "Fehler" das Wörtchen "systematisch" zu ergänzen wäre...

Und was das Kalibrieren angeht: Da fehlen dir wohl nicht die Mittel (AVR 
und Quarz hast du ja offensichtlich bzw. kannst du leicht beschaffen), 
sondern eher nur die Fähigkeiten...

> Der andere µC kann sein 16MHz Resonator behalten?

Wen du das Glück hast, dass der sich an die Standards hält (wie auch 
immer er das intern realisiert): Natürlich! Ja! Das genau ist der Sinn 
von Standards...

Und wenn er das nicht kann, kannst du wenigstens nachweisen, dass der 
Peer Schuld ist. Auch das ist der Sinn von Standards. Bei 
Inkompatibilitäten möglichst klären zu können, wer Schuld ist.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

reine Software zum kalibrieren?
Ich dachte jetzt man benötigt einen Referenztakt zum Abgleich.
Hast du einen Link zur einer solchen Software, falls Freeware?

Wegen Takt und Abweichung zur UART. Hab mal ins Datenblatt geschaut.
http://www.atmel.com/Images/Atmel-8495-8-bit-AVR-Microcontrollers-ATtiny441-ATtiny841_Datasheet.pdf
Seite 179.

Der interne Oszillator läuft ja mit 8MHz.
Falls meine Verbindung mit 250kBaud läuft, wäre der Fehler doch 0%.
Würde wunderbar passen. Oder nicht?
Das nächst kleinere wäre 38,4kBaud

von Peter II (Gast)


Lesenswert?

Veit D. schrieb:
> Ich dachte jetzt man benötigt einen Referenztakt zum Abgleich.
hast du ja, die Gegenstelle.

Die kannst die Bit-zeit der Gegenstelle messen und den Teiler so 
einstellen, das die gleich bist. Schon kannst du mit der gegenstelle 
Daten austauschen.

Recht einfach geht das, wenn die Gegenstelle etwas sendet ohne das du 
vorher etwas hinschicken musst.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> gibt es auch Baudraten Resonatoren?

Ja, na klar.

von S. Landolt (Gast)


Lesenswert?

> Das nächst kleinere wäre 38,4kBaud
Wenn Sie auf Standard angewiesen sind, ja. Ansonsten steht es Ihnen doch 
frei, auch z.B. 125 kBd zu verwenden.

> gibt es auch Baudraten Resonatoren?
Wenn es schon etwas Externes sein soll, weshalb kein Quarz?

von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> reine Software zum kalibrieren?
> Ich dachte jetzt man benötigt einen Referenztakt zum Abgleich.

Genau. Und den kann man mit einem AVR mit Quarz wirklich spielend leicht 
erzeugen, jedenfalls mit einer für den Zweck der Kalibrierung eines AVR 
mit RC-Oszillator völlig hinreichenden Genauigkeit der Referenz. Man 
kann aber natürlich auch völlig andere Taktquellen als Referenz 
benutzen, z.B. USB-Frames eines PC o.ä. Der Vorteil der selbst 
produzierten Referenz ist, dass man sie sehr leicht an die verfügbare 
Rechenleistung des zu kalibrierenden Ziels anpassen kann.

> Der interne Oszillator läuft ja mit 8MHz.
> Falls meine Verbindung mit 250kBaud läuft, wäre der Fehler doch 0%.

Ja. Der systematische Fehler wäre dann 0. Und natürlich würde man, wenn 
diese Daten gelten, auf der anderen Seite keinen "Baudratenquarz" 
verwenden, sondern ebenfalls einen, dessen Nominalfrequenz ein 
ganzzahliges Vielfaches von 250000 ist, wobei das Vielfache mindestens 
8, besser 16 sein sollte. Also minimal entweder 2MHz oder 4MHz. Oder 
eben Vielfache davon, wenn die höhere Rechenleistung benötigt wird.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

hab weitergelesen. Wenn man den ATtiny, in meinem Fall, mit 5V betreibt, 
dann triftet der interne Takt deutlich ab. Man kann nur sinnvoll 
kalibrieren wenn man max. 3,3V Ub anlegt. Richtig verstanden?

Resonator, finde nur welche mit 7,37MHz.
Wenn laut Datenblatt mit 250kBaud der Fehler 0% beträgt mit 16MHz, dann 
wäre das doch ideal. Oder?

Kalibrierung. Wenn ich das richtig verstehe, läßt man ein Pin toggeln 
und misst mit Oszi die Frequenz und ändert das OSCCAL Register solange 
bis man einen Baudraten taugliche Frequenz hat. Zum Bsp. nahe der 
7,37MHz. Oder man vergleicht mit der PC Frequenz. Die Frage wäre wie 
genau ist diese. Nur wie oben schon gelesen, nur bis 3,3V Ub sinnvoll.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> hab weitergelesen. Wenn man den ATtiny, in meinem Fall, mit 5V betreibt,
> dann triftet der interne Takt deutlich ab. Man kann nur sinnvoll
> kalibrieren wenn man max. 3,3V Ub anlegt. Richtig verstanden?

Nein. Die Kalibrierung erfolgt sinnvollerweise mit genau der Spannung 
und Temperatur, die im Mittel bei der Zielanwendung vorliegt. Wobei das 
"Mittel" hier nicht unbedingt das arithmetische Mittel sein muss. 
Welches Mittel am sinnvollsten ist, kann man wiederum den weiter oben 
bereits erwähnten Diagrammen im DB entnehmen und dem eigenen Verständnis 
für die Bildung der verschiedenen denkbaren Mittelwerte...

> Kalibrierung. Wenn ich das richtig verstehe, läßt man ein Pin toggeln
> und misst mit Oszi die Frequenz und ändert das OSCCAL Register solange
> bis man einen Baudraten taugliche Frequenz hat. Zum Bsp. nahe der
> 7,37MHz.

So in etwa darauf läuft es hinaus. Man nimmt einfach den OSCAL-Wert, bei 
dem der Messwert der Kalibrierung die minimale absolute Abweichung vom 
Erwartungswert aufweist.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

okay, ich glaube jetzt habe das gerafft. Ansonsten frage ich nochmal 
nach.

Ach'so. Letzte Frage für heute. Die Kalibrierwerte im OSCCAL Register 
gelten nur für den internen Oszillator. Sobald ein externes 
Quarz/Resonator angeschlossen wäre und benutzt, spielt das keine Rolle 
mehr und man könnte damit auch nicht fein tunen?

von holger (Gast)


Lesenswert?

>Die Kalibrierwerte im OSCCAL Register
>gelten nur für den internen Oszillator.

Nur dafür.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

okay, vielen vielen Dank an alle.
Soweit ist es jetzt für mich verständlich gewurden.

von c-hater (Gast)


Lesenswert?

holger schrieb:

>>Die Kalibrierwerte im OSCCAL Register
>>gelten nur für den internen Oszillator.
>
> Nur dafür.

Leider ist das nicht ganz wahr. Bei den allermeisten AVR wird das 
interne Timing für die Programmierung von Flash und EEPROM aus eben 
diesem Takt des internen RC-Oszillators abgeleitet. Und die zuverlässige 
Funktion dieser Sachen ist leider recht eng daran gebunden, dass der 
Nominaltakt des RC-Oszillators nicht nennenswert überschritten wird.

D.h.: sobald man in der Anwendung Schreibzugriffe auf Flash oder EEPROM 
hat, muss man sich einen Kopp machen, zumindest wenn man den 
RC-Oszillator deutlich nach oben tuned.

Das ist besonders dann bedenkenswert, wenn man das Ergebnis einer 
Kalibrierung sinnvollerweise in's interne EEPROM schreiben will, um es 
beim nächsten PowerUp ohne Kalibrier-Referenz daraus lesen zu können.

Alles nicht so einfach...

von Stefan F. (Gast)


Lesenswert?

Die Kalibrierung des R/C Oszillator ist ganz leicht mit avrdude zu 
erledigen. Auszug aus der Manual Page:

-O Perform a RC oscillator run-time calibration according to Atmel 
application note AVR053. This is only supported on the STK500v2, AVRISP 
mkII, and JTAG ICE mkII hardware. Note that the result will be stored in 
the EEPROM cell at address 0.

Danach muss dein Programm lediglich den Wert von dieser Eeprom Zelle in 
das OSCCAL Register kopieren.

von Sebastian S. (amateur)


Lesenswert?

Ich würde es nicht mit der internen Tick-Tack versuchen. Schon gar nicht 
mit 115200 Baud.
Das Handbuch behauptet: 8,5% Fehler bei 8MHz. Wenn dann noch eine 
Ungenauigkeit von 2% durch "schlechtes Wetter" hinzukommt...

Anders ausgedrückt: 8MHz reichen nicht für diese Baudrate.

von Peter II (Gast)


Lesenswert?

Sebastian S. schrieb:
> Das Handbuch behauptet: 8,5% Fehler bei 8MHz.

und was ist mit der spalte daneben?

U2Xn = 1
-3.5%

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Die UART soll mit 115kB/s betrieben werden oder noch schneller
Vergiss das ohne Quarz. Ich hab das damals probiert, als ich mit den 
AVRs angefangen habe. Keine Chance eine stabile Kommunikation 
hinzukriegen. Selbst mit einem ungeeigneten Quarz sind solche hohen 
Baudraten schwierig. Irgendwo stand drin, daß 2% Fehler akzeptabel 
wären, bei meinem Aufbau damals war bei errechneten 2% Fehler schon 
keine sinnvolle Kommunikation mit dem PC mehr möglich. Mit einem 
Baudratenquarz lief das Ganze auf Anhieb stabil.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ben B. schrieb:
> Vergiss das ohne Quarz. Ich hab das damals probiert, als ich mit den
> AVRs angefangen habe. Keine Chance eine stabile Kommunikation
> hinzukriegen. Selbst mit einem ungeeigneten Quarz sind solche hohen
> Baudraten schwierig.

 2% Fehler bleibt 2% sowohl bei 9600B als auch bei 115KB.
 Problem liegt bei grösseren Geschwindigkeiten in internen 8MHz die
 einfach zu langsam sind für alles über 38,4KB.
 Das führt bei 115KB zu prozentuell grösseren Fehlern als bei 9600B.
 Nicht nur die Fehler aus der Tabelle, auch die Abtastfehler verursacht
 durch Temperaturschwankungen werden grösser. Jedes bit muss 16 mal
 abgetastet werden, 3 hintereinander folgende Samples (8,9 und 10)
 müssen derselben Wert aufweisen.
 Ergibt 4,86% max. Fehler bei 9 bits (Stoppbit nicht mitgerechnet).
 Geteilt durch 2 (Sender und Empfänger) ist das 2,43% Fehler bei
 jedem. Und diese Genauigkeit wird bei neueren AVRs ohne jeglichen
 Abgleich erreicht.


> Irgendwo stand drin, daß 2% Fehler akzeptabel
> wären, bei meinem Aufbau damals war bei errechneten 2% Fehler schon
> keine sinnvolle Kommunikation mit dem PC mehr möglich. Mit einem
> Baudratenquarz lief das Ganze auf Anhieb stabil.

 Das kann nicht sein, dann hast du wohl irgendetwas falsch gerechnet.
 Sogar mit doppeltem Fehler hätte es ohne Probleme klappen sollen.

von c-hater (Gast)


Lesenswert?

Marc V. schrieb:

>  Und diese Genauigkeit wird bei neueren AVRs ohne jeglichen
>  Abgleich erreicht.

Aber nur bei "Zimmertemperatur" (25°C).

Die Temperaturabhängigkeit ist leider auch bei den neueren Teilen immer 
noch so hoch, dass sich ein Einsatz in Umgebungen mit stärker davon 
abweichender Temperatur verbietet.

Problematisch ist dabei insbesondere Leistungselektronik auf der 
gleichen Platine bzw. im gleichen Gehäuse. Die braucht den µC bloss um 
20° aufheizen, dann kann schon Ende Gelände mit der UART-Kommunikation 
sein.

Zum Glück bieten viele neuere Teile auch einen internen 
Temperatursensor. Damit kann man den Effekt immerhin per Software 
hinreichend kompensieren.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Marc V. schrieb:
> Problem liegt bei grösseren Geschwindigkeiten in internen 8MHz die
>  einfach zu langsam sind für alles über 38,4KB.

So ist es.  Aber man kann die 8 MHz auch auf 7,37 MHz runterstellen
(per OSCCAL), dann gehen auch höhere „krumme“ Datenraten.

1 Mbit/s wiederum gehen auch mit 8 MHz (FTDI kann das bspw. als
Gegenseite).

von Peter D. (peda)


Lesenswert?

Georg G. schrieb:
> <dicker-daumen>
> Ein Byte dauert 10 Bit. Am Ende des Bytes darf der zeitliche Versatz
> maximal ein halbes Byte betragen, weil unser UART nur einmal, nämlich in
> der Mitte des Bits, abtastet. Macht nach Adam Riese 5% zulässigen
> Fehler.
> <dicker-daumen/>

Das ist falsch, es ist viel kritischer.
Schau mal ins Datenblatt:
Figure 19-7. Stop Bit Sampling and Next Start Bit Sampling
"A new high to low transition indicating the start bit of a new frame 
can come right after the last of the bits used for majority voting."

D.h. erst ab Takt 11 kann wieder ein neues Starbit erkannt werden. Wir 
haben also nur 5 Takte Spielraum. Und das macht:
5/160 = 3% maximal erlaubter Fehler.
Wenn wir dann noch den Worst-case annehmen, d.h. beide MCs weichen in 
entgegengesetzte Richtung ab, ist der maximal zulässige Fehler:
3% / 2 = 1,5%

Vergiß ganz schnell die 5%, da kommt nur noch Müll an.

von M. K. (sylaina)


Lesenswert?

Peter D. schrieb:
> Vergiß ganz schnell die 5%, da kommt nur noch Müll an.

Sehe ich auch so.

Aber mal ganz ehrlich: Ein Quarz samt Anschwingkondensator oder 
Resonator kostet nicht mal 50 Cent wenn mans einzeln kauft. Hätte ich 
erstmal keine Probleme damit und dafür ist die Kommunikation sicher 
gewährleistet.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

M. K. schrieb:
> Ein Quarz samt Anschwingkondensator oder Resonator kostet nicht mal 50
> Cent wenn mans einzeln kauft.

Kostet aber zwei zusätzliche Pins am Controller.

von Stefan F. (Gast)


Lesenswert?

Bei konstanter Temperatur und konstanter Versorgungsspannung und einer 
Baudrate, die der Takt-Teiler mit maximal 2% Abweichung erzeugen kann, 
funktioniert die serielle Schnittstelle zuverlässig.

Jedoch scheitert die Sache in der Praxis schon an der nicht konstanten 
Temperatur. Zum Ausgeben von Debug Meldungen mag der R/C Oszillator gut 
genug sein, für eine reale Anwendung empfehle ich jedoch, ihn nicht zu 
verwenden.

Bedenkt bei eurer Rechnerei auch, dass die Gegenstelle oft kein AVR ist, 
also ggf. andere Anforderungen an die Genauigkeit der Bitrate stellt. 
Außerdem verzerren die Leitungen und Pegelwandler das Signal.

von M. K. (sylaina)


Lesenswert?

Jörg W. schrieb:
> Kostet aber zwei zusätzliche Pins am Controller.

Das könnte ein Argument sein. ;)
Aber bzgl. Zuverlässigkeit: Einmal richtig machen oder sich immer wieder 
solchen Problemen, wie hier angesprochen, stellen…mir ist ersteres 
lieber.

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

vielleicht ging das unter. Ich verwende aktuell 250kBaudrate.
Derzeit unterhalten sich bei mir zwei Mega2560 mit 16MHz Resonator mit 
250k Baudrate ohne Probleme. Der Fehler liegt damit theoretisch bei 0%. 
Eine Adapterplatine zum testen für die attiny841 muß ich noch bauen. 
Darum die Frage ob besser mit oder ohne externen Quarz.

Was mir nun bewußt wurde durch den Thread hier ist folgendes. Den 
Taktgeber vom Mega werde ich nun nicht wechseln. Dafür kann ich den 
Oscillator vom ATtiny auf den Mega per Software abstimmen. Gebe ich dem 
ATtiny ein Quarz zur Seite muß ich mit einen unkorrigierbaren Fehler 
leben.
Richtig? Falsch?

Oder nun doch lieber externen Quarz? 8MHz wegen 250kBaudrate.
Am Geld liegt das nicht. Nur ob sinnvoll oder nicht.

Ich habe allerdings keinerlei Erfahrung wie sehr ein Resonator bei 
Temperaturänderungen driftet oder der interne vom ATtiny. Außer das was 
im Datenblatt steht, die Diagramme. Die µC werden in der Bude betrieben. 
Sind also nur den üblichen Temp.schwankungen ausgesetzt die man so zu 
Hause hat.

c-hater schrieb:
> Leider ist das nicht ganz wahr. Bei den allermeisten AVR wird das
> interne Timing für die Programmierung von Flash und EEPROM aus eben
> diesem Takt des internen RC-Oszillators abgeleitet. Und die zuverlässige
> Funktion dieser Sachen ist leider recht eng daran gebunden, dass der
> Nominaltakt des RC-Oszillators nicht nennenswert überschritten wird.
>
> D.h.: sobald man in der Anwendung Schreibzugriffe auf Flash oder EEPROM
> hat, muss man sich einen Kopp machen, zumindest wenn man den
> RC-Oszillator deutlich nach oben tuned.

Wenn man den internen sauber auf 8MHz fein tuned, dann sollte es keine 
Probleme geben? Weil das hier teilweise widersprüchlich geschrieben 
wird. Ich verstehe die Datenblattbeschreibung so, dass der 
Korrekturwert, wenn einmal im EEProm, immer automatisch verwendet wird. 
Man sich dann im Programmcode nicht mehr darum kümmern. Außer man möchte 
mittels Temp.messung den Takt ständig fein korrigieren.

Was ich aber nicht gerafft habe ist. Warum gibt es ein 
Korrektur-Register für den Takt und Temperatur getrennt? Das hängt doch 
sowieso alles zusammen und beeinflusst sich gegenseitig.

von uwe (Gast)


Lesenswert?

Die Gegenseite mit dem Quarz sendet z.B. ein 'U' = 0x55 = 0b01010101 in 
RS232 mit Start und Stopbit ist das dann 1010101010. jetzt mist du die 
periode von dem Signal mit tiny am RX pin und mußt halt wisssen mit 
welcher baudrate der andere µC gesendet hat. Und schon kannst du dir 
ausrechnen mit welcher Frequenz der interne Oszillator deines tiny 
läuft. damit kannst du dann entweder deie Baudraten teiler berechnen. 
Oder der mit dem Quarz einen Strom von 'U' und hört erst auf wenn eine 
Antwort vom tiny kommt. Der tiny mißt die Peride oder Flakenabstände und 
krrigiert die das OSCAL Register je nachdem nach oben oder unten merkt 
sich das OSCAL Register wenn ein 'U' empfangen wird korrigiert weiter in 
die gleiche richtung bis kein 'U' mehr empfangen wird merkt sich OSCAL 
und nimmt die mitte zwischen beiden OSCAL werten.

von Stefan F. (Gast)


Lesenswert?

> Wenn man den internen sauber auf 8MHz fein tuned, dann sollte
> es keine Probleme geben?

Du musst auch für eine konstante Chip-Temperatur sorgen, dann kann das 
ohne Probleme funktionieren.

von M. K. (sylaina)


Lesenswert?

Veit D. schrieb:
> Gebe ich dem
> ATtiny ein Quarz zur Seite muß ich mit einen unkorrigierbaren Fehler
> leben.
> Richtig? Falsch?

Wie kommst du denn auf das schmale Brett? Nimmst du den richtige Quarz 
hast du immer 0% Fehler.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Ich verstehe die Datenblattbeschreibung so, dass der Korrekturwert, wenn
> einmal im EEProm, immer automatisch verwendet wird.

Nein, der Korrekturwert wird von der Hardware beim Starten aus einer
Fuse-Zelle geladen, also ein EEPROM-Teil, der in der Fertigung des
ICs eingestellt ist.

Wenn du eigene Korrekturwerte benutzen und im EEPROM hinterlegen willst,
musst du dich schon selbst kümmern.

Stefan U. schrieb:
> Du musst auch für eine konstante Chip-Temperatur sorgen, dann kann das
> ohne Probleme funktionieren.

Wobei der ATtiny841 hier offenbar deutlich besser ist als frühere
AVRs.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ja, okay okay. Nur wozu dient das extra Temperatur-Register zum 
kalibrieren?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:

> ja, okay okay. Nur wozu dient das extra Temperatur-Register zum
> kalibrieren?

Offensichtlich haben sie jetzt noch eine Temperaturkompensation
eingebaut.  Dadurch können sie auch ±2 % über den gesamten Temperatur-
und Spannungsbereich zusichern.

Über die Details lassen sie sich nicht aus; ich würde vermuten, dass
die beiden Temperaturkompensationsregister ebenfalls beim Start aus
internen Fuses gelesen werden, wo sie während der Fertigung hinein
geschrieben werden.

von uwe (Gast)


Lesenswert?


von Paul B. (paul_baumann)


Lesenswert?

uwe schrieb:
> Die Gegenseite mit dem Quarz sendet z.B. ein 'U' = 0x55 = 0b01010101 in
> RS232 mit Start und Stopbit ist das dann 1010101010. jetzt mist du die
> periode von dem Signal mit tiny am RX pin und mußt halt wisssen mit
> welcher baudrate der andere µC gesendet hat.

Das ist eine schöne Idee. So habe ich das auch schon mit dem 
Logik-Anneliesator ausprobiert. Da sieht man ja schön, wie "lange ein 
Byte dauert"
und kann sich danach richten.

MfG Paul

von Veit D. (devil-elec)


Lesenswert?

Jörg W. schrieb:
> Veit D. schrieb:
>> Ich verstehe die Datenblattbeschreibung so, dass der Korrekturwert, wenn
>> einmal im EEProm, immer automatisch verwendet wird.
>
> Nein, der Korrekturwert wird von der Hardware beim Starten aus einer
> Fuse-Zelle geladen, also ein EEPROM-Teil, der in der Fertigung des
> ICs eingestellt ist.
>
> Wenn du eigene Korrekturwerte benutzen und im EEPROM hinterlegen willst,
> musst du dich schon selbst kümmern.
>
> Stefan U. schrieb:
>> Du musst auch für eine konstante Chip-Temperatur sorgen, dann kann das
>> ohne Probleme funktionieren.
>
> Wobei der ATtiny841 hier offenbar deutlich besser ist als frühere
> AVRs.

ich meinte doch ...
Wenn ich selbst kalibriere und einen eigenen Wert ins EEProm schreibe, 
dann nimmt er diesen immer automatisch ...
So verstehe ich das jedenfalls.


M. K. schrieb:
> Veit D. schrieb:
>> Gebe ich dem
>> ATtiny ein Quarz zur Seite muß ich mit einen unkorrigierbaren Fehler
>> leben.
>> Richtig? Falsch?
>
> Wie kommst du denn auf das schmale Brett? Nimmst du den richtige Quarz
> hast du immer 0% Fehler.

Weil der Mega einen Resonator hat und kein Quarz. Dann würde sich ein 
16MHz Resonator und ein 8MHz Quarz gegenüberstehen.
Wie sind denn die Toleranzunterschiede zwischen Resonator und Quarz 
überhaupt? Oder spielt das hier gar keine Rolle? Dann würde ich doch ein 
Quarz nehmen für den ATTiny.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

[gelöscht, war Mist :)]

Veit D. schrieb:
> Wenn ich selbst kalibriere und einen eigenen Wert ins EEProm schreibe,
> dann nimmt er diesen immer automatisch ...

An welcher Stelle willst du den im EEPROM genau hinterlegen?

> So verstehe ich das jedenfalls.

Ich nicht.  Von „EEPROM“ sehe ich da nur, dass der RC-Oszillator das
Timing von Flash- und EEPROM-Schreibzugriffen beeinflusst, weshalb
man ihn nicht schneller als 8,8 MHz drehen soll, falls man auf Flash
oder EEPROM in der Applikation schreiben möchte (interessanterweise
lässt sich dieser neue Oszillator ja ansonsten offenbar bis 16 MHz
ziehen, wird allerdings nicht garantiert).

: Bearbeitet durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Wie sind denn die Toleranzunterschiede zwischen Resonator und Quarz
> überhaupt?

10 : 1 bis 100 : 1

> Oder spielt das hier gar keine Rolle?

Ja, spielt bei RS-232 keine Rolle, dafür sind beide mehr als genau
genug.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

also wenn die Resonator vs. Quarz Differenzen keine Rolle spielen, dann 
nehm ich für den ATtiny nun doch einen 8MHz Quarz und gut ist.

Das kalibrieren interessiert mich dennoch. Forscherdrang. Werde 
wenigstens mal probieren. Ich würden den neuen Wert einfach ins OSCCAL 
Register schreiben. Mehr nicht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Ich würden den neuen Wert einfach ins OSCCAL Register schreiben.

Das kannst du tun.  Aber nach dem nächsten Reset steht dann an dieser
Stelle trotzdem wieder der Wert, der aus der zugehörigen Fuse gelesen
wird (die du nicht ändern kannst).

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ja, stimmt, dann habe ich das zu flüchtig überflogen. Ich dachte das 
Register liegt im EEprom und verwendet.
Aber nö, muß man per Software neu laden. Okay, ist auch kein Problem.
Danke für die Korrektur.


"The oscillator calibration register is used to trim the internal 8MHz 
oscillator and to remove process variations from the
oscillator frequency. A pre-programmed calibration value is 
automatically written to this register during chip reset, giving
the factory calibrated frequency specified in Table 25-2 on page 239.
The application software can write this register to change the 
oscillator frequency. The oscillator can be calibrated to
frequencies specified in Table 25-2 on page 239. Calibration outside 
that range is not guaranteed."

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Aber nö, muß man per Software neu laden.

Oder sich eben auf die ±2-%-Kalibrierung des Herstellers verlassen.
Deren Wert(e) wird/werden in der Tat automatisch geladen.

: Bearbeitet durch Moderator
von Sebastian S. (amateur)


Lesenswert?

Einige hier im Forum haben relativ große Probleme mit dem Rechnen.

>Wie kommst du denn auf das schmale Brett? Nimmst du den richtige Quarz
>hast du immer 0% Fehler.
Wie kommt der Poster auf die Idee, dass sogenannte Baudratenquarze 0% 
Fehler haben...

Fast Gebetsmühlenartig – sogar mit Zwischenrechnung in Takten - wird 
hier behauptet: 2 bis 3 % sollten erreichbar sein und dann Fehler 
unterdrücken. Schön, wenn die Gegenstelle dann auch auf 0% genau ist.

von holger (Gast)


Lesenswert?

>Auf der anderen Seite hängt ein µC mit 16MHz Resonator.

>Schön, wenn die Gegenstelle dann auch auf 0% genau ist.

Ist sie nicht. Resonatoren kommen auch nur mit bis zu 0.5% daher.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Sebastian S. schrieb:
> Wie kommt der Poster auf die Idee, dass sogenannte Baudratenquarze 0%
> Fehler haben...

Lass ihn 50 ppm Fehler haben (dann ist er schon eher schlecht), das
ist doch völlig schnuppe, das sind dann stolze 0,005 %.

(Außerdem ging's hier überhaupt nicht um Baudratenquarze, sondern um
solche mit „glatten“ Frequenzen, denn gewünscht sind 250 kbit/s.)

von Veit D. (devil-elec)


Lesenswert?

Hallo,

man sollte sich jetzt vielleicht nicht zu sehr in Details verzetteln. 
Nicht wegen mir.  :-)  Für mich reicht aus, dass der µC Takt und 250k 
Baudrate passen muß und paßt. Die nächstmögliche Baudrate wäre erst 
wieder 38,4k. Deutlich zu wenig.

Danke erstmal an alle.

von Norbert S. (norberts)


Lesenswert?

Moin,

ich habe mir die letzten 10-20 Beiträge nicht mehr reingezogen aber für 
sowas gibt es eine einfache Möglichkeit:

Sobald die Partner gestartet sind, sendet einer von Beiden (darf auch 
mit internem Oszi sein) ein Requestbyte, und zwar in einem festen Takt.
Z.B. alle 100ms oder wie es günstig mit Timern passt.
Der andere misst die Zeit zwischen den Bytes (Startinterrupt der Uart) 
und justiert danach selbst den internen Oszi (OSCCAL verstellen). Ob 
dieses Startbyte heil ankommt ist egal, es geht nur darum, wann es 
startet. Wenn es passt antwortet er mit einem OK-Byte und dann kann die 
normale Kommunikation starten. Dann kann man mit der Kommunikation 
laufend das OSCCAL nachführen.

Damit kann man den 8MHz Oszi auch auf die 7,XY Baudratenfrequenz 
verbiegen.

Gruß,
Norbert

: Bearbeitet durch User
von Norbert S. (norberts)


Lesenswert?

Marc V. schrieb im Beitrag #4616598:
> Nö, da bist du ja dauernd am Toleranzlimit.
>  Das macht man mit unterem und oberem Wert wo es gerade noch geht,
>  danach mit Mittelwert arbeiten.

Selber Nö ;-)
Ich meinte, wenn der verabredete Takt (z.B. 100ms) passt, nicht wenn der 
Inhalt vom Startbyte passt. Das hast Du vermutlich nur falsch 
verstanden.
Die Grenze wie genau man das hinbekommt ist eigentlich nur die Auflösung 
des OSCCAL.
(Achtung, das ist nicht immer stetig, Datenblatt lesen!)

Marc V. schrieb im Beitrag #4616598:
> Braucht man normalerweise nicht, so schlimm sind die Abweichungen
>  auch nicht.

Wenn der eine Partner einen Quarz hat und der andere den internen Ozsi 
und die Temperatur von -35 bis 60°C geht dann schon.
Lustigerweise haben auch einige interne Oszis gegensätzliches 
Temperaturverhalten. Sogar innerhalb einer Kleinfamile wie ATTiny 261, 
461, 861. -> Datenblatt GENAU lesen. Das ist wirklich ein fieses Detail, 
daß die drei sich dabei nicht gleich verhalten.

Ich habe sowas Ähnliches umgesetzt, allerdings mit anderen Bedingungen:
Der Master läuft mit Quarz, Kommunikation über I2C.
Der Slave, ein Tiny861, kann die Pins für den Quarz nicht entbehren, 
also interner Oszi.
Für ein anderes Timing brauche ich aber wenigstens 1-2% Genauigkeit, was 
über den obigen Temperaturbereich nicht drin ist.
Also wird jede Sekunde beim Telegramm vom Master das OSCCAL 
nachjustiert.
Funzt prima.

Gruß,
Norbert

von M. K. (sylaina)


Lesenswert?

Veit D. schrieb:
> Weil der Mega einen Resonator hat und kein Quarz. Dann würde sich ein
> 16MHz Resonator und ein 8MHz Quarz gegenüberstehen.
> Wie sind denn die Toleranzunterschiede zwischen Resonator und Quarz
> überhaupt? Oder spielt das hier gar keine Rolle? Dann würde ich doch ein
> Quarz nehmen für den ATTiny.

Spielt hier keine Rolle. Zum anderen: Das ist ja ein systematischer 
Fehler und solche Fehler kann man immer korrigieren, das ist wie beim 
ADC der Offset-/ Gain-Error und INL/DNL ;)

von Veit D. (devil-elec)


Lesenswert?

Hallo,

habe mir erstmal mit 2 Megas einen Frequenzgenerator und einen 
Frequenzmesser programmiert. Funktioniert. Fürs Grundverständnis. Jetzt 
gehts an die Testadapterplatine für den ATtiny841. Wenn ich im Layout 
den Quarz vorsehe mit den 22pF Keramik und verbaue, dann kann ich mit 
dem mkII Programmer jederzeit zwischen intern und extern umschalten und 
muß den Quarz nicht auslöten?

Edit:
übrigens gibts sogar von Atmel selbst eine Beschreibung zum Thema
AVR054: Run-time calibration of the internal RC oscillator
http://www.atmel.com/Images/doc2563.pdf

: Bearbeitet durch User
von Norbert S. (norberts)


Lesenswert?

Veit D. schrieb:
> Wenn ich im Layout
> den Quarz vorsehe mit den 22pF Keramik und verbaue, dann kann ich mit
> dem mkII Programmer jederzeit zwischen intern und extern umschalten und
> muß den Quarz nicht auslöten?

Jepp, kein Problem.

Gruß,
Norbert

von Georg G. (df2au)


Lesenswert?

Norbert S. schrieb:
> Jepp, kein Problem.

Genau das ist das Problem :-)

Er wäre nicht der erste, der einen Quarz verbaut und vergisst, auf ihn 
um zu schalten und sich dann wundert, dass die Frequenz daneben liegt.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

jetzt wird es ernster. Habe mir den rausgesucht.

https://www.conrad.de/de/quarz-hc494h-serie-crystal-euroquartz-8000mhz-hc494h-30504018pfatf-frequenz-8000000-mhz-b-x-h-x-t-1026-x-35-x-368-mm-156453.html

Jetzt noch eine Frage zu den beiden Kondensatoren.
Rein rechnerisch kann ich frei wählen zwischen 11pF und 59pF.
Praktisch werden immer 22pF verbaut.
Müssen die immer SMD sein oder kann ich auch "normale" 
Keramikkondensatoren verbauen? Wegen zusätzlichen störenden Kapazitäten 
o.ä. ?
https://www.conrad.de/de/keramik-kondensator-radial-bedrahtet-22-pf-100-vdc-5-holystone-rdcn220j101dka-1-st-531975.html

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Müssen die immer SMD sein oder kann ich auch "normale"
> Keramikkondensatoren verbauen?

Nein, müssen nicht SMD sein.

von M. K. (sylaina)


Lesenswert?

Veit D. schrieb:
> Müssen die immer SMD sein oder kann ich auch "normale"
> Keramikkondensatoren verbauen?

Auch normale gehen. Habe ich bisher fast immer benutzt.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

vielen Dank.   :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Rein rechnerisch kann ich frei wählen zwischen 11pF und 59pF.

Nein, du kannst da nichts „wählen“.  Die Lastkapazität wird durch
den Quarzhersteller vorgegeben (bzw. beim Bestellen beim Hersteller).

Dieser Quarz braucht 18 pF Lastkapazität.

Dabei ist zu beachten, dass die beiden Cs in Reihe geschaltet sind,
ihnen aber jeweils noch die Pinkapazität (und andere
Schaltungskapazitäten) parallel liegt.  Die ist nicht genau beziffert,
wenn du 8 … 10 pF ausgehst, liegst du sicher nicht total daneben.  Für
18 pF Last brauchst du folglich insgesamt 2 x 36 pF an den Anschlüssen.
2 Kondensatoren je 27 pF dürften diesen Wert einigermaßen plausibel
bringen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wie kommst du jetzt darauf?
Im Datenblatt zum Quarz ist eine Angabe von bis.
"Load Capacitance: 8pF to 32pF or Series (Specify)"

gelesen habe ich unter anderem hier wie man das rechnet:
https://www.mikrocontroller.net/articles/Quarze_und_AVR

und jeder scheint dennoch 2x 22pF zu verbauen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Im Datenblatt zum Quarz ist eine Angabe von bis.

Markiert mit “specify” (man muss sie also bei der Bestellung beim
Hersteller angeben).

In der Typennummer steht aber die Lastkapazität eindeutig beschrieben.
Allerdings gebe ich zu, die Beschreibung im Datenblatt, wie die
Typennummer aufgebaut ist, ist unter aller Sau.  Da fehlen einfach
Angaben, man muss daher raten, dass die "18PF" tatsächlich auch die
Lastkapazität sind.  Aber ansonsten passen die anderen Angaben der
Typennummer schon darauf.

> und jeder scheint dennoch 2x 22pF zu verbauen.

Nur, weil jeder bei Rot über die Straße läuft, wird es davon nicht
korrekt.

Sehr wahrscheinlich wird das Ding auch mit einer etwas geringeren
Lastkapazität wohl noch anschwingen, wie sie sich aus 2 x 22 pF
ergibt, aber das ist kein Grund, warum man es nicht korrekt machen
könnte, wenn man schon weiß, wofür der Quarz spezifiziert ist.

: Bearbeitet durch Moderator
von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich dachte der hat eine Produktionsstreuung von bis.
Okay, er hat ein CL von 18pF laut Bezeichnungsnummer.
Danke.
Dann ergibt sich laut Formel:
2x 18pF - 5pf = 31pF.

Also brauche ich 2x 31pF?
Also müßte ich 33pF nehmen, ist näher dran wie 27pF.
Oder weist du auch wie genau die 5pF als zusätzliche Rechenkapazität 
angenommen wurden?
Ginge nicht auch 1x 33pF und 1x 27pF?
Oder müssen beide Werte gleich sein?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Also brauche ich 2x 31pF?
> Also müßte ich 33pF nehmen, ist näher dran wie 27pF.

Das wird einigermaßen egal sein, so genau sch***t kein Hund.

> Oder weist du auch wie genau die 5pF als zusätzliche Rechenkapazität
> angenommen wurden?

„Hausnummer“ :)

> Ginge nicht auch 1x 33pF und 1x 27pF?
> Oder müssen beide Werte gleich sein?

Das Datenblatt des AVRs empfiehlt, beide möglichst gleich zu machen.

Wenn es wirklich extrem drauf ankommt (für eine Uhr also), dann hat
man auch schon mal einen als Trimmer ausgeführt, aber für deine
Anwendung dürfte es ziemlich egal sein.

Wie ich schon schrieb: sehr wahrscheinlich würden's auch die
„Allerwelts“-2x22pF tun, aber wenn man es genauer weiß, kann man
ja ruhig versuchen, das zu wählen, was auch tatsächlich zum Quarz
passt.

von Veit D. (devil-elec)


Lesenswert?

Hallo Jörg,

vielen Dank für die Unterstützung.

von Carsten R. (kaffeetante)


Lesenswert?

Wichtig ist ja nicht der Fehler zur idealisierten Datenrate, sondern der 
Fehler der Kommunikationspartner relativ zueinander. Wenn der Fehler zur 
idealisierten Datenrate in der gleichen Richtung liegt, hebt er sich 
(teilweise) auf. Sind die Abweichungen vom Idealwert mit 
unterschiedlichem Vorzeichen, so addieren sie sich.

Pro und Contra des synchronen Modus:

Der synchrone Modus kostet zwar einen Pin und eine Datenleitung, das 
sind aber nicht unbedingt Mehrkosten. Man hat oft Standardkabel, z.B. 
8-Adrig, und auch die MCUs haben Standardgehäuse. Das deckt sich nicht 
immer 100 % mit den Mindestanforderungen der Anwendung. Folglich sind 
oft die nötigen Ressourcen ohnehin vorhanden.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

muß nochwas nachfragen. In vielen Schaltplänen sieht man noch einen 
1MOhm Widerstand parallel zum Quarz. Wird aber auch weggelassen. Wofür 
dient dieser? Läuft der Schwingkreis damit noch sicherer an oder so?

von Dietrich L. (dietrichl)


Lesenswert?

Veit D. schrieb:
> muß nochwas nachfragen. In vielen Schaltplänen sieht man noch einen
> 1MOhm Widerstand parallel zum Quarz. Wird aber auch weggelassen. Wofür
> dient dieser? Läuft der Schwingkreis damit noch sicherer an oder so?

Siehe https://de.wikipedia.org/wiki/Pierce-Schaltung

Bei µCs ist der Widerstand (vermutlich) eingebaut.

von M. K. (sylaina)


Lesenswert?

Dietrich L. schrieb:
> Bei µCs ist der Widerstand (vermutlich) eingebaut.

eher weniger. Bei den meisten Quarzen genügt aber deren eigener, 
parasitärer, Widerstand.

von Dietrich L. (dietrichl)


Lesenswert?

M. K. schrieb:
> Dietrich L. schrieb:
>> Bei µCs ist der Widerstand (vermutlich) eingebaut.
>
> eher weniger. Bei den meisten Quarzen genügt aber deren eigener,
> parasitärer, Widerstand.

Ich habe mal einige Quarze durchgemessen: der (parallele) Ohmsche 
Widerstand war >20MOhm (Bereichsgrenze des Messgerätes).
Da würde ich als µC-Hersteller einen internen Widerstand spendieren, 
damit der Inverter der Oszillatorschaltung auch wirklich im 
Analogbereich arbeitet.

Allerdings habe ich auf die Schnelle nichts dazu bei den µC-Herstellern 
gefunden...

von M. K. (sylaina)


Lesenswert?

Dietrich L. schrieb:
> Allerdings habe ich auf die Schnelle nichts dazu bei den µC-Herstellern
> gefunden...

Wahrscheinlich weil es diesen internen Widerstand gar nicht gibt in den 
µCs die du so kennst ;)

Dietrich L. schrieb:
> Ich habe mal einige Quarze durchgemessen: der (parallele) Ohmsche
> Widerstand war >20MOhm (Bereichsgrenze des Messgerätes).

Kann man den so ohne weiteres mit nem Multimeter messen? Ich hab grade 
mal versucht zu schaun, mein Fluke legt grad mal 1 V Prüfspannung an bei 
1 MΩ. Reicht sowas denn um den parasitären Widerstand am Quarz richtig 
zu messen?

von Dietrich L. (dietrichl)


Lesenswert?

M. K. schrieb:
> Kann man den so ohne weiteres mit nem Multimeter messen? Ich hab grade
> mal versucht zu schaun, mein Fluke legt grad mal 1 V Prüfspannung an bei
> 1 MΩ. Reicht sowas denn um den parasitären Widerstand am Quarz richtig
> zu messen?

Warum nicht? Immerhin wird der Quarz auch nur mit wenig Spannung 
betrieben. Wenn da kein Strom fließt, kann der Oszillator-Inverter auch 
passend "vorgespannt" werden.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

im Datenblatt zum ATtiny ist keiner drin. Also weglassen?

von Dietrich L. (dietrichl)


Lesenswert?

Veit D. schrieb:
> im Datenblatt zum ATtiny ist keiner drin. Also weglassen?

Ja.

von Veit D. (Gast)


Lesenswert?

Danke schön.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dietrich L. schrieb:
> Bei µCs ist der Widerstand (vermutlich) eingebaut.

Nein: man braucht ihn dort einfach nicht.

Der Widerstand wird bei Digitalgattern benutzt, um sie in den
Analogbetrieb zu ziehen.

Bei einer expliziten Oszillatorschaltung baut man diese gleich so
auf, dass sie analog arbeitet.  Sowas ist dann in den Controllern
verbaut.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Die Tinys441 und 841 sind intern temperaturkompensiert. Hält man die 
Betriebsspannung konstant, ist der R/C sehr genau und stabil über einen 
weiten Temperaturbereich zu betreiben. OSCCAL stellt man passend für die 
gewünschte Baudrate ein, hierbei ist ein OSZI hilfreich oder eine 
genaue, temporäre externe Taktquelle zum Kalibrieren. BTDT. Einmal 
eingestellt ist bei einem Test mit Eisspray von Zimmertemperatur auf 
-40°C am OSZI bei der USART Bitbreite kaum eine Abweichung sichtbar 
gewesen. Probiert es aus. Quarz adé.

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Knut B. schrieb:
> bei einem Test mit Eisspray von Zimmertemperatur auf
> -40°C am OSZI bei der USART Bitbreite kaum eine Abweichung sichtbar

Naja, 2% Abweichung ist jetz auch nicht die Welt, bei einem 10 cm 
breiten Display sind das grad mal 0.2 cm Unterschied. Hast du die 
Bitbreite auch übers komplette Display gemessen oder "nur" über 2 divs? 
Bei 2 divs oder weniger wird man den Unterschied auch kaum wahrnehmen 
können.

Aber es stimmt schon, die AVRs im allgemeinen sind sehr 
temperaturstabil, meiner Erfahrung nach. Die allgemein angegebenen 10% 
Factoryset sind IMO sehr pessimistisch angegebenen.

von fronck (Gast)


Lesenswert?

M. K. schrieb:
> Aber es stimmt schon, die AVRs im allgemeinen sind sehr
> temperaturstabil, meiner Erfahrung nach. Die allgemein angegebenen 10%
> Factoryset sind IMO sehr pessimistisch angegebenen.

Was meinst du mit 10% Factoryset? Abweichúng von der Nennfrequenz? 
Frequenzdrift über einen Temperaturbereich? Frequenzdrift über einen 
Betriebsspannungsbereich?

von M. K. (sylaina)


Lesenswert?

Abweichung von der Nennfrequenz (von RC-Oszilator und Watchdog).

von Pandur S. (jetztnicht)


Lesenswert?

Entgegen den bisherigen Ausfuehrungen ist die Abweichung bei einem byte 
voellig unkritisch. Die Baudratenabweichung kommt bei laengeren 
Meldungen in den Fokus. Nehmen wir an, ich sende 50 (oder N) Byte am 
Stueck, ohne Abstand, was mit Windows Zufall ist, mit einem Controller 
aber machbar ist. Von diesen 50 (oder N) moechte man, dass alle richtig 
ankommen. und nicht die letzten falsch. Billigst UARTs, machen 
vielleicht 2 fach Oversampling, die besseren machen 16 fach 
Oversampling. Das ist alles Gut, erlaubt aber nicht in der Zeit zurueck 
zu gehen. Dh zu kurze Bytes sind weniger ein Problem, wie zu lange. Denn 
wenn das Stupbit frueher durch ist wie erwartet, wartet er auf das 
naechste. Eine Frage des Oversampling.

Daher. Zum Anpassen der Baudrate einen Block von vordefinierten Bytes 
senden und waehrend dem Frequenzveraendern schauen, wann Lesefehler 
auftreten.

Bisher nicht erwaehnt, die Baudratenquarze : man erkennt sie an der fast 
willkuerlich krummen Frequenzen. zB 1.8342 MHz, 3.6864MHz, 7.3728MHz, 
11.095MHz, 14.31818MHz. Einfach mal die Teilverhaeltnisse rechnen.

Und lasst das Gezeter wegen einem Quarz, ich bekomm die fuer 21Euro pro 
Hundert.

SPI ist keine Alternative. Abgesehen vom zusaetzlichen Faden. Und einem 
zusaetzlichen Kanal wenn ich ueber einen Treiber muss. Nein, das Problem 
ist der SPI Slave. Schon mal einen gemacht ? Wenn der Clock nicht passt 
... auch hier kommt das Versagen erst bei groesseren Blocklaengen. Und 
dann haben Controller mit SPI keinen Buffer. Entweder, das Byte wird 
abgeholt, oder es wird ueberschrieben. Wenn ich den SPI mit 
controllerclock laufen lasse, reichts nicht mal fuer einen Interrupt. 
Denn der Interrupt, auch ein SPI Interrupt, muss mindestens den PC und 
das status register push/pop-en und dann noch einen Sprung hin und 
zurueck ausfuehren. Dann kann man gleich auf das SPI Ready warten.
SPI Slaves machen eigentlich nur sinn in Hardware, dh als 
Schieberegister, alleine, oder in einem Chip mit zusaetzlich anderer 
Funktionalitaet, einem ADC oder so.

: Bearbeitet durch User
von Konrad S. (maybee)


Lesenswert?

Oh D. schrieb:
> Nehmen wir an, ich sende 50 (oder N) Byte am
> Stueck, ohne Abstand,

In dem Fall ist es ausreichend, wenn man mit zwei Stop-Bits sendet. Die 
Jungs, die sich das ausgedacht haben, waren ja nicht blöd.

von M. K. (sylaina)


Lesenswert?

Konrad S. schrieb:
> In dem Fall ist es ausreichend, wenn man mit zwei Stop-Bits sendet. Die
> Jungs, die sich das ausgedacht haben, waren ja nicht blöd.

Das solltest du dir nochmal in Ruhe überlegen...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

M. K. schrieb:
> Konrad S. schrieb:
>> In dem Fall ist es ausreichend, wenn man mit zwei Stop-Bits sendet. Die
>> Jungs, die sich das ausgedacht haben, waren ja nicht blöd.
>
> Das solltest du dir nochmal in Ruhe überlegen...

Die Fernschreiber funktionierten sogar mit 1,5 Stopbits zuverlässig.
Ist ja nur wichtig, dass die Stopbit-Zeiten so lange sind, dass auch
bei Drehzahlunterschieden beider Seiten die Welle im Empfänger
wirklich wieder anhält und dann auf das nächste Startbit warten muss,
statt einfach weiterzulaufen, was der Analogie der oben genannten
Byte-an-Byte-Sequenz entsprechen würde.

von M. K. (sylaina)


Lesenswert?

Jörg W. schrieb:
> Die Fernschreiber funktionierten sogar mit 1,5 Stopbits zuverlässig.

Ja, ich schrieb schon bewusst, dass man sich das nochmal "überlegen" 
sollte. Wenn man RTS/CTS benutzt ist das kein Problem, heutezutage, das 
ist meine Erfahrung, wird aber die serielle Schnittstelle meist nur noch 
mit RX/TX ausgeführt und das wars dann. Da ist es dem Sender dann egal, 
ob der Empfänger sagt, dass er Ready ist und dann werden die Zeiten doch 
etwas wichtiger werden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

M. K. schrieb:
> Wenn man RTS/CTS benutzt ist das kein Problem

Hatten die Fernschreiber auch nicht.

Wenn der Sender (infolge von 1,5 oder 2 Stopbits) langsamer sendet,
kann das doch für den Empfänger nie ein Problem sein.  Natürlich geht
die Netto-Datenrate um ein paar Prozent zurück.

von Georg G. (df2au)


Lesenswert?

M. K. schrieb:
> Wenn man RTS/CTS

Das ist eine der größten Stolperfallen bei serieller Übertragung. Da 
gibt es n+1 Definitionen zum Timing. Dagegen sind 2% Baudraten Fehler 
harmlos.

von M. K. (sylaina)


Lesenswert?

Wir stellen uns vor: Der Sender sei 2% schneller als der Empfänger. Nach 
dem 50. gesendeten Bit hat man dann schon einen Versatz von einem ganzen 
Bit. Und wie genau sollen dem langsamen Empfänger nun 1.5 oder 2 
Stoppbits helfen um keine Datenfehler zu bekommen? Dem schnellen Sender 
kommt er ja nicht hinterher, er kann sich nicht mit jedem neuen Startbit 
auf den Sender, der ohne Rücksicht auf Verluste sendet (Byte-an-Byte), 
synchronisieren eben weil er nicht schnell genug ist. Datenfehler sind 
hierbei, ohne weitere Maßnahmen, quasi vorprogrammiert.
Dein Beispiel mit dem Fernschreiber mag recht gut klingen, man muss aber 
bedenken, dass beim Fernschreiber das "Stoppbit" ein echter Stopp 
war/ist: Die Antriebe beider Fernschreiber wurden/werden 
gestoppt/angehalten, d.h. die Fernschreiber wurden/werden nach jedem 
Zeichen quasi synchronisiert sodass beim nächsten Startbit beide zur 
selben Zeit loslaufen. Bei der RS232 wie hier beschrieben haben wir 
diesen Vorteil jedoch nicht, der Clock beider RS232 läuft einfach für 
sich weiter, unabhängig von der Gegenseite.
Du hast natürlich recht, wenn der Sender langsamer ist, ist das kein 
Problem aber wie stellst du sicher, dass der Sender der Langsame ist bei 
RS232? ;)

: Bearbeitet durch User
von avr (Gast)


Lesenswert?

M. K. schrieb:
> Wir stellen uns vor: Der Sender sei 2% schneller als der Empfänger. Nach
> dem 50. gesendeten Bit hat man dann schon einen Versatz von einem ganzen
> Bit. Und wie genau sollen dem langsamen Empfänger nun 1.5 oder 2
> Stoppbits helfen um keine Datenfehler zu bekommen?

Und jetzt überlegst du nochmal, wann genau synchronisiert wird. Nicht 
einmal, nicht zweimal, sondern bei jedem Startbit. Es ist völlig egal 
wie viele Bits man sendet. Vor jedem Byte wird frisch synchronisiert.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

M. K. schrieb:
> Die Antriebe beider Fernschreiber wurden/werden gestoppt/angehalten

Nur der Empfänger.  Der Sender konnte, wenn man das nächste Zeichen
bereits tippte, durchlaufen.  Aus den Anekdoten der Urväter von Unix
kann man erfahren, dass normal geübte Schreiber durchaus für die
damaligen 110-Bd-TTYs schnell genug waren, als dass der Finger
bereits auf der nächsten zu drückenden Taste lag und drauf wartete,
bis die Mechanik diese freigab (daher sind Unix-Kommandos so kurz
gehalten worden ;-).

Genau dieses Resynchronisieren mit jedem Startbit macht eine UART
auch.  O.D.s Einwand war ja nur, dass sie, wenn der Sender etwas
langsamer als der Empfänger ist und nur ein Stopbit gesendet wird,
zwischendurch ja nicht anhalten muss.  Wenn der Empfänger Oversampling
macht und den verspäteten Übergang zwischen vorigem Stop- und neuem
Startbit sauber erkennt (und von da aus dann eine halbe Bitzeit weiter
geht für den Abtastpunkt), dann ist alles OK, aber wenn er nur einfach
feststellt, dass der Pegel des nächsten Startbits bereits anliegt und
im gleichen Takt weitermacht, dann verschiebt sich das allmählich.

Ist der Sender schneller, muss der Empfänger ja immer erst anhalten.

von c-hater (Gast)


Lesenswert?

M. K. schrieb:

> Wir stellen uns vor: Der Sender sei 2% schneller als der Empfänger. Nach
> dem 50. gesendeten Bit hat man dann schon einen Versatz von einem ganzen
> Bit. Und wie genau sollen dem langsamen Empfänger nun 1.5 oder 2
> Stoppbits helfen um keine Datenfehler zu bekommen?

Ganz einfach, weil der Empfänger sich dann alle 10,5 oder 11 Bits erneut 
auf den Anfang des nächsten Datenworts synchronisieren kann.

> Dem schnellen Sender
> kommt er ja nicht hinterher, er kann sich nicht mit jedem neuen Startbit
> auf den Sender, der ohne Rücksicht auf Verluste sendet (Byte-an-Byte),
> synchronisieren

Doch, genau das kann er und das tut er auch. Weil bei "Byte an Byte" des 
Senders jedes Byte halt nicht genau 10 Bit dauert, sondern länger, eben 
10,5 bzw. 11. Der Empfänger ist aber nach spätestens nach 10,02 Bit mit 
dem Empfang des Bytes fertig. Er hat dann also noch 0,48 bzw. 0,98 Bits 
Zeit, sich auf den Empfang des nächsten Bytes vorzubereiten.

Das kann doch nicht so schwer zu begreifen sein?!

von M. K. (sylaina)


Lesenswert?

c-hater schrieb:
> Weil bei "Byte an Byte" des
> Senders jedes Byte halt nicht genau 10 Bit dauert, sondern länger

Dann wäre der Sender aber der Langsamere von beiden und da sagte ich 
schon, dass es hier kein Problem ist zu Synchronisieren. Aber wenn der 
Sender der schnellere ist braucht der, aus Empfängersicht, vielleicht 
nur 9 Bit bis er mit dem nächsten Byte beginnt, dann wartet mein 
Empfänger noch auf das Stoppbit obwohl der Sender schon mit dem nächsten 
Byte begonnen hat.

Jörg W. schrieb:
> Ist der Sender schneller, muss der Empfänger ja immer erst anhalten.

Genau das meinte ich. Dass hier aber der Sender der langsamere sein 
sollte hab ich überlesen, sorry. Ich habe

Oh D. schrieb:
> Denn
> wenn das Stupbit frueher durch ist wie erwartet

so interpretiert, dass der Sender der schnellere ist.

von avr (Gast)


Lesenswert?

M. K. schrieb:
> Aber wenn der
> Sender der schnellere ist braucht der, aus Empfängersicht, vielleicht
> nur 9 Bit bis er mit dem nächsten Byte beginnt, dann wartet mein
> Empfänger noch auf das Stoppbit obwohl der Sender schon mit dem nächsten
> Byte begonnen hat.

Wenn man Start und Stoppbit als Bits betrachtet mag das stimmen, ich 
würde sie eher als zwei Flanken bezeichnen, die den UART-Rahmen 
bestimmen. Und wenn nach dem letzten Datenbit die "Stoppflanke" früher 
kommt, dann ist der Empfänger auch früher bereit den nächsten Rahmen zu 
empfangen.

von M. K. (sylaina)


Lesenswert?

avr schrieb:
> Wenn man Start und Stoppbit als Bits betrachtet mag das stimmen, ich
> würde sie eher als zwei Flanken bezeichnen, die den UART-Rahmen
> bestimmen. Und wenn nach dem letzten Datenbit die "Stoppflanke" früher
> kommt, dann ist der Empfänger auch früher bereit den nächsten Rahmen zu
> empfangen.

Kannst du das genauer erklären? Ich dachte, UART schaut nach den Pegeln, 
nicht nach Flanken. Und ich verstehe auch noch nicht so ganz wie der 
Empfänger früher bereit sein kann wenn z.B. das Stoppbit aus 
Empfängersicht schon bei Bitposition 8.7 beginnt schaut der Empfänger ja 
trotzdem erst ab Bitposition 9.0 ob das Stoppbit da ist und nicht 
früher, oder anders gesagt: Wenn das Stoppbit früher kommt als erwartet, 
woher weis dann der Empfänger, dass das ein Stoppbit ist und kein 
Datenbit?

von c-hater (Gast)


Lesenswert?

M. K. schrieb:

> Und ich verstehe auch noch nicht so ganz wie der
> Empfänger früher bereit sein kann wenn z.B. das Stoppbit aus
> Empfängersicht schon bei Bitposition 8.7 beginnt schaut der Empfänger ja
> trotzdem erst ab Bitposition 9.0 ob das Stoppbit da ist und nicht
> früher

Nein, er schaut nicht auf einer festen Bitposition, sondern 
üblicherweise mehrmals während der Dauer eines jeden Bits und fällt auf 
der Grundlage dieser Samples eine Entscheidung, welcher Pegel wohl 
gemeint war.

Das letzte dieser Samples gewinnt er typischerweise kurz vor dem 
nominellen Ende des Bits, das Ergebnis des Entscheidungsprozesses steht 
üblicherweise genau zum nominellen Bitende bereit.

Der Rhythmus der Abtastung ist grundsätzlich fest und starr an die 
Bitrate gekoppelt, also ein ganzzahliges Vielfaches selbiger. Die Lage 
der Abtastzeitpunkte während des Empfangs eines Datenworts ist 
ebenfalls starr und entspricht eben diesem Abtastrhythmus.

Der Trick bei der Synchronisation besteht nun darin, dass in dieser 
Phase (typischerweise "Idle" genannt, es wird also gerade nix empfangen) 
Abtastungen hinzugefügt oder verworfen werden können und damit praktisch 
das gesamte Abtastraster um Teile der Länge eines Bits verschoben werden 
kann.

Und das funktioniert so: Der Ausgangspunkt ist der H-Pegel, der dem 
Pegel eines Stopbits entspricht. Nun werden immer weiter Samples 
eingelesen, so lange, bis deren Auswertung ergibt, dass ein L-Bit auf 
der Leitung war. In dieser Phase spielt also die Zahl der gelesenen 
Samples keine Rolle, es müssen nur mindestens so viele sein, wie 
normalerweise in einem Bit gelesen werden, es dürfen aber beliebig 
viel mehr sein.

Wurde nun endlich ein L-Bit erkannt, tritt die Synchronisation ein. Das 
gelesene L-Bit wird als Startbit betrachtet und von nun an wird für 
jedes Bit immer die gleiche Zahl Samples verwendet und zwar bis 
einschliesslich des ersten Stopbits. Der eigentliche Witz ist: für einen 
Empfänger gibt es immer nur genau ein Stopbit, hat er das im Sack, 
wird er wieder Idle und er tritt damit in die Synchronisationsphase für 
das nächste Datenwort ein. D.h.: Wenn der Sender mehr als ein Stopbit 
sendet, verlängert das effektiv nur die Idle-Phase des Empfängers. Genau 
das gibt dem Empfänger die Chance, sich auch mit einem Sender zu 
synchronisieren, der schneller sendet, als er empfängt.

von M. K. (sylaina)


Lesenswert?

c-hater schrieb:
> Und das funktioniert so: Der Ausgangspunkt ist der H-Pegel, der dem
> Pegel eines Stopbits entspricht. Nun werden immer weiter Samples
> eingelesen, so lange, bis deren Auswertung ergibt, dass ein L-Bit auf
> der Leitung war. In dieser Phase spielt also die Zahl der gelesenen
> Samples keine Rolle, es müssen nur mindestens so viele sein, wie
> normalerweise in einem Bit gelesen werden, es dürfen aber beliebig
> viel mehr sein.

Also wäre die 2-Stoppbit-Variante eigentlich keine 
Byte-an-Byte-Übertragung sondern einen Byte-Pause-Byte-Übertragung und 
dem Empfänger ist es egal ob die Einstellung 1 oder 2 Stoppbits vorgibt? 
Das ist natürlich tricky.

c-hater schrieb:
> Der Rhythmus der Abtastung ist grundsätzlich fest und starr an die
> Bitrate gekoppelt, also ein ganzzahliges Vielfaches selbiger. Die Lage
> der Abtastzeitpunkte während des Empfangs eines Datenworts ist
> ebenfalls starr und entspricht eben diesem Abtastrhythmus.

Klingt nett, aber wenn es so funktioniert, warum soll dann beim UART die 
Einstellung maximal 1 bzw. 2% Abweichung nur haben (vgl. Artikel zum 
UART). Es müssten doch auch 5% dann funktionieren. Aus leidlicher 
Erfahrung weiß ich aber, dass schon ~2% problematisch werden können wenn 
viele Bytes hintereinander gesendet werden.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

M. K. schrieb:
> Also wäre die 2-Stoppbit-Variante eigentlich keine
> Byte-an-Byte-Übertragung sondern einen Byte-Pause-Byte-Übertragung und
> dem Empfänger ist es egal ob die Einstellung 1 oder 2 Stoppbits vorgibt?

So ist es. Der Empfänger kann nicht zwischen Pause oder einem 
zusätzlichen Stoppbit unterscheiden.

von Konrad S. (maybee)


Lesenswert?

M. K. schrieb:
> 2% Abweichung

Der eine ist 2% zu schnell, der andere ist 2% zu langsam ...

von Gästchen (Gast)


Angehängte Dateien:

Lesenswert?

Das kann man so pauschal gar nicht sagen.

Das hängt nämlich von den Teilnehmern, der übertragenenen Menge an Bits 
pro Startbit und den Eigenschaften der UART ab.

Der "Versatz" summiert sich über die Bits auf, bei 2% sind das bei 8 
Datenbits schon 18% beim 9.Bit. Dazu kommt ein gewisser Fehler bei der 
Erkennung der Flanke, der abhängig ist vom Oversampling - z.B. 1/16 (bei 
dem üblichen 16-fach Oversampling.
Dazu kommt der Fehler bei der Baudratengenerierung, zusätzlcih der des 
Empfängers.

Für den STM32 hab ich das mal angehängt (jaja, kein Tiny, aber das Bild 
war grad greifbar).

Nimmt man 2 STM32 mit je 2% Fehler, wird es bei 8 Bit schon fallweise 
eng. Aber: Oft hat ein Teilnehmer einen Quarz zur Verfügung - das 
entspannt die Sache natürlich.
Daher: Pauschale Aussagen sind hier gefährlich.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gästchen schrieb:
> Dazu kommt der Fehler bei der Baudratengenerierung

Einen statischen Fehler (durch nicht ideales Teilerverhältnis) musst
du natürlich in die 2 % mit einbeziehen, nicht nur die Schwankungen
der Frequenz.

von Gästchen (Gast)


Lesenswert?

Jörg W. schrieb:
> Gästchen schrieb:
>> Dazu kommt der Fehler bei der Baudratengenerierung
>
> Einen statischen Fehler (durch nicht ideales Teilerverhältnis) musst
> du natürlich in die 2 % mit einbeziehen, nicht nur die Schwankungen
> der Frequenz.

Ja, nur hier ist das halt grenzwertig:
Und wenn man jetzt hat:
2% Fehler am Clock Start
2% Fehler am Clock Ziel
1% Fehler in der Baudrate
--> 5% - natürlich nur worst case (also selten)

Über die 8 Datenbits sind das schon 45%. Da wird die UART schon 
aussteigen.
Das fiese ist: Baut man das so, funktionieren die Geräte dann bei 
Inbetriebnahme und Produktion natürlich einwandfrei - weil Kleinmengen 
(=Typisch passts ja!) oder 25° und so. Der Ärger geht draußen im Feld 
los, wenn es kalt oder warm wird.

Dann steht man da, draußen im Schnee, den Kunden im Genick, mit dem Oszi 
in der Hand.
Mir ist das schon passiert.

Nein, Daumenregeln sollte man hier wirklich nicht anwenden. Da kann ich 
nur abraten.

@Topic
Die 2% gelten nur für 0-70°, das ist schon klar?
Bei diesem Tiny gäbs die "user calibration" (Siehe Datenblatt) 
möglicherweise könnte man hier ansetzen?

von Helmut L. (helmi1)


Lesenswert?

Gästchen schrieb:
> Dann steht man da, draußen im Schnee, den Kunden im Genick, mit dem Oszi
> in der Hand.

Da waere es schoen noch einen Roehrenoszi zu haben zum aufwaermen:=)

von avr (Gast)


Lesenswert?

Gästchen schrieb:
> Über die 8 Datenbits sind das schon 45%. Da wird die UART schon
> aussteigen.

Eben nicht. Ein guter UART tastet in der Mitte ab und damit dürfen sich 
die Bits um bis zu einer halben Bitzeit verschieben. Praktisch sollte 
noch ein bisschen Reserve da sein, aber 2% Toleranz/UART kann man schon 
machen.

> Das fiese ist: Baut man das so, funktionieren die Geräte dann bei
> Inbetriebnahme und Produktion natürlich einwandfrei - weil Kleinmengen
> (=Typisch passts ja!) oder 25° und so. Der Ärger geht draußen im Feld
> los, wenn es kalt oder warm wird.

Dafür gibt es Temperaturtests, Berechnungen oder beides.

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

[...]

Eine Sache habe ich noch vergessen zu erwähnen:

Richtig gute Empfänger trennen sogar die Stopbit-Prüfung vom Mechanismus 
zur Resynchronisation, die sind also in Bezug auf das nächste zu 
empfangende Datenwort "idle" ab Ende des letzten Datenbits (oder ggf. 
Paritätsbits) des aktuellen Datenworts und nicht erst ab Ende von dessen 
obligatorischen StopBit.

Solche Empfänger können sich also auch auf schnellerere Sender 
resynchronisieren, wenn diese keine zusätzlichen Stopbits senden.

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.