INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Schleife bei Zeit x abbrechen
20.09.2018, 23:15
Beitrag #1
Schleife bei Zeit x abbrechen
Hallo,

ich möchte eine Schleife nach einer Zeit X abbrechen.
Und zwar soll dies geschehen wenn zum einen der Programmteil innerhalb der Zeit nicht durchlaufen wird oder dieser sich aufhängt. Dadurch möchte ich verhindern das beim "Ausfall" eines Teilprogramms, aus welchem Grund auch immer, gar nichts mehr geht.
Ich habe es in einem Test-Sketch mit "Millis" versuch zu realisieren, das bringt aber leider nicht den Erfolg und mir fällt kein anderer Lösungsansatz ein.

Code:
int zahl;
int x;
unsigned long xMillis;

void setup() {
  Serial.begin(9600);
}

void loop() {
  xMillis = millis();
  for (millis(); millis() - xMillis < 1000; ) {
    Serial.println(zahl);
    zahl ++;
    delay(20000);
  }
  Serial.println("break");
  delay(1000);
}
Es sollte hier eigentlich nach 1.000ms "break" ausgegeben werden, jedoch passiert dies erst nach 20.000ms ConfusedConfusedAngry


Gibt es da eventuell ganz andere Ansätze, oder lässt sich das gar nicht realisieren?

Vielen Dank schonmal im voraus!!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2018, 06:57
Beitrag #2
RE: Schleife bei Zeit x abbrechen
Die Loop ist eine Schleife, die immer läuft, bzw. laufen sollte, sonst ist da was falsch.
Du musst deine Anweisung innerhalb der Loop so aufbauen, dass diese nach deiner gewünschten Zeit nicht mehr aufgerufen wird, aber die Loop dennoch weiter läuft.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2018, 07:31 (Dieser Beitrag wurde zuletzt bearbeitet: 21.09.2018 07:34 von amithlon.)
Beitrag #3
RE: Schleife bei Zeit x abbrechen
Hallo,

wie soll die Schleife auch früher enden?
Du hate ein delay(20000); drin, das wird ja mindestens 1x gewartet...

