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:
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.
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.
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:
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
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%
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.
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.