Forum: Mikrocontroller und Digitale Elektronik Arduino: High Speed Soft Serial (nur RX benötigt)


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Die Lib "NewSoftSerial" unterstützt "nur" Geschwindigkeiten bis 115000 
Bit/s, das in hoher Qualität und per interrupt-gesteuerter 
Empfangsroutine. Dass eine reine Software-Lösung, insbesondere beim 
Empfang" nicht beliebig schnell sein kann, ist mir klar. Ich brauche 
aber nur die Sende-Funktion für einige wenige Bytes.

Ich benötige einen RX-Pin, der mit 256000 Bit/s senden kann.

Es geht mir um die Kommunikation mit einem Radar-Chip LD2410, der 
blöderweise mit einer per Default auf 256000 Bit/s gesetzten UART 
daherkommt. Diese Rate kann zwar per Befehl auf andere (niedrigere) 
Bitraten gesetzt werden, aber ... ja, da beisst sich die Katze irgendwie 
in den Schwanz.

Hätte ich nun die Möglichkeit, nach einem Restart ein Pin zunächst mit 
256000 zu bedienen (nur Sendung nötig), könnte ich einen Umschalt-Befehl 
als Initialiserung senden und danach auf niedrigere Geschwindigkeiten 
herunterschalten.

Kennt jemand evtl. passenden Code? Oder gibts Patches/Forks von (new) 
SoftSerial, die das ermöglichen? Danke für Tips.

Ja, ich weiß, ein "normaler" ESP32 kann das per zweiter Hardware-UART 
von Hause aus, der ist mir aber zu "fett", ich benötige am Ende 6 
solcher Sensoren und habe wenig Platz ... sowas wie ein Arduino Micro 
oder eines diese "kompatiblen" Dinger von 2x2cm wäre ideal für meine 
Zwecke.

Alternativ wäre ich dankbar für Tips zu so einem "Winzling" wie den 
TinyPico oder Seed Studio XIAO, aber eben mit zwei Hardware-UARTs ...

: Bearbeitet durch User
von C-hater (c-hater)


Lesenswert?

Frank E. schrieb:

> Die Lib "NewSoftSerial" unterstützt "nur" Geschwindigkeiten bis 115000
> Bit/s, das allerdings in hoher Qualität und per interrupt-gesteuerter
> Empfangsroutine. Dass eine reine Software-Lösung, insbesondere beim
> Empfang" nich beliebig schnell sein kann, ist mir klar. Ich brauche aber
> nur die Sende-Funktion für einige wenige Bytes.
>
> Ich benötige also einen RX-Pin, der mit 256000 Bit/s senden kann.

Nein, das ist doch Schwachsinn. Wieso sollte der RX-Pin senden? 
Außerdem: Senden sollte auch rein in Software mit deutlich mehr als 
115200 problemlos gehen, nämlich mit (bis zu) der Hälfte der 
Taktfrequenz des Systems (wenn auch nicht mit jeder gewünschten 
Baudrate). Wenn das Ziel 256kBaud sind und der Systemtakt die 
Arduino-typischen 16Mhz, dann sollte das mit einem systematischen 
Baudratenfehler von + oder - 0,8% gehen. Also völlig unproblematisch.

Mir scheint, du hast das eigentliche Problem nicht erkannt bzw. 
verstanden...

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

C-hater schrieb:
> Frank E. schrieb:
>
>> Die Lib "NewSoftSerial" unterstützt "nur" Geschwindigkeiten bis 115000
>> Bit/s, das allerdings in hoher Qualität und per interrupt-gesteuerter
>> Empfangsroutine. Dass eine reine Software-Lösung, insbesondere beim
>> Empfang" nich beliebig schnell sein kann, ist mir klar. Ich brauche aber
>> nur die Sende-Funktion für einige wenige Bytes.
>>
>> Ich benötige also einen RX-Pin, der mit 256000 Bit/s senden kann.
>
> Nein, das ist doch Schwachsinn. Wieso sollte der RX-Pin senden?


