buongiorno a tutti,
ho una lettura di un sensore tramite I2C e avrei bisogno di dividere un byte letto.
sostanzialmente i primi 2 bit del byte rappresentano un numero da 0 a 3 e così via le altre 3 copie.
sono a conoscenza delle funzioni di bitwise ma non saprei proprio come usarle!
scusate la mia ignoranza...
vi la scio il codice che per ora ho scritto per leggere i dati!
Wire.beginTransmission(BNNO055_ADDRESS);
Wire.write(0x35);//invio l'indirizzo del registro che voglio leggere
Wire.endTransmission(false);//finita la trasmissione libero il bus
Wire.requestFrom(BNNO055_ADDRESS,1);//mi aspetto di leggere 1 byte
if (Wire.available()) {
byte data ;
data=Wire.read();
Serial.println(data,BIN);
}else return;
delay(1);
Puoi usare l'operatore AND sui bit per selezionare gli unici bit che ti interessano e l'operatore SHIFT per poi allineare tutto a destra così da avere il numero corrispondente ...
A A B B C C D D sono gli 8 bit che hai in un byte che chiamiamo "mioByte"...
... se fai mioByte & 0b11000000 metti a zero tutto quello che segue dopo i primi due bit, poi fai lo shift di 6 bit con >> 6 e li hai spostati all'inizio (allineati a destra) quindi: bitAA = (mioByte & 0b11000000) >> 6;
... stessa cosa per le coppie BB, CC e DD solo che fai l'AND selezionando solo i bit che ti servono e cambi lo shift. Ricapitolando:
Sicuramente si può fare in modo ancora più compatto, ma meno leggibile e ... visto che devi imparare, forse questa è la forma più chiara
Guglielmo
P.S.: Nota bene che la notazione 0bxxxxxxxx, ovvero indicare i bit di un byte in questo modo, esiste SOLO su Arduino e NON è standard. In altri ambienti darebbe errore di sintassi ... la cosa migliore sarebbe esprimere il valore in esadecimale che è una notazione standard ... 0xC0, 0x30, 0x0C, 0x03.
Ottimizza sempre ... dovrà contenere un numero di due bit, quindi un numero che va da 0 a 3 ... cosa sprechi a fare due bytes di un "int"??? Ti basta un "byte" e risparmi il 50% dello spazio
Come tu vuoi VEDERE il numero non ha nulla a che fare con come lo memorizzi (sempre una serie di bit è). La Serial.print() prevede dei modificatori (BIN, OCT, HEX, DEC) per "rappresentare" il numero in vari formati, ma, appunto, è solo una "rappresentazione", il valore, nalla memoria della MCU, sempre con una serie di bit in bytes è memorizzato!