Forum: Mikrocontroller und Digitale Elektronik Industrie Musterlösung für "Multitasking" etc.


von Entwickler (Gast)


Lesenswert?

Servus,
mich würde interessieren wie die Standardlösung für folgende Problematik 
in der Industrie aussieht:
Nehmen wir mal einen Mikrocontroller (eher klein mit wenigen Ressourcen) 
in einer beliebigen Maschine, der sich dort um so ziemlich alles kümmern 
muss. D.h. z.B. Taster, LCD, Temperatursensor, PWM Ausgänge, 
Drehzahlsensor usw. Da stößt man ja schnell auf das Problem mit den 
parallel ablaufenden Prozessen. Wie man sowas lösen kann ist mir 
einigermaßen klar. Aber wie sieht das denn mit dem obigne Beispiel aus, 
wenn ich sehr kurze Zeiten (Drehzahlgeber) und sehr lange Zeiten 
(Zeitsteuerung im Sinne von Maschine immer um 9 Uhr einschalten) messen 
muss? Nehme ich mir dann einen Hardwaretimer, erzeuge einen Takt von <1 
ms und gucke dann in der ISR welche meiner Softwaretimer gerade aktiv 
sind und inkrementiere dann bei bedarf die Zählvariable? Gefühlsmäßig 
wird die ISR doch dann relativ lange oder? Und was, wenn nun ein Prozess 
mal länger braucht? Schon werden meine Frequenzmessungen und die 
Software PWM abartig ungenau... versteht ihr einigermaßen was ivh meine?
Vielleicht kann mir hier mal jemand der in der Industrie entwickelt das 
Schema F Vorgehen in so einem Fall beschreiben.

Gruß,
Entwickler

von m.n. (Gast)


Lesenswert?

Entwickler schrieb:
> Nehmen wir mal einen Mikrocontroller (eher klein mit wenigen Ressourcen)
> in einer beliebigen Maschine,

Das passt nicht zusammen.

Entwickler schrieb:
> Schon werden meine Frequenzmessungen und die
> Software PWM abartig ungenau...

Entweder per Interrupt oder einen größeren µC mit mehr Leistung.
Oder die besagte eierlegende Wollmilchsau.

Noch etwas: Hast Du schon einmal einen µC in der Hand gehabt?

von Peter D. (peda)


Lesenswert?

Entwickler schrieb:
> Schon werden meine Frequenzmessungen und die
> Software PWM abartig ungenau... versteht ihr einigermaßen was ivh meine?

Nein.
Definiere erstmal "abartig ungenau".
D.h. gib die konkreten Frequenzen an und den tolerierbaren Fehler.

Viele MCs haben eine Input-Capture Funktion und damit ist die Messung 
unabhängig von Programmlaufzeiten.

Für SW-PWM kann man das gleiche erreichen, indem man die Ausgänge mit 
einem HW-PWM Ausgang latcht. Man braucht dann ein externes Latch (z.B. 
74HC595 oder 74HC574).

von Entwickler (Gast)


Lesenswert?

m.n. schrieb:
> Noch etwas: Hast Du schon einmal einen µC in der Hand gehabt?

Ja, klar und nicht nur einmal ;) Habe Erfahrungen mit Atmel und 
Freescale Controllern. Ich möchte jetzt eben lernen wie man an diverse 
Probleme in der Industrie ran geht, um sowas mal auszuprobieren im 
kleineren Stil. Erfahrungen sammeln schadet ja sicher nicht im Hinblick 
auf den Beruf dann. Da gibt's ja auch meistens viel Lesestoff.
Also manche Aufgaben machen eben für mich den Eindruck als wären sie von 
einem 8bit Prozessor mit ~8 MHz ressourcentechnisch noch zu bewältigen, 
wenn man viel Zeit für die Softwareentwicklung aufbringt. Sich das immer 
wieder neu zu überlegen lohnt aber doch manchmal nicht. Greift man dann 
tatsächlich einfach aus Bequemlichkeit zum größeren Controller wo man 
nicht so auf die Ressourcen achten muss oder könnte man sich da nicht 
mal eine Art minimal OS machen, das sich in der Grundstruktur auf viele 
Controller übertragen lässt?

von Georg G. (df2au)


Lesenswert?

Ein erfahrener Entwickler wird abschätzen, was er an Ressourcen 
mindestens braucht. Dann fordert er das Vierfache und lässt sich von den 
BWLern um 50% herunterhandeln. Damit sind dann beide Seiten zufrieden.
Merke: Im Laufe des Entwicklungsprozesses steigen die Anforderungen 
laufend und irgendetwas hast du bestimmt vergessen. Also immer mit viel 
Reserven planen.

PWM und Ticker mit nur einem Timer ist ungeschickt. Das würde ich immer 
trennen. Sonst gibt es Gewürge.

Alle Ticker abhängigen Aufgaben tragen sich in eine Liste ein. Bei jedem 
Interrupt schaut der Ticker nach, ob nun eine Aufgabe gestartet werden 
muss. Wenn ja, wird der Task aktiviert und fertig. Wichtig ist, die 
Ticker-ISR (wie alle anderen ISRs auch) so kurz wie möglich zu halten. 
Es ist sinnvoll, sich schon beizeiten um ein RTOS zu kümmern. Da gibt es 
mittlerweile ausgereifte und bezahlbare Lösungen. Man muss nicht alles 
selbst neu erfinden.

von Entwickler (Gast)


Lesenswert?

@Peter
Also ich habe jetzt hier kein konkretes Projekt, wo ich was lösen muss. 
Aber nehmen wir mal an Messung von 500 KHz mit +- 10 Hz und PWM für 
einen Servomotor o.ä. mit Toleranz von max. 1%.

von Udo S. (urschmitt)


Lesenswert?

Entwickler schrieb:
> Aber nehmen wir mal an Messung von 500 KHz

Diese Frequenz misst man (bei Taktraten von <100MHz) nicht über 
Taktanzahl einer Periode sondern man misst die Anzahl von Perioden für 
eine bestimmte Torzeit.
Je länger die Torzeit desto genauer, aber desto länger dauert halt eine 
Messung und das Ergebnis.

von Martin V. (oldmax)


Lesenswert?

Hi
Ich lass jetzt mal die Ausstattung und Leistungsfähigkeit außer acht und 
erzähl einfach mal, wie bei mir Programmaufbau aussieht. Vielleicht wird 
dadurch deutlich, wie auch große Maschinen mit all ihren kleinen 
Nebentätigkeiten zurecht kommen.
1. Grundsatz: Auch Multitasking läuft in einer Schleife ( aber schlagt 
mich nicht dafür)
2. Grundsatz: Der "Bearbeiter" reagiert auf Ereignisse
Wie sieht das bei mir aus:
Beispiel: Es gibt einen Timerinterrupt, der Ein Byte mit Zeitflags 
beschreibt: z.B. 1 mSek, 10 mSek etc. Also Zeitereignisse, die in meinem 
Programm benötigt werden. Schnelle und im detail kurze Impulse werden 
mit Interrupteingängen erfasst und eine Vorverarbeitung in der ISR 
durchgeführt. z. B. einen Zähler hochsetzen.
Serielle Daten werden ebenfalls über Interrupt in einen Ringpuffer 
geschrieben.
Außer diesen Ereignissen gibt es natürlich noch die unkritischen 
langsamen Signale. Diese werden im Polling erfasst und ebenfalls in 
Ereignisflags nach Entprellung geschriben. Nun hat die Schleife vom 
Hauptprogramm alle Zeit der Welt, sich um diese Ereignisse zu kümmern. 
Sie fragt die Zeitflags ab, führt evtl. eine Bearbeitung durch und setzt 
dann das Flag zurück. Bei Zählern wird mit einem alten Stand verglichen 
und bei Abweichung evtl. etwas neu berechnet. Den Ringpuffer früft man 
duch Vergleich von Schreib- und Lesezeiger und die normalen 
Signaleingänge ebenfalls über die Flags oder Bits. Wichtig: Nach der 
Bearbeitung wird das Ereignis wieder gelöscht und erst ein neues 
Ereignis ruft die zugehörigen Routinen auf. Das hält ein Hauptprogramm 
rel. klein in der Zykluszeit. Außerdem sind soche Programme leicht 
pflegbar, weil neue Ereignisse lediglich in der Programmschleife 
abgefragt und eine Beahandlung, ein Task, wenn du willst,  aufgerufen 
werden muss. Es ist auch leicht zu kontrollieren, ob die Routinen auch 
sauber arbeiten. Natürlich hat ein solches Vorgehen auch Nachteile, aber 
die sind so gering und fallen für Standartaufgaben kaum ins Gewicht. Ich 
hoffe, das du dir nun vorstellen kannst, wie "Multitasking" 
funktionieren könnte....
Gruß oldmax

von m.n. (Gast)


Lesenswert?

Entwickler schrieb:
> Aber nehmen wir mal an Messung von 500 KHz mit +- 10 Hz und PWM für
> einen Servomotor o.ä. mit Toleranz von max. 1%.

Messung: von - bis, Meßdauer 1ms oder 10s?
Toleranz: der Spannung, der Drehzahl, der Positiongenauigkeit?

Warte ab, bis Du ein konkretes Problem hast. Alles andere wird Spinnerei 
oder heiße Luft - wie immer!

von Udo S. (urschmitt)


Lesenswert?

Nachtrag:
Eine Messung von 500 KHz bei max. Fehler von +-10Hz also 0,002% müsstest 
du (einen hochgenauen Oszillator vorausgesetzt) bei Torzeitmessung 
mindestens 0,1s lang messen, bei Messung der Taktrate bräuchtest du 
einen Oszillator mit mindestens 5*10e5*5*10e4 = 2,5*10e10 also 25 GHz.

Wenn ich nmich nicht verrechnet habe.

von Entwickler (Gast)


Lesenswert?

Das war dann wohl doch etwas utopisch wie ich sehe... So sehr ins Detail 
wollte ich eigentlich gar nicht gehen. Martin Vogel und Georg G. eure 
Beiträge haben mir geholfen!

von Martin V. (oldmax)


Lesenswert?

Hi
Dann haben sie ihren Zweck erfüllt.
Gruß oldmax

von Hannes L. (hannes)


Lesenswert?

Martin Vogel schrieb:
> Dann haben sie ihren Zweck erfüllt.

Auf alle Fälle. Sie zeigen zumindest, dass ich mit meiner (hier nicht 
geäußerten) Einstellung nicht alleine dastehe. ;-)

...

von Entwickler (Gast)


Lesenswert?

Würde mich freuen, wenn noch mehr Leute hier ihre Vorgehensweise 
erläutern würden :-)

von Bastler (Gast)


Lesenswert?

Auch ein Ansatz ist die Einteilung in harten und weichen Tasks.

Harte Tasks über Timer für Messaufgaben und den Signalpfad.
z.B.: 1ms  10ms  ...

Weiche Tasks für LCD, etc.
z.B.: frühestens nach 10ms / 100ms
wenn er erst nach 101 oder 106ms kommt ist egal.

Und größere Tasks mit Statemachines zerteilen.

von Mehmet K. (mkmk)


Lesenswert?

Entwickler schrieb:
> ... ein Mikrocontroller mit wenigen Ressourcen in einer beliebigen
>Maschine,der sich dort um so ziemlich alles kümmern muss. (...)

Wie oben schon erlaeutert, ist dies nicht gerade eine ideale Basis.
Wie oben ebenfalls schon erlaeutert:
- Für Drehzahlmessung benutzt man Input-Capture
- Für PWM einen entsprechenden Timer mit entsprechendem Ausgang

Meine persönliche Software-Strategie ist die:

Wenn MCU grenzwertig arbeitet (ich gehe aber immer noch von einer 
Taktrate von 8MHz aus), implementiere ich einen 100us Timer und hechle 
im MainLoop alle notwendigen Funktionen durch.
Auch Interrupts (Uart oder was auch immer) setzten nur ein Flag, der 
ebenfalls von dieser Mainloop abgearbeitet wird.
Bis heute ist es mir nur einmal passiert, dass ich diesen Timer auf 10us 
setzen musste.

Wenn ich etwas mehr Resourcen habe, setze ich als Scheduler Protothreads 
von Adam Dunkels ein. Aber obiges Prinzip bleibt dasselbe.

Und wenn ich dann aus den Vollen schöpfen kann, nehme ich ein RTOS 
(scmRtos). Damit zu arbeiten macht am meisten Spass.

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.