Forum: Mikrocontroller und Digitale Elektronik Problem mit Midi-Signal Atmega8 (Bascom)


von EIC-404 (Gast)


Lesenswert?

Ich weiß zurzeit echt nicht weiter. Ich möchte über einen Atmega8a ein 
Midi-Signal versenden.
Grundsätzlich scheint da auch zumindest irgendwas zu funktionieren. 
Generell gibt der Code den gewünschten Inhalt hinter Print auch über den 
Terminal aus.
Schließe ich ihn nun per Midi an und überprüfe die Midi-Ausgabe in 
MIDIOX so kommen bei $baud= 31250 auch die richtigen Midi Befehle jedoch 
die falschen Noten an. Bzw statt EINER Wunschnote 3-4 komplett andere 
Noten.
Ändere ich die Baudrate kommen komplett andere Sachen wie z.b Pitch und 
was Midi sonst noch so zu bieten hat.

Mein Code sieht wie folgt aus:



  $baud = 31250
  $crystal = 3686400  'externer quarz'


  $regfile "m8adef.dat"

      $framesize = 32
      $swstack = 32
      $hwstack = 64



Do

If Multi1 = 1 And Tastevorher = 0 Then


  'Multi1 ist ein normaler Taster dessen Config etc ich jetzt hier 
weggelassen habe, Tastevorher eine Variable mit dem Anfangswert 0'


Print 144                                'Midi NoteOn'
Print 60                                 'Note C Oktave 5'
Print 127                                ' Volle Anschlagslautstärke
Tastevorher = 1
Else
End If


If Multi1 = 0 And Tastevorher = 1 Then
Print 144                                'Midi NoteOn'
Print 60                                 'Note C Oktave 5'
Print 0                                ' Keine Anschlagslautstärke'
Tastevorher = 0
Else
End If

Loop

End
'

von Clemens L. (c_l)


Lesenswert?

EIC-404 schrieb:
> so kommen bei $baud= 31250 auch die richtigen Midi Befehle jedoch
> die falschen Noten an. Bzw statt EINER Wunschnote 3-4 komplett andere
> Noten.

Was genau kommt denn an?

von EIC-404 (Gast)


Angehängte Dateien:

Lesenswert?

Bild ist angehängt.
Per Zufall sind aber auch ab und an die abgebildeten Werte von NoteOn 
und NoteOFF vertauscht oder er sendet z.b nur E und C#.
Die Werte sind jetzt aus $Baud=31250 entstanden wie im Code beschrieben.

von nemesis... (Gast)


Lesenswert?

Kläre doch mal welche Daten du an die Midi senden musst.
Gewöhnlich benutzt man da Ascii.. Entweder die Midi erwartet ein
Byte mit dem Wert 144 LF (oder LF CR), oder...
Du überträgst anscheinend aber LF 1 4 4  CR LF und das wird nicht
korrekt interpretiert.
(LF= Linefeed(Zeilenvorschub), CR = Carriege Return(Wagenrücklauf)

Ich würde mal nach dem Befehl Print chr() schauen, bin mir aber nicht
sicher, ob es daran liegt.

von Clemens L. (c_l)


Lesenswert?

EIC-404 schrieb:
> Print 144
> Print 60
> Print 127

Das sendet 14 Bytes, nämlich die dezimale Darstellung dieser Zahlen, und 
Zeilenenden.

Um ein Byte mit einem bestimmten Wert zu erhalten, brauchst du Chr(), 
und um die Zeilenenden zu unterdrücken, ein Semikolon:
1
Print Chr(144);
2
Print Chr(60);
3
Print Chr(127);

von EIC-404 (Gast)


Angehängte Dateien:

Lesenswert?

Hey vielen Dank das schien schonmal Teil des Problems gewesen zu sein. 
Jetzt kommt die gewünschte Note an, jedoch schleicht sich jetzt ein 
anderer nicht gewünschter Befehl ein. (Anhang)

C0 3C sprich 192 60
C0 7F sprich 192 127

Bei der 60 und 127 liegt es natürlich nahe, dass da etwas falsch 
interpretiert wird, da die Zahlen ja auch im Ausgangscode benutzt 
werden.
Interessant ist jetzt wo die 192 herkommt die ja bei beiden Befehlen 
gleich ist.

von spess53 (Gast)


Lesenswert?

Hi

>Interessant ist jetzt wo die 192 herkommt die ja bei beiden Befehlen
>gleich ist.

C0 Hex = 192 Dezimal.

MfG Spess

von EIC-404 (Gast)


Lesenswert?

Das habe ich auch herausgefunden :D
Mit meiner Frage war gemeint warum diese Zahl auftaucht obwohl sie so 
nie gesendet werden sollte.
LG

von Clemens L. (c_l)


Lesenswert?

Das erste C0 ist ein falsch interpretiertes 90. In binär sind 1100 und 
1001 eigentlich unterschiedlich; was ist die MIDI-Schaltung?

Das zweite C0 ist nur Running Status.

von EIC-404 (Gast)


Lesenswert?

Ist per MIDI-USB Converter am PC angeschlossen. Oder was genau ist 
gemeint?

von Clemens L. (c_l)


Lesenswert?

Welcher? Und wie hast du den ATmega daran angeschlossen?

: Bearbeitet durch User
von EIC-404 (Gast)


Lesenswert?

Dieser hier: http://www.delock.de/produkte/G_61640/merkmale.html

Der Atmega ist über TxD an den "Datenpin" meiner Midi-Out Buchse 
angeschlossen.
Die Stromversorgung läuft über USB.
Zum Auslösen des Midibefehls verwende ich einen normalen Taster der über 
einen Multiplexer an einen Port des Atmega angeschlossen ist.

von Clemens L. (c_l)


Angehängte Dateien:

Lesenswert?

EIC-404 schrieb:
> http://www.delock.de/produkte/G_61640/merkmale.html

Igitt, noch so ein CH345-Schrott. Aber zum Empfangen von 
Note-On-Nachrichten sollte es reichen.

> Der Atmega ist über TxD an den "Datenpin" meiner Midi-Out Buchse
> angeschlossen.

Das ist keine korrekter MIDI-Ausgang.

Allerdings haben diese Billigteile den eigentlich notwendigen 
Optokoppler oft eingespart; in diesem Fall funktioniert die direkte 
Verbindung von TXD sogar. (Um herauszufinden, ob U1 bestückt ist, musst 
du das Gehäuse öffnen.)

Eine andere mögliche Fehlerquelle wäre, dass der Quarz nicht korrekt 
läuft, oder nicht mit der in $crystal angegebenen Frequenz.

von EIC-404 (Gast)


Lesenswert?

Was wäre denn ein korrekter Ausgang?
Der Quarz läuft wie angegeben, allerdings habe ich oft gelesen,dass 
dieser in einem gewissem Verhältnis zu $Baud stehen muss.

von nemesis... (Gast)


Lesenswert?


von Clemens L. (c_l)


Lesenswert?

EIC-404 schrieb:
> > Das ist kein korrekter MIDI-Ausgang.
>
> Was wäre denn ein korrekter Ausgang?

Einfach auf den Link klicken ...

von Bobo (Gast)


Lesenswert?

Du hast mit dem Quarz und dieser Baudrate einen Baudratenfehler von über 
5%.

von Tuck I. (tuckito)


Lesenswert?

EIC-404:
Bobo meinte das hier:
http://wormfood.net/avrbaudcalc.php?bitrate=31250&clock=3.6864&databits=8

Was spricht dagegen mal die internen 8MHz zu nehmen?
Da ist die Fehlerrate nicht so hoch.

Noch etwas, ich kenne mich nicht mit Bascom aus, aber wo wird da der 
UART initialisiert? Ich hatte "fast" ein identische Problem und beim 
korrekten setzen von UBRRH & UBRRL (in C) hat alles geflutscht. Ok, das 
kann ja bei dir alles sein, nur als mögliche Fehlerquelle.

von EIC-404 (Gast)


Lesenswert?

Ich dachte der Atmega8 hat nur 1MHz? oder soll ich $ crystal einfach auf 
8MHz setzen?
Ist zumindest ein interessanter Ansatz, da z.b bei Baud= 19200 noch mehr 
andere Befehle willkürlich eingeworfen werden

von midi (Gast)


Lesenswert?

Midi hat eine festgelegte Baudrate.
Was soll das experimentieren mit anderen Baudraten?
Ist nur Unfug.

von Kameramann (Gast)


Lesenswert?

Normalerweise bekommt man die Baudrate von 31250 für MIDI doch mit einem 
modernen uC leicht hin. Klassischer 1MHz OSC mit Teiler 32 für die 32us 
Wortlänge.

Nur die UARTs in den PCs konnten das nicht so direkt.

Bei dem Quarz böte sich ein Faktor 59 als Teiler an -> 31250 * 2 +/- 
0,1%

von EIC-404 (Gast)


Lesenswert?

Ich verstehe leider nicht ganz was du mit Teiler meinst. Meinst du 
Baudrate durch uC Frequenz?

von Tuck I. (tuckito)


Lesenswert?

Baudrate auf 31250 lassen, das ist bei Midi fest.
Die 8MHz kannst du per Fuse setzen, sofern nicht schon 8MHz gesetzt 
sind. Lies deine Fuses aus. Wenn du das noch nie gemacht hast, nimm eine 
GUI (Burn-O-Mat), da kann du "einfach" die Werte auslesen.
Im Data Sheet Seite 30 internal Oscillator mit bis zu 8MHz.
http://www.atmel.com/images/atmel-2486-8-bit-avr-microcontroller-atmega8_l_datasheet.pdf

Hier gehts bei Seite 77 (und davor) um UBRR bzw. die ganze 
Baudratengeschichte und Bascom:
https://books.google.de/books?id=sVmQQsImi7AC&pg=PA77&lpg=PA77&dq=bascom+UBRRH&source=bl&ots=hxTUI6t54f&sig=fnojxQspDWBYw3WU0RLQaDOVQxY&hl=de&sa=X&ved=0ahUKEwjMpOn119HLAhWBJJoKHfXEBi8Q6AEILzAC#v=onepage&q=bascom%20UBRRH&f=false

: Bearbeitet durch User
von Tuck I. (tuckito)


Lesenswert?

Ok, ich habe den falschen Data Sheet angehängt, 8a ist der hier:
http://www.atmel.com/images/atmel-8159-8-bit-avr-microcontroller-atmega8a_datasheet.pdf
Aber auch da sind intern 8MHz möglich. Allerdings vergiss meinen Satz 
"sofern nicht schon 8MHz gesetzt sind", wenn du extern verwendet hast du 
die Clock Source bestimmt wie ganz oben angegeben gesetzt.

Hier ist eine Formel: 
https://www.mikrocontroller.net/articles/AVR-Tutorial:_UART
UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)
Auch im Data Sheet zu finden.

