PCF8574: I2C I/O Expander, libreria ed utilizzo

In ogni applicazione in cui si debbano controllare molti carichi, siano essi dei semplici diodi LED, dei Relay, o segmenti di un display, è facile che i pin del microcontrollore utilizzato non siano sufficienti. Utilizzare microcontrollori con un numero maggiore di pin potrebbe non essere praticabile a causa di costi, problemi di spazio sul PCB e modularità. In questa Brief Note viene presentato l'integrato PCF8574 un versatile integrato con interfaccia I2C che permette di estendere gli I/O disponibili. L'integrato possiede 8 I/O utilizzabili rispettivamente o come ingressi o come uscite. La seguente Brief Note  presenta non solo una descrizione dell'integrato ma anche le sue applicazioni, presentando una libreria in C18 (ANSI C) utilizzabile con i microcontrollori della Microchip della famiglia PIC18.

Nota:
La seguente Brief Note non vuole essere un'alternativa al datasheet, al quale bisogna fare sempre riferimento. In particolare si fa presente che i parametri descritti fanno riferimento al datasheet del PCF8574 della Texas Instrument. Tra gli altri produttori dell'integrato vi è la NXP (Philips) proprietaria ed ideatrice dello standard I2C.

 

L'integrato PCF8574, generalità ed applicazioni

L'integrato PCF8574 rappresenta un Expander I/O gestibile per mezzo della interfaccia I2C, dunque per mezzo delle sole linee SDA (Serial Data) e SCL (Serial Clock) oltre alla linea di massa (per maggiori informazioni sul bus I2C si rimanda al Tutorial "Il Protocollo I2C").  
L'integrato è disponibile in diversi package, tra cui il DIL16. Uno schema a blocchi dell'integrato è riportato in Figura 1.
 

Figura 1: Schema a blocchi dell'integrato PCF8574 (Datasheet Texas Instrument)


Figura 1: Schema a blocchi dell'integrato PCF8574 (Datasheet Texas Instrument).

Dallo schema a blocchi è possibile vedere che la porta di uscita possiede 8 linee che possono essere utilizzate come ingressi o uscite (freccia bidirezionale). La particolarità dell'integrato è che non sono necessarie impostazioni per la porta stessa, al fine d'impostare i singoli pin come ingressi o uscite (cosa normalmente necessaria per impostare la porta di un microcontrollore).
Questa versatilità si paga con il fatto che bisogna leggere bene il datasheet visto che sono presenti accortezze e caratteristiche, che se non ben lette possono portare ad un uso scorretto dell'integrato.

Oltre alle linee SDA e SCL l'integrato possiede tre linee d'indirizzo esterne, grazie alle quali è possibile utilizzare fino a 8 dispositivi sullo stesso bus. L'integrato PCF8574 si presenta in due versioni, PCF8574 ed PCF857A, le quali differiscono tra loro per il solo indirizzo interno base. Nel caso del PCF8574 si ha l'indirizzo pari a 0100 (nibble più significativo) mentre per il PCF8574A si ha che l'indirizzo è  0111 (nibble più significativo). In particolare l'intero indirizzo della periferica I2C è composto come riportato in Figura 2.
 

Figura 2: Indirizzo dell'integrato PCF8574 e PCF8574A


Figura 2: Indirizzo dell'integrato PCF8574 e PCF8574A.

Si noti che l'indirizzo completo è composto anche dai tre bit relativi ai pin esterni d'indirizzamento. Il bit 0 è il bit R/'W e viene posto ad 1 in operazioni di lettura mentre viene posto a 0 in operazioni di scrittura. La modalità con cui bisogna inviare i dati e leggere dati dall'integrato è possibile leggerlo direttamente dal datasheet o facendo riferimento alla libreria che verrà discussa a breve.

