Forum: Mikrocontroller und Digitale Elektronik MIDI -> UART Bridge


von Felix (felix508)


Angehängte Dateien:

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?

von S. L. (sldt)


Lesenswert?

Sieht bei mir ähnlich aus (vorausgesetzt, an CN3_1 liegen +5 V an): R2 
hat bei mir 8k2, zusätzlich liegen zwischen U1_7 und U1_5 (also GND) 
47k.

von M.A. S. (mse2)


Lesenswert?

Der Optokoppler ist vielleicht ein bisschen zu langsam. Schau mal ins 
Datenblatt und halte dagegen, wie lang die Bit-Zeit bei 31500 baud ist.
Darlington-Optos sind allgemein nicht die schnellsten.

: Bearbeitet durch User
von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

Nachtrag, vor langer Zeit im Internet gefunden.

von M.A. S. (mse2)


Lesenswert?

S. L. schrieb:
> Sieht bei mir ähnlich aus (vorausgesetzt, an CN3_1 liegen +5 V an): R2
> hat bei mir 8k2, zusätzlich liegen zwischen U1_7 und U1_5 (also GND)
> 47k.
Und bei Dir funktioniert es wie es soll?

@Felix:
Hast Du ein Oszilloskop?

von H. H. (Gast)


Lesenswert?

Für Bastelei besser einen Digitalkoppler nehmen, z.B. 6N137. Für Serie 
sind die paar 10ct natürlich zu teuer...

von Ingo W. (uebrig) Benutzerseite


Lesenswert?

Eventuell von Pin7 des OK einen Widerstand von einigen zehn Kiloohm nach 
Masse, dann schaltet er schneller aus.

Edit:
ist in dem Bild von
Beitrag "Re: MIDI -> UART Bridge"
auch so dargestellt.

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

an Felix:

Falls das unklar sein sollte: die rechte Seite geht natürlich an den 
UART-Port eines uControllers.

von Mario M. (thelonging)


Lesenswert?

S. L. schrieb:
> Nachtrag, vor langer Zeit im Internet gefunden.

Das Bild ist auch im Wikipedia-Artikel zu MIDI. Man beachte auch den 470 
Ohm Kollektor-Widerstand.

von Björn W. (bwieck)


Lesenswert?

Das Signal was rauskommt ist invertiert.

von S. L. (sldt)


Lesenswert?

> Das Signal was rauskommt ist invertiert.

Das hatte ich sagen wollen, und jetzt habe ich auch die Stelle im 
Tietze/Schenk gefunden: "In der RS 232-Norm ... werden die Daten in 
negativer Logik ... übertragen."

: Bearbeitet durch User
von Björn W. (bwieck)


Lesenswert?

S. L. schrieb:
> "In der RS 232-Norm ... werden die Daten in
> negativer Logik ... übertragen."

Aber hier geht es nichtmal um RS232..

von S. L. (sldt)


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
von Harald K. (kirnbichler)


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.

von J. R. (yoc)


Lesenswert?

H. H. schrieb:
> Für Bastelei besser einen Digitalkoppler nehmen, z.B. 6N137. Für Serie
> sind die paar 10ct natürlich zu teuer...

Ich habe die MIDI Interfaces immer mit PC900 aufgebaut.
Gab nie Probleme.

von M.A. S. (mse2)


Lesenswert?

Kann es sein, dass der PC900 obsolet ist?
Die Segor-Seite bietet den H11L1M als möglichen Ersatz an.

von Cartman E. (cartmaneric)


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.

von Harald K. (kirnbichler)


Lesenswert?

Cartman E. schrieb:
> Hier hat "Pichler" einfach mal recht.

Welche schwere Störung hast Du eigentlich in Deiner Kindheit 
mitbekommen?

Was soll das?

von Cartman E. (cartmaneric)


Lesenswert?

Schmeckt dir deine "eigene" Medizin nicht?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von Cartman E. (cartmaneric)


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.

von Harald K. (kirnbichler)


Lesenswert?

Cartman E. schrieb:
> Schmeckt dir deine "eigene" Medizin nicht?

Wo habe ich Dich erniedrigend als Säufer dargestellt?

von Clemens L. (c_l)


Lesenswert?

M.A. S. schrieb:
> Kann es sein, dass der PC900 obsolet ist?

Ja. Wahrscheinlich, weil es keine SMD-Variante gab.

> Die Segor-Seite bietet den H11L1M als möglichen Ersatz an.

Der PC900 war in der Tat ein Klon des H11L1.

von Joachim B. (jar)


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!

von Norbert (der_norbert)


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.

von Harald K. (kirnbichler)


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.

von Norbert (der_norbert)


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.

von Björn W. (bwieck)


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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.
von Norbert (der_norbert)


Lesenswert?

Tja, dann können die Dinger anscheinend etwas, was in deren höchst 
eigenen Datenblättern explizit nicht erwähnt ist.

von Björn W. (bwieck)


Lesenswert?

Norbert schrieb:
> Tja, dann können die Dinger anscheinend etwas, was in deren höchst
> eigenen Datenblättern explizit nicht erwähnt ist.

Die Chinesen Nehmen es offenbar nicht so Genau mit ihren 
Datenblättern...
Das ist auch ein Grund warum ich mich bisher nicht mit Dingen von 
Espressif angefreundet habe.

von Harald K. (kirnbichler)


Lesenswert?

Björn W. schrieb:
> Die Chinesen ...

Sehen bekanntlich auch alle gleich aus.

von Martin (astromartin)


Angehängte Dateien:

Lesenswert?

Hallo,
hab mit meinem RolandE20 und Arduino ähnliches programmiert,
Als Optokoppler der 6N139 und die Daten waren schon die richtigen.
Gruß Martin

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.