Forum: Mikrocontroller und Digitale Elektronik AVR UART Interner Externer Timer


von J. W. (ontheway)


Lesenswert?

Hi,

mal wieder eine Anfängerfrage, aber ich verspreche, wenn ich mal eine 
Antwort habe, werde ich qualifiziert helfen! ;)

Die konkrete Frage vielleicht zuerst: Mit einem Atmega16 z.B. kann ich 
ja über die Fuses die interne Taktfrequenz einstellen. Ich sammel jetzt 
erste Erfahrungen mit UART und den Baud-Raten. Das Pollin-Board zum 
Beispiel hat nun aber Quarze. Die Frage: Wozu brauche ich die überhaupt? 
Was habe ich davon? Wenn ich doch eh so ein Ding auf dem Kontroller 
habe?

Danke!
Jens

von Thomas E. (thomase)


Lesenswert?

J. W. schrieb:
> Wenn ich doch eh so ein Ding auf dem Kontroller
> habe?
Hast du nicht. Das ist ein RC-Oszillator. Dieser hat eine wesentlich 
grössere Toleranz als ein Quarz. Damit kannst du RS232 oft vergessen.
Hinzu kommt noch, dass sich die 8(1)MHz nicht glatt auf 
Standardbaudrates teilen lassen. Das ist bei vielen Quarzen auch so. 
Dafür gibt es dann Baudratenquarze, z.B. mit 11,0592 MHz. Mit denen 
passt es 100%ig.
Guck mal ins Datenblatt: "Example of Baudrate settings". Die "krummen" 
Dinger mit 0% Error sind Baudratenquarze. Bei den "normalen" ist die 
Abweichung z.T. viel zu hoch.

mfg.

von Conny G. (conny_g)


Lesenswert?

Genau, es geht um Genauigkeit. Der interne Takt ist wesentlich ungenauer 
- habe grade was von 10% im Kopf - und man kann damit nicht alles tun, 
wie z.B. serielle Übertragung in höheren Geschwindigkeiten.
Ich entwickle seit ein paar Monaten mit Atmegas und Attinys meistens mit 
dem internen Oszillator und habe bei seriellem Interface zum PC als 
Feedbackkanal eigentlich keine großen Probleme - funktioniert bei z.B. 
38.400 Baud sehr gut.
Aber in einer Produktivschaltung die so etwas tut oder für andere Zwecke 
einen zuverlässigen Takt braucht will man sich das gut überlegen ob man 
nicht lieber einen externen Quarz nimmt.

Ah, hab was gefunden:
[[http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment#Erg.C3.A4nzende_Hinweise_zur_Taktversorgung_.28kann_.C3.BCbersprungen_werden.29]]
... also ist die Toleranz des internen Oszillators mit 1-5% die größte 
aus allen Möglichkeiten.

von Spess53 (Gast)


Lesenswert?

Hi

>Die Frage: Wozu brauche ich die überhaupt?
>Was habe ich davon? Wenn ich doch eh so ein Ding auf dem Kontroller
>habe?

Hast du nicht. AVRs besitzen interne RC-Oszillatoren deren genaue 
Frequenz von allem möglichen, wie z.B. Temperatur, Spannung ..., 
abhängig sind. Beim ATMega16 ist die Frequenz auch erst dann halbwegs 
genau, wenn du das passende Calibration Byte in das OSCCAL-Register 
lädst. Außerdem ergeben selbst genaue 1/2/4/8MHz bei den meisten 
Baudraten schon einen Fehler. Externe Quarze sind um Größenordnungen 
genauer und stabiler als der interne RC-Oszillator.

MfG Spess

von J. W. (ontheway)


Lesenswert?

Thomas Eckmann schrieb:
> J. W. schrieb:
>> Wenn ich doch eh so ein Ding auf dem Kontroller
>> habe?
> Hast du nicht. Das ist ein RC-Oszillator. Dieser hat eine wesentlich
> grössere Toleranz als ein Quarz. Damit kannst du RS232 oft vergessen.
> Hinzu kommt noch, dass sich die 8(1)MHz nicht glatt auf
> Standardbaudrates teilen lassen. Das ist bei vielen Quarzen auch so.
> Dafür gibt es dann Baudratenquarze, z.B. mit 11,0592 MHz. Mit denen
> passt es 100%ig.
> Guck mal ins Datenblatt: "Example of Baudrate settings". Die "krummen"
> Dinger mit 0% Error sind Baudratenquarze. Bei den "normalen" ist die
> Abweichung z.T. viel zu hoch.
>
Okay, danke, sowas habe ich mir fast schon gedacht! Nun habe ich dieses 
Beispiel ausprobiert: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART
Da wird in einem Makro der Fehler berechnet, wenn man eine gewisse 
Taktfrequenz hat. Ich gehe mal davon aus, dass mein Atmega16 garantiert 
nicht 8MHz hat, da gibt es gewiss einen Fehlerbalken.
Sehe ich das richtig, die Makros berechnen mögliche Baudraten, wenn die 
Frequenz wirklich zum Beispiel 8MHz wäre? Oder anders: Die Makros zielen 
auf internen Takt aus, oder?
Wie kann ich experimentell mit dem externen Quarz auf dem Pollin-Board 
arbeiten? Da hängt ein 16MHz Quarz vor dem
, aber ich sehe keine Typenbezeichnung. Das mit den Fuses wäre spannend.

Danke für einen Hinweis!

LG
Jens

von Conny G. (conny_g)


Lesenswert?

Das Makro rechnet mit F_CPU, das ist eine Konstante / Umgebungsvariable, 
die in der Entwicklungsumgebung gesetzt wird.
Normalerweise stellt man dort den Programmer ein, die Hardware (den uC) 
die man benutzt und welche Taktfrequenz.
Parallel dazu muss man die Fuse-Settings einstellen, was man gerne haben 
möchte.
Dazu gibt's auch Tools, die es einem einfacher machen, wie:
http://www.engbedded.com/fusecalc

Das Makro berechnet nun auf dieser Basis den benötigten Counterwert 
(UBRR_VAL) für die Baudrate sowie den Fehler, der bei dieser Baudrate 
mit der F_CPU entsteht und gibt Dir einen Compilerfehler, wenn die 
Abweichung zu gross ist.

Dem Makro ist es dabei egal, ob es interner Takt ist oder externer, es 
ist lediglich der Takt, der in der Entwicklungsumgebung eingestellt ist.
Un der sollte derselbe sein, wie über die Fuses gesetzt wird und die 
wiederum sollten so gesetzt sein wie die Taktung in echt aussieht.

Der Fehler bei der Baudrate entsteht durch die Teilung des F_CPU für die 
Baudrate, dabei ist es wurst, ob das intern oder extern ist, sondern von 
welchem Takt ausgeht.
Beispiel: Takt 8 Mhz, Zielbaudrate 38.400.
Der Systemtakt wird hier durch 16 geteilt und ist damit die Basis für 
den Baud-Takt, also:
8.000.000 / 16 = 500.000
Die 500.000 teilen wir nun durch die Baudrate um den Counterwert für das 
UBRR zu bekommen:
500.000 / 38.400 = 13.0208
das muss natürlich gerundet werden, also 13.
500.000 / 13 wiederum ergibt 38.461, also eine Abweichung von 61/38.400 
= 0.15%,d as ist recht gut.

Dasselbe nun mit 115.000 Baud:
500.000 / 115.000 = 4.3478 oder 4
500.000 / 4 = 125.000
das ist ein Fehler von 10.000/115.000 = 8.7% - das wird also nicht 
gutgehen.

von oldmax (Gast)


Lesenswert?

Hi
Mit dem internen Takt wirst du eine serielle Verbindung hinbekommen. 
Gut, zuverlässig ist was anderes, aber wenn du eine (ziemlich) genaue 
Zeitbasis brauchst, dann kannst du den internen Takt komplett vergessen. 
Selbst mit einem 16 Mhz Quarz geht eine Uhr im Monat etwa 10 - 30 Sek. 
ungenau.
Gruß oldmax

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.