Forum: Mikrocontroller und Digitale Elektronik seltsames Verhalten if-Bedingung


von nebie (Gast)


Lesenswert?

Hey!

weiß einer warum die zweite if-Bedingung nicht aufgerufen wird obwohl 
die Bedingung gegeben ist? Port toggelt immer noch...

1
 if (s_IO.ucChargerPresent == 1){
2
    __disable_interrupt();
3
  PORTC &= ~ (1 << PC0 | 1 <<PC4 | 1 << PC1 | 1 << PC5 | 1 << PC3 | 1 << PC2);
4
  
5
  PORTB |=  ( 1 << PB2 );
6
  _delay_ms(6000);
7
  PORTB &= ~ ( 1 << PB2 );
8
  _delay_ms(6000);
9
    
10
  
11
  ChargeCurrent_Write();
12
  ChargeVoltage_Write();
13
  InputCurrent_Write();
14
  //__enable_interrupt();
15
  
16
  if (s_IO.ucChargerPresent == 0)
17
  {  __disable_interrupt();
18
    PORTB &= ~ ( 1 << PB2); 
19
    PORTC |=  (1 << PC0 | 1 << PC4 | 1 << PC1 | 1 << PC5 | 1 << PC3 | 1 << PC2);
20
  }
21
  }

von Kurt (Gast)


Lesenswert?

Die zweite if-Bedingung steht innerhalb der ersten...

von Karl H. (kbuchegg)


Lesenswert?

Wer oder was ist s_IO?
Wie wird es verändert? Wo wird es verändert?

von mike (Gast)


Lesenswert?

Wenn s_IO.ucChargerPresent == 1 kann es nicht gleichzeitig 0 sein.
(Interrups ausgeschlossen)

von nebie (Gast)


Lesenswert?

Kurt schrieb:
> Die zweite if-Bedingung steht innerhalb der ersten...

ah wie blind von mir... du hast vollkommen recht Kurt

Karl Heinz Buchegger schrieb:
> Wer oder was ist s_IO?
> Wie wird es verändert? Wo wird es verändert?

// Ladespannung abfragen
  if ( (PIND&0x20) > 0 ){
    s_IO.ucChargerPresent = 1;
  } else {
    s_IO.ucChargerPresent = 0;
  }

von Karl H. (kbuchegg)


Lesenswert?

nebie schrieb:
> Kurt schrieb:
>> Die zweite if-Bedingung steht innerhalb der ersten...
>
> ah wie blind von mir... du hast vollkommen recht Kurt

Tja.
Wenn dich so ein Konstrukt
1
  }
2
  }
im Code nicht stutzig macht.
2 geschlossene Klammen können bei korrekter Einrückung nie untereinander 
stehen.
Rückt man aber korrekt ein, dann würde man so manchen Fehler in den 
Code-Schachtelungen sehen.

>
> Karl Heinz Buchegger schrieb:
>> Wer oder was ist s_IO?
>> Wie wird es verändert? Wo wird es verändert?
>
> // Ladespannung abfragen
>   if ( (PIND&0x20) > 0 ){
>     s_IO.ucChargerPresent = 1;
>   } else {
>     s_IO.ucChargerPresent = 0;
>   }

OK. Und wo findet sich der Aufruf in deinem Codestück, mit dem dieses 
Auswertung laufen würde?
Oder war die Sache mit der fehlerhaften Einrückung / Schachtelung schon 
des Rätsels Lösung?

von Andreas H. (andario)


Lesenswert?

Kurt schrieb:
> Die zweite if-Bedingung steht innerhalb der ersten...

Deshalb der Übersichtlichkeit halber so schreiben, dass öffnende und 
schließende Klammern eines Blocks immer untereinander stehen:
1
  if (Bedingung)
2
  {
3
    Code;
4
    Code;
5
  }
6
  else
7
  {
8
    Code;
9
    Code;
10
  }
11
12
  if (Andere Bedingung)
13
  {
14
    ...
15
  }
16
17
  ...
Grüße,
Andario

von Sebastian W. (sebastian_w29)


Lesenswert?

Das ist auch im kompakten Format möglich (wenn man sich dran hält):
1
  if (Bedingung) {
2
    Code;
3
    Code;
4
  } else {
5
    Code;
6
    Code;
7
  }
8
9
  if (Andere Bedingung) {
10
    ...
11
  }
12
13
  ...

Vorteil ist der m.M.n. bessere Lesefluss.

LG, Sebastian

von Kurt (Gast)


Lesenswert?

Da hat sich das Python lernen doch gelohnt :D
Dadurch hatte ich nie wieder solche Probleme.
Eigentlich erstaunlich wie viele "Fehler" man nur durch einen sauberen 
Code-Stil verhindern kann...

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.