Programació a nivell de bit a Arduino
Contingut
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.