Forum: Mikrocontroller und Digitale Elektronik ATmega32 <-> Midi | Falsche Anzahl Bytes


von Matthias S. (matstorm)


Angehängte Dateien:

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

von Matthias S. (matstorm)


Angehängte Dateien:

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.

von Matthias S. (matstorm)


Angehängte Dateien:

Lesenswert?

Okay, ich hab jetzt an verschiedenen Stellen abgegriffen und gemerkt, 
dass der Optokoppler eigentlich unnötig war.
Der Mikrocontroller greift jetzt direkt an der Buchse ab, jetzt 
funktioniert alles einwandfrei.

von Wolfgang (Gast)


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.

von Matthias S. (matstorm)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.