Da quanto detto si capisce che l'integrato PCF8574 rappresenta una periferica di tipo SLAVE, ciononostante grazie alla linea INT può comportarsi come pseudo MASTER. La linea INT è ottenuta per mezzo di un Open Drain, per cui per il suo corretto funzionamento è necessario un resistore di pull-up (valore consigliato di 4.7 Kohm). Il fatto di usare un Open Drain permette di collegare in Oring più dispositivi, ovvero si ha la possibilità di collegare le linee di interrupt di più PCF8574 ad un unico resistore di pull-up. La linea di interrupt viene abilitata (portata a livello basso) quando uno qualunque degli input cambia di stato. L'interruzione viene rilasciata se l'ingresso torna al suo livello originale o avviene una lettura/scrittura della porta che ha generato l'interrupt. In particolare l'interruzione viene abilitata sia con un fronte di discesa che un fronte di salita su di una linea usata come ingresso.
In questo modo l'integrato PCF8574 può avvisare il controllore di un cambiamento sugli ingressi, come se fosse un MASTER del bus I2C. Il microcontrollore, ricevendo l'interruzione andrà a leggere la periferica per aggiornare il proprio stato. Si capisce che se più linee di interruzioni sono collegate assieme sarà necessario interrogare tutti i PCF8574 con ingressi al fine di essere certi di leggere il dispositivo che effettivamente ha generato l'interruzione.
 

Condizioni operative raccomandate

Come ogni componente elettronico anche il PCF8574 è caratterizzato dall'avere delle condizioni operative ottimali oltre le quali è bene non andare. Anche se i valori massimi possono essere maggiori e un integrato può lavorare anche se sottoposto ai valori massimi, questo può causare un più rapido deterioramento del componete (normalmente per gli effetti legati ad un maggiore riscaldamento del die sul quale è realizzato il cip stesso). In Tabella 1 sono riportati i parametri operativi consigliati per il PCF8574, oltre i quali è bene non andare.
 

Tabella 1: Condizioni Operative consigliate  (Datasheet Texas Instrument)


Tabella 1: Condizioni Operative consigliate  (Datasheet Texas Instrument).

Un'attenta lettura della tabella mostra subito un'apparente anomalia, che se non presa in considerazione può portare ad un malfunzionamento del sistema. Si osservi infatti che la corrente massima che è possibile prelevare quando l'uscita è a livello alto è di 1mA, ovvero non idonea a pilotare un diodo LED. Ciononostante si può osservare che la corrente nel caso in cui si ha un livello basso (corrente di sink) è pari a 25mA. Questo significa che quando poniamo a 0 l'uscita potremmo pilotare un diodo LED. Anche se forse non si è compresa la differenza tra il poter pilotare un LED quando si ha un livello logico basso e il non poterlo fare con un livello logico alto, a breve con degli esempi si capirà il tutto.
Una caratteristica importante del dispositivo è la possibilità di poter operare in un intervallo di tensioni piuttosto ampio da 2.5V – 6V permettendo dunque il suo utilizzo anche in sistemi alimentati a 3.3V.
Il dispositivo è gestibile per mezzo del bus I2C, fino ad una frequenza di 100KHz. Questo significa che qualora si vogliano utilizzare altre periferiche sul bus che lavorino a 400KHz è necessario o dividere il bus in due sezioni (alta e bassa velocità) o bisogna far lavorare tutte le periferiche a 100KHz.     
 

Utilizzo del PCF8574 per estendere le uscite

Tra gli utilizzi del PCF8574 vi è quello di poter estendere il numero di uscite disponibili sul sistema. Dal momento che l'integrato possiede 3 linee per l'indirizzamento della periferica, è possibile avere fino a 8 dispositivi dello stesso tipo su di un bus, ovvero fino a 64 uscite. Considerando che è presente la versione PCF8574A, che differisce del solo indirizzo interno, è possibile aggiungere altri 8 integrati, ovvero 8 PCF8574 e 8 PCF8574A ottenendo fino a 128 uscite controllabili per mezzo di due sole linee (SDA, SCL).
All'accensione del dispositivo tutte le uscite si portano a livello alto (Vcc). Si ricorda che a livello alto la massima corrente che è possibile prelevare dall'uscita è di 1 mA. Questo significa che l'applicazione riportata in Figura 3 potrebbe non funzionare a causa dell'eccessiva corrente richiesta dal LED (5-20mA) per LED del tipo rosso, giallo, e verde (correnti maggiori potrebbero essere richieste qualora si faccia uso di LED ad alta luminosità).

Figura 3: Esempio non funzionate con PCF8574
Figura 3: Esempio non funzionate con PCF8574.

Per poter pilotare i LED in maniera opportuna è necessario accenderli quando l'uscita è posta ad un livello basso, dunque è necessario collegare il suo catodo all'uscita, piuttosto che il suo anodo, come riportato in Figura 4, infatti in questa configurazione è possibile far circolare correnti fino a 25 mA per LED ed un massimo per porta di 100 mA.

Figura 4: Esempio funzionate con PCF8574

Figura 4: Esempio funzionate con PCF8574. 

Nonostante lo schema di Figura 3 non può funzionare a causa della poca corrente disponibile nello stato logico alto, non vuol dire che a livello alto non si possa comandare nulla. Facendo uso di buffer o transistor è possibile pilotare tranquillamente dei LED od eventualmente del Relay. Ciononostante bisogna sempre tenere a mente che la corrente massima è solo 1 mA per cui anche se si dovesse fare uso di un transistor, se il suo Hfe (guadagno in continua) non dovesse essere sufficientemente alto e la corrente di collettore necessaria per pilotare il carico sufficientemente bassa, si potrebbe non poter pilotare propriamente il carico. Si pensi per esempio ad un transistor NPN con guadagno pari a 120 e un relay di media potenza che richieda 300mA per  permettere all'interruttore di scattare. In questa situazione, sarebbe necessaria una corrente minima di base di 2,5 mA (senza considerare un over driving della base) per cui il PCF8574 non sarebbe idoneo per pilotare il relay, anche facendo uso di un transistor. Per risolvere il problema si dovrebbe cercare un transistor con Hfe almeno 5-10 volte superiore, cosa non facile a meno di utilizzare due transistor o transistor con integrati due transistor in configurazione Darlington.  
Il limite della corrente al livello alto delle uscite, pone dei vincoli anche nel caso in cui si vogliano pilotare dei transistor MOS, che diversamente dai transistor BJT sono componenti in “tensione” e non in “corrente”. La modulazione della  corrente sul carico avviene rispettivamente per mezzo della tensione di gate per il MOS e della corrente di base per il BJT.
Un potenziale problema derivante dalla corrente in uscita si ha per la resistenza di pull-down necessaria per vincolare il gate a massa (rendendolo normalmente disattivo). Oltre a questo problema, l'impossibilità di fornire grandi correnti limita anche la massima frequenza con cui eventualmente può essere attivato e disattivato il MOS. In applicazioni in cui fossero richieste rapide transizioni sul gate del MOS, è bene far uso di driver appositi per pilotare il gate di transistor MOS, al fine di fornire rapidamente la corrente di carica per la capacità di gate e permettere allo stesso tempo una rapida scarica dello stessa. In ogni modo un limite sulla frequenza massima viene imposto comunque dalla frequenza del bus.
 

Utilizzo del PCF8574 per estendere gli ingressi

Una delle caratteristiche più interessanti del PCF8574 è quella di poter essere utilizzato sia per espandere le uscite che espandere gli ingressi. Se infatti potesse espandere solo le uscite, facendo uso di 2-3 pin del microcontrollore, sarebbe comunque possibile utilizzare uno shift regiter al fine di estendere le uscite, a costi forse minori. Il PCF8574 permette invece di utilizzare ogni pin sia come ingresso che come uscita, permettendo dunque di estendere in maniera modulare anche gli ingressi. In particolare, allo stesso modo delle uscite sarebbe possibile avere fino ad un massimo di 64 ingressi e facendo uso del PCF8574A si potrebbero avere altri 64 ingressi. Una caratteristica interessante degli ingressi del PCF8574 è che non devono essere impostati per essere tali. Per tale ragione il datasheet chiama i pin della porta del PCF8574 come pseudo I/O. Questo non è in generale valido qualora si utilizzi un pin di un microcontrollore, per il quale bisogna specificare se deve lavorare come ingresso o come uscita.
Unica richiesta al fine di poter utilizzare un pin come ingresso è che il pin d'interesse sia posto a livello alto. Per tale ragione si ha che tutti i pin del PCF8574 vengono posti ad 1 all'accensione del dispositivo stesso. Questa impostazione di default è come se impostasse tutti i pin come ingressi, o vedendo i pin come uscite è come se venissero impostate ad 1 (livello alto).
Il fatto di poter utilizzare ogni pin come input senza dover impostare nulla giustifica la presenza del generatore di corrente da 100uA riportato in Figura 5. Quando il pin è impostato a livello logico alto, il PMOS (ramo alto) è attivo mentre l'NMOS (Ramo basso) è disattivo. In questa situazione cortocircuitando verso massa l'uscita, che in realtà vogliamo utilizzare come ingresso, si ha che la corrente che circolerà verso massa è proprio pari a 100uA (potete provare con un tester).

