- LiFePO4 Speicher Test         
Ergebnis 1 bis 9 von 9

Thema: RS232: Werte kommen sehr eigenartig an

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.05.2007
    Alter
    32
    Beiträge
    183

    RS232: Werte kommen sehr eigenartig an

    Anzeige

    Powerstation Test
    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:
    Code:
    #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:
    Code:
    => 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.

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.05.2007
    Alter
    32
    Beiträge
    183
    Ok, die Länge hab ich geändert und deinen Vorschlag auch schonmal übernommen. Jetzt bekomme ich folgenden Output:
    Code:
    => 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.

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.05.2007
    Alter
    32
    Beiträge
    183
    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

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    22.02.2007
    Ort
    Hannover
    Alter
    46
    Beiträge
    12
    Evtl. liegt es daran:

    b1 = 0x10010001;

    sollte sein

    b1 = 0b10010001;

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

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    @Nepi: Genial, da könntest du recht haben.

    uiuiui, hab ich nicht bemerkt
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.05.2007
    Alter
    32
    Beiträge
    183
    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:

    Bild hier  

    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!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad