Hallo,
ich möchte mit einem Atmega8 und einem CP2102 eine Kommunikation
zwischen Controller und PC aufbauen.
Benötigt man dafür einen externen bzw. Baudratenquarz oder genügt dazu
der interne RC-Oszillator des Mega8?
Es handelt sich nicht um ein industrielles Projekt, aber funktionieren
soll es schon...
Vielen Dank
Micha
Hallo, der ATmega8 bekommt vom vom CP2102 ein TTL-Signal mit einer
festen Baudrate. Um diese zu erkennen, braucht er einen genauen Takt. Du
kannst ausprobieren, ob der interne Takt ausreicht. Je größer die
Baudrate, je genauer muss der Takt sein.
Gruß Carsten
Carsten-Peter C. schrieb:> Je größer die Baudrate, je genauer muss der Takt sein.> Gruß Carsten
Das stimmt übrigens nicht.
Denn 5% Abweichung sind 5% Abweichung, egal ob die Baudrate 115kBd ist
oder 9600Bd. Und bei 5% Abweichng funktioniert die SIO nicht mehr
zuverlässig.
Braucht man nicht ausprobieren, die Grundrechenarten reichen um das zu
verstehen.
@TO: du kannst (zumindest beim FTDI) fast beliebige Baudraten
einstellen. D.h. du kannst den internen Oszillator benutzen, und dann
z.B. auf 10kB stellen statt theoretischer 9600. Aber dazu muss man eben
auch die tatsächliche Frequenz kennen...
Quarz (oder Resonator) machen Sinn wenn es ohne messen/einstellen
einfach funktionieren soll, auch bei verschiedenen Temperaturen.
Baudratenquarz muss es nicht sein, wenn du nur in deinem System bleibst.
16MHz und 100kB z.B.
Hallo, ich nutze genau diese Anbindung zum ATmega 1284. Läuft
problemlos. Das Zeitkritische ist der Eingang vom Atmega.
bei
2400 Bd dauert ein Takt 416 uS, bei 9600Bd noch 104 und bei 38400 nur
noch 26uS.
Die 5% Systemtakt bleiben immer gleich. Wie gesagt, probier es aus.
Gruß Carsten
Milliarden von Arduino-Platinen nutzen 8- und 16MHz-Resonatoren und
einen Seriell-zu-USB-Adapter mit einer Standarddatenrate, afaik 57600
oder 115200 baud.
Die würden da keinen Reso oder gar Quarz einsetzen, wenn es zuverlässig
ohne ginge...
Micha schrieb:> Benötigt man dafür einen externen bzw. Baudratenquarz oder genügt dazu> der interne RC-Oszillator des Mega8?
Du brauchst einen Quarz/Resonator, aber es muss kein Baudratenquarz
sein, denn der ATmega hat ausreichend flexible Vorteiler im UART, um
viele Baudraten zu erreichen. Daher gehen auch z.B. 8 MHz.
Oder einen Controller mit integriertem USB verwenden, welcher den Takt
aus dem USB-Signal rückgewinnen kann und somit keinen Quarz braucht, und
natürlich auch keinen CP2102...
Häuptling zappliger Wolf schrieb im Beitrag #6907752:
> Das stimmt vollkommen. Probiers aus!
Du vermischt zwei völlig verschiedene Probleme:
Frequenzabweichung und Teilerquantisierung
Wolfgang schrieb:> Du vermischt zwei völlig verschiedene Probleme:> Frequenzabweichung und Teilerquantisierung
Das ist der Knackpunkt: natürlich lassen sich für niedrigere Baudraten
einfacher Vorteiler finden, bei denen der Fehler rechnerisch mit
korrekter Taktfrequenz näher bei 0% Abweichung ist. Und dann hat man
auch eher kein Problem bei 5% Taktabweichung.
Wenn man für eine höhere Baudrate beim Vorteiler aber schon bei idealer
Quarzfrequenz 3% Abweichung hinnimmt und dann wegen des RC-Oszillators
noch 5% Abweichung dazu kommen, dann tickt die Übertragung noch
schneller aus.
Das Problem ist die "Baudratenabweichung bei idealer F_CPU" zuzüglich
der "Taktabweichung von dieser F_CPU".
Lothar M. schrieb:> Und dann hat man auch eher kein Problem bei 5% Taktabweichung.
5% Taktabweichung führt beim letzten Bit eines per UART übertragenen
Bytes zu einem Zeitfehler von fast eine halben Bit-Zeit. Da sähe ich
schon ein Problem.
Wolfgang schrieb:> Da sähe ich schon ein Problem.
Ja, latürnich. Deshalb schrieb ich ja "eher kein Problem". Aber
meinetwegen streich die 5% und denk dir 4% dorthin.
Der Witz ist trotzdem, dass beim Vorteiler, der theoretisch genau 9600/s
schafft diese neuerlichen 4% eben eher nichts ausmachen.
Aber wenn bei 115k/s der theoreische Fehler schon 3% sind und
zusätzlich noch 4% dazukommen, dann ist mit den resultierenden 7%
ziemlich sicher Schicht im Schacht.
Es kann natürlich auch sein, dass die 4% sich von den 3% abziehen und
die Baudrate dann beim RC-Oszillator nur noch 1% abweicht. Glück gehabt.
Micha schrieb:> Es handelt sich nicht um ein industrielles Projekt, aber funktionieren soll es
schon
Mache den Quarz einfach drauf und fertig. Falls Du keinen Quarz zur Hand
hast zumindest vorsehen. Tut ja auch nicht weh es einmal vorher ohne zu
probieren, falls keiner zur Hand.
> Benötigt man dafür einen externen bzw. Baudratenquarz oder genügt dazu> der interne RC-Oszillator des Mega8?
Um mal deine eigentliche Frage zu beantworten, RC-Oszillatoren sind in
aller Regel nicht genau genug um RS232 zuverlaessig laufen zu haben. Es
gibt Microcontroller wo der Hersteller die kalibriert oder
Kalibrierkonstanten im Flash mitliefert. Da kann man das machen solange
nicht gerade den kompletten industriellen Temperaturbereich ausnutzt.
Der Mega8 ist aber eine steinalte Kiste wo das sicherlich nicht geht.
Was du aber machen kannst wenn deine Kiste Slave ist, also zuerstmal
etwas empfangen muss bevor es selber sendet, du koenntest reinkommende
Bytes analysieren und dann passt du deine Baudrate darauf an.
Es muss im uebrigen nicht zwangslaeufig ein Quarz sein. Es gibt auch
noch Keramikresonatoren. Die sind nicht ganz so gut wie Quarze, aber
fuer RS232 genau genug.
Olaf
Wolfgang schrieb:> 5% Taktabweichung führt beim letzten Bit eines per UART übertragenen> Bytes zu einem Zeitfehler von fast eine halben Bit-Zeit. Da sähe ich> schon ein Problem.
Man könnte auch so wie früher 5 Datenbits und 1,5 - 2 Stop-Bits
verwenden um ein etwas entspannteres Timing zu haben.
Gruß Anja
Es ist aber auch so, dass kein UART Signal wirklich rechteckig ist. Die
Flanken der Signale sind mindestens ein bisschen abgerundet.
Je höher die Baudrate ist, umso stärker ist das Risiko, dass das Signal
bis zur Unkenntlichkeit verzerrt wird.
Abweichungen der Baudrate sind eine Komponente, Verzerrungen des Signals
eine weitere. Wenn erst beides Zusammen zur Fehlfunktion führt, bekommt
man den Eindruck, dass niedrige Baudraten weniger kritisch seien.
> Es ist aber auch so, dass kein UART Signal wirklich rechteckig ist. Die> Flanken der Signale sind mindestens ein bisschen abgerundet.
Ja, das ist ein guter und richtiger Einwand. Je nach
Uebertragungsstrecke (z.B Optokoppler) kann das auch extrem werden.
Es kann auch noch vom UART und dem Teilerverhaeltnis der Baudrate
abhaengen. Silabs hat in ihren MCUs teilweise Baudratengeneratoren wo
das Schieberegister Teil eines fraktionalen Teilers ist. Kennt ihr ja
bestimmt von fraktionalen PLLs. Wenn man dann eine Baudrate verwendet
die sich nicht gerade runterteilen laesst dann sind einzelne Bits
unterschiedlich lang, damit es im Mittel ueber das gesamte Datenwort
wieder passt.
Was mich aber an der ganzen Sache aber am meisten fasziniert, ich hab
bisher noch nie irgendein Dokument gefunden das sagt bis x% Prozent
Fehler ist okay, darueber ist kacke. Ich vermute mal das haengt
teilweise auch noch vom UART ab er am 1, 3 oder 5x abtastet und
bewertet. Aber trotzdem erstaunlich in einer Zeit wo es fuer jeden
Tuedelkram eine Norm und drei Vorschriften gibt.
Olaf
Olaf schrieb:> Was mich aber an der ganzen Sache aber am meisten fasziniert, ich hab> bisher noch nie irgendein Dokument gefunden das sagt bis x% Prozent> Fehler ist okay, darueber ist kacke.
Dann schau dir mal die Datenblätter der AVR in. Ich meine, dass in jedem
einzelnen drin steht, maximal 2% Abweichung in Ordnung gehen. Die gehen
dabei vom worst case aus, dass der AVR zum beispiel 2% darüber liegt und
der UART 2% darunter.
Exakter kann man das auch gar nicht sagen, weil man nicht genau weiß,
wann die Bits abgetastet werden. Das hängt nicht nur vom UART und seiner
Taktfrequenz ab, sondern auch von der Steilheit der fallenden Flanke des
Start Bits und der Schaltschwelle auf LOW Pegel, die ist ja nur sehr
grob spezifiziert.
Purzel H. schrieb:> Was soll das Gezerre um einem Quarz, den gibt es fuer um die 20 cents.
Plus Kondensatoren, Plus zwei Pins, und er erhöht das Ausfallrisiko, vor
allem bei Stößen.
Stefan ⛄ F. schrieb:> Purzel H. schrieb:>> Was soll das Gezerre um einem Quarz, den gibt es fuer um die 20 cents.>> Plus Kondensatoren, Plus zwei Pins, und er erhöht das Ausfallrisiko, vor> allem bei Stößen.
Keramikresonator hat die Kondensatoren schon drin, ist robuster und
billiger.
Purzel H. schrieb:> Was soll das Gezerre um einem Quarz, den gibt es fuer um die 20> cents.
Im Zweifelsfall der Stromverbrauch. Ist kritisch mit Batterie.
Bei manchen CPUs kann man aber immer noch mit Uhrenquarz den internen RC
Oszillator kalibrieren. Ein Uhrenquarzoszillator braucht wesentlich
weniger Strom als ein schneller.
ups schrieb:> Bei manchen CPUs kann man aber immer noch mit Uhrenquarz den internen RC> Oszillator kalibrieren. Ein Uhrenquarzoszillator braucht wesentlich> weniger Strom als ein schneller.
Clever!
Olaf schrieb:> Was mich aber an der ganzen Sache aber am meisten fasziniert, ich hab> bisher noch nie irgendein Dokument gefunden das sagt bis x% Prozent> Fehler ist okay, darueber ist kacke.
Ich schon: https://www.maxlinear.com/appnote/dan108.pdf
Wobei hier die Abweichung der Sender- und Empfänger-Baud-Rate betrachtet
wird. Da sind voneinander abweichende Baud-Einstellungen und
Clocktoleranzen halt schon mit drin. Ist oben ja schon erwähnt worden.
Olaf schrieb:> Was mich aber an der ganzen Sache aber am meisten fasziniert, ich hab> bisher noch nie irgendein Dokument gefunden das sagt bis x% Prozent> Fehler ist okay, darueber ist kacke. Ich vermute mal das haengt> teilweise auch noch vom UART ab er am 1, 3 oder 5x abtastet und> bewertet.
Vor allem kann man es ausrechnen: Da das Bit üblicherweise mittig
abgetastet wird, darfst du maximal ein halbes Bit Versatz haben, bevor
die Leitung neu synchronisiert (und auch bei Überabtastung, z.B. 3x pro
Bit, wird einer der Abtastpunkte in der Mitte liegen und bei sauberem
Signal derjenige sein, bei dem die Erkennung kippt).
Bei der vermutlich meistverwendeten 8N1-Übertragung wird nach 10 Bits
(1x Start, 8x Daten, 1x Stop) neu synchronisiert. 0,5/10 sind 5%.
Jeder der Kommunikationspartner kann falsch liegen, also maximal 2,5%
Abweichung pro Kommunikationspartner, und um etwas auf der sicheren
Seite zu liegen, nennt man meist maximal 2%.
Wie Anja schon richtig schrieb: Mit weniger Datenbits wird die
tolerierbare Abweichung größer.
Und wenn man keine universellen Kommunikationsgeräte baut, sondern beide
Kommunikationspartner kennt, kann man statt 2x2% auch 0,1% und 3,9%
Abweichung zulassen. Ich weiß nicht, ob die Toleranz der Baudrate des
CP2102 spezifiziert ist, beim FT232R sind es 0,7%. Da kann man
allerdings auch den internen Oszillator des FT232R an einem Pin ausgeben
und als Takt für den Mikrocontroller nutzen...
MfG, Arno
ups schrieb:> Bei manchen CPUs kann man aber immer noch mit Uhrenquarz den internen RC> Oszillator kalibrieren.
Das kann man eigentlich bei jedem µC machen, sofern er über einen
getrennten Oszillator für einen Uhrenquarz verfügt, und zwar in
Software.
Was du meinst, sind die "Luxusteile", die einem das abnehmen und gleich
in Hardware abfackeln. Z.B.: AVRxxxDA/Byy.
> Ein Uhrenquarzoszillator braucht wesentlich> weniger Strom als ein schneller.
So ist es.
Olaf schrieb:> Ich vermute mal das haengt> teilweise auch noch vom UART ab er am 1, 3 oder 5x abtastet
Sowas gibt es nicht, üblich sind Abtastraten von 8 x oder bei guten
UARTs 16 x Bitrate. D.h. nach der Flanke des Startbits erfolgt die erste
Abfrage nach 4 Takten (Mitte des Startbits), danach nach 12 Takten
(Mitte des ersten Bits) usw. usw. (bei 16fach: nach 8, 24 usw.). Es gibt
auch UARTs, die in der Mitte eines Bits mehrfach, z.B. 3fach abtasten,
zur Sicherheit.
Nebenbei bemerkt, bei 1, 3 oder 5 Takten pro Bit kann man garnicht in
der Mitte eines Bits abtasten - teil mal 3 Takte in 2 gleiche Hälften.
Georg