Problemi con Shift Register

Ciao a tutti. Ho un problema con un codice che gestisce gli Shift Register. Ho imparato ad usarli in un modo molto semplice, ovvero questo:

int Abilitation = 8;
int Clock = 12;
int DatoOut = 11;

byte Dato = 0;

void setup() {
Serial.begin(9600);
pinMode (Abilitation, OUTPUT);
pinMode (DataOut, OUTOUT);
pinMode (Clock, OUTPUT);
} 

void loop() {
Dato = 0b00010000;

Serial.println(Dato);
digitalWrite(Abilitation,LOW);
shiftOut(DataOut, Clock, LSBFIRST, Dato);
digitalWrite(ABILITATION, HIGH);
delay (400);

In questo modo riesco ad accendere un led per volta però.

Ora, il mio problema è il seguente: Tramite cari settaggi che faccio manualmente, con menù visibili tramite display e modificabili grazie a 3 pulsanti, cambio i valori di 8 variabili, che assumono come valori 0 o 1. L'idea iniziale, senza Shift Register, era quella di verificare tramite if() lo stato delle variabili e, se pari a 1, accendere un led, altrimenti spegnerlo, se pari a 0.

Ora, aggiungendo lo Shift Register, non saprei come fare, perché finché si tratta di accendere un led, ok, semplice, però se devo accenderne due allo stesso tempo, devo modificare il byte (0b00000000) precedente e aggiungere il secondo led acceso, e non saprei proprio come fare.

Spero di essermi spiegato Grazie in anticipo

Aggiornamento: La somma di byte potrebbe essere una soluzione?

Devi usare le operazioni bitwise, ovvero che manipolano i singoli bit.

Per mettere a 1 il bit i-esimo (7 <= i <= 0) di x:

x |= (1 << i);

Per metterlo a 0:

x &= ~(1 << i);

Con queste dritte dovresti poter andare avanti. Se vuoi ulteriori dettagli, chiedi :).

SukkoPera:
Devi usare le operazioni bitwise, ovvero che manipolano i singoli bit.

Per mettere a 1 il bit i-esimo (7 <= i <= 0) di x:

x |= (1 << i);

Per metterlo a 0:

x &= ~(1 << i);

Con queste dritte dovresti poter andare avanti. Se vuoi ulteriori dettagli, chiedi :).

Io pensavo più ad una cosa del genere:

byte Dato1 = 0;
byte Dato2 = 0;
byte Dato3 = 0;


Dato1 = 0b00010000;
Dato2 = 0b00100000;

Dato3 = Dato2 + Dato1;

Ho provato a fare ciò, e se fatto in loop() funziona perfettamente, e lo Shift Register segue i comandi.
Dici che è una fortuna che funzioni, oppure può essere un’alternativa semplice?

Funziona perchè B00010000 + B00100000 = B00110000

Puoi ottenere lo stesso risultato facendo

Dato3 = Dato1;
bitWrite(Dato3, 5, HIGH);

Cioè mettendo a HIGH il bit di indice 5, cioè il sesto partendo da destra, cioè dal meno significativo. oppure

Dato3 = Dato2;
bitWrite(Dato3, 4, HIGH);

Cioè mettendo a HIGH il bit di indice 4, cioè il quindi partendo da destra. Ho prima copiato su Dato3 per avere il risultato su Dato3 come fai tu, ma non serve necessariamente avere tutte queste variabili...

Oppure usando bitSet senza il terzo parametro, cioè senza HIGH perchè implicito.

Occhio però, che B01000000 + B01000000 = B10000000 se il risultato che desideri è B01000000 devi usare | cioè l'OR e non il + Come ti ha giustamente indicato @SukkoPera nei suoi esempi che fanno OR e SHIFT.

Beh sì, funziona, è un po' più laborioso, ma se ti trovi meglio a fare così, va benissimo. Di fatto stai facendo 16+32=48.

Per quanto ho detto al mio post precedente, effettivamente le macro suggerite dall'ottimo maubarzi fanno la stessa cosa e sono più leggibili, quindi da preferire. Sono conscio della loro esistenza ma per qualche motivo le dimentico sempre >:( .

Fare la somma ti funziona solo se i due addendi sono multipli potenze di 2 e diversi tra loro perchè producono lo stesso risultato dell'OR altrimenti non è detto. In altre parole, l'operatore concettualmente corretto è l'OR non la somma, questa funziona solo tra numeri che sommati producono lo stesso risultato dell'OR.

Beh, se li scrive a mano in notazione binaria facendo attenzione a mettere un 1 solo, saranno per forza [u]potenze/u di 2 :).

Si, scusa, potenze, correggo (altrimenti andavano bene tutti quelli con il primo bit a destra a zero :P). Poi non so mica come li userà ;) Il primo codice manco si compilava... mancava solo la graffa di chiusura o il 99% del codice ? :P

Sisi, saranno per forza tutti diversi tra loro e con un solo 1 Penso che andrò con il metodo "somma"... Se vedo che è troppo complicato, userò un vostro consiglio

Grazie mille!

Allora dovrebbe funzionare senza problemi in questo specifico caso, perchè il risultato sarebbe equivalente.

ciao