MIDI -> UART Bridge

OP #8000694
Lesenswert?

Hallo,

ich versuche gerade eine Adapter-Platine zu bauen mit der man ein MIDI-Signal von einem Instrument (in meinem Fall ein Sampling-Keyboard) über UART einlesen kann.

Den Schaltplan habe ich im Internet gefunden. Vielfach sind die Aufbauten, die man so findet, sehr ähnlich.

Das Problem ist nun leider, dass die Daten, die über die UART-Schnittstelle reinkommen völliger Unsinn sind. Manche Keyboard-Tasten tun überhaupt nichts, andere tun manchmal was, alles ist vollkommen zufällig (selbe Taste tut immer was anderes) und meistens kommen nur Null-Bytes (0b00000000) raus. Mit einem kommerziellen MIDI-USB-Adapterkabel funktioniert das Keyboard. Auch von einem kommerziellen MIDI-Player lässt sich über diese Schaltung absolut nichts einlesen.

Als Einstellungen für den Serial-Port verwende ich folgendes:

  • 31.250 bps
  • 8 Datenbits
  • 1 Stop-Bit
  • keine Parität
  • Flow Control deaktiviert

Hat jemand evtl. eine Idee ob die Schaltung grundsätzlich so stimmt?

Angehängte Dateien:
#8000744
Lesenswert?

Nun ja, so habe ich Felix verstanden, Anschluß an PC:

Als Einstellungen für den Serial-Port verwende ich folgendes ...

Nachtrag: Wie dem auch sei, es sind genügend Kenner hier versammelt, da möchte ich mich verabschieden. Und da ich Spoerls Buch gerade zur Hand habe: "Ech ben ein alter Mann und gähe leber fröh ins Bette."

: Bearbeitet durch User
#8000752
Lesenswert?

Nur der Vollständigkeit halber angemerkt:

Wird als UART die normale Onboard-UART eines PCs verwendet, kann der Ansatz nicht funktionieren, auch wenn man die nötigen Pegelwandler verwendet.

Das liegt daran, daß die PC-Uart die benötigte Baudrate nicht erzeugen kann; der Baudratengenerator wird mit einem Takt von 1.8432 MHz gespeist und durch 16 geteilt - das ergibt die höchstmögliche Baudrate von 115200. Und jede weitere Baudrate wird durch ganzzahliges Teilen erzeugt, d.h. die weiteren möglichen Baudraten sind 57600, 38400, 28800, 23040, 19200 ...

Bei einer USB-UART-Bridge wie z.B. FT232 sieht das natürlich anders aus, /die/ verwendet einen komplett anders konstruierten Baudratengenerator und kann deswegen auch die MIDI-Standardbaudrate verarbeiten.

Und bei einem µC sieht das natürlich auch komplett anders aus. Ältere AVRs muss man mit einer passenden Taktfrequenz betreiben, damit man den MIDI-Standardtakt verwenden kann, aber das ist einfach, da das 16fache exakt 500 kHz sind. Wenn man also /keinen/ "Baudratenquarz" nutzt, sondern die üblichen 8 oder 16 MHz, sollte alles klappen.

#8001532
Lesenswert?

Harald K. schrieb:

Nur der Vollständigkeit halber angemerkt:

Wird als UART die normale Onboard-UART eines PCs verwendet, kann der Ansatz nicht funktionieren, auch wenn man die nötigen Pegelwandler verwendet.

Hier hat "Pichler" einfach mal recht. Nein, dass kann nicht funktionieren. ☺

Das liegt daran, daß die PC-Uart die benötigte Baudrate nicht erzeugen kann; der Baudratengenerator wird mit einem Takt von 1.8432 MHz gespeist und durch 16 geteilt - das ergibt die höchstmögliche Baudrate von 115200. Und jede weitere Baudrate wird durch ganzzahliges Teilen erzeugt, d.h. die weiteren möglichen Baudraten sind 57600, 38400, 28800, 23040, 19200 ...

Viel häufiger findet man allerdings einen 22,1184 MHz Quarz. Sind einem die übrigen Funktionen eines Multi-IO-Chips nicht so wichtig, kann man einfach "Umquarzen" auf einen 18 MHz Quarz. Dann liefert die Einstellung 38400 baud die richtige Baudrate für MIDI. Mit einer 8 Port seriellen Karte, habe ich das auch schon in der Praxis gemacht, und es bescherte mir 8 MIDI-Out-Ports. Von einigen Keyboardherstellern gibt es auch Treiber, die eine Verwendung serieller Ports als MIDI-Port erlauben.

#8001725
Lesenswert?

Matthias S. schrieb:

Cartman E. schrieb:

