Forum: Mikrocontroller und Digitale Elektronik 8051-Midi-Übertragung zum PC funktioniert nicht, Hilfe gesucht


von Stefan Biereigel (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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?

von Jobst M. (jobstens-de)


Lesenswert?

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

von Stefan Biereigel (Gast)


Lesenswert?

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.

von Stefan Biereigel (Gast)


Lesenswert?

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 :(

von Stefan Biereigel (Gast)


Lesenswert?

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.

von Stefan Biereigel (Gast)


Lesenswert?

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.

von Route_66 (Gast)


Lesenswert?

Hallo!

Wenn Du uns den aktuellen Code vorenthälst, können wir im Moment leider 
nicht helfen.

von Stefan Biereigel (Gast)


Lesenswert?

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

von Mano W. (Firma: ---) (manow)


Lesenswert?

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).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Jobst M. (jobstens-de)


Lesenswert?

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
Noch kein Account? Hier anmelden.