mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik einzelne Bits in C setzen


Autor: raoul4 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Renner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: raoul4 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: DerDirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Renner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: raoul4 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andre Adrian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist auch ganz einfach:

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

Gruss,

Andre

Autor: raoul4 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke.

mfg raoul4

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andre Adrian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.