Guten Abend,
ich möchte einen atmega328p mit 3,3V und ca. 8MHz betreiben.
Dabei soll die UART, I2C(Sensor) und ISP(SD-Karte) verwendet werden.
Für eine fehlerfreie Serielle Datenübertragung würde sich ja ein 7,3728
MHz Quarz anbieten (
https://www.mikrocontroller.net/articles/Baudratenquarz ).
Was mich stuzig macht, dass der arduino pro mini und einige andere
Boards mit 3,3V ein 8MHz Quarz bzw. Oszilator verwenden.
Daher meine Frage:
1)Was spricht für 8 MHz gegenüber 7,3728 MHz?
2)sehe ich das richtig, dass ich bei 9600 baud und 8 MHz kein Problem
haben sollte (siehe Anhang)(?).
Viele Grüße
Peter
Hallo,
im Dabla des uCs gibt es eine Tabelle mit Taktfrequenzen und
Teilerverhältnissen für das UART, die angibt, wie groß der Fehler im
Vergleich zu einer der üblichen Baudraten wird, je nachdem, welchen Takt
man verwendet. Hinzu kommen noch Toleranzen des eigenen Oszillators und
desjenigen des Empfängers, so daß man die Toleranz nicht zu groß werden
lassen sollte.
Dem I2C ist das egal.
MfG
Der Atmega328 verträgt lt. Datenblatt bei 2,7V 10Mhz. Bei 3,3V geht
theoretisch sogar etwas mehr. (Diagramm)
Ich betreibe den 328 bei 3,3V mit den vollen 20 MHz und hatte noch nie
Probleme.
Peter schrieb:> Ich denke ich werde 8 MHz nehmen.
Wenn du die noch Shoppen musst: Kaufe dir 18,432 MHz Quarze: Mittels dem
System-Clock-Prescaler kannst du auch damit die Taktfrequenz deutlich
runter drehen, hättest aber auch für die Zukunft einen Quarz wenn es
schnell gehen muss mit dem auch recht hohe Baumarten fehlerfrei drin
sind.
Wenn du dagegen nur für dieses eine Projekt einen Quarz kaufen musst:
Hm, klar, 8 MHz geht. 7,3728 MHz geht aber genauso bzw. man kann sich
fragen: Warum keine 4 MHz oder 12 MHz?
Pete K. schrieb:> Ich nehme immer den internen 8Mhz Taktgeber. Hatte noch nie> Probleme> damit.
Bei 9600 Baud geht der ja auch problemlos mit dem internen Oszillator,
dieser schwankt nämlich zwischen 7,4 und 8,4 MHz, je nach Temperatur und
Spannung. Auf die 9600 Baud bezogen schwankt der Fehler dann zwischen
etwa -0,4% und +0,6% und das ist völlig im grünen Bereich für eine
serielle Übertragung.
M. K. schrieb:> schwankt nämlich zwischen 7,4 und 8,4 MHz, je nach Temperatur und> Spannung. Auf die 9600 Baud bezogen schwankt der Fehler dann zwischen> etwa -0,4% und +0,6%
hast du da eine Kommastelle verschoben?
Walter S. schrieb:>> schwankt nämlich zwischen 7,4 und 8,4 MHz, je nach Temperatur und>> Spannung. Auf die 9600 Baud bezogen schwankt der Fehler dann zwischen>> etwa -0,4% und +0,6%> hast du da eine Kommastelle verschoben?
Mindestens :-)
Außerdem bleibt die prozentuale Abweichung natürlich unabhängig von der
Baudrate gleich; lediglich die Annäherung an die gewünschte Baudrate
durch verfügbare Teilerverhältnisse ist unterschiedlich.
Ganz abgesehen davon liegt der grüne Bereich bei +/- 0.2%.
Mit 8MHz Quarz sind demnach 2400, 4800, 9600, 19200 und 38400 ok.
Der interne Oszillator taugt lediglich für Morsezeichen.
Walter S. schrieb:> hast du da eine Kommastelle verschoben?
Nein, hab ich nicht. Ich hab blöder Weise das UBBR mit F_CPU angepasst.
Was für ein blöder Schnitzer...
LOL schrieb:> Wenn der TO die Geschwindigkeit von 2 möchte, dann ist> die Geschwindigkeit von 3 ein Widerspruch zur Aussage 1.
Nö.
Du mußt schon vollständig zitieren und nicht die Frage zu meiner Antwort
weglassen:
Peter D. schrieb:> Peter schrieb:>> 1)Was spricht für 8 MHz gegenüber 7,3728 MHz?>> Nichts.>> Mit 7,3728MHz sind bis zu 921,6kBaud möglich.> Mit 8MHz nur max 38,4kBaud.
Peter schrieb:> Daher meine Frage:> 1)Was spricht für 8 MHz gegenüber 7,3728 MHz?
Du kannst einen genauen 1ms-Timer-Tick bauen (sogar mit einem
8-Bit-Timer - Prescaler 64, CTC bei 124).
Ob du das brauchst (und in den 8000 Takten zwischen den IRQs etwas
sinnvolles anfangen kannst), musst du schon selbst wissen... genau wie
du die Frage selbst beantworten musst, ob dir 38400 Baud reichen oder
nicht.
MfG, Arno
Arno schrieb:> Du kannst einen genauen 1ms-Timer-Tick bauen
bei 7,3728 MHz? wären es 0,1% Fehler bei einem 8Bit-Timer (und
PreScaler32) und 0,04% Fehler mit 16Bit-Timer (ohne PRescaler).
Das sind 8,6 Sekunden pro Tag (wenn es Prescaler 32 gibt, wimre haben
das nicht alle AVR?) bzw. 3,5 Sekunden pro Tag. Man kann natürlich auch
jede fünfte Sekunde verkürzen, um das auszugleichen, aber einfacher wird
es mit 8MHz :)
MfG, Arno
InFo schrieb:> Ich betreibe den 328 bei 3,3V mit den vollen 20 MHz und hatte noch nie> Probleme.
Du hast wahrscheinlich auch noch nie gleichzeitig den vollen
Temperaturbereich des ATmega328 ausgenutzt.
Arno schrieb:> Du kannst einen genauen 1ms-Timer-Tick bauen (sogar mit einem> 8-Bit-Timer - Prescaler 64, CTC bei 124).
Wozu man auch immer einen exakten 1ms-Takt benötigen sollte, ich kenne
jedenfalls keine Anwendung, wo so ein Takt wirklich unverzichtbar
wäre...
In den allermeisten Anwendungen dürfte es tatsächlich keinerlei Rolle
spielen, wenn er ein paar Prozent daneben liegt, denn so ein Takt wird
ja üblicherweise nur zur Realisierung irgendwelcher mittellangen
Wartezeiten benutzt, und dabei spielt eine ms mehr oder weniger
normalerweise überhaupt keine Geige.
Probleme bekommen nur die, die dann aus so einem Takt wieder einen
exakten Sekundentakt ableiten wollen und die obendrein nicht zur
Primfaktorzerlegung in der Lage sind. Alle anderen würden mit einem
Fehler von 4% beim "ms-Takt" leben und am Ende doch eine genaue Sekunde
haben, naja, so genau halt der Quarz selber ist...
Wenn der Kommunikationspartner des ATmega328P ein selbstprogrammierter
Mikrocontroller oder ein PC mit USB-RS-232-Konverter ist, muss man nicht
an den krummen Bitraten aus dem Zeitalter der Telefonmodems kleben
bleiben, sondern kann bspw. auch 10, 20, 50 oder 100 kbit/s verwenden,
die alle sauber aus den 8 MHz ableitbar sind.
PCs mit nativer RS-232-Schnittstelle auf 16x50-Basis werden ja immer
seltener, und ein USB-UART wie der FT232R kann alle Bitraten exakt
darstellen, die auch ein AVR mit 8 MHz kann, und noch viele weitere
mehr.
Also ich sehe bei einer Baudrate von 2.4k, 4.8k, 9.6k, 14.4k, 19.2k,
28.8k, 38.4k und 76.8k keine Probleme. (Das Manual sieht übrigens auch
keine)
Suchen wir uns gerade ein Problem?
Also ich würde mich dem Vorschlag von eProfi mit den 11.0592 MHz
anschließen oder auch, da bei 3.3 V 13.3 MHz zulässig sind, 14.7456
nehmen, das sollte keine Probleme verursachen.
Wenn Du mit UART arbeitest und Angt hast, nimm einen baudrate-Quarz.
Wenn Du es mit genauen Zeiten hast, ist eine vorn ganzzahlige Zahl mit
Nullen dahinter leichter verwendbar.
Anwendungen mit USB sind oft auf einen 12MHz-Quarz angewiesen.
Nimm halt das was gerade da ist oder am besten von der Baugröße her
passt.
Ich selbst hab mal einen Gurt mit 50 Quarzen für wenige Euro erworben.
Seitdem laufen meine Kontrollerplatinen fast alle mit der doppelten
Frequenz des PAL-Farbträgers. (8,6... MHz)
Mit ein bisschen Rechnung hab ich immmer ausreichend genaue UART-Takte
oder Zeiten hinbekommen.