0
Offline
Newbie
Karma: 0
Posts: 22
Arduino rocks
|
 |
« on: January 15, 2011, 09:40:10 am » |
Hallo, ich tüftle gerade an einer speziellen Funktion und bekomme es nicht hin...hat jemand einen Tipp für mich? Problem: Ich möchte in einer FOR()-Schleife zwischen den einzelnen Hochzählphasen eine kurze Wartezeit einbauen, die ohne Delay() auskommt. Dabei wird die Pulsbreite eines PWM-Signals langsam auf einen Endwert gefahren. Mit delay() klappt es: if (Neuerwert > Alterwert) { for (int Schrittweite = Alterwert; Schrittweite <=Endwert; Schrittweite +=1) { analogWrite(analogOutPin, Schrittweite); delay(Wartezeit); } }
Mit der millis()-Funktion leider nicht: if (Neuerwert > Alterwert) { for (int Schrittweite = Alterwert; Schrittweite <=Endwert; Schrittweite +=1) { unsigned long currentMillis = millis(); if (currentMillis - previousMillis > Wartezeit) { analogWrite(analogOutPin, Schrittweite); previousMillis = currentMillis; } }
Habt Ihr eine Idee? Vielen lieben Dank vorab! Gruß dreamy1
|
|
|
|
|
Logged
|
|
|
|
|
Oldenburg
Offline
Sr. Member
Karma: 16
Posts: 270
Arduino, imagine the possibilities!
|
 |
« Reply #1 on: January 15, 2011, 10:06:39 am » |
die for Schleife wird x mal ausgeführt. der analoge Wert wird aber erst geschrieben wenn die Bedingung der If Anweisung wahr ist. Ein Grund kann sein, dass x schneller erreicht ist als Deine Wartezeit...
Gruß
Sebastian
|
|
|
|
|
Logged
|
|
|
|
|
AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 840
I am 1 of 10 who understands binary
|
 |
« Reply #2 on: January 15, 2011, 10:09:28 am » |
Mein Ansatz wobei ich jetzt nicht weiss ob man die Conditions einer for schleife erweitern kann. habe jetzt nihcts zu testen if (Neuerwert > Alterwert) { unsigned long currentMillis = millis(); for (int Schrittweite = Alterwert; Schrittweite <=Endwert &¤tMillis - previousMillis > Wartezeit; Schrittweite +=1) { analogWrite(analogOutPin, Schrittweite); previousMillis = currentMillis; } }
|
|
|
|
« Last Edit: January 15, 2011, 10:10:04 am by volvodani »
|
Logged
|
So ist das Leben: Manchmal bis du die Denkmal, manchmal die Taube!
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 22
Arduino rocks
|
 |
« Reply #3 on: January 15, 2011, 10:43:45 am » |
Vielen Dank für die Tipps!
Die Conditions wurden in Deinem Code zwar angenommen, aber es hat leider nicht geholfen. Die Pulsbreite wird immer direkt auf den neuen Wert gesetzt, also ohne langsames "hinfahren" auf den neuen Wert.
Habt Ihr noch Ideen, woran das liegen könnte?
@Sebastian: Dafür habe ich doch die If-Schleife in der For-Schleife mit eingebaut. Das Hochzählen der For-Schleife soll dabei erst weitergehen, wenn die Wartezeit vorüber ist. Erst mit Ablauf der Wartezeit in der If-Schleife wird der neue Wert gesetzt...so isses zumindest geplant :-)
|
|
|
|
« Last Edit: January 15, 2011, 10:56:20 am by dreamy1 »
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 172
Posts: 16136
+39 349 2158303
|
 |
« Reply #4 on: January 15, 2011, 07:01:30 pm » |
Du mußt die Wartezeit außerhalb der For-Schleife geben, Außerdem die For schleife drch eine IF bedingung ersetzen: if (Neuerwert > Alterwert) { if (millis() - previousMillis > Wartezeit) { Alterwert +=1; analogWrite(analogOutPin, Alterwert); previousMillis = millis(); }} Grüße Uwe
|
|
|
|
« Last Edit: January 16, 2011, 05:22:47 am by uwefed »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 22
Arduino rocks
|
 |