ok, ich habe RX/TX verwechselt.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Gucke dir mal meine HelloTiny Vorlage an. 
http://stefanfrings.de/avr_hello_world/index.html

Das ist zwar nicht Arduino spezifisch, sollte sich dennoch relativ 
leicht verwenden lassen. Es sind ja nur wenige Zeilen Code relevant.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Also ich hatte RX/TX bzw. die Perspektive Arduino/Radar verwechselt.

Natürlich geht es darum, vom Arduino (TX) zunächst einige Bytes zum 
Radar (RX) zu senden, um dessen UART herunter zu konfigurieren.

Bei der Hardware-UART ("Serial.begin()") verhindert die Arduino-IDE die 
Eingabe von Werten über 115000, vielleicht ist das ja bei SoftSerial 
nicht so, das habe ich noch nicht hausprobiert.

von Frank K. (fchk)


Lesenswert?

Frank E. schrieb:

> Alternativ wäre ich dankbar für Tips zu so einem "Winzling" wie den
> TinyPico oder Seed Studio XIAO, aber eben mit zwei Hardware-UARTs ...

https://www.pjrc.com/store/teensy40.html

7 Hardware UARTs. Sollte wohl reichen.

fchk

von C-hater (c-hater)


Lesenswert?

Frank E. schrieb:

> Bei der Hardware-UART ("Serial.begin()") verhindert die Arduino-IDE die
> Eingabe von Werten über 115000

Tja, wenn man sich selbst Handschellen anlegt (sprich: das 
Arduino-Framework verwendet), darf man sich nicht beschweren, wenn das 
die Bewegungsfreiheit doch etwas beschränkt...

von Frank E. (Firma: Q3) (qualidat)


Angehängte Dateien:

Lesenswert?

Frank K. schrieb:
> Frank E. schrieb:
>
>> Alternativ wäre ich dankbar für Tips zu so einem "Winzling" wie den
>> TinyPico oder Seed Studio XIAO, aber eben mit zwei Hardware-UARTs ...
>
> https://www.pjrc.com/store/teensy40.html
>
> 7 Hardware UARTs. Sollte wohl reichen.
>
> fchk

Ja, das würde ausreichen. Allerdings ist der Teensy 4 ziemlich teuer, 
habe keinen unter 50,- gefunden.

Alternativ bin ich bei meinen Recherchen inzwischen auf den 
"RP2040-Zero" bzw. "RP2040-One" gestossen, den es sogar im 
"Digistump"-Format (Platine ca. 1,5cm x 1,5cm mit USB-"Stecker") gibt. 
Der hat wohl zwei Hardware-UARTs. Mal sehen, ob die 256k können ...

Dann kann ich mir auch die Trickserei mit der Baudraten-Umschaltung 
ersparen.

: Bearbeitet durch User
von Helmut H. (helmuth)


Lesenswert?

Frank E. schrieb:
> "NewSoftSerial" unterstützt "nur" Geschwindigkeiten bis 115000

