Hallo zusammen, habe heute mal ein selbst für mich sehr komisches Anliegen. Wollte mir ein Programm schreiben, was mir an meinen Sequenzer über mein MIDI-Interface Befehle schickt. Das Beispielprogramm hier soll zB einfach ein Note On Note 33 und dann nach kurzer Zeit ein Note Off 33 senden, ganz einfach eigentlich. Allerdings - funktioniert das ganze nicht. Meine Hardware ist definitiv nicht die Fehlerquelle, die Schaltung mit Optokoppler an P3.1 funktioniert 100%ig. Quarz an meinem 8051 ist 24MHz, entsprechender Timerwert also FC bzw FE (je nach SMOD). Allerdings kommt am PC nichts so wirklich an, bzw wenn - dann nur Note Ons für Key 0 (was als C1 interpretiert wird) und ich kann mir einfach nicht erklären, wieso. (Lese einkommende MIDI-Messages mit MIDIMonitor mit, mit meinem Keyboard funktioniert das auch Prima). Bin über jeden Ansatz der Hilfe dankbar. Source in ASM im Anhang, danke!
> Quarz an meinem 8051 ist 24MHz Welcher ist das? Ein "normaler" 8051 ist damit doch überfordert... :-o > Lese einkommende MIDI-Messages mit MIDIMonitor mit Hast du auch schon mal mit einem Oszi die Bitzeiten ausgemessen?
Was mir zuerst auffällt ist, daß Du zwar alle Interupts (SER, Timer1) aktivierst, aber nicht behandelst. clr SM0 setb SM1 setb REN Erledigt sich auch mit einem MOV SCON, #50h Evtl. noch ein ANL PCON, #07Fh anfügen - um nicht versehentlich 62500Bd zu haben :-) Aber wirkliche Fehler sind mir ein deiner init nicht aufgefallen - bis auf die Interrupts ... Und dann ist da noch ein Byte, das verschickt wird - das sollte da auch weg ... Eieiei ... Also, Du verschickst ein Zeichen und wartest darauf, daß TI gesetzt wird. Da Du alle dazugehörigen Interupts erlaubt hast, springt der uC nun zu 0x0023 - und wg. RETI wieder zurück. Dann schreibst Du 0x81 in Speicherzelle 21 - und wieder rennt der uC auf 0x0023 - TI ist ja noch gesetzt - und wieder zurück. Dann springst Du zu 'Byte_senden' - und der uC abermals auf 0x0023 und zurück. Nun kopierst Du Speicherzelle 21 in den Akku und der uc geht wieder zu 0x0023+back. JNB prüft auf TI nicht gesetzt - ist aber und der uC macht wieder seinen Hin/Rücksprung. Nun verschickst Du den Akku und der uC springt nochmals in den seriellen IRQ - was an dieser Stelle normalerweise nicht passieren dürfte - aber im IRQ wird ja nix gemacht - also nicht schlimm ... Endlich nun wird TI gelöscht ... Nachdem das letze Byte gesendet wurde, und TI wieder gesetzt wird, wird die wait-schleife seeeeehr lang ... Ist sehr eigenwillig, das in dieser Reihenfolge zu tun: jnb ti,* mov sbuf,a clr ti Mein Tip: Erst senden, dann prüfen ob versandt und dann TI zurücksetzen. loop: mov SBUF, #10000001b lcall waitsend mov SBUF, #00100001b lcall waitsend mov SBUF, #00100111b lcall waitsend lcall wait mov SBUF, #10010001b lcall waitsend mov SBUF, #00100001b lcall waitsend mov SBUF, #00010111b lcall waitsend lcall wait ljmp loop waitsend: jnb ti,* clr ti ret Gruß Jobst
Lothar Miller schrieb: >> Quarz an meinem 8051 ist 24MHz > Welcher ist das? > Ein "normaler" 8051 ist damit doch überfordert... :-o AFAIK nicht, viele Lösungen die 8051 und MIDI verbinden werden mit einem 24MHz-Quarz gemacht, nutze hier einen AT89S8252, der kann mit 24MHz umgehen. Die Bitzeiten stimmen, hab ich mitm Oszi gerade nochmal geprüft. Mein MIDI-Interface scheint auch wenigstens Daten bei der richtigen Baudrate zu empfangen, denn die "IN"-Lampe blinkt wie üblich wenn ein Paket gesendet wird. Im Sequencer leuchtet ebenfalls die MIDI-IN-Fläche aber es kommen scheinbar die Bits nicht so an wie sie sollen :( VSTis (SoftwareInstrumente) und der MIDI-Monitor geben garnix aus, mit meinem Keyboard gehts am gleichen Interface wie gesagt problemlos. Jobst: Danke für deine Ideeen und Anregungen, habe die jetzt mal alle in die Tat umgesetzt, geändert hat das aber leider nix. Nunja ich werd mal weiter rumprobieren, wenn noch jemand eine Idee hat, danke ich schonmal im Voraus.
Habe nochmal ein bisschen die unter bestimmten Bedingungen im Monitor auftauchenden Meldungen genauer angeschauen und mal hier zusammengefasst, im Vorhinein schonmal, ich glaube fast, dass es an der Syncronisation liegt, aber wo genau weiß ich nicht: (Das habe ich gerade schonmal an jemanden per Mail verschickt, kopiere das hier nur rein): Irgendwie schaut mir das nach nem Timingproblem aus, als ob das Interface nen paar Bytes verpassen würde. Etwas spanisch und zwar wie folgt: Wenn ich zwischen den ganzen Bytes nen Delay gebe (sehr groß) erkennt er manchmal was als "Pitch Wheel Change Channel 1" mit unterschiedlichen Values in folgender Abfolge immer wiederholt: 126, 16254, 16128 Betrachten wir das ganze mal Binär, wie wir das ja immer gerne Tun, Denn wer MIDI macht, schubst auch kleine Bits vom Fahrrad :) Unsere Gesendeten Bytes 10010001 01111111 01111111 10000000 01111111 01111111 Er empfängt (wenn ich mal die Messages ausm MIDI-Monitor übersetze): 11100000 01111110 (ist die 126, 11100000 = Pitch Control Channel 1, angegeben als Pitch LSB MSB, hier wird wohl nur LSB empfangen und gewertet) 11100000 00111111 01111110 (ist die 16254) 11100000 00111111 00000000 (ist die 16128) Na sieht das nicht ähnlich aus? Die ganzen 1en sind doch schonmal weiter oben :) Nämlich bei dem was wir senden. Meine Theorie ist dass da irgendwas fehlt oder so, vllt Startbit, bzw die Gegenseite es nicht mitbekommen? Vllt mein µC schuld? Ich hab echt keine Idee wo ich in der Software noch suchen sollte, aufm Oszi sieht alles wie normal aus :(
Erstmal eingefroren, scheinbar ist mittlerweile mein TX-Pin bzw damit der UART defekt, aufm Oszi ist jetzt nur noch Müll zu sehen, der absolut nix mehr mit meinem aktuellen Gesendeten zu tun hat. Also heißts jetzt: Neuen µC probieren. Werde berichten, danke für eure Hilfe bisher.
Wieder zurück, Mikrocontroller geht wieder, Problem bleibt. Neue Erkenntnis: Direkt nach dem Flashen kommt EINE Note korrekt an, danach wird auch noch empfangen, allerdings nur ein "Note On Note 0 Velocity 64" und "note off 0 126" imemr abwechselnd. Ich weiß echt nicht mehr weiter.
Hallo! Wenn Du uns den aktuellen Code vorenthälst, können wir im Moment leider nicht helfen.
Ok um das Thema wenigstens Vernünftig zu schließen: Es geht jetzt alles. Einziger Tipp den ich allen MIDI-Einsteigern mitgeben kann: VERGESST OPTOKOPPLER bei solchen Baudraten. Dafür sind die normalen einfach zu träge. Habe mal gerechnet, der Maximalstrom der an den Pins zu erwarten ist ist 10 oder 20mA bei 5V, das können viele µCs ab. Mit freundlichen Grüßen und bestem Dank, Stefan
Aus neugier, welchen Optokoppler hast Du denn verwendet? Ich habe vor ein paar Jahren auch mal was mit MIDI gemacht und das lief einwandfrei mit Optokoppler (weiß aber nimmer welcher das war).
Stefan Biereigel schrieb: > Einziger Tipp den ich allen MIDI-Einsteigern > mitgeben kann: > > VERGESST OPTOKOPPLER bei solchen Baudraten. Hä? Midi arbeitet gerade mal mit 31.25 kBaud - und jedes ernstgemeinte MIDI-Interface nutzt selbstverständlich Optokoppler.
Bei SOLCHEN Baudraten??? Das sind 31250Bd. Ich schicke die Daten zu meinen Audio-DACs über Optokoppler - Immerhin 5 MBit/s Woraus besteht Dein Optokoppler? Aus einer Glühbirne und einem LDR? ;-) Optokoppler gehören zur MIDI-Spec, sollten also kein Problem darstellen. http://www.midi.org/techspecs/electrispec.php Gruß Jobst
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.