UART mit R/C Oszillator

Gast #3486999
Lesenswert?

Es geht um Atmega und Attiny, kein konketer Typ.

Soweit mir bekannt ist, kann man den UART nicht gut mit R/C Oszillator 
nutzen, weil dessen Taktfrequenz nicht genau eingehalten wird und von 
der Temperatur abhängt.

Ich hatte mal ein Modem, das hat die Übertragungsrate der seriellen 
Schnittstelle automatisch eingestellt. Ich glaube, dazu hat es die 
Tatsache ausgenutzt, dass jeder Befehl mit AT beginnt.

Wenn ich nun ebenfalls die Möglichkeit habe, eine Sitzung mit einer frei 
programmierbaren Sequenz von Buchstaben einzuleiten, kann ich diese 
nutzen, um den R/C Oszillator zu kalibrieren?

Hat das schonmal jemand gemacht, wovon ich abgucken darf?
(Firma: KHTronik) #3487014
Lesenswert?

Hallo Stefanus,
bei den ATMega habe ich oft eine serielle Kommunikation mit dem internen 
Oszillator realisiert. Insbesondere wenn der Baudratenfehler (s. Tabelle 
im Datenblatt) klein bleibt und man sich mit 9600 oder vielleicht 19200 
Baud begnügt, ist das meist kein Problem.
Problematisch wird evetuell das Temperaturverhalten.
Grüße, Kurt
Gast #3487044
Lesenswert?

> Problematisch wird evetuell das Temperaturverhalten.

Ja eben, und genau diesem problem bin ich bereits mehrmals mit einer 
industriell gefertigten Schaltung (mit Xmega) begegnet. Deswegen suche 
ich nach einer Lösung.
#3487066
Lesenswert?

Das geht schon. Du kannst mit OSCCAL den internen RC etwas tunen.

Im Prinzip musst du nur die Breite eines Bits deiner Präambel messen 
(die natürlich passend sein muss, d.h. 10 oder 01. Der Vergleich aus 
Soll und Ist, sollte dir mitteilen wie du den RC verstellen musst. 
Entweder genau rechnen, oder schrittweise Anpassung bis es irgendwie 
passt.

gruß cyblord
Gast #3487159
Lesenswert?

Stefanus schrieb:
> Wenn ich nun ebenfalls die Möglichkeit habe, eine Sitzung mit einer frei
> programmierbaren Sequenz von Buchstaben einzuleiten, kann ich diese
> nutzen, um den R/C Oszillator zu kalibrieren?

Ist nicht nötig - nutze einfach das A von AT, dann funktioniert das auch 
mit anderer Software. Entweder wird ein Modem angesteuert, dann kommt 
als erstes AT, oder du gibst von Hand ein, dann tippst du eben selbst 
AT.

Gruss Reinhard
Gast #3488355
Lesenswert?

Danke für eure Tips. AVR054 beschreibt mehrere Lösungsansätze sehr 
detailliert. Das werde ich mir mal durchlesen.

Mir scheint der Ansatz logisch, die Breite eines Bits zu messen.

Wie warscheinlich ist es, dass der Sender, das Kabel oder schlicht die 
Schaltschwellen des AVR das Signal unsymmetrisch verzerren, so dass ein 
1-Bit länger dauert, als ein 0-Bit (oder umgekehrt)?

Ist es besser (sinnvoll), den Abstand zwischen zwei steigenden Flanken 
zu messen?
Gast #3488386
Lesenswert?

cyblord ---- schrieb:
> Warum? Die Methode via OSCCAL ist vom Atmel empfohlen um den RC zu
> kalibrieren , und führt gleichzeitig dazu, dass auch der restliche
> Controller korrekte Zeiten messen kann.

Naja, es ist eben etwas tricky mit OSCCAL zu hantieren, und abhängig vom 
Controller. Die Funktion von OSCCAL hat keine lineare Antwort, und ist 
auch nicht unbedingt monoton steigend.

Und wenn man wirklich genaue Zeiten messen will, ist man mit einem 
RC-Oszillator immer noch fehl am Platze, glaube ich. Denn die sendende 
UART, die man als Zeitbasis für die Kalibrierung nimmt, läuft ja auch 
nicht unbedingt supergenau...
#3488447
Lesenswert?

@ Stefanus (Gast)

>Ich hatte mal ein Modem, das hat die Übertragungsrate der seriellen
>Schnittstelle automatisch eingestellt. Ich glaube, dazu hat es die
>Tatsache ausgenutzt, dass jeder Befehl mit AT beginnt.

Hier muss man aber 2 Dinge unterscheiden.

1. Das Modem kennt zwar nicht die Baudrate, hat aber einen genauen 
Quarzoszillator. Hier muss "nur" die korrekte Baudrate erkannt werden. 
Was einfach dadurch geht, dass man solange diese mit den bekannten 
Baudraten verstellt, bis man sauber ein bekanntes Zeichen empfängt. Die 
minimale Pulsdauermessung geht hier auch und ist eher einfach, da die 
Baudraten sich stark unterscheiden, oft um Faktor 2!

2.) Das Modem/deiun AVR hat KEINEN genauen Oszillator und muss diesen 
anhand einer bekannten Baudrate kalibrieren. Hier ist das Problem, dass 
die Mess- und Kalibriergenauigkeit deutlich höter sein muss, im Bereich 
von 1% und weniger.

