Que hace esta instruccion? [SOLUCIONADO]

Hola estoy intentando descifrar como hace lo que hace la función de abajo. Entiendo que lo que hace es meter en el registro TCCR2A el valor binario 1000000 . El problema que tengo es que es la primera vez que veo << y | usandolo así y no lo entiendo como consigue meter el valor en el registro.

TCCR2A = (1<<COM2A1) | (0<<COM2A0) | (0<<COM2B1)| (0<<COM2B0) | (0<<3) | (0<<2) | (0<<WGM21) | (0<<WGM20);

Haber si alguien que entienda puede comentar como funciona. Salu2

un 0<<COM2A0 da igual lo que valga COM2A0 porque siempre va a valer 0

el operador << y >> hace que se desplacen los bits de lo que esta a la izquierda a izquierda o derecha según el operador

tienes en la referencia como se usa << - Arduino Reference

el 0 da igual cuanto lo desplaces que va a valer siempre 0, de manera que expresiones como 0<<COM2A0 siempre valdrán 0

otra cosa es 1<<COM2A1 que según valga lo de la derecha se desplazará el 1 a la izquierda pudiendo valer 1,2,4,8,16...

luego se hace un OR lógico bit a bit con los demás valores (todos ceros) así que de todas maneras solo tendras el valor de 1<<COM2A1

un saludo

Gracia SrDonGato por la explicación pero no lo acabo de ver. Mañana me lo leo más lento pero ¿COM2A0 es un bit o un byte? porque creo que es un bit y eso es lo que me rompe los esquemas tanto en desplazar como en la lógica OR. porque or de 10000000= es 1 o en binario 00000001 a no ser que con ese or haga (COM2A0 or 10000000) entonces si sería el septimo bit a un. Pero esto último me parece muy farragoso seguro que para hacer un or entre 2 bytes hay una sintaxys mas clara. En fin que no lo veo muy claro.

aunque para nosotros una variable de bolean o bit es un número , fisicamente en memoria ocupa un byte, así que al hacer un or lo hace bit a bit del byte completo.

aun así el número de la derecha del operador es el número de veces que desplazas todos los bits hacia la izquierda o derecha ( << o >> )y se pueden perder bits. oir eso si al número 0 desplazas bits , sea el número que sea y hacia donde sea siempre será 0.

se usa por ejemplo para saber el estado de un bit en un registro.

por ejemplo queremos saber si el bit 6 del registro TCCR2A (byte) está a 0 o 1

pues hacemos un and y desplazamos el bit para dejarlo en la posicion 1

if ((TCCR2A&0x20)>>6) { hacer esto }

y al reves, si se quiere poner un bit a 1 de un registro dependindo de una variable

if(activado) { TCCR2A = (1<<6) | TCCR2A }

creo recordar era de esta manera, asi lo hacia con pic

un saludo

Gracias SrDonGato, no se me habría ocurrido que el bit es un byte ni de casualidad :sweat_smile: Creo que ya lo he entendido, menuda paranoia al que se le ocurrió esto. Salu2