Liste der Anhänge anzeigen (Anzahl: 1)
MIDI Übertragungsfehler [gelöst]
Hallo alle zusammen!
Ich habe folgendes Problem, bei dem ich eure Hilfe brauche:
Ein Atmega32 @ 16Mhz empfäng Daten von einem MIDI-Keyboard. Die angehängte Schaltung wandelt die Daten von einem "Strom-Signal" in ein "Spannungs-Signal" um (sodass ich sie bei 31250 Baud mit der USART empfangen kann).
Leider kommt es immer wieder zu Übertragungsfehler, was bei einem MIDI Instrument - nunja - bescheiden ist. Immer wieder bleiben Töne hängen oder gar falsche Töne erklingen.
Zwischen der Platine mit der angehängten Schaltung und dem AVR sind nochmal 15cm ungeschirmte Leitung (einfach 2 Kabel).
Was kann ich tun, um die Fehler zu minimieren?
Danke für Hilfe,
Bääääär
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hoffe doch, dass der Code in Ordnung ist. ich habe ihn mal angehangen.
Zum Phänomen: Es erklingen beim Drücken einer Taste teils falsche Töne, die dank richtig überragenem NoteOff-Event dann hängen bleiben. Das sind eigentlich fast alle möglichen Töne - rauf und runter.
Folgendes wird bem Empfangen aufgerufen:
Code:
SIGNAL (SIG_USART_RECV) {
Keyboard_ReceiveMessage(UDR);
}
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo mal wieder!
Hatte einigen Schulstress, deshalb melde ich mich jetzt erst. Danke schonmal für die zahlreichen Antworten!
Zitat:
Welche Werte hast du für r5, r6 ?
Die Werte der Widerstände, die den Optokoppler betreffen, entsprechen denen im von mir geposteten Schaltplan (hier).
Wenn ich das mit dem running status richtig verstanden habe, dann beherrsche ich den. Ich verwende solange das letzte Statusbyte (also das der letzten vollen Message), bis wieder ein Statusbyte ankommt. Ich habe nochmal zwei Kommentare in GROSSBUCHSTABEN angefügt, die diese Thematik betreffen.
Code:
// This function is called, when new data from the keyboard reaches the UART-RX.
// It stores all bytes in "LastMessage", until a NoteOn or NoteOff message is complete.
void Keyboard_ReceiveMessage(unsigned char c){
// WENN DAS EMPFANGENE BYTE GROESSER IST ASL 127 (ALSO VORNE EINE 1 HAT => EIN STATUSBYTE IST) WIRD ES ALS LETZTES STATUSBYTE VERMERKT
if (c > 127) { // if c is a command-byte, restart receiving message
received = 0;
}
LastMessage[received] = c;
received++;
if (((received == 3) && ((LastMessage[0]>>4) == 0b00001001)) || // if the received message has 3 bytes and is a NoteOn-Event
((received == 2) && ((LastMessage[0]>>4) == 0b00001000))) { // or if it has 2 bytes and is a NoteOff-Event
// wait if the Buffer is full.
sei();
while((KEYBOARDBUFFERSIZE + Keyboard_Buffer_Start - Keyboard_Buffer_End) % KEYBOARDBUFFERSIZE >
(KEYBOARDBUFFERSIZE - 2));
cli();
// This Message is now complete => it can be filled in the buffer
Keyboard_Buffer[Keyboard_Buffer_Start][0] = LastMessage[0];
Keyboard_Buffer[Keyboard_Buffer_Start][1] = LastMessage[1];
Keyboard_Buffer[Keyboard_Buffer_Start][2] = LastMessage[2];
Keyboard_Buffer_Start++ ;
if (Keyboard_Buffer_Start > KEYBOARDBUFFERSIZE - 1) {
Keyboard_Buffer_Start = 0;
}
// reset to get the next (one/two) databytes
// HIER WIRD WIEDER ZURÜCKGESETZT, ABER SO, DASS DAS LETZTE STATUSBYTE ERHALTEN BLEIBT
received = 1;
}
}
Ja, der Code soll nur Note-On oder Note-Off erkennen, da ich damit die Daten aus der Platine einer Klaviatur auslese. Das ganze findet in meiner Keytar Verwendung (siehe Anhang).
Zitat:
Keyboards, die so funktionieren, wie z.B.
das Oxygen V2 von M-Audio, kennen daher auch kein echtes "Note Off" (0x8n), sondern
machen für "Note Off" nochmals ein "Note On" (Bzw. bleibt es beim Status 0x9n) mit der Velocity 0 auf die entsprechende Notennummer.
Auch das funktioniert bei mir.
Nochmals zur Problembeschreibung: Die falsch gesendeten Töne (kommt bei Note-Ons und bei Note-Offs vor) kommen eher sporadisch. Es gibt Phasen, da geht alles und es gibt Phasen, da spielt meine Keytar nur Müll. Ich vermute sehr stark, dass es da geringe Einflüsse von außen gibt (z.B. Felder von Boxen oder sonstwas) die Dank falscher Beschaltung bzw. falschem Optokoppler dick ins Gewicht fallen...
Ich würde das gerne mal am Oszi betrachten, um zu sehen, wo das Problem liegt - ich habe auch einen (wenn er die Bezeichnung Oszi verdient). Bild siehe Anhang. Ich hab keine Ahnung, wie man den benutzt...
Nochmal zum PC900: Ich werde mir mal einen kaufen. Wie sieht die Beschaltung bei dir aus, wkrug?
Vielen Dank,
Bääääär