Forum: Compiler & IDEs Problem mit "while" schleife


von Markus C. (ljmarkus)


Lesenswert?

Hallo

ich habe ein Problem mit while Schleife. Wenn x==1 ist dann gehe in die 
Schleife und warte bis x==0 ist. Füre ein Befehl aus und gehe dann 
wieder in die Main Schleife.
1
int main (void)
2
{
3
 while (1)
4
 {
5
6
  if (x==1)
7
  {
8
   while(x==0) {}
9
   z++;  // Einmalig ausführen beim wechsel von x==1 nach x==0
10
  }
11
 }
12
}

Irgendwie verstehe ich das mit While nicht.
Wie muss es richtig lauten und auch bitte warum so.

Danke, Markus

von zuckerhut (Gast)


Lesenswert?

großes Chaos... Was genau soll das werden? (vgl. Netiquette - mehr 
Infos!)

von Markus C. (ljmarkus)


Lesenswert?

Also x wird per ISR eingelesen. Im Normalzustand ist es 0.
Ist x= 1 dann warte bis es 0 wird und erhöhe Value_1 um 1
Ist x= 2 dann warte bis es 0 wird und erhöhe Value_2 um 1
Ist x= 4 dann warte bis es 0 wird und erhöhe Value_3 um 1
Ist x= 8 dann warte bis es 0 wird und erhöhe Value_4 um 1

von Peter (Gast)


Lesenswert?

while(x!=0);
wartet auf x==0.

Peter

von Markus C. (ljmarkus)


Lesenswert?

if (x == 1)
{
  while(x !=0);
  Value_0++;
}

funktioniert leider nicht.

von Andreas B. (Gast)


Lesenswert?

Also x wird von aussen (Interrupt, IO Pin) gesetzt und ist deshalb 
volatile. Soweit zu den Voraussetzungen.

1
while (1) {
2
        do {
3
                x_saved = x;
4
        } while (x_saved == 0);
5
6
        while (x != 0) /* warten */;
7
8
        switch (x_saved) {
9
        case 1:
10
                Value_1++;
11
                break;
12
        case 2:
13
                Value_2++;
14
                break;
15
        /* und so weiter */
16
        }
17
}

Wenn die Werte von x aufeinander folgen würden, könnte man sich das 
switch sparen und statt dessen mit einem Array arbeiten.

von Markus C. (ljmarkus)


Lesenswert?

Also x wird per i2c eingelesen in einer ISR.

von zuckerhut (Gast)


Lesenswert?

zuckerhut schrieb:
> Was genau soll das werden? (vgl. Netiquette - mehr Infos!)

Wir haben keine Lust dir die Infos aus der Nase zu ziehen!

Was genau hast du?
Was soll passieren?
Was passiert?
Was hast du bereits probiert?
IDE/Compiler/usw ?
...

von Markus C. (ljmarkus)


Lesenswert?

so, ich habe es nun so gelöst:
1
  while (1)
2
  {
3
4
    if (x == 1)
5
    {
6
      while (x != 0);
7
      Wartenummer++;
8
      Warteplatz[0] = Wartenummer;
9
    }
10
    
11
    if (x == 2)
12
    {
13
      while (x != 0);
14
      Wartenummer++;
15
      Warteplatz[1] = Wartenummer;
16
    }
17
         }

folgendes Lösung bekomme ich nicht hin:
Ist x ==1 länger als timeout soll Wartenummer = 0 werden.
Wie kann ich in der while() noch einen timeout Zähler realiesieren der 
dann meinen Wert Wartenummer löscht?


@zuckerhut:
es ist noch immer GCC mit meinem Texteditor...

von Rolf Magnus (Gast)


Lesenswert?

Und du bist dir wirklich ganz sicher, daß x volatile ist?

von Karl H. (kbuchegg)


Lesenswert?

Markus C. schrieb:

> Ist x ==1 länger als timeout soll Wartenummer = 0 werden.
> Wie kann ich in der while() noch einen timeout Zähler realiesieren der
> dann meinen Wert Wartenummer löscht?

Da der Rest anscheinend Interrupt gesteuert ist und du hier sowieso eine 
Warteschleife hast, würde ich hier zu einem _delay_ms greifen um mir die 
Timeoutzeit in zb 1000 jeweils 10ms lange Intervalle unterteilt.
1
    if (x == 1)
2
    {
3
      timeout = 1000;
4
      while (x != 0 && timeout > 0)
5
        _delay_ms( 10 );
6
7
      if (timeout == 0)
8
      {
9
        ....
10
      }
11
      else
12
      {
13
        Wartenummer++;
14
        Warteplatz[0] = Wartenummer;
15
      }
16
    }

von Peter (Gast)


Lesenswert?

:      timeout = 1000;
:      while (x != 0 && timeout > 0)
:        _delay_ms( 10 );


da fehlt natürlich das timeout--;

for(timeout=1000; x!=0 && timeout>0; timeout--)
  _delay_ms(10);

Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.