Sofa Mallow3SitzerAntiklederoptik Sofa Braun Sofa Mallow3SitzerAntiklederoptik Braun Mallow3SitzerAntiklederoptik Mallow3SitzerAntiklederoptik Sofa Braun Braun Sofa IY7gvfby6
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
Go Down
Pages: 1 [2] Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx 3

Topic: For - Loop ohne Delay verzögern(Read 2444 times) previous topic - next topic

Theseus

  • Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
  • Edison Member
  • Posts: 2,014
  • Karma: 214[add]
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
#15
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx Aug 23, 2017, 06:04 pm
Wenn dann bitte so:
Code: [Select]
															unsigned long nextMillis=millis()+1000;
while (millis() < nextMillis)
{ tue dies und das}


So muss nur einmal berechnet werden. In der vorherigen Variante findet die Addition jedes Mal statt.
Die Idee ist zwar verständlich, aber wenn es zum Überlauf von millis() kommt, dann rast die Schleife ohne Verzögerung durch. Also diese Lösung ist im Gegensatz zu meiner ungeeignet für lang laufende Projekte.
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx

Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
#16
Aug 23, 2017, 09:39 pm
Eine Frage zu der Möglichkeit mit der Verwendung von millis(); statt delay.

Angenommen:

Ich habe eine For-Schleife, welche von 40 bis 60 hinaufzählt und pro Durchlauf der Schleife eine Addition von 1 auf die 40 hinzufügt, bis 60 erreicht ist. Und pro Durchlauf wird eine Leuchtdiode (40 dann 41 dann 42.....) eingeschalten (diese bleiben auch bis zum Ende auch eingeschalten) , um den Werdegang von 40 zu 60 zu symbolisieren. Ohne delay würde dieses hinaufzählen sehr sehr schnell fertig sein, und alle Leuchtdioden von 40 bis 60 würden sehr schnell eingeschalten werden ohne sichtbaren Verlauf. Aber! Ich möchte einen Verlauf erzeugen, und hierbei hilft das delay ( Wurde von mir bereits getestet) kann ich hier mir einfach mit dieser millis() Funktion helfen, um das selbe Ergebnis zu erzeugen ?



Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx

Serenifly

  • Shannon Member
  • Posts: 11,961
  • Karma: 732[add]
Der Sinn von millis() besteht darin dass du das Programm nicht komplett anhälst. delay() sorgt dafür dass an der Stelle alles stehen bleibt. Es gibt Anwendungen wo das ok ist. Aber das sind meistens sehr einfache Programme die nur eine Sache erledigen sollen.

delay() geht nicht mehr sobald mehrere Dinge nebeneinander ablaufen sollen. z.B. ein LED Muster ausgeben und während dessen Taster abfragen. Einfach well der Taster während der Verzögerungszeit nicht reagiert.
Schlafsofa Loppi Samt Samt Schlafsofa Orange Orange Schlafsofa Samt Loppi Loppi Schlafsofa Loppi Orange OiTwZulkPX

VelvetDark Stoff Sessel Splitback Blue Baton FK1cTlJ

MicroBahner

  • God Member
  • Posts: 537
  • Karma: 54[add]
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
#18
Aug 23, 2017, 09:48 pm Last Edit: Aug 23, 2017, 09:49 pm by MicroBahner
kann ich hier mir einfach mit dieser millis() Funktion helfen, um das selbe Ergebnis zu erzeugen ?
Du kannst natürlich mit der millis() Funktion ein delay() nachbilden. Nur - was bringt dir das?
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
Wie Serenifly schon schrieb, ist die Verwendung von millis() eigentlich für andere Zwecke gedacht - den 'quasi' gleichzeitigen Ablauf unterschiedlicher Aufgaben. Das geht mit deiner for-Schleife aber grundsätzlich nicht. Wenn Du während dem nacheinander Aufleuchten der Led's noch etwas anderes machen willst, musst Du es ohne die for-Schleife angehen.
Gruß, Franz-Peter

Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx

combie

  • Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
  • DokuVorLeseVerweigerer
  • Tesla Member
  • Posts: 9,906
  • Karma: 632[add]
Man kann eine for() Schleife verwenden!

Es ist natürlich doof, wenn die for() Schleife lange läuft, weil dann andere Dinge auf der Strecke bleiben.

2 Möglichkeiten gibt es um das zu verhindern...

1. die Schleife ausrollen
Das ist gut möglich aber arg abstrakt, da die for() Schleife dabei aus dem Code als solche verschwindet. Denn sie ist ja ausgerollt.
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
2. Die for() Schleife mit einem Austiegs- und einem Wiedereintrittspunkt versehen. Das hat den Vorteil, dass sie als Schleife wiedererkennbar im Code bleibt, aber dann nicht mehr "so" funktioniert, wie man es gewohnt ist.
Der Pessimist sieht die Wolke vor der Sonne.
Der Optimist sieht die Sonne hinter der Wolke.

Mantra: Die Sonne scheint immer!

ElEspanol

  • Faraday Member
  • Posts: 4,430
  • Karma: 285Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx [add]
#20
Aug 23, 2017, 10:39 pm Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
Die ganze Diskussion ist doch für die Katz. Der Ansatz mit for Schleife und delay vom TE ist schlicht Mist, weil Sackgasse. Irgendwann wird er es hoffentlich verstehen, wenn er Nachtwächter, blinkwithoutdelay, etc. durch und vor allem verstanden hat.Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx

2. Die for() Schleife mit einem Austiegs- und einem Wiedereintrittspunkt versehen. Das hat den Vorteil, dass sie als Schleife wiedererkennbar im Code bleibt, aber dann nicht mehr "so" funktioniert, wie man es gewohnt ist.
Da wäre eine Möglichkeit die oben von mir aufgeführte While-Schleife. Hier könnte man die parallel laufenden Aufgaben einfügen z.B. Abfrage einer Abbruchtaste. In bestimmten Fällen kann das sinnvoll sein.

Aber! Ich möchte einen Verlauf erzeugen, und hierbei hilft das delay ( Wurde von mir bereits getestet) kann ich hier mir einfach mit dieser millis() Funktion helfen, um das selbe Ergebnis zu erzeugen ?
Delay und millis() sind grundverschiedene Konzepte. Ich habe das mal mit dem Backen von Kuchen erklärt: http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141Bar Bar Mango Mango Bar Kandar Kandar MassivMetallSilber MassivMetallSilber MassivMetallSilber Mango Kandar BdeQCxEroW

Delay wartet stupide bis die Sekunde vorbei ist. Millis() ist eigentlich nur eine Uhr und keine Wartefunktion. Das wird sie erst, wenn du dir die Uhrzeit merkst. Dann vergleichst sie im weiteren Programmablauf immer wieder mit der aktuellen Uhrzeit bis eine Sekunde vorüber ist. In der Sekunde kannst du andere Aufgaben erledigen, du musst nur regelmäßig auf die Uhr schauen. Delay ist bequem, bei millis() musst du das Merken des Startzeitpunktes und den regelmäßigen Uhrzeitvergleich an sinnvollen Stellen programmieren.

delay ist böse.

delay darf man nicht verwenden.

delay hält den Prozessor davon ab, andere Dinge, die vielleicht grad wichtig sind, zu erledigen.


Man kann delay für testzwecke verwenden "funktioniert mein Transistorschalter?" oder "wird die Variable in der Funktion verändert?" Das fällt die Kategorie "loop verzögern"

Was der TO aber will ist ja: "jede Sekunde einen anderen Pin ansteuern"Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx

das ist was anderes.

das musst du aber anders lösen:
Laß die loop in ungebremster Geschwindigkeit rennen.
Merk' dir die Schaltzeiten, und immer nach einer Sekunde schaltest du den nächsten Pin.
Hierzu gab es ja schon Beispiele.

Ich empfehle an dieser Stelle wieder mal BlinkwithoutDelay - Die Nachtwächtererklärung
Hilft immer wieder das mit den millis zu verstehen.
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx

hajos118

  • 2B // !2B ... -> ?
  • Full Member
  • Posts: 139
  • Karma: 17[add]
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
delay() ist notwendig, wenn Du mit einem ESP8266 eine WLAN Verbindung aufrecht erhalten willst...

hast Du kein delay(), dann gibt's einen watchdog - Event.

ein delay(1) in loop() reicht dafür aus.KunststoffGoldWeiß Chic Aktenschrank Classic Easyoffice Ii qMpzUSVG


... sagt meine Erfahrung.
Orthographie und Interpunktion folgen keiner gültigen Norm. Wer Fehler findet darf sie behalten!

combie

  • DokuVorLeseVerweigerer
  • Tesla Member
  • Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
  • Posts: 9,906
  • Karma: 632[add]
delay() ist notwendig, wenn Du mit einem ESP8266 eine WLAN Verbindung aufrecht erhalten willst...Ii Lack Lowboard Easy Now Hülsta ReinweißNatureiche srdChQBtxo

hast Du kein delay(), dann gibt's einen watchdog - Event.

ein delay(1) in loop() reicht dafür aus.


... sagt meine Erfahrung.
Nein!

OK, nichts gegen deine Erfahrung, die mag richtig sein....
Aber das mit den Zusammenhängen....



