ATmega32 <-> Midi | Falsche Anzahl Bytes

OP #3535815
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.