Figura 5: Schema a blocchi del singolo pin del PCF8574  (Datasheet Texas Instrument)

Figura 5: Schema a blocchi del singolo pin del PCF8574  (Datasheet Texas Instrument).

Quanto detto dovrebbe aver chiarito il funzionamento del PCF8574 quando lo si voglia utilizzare per estendere gli ingressi. In particolare dal momento che gli ingressi, al fine di poter essere utilizzati richiedono che le uscite siano a livello alto, vuol dire che non sono necessari resistori di pull-up al fine di mantenere il livello logico sul pin stabile anche quando il pulsante è aperto.
Uno schema applicativo in cui si usano alcuni dei pin del PFC8574 come ingressi, è riportato in Figura 6.
 

Figura 6: Schema di esempio d'utilizzo di un PCF8574 con 4 pin usati come ingressi

Figura 6: Schema di esempio d'utilizzo di un PCF8574 con 4 pin usati come ingressi.

Dalla Figura 6 si evince che uno stesso integrato PCF8574 può essere utilizzato con alcuni pin utilizzati come uscite ed altri pin come ingressi.
Si fa notare che i pulsanti sono collegati verso massa, dunque la loro pressione è individuata da uno 0, ovvero livello logico basso. Non è possibile porre le uscite a 0 ed utilizzare il pin come ingresso, ponendo il pulsante a Vcc (cercando quindi di vedere la pressione del pulsante con un livello alto). In questo modo infatti il pin si troverebbe con l'NMOS attivo e alla pressione del pulsante si cortocircuiterebbe l'uscita verso Vcc. Non essendo presente il generatore di corrente per limitare la corrente a 100uA si potrebbe danneggiare l'integrato.

In ultimo si ricorda che ad ogni variazione di stato di un ingresso si ha la generazione di un interrupt, ovvero l'uscita INT viene posta a massa (Open Drain).  Questo permette, d'interrompere il microcontrollore e forzare una lettura dello stato dei pin usati come ingressi. L'interrupt, viene generato ad ogni variazione del pin usato come ingresso, ovvero su ogni fronte. L'interrupt viene disattivato ad una lettura/scrittura della porta o al ripristino del livello logico originario.

I pin che sono utilizzati come uscite, qualora la porta del PCF8574 dovesse essere letta al fine di leggere lo stato dei pulsanti, verranno letti con il livello logico impostato sull'uscita. É bene dunque che i bit non utilizzati vengano ignorati per mezzo di una maschera. Per esempio volendo porre a zero i 4 bit più significativi, si potrebbe procedere nel seguente modo:

valore_porta = valore_porta & 0x0F;

ovvero facendo un AND con con il valore esadecimale 0x0F.
 

Utilizzo della libreria C per PCF8574

Il PCF8574 è una periferica I2C, e come tale deve rispettare il protocollo I2C. In questo breve paragrafo non si spiegherà il protocollo I2C, si presume che il lettore abbia già letto il Tutorial “Il protocollo I2C”.

Il PCF8574 è una periferica che può lavorare al massimo a 100KHz, per cui la sezione del bus I2C d'interesse deve lavorare a questa velocità (o valori inferiori) al fine di evitare errori di trasmissione o malfunzionamenti.

Come per molte periferiche I2C, qualora si abbia a disposizione una libreria bella e pronta si possono ignorare molti dettagli sul protocollo. La libreria LaurTec per PIC18 possiede una libreria dedicata al PCF8574 permettendo un facile utilizzo dello stesso, sia esso la versione PCF8574 che la versione PCF8574A.
Al fine di poter utilizzare la libreria bisogna includere il file PCF8574.c nel proprio progetto. Bisogna inoltre includere il file PCF8574.h o per mezzo della direttiva #include “PCF8574.h” o includendo direttamente il file header nel progetto. Si ricorda che è necessario impostare i percorsi di libreria aggiungendo il percorso del progetto della libreria tra i percorsi Include Directories.

