Forum: Mikrocontroller und Digitale Elektronik Zeitmultiplex


von Torben (Gast)


Lesenswert?

Hallo liebe Forum Gemeinde,

ich programmiere gerade eine asynchrones System auf einem AVR 
Mikrocontroller. In meinem Wissen sind einige offenen Fragen und selber 
komme ich nicht auf die richtige Lösung.


Programmablauf:

Timer0 macht einen Interrupt bei 312µs und setzt ein Flagbit für die ADC 
Messung. Im Main Programm frage ich das Flagbit ab und mache die ADC 
Messung, danach wird der Kanal erhoeht und das Flagbit geloescht.

Nach 8*312µs setzt mir die Interrupt Routine ein anderes Flagbit zur 
Regelung meiner PWM. Die Regelung wird in einer Funktion ausgeführt, 
wenn das Flagbit gesetzt ist, danach erhoehe ich den Kanal wieder und 
loesche das Flagbit.

In der ISR setze ich ein weiteres Flagbit, wenn ich die Zeit von 125ms 
erreicht habe. In dieser Funktion messe ich eine Spannung und erhoehe 
den Kanalzaehler wieder und loesche das Flagbit.


Mein Problem:

Ich muesste einige berechnen durchführen und noch die serielle 
Schnittstelle abfragen bzw. mein FIFO, aber ganz ehrlich gesagt weiss 
ich nicht wann und wo ich diese Berechnungen machen soll. Soll ich die 
Berechnungen und FIFO Buffer Abfrage in der Main machen oder sollte ich 
die Berechnungen in meinen Funktionen machen?

Mir kommt es momentan so vor das die Berechnungen zulange dauern und ich 
einige Flags verliere bzw. zu spaet ab arbeite.

Torben








von Franko P. (sgssn)


Lesenswert?

Hallo Torben

es kommt darauf an, wieviel Rechenzeit deine "Berechnungen" 
beanspruchen. Am Einfachsten ist es, mit einem flotten Quarz die 
maximale Rechenleistung aus dem uC herauszuquetschen. Wenn das nicht 
reicht, kann man noch ein bisschen optimieren und wenn das auch nicht 
reicht, gibts eben ein paar features nicht oder es muss ein anderer uC 
rein, der das dann packt.
Bestimmte Funktionen macht der uC ja hardwaremässeig, wie z.B. 
A/D-Wandeln oder mit UART empfangen.
Ob du was im hauptprogramm erledigst oder in der ISR hat damit nichts zu 
tun.

Gerhard

von Peter D. (peda)


Lesenswert?

Das auslesen des ADC und neu starten sollte kaum Zeit kosten, würde ich 
daher direkt im Timerinterrupt machen.
Denn 312µs sind für die Main-Loop schon heftig als maximale 
Durchlaufzeit.


Peter

von TheMason (Gast)


Lesenswert?

ich schließe mich der meinung von gerhard an.
erstmal die maximale leistung des uCs nutzen und schauen ob es langt.
ansonsten kann ich dir nur empfehlen : mach alle isrs so kurz wie 
möglich, mache alle deine berechnung von der main aus, programmiere 
deine berechnungen und handlers (für uart,adc,steuerung) in "scheiben" 
und vor allem überlege dir eine gute steuerung die schnell genug 
reagieren kann (im zweifelsfalle für jeden bereich einen fifo-anlegen, 
sprich : fifo für den uart, fifo für deine adc werte fifo für deine 
steuerung)
mit der salami-taktik fährt man bei quasi-parallelen aufgaben immer am 
besten ...

so ich hoffe ich habe es richtig verstanden und keinen quark geschrieben 
...
gruß
rene

von Torben (Gast)


Lesenswert?

Danke erstmal für eure Tipps.

@Peda: Ich hatte vergessen zuerwähnen das der AD Wandler extern am SPI 
Bus angeschlossen ist, somit faellt es wohl flach die Messung in der ISR 
zumachen oder soll ich die Interrupts in der ISR freigeben (nasted 
interrupts) ?

Die Salami Taktik benutze ich im Moment. Ich komme langsam nur mit dem 
Programmablauf in schleudern, weil jetzt für ein Kanal gewartet werden 
muss und eine Delayschleife oder eine Whileschleife nicht benutzt werden 
darf.

Ich hab mir die Scheduler Version von Peter Danneger angeschaut und 
verkleinert übernommen bzw. das Konzept übernommen.

Ich bin für jeden weiteren Rat dankbar.

Danke und Gruß,

Torben



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.