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
Anweisung "break" funktioniert nur mit direkter Abfrage der Konstante
10.11.2014, 15:46
Beitrag #1
Anweisung "break" funktioniert nur mit direkter Abfrage der Konstante
Hallo Smile

Ich habe folgendes Problem: Ich besitze eine kleine Taschenbeleuchtung an meiner Umhängetasche, Spielzeug, aber wenn man's halt kann... Wink

Code:
// Projekt Taschenbeleuchtung

// Eingänge: Switch A/B an Pin 8; Switch 1/2 an Pin 9
// Ausgänge: Duocolor-LED an Pin 10 (ws) und Pin 11 (bl); Kontroll-LED an Pin 13 (gn)
// ACHTUNG: Status der Ausgänge 10 und 11 negiert, da Positive Ground!
// INFO: Status Switch A/B:HIGH = A;LOW = B
// INFO: Status Switch 1/2:HIGH = 1;LOW = 2



int swAB=LOW;          // Boot State von Switch A/B
int sw12=LOW;          // Boot State von Switch 1/2
int i;                 // Countervariable PWM
const int switch_ab=8;    // Switch A/B
const int switch_12=9;    // Switch 1/2
const int ledW=10;     // LED ws
const int ledB=11;     // LED bl
const int ledG=13;     // LED gn

void setup() {
pinMode(switch_ab,INPUT);
pinMode(switch_12,INPUT);
pinMode(ledW,OUTPUT);
pinMode(ledB,OUTPUT);
pinMode(ledG,OUTPUT);



  digitalWrite(ledW,HIGH);                                     // Abschaltung Duocolor-LED bis zum Programmstart
  digitalWrite(ledB,HIGH);


  
  digitalWrite(ledG,LOW);                                      // Bestätigung nach Bootvorgang
  delay(100);
  digitalWrite(ledG,HIGH);
  delay(100);
  digitalWrite(ledG,LOW);
  delay(100);
  digitalWrite(ledG,HIGH);
  delay(100);
  digitalWrite(ledG,LOW);
  delay(100);
  digitalWrite(ledG,HIGH);
  delay(100);
  digitalWrite(ledG,LOW);
  delay(1000);  
  }



void loop(){
  
swAB = digitalRead(switch_ab);                                 // Schalterposition auslesen
sw12 = digitalRead(switch_12);



if (swAB==HIGH && sw12==HIGH) {                             // Programmablauf "PrgA1"

  for (i=0; i<255; i++) {
    analogWrite(ledW, i);
    analogWrite(ledB, -i);
    delay(2);
  }
  
  for (i=255; i>0; i--) {
    analogWrite(ledW, i);
    analogWrite(ledB, -i);
    delay(2);
  }

}



if (swAB==HIGH && sw12==LOW) {                              // Programmablauf "PrgA2"
  
  for (i=0; i<255; i++) {
    analogWrite(ledW, i);
    analogWrite(ledB, -i);
    delay(5);
  }

  for (i=255; i>0; i--) {
    analogWrite(ledW, i);
    analogWrite(ledB, -i);
    delay(5);
  }

}



if (swAB==LOW && sw12==HIGH) {                              // Programmablauf "PrgB1"
  
  for (i=0; i<255; i++) {
    analogWrite(ledW, i);
    delay(3);
  }
  
  digitalWrite(ledW,HIGH);                                    
  digitalWrite(ledB,HIGH);
  delay(500);
  
  while(digitalRead(switch_ab)==LOW && digitalRead(switch_12)==HIGH) {
    
    if (digitalRead(switch_ab)==HIGH){
      break;
    }
    
    if (digitalRead(switch_12)==LOW) {
      break;
    }
    
    digitalWrite(ledW,LOW);
    delay(100);
    digitalWrite(ledW,HIGH);
    delay(100);
    digitalWrite(ledB,LOW);
    delay(100);
    digitalWrite(ledB,HIGH);
    delay(100);
    digitalWrite(ledB,LOW);
    delay(100);
    digitalWrite(ledB,HIGH);
    delay(750);
  
  }
  
  for (i=255; i>0; i--) {
    analogWrite(ledW, i);
    delay(3);
  }
  
}



if (swAB==LOW && sw12==LOW) {                               // Programmablauf "PrgB2"
  
  for (i=0; i<255; i++) {
    analogWrite(ledW, i);
    analogWrite(ledB, -i);
    delay(3);
  }
  
  
  delay(2500);
  
  digitalWrite(ledW,LOW);
  digitalWrite(ledB,HIGH);
  delay(100);
  digitalWrite(ledW,HIGH);
  digitalWrite(ledB,LOW);
  delay(100);
  digitalWrite(ledW,LOW);
  digitalWrite(ledB,HIGH);
  delay(100);
  digitalWrite(ledW,HIGH);
  digitalWrite(ledB,LOW);
  delay(1000);
  digitalWrite(ledW,LOW);
  digitalWrite(ledB,HIGH);
  delay(100);
  digitalWrite(ledW,HIGH);
  digitalWrite(ledB,LOW);
  delay(100);
  digitalWrite(ledW,LOW);
  digitalWrite(ledB,HIGH);
  delay(100);
  digitalWrite(ledW,HIGH);
  digitalWrite(ledB,LOW);
  delay(2500);
  
  for (i=255; i>0; i--) {
    analogWrite(ledW, i);
    analogWrite(ledB, -i);
    delay(3);
  }
  
  delay(2500);
  
  digitalWrite(ledW,HIGH);
  digitalWrite(ledB,LOW);
  delay(100);
  digitalWrite(ledW,LOW);
  digitalWrite(ledB,HIGH);
  delay(100);
  digitalWrite(ledW,HIGH);
  digitalWrite(ledB,LOW);
  delay(100);
  digitalWrite(ledW,LOW);
  digitalWrite(ledB,HIGH);
  delay(1000);
  digitalWrite(ledW,HIGH);
  digitalWrite(ledB,LOW);
  delay(100);
  digitalWrite(ledW,LOW);
  digitalWrite(ledB,HIGH);
  delay(100);
  digitalWrite(ledW,HIGH);
  digitalWrite(ledB,LOW);
  delay(100);
  digitalWrite(ledW,LOW);
  digitalWrite(ledB,HIGH);
  delay(2500);

}



}