Ein delay() ist nicht nötig.
Schon gar nicht in loop()


Warum?
Weil unbedingt yield() aufgerufen werden muss! (oder einer seiner Verwandten)
Weil es keinen Sinn macht die Anwendungstask länger zu blockieren, als die Hintergrundtask an Zeit braucht.

Natürlich kann man delay() aufrufen, auch wenn man eigentlich yield() aufrufen möchte, denn delay() ruft intern yield() auf.
Macht nur meist keinen Sinn, da es die Anwendung verzögert.
Möchte man die Anwendung verzögern? Dann ist nichts dagegen einzuwenden.
Aber oft möchte man/ich das nicht.


In loop() macht delay() keinen Sinn, aus den vorgenannten Gründen.
Zusätzlich:
Vor dem loop() Aufruf wird automatisch yield() aufgerufen.
Jedes mal!Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx



Also:
delay() nur aufrufen wenn WIRKLICH die Anwendung verzögert werden soll.
Dafür wurde delay() erfunden.
Das kann es gut.

Hat man in seinem Code lang laufende Schleifen, oder ähnlich, welche den WDT auslösen würden, dann schreibt man da yield() rein, damit die Hintergrundtask auch mal die Chance bekommt, ihren Kram zu erledigen.
Die Zeit, welche sie braucht, bestimmt sie dann selber.
Der Pessimist sieht die Wolke vor der Sonne.
Der Optimist sieht die Sonne hinter der Wolke.

Mantra: Die Sonne scheint immer!
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx

RIN67630Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx

  • God Member
  • Posts: 698
  • Karma: 45  [add]
Longchair Links Iv Ecksofa Davorstehend Croom WebstoffBeigegrün QthxsrdC
Re: For - Loop ohne Delay verzögern
#25
Aug 25, 2017, 12:25 pm
Quote from: guntherb on Aug 24, 2017, 01:15 pm
delay ist böse.

delay darf man nicht verwenden.

delay hält den Prozessor davon ab, andere Dinge, die vielleicht grad wichtig sind, zu erledigen.

Gerade deshalb tüftle ich zur Zeit an "Karajan", ein Scheduler, der mehr kann, als nur "Blink ohne Delay".

U.a. auch über Serial in Scheibchen zu reporten, ohne Radio zu blockieren.

http://forum.arduino.cc/index.php?topic=496691.0
Pendelleuchte GlasStahl1 GlasStahl1 flammig flammig Ii Brenda Ii Pendelleuchte Brenda MpGSVjLzqU

sitzerEchtleder Sofa Alzira2 Beige Sofa Alzira2 cuJ3TF15lK hajos118

  • 2B // !2B ... -> ?
  • Full Member
  • Posts: 139
  • Karma: 17  [add]
Re: For - Loop ohne Delay verzögern
#26
Aug 25, 2017, 12:28 pm
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
@combie:
Uno flammigStahl 5 Kronleuchter Pisa rostfarbig 5 R4Ajc5LS3qDanke für die Anmerkung, werd' sie mal in den entsprechenden sketches ausprobieren!
Orthographie und Interpunktion folgen keiner gültigen Norm. Wer Fehler findet darf sie behalten!

Re: For - Loop ohne Delay verzögern
#27
Aug 25, 2017, 01:15 pm
Quote from: combie on Aug 25, 2017, 12:16 pm
Warum?
Weil unbedingt yield() aufgerufen werden muss! (oder einer seiner Verwandten)

Läuft yield() auf einen Arduino Uno, Mega, oder Nano?
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx

ElEspanol

  • Faraday Member
  • Posts: 4,430
  • Karma: 285  [add]
Re: For - Loop ohne Delay verzögern
#28
Aug 25, 2017, 05:35 pm
Ja, nur braucht man es da nicht, weil im Hintergrund nichts bedient werden muss

RIN67630

  • Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx
  • God Member
  • Posts: 698
  • Karma: 45  [add]
Re: For - Loop ohne Delay verzögern
#29
Aug 25, 2017, 09:03 pm
Quote from: ElEspanol on Aug 25, 2017, 05:35 pm
Ja, nur braucht man es da nicht, weil im Hintergrund nichts bedient werden muss
Ich verstehe Dich nicht.
Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrxLäuft das Konstrukt auch auf diese Prozessoren oder nicht?

Print
Go Up
Pages: 1 [2]Rinderfell Chiapas Rinderfell SchwarzWeiß Chiapas SchwarzWeiß Rinderfell Rinderfell Chiapas Chiapas Chiapas Rinderfell SchwarzWeiß SchwarzWeiß SchwarzWeiß Rinderfell BedWoCrx 3