Pages: [1]   Go Down
Author Topic: for-Schleife def. Zeitraum loopen lassen ohne "delay"  (Read 1181 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 10
Posts: 588
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Gruß Chris
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
God Member
*****
Karma: 10
Posts: 588
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: September 09, 2012, 04:27:45 am by Chris72622 » Logged


0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3470
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Üblicher wäre aber

Code:
int i=0;
while (true) {
  ++i
}
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Chris,
ich würde es so machen:

wenn du in die Schleife läufst Startzeit merken:

Code:
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
« Last Edit: September 09, 2012, 04:52:58 am by uwefed » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21252
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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

Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 588
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hammerforum.

Thema erledigt. smiley

Vielen Dank Euch!

Gruß Chris
Logged


Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Immer wieder gerne  smiley-wink dafür gibts das Forum.
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 260
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21252
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 588
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);
        }
  }
« Last Edit: September 10, 2012, 04:05:37 pm by Chris72622 » Logged


NRW
Offline Offline
Sr. Member
****
Karma: 2
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: September 11, 2012, 01:44:47 am by maverick1509 » Logged

Pages: [1]   Go Up
Jump to: