Go Down

Topic: Wartezeit in einer FOR()-Schleife ohne delay() (Read 8 times) previous topic - next topic

dreamy1

Hallo Uwe,

vielen Dank, ich probiere Deinen Code mal aus und melde mich wieder!

Viele Grüße und einen schönen Sonntag,
dreamy1

dreamy1

Habs ausprobiert - funktioniert hervorragend!!!

Vielen herzlichen Dank für Deine -wieder einmal- kompetente und zielführende Lösung!

Interessehalber: warum funktioniert das innerhalb einer FOR-Schliefe nicht?

Gruß
dreamy1

uwefed

#7
Jan 16, 2011, 12:13 pm Last Edit: Jan 16, 2011, 12:14 pm by uwefed Reason: 1
Meine Lösung funktioniert nicht 100%. Beim Überlauf der milli()-Variable nach 49 Tagen funktioniert das nicht richig wenn die Wartezeit genau im Überlauf ist. Muß nochmal darüber nachdenken, aber gestern war es zu spät. Melde mich noch.

Die For Schelife hat 3 "Parameter", laden der Variablen mit dem Startwert, End-Bedingung, bei jedem Durchlauf auzuführende Aktion.
Die Schleife FOR( ; ; ) ist gültig, sie läuft ewig.
Dein Programm:
Die Forschleife erhöht bei jedem Durchlauf die Variable unabhängig ob die Zeit verstrichen ist oder nicht. Wenn sie Verstrichen ist und die Forschleife noch nicht fertig ist dann gibt sie den enuen Wert aus.

Die Version von volvodani funktioniert nicht, da der Wert bei jedem Duchlauf erhöht wird nur die Endbedingung ist an die Zeit geknüpft.
Weiß nicht ob das funktioniert (habs nicht ausprobiert) und ob das eine zulässige schreibweise ist:

Quote
if (Neuerwert > Alterwert)
     {
         unsigned long currentMillis = millis();
         for (int Schrittweite = Alterwert; Schrittweite <=Endwert &&currentMillis - previousMillis > Wartezeit; )
            {
          analogWrite(analogOutPin, Schrittweite);
          previousMillis = currentMillis;
            Schrittweite +=1;
           }
       }

Grüße Uwe


dreamy1

#8
Jan 16, 2011, 03:13 pm Last Edit: Jan 16, 2011, 03:16 pm by dreamy1 Reason: 1
Vielen Dank für die Info!

Die If-Schleife gefällt mir besser als die FOR-Schleife, ich glaube ich bleibe dabei :-)

Für das Handling des Überlaufes habe ich einen Codeschnipsel gefunden...ob das so funktionieren würde?

Code: [Select]

currentMillis = millis();
//........
if(currentMillis < previousMillis)
{
VergangeneZeit = 4294967295 + previousMillis - currentMillis; // Für korrekten Überlauf
}
else
{
VergangeneZeit = previousMillis - currentMillis;
}
//........
previousMillis = currentMillis;

dreamy1

#9
Jan 18, 2011, 09:07 pm Last Edit: Jan 18, 2011, 09:07 pm by dreamy1 Reason: 1
Hallo,

ich würde meinen letzten Post gerne noch einmal "aufleben" lassen :-)

Hat jemand eine Idee, wie man ein Handling des 49-Tage-Überlaufes hinbekommen könnte?

Vielen lieben Dank vorab!

Gruß
dreamy1

Go Up