Registrar pregunta de sintaxis

2

Estaba leyendo un código para usarlo en un ATMEGA328P de arduino y no puedo averiguar 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 lo que realmente hace este código? Parece que este código utiliza operaciones bitwise para comparar el registro ASSR con un solo bit ( ~(_BV(EXCLK) | _BV(AS2)) ) y luego establece ese registro en un solo bit, uno o cero. Esto no tiene ningún sentido para mí, ya que este registro tiene 7 bits de tamaño y no puede compararse con un solo bit. Cualquier ayuda es apreciada, gracias.

Documentación relevante:

Hoja de datos de ATMEGA 328P

página de AVR Libc

    
pregunta Cate

2 respuestas

0

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

Desde el contexto, BV () debería darle el peso de la broca.

AS2 es el bit 5 (contando desde la derecha comenzando desde 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) = 00100000 y _BV(EXCLK) = 01000000

Cuando o obtengamos estos valores 01100000

~ invierte los valores, por lo que obtenemos 10011111

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

    
respondido por el Bruno Ferreira
1

_BV es una macro que realiza un desplazamiento a la izquierda. EXCLK y AS2 son posiciones de bit dentro de su registro. Por lo tanto, el código ORs los valores de los bits juntos, invierte todo (los 8 bits) y los AND con el registro. En resumen, borra esos bits.

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas