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
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
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
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ungefähr so:
Code:$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
Code:$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
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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.
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 ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen