einzelne Bits in C setzen

Gast #59669
Lesenswert?

hallo,
da mir ja im Thread "mit AVR Spannung messen" keiner eine richtige
antwort auf meine fragen gibt (heul), muss ich euch das hier noch mal
fragen, also:

wie kann ich z.b. im ADMUX register das zweite bit auf 1 setzen und
umgekehrt? (bitte auch die einzelnen schritte erklären)

mfg raoul4
Gast #59670
Lesenswert?

Ich würde das folgendermaßen machen:

  ADMUX |= 1<<bit; // bit setzen
  ADMUX &= ~(1<<bit); // bit löschen

Im ersten Fall wird das Register ODER-verknüpft mit dem maskierten Bit,
im zweiten Fall UND-verknüpft mit der invertierten Maske, was das Bit
im Register auf 0 setzt.
Gast #59671
Lesenswert?

Alternativ, je nach Compiler, das Thema hatten wir hier gerade, gehts
auch so:

ADMUX.MUX1=1 //setzt das 2.bit

Auch wenn einige meinen, es passe nicht zum C-Syntax - ich finde es
eine extrem angenehme und übersichtliche Art, einzelne Bits zu
setzen/rückzusetzen.
Gast #59672
Lesenswert?

hallo,

@Jens Renner

danke für die antwort, aber ich verstehe das immer noch nicht. und ich
möchte befehle nur nutzen, wenn ich sie verstehe. was soll denn
bedeuten, das register ODER-verknüpft wird? und was ist ein maskiertes
bit? und das gleiche gilt auch bei &= und dieser welle.




@crazy horse

ich bedanke mich auch bei dir, aber mein compiler versteht den befehl
den befehl ADMUX.MUX1=1 nicht.

mfg raoul4, und hoffe ich verärgere euch nicht zu sehr!!!
Gast #59673
Lesenswert?

Hallo!

wenn man ein bit mit beliebigen zustand mit einer 1 verknüpft, so
ergibt sich zwangsweise eine 1.

0 oder 1 = 1
1 oder 1 = 1

wenn man ein gesetztes bit (1) mit einer 1 "ver-und-et", so ergibt
sich eine 1.

1 und 1 = 1

negiert man nun die 1, so bekommt man eine 0....

|= steht für oder
&= steht für und
~ (tilde) ist eine negation

....hoffe ich habe das halbwegs richtig eingebracht...


gruß


Dirk
Gast #59674
Lesenswert?

Das ist soweit richtig. Vielleicht für beides ein Beispiel:

Registerinhalt ADMUX: 0b11001001

Bit 4 setzen:
- Bit wählen/maskieren (1<<4): 0b00010000
- ODER-Verknüpfung (ADMUX |= ...); Ergebnis: 0b11011001
1er-Bits der Maske werden im Register gesetzt. Bereits gesetzte Bits
bleiben gesetzt.
Durch ODER-Verknüpfung bewirken 0er-Bits keine Registerveränderung.

Bit 3 löschen:
- Bit wählen/maskieren (1<<3): 0b00001000
- Maske invertieren (~): 0b11110111
- UND-Verknüpfung (ADMUX &= ...); Ergebnis: 0b11000001
0er-Bits der Maske werden im Register gelöscht. Bereits gelöschte Bits
bleiben gelöscht.
Durch UND-Verknüpfung bewirken 1er-Bits keine Registerveränderung.

ADMUX |= (1<<bit); entspricht ADMUX = ADMUX | (1<<bit);
ADMUX &= (1<<bit); entspricht ADMUX = ADMUX & ~(1<<bit);
Gast #59675
Lesenswert?

korrekt.
Und dann gibts noch die manchmal sehr nützliche EXOR-Verknüpfung, eine
"1" im 2.Operanden invertiert das entsprechende Bit des 1. Operanden
(stand da eine 1, wird daraus eine 0 und andersrum), eine "0" lässt
es unverändert
Gast #59679
Lesenswert?

Hi

@Andre Adrian

>if(DDRC && (1<<2){
>}

Hier fehlt erstens ne schließende Klammer und zweitens wird das so
nichts. Statt && (logisches UND) müßte da & (bitweises UND) stehen um
das Bit auszumaskieren. && sorgt dafür das der Ausdruck immer dann war
ist wenn DDRC != 0.

Matthias

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