Moin moin, ich arbeite jetzt seit ein paar Monaten an einem STM32 Board von Olimex, samt selbsgelötete Adapterplatine, die eine Audio Schnittstelle sowie eine serielle Schnittstelle zur Verfügung stellt. Die Serielle Schnittstelle dient hauptsächlich dazu, das Board neu zu Flashen (ich habe kein JTAG Debugger). Das Gerät soll (und das tut er auch) ein Gitarrenverstärker simulieren, indem er per Funktionen oder Lookup-Tables die Kurven der Röhre und ein Echoeffekt simuliert. Damit will ich nicht eine Diskussion á la Röhren vs. Modelling starten, ich mache weil es mir auch Spaß macht. Diese Interrupt Routine enthält denn ein oder zwei FIR Filter, ein Delay Speicher und eine LUT erstmal, und der µC packts. Leider werden die Filter oder Funktionen komplizierter und länger, und meine (Um)Frage ist, wie löst Ihr das? Funktionaufruf aus der Routine selber? Irgendwo habe ich gelesen das geht gar nicht. Man sollte auch die ISRs so kurz wie möglich halten (ist im Moment nicht der Fall). In der Hauptschleife pollen, bis ein Bit vom ISR gesetzt wird? Da kann ich andere mögliche Funktionen vergessen. Ich könnte auch mehrere Samples sammeln und dann bearbeiten, das macht die ISR nicht kürzer, sondern nur die Zeit zwischen Interrupts länger. Ich könnte ein DSP nehmen, wäre für mich jetzt ein bisschen Overkill. Ich stelle mir das so vor, der µC kann irgendwelche (unkritische) Aufgaben in der Hauptschleife erledigen, in der Zeit wo das Audiosample nicht bearbeitet wird. Im Moment taste ich mit 48 Khz ab, und es läuft mit einem DC Filter, eine Multiplikation und ein Delay einwandfrei. Ich habe nicht mehr nachgemessen wie viel Zeit mir noch übrig bleibt, aber bei einer einfachen Multiplikation / Skalierung hatte ich noch etwas zwischen 80~90% Zeit übrig. Freue mich schon auf Eure Kommentare! Grüßle, Albert.
Die Interruptroutine muss kürzer sein, als der Zeitabstand zwischen den Interrupts. Andernfalls musst Du die Daten in einen Zwischenspeicher einlesen und dann z.B. im Hauptprogramm abarbeiten. Echtzeitverarbeitung erfordert allerdings so oder so einen ausreichend schnellen Prozessor. Wenn die Interruptroutine dafür zu langsam ist, wird das Hauptprogramm ebenfalls (genau so) zu langsam sein.
Dann messe erst mal wie viel Zeit der Interrupt benötigt und wie viel "Leerlauf" noch für den Main-Loop bleibt. Ist da genügend Luft, dann alles klar. Ansonsten löte doch einfach einen STM32F4xx drauf und passe die paar Register an. Dann hast du auch gleich eine FPU. Die Befehle werden helfen:
1 | // Sys-Tick Counter - Messen der Anzahl der Befehle des Prozessors:
|
2 | #define CORE_SysTickEn() (*((u32*)0xE0001000)) = 0x40000001
|
3 | #define CORE_SysTickDis() (*((u32*)0xE0001000)) = 0x40000000
|
4 | #define CORE_GetSysTick() (*((u32*)0xE0001004))
|
Ich entwickle grad zwei Varianten des Bastelboards, eine mit einem STM32 F103er Serie und die zweite mit einem der F20x Serie. Layout ist (bis ein paar Widerstände) gleich. @Markus: STM32F4 kommt nicht in Frage, das Olimex Board mit dem µC ist auf eine Adapterplatte montiert, und es gehört mir auch nicht direkt! Allerdings danke für die Befehle, werde ich bei Gelegenheit ausprobieren. Dann habe ich (noch) kein Problem, denn die ISR startet und endet bevor das nächste Interrupt kommt. Ich fragte nur ob es eine alternative gäbe, nicht das ganze Code in der ISR zu schreiben, auch ein bisschen wegen Übersichtlichkeit. Albert.
Hi Albert, Du musst es schaffen, die eingelesenen Samples on-the-fly neu zu berechnen und auszugeben. Aber ich würde Dir empfehlen, ein günstiges Discovery Board von ST zu erwerben, da hast Du nämlich gleich einen ST-Link Debugger mit drauf für lau. Auf dem STM32F4xxx board ist sogar noch ein Audio Codec mit drauf, da bist Du Audio-qualitativ dann ein ganzes besser als mit dem internen ADC und DAC guckst Du z.B. hier: http://de.rs-online.com/web/p/entwicklungskits-prozessor-microcontroller/7458434/ Gruss + viel Spass, Tom.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.