« Reply #5 on: January 16, 2011, 04:54:02 am » |
Hallo Uwe,
vielen Dank, ich probiere Deinen Code mal aus und melde mich wieder!
Viele Grüße und einen schönen Sonntag, dreamy1
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 22
Arduino rocks
|
 |
« Reply #6 on: January 16, 2011, 05:53:27 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 172
Posts: 16136
+39 349 2158303
|
 |
« Reply #7 on: January 16, 2011, 06:13:31 am » |
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: if (Neuerwert > Alterwert) { unsigned long currentMillis = millis(); for (int Schrittweite = Alterwert; Schrittweite <=Endwert &¤tMillis - previousMillis > Wartezeit; ) { analogWrite(analogOutPin, Schrittweite); previousMillis = currentMillis; Schrittweite +=1; } } Grüße Uwe
|
|
|
|
« Last Edit: January 16, 2011, 06:14:59 am by uwefed »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 22
Arduino rocks
|
 |
« Reply #8 on: January 16, 2011, 09:13:46 am » |
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? currentMillis = millis(); //........ if(currentMillis < previousMillis) { VergangeneZeit = 4294967295 + previousMillis - currentMillis; // Für korrekten Überlauf } else { VergangeneZeit = previousMillis - currentMillis; } //........ previousMillis = currentMillis;
|
|
|
|
« Last Edit: January 16, 2011, 09:16:21 am by dreamy1 »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 22
Arduino rocks
|
 |
« Reply #9 on: January 18, 2011, 03:07:07 pm » |
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
|
|
|
|
« Last Edit: January 18, 2011, 03:07:24 pm by dreamy1 »
|
Logged
|
|
|
|
|
Munich/Germany
Offline
God Member
Karma: 8
Posts: 592
|
 |
« Reply #10 on: January 19, 2011, 09:58:53 am » |
vergangeneZeit = millis() - previousMillis; WICHTIG: Variablen als unsigned long deklarieren. Überlauf spielt dann keine Rolle.
|
|
|
|
|
Logged
|
_______ Manfred
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 22
Arduino rocks
|
 |
« Reply #11 on: January 19, 2011, 05:04:59 pm » |
Hmm,
Uwe hatte oben Code gepostet, da war die Deklaration als unsigned long schon mit drin...trotzdem schrieb er, dass die Lösung bei einem Überlauf nicht funktionieren würde.
Bin ratlos...@Uwe, kannst Du das nochmal näher erklären warum es nicht richtig funktionieren wird?
Vielen Dank schon einmal vorab!
Gruß dreamy1
|
|
|
|
|
Logged
|
|
|
|
|
Munich/Germany
Offline
God Member
Karma: 8
Posts: 592
|
 |
« Reply #12 on: January 21, 2011, 03:21:43 am » |
Wenn Du damit den Code aus Reply #7 meinst: der ist allerdings etwas ... ääääh ... merkwürdig. :o Aber Uwe hat ja dazugeschrieben, dass er den Code überhaupt nicht ausprobiert hat.
Das funktioniert schon so wie ichs geschrieben habe, durch das unsigned spielt der Überlauf keine Rolle. Einzige Voraussetzung: previousMillis muss mindestens einmal zwischen zwei Überläufen neu gesetzt werden. Aber das sollte ja kein Problem sein.
|
|
|
|
« Last Edit: January 21, 2011, 03:22:25 am by MaFu »
|
Logged
|
_______ Manfred
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 22
Arduino rocks
|
 |
« Reply #13 on: January 22, 2011, 05:03:16 am » |
Hallo MaFu,
danke für die Rückmeldung!
Ich meinte den Code aus Beitrag #4, meinst Du das funktioniert dort auch?
Vielen Dank vorab!
Gruß dreamy1
|
|
|
|
|
Logged
|
|
|
|
|
Munich/Germany
Offline
God Member
Karma: 8
Posts: 592
|
 |
« Reply #14 on: January 22, 2011, 07:30:30 am » |
Sollte kein Problem bereiten. previousMillis muss halt innerhalb eines Überlaufs mindestens einmal neu gesetzt werden.
|
|
|
|
|
Logged
|
_______ Manfred
|
|
|
|
|