Lt dem zuvor verlinkten Buch reicht es in Bascom UBRR= *** zu setzen.
In deinem Fall runden auf UBRR = 8.
Achtung ich kenne Bascom nicht wirklich.

Im Zweifelsfall wirklich mal die internen 8MHz ausprobieren.

von EIC-404 (Gast)


Lesenswert?

Vielen Dank ich werde mich da einlesen

von EIC-404 (Gast)


Lesenswert?

muss die Aktivierung des externen Quarzes auch per Fuses wieder 
Rückgängig gemacht werden?

von Hannes L. (hannes)


Lesenswert?

EIC-404 schrieb:
> muss die Aktivierung des externen Quarzes auch per Fuses wieder
> Rückgängig gemacht werden?

Ja sicher doch!

...

von EIC-404 (Gast)


Lesenswert?

Thema kann jetzt als gelöst betrachtet werden. Mit 8MHz intern läuft 
alles wie es soll! :D
Danke an der Stelle an alle die mir Antworten auf vielleicht auch 
idiotische Fragen gegeben haben. Ich habe dabei definitiv eine Menge 
gelernt und werde mich jetzt ransetzen um alles noch einmal komplett 
nachvollziehen zu können.
LG

von J. S. (engineer) Benutzerseite


Lesenswert?

MIDI ist je nach Gerät bis zu 3% tolerant gegenüber Taktschwankungen. Da 
ist allerdings Jitter und statischer Versatz mit inbegriffen. Leider 
entsteht auch durch die Übertragung schon jitter und der ist mitunter 
nicht ohne.

Wenn Du wieder mal Probleme hast, probiere mal den MIDI Monitor und 
zeichne ein konkretes Beispiel auf.

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.