I2C con expander PCF8574

  • Ricky85
  • Autore della discussione
  • Anziano Utente
  • Anziano Utente
Di più
13 Anni 10 Mesi fa - 13 Anni 10 Mesi fa #1 da Ricky85
I2C con expander PCF8574 è stato creato da Ricky85
Finalmente sono arrivati gli expander...

Per provarli ho messo su un circuitono sulla breadboard comprendente un PIC18F4550, due PCF8574 e 16 led collegati alle rispettive uscite degli 8 expander con opportuna resistenza.

Ho dato i seguenti indirizzi ai due expander

0b000 al primo (tutti e 3 i pin a GND)
0b001 al secondo (pin A0 a +5V e gli altri due a GND)

dopo di che ho cominciato a giocare con il codice cercando di capire come "parlargli" ed ho scritto questo:
Code:
#include <p18f4550.h> #include <i2c.h> #include <delay.h> #pragma config FOSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF //OSC = HS Impostato per lavorare ad alta frequenza //WDT = OFF Disabilito il watchdog timer //LVP = OFF Disabilito programmazione LVP //PBADEN = OFF Disabilito gli ingressi analogici unsigned char I2C_Send = 0b01010101 ; void main (void){ // Variabile per salvare il dato di ritorno unsigned char sync_mode=0; unsigned char slew=0; unsigned char add1; unsigned char w; unsigned char data; unsigned char status; unsigned char length; // Imposto PORTA tutti ingressi LATA = 0x00; TRISA = 0xFF; // Imposto PORTB tutti ingressi LATB = 0x00; TRISB = 0xFF; // Imposto PORTC tutti ingressi, RC1 come output LATC = 0x00; TRISC = 0b11111101 ; // Imposto PORTD tutte uscite LATD = 0x00; TRISD = 0x00; // Imposto PORTE tutti ingressi LATE = 0x00; TRISE = 0xFF; add1=0b01110000; //address of the device (slave) under communication CloseI2C(); //close i2c if was operating earlier //------------------------INITIALISE THE I2C MODULE FOR MASTER MODE WITH 100KHz --------------------------- sync_mode = MASTER; slew = SLEW_OFF; OpenI2C(sync_mode,slew); SSPADD=0x0A; //400kHz Baud clock(9) @8MHz //check for bus idle condition in multi master communication IdleI2C(); //--------------------START I2C--------------- StartI2C(); //**************write the address of the device for communication************ data = SSPBUF; //read any previous stored content in buffer to clear buffer full status do { status = WriteI2C( add1 | 0x00 ); //write the address of slave if(status == -1) //check if bus collision happened { data = SSPBUF; //upon bus collision detection clear the buffer, SSPCON1bits.WCOL=0; // clear the bus collision status bit } } while(status!=0); //write untill successful communication //***********WRITE THE THE DATA TO BE SENT FOR SLAVE**************** while(putsI2C(I2C_Send)!=0); //write string of data to be transmitted to slave //-------------TERMINATE COMMUNICATION FROM MASTER SIDE--------------- IdleI2C(); StopI2C(); while(1); //End of program }

Leggendo sul datasheet mi pare di aver capito che il primo messaggio che riceve serve per "vedere" se è lui il destinatario... quindi ho scritto 0b01110000 dove partendo da destra 0111 sta per selezionare il PCF8574A, 000 è l'indirizzo e l'ultimo 0 è fisso (Write), e nel secondo messaggio immagino sia il dato da inviare per attivare le uscite.

S 0 1 0 0 A2 A1 A0 0 A A 8bit "data1" A 8bit "data2" ecc

Dove S sta per start condition ed A per acknowledge

Risultato... non riesco ad accendere nulla...

Mi sta sfuggendo qualcosa dal datasheet (sicuramente come indicare se selezionare le varie porte come In o come Out)...
Ultima Modifica 13 Anni 10 Mesi fa da Ricky85.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
13 Anni 10 Mesi fa - 13 Anni 10 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: I2C con expander 8574
Ciao,

alcune osservazioni:


1) Attento all'indirizzo. Esiste il PCF8574 e PCF8574A la loro differenza è nell'indirizzo (controlla il datasheet)
In particolare l'indirizzo che hai usato tu è del PCF8574A e non dell'PCF8574.

2) Non controlli gli ACK (Acknowledgment)

3) Non hai la condizione StopI2C


Ho dei PCF8574 sotto mano. Visto le richieste di altre librerie credo che ne scriverò una anche per questo integrato.
...forse una bozza nelle prossime ore!

Saluti,

Mauro
Ultima Modifica 13 Anni 10 Mesi fa da Mauro Laurenti.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Ricky85
  • Autore della discussione
  • Anziano Utente
  • Anziano Utente
Di più
13 Anni 10 Mesi fa #3 da Ricky85
Risposta da Ricky85 al topic Re: I2C con expander 8574

Mauro Laurenti ha scritto: Ciao,

alcune osservazioni:


1) Attento all'indirizzo. Esiste il PCF8574 e PCF8574A la loro differenza è nell'indirizzo (controlla il datasheet)
In particolare l'indirizzo che hai usato tu è del PCF8574A e non dell'PCF8574.

2) Non controlli gli ACK (Acknowledgment)

3) Non hai la condizione StopI2C


Ho dei PCF8574 sotto mano. Visto le richieste di altre librerie credo che ne scriverò una anche per questo integrato.
...forse una bozza nelle prossime ore!

Saluti,

Mauro


Ciao Mauro,

ho editato il post sopra proprio mentre mi rispondevi... per gli Ack me ne sono reso conto stamattina che non li gestivo... ieri sera ero ormai decisamente troppo fuso ><

Per quanto riguarda l'integratino, uso effettivamente il PCF8574A e non il PCF8574 (mi ci stavo gia fregando all'inizio con questo discorso degli indirizzi)

Al post precedente ho inserito il codice che sto provando questa mattina (preso dal sito Microchip e opportunamente pacioccato), ma sono ancora al "pian dei babi" come si dice dalle mie parti...

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
13 Anni 10 Mesi fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: I2C con expander PCF8574
Ciao,

ho appena finito di testare la libreria.
Funziona sia per scrivere dati che per leggere. Prima di pubblicarla vorrei ritoccare alcune cose, inoltre vorrei scrivere una Brief Note poiché ritengo l'argomento interessante.

In ogni modo per la tua libreria tieni conto che il PCF8574 lavora a 100KHz e non a 400KHz.
Usando 400KHz non riesci a trasmettere i dati.

I diodi LED devono essere collegati con il catodo all'uscita del PCF8574 e l'anodo ad una resistenza che va a Vcc.
Questo significa che il LED si accenderà quando scrivi uno 0 e non 1.
Questo e' richiesto poiché solo quando hai l'uscita a 0 riesci a pilotare correttamente il diodo LED.

Vedi se riesci ad aggiustare la tua libreria, altrimenti domani usi quella che ho scritto.

saluti,

Mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
13 Anni 10 Mesi fa - 13 Anni 10 Mesi fa #5 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: I2C con expander PCF8574
Ciao,

scrivere la brief note mi richiederà del tempo. Per cui includo le librerie ed un esempio.
Quelle ufficiali che includerò nelle librerie C18 LaurTec potrebbero differire di poco.
Per utilizzare la libreria includi semplicemente il file .h e .c nel tuo progetto.
Il file .h potrebbe anche essere includo semplicemente con la direttiva #include (vedi esempio).

I prototipi delle funzioni sono :
Code:
signed char PCF8574_write_data(unsigned char control, unsigned char data ); signed char PCF8574_read_data(unsigned char control, unsigned char *data);

Come utilizzarle e' descritto nel file h. In ogni modo la variabile control deve essere il byte che contiene l'indirizzo dell'integrato e il valore dell'indirizzo dei pin. L'ultimo bit (quello meno significativo e' relativo a alla scrittura e lettura).
Sia che si faccia uso della funzione di scrittura che quella di lettura deve essere poso a 0. La funzione a seconda dei casi lo porrà ad 1 se richiesto.

Per esempio facendo uso del PCF8574 con indirizzo IC 0100 A2 A1 A0 R/'W
Ponendo A2 A1 A0 a massa, sia ha che il bit di controllo (sia che si utilizzi la funzione in scrittura che lettura) deve essere 01000000 ovvero 0x40. Ponendo A0 a Vcc, si avrebbe 010000010 ovvero 0x42, e via dicendo...

Come detto questa non e' la versione ufficiale che sarà inclusa in:

Librerie LaurTec per microcontrollori PIC18

...ora perché non la testi anche tu! :)

Saluti,

Mauro
Allegati:
Ultima Modifica 13 Anni 10 Mesi fa da Mauro Laurenti.

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi