Ich bin verwirrt - Serielle Schnittstelle arbeitet "verdreht"?

Hallo zusammen,

ich bin relativ neu im Microcontroller Thema, deshalb seid bitte gnädig mit mir. Derzeit baue ich mir einen MIDI-Controller basierend auf einem Arduino Mega 2560. Ziel ist es, mit diversen Buttons und Potis ein MIDI Device zu steuern und vom MIDI Device die MIDI Clock Messages zu erhalten.

  • Das MIDI Device ist über einen MIDI/USB Adapter mit meinem Controller verbunden. Dieser Adapter zeigt über LEDs an, ob er gerade Daten sendet (TX) oder empfängt (RX).
  • Für die MIDI Kommunikation verwende ich Serial1 (RX1/TX1) auf dem Arduino Mega, die "normale" Serial nutze ich für Debug-Ausgaben
  • Serial1 ist mit einer Baudrate von 31250 konfiguriert
  • Das Ansteuern des MIDI Devices = senden von MIDI Befehlen funktioniert
  • Das Empfangen der MIDI Clock Signale funktioniert nicht. Seltsamerweise zeigt mein Code (s.u.) immer dann an, dass Serielle Daten im Empfangspuffer liegen, wenn die RX LED NICHT blinkt und anders herum?!
    Code Snippets:
  1. Initialisierung der Serial1 Schnittstelle:
const long midi_baudrate = 31250;

void MidiManagerClass::init()
{
	Serial1.begin(midi_baudrate);
}
  1. Methode zum Empfangen der MIDI-Clock (oder Daten auf Serial1 allgemein):
void XYZClass::MidiGetSerialData() {
	int count = Serial1.available();
	if (count > 0) {
		Serial.print("Received ");
		Serial.print(count, DEC);
		Serial.print(" Bytes.\t Content:\t", false, false);
		char inByte = Serial1.read();
		Serial.println(inByte, );
                //...weitere Verarbeitung der empfangenen Daten
	}
	else
	{
		Serial.println("No serial data received.");
 	}
}

Also de facto ist es so, wenn mein MIDI Device die Clock Signale sendet, gibt mein Code "No serial data received" aus (obwohl auch der MIDI/USB Adapter fleissig bei RX blinkt). Und wenn ich die Clock-Signale am MIDI Device deaktiviere (RX am Adapter blinkt nicht mehr) gibt mein Code "Received...." aus.
Hat irgendwer eine Idee, was da schief laufen könnte? Vielen Dank im Voraus für eure Hilfe!
VG
Micha

ktuth:
Hallo zusammen,

ich bin relativ neu im Microcontroller Thema, deshalb seid bitte gnädig mit mir. Derzeit baue ich mir einen MIDI-Controller basierend auf einem Arduino Mega 2560. Ziel ist es, mit diversen Buttons und Potis ein MIDI Device zu steuern und vom MIDI Device die MIDI Clock Messages zu erhalten.

  • Das MIDI Device ist über einen MIDI/USB Adapter mit meinem Controller verbunden. Dieser Adapter zeigt über LEDs an, ob er gerade Daten sendet (TX) oder empfängt (RX).
  • Für die MIDI Kommunikation verwende ich Serial1 (RX1/TX1) auf dem Arduino Mega, die "normale" Serial nutze ich für Debug-Ausgaben
  • Serial1 ist mit einer Baudrate von 31250 konfiguriert
  • Das Ansteuern des MIDI Devices = senden von MIDI Befehlen funktioniert
  • Das Empfangen der MIDI Clock Signale funktioniert nicht. Seltsamerweise zeigt mein Code (s.u.) immer dann an, dass Serielle Daten im Empfangspuffer liegen, wenn die RX LED NICHT blinkt und anders herum?!
    Code Snippets:
  1. Initialisierung der Serial1 Schnittstelle:
const long midi_baudrate = 31250;

void MidiManagerClass::init()
{
Serial1.begin(midi_baudrate);
}





2) Methode zum Empfangen der MIDI-Clock (oder Daten auf Serial1 allgemein):


void XYZClass::MidiGetSerialData() {
int count = Serial1.available();
if (count > 0) {
Serial.print("Received ");
Serial.print(count, DEC);
Serial.print(" Bytes.\t Content:\t", false, false);
char inByte = Serial1.read();
Serial.println(inByte, );
               //...weitere Verarbeitung der empfangenen Daten
}
else
{
Serial.println("No serial data received.");
}
}




Also de facto ist es so, wenn mein MIDI Device die Clock Signale sendet, gibt mein Code "No serial data received" aus (obwohl auch der MIDI/USB Adapter fleissig bei RX blinkt). Und wenn ich die Clock-Signale am MIDI Device deaktiviere (RX am Adapter blinkt nicht mehr) gibt mein Code "Received...." aus.
Hat irgendwer eine Idee, was da schief laufen könnte? Vielen Dank im Voraus für eure Hilfe!
VG
Micha

Noch als Ergänzung: mein Code gibt immer aus, dass 1 Byte empfangen wurde, mit dem Inhalt "0"

also z.B. bei einigen meiner MEGA Clones ist RX1/TX1 schlichtweg falsch herum beschriftet.
Mach dir keinen Kopf, schlies es an so dass es funktioniert und aus.

Ansonsten bräuchten wir hier von dir einen exakten Schaltplan und Bilder von deinem Aufbau.

noiasca:
also z.B. bei einigen meiner MEGA Clones ist RX1/TX1 schlichtweg falsch herum beschriftet.
Mach dir keinen Kopf, schlies es an so dass es funktioniert und aus.

Ansonsten bräuchten wir hier von dir einen exakten Schaltplan und Bilder von deinem Aufbau.

OK, ich probiere es mal mit verdrehten Anschlüssen. Aber dann würde doch das Senden nicht funktionieren , oder? Egal, Probieren geht über Studieren...

ktuth:
OK, ich probiere es mal mit verdrehten Anschlüssen. Aber dann würde doch das Senden nicht funktionieren , oder? Egal, Probieren geht über Studieren...

Leider war das nicht die Lösung. Wie vermutet, wenn ich RX und TX vertausche funktioniert beides (Senden und Empfangen) nicht

Ich habe es gerade selbst gelöst: wenn ich den RX1 Pin Mode auf "INPUT_PULLUP" setze funktioniert es. Mir war nicht bewusst, dass man den Pin Mode auch für die RX/TX Pins setzen muss...

ktuth:
Ich habe es gerade selbst gelöst: wenn ich den RX1 Pin Mode auf "INPUT_PULLUP" setze funktioniert es. Mir war nicht bewusst, dass man den Pin Mode auch für die RX/TX Pins setzen muss...

Da stellt sich die Frage, wie die Sendeseite funktioniert. Ist das evtl. ein Open-Collector Ausgang? Hast Du da einen Schaltplan? Was ist das denn für ein Adapter? MIDI ist ja eigentlich eine Stromschleifen-Schnittstelle.

MicroBahner:
Da stellt sich die Frage, wie die Sendeseite funktioniert. Ist das evtl. ein Open-Collector Ausgang? Hast Du da einen Schaltplan? Was ist das denn für ein Adapter? MIDI ist ja eigentlich eine Stromschleifen-Schnittstelle.

Schaltplan müsste ich erstellen… werde ich noch machen

Schaltplan wäre schonmal gut.
Was ist denn mit deinem USB-MIDI Adapter. Hat der auf der MIDI-Seite eine 'echte' MIDI-Schnittstelle? Wie gesagt wäre das dann eine Stromschleifenschnittstelle. Da ist auf der Empfängerseite an sich ein Optokoppler vorgesehen. Das würde auch den notwendigen 'PullUP' erklären.
Hast Du einen Link zu dem Adapter?

MicroBahner:
Schaltplan wäre schonmal gut.
Was ist denn mit deinem USB-MIDI Adapter. Hat der auf der MIDI-Seite eine 'echte' MIDI-Schnittstelle? Wie gesagt wäre das dann eine Stromschleifenschnittstelle. Da ist auf der Empfängerseite an sich ein Optokoppler vorgesehen. Das würde auch den notwendigen 'PullUP' erklären.
Hast Du einen Link zu dem Adapter?

Hier der Link:
Adapter

Ok, das ist dann auf der MIDI-Seite eine Stromschleife. So wäre die korrekte Verbindung zum Arduino:

Interface.PNG

Pin2 ist der Schirm des Midi-Kabels. Der sollte nur auf einer Seite mit Gnd verbunden sein (Edit: üblicherweise am MIDI-Out. MIDI-In ist ja die galvanisch getrennte Seite )

Interface.PNG