Forum: Compiler & IDEs Bits prüfen, ich komme nich mehr weiter


von Jörg E. (jackfritt)


Lesenswert?

folgender unvollständiger aber zu verstehender Code:
1
//LED Modus
2
#define AUS     0
3
#define GRUEN    1
4
#define PWM  2
5
6
//LED_Mode = (1 << GRUEN); //GRUEN
7
//LED_Mode |= ((1 << GRUEN)|(1 << PWM)); //GRUEN PWM
8
//LED_Mode &= ~(1 << GRUEN); //ROT !!
9
LED_Mode |= (1 << PWM); //ROT PWM
10
//LED_Mode= 0;
11
//LED_Mode |= ((1 << 1) | (1 << 2)); //Both LED dark
12
13
if ((dir==TRUE) & (LED_Mode & PWM) & !(LED_Mode & AUS)){
14
....

Ich glaube es ist Freitag und schon zu spät für mich :)
Ok ich habs noch nicht kapiert. Kann mir jemand springen helfen ?

Gruss,

Jörg

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Um was geht es?

von Marc B. (tvdog)


Lesenswert?

Vielleicht meintest du in der if-Anweisung eher
1
if ((dir==TRUE) & (LED_Mode & (1<<PWM)) & !(LED_Mode & (1<<AUS)))

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Kennst du den Unterschied zwischen "&" und "&&"?

von Hans (Gast)


Lesenswert?

Muss man das verstehen? Ich seh weder nen vernünftigen Code-Abschnitt 
noch ne vernünftige Frage...

von Stefan W. (dl6dx)


Lesenswert?

Jörg Esser schrieb:
> if ((dir==TRUE) & (LED_Mode & PWM) & !(LED_Mode & AUS)){

Ich hab ausnahmsweise mal die Glaskugel da und sehe gleich mehrere 
Fallen:

Ist die if()-Bedingung ein boolscher Ausdruck? Dann musst du den 
Operator && für die boolsche Und-Verknüpfung verwenden. So, wie es da 
steht, ist das ein bitweises UND, das ein völlig anderes Ergebnis hat.

(LED_MODE & PWM): Willst du mit dem zuvor gesetzten Wert vergleichen, 
muss der Ausdruck (LED_MODE & (1<<PWM)) lauten.

Der Ausdruck (dir == TRUE) kann zudem noch folgenden Nebeneffekt haben: 
Nur der boolsche Wert FALSE hat einen eindeutigen Wert (0). TRUE wird 
üblicherweise zwar als !FALSE definiert, welcher Wert das ist, ist aber 
compilerabhängig. Sicherer wäre also (dir != FALSE) oder einfach (dir).

Zusammengefasst: Ist

if ((dir) && (LED_Mode & PWM) && !(LED_Mode & AUS)){

das, was du wolltest?

Grüße

Stefan

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stefan Wagner schrieb:
> Zusammengefasst: Ist
>
> if ((dir) && (LED_Mode & PWM) && !(LED_Mode & AUS)){
>
> das, was du wolltest?

Man betrachte noch die Werte, die die hier verwendeten Konstanten haben:

> #define AUS   0
> #define GRUEN 1
> #define PWM   2

Welcher Wert muss in LED_Mode stehen, damit der Ausdruck (LED_Mode & 
AUS) zutrifft?

Ist der Wert von (X & 0) in irgendeiner Weise von X abhängig?

von Stefan W. (dl6dx)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Ist der Wert von (X & 0) in irgendeiner Weise von X abhängig?

Oha. Den Teil hatte ich mir gar nicht mehr angesehen.
Eventuell war da aber auch !(LED_Mode & (1<<AUS)) gemeint.

Grüße

Stefan

von DirkB (Gast)


Lesenswert?

Stefan Wagner schrieb:
> TRUE wird
> üblicherweise zwar als !FALSE definiert, welcher Wert das ist, ist aber
> compilerabhängig.

Nein, schon lang nicht mehr. Laut C89-Standard ist  !0 = 1.
Also seit dem letzten Jahrtausend. :-)

von Stefan W. (dl6dx)


Lesenswert?

DirkB schrieb:
> Laut C89-Standard ist  !0 = 1.

Man sollte doch so im Zehnjahresrhytmus mal die Sprachreferenz komplett 
lesen. Das frischt das Gedächtnis auf.

Du hast natürlich recht. (Steht sogar schon so in der ersten deutschen 
Auflage von K&R aus dem Jahr 1983.)

Ich weiß nicht mehr, wo ich die Erfahrung mit den abweichenden Werten 
für TRUE gemacht habe, aber vielleicht wäre damals eher ein bug report 
angebracht gewesen. Stattdessen haben wir defensiv codiert und nur 
"FALSE == 0" vorausgesetzt.

Grüße

Stefan

von Jörg E. (jackfritt)


Lesenswert?

@All
Vielen Dank für eure Tips. Ich habe mich am Wochenende nochmals damit 
auseinandergesetzt.
Es war natürlich eine Kombination aus && <<.Ich habe echt alles falsch 
gemacht.
Jetz geht es mit dem neuen Code.
Nochmals Danke.

Ist übrigens eine Ansteuerung für 2 LED´s mit nur einem Portpin.
Ich kann ROT oder GRÜN,Beide aus, und jeweils eine Dimmen.
Funktioniert hier wirklich prima. Ich hoffe auch mit anderen roten
und grünen Led´s ;)
1
...
2
        LED_Mode |= (1 << GRUEN); //GRUEN
3
        //LED_Mode |= ((1 << GRUEN)|(1 << PWM)); //GRUEN PWM
4
        //LED_Mode &= ~(1 << GRUEN); //ROT !!
5
        //LED_Mode |= (1 << PWM); //ROT PWM
6
        //LED_Mode |= (1 << AUS); //Both LED dark
7
8
...
9
//ISR
10
  if ((LED_Mode & (1 << GRUEN)))
11
    rot=FALSE;
12
  else
13
    rot=TRUE;
14
15
  //PWM for red/green LED
16
  if (speed > 254){
17
    if ((dir==TRUE) && (LED_Mode & ((1 <<PWM)))){
18
      pwm_setting++;
19
      if (pwm_setting > 254)
20
        dir=FALSE;
21
    }
22
    if ((dir==FALSE) && (LED_Mode & ((1 <<PWM)))){
23
      pwm_setting--;
24
      if (pwm_setting < 1)
25
        dir=TRUE;
26
    }
27
    speed=0;
28
  }
29
  if (!(LED_Mode & (1 << AUS))){
30
    if (pwm_setting > pwm_cnt){
31
      if (rot){
32
        DDRB  &= ~(1 << PB3);    //Input Tristate
33
        PORTB |=  (1 << PB3);
34
      }else{
35
        PORTB &= ~(1 << PB3);
36
        DDRB  &= ~(1 << PB3);    //Input Tristate
37
      }
38
    }else{
39
      if (rot){
40
        DDRB  |=  (1 << PB3);
41
        PORTB &= ~(1 << PB3);
42
      }
43
      else{
44
        PORTB |=  (1 << PB3);    //High
45
        DDRB  |=  (1 << PB3);    //OUtput
46
      }
47
    }
48
  }else{
49
    DDRB  &= ~(1 << PB3);    //Input Tristate
50
    PORTB |=  (1 << PB3);
51
  }
52
53
  pwm_cnt++;
54
  speed++;
55
...

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.