Forum: Mikrocontroller und Digitale Elektronik AVR UART Eingang für Midi Daten - wie Buffer programmieren


von sam (Gast)


Lesenswert?

Hi zusammen,

ich programmiere gerade an einem Midi Controller.

Für den Midi-Eingang soll es folgende Möglichkeiten geben:

- alles was am Uart gelesen wird am Uart wieder ausgeben
- ggf. Midi CC  PC  Sysex Befehle selbst verarbeiten

wie baue ich am besten die Verarbeitung auf, so dass es keine Lücken 
gibt in dem sich der Buffer überschreibt bevor er verarbeitet wurde.

Wie handhabe ich es, das z.B. CC Befehle insgesamt 3 Byte lang sind, PC 
Befehle nur 2 Byte und in meinem Projekt Sysex Befehle von 30 bis 40 
Bytes.


Aktuell lese ich den UART über einen Interrupt aus. Aber wie bearbeite 
ich das dann am besten weiter? Fehlerhandling etc.?

Gruß,
Sammy

von H.Joachim S. (crazyhorse)


Lesenswert?

Viel verstehe ich nicht von deiner Frage :-)
Allgemein: einen ausreichend grossen Ringbuffer basteln. Wie gross der 
sein muss, kann dir keiner exakt sagen. Kommt drauf an, wieviele Daten 
reinkommen und wie lange die Verarbeitung schlimmstenfalls dauert.

von Karl H. (kbuchegg)


Lesenswert?

sam schrieb:

Geht mir wie Joachim: SO ganz klar ist mir nicht, wonach eigentlich 
gefragt wird.

> wie baue ich am besten die Verarbeitung auf, so dass es keine Lücken
> gibt in dem sich der Buffer überschreibt bevor er verarbeitet wurde.

Ist denn die Frage überhaupt relevant? Den verbleibenden Speicher 
steckst du in die Eingangsbuffer. Die Frage ist ja nicht "wie baue ich 
die Verarbeitung eines Buffers auf" sondern "wieviel Platz kann ich für 
den/die Buffer bereit stellen, so dass ich alles rein bringe". Der Platz 
ist dir aber sowieso vorgegeben. D.h. da geht es nicht um "am besten".

> Wie handhabe ich es, das z.B. CC Befehle insgesamt 3 Byte lang sind, PC
> Befehle nur 2 Byte und in meinem Projekt Sysex Befehle von 30 bis 40
> Bytes.

Was interessieren dich CC Befehle? In deinen Anforderungen steht, du 
möchtest Sysex Befehle bearbeiten und sonst nichts. CC oder sonstige 
Befehle interessieren doch gar nicht. Dein Empfangscode hat 2 Modi: 
einen für "Ich schleife alles durch" und einen für "Ich hab ein Sysex 
gesehen und fische mir die Bytes raus". Im Interrupt siehst du dir jedes 
Byte an, ist es ein Statusbyte dann muss es auch noch ein SysEx sein, 
damit die Umschaltung in den 2.ten Modus erfolgt. Ansonsten wird das 
Byte so wie es empfangen wurde sofort wieder am Ausgang ausgegeben und 
landet überhaupt nicht im Buffer. Erst wenn das Programm im "SysEx" 
Modus ist, werden die Bytes rausgefischt. Ob du das komplette Telegram 
abwarten musst oder ob parallel mit dem Emfpang gleich mit der 
Verarbeitung begonnen werden kann, weißt nur du, weil du weißt was 
dieses SysEx überhaupt machen soll. Mit dem nächsten Statusbyte fällt 
der Empfangscode aus dem "SysEx Modus" heraus (wenn es sich nicht 
zufällig um einen weiteren SysEx handelt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.