Problem mit Midi-Signal Atmega8 (Bascom)

Gast #4514023
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
'
Gast #4514052
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.
Angehängte Dateien:
Gast #4514063
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.
Gast #4514524
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.
Angehängte Dateien:
#4515173
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.
Angehängte Dateien:
#4515797
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.
Gast #4515928
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
Gast #4515985
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%
#4516086
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
#4516309
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.
Gast #4516531
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren