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:
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 (
). Por la misma lógica _BV(EXCLK)
debería devolver 64 ya que EXCLK es el bit 6.
entonces en binario tenemos
_BV(AS2) = 00100000
y_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.
_BV
es una macro que realiza un desplazamiento a la izquierda. EXCLK
y AS2
son 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.
cate
bruno ferreira
_BV()
también se puede ver como un desplazamiento a la derecha (de hecho así se define).