Pregunta de sintaxis de registro

Estaba leyendo un código para usar en un arduino ATMEGA328P y no puedo entender qué hace esta línea de código.

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

Sé que ASSR es el registro de estado asíncrono y que EXCLK son AS2 son bits en ese registro. Estoy bastante seguro de que _BV() se usa para establecer ese bit, corríjame si me equivoco. Lo que no sé es qué hace realmente este código. Parece que este código usa operaciones bit a bit para comparar el registro ASSR con un solo bit ( ~(_BV(EXCLK) | _BV(AS2))) y luego establece ese registro con un solo bit, uno o cero. Esto no tiene ningún sentido para mí, ya que este registro tiene 7 bits y no se puede comparar con un solo bit. Cualquier ayuda es apreciada, gracias.

Documentación relevante:

Ficha técnica ATMEGA 328P

Página AVRLibc

Respuestas (2)

Tengo poca experiencia en Arduino, pero parece que esa línea está borrando los bits EXCLK y AS2.

Desde el contexto BV() debería darle el peso de bit.

AS2 es el bit 5 (contando desde la derecha a partir de 0) en el registro, luego _BV(AS2)debe devolver 32 ( 2 5 = 64 ). Por la misma lógica _BV(EXCLK)debería devolver 64 ya que EXCLK es el bit 6.

entonces en binario tenemos

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

Cuando nosotros o estos valores obtenemos 01100000

el ~invierte los valores por lo que obtenemos 10011111

Luego, &=mantiene todos los bits que son 1 en el resultado anterior sin cambios y establece los bits restantes (5 y 6) en 0.

Gracias, esto tiene sentido. Debería haber visto que _BV() devolvió un byte en lugar de un bit.
Como decía Ignacio _BV()también se puede ver como un desplazamiento a la derecha (de hecho así se define).

_BVes una macro que realiza un desplazamiento a la izquierda. EXCLKy AS2son posiciones de bit dentro de su registro. Entonces, el código combina los valores de bit con OR, invierte todo (los 8 bits) y los combina con el registro. En resumen, borra esos bits.