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.
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.