wordWrite() per MCP23017

Ciao a tutti,
sto svolgendo delle prove con un MCP23017 e dei display a 7 segmenti e vorrei utilizzare le 16 uscite (nel mio caso uscite) in una stringa sola, praticamente, se non dico fesserie, utilizzare una word.
Cercando in rete ho trovato una funzione interessante nel Playground (Arduino Playground - MCP23S17 Class for Arduino), la funzione "wordWrite()"!! Il Problema è che questa libreria si riferisce all' MCP23S17, vorrei sapere se esiste qualcosa di analogo anche per il fratello che utilizza l'I2C!
Visto i costi in gioco si farebbe sicuramente prima a cambiare integrato, però vorrei tentare di capire se vi è la possibilità con qualche altra libreria di ottenere lo stesso risultato, al momento l'MC23017 lo gestisco con la libreria "Wire" e mi sembra di capire che così non ci sia una scorciatoia!

Grazie

Meluino

Adafruit ha una sua libreria per il tuo integrato.

Grazie per la risposta "mid"!!
Avevo visto in giro questa libreria, ma non ho idea di come poter richiamare la funzione che mi interessa!!
Qualche suggerimento ^^ ^^ :slight_smile: please........

No, mi sa che la libreria di Adafruit non ha quella funzione.
Usa oggettoMCP.digitalWrite(porta,HIGH o LOW) quindi un pin alla volta

=( =( =(
Sì, anch'io ho trovato solo questo!!

16 bit sono 2 byte,

Se la lib di Adafruit supporta solo i byte, usa un unsigned int oppure una word e poi spedisci i 2 byte che compongono il dato spezzandolo in byte basso/byte alto usando le funzioni predefinite di Arduino lowByte e highByte.

Allora ho cercato un po' in giro come usare le funzioni lowByte ed highByte, vediamo se ho capito!

Piccolo sketch d'esempio:

Int numero= 0x00FF;
byte  lo,hi;

void setup(){
lo = LowByte (numero);
hi = HighByte (numero);
}
void loop(){

Wire.beginTransmission(0x20);
Wire.write(0x12);
Wire.write(lo);
Wire.endTransmission();

Wire.beginTransmission(0x20);
Wire.write(0x13);
Wire.write(hi);
Wire.endTransmission();
}

Nello sketch di esempio ho inserito solo le parti d'interesse per capire il concetto, quindi se tutto va come penso debba andare l'integrato si comporta nel seguente modo:

Porta A: 11111111
Porta B: 00000000

Giusto?

Sono riuscito solo ora a mettere in pratica quanto suggerito da Leo e devo dire che mi hai dato un'ottimo consiglio, sono riuscito ad ottenere quello che volevo ottenere, GRAZIE MILLE :slight_smile:
Poi mentre ricontrollavo il lavoro svolto ho fatto mente locale che comunque (come si può vedere nell'esempio del post precedente) non stavo utilizzando la libreria adafruit, ma utilizzo ancora le funzioni di "wire"! Sicuramente utilizzando adafruit eliminerei righe di programma, ma come faccio a conoscere i vari comandi, voglio dire, non esistono degli esempi su come utilizzare questa libreria?

Grazie

Meluino

Adafruit documenta le sue librerie, generalmente. Mette una pagina web con esempi e spiegazioni.
A prescindere da questo, basta che tu apra il file .header di una qualunque libreria per vedere i metodi messi a disposizione ed i parametri che devi passargli.

:blush: :blush: :blush:

Sono sicuro che un tecnico del tuo livello, Leo, quando apre un file.h non ha alcun problema a capirne i vari significati, purtroppo la cosa non vale per quelli come me!! =(
Ho provato a guardare il file, ma come ben immaginavo, a parte qualche comando il resto rimane incomprensibile, nello specifico non riesco a capire come configurare/comandare le due porte dell'MCP.

Con "Wire" faccio questo ad esempio per configurare i pin della porta A come uscite:

Wire.beginTransmission(0x20);
Wire.write(0x00);
Wire.write(0x00);
Wire.endTransmission);

Questo poi per comandarle:

Wire.beginTransmission(0x20);
Wire.write(0x12);
Wire.write(0b11001100);
Wire.endTransmission);

Ho cercato in giro anche esempi, ma nulla che mi venisse d'aiuto!

Ribadisco comunque che utilizzando lowByte e highByte ho ottenuto l'aiuto che cercavo, quindi sono "a posto" per le prove che sto eseguendo, sarebbe poi un di più (molto gradito) capire se adafruit possa venire in aiuto per ottimizzare righe di programma!

Grazie

Meluino

meluino:
:blush: :blush: :blush:

Sono sicuro che un tecnico del tuo livello, Leo, quando apre un file.h non ha alcun problema a capirne i vari significati, purtroppo la cosa non vale per quelli come me!! =(

Però ci sono anche degli esempi allegati, quelli sono facilmente leggibili:

nello specifico non riesco a capire come configurare/comandare le due porte dell'MCP.

Sempre leggendo gli esempi, vedi che la lib di Adafruit mette a disposizione metodi simil-Arduino per cui per impostare una porta usi mcp.pinMode mentre per leggerla mcp.digitalRead ecc...

Gli esempi li avevo visti ma non vedevo nulla che mi potesse essere d'aiuto , tu dici che per impostare la porta posso utilizzare pin.Mode, ma così non vado ad impostare il singolo pin?
Nello specifico per impostare una porta con arduino e poi comandarla utilizzo questo metodo:

void setup()
{
  DDRD = B11111111;
}
 
void loop()
{
  PORTD = B11110000;
  delay(1000);
}

Nell'esempio vado ad impostare i pin della porta D come uscite e poi con PORTD le vado a comandare.
Ho provato questo metodo con adafruit, anteponendo a DDRB e PORTB l'oggetto "mcp." ma ottengo degli errori in fase di compilazione.