Nein, dass kann nicht funktionieren.

Tuts aber doch, zumindest in z.B. HTerm. Da kann man manuell die 31250 Baud eintragen (und dann auch im Setting speichern) und HTerm funktioniert mit MIDI. Das ganze mit einem CH340/341 als USB-Uart.

Das USB-UARTs /fraktionale/ Teiler haben können, wurde schon diskutiert und stellt /keine/ Neuigkeit dar.

#8002566
Lesenswert?

Harald K. schrieb:

Das liegt daran, daß die PC-Uart die benötigte Baudrate nicht erzeugen kann; der Baudratengenerator wird mit einem Takt von 1.8432 MHz gespeist und durch 16 geteilt - das ergibt die höchstmögliche Baudrate von 115200. Und jede weitere Baudrate wird durch ganzzahliges Teilen erzeugt, d.h. die weiteren möglichen Baudraten sind 57600, 38400, 28800, 23040, 19200 ...

danke, es schwebte mir im Hinterkopf und du bist der Erste der es bestätigt! Die Midibaudrate konnte ich normalerweise auch nie einstellen!

#8002584
Lesenswert?

Matthias S. schrieb:

Cartman E. schrieb:

Nein, dass kann nicht funktionieren.

Tuts aber doch, zumindest in z.B. HTerm. Da kann man manuell die 31250 Baud eintragen (und dann auch im Setting speichern) und HTerm funktioniert mit MIDI. Das ganze mit einem CH340/341 als USB-Uart.

Da wird wohl intern eher 33600 (einzige offiziell unterstützte Baudrate in diesem Bereich) eingestellt werden und die Toleranz erlaubt gerade noch so die Funktion.

#8002602
Lesenswert?

Die Win32-API, die auch vom (irreführend als Terminalprogramm bezeichneten) HTerm genutzt wird, lässt beliebige Werte als Baudrate zu.

Welche Baudrate dann aber tatsächlich genutzt wird, entscheidet der verwendete Devicetreiber bzw. die verwendete Hardware.

Die Onboard-Schnittstellen des PC, mit 8250/16550 oder Nachfolgern bestückt, verhalten sich so, wie ich weiter oben beschrieben habe: Die leiten ihre Baudraten mit einem ganzzahligen Teiler aus 115200 (Teiler 1) ab. Und damit kann man zwar 31250 einstellen, erhält aber 33600. Einfach, weil die Hardware gar nicht anders kann.

USB-UART-Bridges, selbst der grindige Mist von Prolific, verwenden aber deutlich andere Baudratengeneratoren, und können daher auch deutlich höhere Baudraten als 115200 abliefern.

Kurz: Hier sind USB-UART-Bridges deutlich im Vorteil gegenüber den sonst so gerne gesehenen "echten" seriellen Schnittstellen.

#8002618
Lesenswert?

Harald K. schrieb:

Kurz: Hier sind USB-UART-Bridges deutlich im Vorteil gegenüber den sonst so gerne gesehenen "echten" seriellen Schnittstellen.

Stimmt. Aber auch die haben Limits und die CH340/341 können keine 31250. Zumindest wenn man deren eigenem Datenblatt Glauben schenken darf. Und nur so nebenbei: Ich nutze diverse PL2303 seit Ewigkeiten und habe nicht die geringsten Probleme feststellen können. (Ausschließlich unter Linux versteht sich) Auch bzw. gerade bei sehr hohen Baudrates jenseits der 1M/2M Grenze übertragen die Dinger enorme Datenmengen ohne Übertragungsfehler.

#8002862
Lesenswert?

Norbert schrieb:

Aber auch die haben Limits und die CH340/341 können keine 31250. Zumindest wenn man deren eigenem Datenblatt Glauben schenken darf.

Wenn ich einen CH340 wie er auf diesen Nano-Clones zu finden ist per HTerm auf 31250 Baud einstelle und mit dem Scope die Bitzeit nachmesse kommt hier 32,1 µs (31152 Bps) raus. Das ist 0,3% Abweichung und sollte für MIDI noch gut genug sein.

(Firma: matzetronics) #8002908
Lesenswert?

Norbert schrieb:

Da wird wohl intern eher 33600 (einzige offiziell unterstützte Baudrate in diesem Bereich) eingestellt werden und die Toleranz erlaubt gerade noch so die Funktion.

Nö. Mit Oszi überprüft, passt das +/- 100ns genau. Aber wie o.a. ist das ja kein alter 16550, sondern eine USB-Uart Bridge. Die können das. Mich wundert, des es noch 16550 im Betrieb geben soll.

: Bearbeitet durch User
Beitrag #8002909 wurde vom Autor gelöscht.

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