PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Baudratenkonverter Midi(31250) nach Seriell(9600)



graffiti
19.07.2007, 11: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, 11: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

PicNick
22.07.2007, 13:03
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, 14: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

PicNick
22.07.2007, 18:58
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, 19: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

wkrug
22.07.2007, 22:35
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
22.07.2007, 23:11
verstehe ich jetzt nicht

bei 8MHz Quarz 9600 Baud --- 0,16% Abweichung
bei 8MHz Quarz 31250 Baud --- 0,00% Abweichung

???????????????????????????????????

Jaecko
22.07.2007, 23:16
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)

PicNick
23.07.2007, 06:19
2 stoppBit sind ungewöhnlich. wer ist denn der Empfänger ?

graffiti
23.07.2007, 08: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

PicNick
23.07.2007, 08:33
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