Programació a nivell de bit a Arduino

De binefa.com
La revisió el 15:55, 9 març 2026 per Jordi Binefa (discussió | contribucions) (Es crea la pàgina amb «= Operadors de Bits en Arduino = La manipulació de bits ens permet interactuar directament amb el maquinari de l'Atmega328P (o el xip que usis) de forma extremadament...».)
(dif) ← Versió més antiga | Versió actual (dif) | Versió més nova → (dif)
Salta a la navegació Salta a la cerca

Operadors de Bits en Arduino

La manipulació de bits ens permet interactuar directament amb el maquinari de l'Atmega328P (o el xip que usis) de forma extremadament ràpida i eficient.

L'operador AND (&)

S'utilitza sovint per llegir l'estat d'un bit específic (fent el que anomenem una "màscara"). El resultat és 1 només si els dos bits comparats són 1.

byte valor = 0b10101100;    // Un byte de prova
byte mascara = 0b00000100;  // Volem mirar el bit 2 (el tercer per la dreta)

if (valor & mascara) {
 // Aquesta condició serà certa si el bit 2 de 'valor' és '1'
}

L'operador OR (|)

S'utilitza per activar un bit (posar-lo a 1) sense modificar la resta de bits del byte.

byte pins = 0b01000000; 
pins = pins | 0b00000001; // Activem el bit 0

// El resultat final de 'pins' és 0b01000001

L'operador NOT (~)

Inverteix tots els bits: els 0 passen a ser 1 i els 1 passen a ser 0.

byte original = 0b11110000;
byte invertit = ~original; 

// 'invertit' ara val 0b00001111

Desplaçaments a l'esquerra (<<) i a la dreta (>>)

Moure els bits cap a un costat és la forma més ràpida de multiplicar o dividir per potències de 2, o de crear màscares dinàmiques.

<< (Esquerra): Desplaça els bits a l'esquerra i afegeix zeros a la dreta.

>> (Dreta): Desplaça cap a la dreta i els bits que "surten" es perden.

byte x = 0b00000001;
byte y = x << 3; // Movem el '1' tres posicions: 0b00001000 (8 en decimal)

byte z = y >> 2; // Movem dues posicions a la dreta: 0b00000010 (2 en decimal)

Exemple Pràctic: Manipulació de Ports En Arduino, és molt comú veure aquesta sintaxi per modificar un pin (com el Pin 13, que sol ser el bit 5 del registre PORTB) sense afectar els altres pins del mateix port:

// ACTIVAR: Posem el bit 5 a '1' (HIGH)
PORTB |= (1 << 5); 

// DESACTIVAR: Posem el bit 5 a '0' (LOW)
PORTB &= ~(1 << 5); 

Explicació de la lògica PORTB &= ~(1 << 5):

(1 << 5): Crea la màscara 0b00100000.

~: Inverteix la màscara a 0b11011111.

&: En fer l'AND amb el registre original, tots els bits es queden igual (perquè estan multiplicats per 1) excepte el bit 5, que es multiplica per 0 i s'apaga.