// INFO:
// - VCC: Akku 7x1.2V seriell
// - Power Switch: NC = /, NO = Akku +, C = Vin
// - Switch A/B: NC = GND, NO = +5V, C = Pin 8
// - Switch 1/2: NC = GND, NO = +5V, C = Pin 9
// - Klinkenbuchse: Tip = Pin 10, Ring = Pin 11, Schaft = +5V über 330R
// - Kontroll-LED: * = Pin 13 über 330R, + = GND

Wie ihr sehen könnte, frage ich bei if immer swAB und sw12 ab. Das funktioniert auch wunderbar, die werden ja am Anfang des Loops per digitalRead ausgelesen von switch_ab und switch_12.

Ein Ein Problem bekomme ich erst bei Programmablauf B2 (ab Zeile 96). Dort habe ich eine while-Schleife (ab Zeile 107), die solange laufen soll bis die Bedingungen nicht mehr erfüllt sind und sie über einen der beiden if-Befehle per "break" aufgelöst wird.
Frage ich beim if allerdings swAB oder sw12 ab, dann reagiert das Arduino nicht. Es hängt einfach in dieser while-Schleife fest. Erst wenn ich noch einmal digitalRead auf switch_ab und switch_12 mache, dann klappt die ganze Geschichte.

Mir wird gerade nicht klar warum das so ist, wo genau das Problem beim Abfragen liegt, warum es nur mit de Konstanten geht.
Habe ich da einen Denkfehler?

MfG
analogMensch
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2014, 11:44
Beitrag #2
RE: Anweisung "break" funktioniert nur mit direkter Abfrage der Konstante
Die Variablen werden ja innerhalb der While-Schleife nicht verändert. Ist die Anfangsbedingung erfüllt, wird die Schleife ewig laufen, denn der Wert ändert sich ja nicht. Wenn Du in der Schleife die Werte neu abfragst (per digitalRead()), dann kannst Du auch mit den Variablen arbeiten.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2014, 11:53
Beitrag #3
RE: Anweisung "break" funktioniert nur mit direkter Abfrage der Konstante
...manchmal frage ich mich, ob solche Fragen ernst gemeint sind.
SCNR,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Reaktionsspiel funktioniert nicht, wie es sollte... Stagneth.Alexander 27 1.119 21.07.2019 07:57
Letzter Beitrag: Stagneth.Alexander
  Einfache IF-Abfrage....(mir) unerklärlicher Fehler Lite 10 714 24.03.2019 12:36
Letzter Beitrag: Lite
  16er Relay schalten funktioniert nur bis 8 Otter 4 626 11.03.2019 16:04
Letzter Beitrag: Otter
  Taster Abfrage Manuel 1 528 13.01.2019 10:50
Letzter Beitrag: Tommy56
  [selbst gelöst] Register von Inline-Assembler-Anweisung vorher nicht gesetzt => Bug? Addi 2 583 24.08.2018 08:11
Letzter Beitrag: Addi
  Doppelte Abfrage der Bedingung mit Wartezeit ohne Delay soluman 3 1.276 05.07.2018 20:53
Letzter Beitrag: GuaAck
  ATMega 328P Bootloader funktioniert nur 1x Gelegenheitsbastler 4 1.132 08.04.2018 16:09
Letzter Beitrag: Chopp
  Bootlader Brennen funktioniert nicht Ardusil 6 1.609 18.03.2018 10:53
Letzter Beitrag: hotsystems
  Rotaryencoder funktioniert nicht richtig 123clever 19 3.301 20.02.2018 22:22
Letzter Beitrag: rpt007
  Problem mit Wire.available() abfrage avoid 1 1.034 11.01.2018 13:40
Letzter Beitrag: Tommy56

Gehe zu:


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