Spricht was dagegen, die entsprechende Routine aus Softwareserial zu 
clonen und ein passendes eigenes _tx_delay zu verwenden?
Datei bei mir  C:\Program Files 
(x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\Software 
Serial.cpp
1
size_t SoftwareSerial::write(uint8_t b)
2
  uint16_t delay = _tx_delay;
3
  cli();  // turn off interrupts for a clean txmit
4
5
  // Write the start bit
6
  if (inv)
7
    *reg |= reg_mask;
8
  else
9
    *reg &= inv_mask;
10
11
  tunedDelay(delay);
12
13
  // Write each of the 8 bits
14
  for (uint8_t i = 8; i > 0; --i)
15
  {
16
    if (b & 1) // choose bit
17
      *reg |= reg_mask; // send 1
18
    else
19
      *reg &= inv_mask; // send 0
20
    tunedDelay(delay);
21
    b >>= 1;
22
  }

: Bearbeitet durch User
von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Helmut H. schrieb:
> Frank E. schrieb:
>> "NewSoftSerial" unterstützt "nur" Geschwindigkeiten bis 115000
>
> Spricht was dagegen, die entsprechende Routine aus Softwareserial zu
> clonen und das _tx_delay entsprechend anzupassen?

Danke für den Tip. Nein, es spricht nichts dagegen, muss mich damit 
beschäftigen. Danke.

von Rainer W. (rawi)


Lesenswert?

Frank E. schrieb:
> Bei der Hardware-UART ("Serial.begin()") verhindert die Arduino-IDE die
> Eingabe von Werten über 115000

Sicher?
https://reference.arduino.cc/reference/en/libraries/ld2410/

Dort steht (setupSensor.ino Z.66):
1
RADAR_SERIAL.begin(256000); //UART for monitoring the radar

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Frank E. schrieb:
> Bei der Hardware-UART ("Serial.begin()") verhindert die Arduino-IDE die
> Eingabe von Werten über 115000,

Was für eine blühende Fantasie!
https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/HardwareSerial.cpp#L117
Oder ist es ....

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Frank E. schrieb:
> Ja, das würde ausreichen. Allerdings ist der Teensy 4 ziemlich teuer,
> habe keinen unter 50,- gefunden.

Wo findet man den für über 50€?
https://www.berrybase.de/teensy-4.0-ohne-header
https://www.reichelt.de/de/en/teensy-4-0-usb-without-header-teensy-4-0-p269006.html

von Falk B. (falk)


Lesenswert?

Frank E. schrieb:
>> Spricht was dagegen, die entsprechende Routine aus Softwareserial zu
>> clonen und das _tx_delay entsprechend anzupassen?
>
> Danke für den Tip. Nein, es spricht nichts dagegen, muss mich damit
> beschäftigen. Danke.

Man kann auch diese Funktion (Assembler) anpassen und zum Senden nutzen. 
Mit fast jeder Baudrate und CPU-Frequenz.

Beitrag "Re: Frage zu IR-Remote+LED-Strips an AVR"

Wenn das für 800kbit/s geht, gehte es auch für 256kbit/s

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

C-hater schrieb:
> Tja, wenn man sich selbst Handschellen anlegt (sprich: das
> Arduino-Framework verwendet), darf man sich nicht beschweren, wenn das
> die Bewegungsfreiheit doch etwas beschränkt...

Lass dich nicht verarschen!

von Helmut H. (helmuth)


Angehängte Dateien:

Lesenswert?

Helmut H. schrieb:
> Spricht was dagegen, die entsprechende Routine aus Softwareserial zu
> clonen
Habe mir mal die _txdelay Werte ausgeben lassen (Serial.print  in der 
o.a. SoftwareSerial) auf Arduino Mini Pro 16 MHz:

Speed 9600, _tx_delay 413
Speed 38400, _tx_delay 101
Speed 115200, _tx_delay 31
Speed 250000, _tx_delay 13
Speed 256000, _tx_delay 12
Speed 460800, _tx_delay 5
Speed 38400, _tx_delay 101
Speed 230400, _tx_delay 14

Und dann einfach mal das original Software-Serial mit 230400 gestartet. 
Wunder der Technik: Senden mit 230400 funktioniert problemlos, 256000 
konnte ich leider mangels passendem Terminalprogramm nicht ausprobieren, 
wäre aber einen Versuch wert. (Edit: 460800 geht auch.)

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Helmut H. schrieb:
> konnte ich leider mangels passendem Terminalprogramm nicht ausprobieren

Beim Hammer Terminal (hterm) kannst du beliebige Baudraten eingeben. Ob 
die Hardware sie unterstützt, ist eine andere Frage.

von Sebastian W. (wangnick)


Lesenswert?

Stefan F. schrieb:
> Beim Hammer Terminal (hterm) kannst du beliebige Baudraten eingeben. Ob
> die Hardware sie unterstützt, ist eine andere Frage.

Bei MobaXterm auch.

LG, Sebastian

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.