PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Midi über Uart



Mr-400-Volt
08.08.2006, 18:14
Hallo, ich glaube ich habe das Thema erst in das falsche Forum geposted. Bitte um entschuldigung..........
Mein Problem ist das richtige empfangen und analysieren eines Midi-Signals über die Uart. Irgendwie beckomme ich das nicht hin. Kann mir einer von Euch helfen ? Währe super !!!


Danke !

PicNick
08.08.2006, 18:27
MIDI geht mit Optokoppler und einer Baudrate von 31250 , sonst normal.
(8-Bit, Noparity, 1 Stop)
Hardware:
https://www.roboternetz.de/wissen/index.php/MIDI-Interface

Über den Aufbau der "MIDI Messages" schau mal bei Google, Massen von Seiten.

Wenn dann noch Fragen sind, dann frag' nur

Mr-400-Volt
08.08.2006, 18:51
Ja, habe einen Optokoppler eingesetzt. Hier mal meinen Code :

$regfile = "m16def.dat"
$crystal = 12000000
$baud = 31250
Baud = 31250
Dim I As Byte
Cls

Do
If Usr.rxc = 1 Then
I = Udr
Locate 1 , 1
Lcd I ; " "
End If
Loop
End

Ich beckomme immer die selben Werte, egal was ich für eine Taste am Keyboard drücke.
Manchmal auch nur eine "00000010"

chr-mt
08.08.2006, 20:29
Hi,
invertiert der Optokoppler?

Gruß
Christopher

08.08.2006, 21:09
Es ist ein 6N138, ich glaube nicht..........

linux_80
08.08.2006, 21:28
Hallo,
hast Du schon mal geschaut wie das MIDI-Protokoll in etwa aufgebaut ist ?
Wenn du alle Bytes an die gleiche Stelle auf dem LCD schreibst, werden die verhergehenden ja immer überschrieben, denn es werden auch mal mehr Bytes pro Übertragung gesendet, und nur das letzte angezeigt !

08.08.2006, 21:39
Das ist ja mein problem, das ich nicht weis, wie ich mit der Uart richtig empfangen kann, und wie ich die Bytes auseinander nehmen kann zur weiteren verarbeitung.

13.08.2006, 18:52
Hallo, ich habe nun mal folgendes ausprobiert. Ich wollte die 3 Bytes hintereinander Lesen, und beckomme auch werte rein, aber recht durcheinander. Wenn ich keine taste drücke, erhalte ich 3 mal 254 ????Muß ich das noch irgendwie Syncronisieren ? Wenn ja wie ?


$regfile = "m16def.dat"
$crystal = 12000000
$baud = 31250

Dim I(3) As Byte
Cls

Do

I(1) = Udr
I(2) = Udr
I(3) = Udr
Locate 1 , 1
Lcd Bin(i(1))
Locate 2 , 1
Lcd I(2)
Locate 3 , 1
Lcd I(3)

Loop

linux_80
13.08.2006, 19:56
Hallo Gast,

Du musst schon zwischendurch abfragen ob überhaupt ein neues Byte angekommen ist, so wie jetzt wird 3mal der gleiche Wert in die 3 Variablen übernommen.

Schau Dir mal dazu den Befehl Inkey() an.

13.08.2006, 20:34
Wo muß der Befehl hin ? Oh mann, ich hab keine ahnung, wie ich die Bytes richtig über die Uart einlesen kann. Ich weis nur, das es 3 Bytes sind, wovon das erste das Statusbyte ist und kanal nummer, das zweite die Notennummer und das dritte die Lautstärke enthällt.
Brauche dringend Hilfe !!!
Gibt es da irgendwo ein Beispiel ???

Danke !

Mr-400-Volt
15.08.2006, 19:08
Also, ich habe nun folgendes gemacht. Erst mal gerfagt ob etwas kommt, und dann das 8te bit abgefragt, ob es gesetzt ist. Danach die nächsten 2 bytes geholt. Aber irgendwie klappt es nicht richtig..........??????????



$regfile = "m16def.dat"
$crystal = 12000000
$baud = 31250

Dim I(3) As Byte

Cls

Do
If Usr.rxc = 1 Then
I(1) = Udr
If I(1).8 = 1 Then
I(2) = Udr
I(3) = Udr

Locate 1 , 1
Lcd Bin(i(1))
Locate 2 , 1
Lcd I(2)
Locate 3 , 1
Lcd I(3)
End If
End If
Loop
End

linux_80
15.08.2006, 19:29
Du musst schon vor jedem Lesen abfragen ob ein neues Zeichen da ist, nicht nur beim ersten mal,
schau Dir halt man den Befehl Inkey() an, dann musst Du nicht jedes Bit per Hand auslesen, Bascom hat doch (fast) alles eingebaut, mehr kann ich auch nicht für Dich tun.
Beschreibung lesen musst Du schon selber !

Mr-400-Volt
15.08.2006, 21:07
Also ich komm nicht weiter.......Folgender Code läuft auch nicht.........Durch ersetzen der abfragen mit dem inkey() geht es auch nicht. Ich weiß nicht, wie ich es noch timen soll............Kann mir denn niemand sagen, wie ich zumindest das erste Byte (Statusbyte) richtig einlesen kann ?


$regfile = "m16def.dat"
$crystal = 12000000
$baud = 31250

Dim I(3) As Byte , A As Byte , X As Byte

Cls

X = 0

Do



A = Udr
If A.0 = 1 Then
I(1) = Udr
End If
A = Udr
If A.0 = 1 Then
I(2) = Udr
End If
A = Udr
If A.0 = 1 Then
I(3) = Udr
End If





Locate 1 , 1
Lcd Bin(i(1))
Locate 2 , 1
Lcd I(2)
Locate 3 , 1
Lcd I(3)


Loop