Register Syntax-Frage

Ich habe einen Code gelesen, um einen auf einem Arduino ATMEGA328P zu verwenden, und ich kann nicht herausfinden, was diese Codezeile tut.

ASSR &= ~(_BV(EXCLK) | _BV(AS2));

Ich weiß, dass ASSR das asynchrone Statusregister ist und dass EXCLK AS2 sind Bits in diesem Register. Ich bin mir ziemlich sicher, dass _BV() verwendet wird, um dieses Bit zu setzen, korrigieren Sie mich, wenn ich falsch liege. Was ich nicht weiß, ist, was dieser Code tatsächlich tut? Es scheint, dass dieser Code bitweise Operationen verwendet, um das Register ASSR mit einem einzelnen Bit ( ~(_BV(EXCLK) | _BV(AS2))) zu vergleichen und dieses Register dann auf ein einzelnes Bit, eins oder null, zu setzen. Das macht für mich keinen Sinn, da dieses Register 7 Bit groß ist und nicht mit einem einzelnen Bit verglichen werden kann. Jede Hilfe ist willkommen, danke.

Relevante Dokumentation:

ATMEGA 328P Datenblatt

AVR Libc-Seite

Antworten (2)

Ich habe wenig Erfahrung mit Arduino, aber es sieht so aus, als würde diese Zeile die Bits EXCLK und AS2 löschen.

Aus dem Kontext sollte BV() Ihnen das Bitgewicht geben.

AS2 ist Bit 5 (von rechts beginnend bei 0 gezählt) im Register, _BV(AS2)sollte dann 32 zurückgeben ( 2 5 = 64 ). Nach der gleichen Logik _BV(EXCLK)sollte 64 zurückgegeben werden, da EXCLK Bit 6 ist.

also in binär haben wir

_BV(AS2) = 00100000Und_BV(EXCLK) = 01000000

Wenn wir oder diese Werte erhalten wir 01100000

Das ~invertiert die Werte, sodass wir 10011111 erhalten

Dann &=behält der alle Bits, die beim vorherigen Ergebnis 1 sind, unverändert bei und setzt die verbleibenden Bits (5 und 6) auf 0.

Danke, das macht Sinn. Ich hätte sehen sollen, dass _BV() ein Byte statt eines Bits zurückgegeben hat.
Wie Ignacio sagte, _BV()kann es auch als Rechtsruck angesehen werden (tatsächlich wird es so definiert).

_BVist ein Makro, das eine Linksverschiebung durchführt. EXCLKund AS2sind Bitpositionen innerhalb ihres Registers. Der Code verknüpft also die Bitwerte mit ODER, invertiert das Ganze (alle 8 Bits) und UND verknüpft sie mit dem Register. Kurz gesagt, es löscht diese Bits.