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
Aus While-Schleife durch Interrupt aussteigen
24.01.2016, 21:19 (Dieser Beitrag wurde zuletzt bearbeitet: 29.01.2016 12:30 von Bitklopfer.)
Beitrag #1
Aus While-Schleife durch Interrupt aussteigen
Servus,

bei meinem ersten Arduino-Projekt habe ich ein kleines Problem und hoffe, dass Ihr mir weiterhelfen könnt. Big Grin

Bei meinem Projekt wird ein Sensor durch Tastendruck abgerfagt und eine LED leuchtet, bis er einen bestimmten Wert erreicht mittels While-Schleife.

Jetzt ist es so, dass sobald der Taster losgelassen wird, soll die LED nicht mehr leuchten.

Das habe ich auch hinbekommen mit einem Interrupt. Allerdings springt das Programm wieder zurück in die While-Schleife.

Mir ist klar, das es auch so sein soll, dass am Unterbrechungspunkt weitergemacht wird. Die Frage ist daher: Gibt es eine Möglichkeit durch Interrupt aus einer While-Schleife auszusteigen?

Ich habe schon was von "Flags" bzw. Markern gelesen, weiß aber nicht wonach ich suchen soll, wenn das die einzige Möglichkeit für eine Lösung meines Problems ist.


mein Code sieht ungefähr so aus (ohne die Print ausgaben etc.):
Code:
ANFANG = 1;
}
void loop()
{
if (digitalRead(MEHR) == LOW)
  {
    ANFANG = ANFANG + 1;

    delay(250);
    if (ANFANG>30)
{
      ANFANG=1;
}


    gedrueckt = digitalRead(SCHALTER);
  if(gedrueckt==LOW)
  {
    int sensorVal01 = (analogRead(A1));
     delay(25);
    int sensorVal02 = (analogRead(A1));
     delay(25);
    int sensorVal03 = (analogRead(A1));
    int sensorVal;
    sensorVal = ((sensorVal01+sensorVal02+sensorVal03)/3);
    sensorVal = 2076 / (sensorVal - 11);
    static int STARTWERT = sensorVal;
  
     do
     {
    digitalWrite(LED,HIGH);

    int sensorVal01 = (analogRead(A1));
     delay(25);
    int sensorVal02 = (analogRead(A1));
     delay(25);
    int sensorVal03 = (analogRead(A1));
    int sensorVal;
     sensorVal = ((sensorVal01+sensorVal02+sensorVal03)/3);
     sensorVal = 2076 / (sensorVal - 11);
    Ergebnis = STARTWERT - sensorVal;
  }
while (Ergebnis < ANFANG);
  
}
}
void LEDOFF()
{
  digitalWrite(LED,LOW);
  Serial.println("Killswitch");
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2016, 22:33
Beitrag #2
RE: Aus While-Schleife durch Interrupt aussteigen
Hallo,
die do while Schleife die du verwendest wird immer mindestens ein mal durchlaufen. Natürlich auch nach einer Rückkehr aus einer Interruptroutine.

Wenn das nicht so sein soll musst du eine while Schleife nehmen:
Code:
while (Ergebnis < ANFANG){
digitalWrite(LED,HIGH);

int sensorVal01 = (analogRead(A1));
delay(25);
int sensorVal02 = (analogRead(A1));
delay(25);
int sensorVal03 = (analogRead(A1));
int sensorVal;
sensorVal = ((sensorVal01+sensorVal02+sensorVal03)/3);
sensorVal = 2076 / (sensorVal - 11);
Ergebnis = STARTWERT - sensorVal;
}

Um die Schleifenbedingung aus einer Interruptroutine heraus steuern zu können kannst du dir eine globale Hilfsvariable (Merker oder Flag) deklarieren.
Code:
bool weiter = TRUE;
Diese Variable wird dann in die Schleifenbedingung mit eingebaut:
Code:
while (Ergebnis < ANFANG && weiter){
digitalWrite(LED,HIGH);

int sensorVal01 = (analogRead(A1));
delay(25);
int sensorVal02 = (analogRead(A1));
delay(25);
int sensorVal03 = (analogRead(A1));
int sensorVal;
sensorVal = ((sensorVal01+sensorVal02+sensorVal03)/3);
sensorVal = 2076 / (sensorVal - 11);
Ergebnis = STARTWERT - sensorVal;
}
In der Interruptroutine wird die Variable "weiter" dann auf 0 gesetzt:
Code:
weiter = FALSE;
Nach der Rückkehr aus der Interruptroutine wird die Schleife dann nicht mehr ausgeführt.
An entsprechender Stelle im Programm musst du dann "weiter" wieder auf 1 setzen wenn die Schleife wieder durchlaufen werden soll.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2016, 19:40
Beitrag #3
RE: Aus While-Schleife durch Interrupt aussteigen
Hey Arne,

vielen Dank für die Hilfe!
Ich werde es gleich mal ausprobieren :-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2016, 19:54 (Dieser Beitrag wurde zuletzt bearbeitet: 28.01.2016 19:58 von Zill3.)
Beitrag #4
RE: Aus While-Schleife durch Interrupt aussteigen
Nachdem ich den Code umgeschieben habe, glaube ich das es funktionieren könnte.
Erstmal muss ich aber den Taster Entprellen. Andernfalls kommt nr Grütze raus.

Eine Sache die mir aber noch sehr merkwürdig vorkommt, ist, dass bei mir FALSE und TRUE nicht erkannt werden.

D.h. ich gebe es als Zustand in der bool an und der Kompiler sagt mir 'TRUE' was not declared in this scope.
Ich dachte, dass es eigentlich allgemeine Befehle wären, oder liege ich da falsch?

okay, habe gerade selber festgestellt, dass false und true klein geschrieben werden müssen...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2016, 20:01
Beitrag #5
RE: Aus While-Schleife durch Interrupt aussteigen
Hallo und sorry,
mein Fehler. Angry

LOW und HIGH ist in Großbuchstaben definiert
true und false ist in Kleinbuchstaben definiert

also:
Code:
weiter = false;

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2016, 20:15
Beitrag #6
RE: Aus While-Schleife durch Interrupt aussteigen
Kein Ding;-)
Aber danke für die schnelle Antwort!

Ist es nicht so, dass do while auf true wartet und while auf false?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2016, 12:13
Beitrag #7
RE: Aus While-Schleife durch Interrupt aussteigen
(28.01.2016 20:15)Zill3 schrieb:  ...
Ist es nicht so, dass do while auf true wartet und while auf false?

Hallo,

die do while-Schleife und die while-Schleife werden nur durchlaufen wenn die Schleifendbedingung true ist.

Bei der while-Schleife wird die Bedingung am Anfang der Schleife geprüft und wenn sie wahr ist wird die Schleife ausgeführt. (Kopfgesteuert)

Bei der do while-Schleife wird die Bedingung am Ende der Schleife geprüft und wenn sie wahr ist wird die Schleife erneut ausgeführt. (Fussgesteuert)
Die do while-Schleife wird aber entgegen der while-Schleife mindestens ein mal ausgeführt.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.01.2016, 20:13
Beitrag #8
RE: Aus While-Schleife durch Interrupt aussteigen
Okay, danke für die Erklärung. Das habe ich soweit verstanden mit dem Kopf und Fuß;-)

Ist es möglich, für die while-Schleife eine Bedingung zu verwenden, die erst in der Schleife berechnet wird?(Ich nehme an, dass nicht)
Ich müsste genau das machen, wenn ich von do-while auf while umstellen will. in meinem Fall while (Ergebnis<Anfang)
Bei do-while ist es zwar so, dass ich als Bedingung eine Variable verwenden kann die erst in der Schleife berechnet wird, bzw. zwischen do und while, aber wenn ich per Interrupt aus der Schleife aussteige, wird nach dem Interrupt die Schleife nochmal durchlaufen, was dazu führt das meine LED wieder leuchtet, was sie nicht tun soll.

Bei while würde es zwar genau so funktionieren, dass die LED nach dem Interrupt nicht mehr leuchtet, dafür komme ich garnicht erst in die while-Schleife rein, da der Wert ja innerhalb der Schleife berechnet wird, der die Schleife erst starten lässt.

Ich hoffe das diese Erläuterungen ohne weiteren Code verständlich sind.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  mit if aus do-while oder while Schleife aussteigen Nafetz 6 116 05.12.2016 21:41
Letzter Beitrag: Pit
  while Schleife nach sleep mode interrupt tklaus 13 262 23.11.2016 17:40
Letzter Beitrag: Tommy56
  Do-While-Schleife Abbruchbedinung Majera 14 261 22.11.2016 18:07
Letzter Beitrag: Pit
  Schleife Hannes 3 196 16.11.2016 00:54
Letzter Beitrag: Hannes
  NRF24L01 Interrupt MeisterQ 22 517 02.11.2016 15:50
Letzter Beitrag: MeisterQ
  Interrupt matthias3579 5 221 15.10.2016 13:23
Letzter Beitrag: hotsystems
  Unterschiedliche Programme durch Switch/ Case SpeedShifter 26 615 04.10.2016 15:29
Letzter Beitrag: SpeedShifter
  Interrupt und Sicherung der Prozessorregister MKc 5 226 31.08.2016 11:17
Letzter Beitrag: MKc
  Altes Digitales Display mit Text/Bits durch Genuino Micro versorgen - SPI-Bibliothek? RollingStone 0 204 25.06.2016 17:46
Letzter Beitrag: RollingStone
  Interrupt bei Serieller Übertragung Binatone 8 365 21.06.2016 14:09
Letzter Beitrag: Scheams

Gehe zu:


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