Forum: Compiler & IDEs Nur bestimmte Bits verändern?


von Florian (Gast)


Lesenswert?

Hallo,

Bin relativ neu in der C Welt und steh grad ein wenig auf dem Schlauch.

Wenn ich z.B. eine char variable habe die binär so aussieht:
1
char x = 0b00000011;
und ich möchte nur bit 0 und 1 benutzen um an PORTB die Ausgänge zu 
setzen (oder zu löschen) wie mach ich das?
1
PORTB = x;
geht ja nicht, dann sind die anderen ja alle 0...

Danke und Gruss,
Flo

von Michael H. (michael_h45)


Lesenswert?


von Nette Nachbarin (Gast)


Lesenswert?

1
PORTB = (x & 0x01) ? 0xFF : 0x00;

von Florian (Gast)


Lesenswert?

Hab ich natürlich schon gelesen ;)
Wenn sich die Variable aber ändert, muss ich doch auch anders 
verknüpfen, also |= oder &= zum setzen und löschen oder? Oder aber ich 
versteh da was nicht... sorry, haste n tip? Bit 3-7 sind übrigens immer 
0 aber 0 und 1 sollen halt direkt den Ausgang schalten.
Ich sach ja, steh aufm Schlauch.

Gruss,
Flo

von Florian (Gast)


Lesenswert?

Oh,
Danke nette Nachbarin ;)
Damit prüfe ich ob bit1 gesetzt ist und schreibe dann 0xff sonst 0x00??
jetzt bin ich echt verwirrt!

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:
> Hab ich natürlich schon gelesen ;)
> Wenn sich die Variable aber ändert, muss ich doch auch anders
> verknüpfen, also |= oder &= zum setzen und löschen oder? Oder aber ich
> versteh da was nicht... sorry, haste n tip?

Du musst dir klar machen, dass es keine einzelne einfache Operation 
geben kann, die das gewünschte leistet.
Denn: einmal musst du das Portbit auf 0 setzen und ein anderes mal musst 
du es auf 1 setzen, je nachdem welchen Wert das korrespondierende Bit in 
der Variablen hat.

Wenn du dich dann zu dieser Erkentnis durchgerungen hast, was hindert 
dich an

  if( Bit in Variable == 0 )
    lösche das Portbit
  else
    setze das Portbit

und für das andere Bit in der Variablen demenstprechend gleich.


Das ist die einfache kanonische Variante. Da bei dir Variablenbit und 
Portbits offenbar an den gleichen Bitpositionen sind, gibt es auch noch 
die schnellere Variante:

  setze beide Portbits auf jeden Fall erst mal auf 0
  maskiere dir aus der Variablen die beiden interessiernden Bits heraus
  verodere den Port mit diesen herausmaskierten Bits

und wenn du jetzt noch das Problem hast, dass der Port zwischendurch 
kurzzeitig einen ungültigen Zustand hat, den du nicht haben darfst, dann 
kannst du immer noch eine Variable zu Hilfe nehmen, in die du zunächst 
den Zustand des Ports einliest, dort dann die Manipulation machst und 
dann den kompletten Portinhalt aus dieser Hilfsvariablen wieder neu 
setzt.

von Florian (Gast)


Lesenswert?

Hallo Karl Heinz,
Das hat mir auf die Sprünge geholfen!
Wenn ich die Portpins vorher auf 0 setze kann ich die 8 bit einfach mit 
oder draufkopieren! Hätte ich auch selber draufkommen können ;) 
brettvormkopf
Danke für die ausführliche Erklärung!

Gruss,
Flo

von Florian (Gast)


Lesenswert?

Funktioniert! freu

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.