Arduino Pro mini 3.3v 8 Mhz, ist 132000 Baud irgendwie möglich?

Ich habe ein kleines Problem... ich kann mit Serial zwar 125000 baud übertragen, aber ich muss unbedingt 132000 ermöglichen.

Mit einem Arduino Micro (32u4) ist das ja kein Problem, dazu benutzt man einfach Serial1.begin(132000) und das funktioniert.
Doch beim Pro Mini ist wohl der UART begrenzt auf max 115200 bzw 125000.

Habe es schon mit SoftwareSerial ( myserial.begin(132000); ) probiert... doch es scheint auch hier eine Begrenzung zu geben.

Kann ich doch irgendwie auf die 132000 kbs kommen?

Softwareserial ist eher noch schlechter geeignet.

Hardwareserial geht nur in Teilern der Prozessorfrequenz. Bei 16 MHz sind z.B. 500000, 250000, 125000 gut möglich.

Bei 8 MHz hast du vermutlich die Wahl zwischen 250000, 125000 und dann kleineren Geschwindigkeiten: bei 112500 sollte der Fehler tolerierbar sein, da sich das Ganze mit jedem Startbit synchronisiert.

Kann ich doch irgendwie auf die 132000 kbs kommen?

In welche Richtung ?
Evtl. hilft es, beim Sender 2 Stopbit ( + eventuell Mark Parity ) zu konfigurieren, und beim Empfänger nur 1 Stopbit und das Paritybit zu konfigurieren ...

Mit einem Arduino Micro (32u4) ist das ja kein Problem, dazu benutzt man einfach Serial.begin(132000) und das funktioniert.

Beim Micro kannst Du irgend eine Baudrate einstellen, sie wird sowieso ignoriert. Dort ist USB direkt in the Prozessor integriert, d.h. er empfängt/sendet die Daten sowieso nicht mit der eingetragenen Baudrate. Beim Micro müsstest Du die entsprechende Einstellung auf Serial1 machen und dort ist es genauso wenig möglich.

Doch beim Pro Mini ist wohl der UART begrenzt auf max 115200 bzw 125000.

Nein, im UART nicht, aber in der Bibliothek. Wenn Du die Einstellung selbst machst, sollte eine hinreichend genaue Einstellung möglich sein. Allerdings ist mir rätselhaft, wieso Du eine so genau definierte Baudrate bei der Kommunikation über USB haben musst.

SoftwareSerial ist für Baudraten über 9600 nur beschränkt, über 38400 gar nicht mehr zu gebrauchen.

Was willst Du genau machen?

Mit dem folgenden Code in setup() kriegst Du 13334 Baud, was nur ca 1% Abweichung zu Deinem gewünschten Wert ist (besser als mit den meisten anderen Baudraten).

Serial.begin(125000);
UBRRL = 15;

Zunächst einmal Danke, super Antwort.

Zur Info, ich möchte nicht über USB übertragen sondern der TX Pin geht zu einem anderen Board was 132000 baud verlangt

eim Micro kannst Du irgend eine Baudrate einstellen, sie wird sowieso ignoriert.

Ich habe das mal mit dem Oszi überprüft... die Baudrate ändert sich 1:1, also wird nicht ignoriert. Oder meinst Du etwas anderes?

Serial.begin(125000);
UBRRL = 15;

Das ist eine sehr gute Info :slight_smile:
Was macht UBRRL dabei? Ist das irgendein Teiler? Wenn ja, wie berechne ich andere Baudraten?

See page 189, 20.10, and
page 192, Table 20-6, of '328 datasheet.
UBBRL info

Ok, also mit dem Arduino Pro Mini bekomme ich bei

UBRRL = 15;

"error: 'UBRRL' was not declared in this scope"

Fehlt ein include?

vieleicht ist es das UBRRnL Register. ( UBRRnL and UBRRnH – USART Baud Rate Registers)

Schau mal Zabelle 19.1 auf Seite 179, Kapitel 19.8.3 Asynchronous Operational Range auf Seite 192 und die Tabelle 19.11 auf Seite 202 von http://www.atmel.com/Images/doc8161.pdf an.

Grüße Uwe

CrossRoads:
See page 189, 20.10, and
page 192, Table 20-6, of '328 datasheet.
UBBRL info

