Hi,
ich möchte große Datenmengen relativ flott über Bluetooth übertragen. Ein HC-06 Modul kann z.B. 230400, 460800, 921600, 1382400 Baud. (Quelle: Embedded Programmer: Ubuntu: Hacking the HC-06 bluetooth module)
Kann mir jemand erklären welche Übertragungsgeschwindigkeiten der Atmega328 kann?
Ich habs probiert mit einem Atmega328 8MHZ interne Clock. 57600 klappt noch einwandfrei, ist mir aber zu langsam. Bei 115200 sendet das Bloetooth-Modul nix mehr. (ja, ich hab es im Sketch und im Modul richtig angegeben) Macht es einen Unterschied wenn ich ein externes 16MHz Quarz verwende?
Ich hab im Netz diverse Baudratenrechner gefunden, aber irgendwie verwirren die mich mehr als sie helfen. Wenn ich mir diesen: WormFood's AVR Baud Rate Calculator Ver. 2.1.1 anschaue, dürfte 115200 gar nicht funktionieren.
Ja, ein 16 MHz Quarz hilft. Der ist viel genauer als der interne RC Oszillator. Entsprechend sind höhere Baudraten weniger problematisch.
Eigentlich gibt es spezielle Baudraten-Quarze mit krummen Frequenzen um genau auf die Baudraten zu kommen. Eben z.B. 11.0592 MHz wie du auf deinem Link siehst. Dann ist aber das Timing der Taktzyklen auch nicht mehr so genau berechenbar, was auch wieder Nachteile hat. Ich nehme mal an die meisten Geräte haben etwas Toleranz und ihnen macht es auch nichts aus wenn der Takt etwas abweicht. In der Tabelle ist da bei 115200 und 16 MHz, 3-5% Abweichung angegeben. Vielleicht mag das dein BT Gerät nicht.
wellnestom:
Kann mir jemand erklären welche Übertragungsgeschwindigkeiten der Atmega328 kann?
Im Prinzip beliebige.
Aber je höher die Baudrate werden soll, desto mehr kommen nur noch solche Baudraten in Frage, die sich als ganzzahliger Teiler aus der Taktrate ergeben.
Auf einem 16 MHz getakteten Arduino funktionieren z.B. 250000 und 500000 Baud sehr schön (mit einem PC als Gegenstelle).
Ok, danke erstmal.
Wenn ich das richtig verstanden habe müsste ich ein 14.7456 Mhz Quarz verwenden um eine Baudrate von 230400 zu erreichen. Aber was muß ich in der Arduino IDE alles ändern um mit so einem Quarz zu arbeiten? (Bootloader und Boards.txt) Für den 8MHz Atmega hab ich im Netz Beispiele gefunden, aber für so 'krumme' Quarze wirds da nix geben. Hat das einen Einfluß auf die Kommunikation über MOSI/MISO? Da hab ich einen A/D Wandler (MCP3008) dran den ich brauche.
wellnestom:
Wenn ich das richtig verstanden habe müsste ich ein 14.7456 Mhz Quarz verwenden um eine Baudrate von 230400 zu erreichen.
Also ich kann zwischen einem 16 MHz Arduino mit "Serial.begin(230400);" und einem Windows-PC mit der Terminalsoftware "Putty" auf 230400 Baud wunderbar eine Verbindung herstellen, die augenscheinlich fehlerfrei läuft.
Die tatsächlich generierte Baudrate auf dem Arduino liegt doch auch gar nicht so sehr daneben:
16000000/230400 = 69,444 Taktratenteiler, gerundet 69
16000000/69 = 231884 Baud
Die tatsächliche Baudrate zur beabsichtigten Baudrate beträgt
231884 / 230400 = 1,0064
Das ist eine Abweichung von 0,64%, also unter 1% Abweichung.
Das würde ich mal ausprobieren, ob das bei Dir nicht auch innerhalb der Toleranz liegt und eine Kommunikation mit einer so geringen Baudratenabweichung nicht völlig problemlos möglich ist.
Hmmm, nach der Tabelle von dem Baudratenrechner sinds aber "7,8% of error". Also das gleiche wie bei 115200 Baud mit den 8 MHz die bei mir nicht funktionieren.
wellnestom:
Hmmm, nach der Tabelle von dem Baudratenrechner sinds aber "7,8% of error". Also das gleiche wie bei 115200 Baud mit den 8 MHz die bei mir nicht funktionieren.
Stimmt, vergiß meine oben gepostete Rechnung!
Das Baudratenregister UBBR kann auf AVR Atmega nicht so feinfühlig justiert werden wie oben ausgerechnet, sondern wird aufgrund der durch 16 geteilten Baudrate gesetzt. So sind mit 16 MHz Taktrate nur Baudraten von 200000 und 250000 Baud möglich, aber nichts dazwischen. 230400/250000 = 0,9216 = Fehler 7,84%.
Das dürfte für eine zuverlässige Kommunikation tatsächlich ein zu großer Fehler sein.