mikrocontroller.net

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


Autor: Andreas K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Andreas K. (Gast)
Datum:

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

Autor: Simon Küppers (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;) ;) ;)

Autor: Andreas K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: MathiasM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Simon Küppers (Gast)
Datum:

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

Autor: Andreas K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Andreas K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Siebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.