Unterschied zw. ^ und ~

OP #2773185
Lesenswert?

Hallo,

ich habe eine Variable
1
uint16_t Frequenz;
und am kompletten PortB des ATtiny2313 sind Taster angeschlossen.
Über diese Taster wird ein Wert (8 Bit, da 8 Taster) in den AVR eingeben 
(0 bis 255).
Dieser Wert soll zu 875 dazu gerechnet werden.
Soweit wäre das ja auch kein Problem, würde das einfach so machen:
1
Frequenz = 875 + PINB;
Da aber die Taster die Pins auf GND ziehen die internen Pullups 
aktiviert sind, muss ich die einzelnen Bits in 'PINB' zuvor invertieren.
Eigentlich wollte ich es so machen:
1
Frequenz = 875 + ~PINB
Aaber irgentwie hat das nicht so gut geklappt, da fehlt immer irgentwas.
Das hier...
1
Frequenz = 875 + (PINB ^ 0xFF);
...funktioniert perfekt.

Kann mir jemand auf die Sprünge helfen, was der Unterschied zwischen 
diesen beiden Varianten ist, und warum das eine funktioniert, aber das 
andere nicht?

Gruß
Doran
#2773436
Lesenswert?

PINB ^ 0xFF macht keinen Sinn, auch wenn das richtige Ergebnis 
rauskommt. Du willst negieren, also schreibt man das auch besser so hin 
(~PINB).
Es drückt dann die Absicht aus und verwirrt nicht.

Wenn du schreiben würdest, was nicht geht bzw. was falsch rauskommt, 
könnte man sinnvoller helfen.
Bis dahin gehe ich davon aus, daß nicht das Negieren Probleme macht, 
sondern die signed-Rechnung, wo du eigentlich unsigned haben willst (875 
ist erstmal int, also signed, und die Addition wird deshalb in signed 
durchgeführt, wofür dein Port-Wert entsprechend erweitert wird und bei 
gesetztem obersten Bit entsprechend falsch).
#2773448
Lesenswert?

Klaus Wachtler schrieb:
> Bis dahin gehe ich davon aus, daß nicht das Negieren Probleme macht,
> sondern die signed-Rechnung, wo du eigentlich unsigned haben willst (875
> ist erstmal int, also signed, und die Addition wird deshalb in signed
> durchgeführt, wofür dein Port-Wert entsprechend erweitert wird und bei
> gesetztem obersten Bit entsprechend falsch).

Nein, denn ein Port ist als uint8_t definiert, es findet also keine 
Vorzeichenerweiterung statt. Das Problem entsteht tatsächlich beim 
Invertieren, denn die Erweiterung auf int findet natürlich vorher statt.

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