La libreria possiede le seguenti funzioni:

signed char PCF8574_write_data(unsigned char control, unsigned char data );
signed char PCF8574_read_data(unsigned char control, unsigned char *data);


Che permettono rispettivamente di scrivere e leggere sul PCF8574.
Entrambe le funzioni ritornano i seguenti codici di errori:

1: The byte has been properly read/written
-1: Bus Collision error
-2: Not Ack error condition
-3: Write collision


Tra i parametri che è necessario passare vi è la variabile control. Questo rappresenta il byte composto dall'indirizzo interno del PCF8574 o PCF8574A e il valore dei pin d'indirizzo utilizzati (il bit R/'W deve essere sempre posto a 0 sia in lettura che in scrittura). Per esempio collegando a massa i pin A0, A1, A2 ed utilizzando un PCF8574, dalla Figura 2 è possibile vedere che il valore da inviare è 0100 0000 ovvero 0x40. Se si facesse uso di un secondo PCF8574 con A0 = Vcc e A1, A2 collegati a massa si ha che la variabile control deve valere 0100 0010, ovvero 0x42. In questo modo facendo uso delle stesse funzioni, semplicemente impostando la variabile control è possibile indirizzare tutti i dispositivi. Grazie al modo con cui è gestita la variabile control è possibile utilizzare con la stessa libreria sia il PCF8574 e il PCF8574A.

La funzione di write richiede come secondo parametro il byte da inviare, mentre la funzione di read richiede l'indirizzo della variabile in cui scrivere il dato letto.
Si ricorda che l'indirizzo di una variabile, in C, viene fatto nel seguente modo:

unsigned char dato_letto;
.
.
.
PCF8574_read_data (0x40, &dato_letto);


La libreria è dunque piuttosto facile da usare, si include il file .c e si usano le funzioni di lettura e/o scrittura. In realtà la libreria, con la sola inclusione dei file, non può ancora essere utilizzata infatti richiede che l'utente apra il modulo I2C impostando la frequenza d'interesse.

Per esempio per lavorare a 100KHz con un quarzo a 20 MHz si deve scrivere il seguente codice in C18 prima di poter usare le funzioni di lettura e scrittura verso l'integrato PCF8574:

// Inizializza il modulo I2C a 100KHz @20MHz
OpenI2C(MASTER, SLEW_OFF);
SSPADD = 49;


La funzione OpenI2C è una funzione standard offerta dalla Microchip per gestire il modulo I2C. In particolare il suo utilizzo richiede l'inclusione del file i2c.h, ma dal momento che questo è già incluso nel file PCF8574.h, non è necessario includerlo una seconda volta.

Per maggiori dettagli sul come utilizzare la funzione OpenI2C e come impostare il registro SSPADD, qualora si faccia uso di frequenze di clock diverse da 20MHz, si rimanda al capitolo sull'I2C del testo C18 Step by Step.

Un semplice esempio eseguibile con Freedom II, in cui si usa la libreria PCF8574 è riportato nel progetto scaricabile alla fine di questa Brief Note. Il progetto non fa altro che accendere il terzo LED di Figura 6 e leggere in continuazione il valore in ingresso (facendo uso della tecnica del polling). Il valore letto viene visualizzato sui LED della PORTD.  Lo schema di Figura 6 può essere collegato alla scheda Freedom II facendo uso della scheda di espansione. Si fa presente che i resistori di pull-up R4, R5, R6 di Figura  6 non sono necessari poiché già presenti su Freedom II (per la linea d'interruzione bisogna usare il pin RB2 ed impostare il Jumper JP9, mentre per le linee SDA e SDL far riferimento al datasheet del PIC usato).
Ulteriori esempi possono essere trovati nel Forum nel seguente Thread.

L'integrato PCF8574 è disponibile alla sezione Servizi del sito.

Bibliografia:

1 : PCF8574: Datasheet Texas Instrument

2 : Produttore di PCB RAYMING Technology: https://www.raypcb.com/

 

Tipo File Scarica File Descrizione

Formato File zip

Download

Esempio di utilizzo della Libreria

Formato File zip

Download Libreria C18 per la gestione del PCF8574

 

 

 

 

 

 

 

 

 

 

 


You don`t have permission to comment here!

Registrati al sito

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

Registrati al sito LaurTec.

Login