PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232: Werte kommen sehr eigenartig an



Bääääär
01.01.2008, 19:17
Hallihallo!

Ich hab mal wieder ein Problem... Ich will MIDI-Daten mit dem ATMega32 senden. (Das ganze geht über RS232 mit 31250 Baudrate, hier habe ich sie zum testen auf 9600 runtergeschraubt). Angefangen habe ich mit den Note_On und Note_Off Messages, die je 3 Byte lang sind. Folgendes ist mein Programmcode:
#include <Arios\serial.h>
//#include <stdio.h>
#include <util\delay.h>
#include <Arios\main_f.h>

void MIDI_NoteOn(unsigned char Channel, unsigned char Note, unsigned char Velocity) {
char b1, b2, b3;

b1 = 0x10010001;
//b1 = 0x10010000;
//b1 |= Channel;

b2 = 0x01110111;
//b2 = 0x01111111;
//b2 |= Note;

b3 = 0x01111111;
//b3 &= Velocity;

RS232_send(b1, 1, cBlocking);
RS232_send(b2, 1, cBlocking);
RS232_send(b3, 1, cBlocking);

}

void MIDI_NoteOff(unsigned char Channel, unsigned char Note, unsigned char Velocity) {
unsigned char b1, b2, b3;

b1 = 0x10000001;
//b1 = 0x10000000;
//b1 |= Channel;

b2 = 0x01110111;
//b2 = 0x01111111;
//b2 |= Note;

b3 = 0x01111111;

RS232_send(b1, 1, cBlocking);
RS232_send(b2, 1, cBlocking);
RS232_send(b3, 1, cBlocking);

}

int main (void) {

RS232_init(9600);
if (SetPort(PORTD, PD5, DirOutHigh) != -1) { // funktion zum setzten der Ports, hier denke ich aber nicht von Intresse
while(1) {
RS232_send("\r\n=> Note on:\r\n", 19, cBlocking);
MIDI_NoteOn(0x00000001, 68, 127);
_delay_ms(1000);

RS232_send("\r\n=> Note off:\r\n", 20, cBlocking);
MIDI_NoteOff(0x00000001, 68, 127);
_delay_ms(1000);

}
return 0;
} while(1);
}
Das wegkommentierte ich den MIDI_* Funktionen ist der eigentliche Code, zum Testen sende ich jedoch lieber "statische" Werte.

Das Hyperterminal gibt mir folgende Werte aus:
=> Note on:

=
=> Note off:
J
=> Note on:

=
=> Note off:
w
=> Note on:

=
=> Note off:
$
=> Note on:

=
=> Note off:
Q
Was mit wundert: Meine eingegebenen Strings werden wunderbar gesendet, meine Werte jedoch sehen jedesmal anders aus und bestehen nicht mal aus drei bytes, sondern immer nur einem...

Wo liegt mein Fehler, bei der doch so einfachen Aufgabenstellung?

Vielen Dank für eure Mühe,
Bääääär

PS: Wenn nötig, hänge ich die serial-funktionen noch an, aber ich denke, meine strings zeigen, dass sie ordnungsgemäß laufen.

PicNick
01.01.2008, 20:25
mmmh.
Scheint doch was mit der sendefunktion auf sich zu haben, nämlich mit der Parameterübergabe.
RS232_send() erwartet als erstes Argument die Adresse eines strings.
Gibts du ihm das (text), funzt er ja offensichtlich
Versuchs mal mit
RS232_send((char*)&b1, 1, cBlocking);
dann gibt's keine ausreden mehr.

PS: der zweite Parameter schein die Länge zu sein. Wieso schreibst du beim "text--bla" "19" hin ? sol lang ist der Text doch garnicht ?
"\n" ist ja z.B. nur ein Zeichen)

Bääääär
01.01.2008, 21:03
Ok, die Länge hab ich geändert und deinen Vorschlag auch schonmal übernommen. Jetzt bekomme ich folgenden Output:


=> Note on:

=> Note off:
Aber das entspricht immer noch nicht dem, was ich angegeben habe, oder?
Da dürfte laut ASCII-Table ein "w" und unter anderem auch ein "`" drin sein. Und: Es ist beides dasselbe, darf es aber eigentlich nicht.

Kannst du mir noch sagen, was ich mit (char*)&b1 genau bewirke?

Danke für die schnelle Hilfe,
Bääääär

Edit: Mist, man sieht die Zeichen hier nicht... also es ist beides je ein smilie und daneben zwei pfeile nach links.

PicNick
02.01.2008, 15:32
Naja, die MIDI-Zeichen sind nun einmal nicht druckbar, klar zeigt das Terminal nur smileys, das ist schon ok, hauptsache mal, es sind 3 stück
0xC1
0x77
0x7F
Häng' mal die Orgel an, die sollte schon pfeifen.

Oder du nimmst beim Testen nur werte von 33-126, das gibt lesbaren Output
Für "echtes" MIDI mußt du ja sowieso noch einiges umbauen.

Bääääär
02.01.2008, 22:39
Das das im Terminal was anderes sein wird, ist ja klar. Aber ich hab im Table nachgeschaut... Wie gesagt, es dürfte unter anderem ein"w" drin sein, wenn mich nicht alles täuscht.

Die Orgel (naja, eher das Keyboard) hing schon dran (ja, ich habe auch die Baudrate wieder geändert), ließ sich aber nicht dazu bewegen, irgendeinen Ton von sich zu geben. Also stimmt mindestens der NoteOn noch nicht. (oder aber meine Verdratung, aber die habe ich auch schon einige Male kontrolliert)

Klar, für "echtes" Midi kommt noch einiges hinzu, aber solange das hier nicht läuft kann ich mir das echte MIDI leider abschminken ^^

Bääääär

PicNick
03.01.2008, 10:44
Tja, nur ein Versuch :
Beim DIN-stecker 4 / 5 mal vertauschen, da kann man sich leicht irren

Du schickst C1 , was ist auf der Orgel eingestellt ?
MIDI kanal 1 wäre C0
MIDI kanal 2 wäre C1

oder OMNI, logo

Nepi
03.01.2008, 11:52
Evtl. liegt es daran:

b1 = 0x10010001;

sollte sein

b1 = 0b10010001;

Kenn mich mit Midi nicht aus und deine Uartroutine auch nicht. Vielleicht hilfts ja.

PicNick
03.01.2008, 13:13
@Nepi: Genial, da könntest du recht haben.

uiuiui, hab ich nicht bemerkt :oops:

Bääääär
05.01.2008, 08:53
Tatsache, das war's... - orgeln tut mein Synthesizer aber leider immer noch nicht...

Also, ich hab mir jetzt mal MIDI OX runtergeladen, damit kann man anzeigen, was grade so passiert am MIDI-Port:

http://img166.imageshack.us/img166/2443/miditestjs9.th.jpg (http://img166.imageshack.us/my.php?image=miditestjs9.jpg)

Irgendwie kommen da massig NoteOn's und NoteOff's an. Und immer unterschiedliche... Aber immerhin, es kommt überhaupt was an!

Danke für die geniale Hilfe,
Bääääär

Edit: Achso... Ich sende immernoch die Informationen mit. Das erklärt die vielen NoteOn's. Das erste Byte ist mein NoteOn Befehl, die anderen sind die Text-Zeichen. Wenn nach einer fertigen Message (hier NoteOn) weitere Datenbytes kommen, werden sie ebenfalls als NoteOn message gewertet. Jetzt spielt das Keyboard wunderbar ein hohes H, mein softwaresynthesizer spielt jedoch gar nix. Naja, das bekomm' ich auch noch hin.

Edit: OK, der software synthie läuft jetzt auch. Vielen Dank an alle Helfer!