Solche Sachen macht man nur, wenn es ABSOLUT nicht anders geht. Aber es 
gibt viele Alternative.

1) Quarz verwenden, super einfach und auch nicht wirklich teuer
2) 32kHz Uhrenquarz verwenden und mit diesem den RC-Oszillator dynamisch 
kalibieren
3) RC-Oszillator manuell einmal kalibieren und den Temperaturbereich der 
Schaltung so wählen, dass die Drift nicht zu groß wird
4) RC-Oszillator manuell einmal kalibieren und durch periodische 
Temperaturmessung den RC-Oszillator nachstellen (kompensieren) So machen 
es viele moderne uCs, Z.B. C2000 von TI. Dort sind sogar die 
Kalibierwerte des Temperatursensors sowie des RC-Oszillators im OTP 
EEPROM gespeichert!
So macht es wahrscheinlich auch der FT232, der ohne externen Quarz eine 
Taktgenauigkeit von ca. 0,16% über den gesamten Temperaturbereich 
erreicht. Ein unkompensierter RC-Oszillator schafft sowas nicht.
Gast #3488475
Lesenswert?

Die Idee mit der Messung der AT-Sequenz ist gut aber...

Du musst dem System klarmachen, dass es eine ungenutzte oder 
unvollständige Sequenz verschickt, da Du diese ja verwendest. Was dem AT 
folgt ist dann aber meist nicht zu nutzen. Der Sender geht aber davon 
aus, dass dies der Fall ist.
Gast #3488487
Lesenswert?

Ach ja, die Temperatur....

Wenn ich den Oszillator kalibrietr habe, und dann die Schaltung in einer 
Sitzung wärmer wird, fällt irgendwann die Kommunikation aus. Das ist 
natürlich doof.

Der Ansatz, die Temperatur zu messen und die Oszillator dementsprechend 
anzupassen klingt verlockend. Aber dann brauche ich eine zusätzlichen 
Sensor, da kann ich gleich einen Quarz einsetzen - ist einfacher.

Vermutlich hat Falk Recht, ich sollte beim Quarz bleiben, sofern 
möglich. Die 50 Cent zu sparen war wohl eine Schnapsidee.
Gast #3488493
Lesenswert?

Stefanus schrieb:
> Der Ansatz, die Temperatur zu messen und die Oszillator dementsprechend
> anzupassen klingt verlockend. Aber dann brauche ich eine zusätzlichen
> Sensor, da kann ich gleich einen Quarz einsetzen - ist einfacher.

Manche Mikrocontroller haben einen eingebauten Temperatursensor, u.a. 
manche ATTinys. Der ist nicht unbedingt supergenau, aber für solche 
Zwecke wie RC-Kalibrierung sollte der reichen... ich denke dafür wird 
sowas auch eingebaut.
Gast #3488505
Lesenswert?

Hi

>Der Ansatz, die Temperatur zu messen und die Oszillator dementsprechend
>anzupassen klingt verlockend. Aber dann brauche ich eine zusätzlichen
>Sensor, da kann ich gleich einen Quarz einsetzen - ist einfacher.

Praktisch alle halbwegs neueren ATTinys mit ADC besitzen einen internen 
Temperatursensor. Trotzdem, nimm einen Quarz.

MfG Spess
#3488535
Lesenswert?

@ greg (Gast)

>> So macht es wahrscheinlich auch der FT232, der ohne externen Quarz eine
>> Taktgenauigkeit von ca. 0,16% über den gesamten Temperaturbereich
>> erreicht. Ein unkompensierter RC-Oszillator schafft sowas nicht.

>Ist es nicht wahrscheinlicher, dass der USB-Datentakt zur Kalibrierung
>verwendet wird?

Kann sein.
Gast #3488615
Lesenswert?

Was auf jeden Fall geht, wenn man keinen Vollduplex am UART benötigt:

Nun weiß ich nicht, ob alle UART-Typen es erlauben, aber z.B. der UART 
eines 8051 erlaubt einen Mode mit Simplex-Betrieb, wobei das Nutzsignal 
mit der Rx-Leitung geclockt wird, beliebig schnell oder langsam, 
unabhängig einer Baudratenfrequenz. In so einem Fall müßte die Software 
die Datenrichtungen jeweils umschalten, wenn man senden und empfangen 
will. Evtl. mit einer dritten Handshake-Leitung.
Gast #3488732
Lesenswert?

Amateur schrieb:
> Was dem AT
> folgt ist dann aber meist nicht zu nutzen. Der Sender geht aber davon
> aus, dass dies der Fall ist.

Das trifft nicht zu. Die Kalibrierung kann abgeschlossen sein, wenn das 
A empfangen ist, und alles Folgende läuft normal. Es ist daher auch egal 
welches AT-Kommando als erstes gesendet wird. Das war schon Stand der 
Technik bei den ersten Modems, wahrscheinlich sogar schon bei den 
Akustikkopplern, da wird man das doch auch heute noch hinkriegen.

Gruss Reinhard
Gast #3489384
Lesenswert?

Dummerweise sind die Tiny-µCs mit Temperatur-Sensor gerade
nicht mit einer UART ausgestattet...

Da kommt zu einer stundenlangen Kalibriertabellen-Erstellung
auch noch der Aufwand einer Soft-UART dazu.

Für die Tabellen-Erstellung reicht ja die Messung einer
Standardfrequenz - trotzdem muss man die Temperaturkurve
langsam genug (< 1 K/Minute) durchfahren, um verlässliche
Ergebnisse zu erhalten. Und das für jedes µC-Individuum!

Lohnt das, wenn noch genug µC-Pins frei sind????
#3489581
Lesenswert?

Wenn es irgeneine Moeglichkeit gibt den Oszillator so zu programmieren, 
dass er ueber den gewuenschten Temperaturbereich und die erforderlichen 
Taktraten weniger als 2,5% von der Zieltaktrate abweicht, dann wird das 
auch zuverlaessig funktioneren, sofern man diese Moeglichkeit findet.

Temperaturverhalten und Kalibrierung sind sehr unterschiedlich von den 
Herstellern, ein genauerer RC-Oszillator braucht entweder ein besseres 
Design oder mehr Chipflaeche -> teurer herzustellen. Meist trifft beides 
zu. Dazu kommt noch Testerzeit in der Fertigung. Um einen Oszillator 
moeglichst genaue zu kalibrieren braucht es mehrere Iterationen, viele 
Millisekunden Testerzeit. Das kostet echtes Geld.

Also nochmals Datenblaetter auf die 2,5% hin lesen und falls die Option 
besteht mal R/C Oszillatoren von Silicon Labs oder NXP vergleichen. Da 
geht es problemlos, was du machen moechtest.

Robert

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren