Forum: Compiler & IDEs a = ~a; will nicht auf Attiny2313


von Peer (Gast)


Lesenswert?

Hi,
also ich versteh`s nicht:

ich will ein Byte komplett invertieren da ich einen knopf polle, der 
nach gnd schaltet. Ich möchte aber ein true haben, wenn ich das ding 
drücke.
1
uint8_t readButton ()
2
{
3
  
4
  btnStatus = PIND & (1<<PD3);
5
  btnStatus = ~btnStatus;         // für positive logik
6
  
7
  return btnStatus;
8
}

nehme ich die Zeile mit dem kommentar weg gehts und der knopf schaltet 
eine LED.

Der Controller ist ein ATTiny 2313, AVR Studio 6.1 in einer virtualbox.

hier geht der return Wert hin:
1
    if (readButton())      
2
    {
3
      rCh = 0;
4
    }
5
    else
6
    {
7
      rCh = 255;
8
    }
Die funktion kann ich auch direkt implementieren, es geht nicht mehr 
sobald ich die Sache mit dem ~ mache ...

ist doch bestimmt was ganz banales oder ?


mfg
P

von Yalu X. (yalu) (Moderator)


Lesenswert?

Logisch (im wahrsten Sinne des Wortes), dass immer der If- und nie der
Else-Zweig ausgeführt wird.

Vielleicht wolltest du eher
1
  btnStatus = PIND & (1<<PD3);
2
  btnStatus = !btnStatus;         // für positive logik

oder
1
  btnStatus = ~PIND;              // für positive logik
2
  btnStatus &= 1<<PD3;

schreiben.

von Peer (Gast)


Lesenswert?

hey Yalu danke!

ihr seid so verflucht schnell in diesem Forum...

ja, jetzt gehts.

mir geht gerade ein Licht auf.

wenn PD3 = 1 dann habe ich 0b00001000
wenn PD3 = 0 dann habe ich 0b00000000
mache ich dann jeweils ~ erhalte ich
einmal 0b11110111
und
einmal 0b11111111
Beides ist also true.
nur was macht ! mit meinem Byte?
anscheinend wird alles was größer 0 ist = 0
und alles was 0 ist wird 1 ?
richtig?

schaue hier morgen wieder rein.

danke und gute nacht

von Mik (Gast)


Lesenswert?

Peer schrieb:
> anscheinend wird alles was größer 0 ist = 0

alles was ungleich 0 ist wird zu null.
0 wird zu "wahr", spricht != 0
"!" das ist das logische not.

von Rolf M. (rmagnus)


Lesenswert?

Mik schrieb:
> alles was ungleich 0 ist wird zu null.
> 0 wird zu "wahr",

Wobei "wahr" der 1 entspricht.

von Mik (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Wobei "wahr" der 1 entspricht.

nein, 1 entspricht dem wert wahr, aber alles andere als 0 entspricht 
auch wahr, darum ist die Aussage das "wahr der 1 entspricht" nicht 
allgemeingültig.

von Peer (Gast)


Lesenswert?

Hi,

also nochmal das ichs auch kapiere. Ich habe euch jetzt so verstanden 
das folgendes gilt:

angenommen ich lese PIND und PD3 ist High
ich habe dann
myByte = 0b00001000;(=PIND)
mache ich
myByte = !myByte
ist danach
myByte= 0x00
mache ich dass dann nochmal dann erhalte ich:
myByte = !myByte
myByte = 0b00000001

right?

mir ist klar das ich das ganze auch im if() umkehren könnte
also if(!(readButton)) {} das wäre die mir bekannte anwendung vom not, 
nämlich in wahr/falsch prüfungen.
nur was ! mit den Bits eines Bytes macht, war mir nocht so ganz klar...
Grüße
P

von Stefan E. (sternst)


Lesenswert?

Mik schrieb:
> nein, 1 entspricht dem wert wahr, aber alles andere als 0 entspricht
> auch wahr, darum ist die Aussage das "wahr der 1 entspricht" nicht
> allgemeingültig.

Es ging aber nicht um das allgemeine "wahr", sondern darum, was der 
!-Operator als "wahr" zurück gibt. Und das ist immer eine 1.

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.