Forum: Mikrocontroller und Digitale Elektronik Midi mit C Control


von Thomas (Gast)


Lesenswert?

Hallo zusammen

Bemühe seit zwei Tagen die Suche und Google aber ich komme einfach nicht 
weiter. Hab seit letzter Woche das C Control Evulution Board von Conrad 
mit dem Mega32 Prozessor. Hatte im Studium C++ und kann recht gut damit 
umgehen. In die Mikroprozessortechnik habe ich mich schon etwas 
eingelesen und einfache Schaltungen funktionieren prima.

Ich möchte aber folgendes erreichen:

Mein C Control Board soll MIDI-Daten an mein Keyboard senden. Nur senden 
nicht empfangen!!!! Also zB "Spiel Note G" usw. Ich weiß dass diese MIDI 
Befehle in Hex-Codes übertragen werden. Aber wie stelle ich das genau 
an??
Hab eine Midibuchse und das mit dem 220Ohm Widerstand weiß ich bereits. 
Muss die andere Leitung durch die ja dann offensichtlich die Daten 
geschickt werden, einfach an einen freien Port meines Boards? Wie steuer 
ich diesen Port dann genau an?? Ich muss doch dann die etsprechenden 
Datenbytes über diesen Port senden oder?
Was ich benötige sind gezielte Befehle in C!
Muss ich auch wie ich schön öfters gelesen habe eine Boudrate 
einstellen?
Wie funktioniert das?

Vielen Dank für eure Hilfe

von Ralf S. (spacedog) Benutzerseite


Lesenswert?


von Sebastian (Gast)


Lesenswert?

Midi benutzt 31,25 kBaud. Erst mal prüfen, ob C-Control das kann. Und 
ich denke, daß nur ein bestimmter Pin zum Senden benutzt wird, TxD oder 
ähnlich.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ein Midi-Ausgang ist zuallererst mal nichts anderes, als eine LED 
anzusteuern (die sitzt nämlich auf der Empfangsseinte im Optokoppler).
Hast du das schon gemacht?

Kannst du eine LED blinken lassen?
Gut, dann passt schon mal die Hardware...

Und wenn das geht, dann übertrage mal ein paar Bytes mit einer Baudrate 
von 9600 über eine serielle Schnittstelle zum PC.

Wenn das geht, hast du eigentlich alles, was du für MIDI brauchst:
einen LED-Ausgang und eine serielle Schnittstelle.
Dann schließt du nur noch die Midi-Buchse statt der LED an den TX Pin 
der seriellen Schnitte an, schaltest die Baudrate auf 31,25kBd um und 
fertig...

von Thomas (Gast)


Lesenswert?

vielen dank für die schnellen antworten

was mir fehlt ist zB genau der Code zum Übertragen/Senden von Bytes

Gruß

von Johannes F. (emitterfolger)


Lesenswert?

Das MIDI-Protokoll ist bei Wikipedia recht gut erklärt:
http://de.wikipedia.org/wiki/Musical_Instrument_Digital_Interface#Funktionsweise_des_MIDI-Protokolls

Der UART des ATmega muss auf 8 Databits, No Parity, 1 Stopbit sowie 
31250 baud initialisiert werden. Wie das funktioniert, steht im 
Datenblatt des ATmega32 (mit Asm- und C-Codeschnipseln).

Die Standard-MIDI-Beschaltung steht hier (Seite 6):
http://www.avrfreaks.net/modules/FreaksArticles/files/19/Midi%20and%20the%20AVR.pdf

Die 2 in Reihe geschalteten Inverter am TxD des µC kann man 
vernachlässigen, da AVRs diese Stromschleife mit ca. 5mA direkt treiben 
können.

Grüße

von Johannes F. (emitterfolger)


Lesenswert?

Hier sind die 2 Funktionen, die du brauchst.
Berechnung von _UBRR wie folgt:

          f(osc) [Hz]
_UBRR = --------------- – 1
          16 * 31250
1
#define _UBRR /* siehe Formel */
2
3
/* Funktion zum Initialisieren des UART */
4
void USART_Init()
5
{
6
    /* Set baud rate */
7
    UBRRH = (unsigned char) (_UBRR >> 8);
8
    UBRRL = (unsigned char) _UBRR;
9
    /* Enable transmitter */
10
    UCSRB = (1<<TXEN);
11
    /* Set frame format: 8data, 1stop bit */
12
    UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
13
}
14
15
/* Funktion zum Senden eines Bytes über UART */
16
void USART_Transmit( unsigned char data )
17
{
18
    /* Wait for empty transmit buffer */
19
    while ( !( UCSRA & (1<<UDRE)) );
20
    /* Put data into buffer, sends the data */
21
    UDR = data;
22
}

Grüße
Johannes

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.