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 '
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?
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.
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.
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); |
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.
Hi >Interessant ist jetzt wo die 192 herkommt die ja bei beiden Befehlen >gleich ist. C0 Hex = 192 Dezimal. MfG Spess
Das habe ich auch herausgefunden :D Mit meiner Frage war gemeint warum diese Zahl auftaucht obwohl sie so nie gesendet werden sollte. LG
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.
Ist per MIDI-USB Converter am PC angeschlossen. Oder was genau ist gemeint?
Welcher? Und wie hast du den ATmega daran angeschlossen?
:
Bearbeitet durch User
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.
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.
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.
EIC-404 schrieb: > Was wäre denn ein korrekter Ausgang? https://de.wikipedia.org/wiki/Musical_Instrument_Digital_Interface
EIC-404 schrieb: > > Das ist kein korrekter MIDI-Ausgang. > > Was wäre denn ein korrekter Ausgang? Einfach auf den Link klicken ...
Du hast mit dem Quarz und dieser Baudrate einen Baudratenfehler von über 5%.
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.
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
Midi hat eine festgelegte Baudrate. Was soll das experimentieren mit anderen Baudraten? Ist nur Unfug.
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%
Ich verstehe leider nicht ganz was du mit Teiler meinst. Meinst du Baudrate durch uC Frequenz?
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
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.
muss die Aktivierung des externen Quarzes auch per Fuses wieder Rückgängig gemacht werden?
EIC-404 schrieb: > muss die Aktivierung des externen Quarzes auch per Fuses wieder > Rückgängig gemacht werden? Ja sicher doch! ...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.