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?
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.
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."
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."
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.
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.
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.
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.
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!
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.
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.
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.
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.
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.
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.