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
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.
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.
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!!!
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
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);
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.