Archiv verlassen und diese Seite im Standarddesign anzeigen : Baudratenkonverter Midi(31250) nach Seriell(9600)
graffiti
19.07.2007, 12:11
Habe da ein Problemchen
ich habe eine Baudrate von 31250Baud, 1Startbit, 1,5 Stopbit (Midisignal)
als Eingangssignal von einem DrumComputer
und am anderen Ende benötige ich aber 9600 Baud und 2 Stopbits
um diverse Geräte zu steuern
kann ich das in einem ATTiny2313 verwirklichen, indem ich eine Software UART als Midieingang verwende
und das Signal an die Hardware UART als ser. Ausgang übergebe mit den 9600 Baud.
Hat schonmal jemand so etwas ähnliches mit Bascom geproggt, oder
wer könnte mir evtl ein paar Tips geben wie das mit der Baudraten Umwandlung funktioniert
gruß Gerhard
graffiti
22.07.2007, 12:26
Das hätte ich jetzt nicht gedacht das hier im Forum,
keiner eine Ahnung davon hat,
wie man eine beliebige Baudrate in eine andere Baudrate umsetzt
gruß Gerhard
Ein Midievent hat 2-3 Zeichen, die du (ohne Buffer) mit 9600 nicht schnell genug wieder rauskriegst.
Ich würde es umgekehrt machen:
--> den Output mit softUart
--> und das MIDI-in mit der HW und
Config serialin =buffered , size = 12
da ist der Empfang dann automatisch gebuffert, damit nix verloren geht
EDIT: MIDI hat nur ein Stopp-bit, aber die HW macht eh nix anderes
graffiti
22.07.2007, 15:01
Ungefähr so:
$regfile = "attiny2313.dat"
$crystal = 8000000
$baud = 31250
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 1
Open "COMD.2:9600,8,n,2" For Output As #1
' Variablendeklaration
Dim Zeiger As Byte At &HA0
Zeiger = 1
Dim Flag As Byte At &HA1
Dim Adresse As Eram Byte
Dim Adresse_temp As Byte At &HA3
Dim Tempword As Word At &HA5
Adresse_temp = Adresse
Dim Tempbyte As Byte At &HA7
Dim Tempbyte2 As Byte At &HA8
Dim Protokoll(10) As Byte
'Ausgangsports konfigurieren
Ddrd = &B01111110
Ddrb = &B11111111
Do
Tempbyte = Waitkey()
Gosub Zeichenempfang
Loop
Zeichenempfang:
Tempbyte = Udr
If Tempbyte > 0 Then
Print(#1) Tempbyte
end if
Return
End
Schau, guck mal, das is'n Programm, das erkennt note-on / note off
und macht MIDI-Through (+running status)
Vielleicht kannst du dir was abspicken
$regfile = "m32def.dat"
$crystal = 8000000
$baud = 31250 ' MIDI
$hwstack = 64
$swstack = 256
$framesize = 64
Const Led_hold_ms = 255 ' LED hold time (255 mS)
Const Rx_bufsize = 32
Const Tx_bufsize = 32
Config Serialin = Buffered , Size = Rx_bufsize
Config Serialout = Buffered , Size = Tx_bufsize
'-------------------------------------------------
Dim Rxskip As Byte
Dim Rxcntr As Byte
Dim Rxchar As Byte ' Zeichen von MIDI
Dim Note As Byte ' Note 0-127
Dim Veloc As Byte ' velocity 0-127
Dim Event As Byte ' MIDI EVENT
'-------------------------------------------------
Dim Channel As Byte
'-------------------------------------------------
Dim Ledhold As Byte
'-------------------------------------------------
Dim Tmp As Byte
Enable Interrupts
channel = 1
'---------------------------------------------
'
'---------------------------------------------
Do
Gosub Rxdata ' Check MIDI Input
If Event = 1 Then ' Midi-Event NOTE / VELOC
Event = 0
'------------------
' event-abarbeiten
' note 0-127
' veloc 0-127 (0=note off)
'------------------
End If
Loop
End
'----------------------------------------
'
'----------------------------------------
Rxdata:
While Ischarwaiting() = 1 ' Is was da ?
Rxchar = Inkey() ' ja, holen
'------------------------------------------------------------------
Print Chr(rxchar); ' MIDI Through
'------------------------------------------------------------------
If Rxchar >= 128 Then 'start midisequ.
Tmp = Rxchar And &H0F ' channel-nr only
If Tmp <> Channel Then 'für OMNI mode auskommentieren
Rxskip = 1
Else
Rxskip = 0
Tmp = Rxchar And &HF0 ' event
Select Case Tmp
Case &H80 : Rxcntr = 1 ' note off
Case &H90 : Rxcntr = 1 ' note on
Case Else : Rxskip = 1 'alles andere is uns egal
End Select
End If
Else
If Rxskip = 0 Then
If Rxcntr = 1 Then
Note = Rxchar
Rxcntr = 0
Else
Veloc = Rxchar
If Veloc <> 0 Then
Event = 1 ' signal MIDI EVENT
End If
Rxcntr = 0
End If
End If
End If
Wend
Return
graffiti
22.07.2007, 20:32
Das mit den Midi Signalen ist die kleinere Schwierigkeit
nur ich muß von der Midi Baurate(31250) auf 9600 Baud mit 2 Stopbit kommen um meine bestehende Hardware weiterverwenden zu können.
gruß Gerhard
Soweit ich weiß passt die Baudrate von Midi (31250) und deiner seriellen Schnittstelle mit 9600 nicht besonders gut zusammen. Das heisst es gibt keine gemeinsamen vielfachen die als Quarzfrequenz taugen würden.
Rechne das vorher erstmal durch, damit die Abweichungen bei deinem gewünschten Quarz nicht zu groß werden.
graffiti
23.07.2007, 00:11
verstehe ich jetzt nicht
bei 8MHz Quarz 9600 Baud --- 0,16% Abweichung
bei 8MHz Quarz 31250 Baud --- 0,00% Abweichung
???????????????????????????????????
Ich denk mal der Fehler kommt durchs Teilen zustande.
(Ob die Rechnung so stimmt, weiss ich nicht, zumindest könnt ichs mir so erklären):
die 8 MHz durch 9600 Ergibt 833,3333333333333....
die 8 MHz durch 31250 ergibt glatte 256,00
So hat man bei einem nie den exakten Wert (Abweichung >0), beim anderen schon (Abweichung = 0)
2 stoppBit sind ungewöhnlich. wer ist denn der Empfänger ?
graffiti
23.07.2007, 09:16
@PicNick
das sind Geräte die ich selbst gebaut habe.
Ich habe mir das ganze auch noch mal überlegt, es können trotz
Pufferung der Daten, doch noch einige verlorengehen (denke ich)
am besten wäre es ich stelle das Programm in meinen bestehenden Tinys
auf die 31250 um, dann gibts wahrscheinlich die wenigsten Probleme.
Oder ich kopple einfach zwei AVR`s (E nach A) und sende eine Art BCD Codierung an den anderen der mir dann die passenden Codes in 9600Baud weiter reicht. Ob dann die Geschwindigkeit noch reicht weiß ich auch noch nicht.
(zur Info, ich bin Anfänger, falls diese zweite Lösung zu einem
"Oh Gott, was macht der denn" führen sollte)
gruß Gerhard
Sagen wir, Pi x Daumen:
du ravest dir einen mit 200 BPM
Von der Hi-Hat kommen 16-el, (wahnsinn, kann keine Sau in echt spielen)
gibt (+note-off) 1600 Events / Minute
das sind 30 Event /sekunde
Bei 9600 Baud und 3 Byte je Event schaffst du ~ 300 Events / sekunde
Also, eigentlich sollte das insgesamt schon zu schaffen sein.
EDIT: Aber logo, wenn der (letzt) Empfänger auch die MIDI-Speed kann, is das wohl das allerbeste
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.