Un microcontrollore è dotato di un numero limitato di Input e output (GPIO) porte. Tuttavia, alcune applicazioni potrebbero richiedere più porte che sono disponibili sul microcontrollore. In tal caso, GPIO expander può essere utilizzato per aumentare la capacità I/O del microcontrollore. MCP23008 è uno di questi dispositivi (prodotto dalla Microchip Technology), che fornisce una facile espansione I/O con 2 fili interfaccia seriale
Questo interessante tutorial illustra come aggiungere un ulteriore porta I/O a 8-bit per PIC12683 microcontrollore (che ha solo 6 pin I/O) utilizzando MCP23008. Un segmento di sette display a LED e un interruttore al tatto sarà collegato alla porta estesa. Il microcontrollore PIC12F683 conterà le presse dell’interruttore e visualizzerà il valore del contatore sul modulo a sette segmenti a LED. Il MCP23008 è uno slave I2C che fornisce 8-bit, general purpose, bi-direzionale di I/O per bus I2C.
I2C, acronimo di Inter Integrated Circuit, un sistema di comunicazione seriale bifilare utilizzato tra circuiti integrati. Il classico bus I2C è composto da almeno un master ed uno slave. La situazione più frequente vede un singolo master e più slave; possono tuttavia essere usate architetture multimaster e multislave in sistemi più complessi.
Alcuni registri del MPC23008 possono essere riassunti nel seguente modo:
(IODIR): controlla la direzione dei dati I/O. Quando un bit è impostato, il pin corrispondente diventa un ingresso.
Interrupt-on-change Control Register (GPINTEN) : controlla la funzione di interruzione per ogni pin.
Default Comparison Value (DEFVAL) : Il valore di confronto predefinito è configurato nel registro DEFVAL.
PIC12F683 non ha modulo hardware I2C e, quindi, la comunicazione I2C con MCP23008 è realizzata tramite software utilizzando pin I/O (GP0 per SCL e GP1 per SDA). Un ingresso Interruttore tattile è collegato a GP7, mentre GP0 attraverso GP6 sono definiti come uscite e guidano i segmenti di un LED a 7 segmenti. L'interruttore di tatto non richiede una resistenza esterna di pull-up. L'uscita di interrupt del MCP23008 viene letto da GP2 pin del PIC12F683.
PIC è una famiglia di circuiti integrati a semiconduttore con funzioni di microcontrollore. Microchip Technology non usa il termine PIC come un acronimo; il suo nome aziendale è: "PICmicro". Anche se generalmente sta per "Programmable Interface Controller", il suo primo produttore la "General Instrument" usava l'acronimo per "Programmable Intelligent Computer". Il set di istruzioni del PIC ne comprende 33 nelle versioni di bassa potenza e fino a 77 in quelli con prestazioni più elevate. Ogni istruzione per essere eseguita impiega 4 cicli di clock. Tranne le istruzioni che comportano un salto all'interno della memoria (GOTO, CALL, RETLW) che impiegano 8 cicli, nelle versioni recenti vi sono altre istruzioni che impiegano 8 cicli come quelle di trasferimento dati tra memoria e memoria (MOVFF). L'architettura è di tipo Harvard a bus separati; i bus dati e controllo sono a 8 bit le istruzioni hanno un formato a 12, 14 o 16 bit. Nelle ultime versioni è stata implementata un'architettura a 16 bit. Esiste anche il bus dello stack a partire da 9 bit in su.
Dal momento che PIC12F683 non ha un modulo I2C, la comunicazione I2C, nella nostra applicazione, è realizzata utilizzando mikroC di routine di libreria Soft_I2C, che sono indipendenti di hardware e può essere implementato a qualsiasi pin GPIO. Nel nostro esperimento, GP0 - GP6 pin di MCP23008, sono utilizzate come uscite e GP7 come input. La routine seguente inizializza MCP23008 con pull-up interno e interrupt abilitato su GP7.
Delay_ms(10);
Soft_I2C_Start(); // Issue start signal
Soft_I2C_Write(0x40); // Slave Address + Write bit
Soft_I2C_Write(0x00); // Select IODIR register
Soft_I2C_Write(0x80); // GP0-GP6 O/P, GP7 I/P
Soft_I2C_Write(0x00); // IPOL Soft_I2C_Write(0x80); // GP7 Interrupt-on-change Soft_I2C_Write(0x80); // GP7 Def value 1
Soft_I2C_Write(0x80); // Interrupts on GP7 compares to DEFVAL
Soft_I2C_Write(0x22); // Disable further sequential write operation
Soft_I2C_Stop(); // Enable resister pull-up on GP7
Soft_I2C_Start(); // Issue start signal
Soft_I2C_Write(0x40); // Address + Write bit
Soft_I2C_Write(0x06); // Select IODIR register
Soft_I2C_Write(0x80); // GP7 pull-up
Soft_I2C_Stop();
}
Si può osservare come si sta utilizzando l’operazione di scrittura sequenziale attraverso registri IODIR. Successivamente la scrittura sequenziale è disabilitata e il registro GPPU è configurato separatamente. L’indirizzo di 7 bit, nel esempio qui in questo articolo, è configurato a 0100000. Per operazione di scrittura, il byte di controllo è, quindi, 40H (0100 0000), e per operazione di lettura, è 41H.
Personalmente non ho mai utilizzato gli I/O expander I2C (forse una volta sola) perche ho sempre risolto la carenza di input/output tramite registri seriali. Ovviamente per motivi di costi di produzione. Il famoso 4094 risolve tutti i problemi di output ed il 4051 quelli di input. Ovviamente possono essere collegati piu dispositivi sulla stessa linea di comando enable, data e clock.
Inoltre la scelta di un micro sovradimensionato a volte è un bene a livello di memoria flash (non si sa mai con le modifiche future) e quindi va da se che arrivino anche piu I/O se si sceglie un micro con maggiore memoria.
Nell’esempio vedo che viene pilotato un display lcd, cosa che si poteva fare con un 4094 ad un quinto del costo.
Bisogna però dire che la soluzione di un unico chip anche per l’ingresso, tasto SW1, è sicuramente piu elegante e che i costi degli i/o expander sono in diminuzione.
Sicuramente componente da valutare nelle varie applicazioni
Con la famiglia Microchip puoi sviluppare tantissime applicazione, come del resto con tutte le altre famiglie di microcontrollori. Poi questo progetto non lo trovo per niente interessante, se non per la presentazione dell’/io expander. Si tratta di un display driver a sette segmenti e di leggere un tasto…
Per non parlare poi delle routines i2c scritte in mikroc… e la chiamano progettazione… bah
Si, la limitazione in termini di lettura/scrittura sugli i/o è data dal bus i2c. Anche se 400KHz non sono pochi per monitorare ingressi ed uscite, in genere sono piu che sufficienti nella maggior parte delle applicazioni.
Inoltre alcuni i/o expander sono dotati anche di interfaccia SPI che è sicuramente piu veloce ecco un articolo sui due bus
http://it.emcelettronica.com/comunicazione-seriale-i2c-o-spi-quale-usare
Comunque concordo con te, anche se avere “un’arma” a disposizione in piu quando si progetta, fa sempre comodo 😉
Non so se il gioco vale la candela. Perche’ non comprare un pic con piu’ pin? Probabilmente costa meno che comprare un pic con pochi pin e un I/O expander. Inoltre la frequenza di toggling delle uscite dell’ MPC23008 e’ limitata dalla frequenza dell’I2C che va 400 kHz. Non vedo benefici, correggimi se sbaglio!
non c’è dubbio che puoi fare tante applicazioni…l’importante è capire quali!