Außerdem kenne ich es als while( millis() < xMillis + 1000) {
Obwohl prinzipiell for() in dieser Weise auch gehen sollte, auf die Idee bin ich allerdings noch nie gekommen.
for() ist bei mir erstmal nur für Zählschleifen, die eine bestimmte Anzahl Durchläufe haben soll.
Ich bin mir auch nicht sicher was der Compiler daraus macht...

Es ist auch logisch recht unsinnig, einen Ablauf
Code:
Serial.println(zahl);
    zahl ++;
    delay(20000);
der für den gewünschten Ablauf schon 20ms braucht, nach 1ms abbrechen zu wollen...

PS: loop() mit break zu verlassen geht hiervermutlich schon, die wird von außen ohnehin wieder aufgerufen, allerdings ist das so auch von der Arduino-Umgebung nicht so gedat und garantiert.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2018, 11:02
Beitrag #4
RE: Schleife bei Zeit x abbrechen
Vielen Dank schonmal für eure Antworten!

mir ist schon klar das der loop immer wieder wiederholt wird, das sollte aber auch nur ein Beispiel sein.

Zitat:wie soll die Schleife auch früher enden?
Du hate ein delay(20000); drin, das wird ja mindestens 1x gewartet...
darum geht es ja gerade was ich erreichen will. Das delay(20000) soll das "hängen" bleiben bzw. zu lange dauern des Skriptes darstellen. Die dürften nie ablaufen, da ja durch die "Abbruchbedingung" der 1000Millis die for-Schleife abgebrochen wird.
Ich hoffe ich habe mich verständlich ausgedrückt HuhBlush
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2018, 11:16
Beitrag #5
RE: Schleife bei Zeit x abbrechen
Hallo,

verfolge doch einfach Deinen Programmablauf als "Prozessor":

for testet, ob die Endbedingung erreicht ist -> nein -> der Inhalt der for-Schleife wird abgearbeitet und damit auch das delay(20000) oder auch Dein "hängenbleiben". Erst danach (beim "hängenbleiben" also schlicht nie, wird das for mit der Bedingungsabfrage wieder erreicht...

Es gibt auch schlicht kein "hängenbleiben". Du kannst natürlich etwas zusammenprogrammieren, was eine Endlosschleife ergibt, da drin hängt er dann ewig fest. Dann mußt Du Deinen Programmierfehler beheben.
Du kannst auch z.B. auf eine Änderung eines Pins warten, die nie kommt. Da kannst Du dann geziehlt die Anzahl der Abfragen oder die maximal Dauer drumrum programmieren, das geht.

Für "hängenbleiben" durch eine äußere Störung, einen unentdeckten Proggrammierfehler usw. hat die Welt den Watchdog erfunden. Den gibt es auch beim AVR und damit Arduino.
Du kannst (in Grenzen) auch einen eigenen mit einem Timer-Interrupt bauen.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2018, 12:05
Beitrag #6
RE: Schleife bei Zeit x abbrechen
(20.09.2018 23:15)BitsAndBytes schrieb:  Es sollte hier eigentlich nach 1.000ms "break" ausgegeben werden, jedoch passiert dies erst nach 20.000ms ConfusedConfusedAngry
Ja, klar, weil er bei delay(20000) 20.000 ms nichts tut.
Schau Dir BlinkWithoutDelay an und suche nach der Nachtwächtererklärung.
Du brauchst keine zusätzliche Schleife, denn Du hast Loop.
Der Rest wurde Dir schon gesagt.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2018, 21:45
Beitrag #7
RE: Schleife bei Zeit x abbrechen
ok vielen Dank!!
Ich werde die Anregungen in den nächsten Tagen mal versuchen umzusetzen.

Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.09.2018, 00:30
Beitrag #8
RE: Schleife bei Zeit x abbrechen
@ Tommy56:
BlinkWithoutDelay & Nachtwächtererklärung sind das was ich in meinen Skript versucht habe zu erstellen, was aber leider keinen Erfolg gebracht habe (zumindest nicht mit meinem Ansatz)

@amithlon:
Genau das ist es was ich gesucht habe. Etwas was unabhängig vom "Skripts" dieses überwachen kann und dann eine Aktion ausführt.

Vielen Dank euch Allen, ich habt mir sehr geholfen!!!!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Probleme mit Blinklicht auf bestimmte Zeit Prospekteur 15 500 20.10.2019 17:08
Letzter Beitrag: Tommy56
  Schleife nur 1x durchlaufen ohne for... Hanibal_Smith 3 355 01.10.2019 19:44
Letzter Beitrag: Tommy56
  Aktivierung nur in einer bestimmten Zeit Prospekteur 48 2.211 14.09.2019 12:57
Letzter Beitrag: MicroBahner
  delay Zeit falsch golex 9 1.255 24.05.2019 21:18
Letzter Beitrag: GuaAck
  For-Schleife ohne Begrenzung? Batucada 4 590 26.04.2019 09:54
Letzter Beitrag: Batucada
  Zeit vom Nextion Enhanced mit Arduino auslesen MarkoM 47 5.543 06.03.2019 18:08
Letzter Beitrag: Tommy56
  Berücksichtigung des A0-Einganges in if-Schleife Joergi-1911 3 439 17.02.2019 16:33
Letzter Beitrag: Tommy56
  Schleife (Durchlauf) abbrechen wann ich es will EXCLUZIVE 11 1.141 22.01.2019 15:52
Letzter Beitrag: Vapalus
Wink for Schleife im Void setup() Rockman 12 1.223 20.01.2019 15:17
Letzter Beitrag: Arduinero
  Schleife in der Schleife nanoheld 2 499 06.01.2019 17:08
Letzter Beitrag: Fips

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste