Ciao,
sto utilizzando un modulo per ampliare le uscite di arduino (ha 8 uscite)
Attuamente uso questo codice per pilotarme quattro ..
if ((I_S1==0) && (I_S2==0) && (I_M1==0) && (I_M2==0) )
{ Wire.write((byte)0b00001111); }
if ((I_S1==0) && (I_S2==0) && (I_M1==0) && (I_M2==1) )
{ Wire.write((byte)0b00001110); }
if ((I_S1==0) && (I_S2==0) && (I_M1==1) && (I_M2==0) )
{ Wire.write((byte)0b00001101); }
if ((I_S1==0) && (I_S2==0) && (I_M1==1) && (I_M2==1) )
{ Wire.write((byte)0b00001100); }
per pilotarne 8 dovrei scrivere ben 256 combinazioni.
Mi potete indicare un altro modo per poterle pilotare
Grazie
Ma no...
Basta ragionare un attimo
Se una variabile comanda una specifica posizione e le posizioni hanno un valore (posizionale appunto, come ci ha insegnato la maestra alle elementari)
Basta solo costruire una somma di moltiplicazioni, ogni moltiplicazione tra la variabile controllante la posizione e il peso binario della posizione
Con una riga (lunga) te la cavi
mmmm... ma cosa sono quelle 4 variabili I_S1 ecc.
Vedo
15 0
14 1
13 2
12 3
Cioè non puoi scrivere direttamente:
Wire.write((byte)12);
Sono perplesso, prova questo sketch nel setup():
byte counter = 255;
byte b;
Serial.println("counter\tb");
do {
b = ~counter;
Serial.print(counter);
Serial.print("\t");
Serial.print(b);
Serial.println();
--counter;
} while (b != 255);
Questo è l'output parziale:
counter b
255 0
254 1
253 2
252 3
251 4
Spiega meglio le necessità che hai perché le soluzioni ci sono.
Ciao.
C1P8...
Negli anni mi ricordo...
Era dato come un errore di traduzione
O come una traduzione volutamente errata
Comunque ci hai pigliato
Come spesso ci piglia il droide che ti ha ispirato il nick
Edit
Beh, no, mi correggo
Manca un piccolo particolare...
Negativamente importante
Datman
September 1, 2022, 7:31am
7
Wire.write((byte) (!I_S1)<<3 + (!I_S2)<<2 + (!I_M1)<<1 + !I_M2);
oppure:
Wire.write((byte) (!I_S1)<<3 | (!I_S2)<<2 | (!I_M1)<<1 | !I_M2);
janus70
September 1, 2022, 11:54am
9
Ciao,
grazie per le risposte ..
provo a spiegare meglio il problema ..
in base ad 8 variabili devo impostare le otto uscite del modulo aggiuntivo.
attualmente per valorizzarne quattro utilizzo il codice che vi ho mostrato.
se devo utilizzare tutte le otto variabili come faccio?
mettiamo che le variabili siano
a, b, c, d, e, f, g, h
attualmente farei
if((a==0) && (b==0) && (c==0) && (d==0) && (e==0) && (f==0) && (g==0) && (h==0) )
{ Wire.write((byte)0b00000000);}
if((a==0) && (b==0) && (c==0) && (d==0) && (e==0) && (f==0) && (g==0) && (h==1) )
{ Wire.write((byte)0b00000001);}
....
....
e così via
Grazie
C1P8
September 1, 2022, 12:39pm
10
Ma sei al contrario rispetto a prima
Due risposte valide ti sono state date, se non ti sono chiare studiale
Solo dopo averle studiate se ti rimangono dubbi parliamone
Ostia
Vero è
Non me ne ero accorto
Quindi le risposte sono valide
Le domande forse no
In effetti senza sapere di che modulo si tratta le informazioni non possono essere esaustive.
Suppongo che le variabili a÷h conservano lo stato on/off ricavato premendo 8 pulsanti. Allora vuoi assemblare le otto variabili all'interno di un byte. Puoi provare questa funzione:
byte assemblaByte() {
return ((a << 7) |
(b << 6) |
(c << 5) |
(d << 4) |
(e << 3) |
(f << 2) |
(g << 1) |
(h << 0));
}
Restituisce un byte che puoi anche salvare in una variabile o inviare direttamente con:
Wire.write((byte)assemblaByte());
C'è un altro problema; ha poco senso scrivere sempre lo stesso valore.
Ciao.
Molto interessante la soluzione proposta da Maurotec.
Concorquoto
Io solitamente aborro le operazioni bit a bit
Ma quando ci vuole ci vuole...
Datman
September 2, 2022, 7:13am
18
Lo avevo già scritto al #7 ...
janus70
September 5, 2022, 8:22pm
20
Grazie mille per la soluzione