Forum: Mikrocontroller und Digitale Elektronik Midi über USART - ich bin am verzweifeln ;o(


von Andreas K. (Gast)


Lesenswert?

Ich sitze jetzt schon seit ein paar Stunden hier und versuche
verzweifelt dem ATMega32 ein paar Mididaten zu entlocken. Am
Synthesizer kommt auch was an - nur scheint er damit nichts anfangen zu
können, da kein Ton kommt. Was mache ich falsch ?

Hier mal der Code, der mir am wahrscheinlichsten schien, dass er
funktionieren würde:


#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/delay.h>


int main(void)
{

#ifndef F_CPU
#define F_CPU 16000000
#endif
#define UART_BAUD_RATE 31250
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)
((F_CPU)/((UART_BAUD_RATE)*16L)-1)

UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);

UCSRB |= (1<<TXEN);      //UART TX einschalten
UCSRC |= (1<<URSEL)|(3<<UCSZ0);    //Asynchron 8N1

  while(1)
  {
    while (!(UCSRA & (1<<UDRE)));
    UDR = 144;
    while (!(UCSRA & (1<<UDRE)));
    UDR = 12;
    while (!(UCSRA & (1<<UDRE)));
    UDR = 127;
    _delay_ms(100);
    while (!(UCSRA & (1<<UDRE)));
    UDR = 128;
    while (!(UCSRA & (1<<UDRE)));
    UDR = 12;
    while (!(UCSRA & (1<<UDRE)));
    UDR = 127;
    _delay_ms(1000);
  }
}

noch etwas was mir aufgefallen ist: wenn ich die Delays ändere ändert
sich der Blinktakt der RX-LED am Synthesizer nicht ...

von Rufus T. Firefly (Gast)


Lesenswert?

Ich tippe auf Baudratenprobleme und würde vorsichtshalber sowohl F_CPU
als auch UART_BAUD_RATE als long-Konstanten (durch Anhängen eines
'L') definieren.

Sicherheitshalber solltest Du Dir ausgeben lassen, welche Werte nun in
UBBR{H|L} eingetragen werden ...

von Andreas K. (Gast)


Lesenswert?

Ich habe es auch schon mit UBBR (L) 31 und UBBR (H) 0 versucht ... das
müsste soweit eigentlich stimmen oder ?

von Simon Küppers (Gast)


Lesenswert?

Die Baudrate stimmt schon.

Komisch. aber wegen den Befehlen etc. Guck mal hier, da ist sogar ein
Beispiel angegeben, probier das mal!

http://www.zem-college.de/midi/mc_cvm2.htm


PS: Frage: Ich kann ja diese MidiBefehle auch an den PC senden. Wie
spiele ich diese nun am PC ab ? Gibts Programme um auf die Noten,
irgndwelche Drums oder andere Effekte zu legen? Ansonsten such ich mir
Drum-waves raus, schick die Daten über den RS232 und mach mir ne VB
applikation ;) ;) ;)

von Andreas K. (Gast)


Lesenswert?

Es gibt jede Menge Software, die das kann, teilweise sogar Freeware. Ich
kenne zwar jetzt auf Anhieb keine Namen (zumindest nicht von Freeware),
aber ich hatte mal so einen kostenlosen Wavetable-Player. Eventuell von
sonicspot.com !?

Aber noch einmal zum Thema:
Eimal angenommen mit der USART-Einstellung stimmt alles ist dennoch
irgend etwas nicht in Ordnung. Vielleicht ist es ja ein blöder Fehler,
als Einsteiger passiert so etwas leider mal. Woran liegt es, dass die
Midi-In-Anzeige des Synthesizers immer mit der gleichen Frequenz
pulsiert, obwohl ich die Delay-Werte verändere ?

von MathiasM (Gast)


Lesenswert?

Ein Tipp: bei Midi Sachen verwende ich immer das Freeware-Tool MIDI-OX,
damit kannst Du den Midi Datenstrom analysieren (Noten, Midi-Clock,
Midi SSC, usw.). Mit einem Synthesizer würde ich es nicht machen, da
hast Du ja kaum Möglichkeiten Fehler im Code zu finden.

von dave (Gast)


Lesenswert?

Probier einfach mal den ausgerechneten Wert direkt zuzuweisen.
Also UBBRH = 0 und L = 31.. wenn ich richtig gerechnet hab.
Sind die Fuses richtig gesetzt? PCKommunikation?

dave

von Andreas K. (Gast)


Lesenswert?

Danke, MidiOX werde ich nachher mal probieren ...

Fuses ?
Sorry aber wie gesagt: ich bin Anfänger und weiss weder genau was das
ist noch was man wie setzen muss. (Da gibt es scheinbar auch keine
Einstellungsmöglichkeit, das ich die Daten über das neueste Programmers
Notepad (WinAVR) hochgeladen habe)

Wie sieht es mit der Ausgangsbeschaltung aus ? Originalsignal oder
negieren ? Habe beides schon versucht ...

von Simon Küppers (Gast)


Lesenswert?

@david: idee wurde schon vorgeschlagen und ausgeführt von ihm. keine pc
kommunikation (wie oben steht)

von Andreas K. (Gast)


Lesenswert?

Aja ... anch ein bisschen lesen weiss ich jetzt wenigstens, was die
Fuses sind - jetzt müsste ich nur noch die passende Einstellung
herausfinden.

Also wie Fuses setzen unter AVRDUDE (?) für ATMEga32 mit 16 MHz Quarz
?

Ich gehe jetzt mal selber auf die Suche aber vielleicht ist ja jemand
schneller ;o)

Danke

von Andreas K. (Gast)


Lesenswert?

Irgendwie ist mir das noch ein wenig ein Rätsel ...

OSCON = 1 ?

leider hat AVRDude kein so schönes Häkchen-System, aber als ich eben
Ponyprog installiert habe, konnte ich den ATMega32 darin nicht finden
...

Kann mir bitte jemand verraten, was ich in AVR-Dude wir setzen muss ?

von Andreas K. (Gast)


Lesenswert?

OK, ich habe das Problem vorläufig einfach umgekehrt gelöst und F_CPU
umdefiniert. Jetzt funktioniert es auch, Danke für eure Bemühungen.

Dennoch würde ich den ATMega gerne auf 16 MHz umstellen und bräuchte da
noch einmal eine kleine Hife

von Andreas Siebel (Gast)


Lesenswert?

Für nen 16 Mhz Quarz brauchste folgenden Einstellung der Fuse Bits

CKOPT programmiert (0)
CKSEL3, CKSEL2, CKSEL1, CKSEL0 nicht programmiert (1)
SUT1..0 nicht programmiert (1)

Schon mal mit nem Oszi den Takt gemessen??  vieleicht läuft dein ATMega
ja mit internem Oszillator. Das würde das ganze Verhalten erklären.

Achja für die Hardware. Bei Logischem High Pegel fließt kein Strom in
der Midischnittstelle. Logisch Null als entsprechend Stromfluss.

Dann noch ein Tip bevor dir die Haare ausfallen. Manche PC-Sequencer,
wie Logic Audio senden kein Note Off. Die Senden dann Note On mit
Velocity = 0. Es gibt bestimmt auch Synths die das so machen. Ist jetzt
nur als TIpp gedacht, weil ich mich damit auch am Anfang rumgeschlagen
habe.

Was baust du denn feines?

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.