Espandere le porte I/O di un microprocessore

espandere le porte I/O di un microprocessore

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 bus

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.

schema elettrico

circuito

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.

void Init_MCP23008(){
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.

5 Comments

  1. mdipaolo 6 settembre 2011
  2. Emanuele 27 luglio 2011
  3. Bazinga 27 luglio 2011
  4. Emanuele 27 luglio 2011
  5. brazov2 27 luglio 2011

Leave a Reply