¿Qué sugiere PORTB ^ = 1 << PINB0 en el microcontrolador AVR?

Es una operación de lectura-modificación-escritura en PORTB.

El enunciado “A ^ = B” significa buscar A, XOR con B, luego poner A de nuevo donde lo encontraste.

La afirmación “1 << PINB0" requiere un poco más de explicación. PINB0 es una constante: la posición de bit del Bit 0 en el puerto PINB. Hay docenas de constantes similares definidas en el entorno de programación AVR, presumiblemente en caso de que decidan utilizar todos los Texas Instruments con un AVR futuro y definir el bit menos significativo de un puerto como el bit 7. En cualquier caso, PINB0 se define como 0, cero. Pero espere: hay tres partes en un puerto AVR, PORTx, PINx y DDRx, para el registro de salida, el registro de entrada y el registro de dirección de datos, y cada uno de ellos tiene su propio conjunto de constantes . Esta declaración, entonces, debería leer

PORTB ^ = 1 << PORTB0

No hace ninguna diferencia en la práctica, porque todos los conjuntos tienen los mismos valores. Pero una persona lo suficientemente pedante como para escribir “PINB0” en lugar de simplemente “0” debe ser lo suficientemente pedante como para nombrar el registro correcto.

El desplazamiento ‘<<' a la izquierda es exactamente lo que parece. el '1' se desplaza hacia la izquierda por PINB0 lugares, en este caso cero lugares, ninguno en absoluto. El resultado es binario 00000001. Si en su lugar hubiéramos pedido 1 << PINB4, el resultado sería 00010000.

Entonces, la instrucción lee el valor del registro de salida PORTB, lo XOR con 1, y lo escribe de nuevo, alternando así.


Comando para alternar el estado de salida de gpio-pin # 0 de “PortB”.

Decodificando el comando,

PORTB ^ = 1 << PINBO es igual que, PORTB = PORTB ^ (1 << PINBO)

“^” representa la operación XOR bit a bit

(1 << PINBO) corresponde al valor de máscara utilizado para invertir el contenido del registro en PORTB

PINBO estará #definido a una constante en el código fuente del firmware. Como se refiere al PIN # O de PortB, debe definirse como un valor constante de ‘0’. Puede buscar en el firmware para encontrar hasta qué valor PINBO está #definido.

Ejemplo

Digamos que el contenido de PORTB es (1000 0100), PINBO es 0x00, ahora el comando PORTB ^ = (1 << PINBO) es el mismo que,

PORTB = (1000 0100) xor (1 << 0)

PORTB = (1000 0100) xor (0000 0001)

PORTB = (1000 0101)

es decir, el contenido del registro PORTB se actualiza a (1000 0101).

En resumen, la operación invierte el bit 0 de PORTB. El bit 0 de PORTB corresponde al PIN # 0 de PORTB. PIN # 0 de PORTB está etiquetado como PINB0

Espero no confundirte 🙂

Significa, PORTB = PORTB ^ (1 << PINB0).

Significa que alternará el estado de PORTB. Como la operación a nivel de bits XOR está allí, el valor XORing con el mismo valor da como resultado un estado conmutado.

Es una especie de operación de lectura-modificación-escritura en PORTB.

Solo EXPLORA las cosas.