Forum: Mikrocontroller und Digitale Elektronik Lange Interruptroutine, wie macht Ihr das?


von Albert F. (betocool)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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))

von Albert F. (betocool)


Lesenswert?

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.

von tom (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.