Problem mit "while" schleife

OP #2133305
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
OP #2133328
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
Gast #2133342
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.
OP #2133436
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...
#2133785
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
    }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren