Hallo,
den internen Oszilator kann man, z.B. beim ATtiny 45, über einen
externen Quarz kalibrieren.
IMHO ist auch der ADC-Wert des internen Temperatursensors von dem
kalibrierten Wert abhängig.
Kann man, im Umkehrschluss, eine Kalibrierung dann auch über die
Temperatur machen?
?!? schrieb:> den internen Oszilator kann man, z.B. beim ATtiny 45, über einen> externen Quarz kalibrieren.
Wie stellst du dir den Ablauf vor?
?!? schrieb:> IMHO ist auch der ADC-Wert des internen Temperatursensors von dem> kalibrierten Wert abhängig.
Vom kalibrierten Wert des internen Oszillators? Wie kommst du darauf?
?!? schrieb:> Kann man, im Umkehrschluss, eine Kalibrierung dann auch über die> Temperatur machen?
Nicht IMHO
clock schrieb:> ?!? schrieb:>> den internen Oszilator kann man, z.B. beim ATtiny 45, über einen>> externen Quarz kalibrieren.>> Wie stellst du dir den Ablauf vor?
Ungefähr so wie in der Applicationnote von Atmel (AVR055: Using a 32kHz
XTAL for run-time calibration of the internal RC) beschrieben.
> ?!? schrieb:>> IMHO ist auch der ADC-Wert des internen Temperatursensors von dem>> kalibrierten Wert abhängig.>> Vom kalibrierten Wert des internen Oszillators? Wie kommst du darauf?>
Tja, wie komme ich darauf? Das war dann wohl wieder eine Mischung aus:
Mein "perfektes" Englisch (aus dem Datenblatt übersetzt) und meinem
Wunschdenken die Welt kann so einfach sein.
> ?!? schrieb:>> Kann man, im Umkehrschluss, eine Kalibrierung dann auch über die>> Temperatur machen?>>> Nicht IMHO
Schade, Schade.
Du legst von außen ein frequenzstabiles Signal an und misst per Timer
die Periodendauer. Je nach Abweichung des Messwerts vom Sollwert
manipulierst du OSCCAL. Den besten OSCCAL-Wert speicherst du zum
Messwert des internen Temperatursensors. Diese Prozedur lässt du laufen,
während du den µC aus dem Gefrierfach nimmst, während er langsam auftaut
und auch noch während du ihn langsam mit dem Föhn aufwärmst. Du musst
dir nur überlegen, wieviel (EEPROM-)Platz du hast und welchen
Temperaturbereich du in welchen Schritten abdecken willst.
?!? schrieb:>> Wie stellst du dir den Ablauf vor?>> Ungefähr so wie in der Applicationnote von Atmel (AVR055: Using a 32kHz> XTAL for run-time calibration of the internal RC) beschrieben.
Die AVR055 kannte ich noch nicht. Geht beim Tiny45 aber leider nicht da
die Application Note einen asynchronen Timer/Counter voraussetzt.
Sodele jetzt habe ich es (glaube ich) auch verstanden.
Der interne Oszilator ist zwar (auch) Temperaturabhängig. Aber der
ADC-Wert des internen Temperatursensors hat nichts mit dem OSCCALC-Wert
zu tun.
Ich hatte im Datenblatt nur gelesen, dass man den internen
Temperatursensor kalibrieren kann. (Kalibrieren => Internen Oszilator
kalibrieren)
Wenn man die AVR122 von Atmel überflogen hätte (Ja, hätte ich vorher tun
sollen) begreift man (ich!) auch was hier gemeint ist. Der ADC-Wert ist
ein Wert mit dem man dann rechnen kann um auf die reale Temperatur zu
kommen.
Hierzu muss man den "offset" und den "gain" -Fehler ermitteln bzw.
heraus rechnen.
Wollte ich ja auch. Nur mit einem Quarz ist mir das zu aufwendig?!?
Ich dachte: Ich messe die Umgebungstemperatur und korrigiere die Werte
im ATTiny. Oder so.
Da haben mich auch die Werte im Datenblatt wohl ein wenig verwirrt.
Zurzeit läuft es ja auch im Testlauf ohne Kalibrierung.
Das sollen mal mehrere (3-10) kleine ATTinys am RS485-Bus werden. Das
Ganze soll dann mal im Keller, eventuell draußen, hängen. Ich habe nur
die Befürchtung, dass die Teile bei gewissen Temperaturen nicht mehr
kommunizieren können, da das Timing der Soft-UART nicht mehr passt.
Bei 9600 Baud soll wohl nicht so viel passieren ...
Temperatur auslesen ist nur eine Übung um mehr "Gefühl" für MC zu
bekommen und um es zu verstehen. Nebenbei auch ein lustiges Feature, nur
muss ich das bei jedem Controller neu berechnen.
?!? schrieb:> Bei 9600 Baud soll wohl nicht so viel passieren ...
Der Fehler in der Baudrate ist in Prozent. Es spielt deshalb überhaupt
keine Rolle, ob du ein Bit pro Sekunde überträgst oder eine Million Bits
pro Sekunde. Nach einer gewissen Menge ohne Pause übertragener Bits sind
die UARTs so weit auseinandergedriftet, dass Fehler auftreten. Dem
kannst du entgegenwirken, indem du nach einer bestimmten Anzahl Bytes
eine Pause einlegst oder eben dafür sorgst, dass die µCs mit möglichst
gleichem Takt laufen, also Quarz (sehr genau) oder über einen
temperaturkompensierten internen Oszillator, z.B. wie oben skizziert.
Noch eine Möglichkeit wäre, mit adaptiver Baudrate zu arbeiten.
Konrad S. schrieb:> Nach einer gewissen Menge ohne Pause übertragener Bits sind> die UARTs so weit auseinandergedriftet, dass Fehler auftreten.
Bei jedem Startbit wird der UART neu synchronisiert.
MfG Klaus
Konrad S. schrieb:> ?!? schrieb:>> Bei 9600 Baud soll wohl nicht so viel passieren ...>> Der Fehler in der Baudrate ist in Prozent. Es spielt deshalb überhaupt> keine Rolle, ob du ein Bit pro Sekunde überträgst oder eine Million Bits> pro Sekunde. Nach einer gewissen Menge ohne Pause übertragener Bits sind> die UARTs so weit auseinandergedriftet, dass Fehler auftreten. Dem> kannst du entgegenwirken, indem du nach einer bestimmten Anzahl Bytes> eine Pause einlegst oder eben dafür sorgst, dass die µCs mit möglichst> gleichem Takt laufen, also Quarz (sehr genau) oder über einen> temperaturkompensierten internen Oszillator, z.B. wie oben skizziert.> Noch eine Möglichkeit wäre, mit adaptiver Baudrate zu arbeiten.
Mannomann du laberst vielleicht einen Quatsch daher:
1.) Natürlich spielt die Baudrate dabei eine Rolle. Da die Angaben (wie
du ja schreibst, nur nicht kapierst) in Prozent sind. Bei 9600 Baud
beträgt die Bitdauer 104 µS. Bei einem 5% Fehler darf man um 5,2 µS
davon abweichen. Bei 115200 Baud beträgt die Bitdauer nur 8,68µS. 5%
Fehler bedeutet hier 0,434µS also 434nS. Der Spielraum ist unendlich
viel kleiner. Ein ungenauer Taktgeber spielt also weniger eine Rolle je
niedriger die Baudrate ist.
2.) Wie Klaus schon schreibt, syncronisiert man beim Startbit, vor JEDEM
Byte auf die Mitte des Impulses und somit können UARTS nicht
auseinanderlaufen.
gruß cyblord
Hallo erstmal...
cyblord ---- schrieb:> 1.) Natürlich spielt die Baudrate dabei eine Rolle.
Nein.
> Ein ungenauer Taktgeber spielt also weniger eine Rolle je> niedriger die Baudrate ist.
Ebenfalls nein.
Es geht rein um das Verhältnis. Je länger ein Bit "dauert", desto größer
wird auch der absolute Fehler einer Zeitbasis. Die Bitrate ist also
unerheblich, es kommt rein auf den relativen Fehler an, den man
beispielsweise in Prozent angeben kann.
> 2.) Wie Klaus schon schreibt, syncronisiert man beim Startbit, vor JEDEM> Byte auf die Mitte des Impulses und somit können UARTS nicht> auseinanderlaufen.
Das ist bei asynchroner Übertragung richtig, wenn es um das jeweils
folgende Byte geht. Innerhalb eines jeden Bytes besteht das Problem aber
weiterhin.
Trotzdem kann man natürlich mit einem unkalibrierten ATtiny seriell
Daten übertragen. Man verlässt sich einfach nur auf die ersten 4 Bits
eines jeden Bytes (das sind die niederwertigen 4 Bits). Dann müssten
sogar bis zu 15% Fehler bei der Zeitbasis geschluckt werden können.
Eine zweite Möglichkeit ist, die empfangene Baudrate automatisch zu
erkennen und diese dann auch beim Senden zu verwenden. Das hat Konrad S.
ja schon vorgeschlagen ("adaptive Baudrate").
Schöne Grüße
Markus
?!? schrieb:> Zurzeit läuft es ja auch im Testlauf ohne Kalibrierung.> Das sollen mal mehrere (3-10) kleine ATTinys am RS485-Bus werden. Das> Ganze soll dann mal im Keller, eventuell draußen, hängen.
Alles, was mir zum Kalibrieren des Oszillators beim Tiny45 einfällt, ist
einen Pin per Timer toggeln zu lassen und mit einem Frequenzzähler
nachmessen. Mit OSCCAL Register korrigieren.
Temperaturabhängigkeit der Drift kann man über die Diagramme im
Datenblatt abschätzen.
clock schrieb:> Alles, was mir zum Kalibrieren des Oszillators beim Tiny45 einfällt, ist> einen Pin per Timer toggeln zu lassen und mit einem Frequenzzähler> nachmessen. Mit OSCCAL Register korrigieren.
Das doch aber der selbe Takt! So funktioniert es, wenn man einen
externen Takt einen Pin toggeln lässt oder durch einen Uhrenquarz wie in
der Appnote...
Aber interne Temperatur messen bei gleichbleibender Spannung und dann
nach Datenblatt kalibrieren klingt für mich auch ganz Sinnvoll... Kommt
drauf an wie schlimm es wäre, wenn der UART mal nicht geht.
Bassti schrieb:> Das doch aber der selbe Takt! So funktioniert es, wenn man einen> externen Takt einen Pin toggeln lässt oder durch einen Uhrenquarz wie in> der Appnote...
Der selbe Takt wie welcher Takt?
Der interne Oszillator des Tiny45 taktet einen internen Timer, der einen
Pin toggeln läßt. Das wird mit einem Meßgerät nachgemessen und auf die
interne Oszillatorfrequenz des Tiny zurückgeschlossen.
Die Appnote ist beim Tiny nicht anwendbar, da dieser keinen asynchronen
Timer besitzt wie oben schon mal erwähnt.
Hm, tja, also ...
Der Baudratengenerator des UARTs teilt den Takt auf (typischerweise) das
16-fache der Baudrate. Mit dieser Frequenz wird der RX-Pin gesamplet.
Beim ersten erkannten 0-Pegel wird ein Startbit angenommen und ein
4-Bit-Zähler läuft los. Typischerweise wird bei drei
aufeinanderfolgenden Zählerständen in der Mitte des Zählbereichs - also
etwa bei 7, 8 und 9 - der RX-Pin abgetastet. Sind die Pegel gleich, wird
das als ein Bit gewertet, andernfalls ist es ein Fehler.
Wenn nun der Sender einen etwas schnelleren Takt als der Empfänger hat,
dann verschiebt sich der vom Empfänger abgetastete Bereich langsam immer
weiter zum Ende der (Sender-)Bits und irgendwann kommt die Abtastung in
das nächste Bit rein. Das liegt einfach daran, dass der 4-Bit-Zähler
immer bis zum Ende zählt. Erst dann wird wieder nach einem Startbit
Ausschau gehalten.
Die Situation für den Empfänger lässt sich verbessern, wenn der Sender
dafür sorgt, dass ein Startbit sicher als Startbit erkennt werden kann.
Dafür muss zwischen dem Ende des Stoppbits und dem Beginn des
nachfolgenden Startbits soviel Zeit liegen, dass das Auseinanderdriften
von schnellerem Sender und langsamerem Empfänger über den Zeitraum der
ohne Pause übertragenen Bits (Start- und Stoppbits zählen mit)
mindestens kompensiert wird. Eine Möglichkeit (bei z.B. ATmega) ist,
beim Senden mit zwei Stoppbits zu arbeiten (auf Kosten der
Nutzdatenrate). Eine andere Möglichkeit ist, nach einer gewissen Anzahl
gesendeter Bytes eine kleine Pause einzulegen (Dauer: ein Byte incl.
Start- und Stoppbit).
Je höher die Baudrate ist, desto schwieriger wird es für den
Baudratengenerator das 16-fache der Baudrate genau zu erzeugen. Deshalb
nimmt man gerade für hohe Baudraten gern einen Quarz mit scheinbar
"krummer" Frequenz. Aber mit ein paar Vorkehrungen gehen auch 115200
Baud mit internen Oszillator ganz gut.
Unterm Strich: Die Mikrosekunden pro Bit spielen keine Rolle, es geht um
die 16 Takte, die der Baudratengenerator pro Bit liefert.
@cyblord
Wenn du UART-Beschreibungen hast, die etwas anders sagen, dann lass es
mich wissen.
(Ja, mir ist bekannt, dass der UART im ATxmega noch etwas mehr
draufhat.)
clock schrieb:> Alles, was mir zum Kalibrieren des Oszillators beim Tiny45 einfällt, ist> einen Pin per Timer toggeln zu lassen und mit einem Frequenzzähler> nachmessen. Mit OSCCAL Register korrigieren.
Im Prinzip: ja.
Nur würde ich die Sache umdrehen und - wie oben beschrieben - ein
möglichst präzises Referenzsignal an den µC anlegen. Sagen wir mal mit
1Hz. Dann sollten bei ungeteiltem internem Oszillator für jede Periode
des Referenzsignals 8000000 Takte vergehen, die per Timer plus
Overflow-Interrupt gezählt werden. Jetzt kann man den OSCCAL-Wert
ändern, bis die Abweichung vom Sollwert minimal wird. Diesen OSCCAL-Wert
speichert man für die Temperatur, die der interne Temperatursensor
misst. Macht man das über den vorgesehenen Einsatztemperaturbereich,
dann bekommt man einen temperaturkompensierten internen Oszillator:
Gelegentlich die Temperatur messen und ggf. den dazugehörigen
OSCCAL-Wert setzen.
Konrad S. schrieb:> Nur würde ich die Sache umdrehen und - wie oben beschrieben - ein> möglichst präzises Referenzsignal an den µC anlegen. Sagen wir mal mit> 1Hz. Dann sollten bei ungeteiltem internem Oszillator für jede Periode> des Referenzsignals 8000000 Takte vergehen, die per Timer plus> Overflow-Interrupt gezählt werden.
OK, verstanden. Danke.
Es ist nicht nur die Temperatur, die den Oszillator beeinflusst, auch
die Spannung. Wenn die Leute sich keinen Quarz fuer 15 cents leisten
koennen, werden sie auch nicht einen so stabilen Spannungsregler
vermoegen...
NB. Die Appnote von atmel ist verbesserungswuerdig.
http://www.ibrtses.com/embedded/avrosccal.html
Delta Oschi schrieb:> Es ist nicht nur die Temperatur, die den Oszillator beeinflusst, auch> die Spannung. Wenn die Leute sich keinen Quarz fuer 15 cents leisten> koennen, werden sie auch nicht einen so stabilen Spannungsregler> vermoegen...
Es sind nicht die "sündteuren" Quarze, sondern die zwei benötigten Pins
für das Anschließen des Quarzes bei einem ATtiny25/45/85.
"Verdrahtungsaufwand" und Platinenfläche wären noch Argumente.
> NB. Die Appnote von atmel ist verbesserungswuerdig.
Ja, davon gibt es einige. Aber als Anregung sind die Appnotes gut zu
gebrauchen.
> http://www.ibrtses.com/embedded/avrosccal.html
Danke für den Link.
Also mit dem Source von Atmel (aus der Appnote) hab ich mal folgendes
getan:
Beitrag "GPS Wanze - Tiny GPS"
Kann ?!? sich ja mal anschauen, ist nicht wirklich schwierig mit dem
Uhrenquarz.