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