Sorry CrossRoads, I cannot find the Table in http://www.atmel.com/Images/doc8161.pdf
Ciao Uwe

?

Da erlauben wir Uwe mal ein crosspost :wink:

Ich fürchte, CrossRoads liest hier nicht mit.

michael_x:
Ich fürchte, CrossRoads liest hier nicht mit.

Und wie erklärst du dir diesen Beitrag? :wink:

CrossRoads:
See page 189, 20.10, and
page 192, Table 20-6, of '328 datasheet.
UBBRL info

Sorry, aber ich kann mit den letzten Posts gar nichts anfangen.

Es ist besser dem Dummen zu erklären wie es richtig geht, oder was man ändern kann, anstatt auf irgendwelche Datasheets zu verweisen, die er sowieso nicht versteht :slight_smile:

Wie erwähnt habe ich die vermeintliche Annäherung auf 132000 ausprobiert aber ich bekomme die oben genannte Fehlermeldung.

Kann es sein, dass das Baudraten Problem nur bei 8 Mhz Platinen auftreten, weil ich gelesen habe, dass die 16 Mhz Varianten problemlos höhere Baudraten über Serial1.Begin einstellen können. Meine Vermutung war ja, dass man unbedingt einen 32u4 Chip braucht, weil dieser den Serial1 Kanal anbietet und über den Hardware USART läuft.

Ich habe keine Ahnung, deshalb wäre eine aufklärende Erklärung eines Profis vielleicht hilfreich das ganze Wirrwar aufzuklären.
Jedenfalls funktioniert es mit einem Arduino Micro (32u4) mit Serial1 (nicht über USB) problemlos 132000 Baud einzustellen und mit dem Gerät zu kommunizieren.

Nur hätte ich gerne gewusst warum das mit dem Pro Mini 3.3V 8 Mhz nicht funktoniert.

Kann es vielleicht sein das es mit den Sparkfun Pro Micro (3.3V 8 Mhz aber 32u4 Chip!) funktioniert. Denn hier sollte auch Serial1 (nicht über USB) möglich sein.

Ok, also mit dem Arduino Pro Mini bekomme ich bei

UBRRL = 15;

"error: 'UBRRL' was not declared in this scope"

Geht's mit

UBRR0L = 15;

?

Beim ATmega168 sollte UBRRL eigentlich definiert sein, beim ATmega328 kann es auch das mit dem 0 sein.

Oder meinst Du etwas anderes?

Sorry, habe das "1" nach dem "Serial" überlesen. Mein Kommentar galt für die USB-Emulation der seriellen Schnittstelle.

Was macht UBRRL dabei? Ist das irgendein Teiler? Wenn ja, wie berechne ich andere Baudraten?

Das ist ein 16bit Register (deshalb UBRRL und UBRRH, wobei das UBRRH 0 bleiben darf, wie vom Serial.begin() gesetzt), welches das als Teilungsverhältnis des Systemtakts (bzw. eines Achtels davon) verwendet wird und dann den Takt für die serielle Schnittstelle liefert.

Wobei ich gerade feststelle, dass ich mit 16MHz gerechnet hatte (Gewohnheit ist manchmal schon lästig), bei 8MHz lässt sich wirklich kein Wert berechnen, der 132kBaud ergibt. 8 ergibt 125kBaud, während 7 schon fast 143kBaud ergibt. Scheint also wirklich, dass Du mit dem 8MHz-Modell nicht genau die gewünschte Geschwindigkeit erzielen könntest.

Ok, danke.

Bei "UBRR0L = 15" bekomme ich keine Fehlermeldung, das ist schon mal gut.

Dann werde ich wohl es mal mit dem Pro Micro 3.3V / 8 Mhz probieren... vielleicht klappt es ja dann doch mit dem Serial1. Wer weiss :slight_smile:
Werde dann davon berichten.

Mit 15 kannst Du nie 132000 baud erreichen.
http://www.wormfood.net/avrbaudcalc.php?postbitrate=132000&postclock=8

Fuer solche baudrates kommst Du mit 2-4 zu. Mann kann ein "double speed" mode einsetzen, mann kriegt dann 2x groessere Baudrate.