Forum: Mikrocontroller und Digitale Elektronik einzelne Bits in C setzen


von raoul4 (Gast)


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

von Jens Renner (Gast)


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.

von crazy horse (Gast)


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.

von raoul4 (Gast)


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!!!

von DerDirk (Gast)


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

von Jens Renner (Gast)


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);

von crazy horse (Gast)


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

von raoul4 (Gast)


Lesenswert?

tut mir leid, dass ich noch mal nerve, aber wie verwende ich die
bitabfrage bei einer if anweisung? also:

if bit 2 in DDRC gesetzt
{....}


mfg raoul4

von Andre Adrian (Gast)


Lesenswert?

Das ist auch ganz einfach:

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

Gruss,

Andre

von raoul4 (Gast)


Lesenswert?

danke.

mfg raoul4

von Matthias (Gast)


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

von Andre Adrian (Gast)


Lesenswert?

Hi,

@Matthias

Du hast natürlich uneingeschränkt recht. Man sollte sowas auch nicht
posten wenn man mit seinen Gedanken ganz woanders ist.

Mea Culpa,

Andre

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.