Arduino: High Speed Soft Serial (nur RX benötigt)

OP (Firma: Q3) #7379046
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 ...

#7379055
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...

OP (Firma: Q3) #7379065
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.

OP (Firma: Q3) #7379076
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.

OP (Firma: Q3) #7379123
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.

Angehängte Dateien:
#7379124
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\SoftwareSerial.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
  }
#7379160
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

#7379249
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.)

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren