Nabend
Ich möchte gerne einen Motor x Runden drehen lassen,
dann soll der µC etwas anderes machen
und dann den Motor wieder drehen lassen.
Für beides habe ich Funktionen erstellt und würde diese gerne so in den
Loop schreiben:
motor_vor();
maschine();
motor_vor();
Motor_vor() stoppt am Ende der letzten Runde und setzt eine globale
Variable so,dass die maschine(); loslegen kann:
motor_vor()
if (runde < i){motor an}
ir (runde == i){motor aus, fertig = 1)
maschine()
if (fertig == 1){leg los}
Wenn es nur um diese zwei Funktionen gehen würden,
hätte ich ja einfach motor_vor_1() mit dem selben Inhalt erstellen
und maschine() fertig_1 = 1 geben können.
Aber die Funktionen sind natürlich länger (und in echtem Code
geschrieben)
und werden deutlich häufiger aufgerufen, als nur zwei Mal.
Konkret stehe ich vor der Frage:
Wie werden im Loop Funktionen immer nach einander aufgerufen?
Wobei eine schon einmal ausgeführte Funktion nicht noch einmal
ausgeführt wird.
Vielleicht könnt ihr mir ja helfen.
nunja, Funktionen werden immer der Reihe nach aufgerufen in der sie eben
im Listing stehen.
Wenn das Programm aber nicht im Ablauf verharren soll wirds etwas
komplizierter ... Dann ist der Suchbegriff "state machine"
Kurt schrieb:> motor_vor()> if (runde < i){motor an}> ir (runde == i){motor aus, fertig = 1)
Wo ist da das Problem? Der Motor ist an bis zur iten Runde. Danach
passiert nichts mehr, so ist das doch wohl beabsichtigt. Nur:
Runde muss natürlich auf 0 initialisiert werden und in jedem
Loop-Durchlauf hochgezählt. Eigentlich sollte da wohl Sekunden gezählt
werden, Loops sind nichts genaues.
if (runde == i) ist ein Fehler, weil unsicher - korrekt wäre runde > i.
Georg
Kurt schrieb:> Ich möchte gerne einen Motor x Runden drehen lassen,> dann soll der µC etwas anderes machen
Das kann der auch, wenn der Motor sich dreht.
Kurt schrieb:> Aber die Funktionen sind natürlich länger
Wie lang die Funktionen sind ist aber doch eigentlich egal.
Kurt schrieb:> Wobei eine schon einmal ausgeführte Funktion nicht noch einmal> ausgeführt wird.
???
Sowas!?
1
fkten1 = true;
2
fkten2 = true;
3
fkten3 = true;
4
5
while (1)
6
{ if (fkten1)
7
{ fkt1();
8
fkten1 = false;
9
};
10
if (fkten2)
11
{ fkt2();
12
fkten2 = false;
13
};
14
if (fkten3)
15
{ fkt3();
16
fkten3 = false;
17
};
18
};
*Sich die Daumen in die Augen drückt.*
Macht das selbe wie:
1
fkt1();
2
fkt2();
3
fkt3();
4
while (1) {};
Wo ist der Sinn?
Was möchtest Du EIGENTLICH?
Gruß
Jobst
Weinbauer schrieb:> Dann ist der Suchbegriff "state machine"
Verstehe ich noch nicht ganz, könnte aber machbar sein (Ampelsteuerung
über Induktionsschleife)
Georg schrieb:> Runde muss natürlich auf 0 initialisiert werden und in jedem> Loop-Durchlauf hochgezählt. Eigentlich sollte da wohl Sekunden gezählt> werden, Loops sind nichts genaues.
Ja, i wird natürlich wieder resettet.
Und Runden sind Umdrehungen des Motors hinter dem Getriebe,
gelesen über digitalRead.
Jobst M. schrieb:> Das kann der auch, wenn der Motor sich dreht.
Ja, soll er aber nicht ;-)
Jobst M. schrieb:> Was möchtest Du EIGENTLICH?
Ich möchte meine drei Funktionen beliebig oft hintereinader schreiben
können.
Sie sollen aber alle nur einmal ausgeführt werden.
motor_vor(10);
maschine();
motor_vor(5);
maschine();
motor_zurück(15);
Motor fährt 10 Umdrehungen vor und stoppt,
Maschine geht an und wieder aus,
Motor fährt 5 Umdrehungen vor und stoppt,
Maschine geht an und wieder aus,
Motor fährt 15 Umdrehungen zurück und stoppt,
ist also wieder am Startpunkt.
Kurt schrieb:> Sie sollen aber alle nur einmal ausgeführt werden.
Das ist doch Unsinn:
1. Maschine Stop wird eben 3mal ausgeführt, jedesmal stoppt der Motor -
was soll daran falsch sein?
2. Motor_vor wird auch 3mal ausgeführt, und zwar mit den Parametern 10,
5 und 15 - wo ist da ein Problem??
Georg
Kurt schrieb:> Ich glaube, du hast meine eigentliche Frage nicht gelesen, oder?
Wenn du zu dumm bist um deine Frage richtig zu stellen, bist du
wahrscheinlich auch zu dumm um die Antwort zu verstehen, auch wenn
es die richtige ist.
Ich habe deine eigentliche Frage 5 Mal gelesen und verstehe immer
noch nicht was du eigentlich willst.
Marc V. schrieb:> Wenn du zu dumm bist um deine Frage richtig zu stellen, bist du> wahrscheinlich auch zu dumm um die Antwort zu verstehen, auch wenn> es die richtige ist.
Hui, solche Worte an einem Sonntag morgen...
Kurt schrieb:> Ich möchte meine drei Funktionen beliebig oft hintereinader schreiben> können.> Sie sollen aber alle nur einmal ausgeführt werden.>> motor_vor(10);> maschine();> motor_vor(5);> maschine();> motor_zurück(15);>> Motor fährt 10 Umdrehungen vor und stoppt,> Maschine geht an und wieder aus,> Motor fährt 5 Umdrehungen vor und stoppt,> Maschine geht an und wieder aus,> Motor fährt 15 Umdrehungen zurück und stoppt,> ist also wieder am Startpunkt.
motor_vor(10) wird ausgeführt und soll nach den 10 Runden NICHT noch
einmal aufgerufen werden.
Kurt schrieb:> motor_vor(10) wird ausgeführt und soll nach den 10 Runden NICHT noch> einmal aufgerufen werden.
Ja.
Wer soll motor_vor(10) noch einmal aufrufen und warum ?
Kurt schrieb:> motor_vor(10) wird ausgeführt und soll nach den 10 Runden NICHT noch> einmal aufgerufen werden.
Man kann zum Beispiel ein Flag setzen. Also eine Hilfsvariable. Diese
wird abgefragt und wenn sie einen bestimmten Wert hat, wird eine
Funktion wie motor_vor() aufgerufen, ansonsten eben nicht.
Im Übrigen wäre es vermutlich hilfreicher, wenn Du uns Deine
Anforderungen nennst und nicht Deinen Lösungsansatz.
Marc V. schrieb:> Kurt schrieb:>> motor_vor(10) wird ausgeführt und soll nach den 10 Runden NICHT noch>> einmal aufgerufen werden.>> Ja.> Wer soll motor_vor(10) noch einmal aufrufen und warum ?
Ich gehe mal davon dass der Code in der while(1) Schleife des Codes
steckt, die auf dem Mikrocontroller läuft den er programmiert. Ihm fehlt
vielleicht einfach eine passende Vorbedinung, die abzufragen ist bevor
er die Funktion motor_vor() aufruft.
Kurt schrieb:> motor_vor(10) wird ausgeführt und soll nach den 10 Runden NICHT noch> einmal aufgerufen werden.
In einer Schleife (sonst ergibt es ja keinen Sinn)? Dann könntest du ein
Flag setzen und abfragen:
if(!ausgefuehrt)
{
motor_vor(10);
ausgefuehrt = true;
}
Aber ich muss zugeben, dass ich deine Originalfrage auch nicht
verstanden hatte.
Mark B. schrieb:> Man kann zum Beispiel ein Flag setzen. Also eine Hilfsvariable. Diese> wird abgefragt und wenn sie einen bestimmten Wert hat, wird eine> Funktion wie motor_vor() aufgerufen, ansonsten eben nicht.
Womit man dann einen abfragbaren "Status" erfunden hat.
Und Zack, ist man beim "endlichen Automaten".
Mark B. schrieb:> Ich gehe mal davon dass der Code in der while(1) Schleife des Codes> steckt, die auf dem Mikrocontroller läuft den er programmiert.
Solange du oder jemand anders nur davon ausgeht, dass irgendetwas so
sein soll oder ist, wird ganz einfach nichts daraus.
Er ist ganz einfach nicht imstande zu erklären, was er eigentlich
will. Und sein Code ist so geheim, dass er ihn nicht mal zeigen
darf.
> Sie sollen aber alle nur einmal ausgeführt werden.>> motor_vor(10);> maschine();> motor_vor(5);> maschine();> motor_zurück(15);
1
void allenur1mal(void)
2
{
3
motor_vor(10);
4
maschine();
5
motor_vor(5);
6
maschine();
7
motor_zurück(15);
8
}
So: die Funktion /allenur1mal()/ ruft Deine Sequenz genau nur 1x auf.
Wo plazierst Du nun den Funktionsaufruf?
Zeig Dein restlicher Code - vielleicht wird dann Deine Frage verstanden,
ohne dass Du in der Lage bist sie verständlich zu stellen...
Mark B. schrieb:> Im Übrigen wäre es vermutlich hilfreicher, wenn Du uns Deine> Anforderungen nennst und nicht Deinen Lösungsansatz.
OK,mach ich:
Ein Motor treibt eine Seilbahn an, welche noch einen zweiten Motor hat,
der eine angehängt Last drehen kann.
Die Seilbahn kann vor und zurück fahren. (motor_vor(), motor_zurück())
Am Ende des Getriebes ist ein Rundenzähler angebracht,
der nach jeder Runde (egal ob vor oder zurück) ein LOW zurück gibt.
Der zweite Motor soll die Last einmal drehen (maschine()).
Jetzt möchte ich gerne möglichst einfach z.B. folgenden Ablauf
realisieren können:
Seilbahn fährt 10 Runden vor und stoppt,
Last dreht sich 1 mal und stoppt,
Seilbahn fährt 5 Runden vor und stoppt,
Last dreht sich 2 mal und stoppt,
Seilbahn fährt 20 Runden vor und stoppt,
Last dreht sich 1 mal und stoppt,
Seilbahn fährt 10 Runden zurück und stoppt,
Last dreht sich 2 mal und stoppt,
Seilbahn fährt 25 Runden zurück und stoppt
und ist damit wieder am Ausgangspunkt.
Vielleicht konnte ich es ja jetzt verständlich beschreiben.
danke f.d. Einsatzbeschreibung.
Ich bleib jedoch dabei:
> So: die Funktion /allenur1mal()/ ruft Deine Sequenz genau nur 1x auf.>> Wo plazierst Du nun den Funktionsaufruf?>> Zeig Dein restlicher Code - vielleicht wird dann Deine Frage verstanden,> ohne dass Du in der Lage bist sie verständlich zu stellen...
Kurt schrieb:> Seilbahn fährt 10 Runden vor und stoppt,> Last dreht sich 1 mal und stoppt,> Seilbahn fährt 5 Runden vor und stoppt,> Last dreht sich 2 mal und stoppt,> Seilbahn fährt 20 Runden vor und stoppt,> Last dreht sich 1 mal und stoppt,> Seilbahn fährt 10 Runden zurück und stoppt,> Last dreht sich 2 mal und stoppt,> Seilbahn fährt 25 Runden zurück und stoppt> und ist damit wieder am Ausgangspunkt.
Okay. Jetzt wäre noch die Frage:
Soll das kontinuierlich geschehen? Oder bei einem bestimmten Ereignis,
z.B. nach einem Tastendruck? Oder in einem bestimmten Zeitintervall,
z.B. einmal den Bewegungsablauf durchführen, dann 10 Sekunden warten,
dann wieder den Bewegungsablauf durchführen usw.?
Aus meiner Sicht ist das eine recht einfache Ablaufsteuerung.
Die Fahrdaten kann man in einem Array platzieren.
Und einfach drüber weg iterieren.
Es ist und bleibt ein einfacher endlicher Automat.
Mark B. schrieb:> Soll das kontinuierlich geschehen? Oder bei einem bestimmten Ereignis,> z.B. nach einem Tastendruck? Oder in einem bestimmten Zeitintervall,> z.B. einmal den Bewegungsablauf durchführen, dann 10 Sekunden warten,> dann wieder den Bewegungsablauf durchführen usw.?
Nein, nicht kontinuierlich.
Letztendlich soll das Ganze auf einem ESP über Wlan gesteuert werden.
Da würde ich dann einfach nur noch das Startsignal geben.
Wenn Das Programm, also die aufeinander folgenden Funktionen, fertig
sind
und die Seilbahn wieder am Ausgangspunkt ist, soll nichts mehr
passieren,
bis von extern wieder ein Startsignal gegeben wird.
Thomas E. schrieb:> Gibt es hier überhaupt jemanden, der die Eingangsfrage verstanden hat?
Wahrscheinlich: er hat irgendwo gelesen oder ein Template geladen,
nachdem jedes Embedded-System eine endlose while-loop ausführen muss.
Und jetzt weiss er nicht, wie er einen einfachen seriellen Ablauf der
Art Tuwas1, Tuwas2, Tuwas3 in hinkriegt, obwohl die Schleife ja immer
wieder ausgeführt wird.
Aber da ich von ihm nur rotzfreche Antworten erhalte und keinerlei
Verständnis für Lösungen, beteilige ich mich auch nicht weiter daran. Es
würde wohl eh nichts dabei rauskommen.
Georg
Missverständliches Oginool:
> Wie werden im Loop Funktionen immer nach einander aufgerufen?> Wobei eine schon einmal ausgeführte Funktion nicht noch einmal> ausgeführt wird.
Vorschlag mit Verbesserung:
Wie werden in einer ihrerseits laufend wiederholt aufgerufenen Funktion
(konkret: die Funktion /loop()/ der Arduino Laufzeitumgebung) weitere
Funktionen so "aufgerufen", dass diese ihre Aufgabe nur 1x erledigen?
Einfacher Ansatz:
Kurt schrieb:> Ich glaube, du hast meine eigentliche Frage nicht gelesen, oder?Marc V. schrieb:> Wenn du zu dumm bist um deine Frage richtig zu stellen,
Was hier rotzfrech ist, will ich nicht beurteilen...
Trotzdem Danke für dein Bemühen.
Fragecoder schrieb:> Missverständliches Oginool:>> Wie werden im Loop Funktionen immer nach einander aufgerufen?>> Wobei eine schon einmal ausgeführte Funktion nicht noch einmal>> ausgeführt wird.
Tatsächlich missverständlich:
Die Funktion motor_vor() möchte ich ja schon mehrmals aufrufen können.
Nur eben mit anderen Parametern.
So langsam glaube ich, das ich es nicht schaffen werde euch zu erklären,
was ich möchte...
Kurt schrieb:> So langsam glaube ich, das ich es nicht schaffen werde euch zu erklären,> was ich möchte...
So langsam glaube ich, dass du die Aufgabe genauso wenig schaffen
wirst...
Kurt schrieb:> Die Funktion motor_vor() möchte ich ja schon mehrmals aufrufen können.> Nur eben mit anderen Parametern.
Das kannst du ja tun...
Was hält dich davon ab?
Kurt schrieb:> So langsam glaube ich, das ich es nicht schaffen werde euch zu erklären,> was ich möchte...
Du könntest mal sagen, was dein Problem ist...
Falls du möchtest, dass wir dir dein Programm schreiben, dann wird es
allerdings schwierig.
U. F. schrieb:> Du könntest mal sagen, was dein Problem ist...>> Falls du möchtest, dass wir dir dein Programm schreiben, dann wird es> allerdings schwierig.
Das erste versuche ich ja schon,
das zweite ist nicht meine Absicht.
Aber nochmal zu meinem Problem, etwas zusammen gekürzt:
Es gibt eine Funktion, der ein Parameter übergeben wird.
Die Funktion macht irgendetwas, sooft wie es der Parameter vorgibt
und hört dann damit auf.
Diese Funktion wird nun im Loop aufgerufen:
void loop(){
funktion(5);
}
Jetzt macht diese Funktion ihre Aufgabe 5 Mal und hört dann auf.
Bis der Loop das nächste Mal durchlaufen wird.
Dann macht die Funktion ihre Aufgabe wieder 5 Mal und hört dann auf.
Und das macht sie sooft, wie der Loop die Funktion aufruft.
Wenn die Funktion aber nur einmal die 5 Aufgaben erledigen soll,
könnte ich das so machen:
void loop(){
if (fertig != 1){
funktion(5);
}
}
funktion(){
tu was bis i == 5, dann fertig = 1
}
und schon wird die Funktion nur so lange aufgerufen, bis sie ihre
Aufgabe 5 Mal erledigt hat.
Und jetzt der oder mein casus knacksus:
Ich möchte diese Funktion noch einmal aufrufen:
funktion(5);
mach was anderes
funktion(19);
Wenn ich jetzt die if-Bedingung von oben nutzen möchte,
würde die Erledigung von funktion(5); doch verhindern, dass später
funktion(19); aufgerufen werden kann.
Wenn es nur 2 Funktionen wären, dann würde ich ja nicht lange fackeln
und das ganze in einer Funktion unterbringen.
Aber das könnte ein realer Fall sein:
Kurt schrieb:> Seilbahn fährt 10 Runden vor und stoppt,> Last dreht sich 1 mal und stoppt,> Seilbahn fährt 5 Runden vor und stoppt,> Last dreht sich 2 mal und stoppt,> Seilbahn fährt 20 Runden vor und stoppt,> Last dreht sich 1 mal und stoppt,> Seilbahn fährt 10 Runden zurück und stoppt,> Last dreht sich 2 mal und stoppt,> Seilbahn fährt 25 Runden zurück und stoppt> und ist damit wieder am Ausgangspunkt.
Konntet ihr mich jetzt verstehen,
bzw mein Problem nachvollziehen?
Kurt schrieb:> Wenn ich jetzt die if-Bedingung von oben nutzen möchte,> würde die Erledigung von funktion(5); doch verhindern, dass später> funktion(19); aufgerufen werden kann.
Da muss halt auch der maximale Wert eine Variable sein.
Lies Dich mal in State Machines ein.
Hallo,
die saubere Lösung für dein Problem wurde schon mehrfach genannt, das
ist eine State Machine (oder finite state machine, oder in deutsch
Ablaufsteuerung). Bei SPSen wird es auch gerne Schrittkette genannt.
wenn du das Beispiel hier umbasteln willst hast du auch ne Menge
Möglichkeiten
Kurt schrieb:> void loop(){> if (fertig != 1){> funktion(5);> }> }>> funktion(){> tu was bis i == 5, dann fertig = 1> }
z.B. Möglichkeit1:
void loop(){
if (fertig != 1){
funktion(5);
}
if (neue_ausfuehrung == true){
fertig = 0;
}
}
funktion(){
tu was bis i == 5, dann fertig = 1
}
Möglichkeit 2:
anzahl_ausfuehrungen = 5;
void loop(){
funktion(anzahl_ausfuehrungen);
if (neue_ausfuehrung == true){
anzahl_ausfuehrungen = neue_anzahl_ausfuehrungen;
}
}
funktion(){
/*wenn anzahl_ausfuehrungen = 0, dann springt die Funktion halt zurück
ohne was zu machen*/
tu was bis i == anzahl_ausfuehrungen, dann anzahl_ausfuehrungen = 0
}
Gruß Kai
Kurt schrieb:> funktion(5);> mach was anderes> funktion(19);
Heißt jetzt funktion(5); oder funktion(19) das die Funktion fünf mal
oder 19 mal durchlaufen wird oder sind das unterschiedliche Funktionen?
Hier wieder mein Hinweis, einfach mal ein Buch über das Programmieren zu
lesen, bevor mal Programme schreibt.
Und es gibt auch immer noch öffentliche Leihbüchereien (wem Amazon zu
teuer ist).
Danke Kai für das Beispiel!
Ich werde es heute Abend mal ausprobieren.
@Hubert
Wie oft die Funktionen durchlaufen werden liegt doch an der
Loopgeschwindigkeit.
funktion(5); bedeute doch nur, das der Motor so lange Strom bekommt,
bis er sich 5 Mal gedreht hat.
Kurt schrieb:> bedeute doch nur, das der Motor so lange Strom bekommt,> bis er sich 5 Mal gedreht hat.
Hier ist glaube ich ein Missverständnis.
Die Funktion "funktion(5)" schaltet ja den Strom für den Motor ein und
nach 5 Umdrehungen wieder ab. In der Zeit läuft aber Loop nicht weiter.
In der Loop Schleife springst du in die Funktion "funktion(5)" und
führst diese aus, bis sie fertig ist (in der wird ja in irgend einer
Form eine Schleife stecken, die wartet bis der Motor 5 Umdrehungen
gemacht hat). Wenn das alles fertig ist geht es erst zurück und weiter
in Loop.
Hab gerade kurz in deinen Code geschaut und auf den ersten Blick
funktionieren deine Funktionen motor_vor() schon nicht so, wie du dir
das vorstellt. Die solltest du erstmal einzeln überprüfen.
Gruß Kai
Kurt schrieb:> Wie oft die Funktionen durchlaufen werden liegt doch an der> Loopgeschwindigkeit.> funktion(5); bedeute doch nur, das der Motor so lange Strom bekommt,> bis er sich 5 Mal gedreht hat.
Was die Anzahl der Funktionsdurchläufe mit der Loopgeschwindigkeit zu
tun hat, ist mir nicht klar.
Woher du das x in der funktion(x) hast, habe ich auch noch nicht
gefunden.
@ Kurt
Man kann nicht oft genug darauf hinweisen, wie wichtig es ist sich
präzise auszudrücken. Und detailliert genug. Dann kann man auch klare
Schlüsse ziehen.
Es gibt hier einen ganzen Haufen Probleme, die man nur Stück für Stück
angehen kann. Wenn man sie auf einmal erledigen will, dann wird das noch
unklarer, denke ich.
1. Zunächst mal was "loop" ist und heisst und was es genau in diesem
Zusammenhang heisst. Was bedeutet es im allgemeinen unter
Programmierern? Was im besonderen im Zusammenhang mit Arduiono?
Was sind in C die Schleifenformen und wie verwendet man sie. Was genau
geschieht in- und ausserhalb der besonderen Arduino-Loop-Funktion? Was
in- und ausserhalb den C-Schleifenformen?
2. Warum und wie verwendet man klare Namensgebungen für Variablen und
Funktionen. Warum und wie erfolgt die Benutzung von Verben und
Substantiven dafür. Warum und wie die Verwendung von symbolischen
Konstanten.
3. Aufgabenbeschreibung: Was sind die Elemente? Wie können sie sich
verhalten? Einzeln? Im Zusammenhang mit anderen Elementen? Was ist die
Gesamtwirkung? Graphische Darstellung (Skizze)? Grundbegriffe der
Anwendung? (Hier z.B. Lage von Rotationsachsen: Mir war erst nach
einigen Vermutungen klar, dass die Traglast der Seilbahn noch einmal
unabhängig von der Seilbewegung um eine Achse ihrer selbst gedreht
werden kann. Aber ich mag mich auch irren.) Programmablaufplan?
Ich weiß, dass ist alles mühsam und unbequem. Aber warum willst Du das
eigentlich machen? Was ist Dein Motiv? Und ist das stark genug, Dich die
Hindernisse überwinden zu lassen?
Ich will hier mal kurz Dein scheinbares Hauptproblem beleuchten, um Dir
einen Ausblick zu geben.
Es geht meiner Meinung nach darum, dass Funktionen "abhängig von
Bedingungen" arbeiten sollen, die von der Ausführung anderer Funktionen
abhängen (und evtl. von gewissen besonderen Umständen darin).
Das ergibt sich von Deiner Warte aus, sozusagen durch den "Zwang" das
die loop-Funktion immer wieder aufgerufen wird; ohne das Du das
eigentlich hingeschrieben hast. Das ist so schon nicht ganz richtig oder
wenigstens nicht vollständig beschrieben, falls Du es denn so siehst.
Jedenfalls ist für Dich das "mehrmals aufrufen" die wesentliche Ursache
aber das ist keine vollständige Beschreibung des Problems.
Die übliche Lösung ist eigentlich schon genannt: Die Zustandsmaschine.
Aber der gedanklich vorausgehende Schritt (und der übliche Weg für
"einfache" Fälle mit wenigen Bedingungen) ist die Überlegung und die
Implementierung von Bedingungen die miteinander wechselwirken.
Das willst Du jetzt angehen. Aber ich denke Du solltest Dir die drei
obigen Punkte zunächst einmal gründlich ansehen und Dich darin üben. Das
würde auch Deine Möglichkeiten, Dich klar auszudrücken, wesentlich
stärken. Und auch Deine Programme würden lesbarer.
Wenn Du mal reingucken willst, suche nach "Statemachine" oder
"Zustandmaschine" oder auch "Automat" oder "Petri-Netz". Aber nur mal
reingucken. Deine Probleme fangen bei grundlegenderen Frage an, meine
ich.
Viel Erfolg.
[ ] Du hast die Funktion /allenur1mal()/ von meinem vorherigen Post
gesehen.
Also nochmal in langschreibweise (ohne besagte Funktion, nur mit Deinen
Funktionen):
Einfacher Ansatz: