[Risolto] Invio dati i2c su PCF8574

Salve a tutti, sto smanettando con questi integrati http://www.ti.com/lit/ds/symlink/pcf8574.pdf anche per impararae meglio la comunicazione i2c. -Io sui registri normali (74hc595) ero abituato a inviare il byte tramite shiftOut. ora per inviare i dati deo usare Wire.write ma non posso mettere tra le parentesi il byte direttamente se prim non lo passo tramite una variabile (questione 1) -volevo inviare anche un byte attraverso la seriale ma no funziona o meglio vengoo inviati numeri a casaccio.(questione 2) -il pin INT dell'ic a cosa serve?(questione 3)

lo sketch per il controllo da seriale è questo:

#include 
void setup()
{
Serial.begin(115200);
Wire.begin();
}

void loop()
{
Wire.beginTransmission(32);
if (Serial.available()>0)
{
Wire.write(Serial.read());
}
Wire.endTransmission();
}

Ho fatto qualche ricerca, ti allego i link. --> http://www.practicalmaker.com/blog/arduino-reading-pcf8574-pins-inputs --> http://skyduino.wordpress.com/librairie-arduino-pcf8574-pcf8575/ --> per i PIC, ma spiega bene il funzionamento --> http://www.laurtec.it/brief-notes/programmazione-pic/125-bn0013-it-pcf8574-i2c-io-expander-libreria-ed-utilizzo

grazie mille paolo, ma se ho capito bene quegòi expander posso usarli anche come shiftin?

PS: finalmente una risposta :grin: Igor

igor97: grazie mille paolo, ma se ho capito bene quegòi expander posso usarli anche come shiftin?

Boh!! Controlla nel Datasheet. :roll_eyes:

appena mi arrivano qualche altro componente da utilizzare su quei registri li sudierò meglio. grazie comunque dei link molto interessanti :wink:
Igor

igor97: grazie mille paolo, ma se ho capito bene quegòi expander posso usarli anche come shiftin?

PS: finalmente una risposta :grin: Igor

Nel PCF8574 puoi selezionare ogni pin singolarmente se lo vuoi come entrata o uscita. Inoltre c'é un uscita che si puó usare come fonte di interrupt che viene triggerato sia sul fianco discendente che su quello L-H di tutti le entrate.

Ciao Uwe

uwefed:

igor97: grazie mille paolo, ma se ho capito bene quegòi expander posso usarli anche come shiftin?

PS: finalmente una risposta :grin: Igor

Nel PCF8574 puoi selezionare ogni pin singolarmente se lo vuoi come entrata o uscita. Inoltre c'é un uscita che si puó usare come fonte di interrupt che viene triggerato sia sul fianco discendente che su quello L-H di tutti le entrate.

Ciao Uwe

ah ecco, puoi spiegarmi meglio l'utilizzo di quel pin? non ho ben capito per la mia ignornza :sweat_smile:

Senti ma... prova cosi: Collega i tre pin di indirizzo del PCF8594 a massa. Poi compila e invia questo sketch.

#include 
void setup()
{
Serial.begin(115200);
Wire.begin();
}
void loop()
{
if (Serial.available()>0)
{
int data = Serial.read();
Wire.beginTransmission(56);
Wire.send(data);
Wire.endTransmission();
}
}

acik: Senti ma... prova cosi: Collega i tre pin di indirizzo del PCF8594 a massa. Poi compila e invia questo sketch.

#include 
void setup()
{
Serial.begin(115200);
Wire.begin();
}
void loop()
{
if (Serial.available()>0)
{
int data = Serial.read();
Wire.beginTransmission(56);
Wire.send(data);
Wire.endTransmission();
}
}

grazie mille e scusa il ritardo. purtroppo questo sketch è come quello che avevo fatto io. risultati: nessuno. mettendo dei print ho scoperto che i dati inviati eranosemre gli stessi (tipo 51 52 55 decimale)

PS: l'indirizzo è sbagliato. mettendo a0-1-2 a massa l'indirizzo è 32 (Decimale) e 0x20(esadecimale) ;) Igor

igor97: purtroppo questo sketch è come quello che avevo fatto io. risultati: nessuno.

Aehm..... a me funziona ]:D

Quel codice e quell' indirizzo !

acik:

igor97: purtroppo questo sketch è come quello che avevo fatto io. risultati: nessuno.

Aehm..... a me funziona ]:D

Quel codice e quell' indirizzo !

trovato il prolema :P il tuo è un pcf8594 (ma sei sicuro? così hai scritto) vabbe stasera rifarò una prova

Io ho questo:

Ti giro un altro bel codice fatto da me:

#include 
const int pausa = 100;
int n = 1;
int s = 1;

void setup() {
  Wire.begin();
  pcf8574(0);
}

void loop() {
  pcf8574(n);
  if (s == 1){  n = n * 2;}
  else {n = n / 2;}
  delay(pausa);
  if (n == 128) { s = 0; }
  if (n == 1) { s = 1; } 
}

void pcf8574(byte data ) {
  Wire.beginTransmission(56);
  Wire.send(data);
  Wire.endTransmission();
}

Ah.... forse ho trovato l' inghippo !

the PCF8574 has as address 0100xxx, while the PCF857A has 0111xxx.

acik:
Ah… forse ho trovato l’ inghippo !

the PCF8574 has as address 0100xxx, while the PCF857A has 0111xxx.

infatti, il mio è pcf8574n.
vabbe mo provo

Quindi ?

scusami, ero convinto di averti risposto :astonished: comunque il tuo codice (il secondo che mi hai passato) funziona, mentre il primo no. non so che fare =(

In che senso non funziona ? Cosa fa ?

acik: In che senso non funziona ? Cosa fa ?

qualsiasi numero scrivo non viene inviato corretamente; mi pare che vengono inviati sempre gli stessi numeri.

Aaaaaa !!! Allora non dire "non funziona" ma "non fa quello che volevo"

Innanzitutto dovresti dire cosa invii alla seriale. Come lo invii ?

Ad esempio, se usi Hyperterminal su Windows, e invii "1"... Hyperterminal inviera' il carattere "1", quindi il numero decimale 49, quindi il numero binario 00110001....