ATmega32 <-> Midi | Falsche Anzahl Bytes

OP #3535815
Lesenswert?

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
Angehängte Dateien:
OP #3536504
Lesenswert?

UPDATE:

Ich habe jetzt an dem UART Eingang des Mikrocontrollers das Signal 
abgegriffen und wieder zum PC herübergeblickt. Das Signal kommt 
ursprünglich aus FL-Studio. Ich habe das Signal einmal von FL-Studio 
nach MIDI-OX und einmal zum Mikrocontroller gesendet. Vom 
Mikrocontroller wieder zurück nach MIDI-OX.
Mir ist dabei aufgefallen, dass völlig die falschen Daten ankommen. 
Woran kann das liegen?

Ich hab beide Screenshots hochgeladen.
Angehängte Dateien:
Gast #3536535
Lesenswert?

Matthias S. schrieb:
> Der Mikrocontroller greift jetzt direkt an der Buchse ab, jetzt
> funktioniert alles einwandfrei.

Solange, bis der Optokoppler wegen irgendwelcher Potentialunterschiede 
einmal wirklich gefordert ist.

Matthias S. schrieb:
> Woran kann das liegen?
>
Der Optokoppler im Schaltplan liefert '0' am Ausgang, wenn man ihn mit 
'1' ansteuert. Da fehlt vielleicht noch ein Inverter.

> Ich hab beide Screenshots hochgeladen.
Screenshots von einem Oszilloskop wären wesentlich geeigneter, weil es 
ohne richtige Startbiterkennung u.U. vom Zeichenabstand bei der 
Aussendung abhängt, was daraus interpretiert wird und dann auf dem 
Schirm landet.
OP #3537966
Lesenswert?

Die ganze Zeit habe ich mir gedacht, dass die Schaltung eigentlich 
garnicht funktionieren dürfte, da der Bezugspunkt beider Schaltungsteile 
fehlte. Als ich meinen USB-ISP herausgezogen habe, war mir plötzlich 
klar, wo der Bezugspunkt war :D

Also komme ich am Optokoppler nicht rum. Ich werde es mit einem Inverter 
versuchen.

Einen Oszillator besitze ich leider nicht. Ich bin aber am überlegen, ob 
ich einen 0-5V Oszillator aus einem Mikrocontroller mittels ADC selbst 
baue, da so etwas doch manchmal ziemlich nützlich sein könnte.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren