Claude schrieb:
> Hi,
> Es klappt immer noch nicht. Kann Jemand bitte mir sagen was diese
> Anweisung: ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F) Bedeutet.
> wie gesagt ich lese das Tutorial gerade und im Code habe ich das nicht
> verstanden.
OK. Ich gebe zu, dass das mglw. etwas dicht geschrieben ist. Wenn man
allerdings seine Bitmaniplationen im Hinterkopf hat und die auch
beherrscht, ist es eigentlich ganz einfach
1 |
|
2 | Code Beispielwert(binär) was passiert
|
3 | -----------------------------------------------------------------------
|
4 | ADMUX 10101010 nimm den Inhalt von ADMUX
|
5 |
|
6 | 0x1F 00011111 1F
|
7 | ~(0x1F) 11100000 alle Bits umdrehen
|
8 |
|
9 | ADMUX&~(0x1F) 10101010 die beiden UND verknüpfen
|
10 | & 11100000 Effektiv löscht das im Ergebnis
|
11 | -------- alle Bits, die in 0x1F auf 1
|
12 | 10100000 standen (und nach dem Bitdrehen
|
13 | auf 0 stehen)
|
Einschub: Warum will man diese Bits auf 0 setzen?
Antwort: Weil dort die Channelwerte kodiert sind. Mit dem nachfolgenden
(Oder) kann man BIts nur von 0 auf 1 ändern, also stellt man sicher,
dass erst mal die interessanten Bits auf 0 gezwungen werden. Was ja ganz
offensichtlich auch funktioniert. Die untersten 5 Bits (dort wo die
Kanalwerte rein kommen) sind alle 0, obwohl sie im ADMUX von ganz oben
das noch nicht waren. Die restlichen 3 Bits haben sich nicht verändert
und sind immer noch so wie sie ursprünglich in ADMUX waren.
1 | channel 00000011 zb Kanal 3
|
2 | 0x1F 00011111 1F
|
3 |
|
4 | channel & 0x1F 00000011 die Kanalnummer mit
|
5 | & 00011111 einer Maske behandeln
|
6 | -------- sodass auf jeden Fall
|
7 | 00000011 die obersten 3 Bits auf
|
8 | 0 gesetzt werden.
|
9 | Einfach nur eine Vorsichtsmassnahme
|
10 |
|
11 |
|
12 | ... | .... 10100000 der aufbereitet ADMUX Wert
|
13 | | 00000011 die neue Kanal Nummer
|
14 | --------
|
15 | 10100011
|
und das Ergebnis ist ein Byte, welches die obersten 3 Bits aus dem
ursrpünglichen ADMUX übernommen hat und dessen untersten 5 Bits aus der
neuen Kanal Angabe kommen.
ADMUX channel
76543210 76543210 (Bitnummer)
abcdefgh ABCDEFGH
| | | |
+-+ +---+
| |
+------------+ +-----------+
| |
v v
+-++---+
| || |
76543210
abcDEFGH
ADMUX
Zusammengefasst: ADMUX so manipulieren, dass die Kanalnummer, UND NUR
DIE KANALNUMMER, gegen eine neue ausgetauscht wird. Alle anderen Bits
bleiben so, wie sie in ADMUX auch vorher schon waren.