Hallo mal wieder!
Hatte einigen Schulstress, deshalb melde ich mich jetzt erst. Danke schonmal für die zahlreichen Antworten!
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).
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
Lesezeichen