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
  Teilfunktion nur 1x nutzen, für begrenzte Zeit senseman 9 485 09.04.2020 10:31
Letzter Beitrag: Tommy56
  for-schleife, delay, millis, interrupt Harry 8 551 31.03.2020 21:02
Letzter Beitrag: Harry
Question "Bobbycar LED" - 2 Fragen (Mehrere Taster: Unterprog. Abbrechen / Einfacher "Code" ?) KlausGuenther 13 969 19.03.2020 14:09
Letzter Beitrag: Tommy56
  int variable wird nicht in Schleife übertragen ha0248 8 751 11.02.2020 15:25
Letzter Beitrag: ha0248
  Loop-Teil mit Interrupt für bestimmte Zeit stoppen Alter Fritz 11 1.136 23.12.2019 23:10
Letzter Beitrag: hotsystems
  Probleme mit Blinklicht auf bestimmte Zeit Prospekteur 15 1.288 20.10.2019 17:08
Letzter Beitrag: Tommy56
  Schleife nur 1x durchlaufen ohne for... Hanibal_Smith 3 788 01.10.2019 19:44
Letzter Beitrag: Tommy56
  Aktivierung nur in einer bestimmten Zeit Prospekteur 48 4.062 14.09.2019 12:57
Letzter Beitrag: MicroBahner
  delay Zeit falsch golex 9 1.909 24.05.2019 21:18
Letzter Beitrag: GuaAck
  For-Schleife ohne Begrenzung? Batucada 4 918 26.04.2019 09:54
Letzter Beitrag: Batucada

Gehe zu:


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