Hallo alle zusammen :)
Ich befasse mich derzeit mit Midi. Mir ist es gelungen, Midi-Signale zu
senden, hab auch eine "Midi-DAW" draus gebastelt. Doch jetzt würde ich
gerne Midi-Signale empfangen, doch das misslingt mir irgendwie :/
Könnte vll jemand über meinen Code/Schaltplan schauen, an welcher Stelle
ich was falsch gemacht habe? Aus folgenden Quellen habe ich mein "Wissen
bezogen" (zusammengepuzzlet)
- G++ AVR Tutorial auf dieser Seite
-
http://www.wiesolator.de/index.php?area=Musik&topic=MIDI-Einstieg&stopic=MIDI%20und%20AVR
- Wikipedia, Beitrag MIDI, Hauptsächlich Befehlstabelle
Mein Code hat nicht funktioniert. Deshalb hab ich ihn zu Debugzwecken
immer weiter umgebaut. Im jetztigen Zustand sollte er die empfangenen
Bytes zählen. Ich hab dabei Note On und Note Off gesendet, welches
jeweils 3 Bytes sein sollten, doch es kamen immer 5 oder manchmal auch 6
Bytes an.
Hier einmal mein Code:
1 | /*
|
2 | * MidiLight.cpp
|
3 | *
|
4 | * Created: 15.02.2014 16:32:38
|
5 | * Author: Matthias
|
6 | */
|
7 |
|
8 | #define F_CPU 16000000UL
|
9 | #define BAUD 31250UL
|
10 |
|
11 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
12 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
13 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
14 |
|
15 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
16 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
17 | #endif
|
18 |
|
19 | #include <avr/io.h>
|
20 | #include <stdlib.h>
|
21 |
|
22 | void init_USART(void)
|
23 | {
|
24 | UCSRB |= (1<<TXEN) | (1<<RXEN); //UART TX (Transmit enable)
|
25 | UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); //Mode Async 8N1 (8 Databits, No Parity, 1 Stopbit)
|
26 |
|
27 | UBRRH = UBRR_VAL >> 8;
|
28 | UBRRL = UBRR_VAL & 0xFF;
|
29 | }
|
30 |
|
31 | void sendchar(unsigned char c)
|
32 | {
|
33 | while(!(UCSRA & (1<<UDRE)));
|
34 | UDR = c;
|
35 | }
|
36 |
|
37 | unsigned char recvchar()
|
38 | {
|
39 | while(!(UCSRA & (1<<RXC)));
|
40 | return UDR;
|
41 | }
|
42 |
|
43 | int main(void)
|
44 | {
|
45 | init_USART();
|
46 | DDRA |= 0xFF;
|
47 |
|
48 | unsigned char firstchar, secondchar, thirdchar;
|
49 | uint8_t i = 0;
|
50 | while(1)
|
51 | {
|
52 | firstchar = recvchar();
|
53 | i++;
|
54 | if(i > 8) i = 0;
|
55 | PORTA = (1<<i);
|
56 | }
|
57 | }
|
Schaltplan habe ich als PDF angehongen.
Vielen Dank im voraus :)
Grüße, Matthias