Forum: Mikrocontroller und Digitale Elektronik Funktionen mehrmals aufrufen


von Kurt (Gast)


Lesenswert?

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.

von Weinbauer (Gast)


Lesenswert?

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"

von Georg (Gast)


Lesenswert?

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

von Jobst M. (jobstens-de)


Lesenswert?

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

von Kurt (Gast)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Kurt (Gast)


Lesenswert?

Motor_vor wird 2 mal ausgeführt
und motor_zurück einmal.

Ich glaube, du hast meine eigentliche Frage nicht gelesen, oder?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Kurt (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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 ?

von Mark B. (markbrandis)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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.

von Plopp (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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".

von Thomas E. (picalic)


Lesenswert?

Gibt es hier überhaupt jemanden, der die Eingangsfrage verstanden hat?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas E. schrieb:
> Gibt es hier überhaupt jemanden, der die Eingangsfrage verstanden hat?

 Ich nicht, wahrscheinlich zu kompliziert für mich.

von Fragecoder (Gast)


Lesenswert?

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

von Kurt (Gast)


Lesenswert?

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.

von Fragecoder (Gast)


Lesenswert?

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

von Kurt (Gast)


Lesenswert?

Auch ok, ist aber nicht aufgeräumt.
1
int i = 0;
2
int ibf_motor_vor = 0;
3
int ibf_motor_zurueck = 0;
4
int ibf_seifenblasen = 0;
5
int marker = 1;
6
unsigned long zeit0 = 0;
7
unsigned long zeit1 = 0;
8
unsigned long start_zeit = millis();
9
10
void setup() {
11
  Serial.begin(115200);
12
  pinMode(D1, OUTPUT); // A PWM
13
  pinMode(D2, OUTPUT); // B PWM
14
  pinMode(D3, OUTPUT); // A RL
15
  pinMode(D4, OUTPUT); // B RL
16
  delay(500);
17
}
18
19
void loop() {
20
  // Fall 1
21
    motor_vor(2);seifenblasen(0, 0);
22
    motor_zurueck(2);
23
24
25
  // Fall 2
26
  // motor_zurueck(2);
27
  // seifenblasen(2, 4); // der zweite Seifenblasen Parameter muss mindestens drei kleiner sein als der Motor Parameter!
28
29
}
30
31
32
// Fuktionen
33
34
int motor_vor(int runden) ////////////////////////////////////////////////////// MOTOR VOR
35
{
36
  if (ibf_motor_vor == 0) {
37
    if ( i < runden)  {
38
      digitalWrite(D1, 1);
39
      digitalWrite(D3, 0);
40
    }
41
    if (digitalRead(D0) == 0 && marker == 1 && millis() - zeit1 > 200)  {
42
      i++;      marker = 0;      zeit1 = millis();
43
    }
44
    if (i == runden)      {
45
      i++;
46
      digitalWrite(D1, 0);
47
      delay(1500);
48
      ibf_motor_vor = 1;
49
      ibf_motor_zurueck = 0;
50
      ibf_seifenblasen = 0;
51
    }
52
    if (digitalRead(D0) == 1 && marker == 0)  {
53
      marker = 1;
54
    }
55
  }
56
}
57
58
59
60
int motor_zurueck(int runden) ////////////////////////////////////////////////////// MOTOR ZURÜCK
61
{
62
  if (ibf_motor_zurueck == 0)
63
  {
64
    if ( i < runden)
65
    {
66
      pwm(12, 0, 0);
67
    }
68
    if (digitalRead(D0) == 0 && marker == 1 && millis() - zeit1 > 200)      {
69
      i++;      marker = 0;      zeit1 = millis();
70
    }
71
    if (i == runden )      {
72
      i++;
73
      digitalWrite(D1, 0);
74
      delay(1500);
75
      ibf_motor_vor = 1;
76
      ibf_motor_zurueck = 0;
77
      ibf_seifenblasen = 0;
78
    }
79
    if (digitalRead(D0) == 1 && marker == 0)
80
    {
81
      marker = 1;
82
    }
83
  }
84
}
85
86
87
88
89
int seifenblasen(int runden_start, int runden_stop) ////////////////////////////////////////////////////// Seifenblasen
90
{
91
92
  // Serial.println("Seifenblasen");
93
94
  if ((ibf_motor_vor ==  1 || ibf_motor_zurueck == 1) && runden_start == 0) // wenn Moter steht, mach eine Umdrehung
95
  {
96
    // Serial.println("Seifenblasen wenn Motor steht");
97
    digitalWrite(D2, 1);
98
    digitalWrite(D4, 1);
99
    delay(1000);
100
    digitalWrite(D2, 0);
101
    delay(1000);
102
    ibf_motor_vor = 0;
103
    ibf_motor_zurueck = 0;
104
    ibf_seifenblasen = 1;
105
    i = 0;
106
  }
107
108
  if (i >= runden_start  && i <= runden_stop) // wenn Motor läuft, drehe dich ab runde_start bis runde_stop
109
  {
110
    //   Serial.println("Seifenblasen in voller Fahrt");
111
    digitalWrite(D2, 1);
112
    digitalWrite(D4, 1);
113
  }
114
  if (i > runden_stop)
115
  {
116
    digitalWrite(D2, 0);
117
    ibf_motor_vor = 0;
118
    ibf_motor_zurueck = 0;
119
    ibf_seifenblasen = 1;
120
  }
121
122
}

ibf_ bedeute "Ich bin fertig"

von Mark B. (markbrandis)


Lesenswert?

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.?

von Einer K. (Gast)


Lesenswert?

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.

von Kurt (Gast)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Fragecoder (Gast)


Lesenswert?

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:
1
:
2
3
// global
4
int anzahl=1; // andere Werte f. mehrmals
5
6
loop()
7
{
8
    :
9
    if(0 < anzahl) {
10
        allenur1mal();
11
        // erledigt!
12
        anzahl = anzahl-1;
13
    }
14
    :
15
}
16
17
:

von Kurt (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

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.

von Kurt (Gast)


Lesenswert?

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?

von Jim M. (turboj)


Lesenswert?

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.

von Kai S. (kai1986)


Lesenswert?

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

von Hubert G. (hubertg)


Lesenswert?

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?

von PittyJ (Gast)


Lesenswert?

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

von Kurt (Gast)


Lesenswert?

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.

von Kai S. (kai1986)


Lesenswert?

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

von Hubert G. (hubertg)


Lesenswert?

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.

von Hanswurst (Gast)


Lesenswert?

@ 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.

von Fragecoder (Gast)


Lesenswert?

[ ] Du hast die Funktion /allenur1mal()/ von meinem vorherigen Post 
gesehen.

Also nochmal in langschreibweise (ohne besagte Funktion, nur mit Deinen 
Funktionen):

Einfacher Ansatz:
1
 :
2
 
3
 // global
4
 int anzahl=1; // andere Werte f. mehrmals
5
 
6
 loop()
7
 {
8
     :
9
     if(0 < anzahl) {
10
         motor_vor(10);
11
         maschine();
12
         motor_vor(5);
13
         maschine();
14
         motor_zurück(15);
15
         // erledigt!
16
         anzahl = anzahl-1;
17
     }
18
     :
19
 }
20
21
 :

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.