Gleichzeitige Prozesse?

Hallo ich beschäftige mich jetzt schon etwas länger mit Arduino´s und dabei ist bei mir schon öfter das problem das ich zwei prozesse gleichzeitig benötigt hätte zB:. Man lässt eine led mit einem delay von 100 blinken und gleichzeitig schaltet man einen Motor an und aus.
Wie müsste nun die Programmstrucktur aussehen um diese beiden Prozesse simultan ausführen zu können?
Lg, Fritz.

Vielleicht ist ja hier was für dich dabei....

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Der Wachmann

Multitasking Macros
Intervall Macros

Gleichzeitig geht nicht, aber sehr schnell hintereinander.
Dann darfst du kein Delay verwenden.
Deine Lösung heißt "BlinkWithoutDelays" und die findest du in den Beispielen der IDE.

Eine Ampelsteuerung, bei der eine LED asynchron blinkt von RudiDL5 und dahinter von mir. Da steckt das "quasi parallel" drin.

fritu123:
Hallo ich beschäftige mich jetzt schon etwas länger mit Arduino´s und dabei ist bei mir schon öfter das problem das ich zwei prozesse gleichzeitig benötigt hätte zB:. Man lässt eine led mit einem delay von 100 blinken und gleichzeitig schaltet man einen Motor an und aus.
Wie müsste nun die Programmstrucktur aussehen um diese beiden Prozesse simultan ausführen zu können?
Lg, Fritz.

Wie immer beim Programmieren gibt es nicht nur eine Lösung, um ein "kooperatives Multitasking zu realisieren.

Eine Möglichkeit wäre es, in einem round-robin-scheduling eine gewisse Anzahl von Task-Funktionen immer rundherum nacheinander aufzurufen. Beispiel:

void loop(){
  tastk1();
  tastk2();
  tastk3();
  tastk4();

}

Jede dieser Task-Funktionen muß dabei frei von Blockierungen geschrieben sein, darf also ihrerseits keine Aufrufe von (delay() oder anderen Busy-Waiting-Funktionen enthalten, sondern muß vollkommen kooperativ programmiert sein, darf also nur die unbedingt nötige Rechenzeit für sich verwenden und den Ablauf NICHT aufhalten.

Eine andere Möglichkeit der Programmstruktur wäre das EVA-Prinzip anzuwenden, und dabei die Bereiche "Eingabe", Verarbeitung" und "Ausgabe strikt zu trennen.
Beispiel für die loop-Funktion:

void loop(){
eingabe();
verarbeitung();
ausgabe();
}[/code]

Hier gilt für die Funktionen eingabe(), verarbeitung() und ausgabe() dasselbe wie zuvor über die Taskfunktionen geschrieben: Keine Blockierungen, keine Aufrufe von delay() oder BusyWaiting-Funktionen!

Hier müssen ggf. programmtechnische Finessen angewendet werden, z.B. zusätzliche Pufferungen von Ausgabedaten, wenn die Ausgabe beispielsweise über einen sehr langsamen Übertragungsweg läuft, z.B. über Serial mit einer sehr niedrigen Baudrate und vergleichsweise großen zu übertragenden Datenmengen. Oder wenn ie verarbeitung() von Informationen vergleichsweise lange Zeit beansprucht, z.B. bei einem programmierten Schachspiel: Nach einer schnellen Zugeingabe kann nach den offiziellen Schachregeln (die Schach-WM findet gerade in diesen Tagen statt) bis zu mehreren Minuten betragen, erst recht bei so vergleichsweise rechenschwachen Kleinrechnern wie einem 8-bit Mkrocontroller. Aber Du willst vermutlich auch keinen Mikrocontroller programmieren, dass er eine Lichtshow mit 1000 LEDs abspielt, gleichzeitig schwere Motorenmit zig Kilowatt Leistung schaltet und nebenbei noch den Schachweltmeister im Schachspielen besiegen kann.

Da müßte man schon Kompromisse machen.

Also sagen wir mal eine Lichtshow mit 10 ÖLEDs abspielen, eine handvoll Kleinmotoren oder Modellbauservos steuern, und gleichzeitig noch einen durchschnittlichen Forumsteilnehmer beim "4Gewinnt" besiegen.
:grin:

Mit den Task Makros der ALib0 kannst Du Prozesse erzeugen, die quasi-parallel laufen. Nicht viel anders als mit den vorgenannten Vorschlägen, nur einfacher zu verstehen, hinzuschreiben und zu lesen.

fritu123:
... problem das ich zwei prozesse gleichzeitig benötigt hätte ...

Guck Dir auf jeden Fall mal die von DrDiettrich genannte ALib0 an.

Ansonsten habe ich neulich mal etwas zur Vermeidung von delay() ins Netz gekippt. Guck bei Gelegenheit hier.

Es gibt für derartige Dinge keine „allgemein beste Lösung“. Wie die beste Programmier-Strategie aussieht, hängt vom Einzelfall ab. Manchmal ist ein switch()-Konstrukt besser, manchmal etwas mit if() (oder etwas ganz Anderes).

HTH

Gregor