Go Down

Topic: for-Schleife def. Zeitraum loopen lassen ohne "delay" (Read 1 time) previous topic - next topic

Chris72622

Hallo,

steh grad echt auf dem Schlauch.

Ich würde gerne eine for-Schleife sich einen bestimmten Zeitraum loopen lassen, ohne "delay" verwenden zu müssen.

Ließe sich das u.U. über eine Schleife in der Schleife realisieren und falls ja, wie?

Stichworte sollten reichen. ;)

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

qualidat

Die Abbruch-Bedingung für eine for-Schleife ist das Überschreiten des Abbruchwertes. Man kann den - in Abhängigkeit von Irgendwas - auch ständig erhöhen, so dass er nicht erreicht wird ... aber sauberes Programmieren geht anders.
Dafür sind eigentlich while-Schleifen gedacht. Was hast du genau vor? So eine "Warte"-Schleife blockiert sämtliche anderen Reaktionen und trotzdem braucht der Prozessor voll Strom ... das geht ganz bestimmt eleganter.

Chris72622

#2
Sep 09, 2012, 10:38 am Last Edit: Sep 09, 2012, 11:27 am by Chris72622 Reason: 1
Hallo,

ich suche eine Möglichkeit eine Schleife eine bestimmte Dauer loopen zu lassen, während ein Zähler die Anzahl der Durchläufe festhält. Aufgrund des Zählers entschied ich mich für die for-Schleife, stehe nun aber wie gesagt vor dem Zeitproblem.

Im Kopf meiner for-Schleife steht bereits aufgrund der  von mir gewollten Unendlichkeit etwas in dieser Art: (i=1;i>0;i++).

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

Udo Klein

Wenn es unbedingt eine For Schleife sein soll, dann würde ich den Vergleich aber gleich weglassen, also

Code: [Select]

for(int i=0; ; ++i)


Üblicher wäre aber

Code: [Select]

int i=0;
while (true) {
  ++i
}
Check out my experiments http://blog.blinkenlight.net

maverick1509

#4
Sep 09, 2012, 11:44 am Last Edit: Sep 09, 2012, 11:52 am by uwefed Reason: 1
Hallo Chris,
ich würde es so machen:

wenn du in die Schleife läufst Startzeit merken:

Code: [Select]
start = millis();
i = 0;
while (millis() - start < x ) {    //x ist dein Wert in Millisekunden wie lange die Schleife laufen soll
i++;
}

Serialprintln(i);   // gibt aus wie oft die Schleife durchlaufen wurde


Gruß

Bernward

uwefed

Ich würde es auch wie maverick1509 machen; nur mit if.

Code: [Select]
start = millis();
i = 0;
if (millis() - start < x ) {    //x ist dein Wert in Millisekunden wie lange die Schleife laufen soll
i++;
}
Serialprintln(i);   // gibt aus wie oft die Schleife durchlaufen wurde


Aber es ist wirklich Ansichtssache ob Du if oder while verwendest.
Grüße Uwe


Chris72622

Hammerforum.

Thema erledigt. :)

Vielen Dank Euch!

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

maverick1509


kduin

For the record:
Mit break; kann man aus While und For-Schleifen "ausbrechen"

uwefed

und immernoch für die Cronik:
mit continue kann man:
den Rest des Codes überspringen und den nächsten Durchlauf der Schleife erzwingen.
Grüße Uwe

Chris72622

#10
Sep 10, 2012, 07:50 pm Last Edit: Sep 10, 2012, 11:05 pm by Chris72622 Reason: 1
Hallo,

kann es sein, dass Ihr (maverick1509 und uwefed) ">" anstatt von "<" gemeint habt und kann es sein, dass Ihr Beide innerhalb des Loops "schleifenzeit = millis();" vergessen habt?

Gruß Chris

Edit: Und gleich noch eine Frage zum Thema Schleifen: Wenn eine Schleife nur einmal pro Sekunde durchlaufen wird, ist es dann so, dass sämtliche in der Schleife enthaltenen Abfragen auch nur einmal pro Sekunde abgefragt werden?

Ist es also so, dass folgendes Beispiel keinen Sinn machen würde und würde man dies ehr mit einer weiteren if-Schleife außerhalb der ersten if-Schleife lösen?

Code: [Select]
if (millis() - schleifenzeit > 1000)                                                // Schleifendurchlaufszeit
 {
     schleifenzeit = millis();                                                     // Erfassung der aktuellen Schleifenzeit
     schleifenzaehler++;                                                           // Erhöhung des Schleifenzählers um "1"
     
     if (millis() - schleifenzeit > 500)
       {
       digitalWrite(LED_A,HIGH);
       }
 }
https://github.com/jeffThompson/DarkArduinoTheme

MueThoS

1. würde in der theorie die zweite Bedingung immer zu treffen weil schon eine Sekunde vergangen ist!
2. ist dies aber nicht der fall weil du vor der zweiten if schon schleifenzeit neu setzt.

Gleube ich!

maverick1509

#12
Sep 11, 2012, 08:35 am Last Edit: Sep 11, 2012, 08:44 am by maverick1509 Reason: 1
Hallo Chris,
warum > und warum was vergessen?
Wenn ich in die Schleife laufe merke ich mir eine bestimmte Zeit (start).
millis() wird automatisch immer größer (interner Zähler).
Also bleibe ich in der Schleife bis millis() minus der startzeit größer als meine Vorgabe (x) wird,
also solange wie die Differenz < als mein Wert ist bleibe ich in der Schleife.
Ich sehe keinen Fehler, oder?

edit: ich glaube du machst einen Denkfehler, deine Bedingung darf eigentlich nie wahr werden, da du bei jedem Durchlauf, der sicherlich kürzer als eine Sekunde ist, schleifenzeit neu setzt.
Somit dürfte (millis() - schleifenzeit > 1000) nie wahr werden.


Gruß
Bernward

Go Up