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
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.
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.
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.