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
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...
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
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.
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.
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
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...
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
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
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.
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 |
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
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
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
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!
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.