Expander MCP: Controllare un keypad 4x

I port expander sono uno strumento molto utile in quei casi in cui il microcontrollore non disponga di un sufficiente numero di linee di comunicazione. Nel presente articolo si mostrerà come sfruttarli per interfacciare un micro ed un keypad 4x4, impiegando solo 3 linee dati del micro.

Nella progettazione di sistemi embedded un vincolo importante da considerare è il numero di pin disponibili del sistema a microcontrollore scelto. Spesso il fallimento  di un progetto può dipendere proprio dalla scelta errata del modello di micro, dotato di un numero di pin inferiore rispetto a quello necessario a pilotare tutte le periferiche. D’altro canto anche una pianificazione attenta e l’adozione di margini di sicurezza non sempre permettono di ottenere il risultato  migliore. La soluzione ottimale in questi casi è quindi quella di selezionare  il micro sulla base delle altre specifiche (come consumo di potenza, interfacce, capacità di elaborazione) e poi aumentare  il numero di linee mediante dispositivi di espansione, detti: port expander. Essi consentono di ottenere un numero di pin molto elevato a fronte di un’occupazione di soli 2 o 3 pin del micro. Si tratta di una particolare classe di dispositivi, generalmente di tipo slave, collegati su un unico bus di comunicazione seriale. Il micro, tramite interfaccia I2C o SPI, seleziona la linea desiderata ed effettua l’operazione di lettura o scrittura.

Figura 1: i port expander garantiscono una grande flessibilità in fase di progettazione, poiché consentono di aggiungere un numero elevato di linee al microcontrollore. Essi sono dispositivi slave che si interfacciano con il master (micro) su di un bus di tipo I2C.

Figura 1: i port expander garantiscono una grande flessibilità in fase di progettazione, poiché consentono di aggiungere un numero elevato di linee al microcontrollore. Essi sono dispositivi slave che si interfacciano con il master (micro) su di un bus di tipo I2C.

La figura 2 mostra una tipica configurazione del bus con i  port expander. L’indirizzo di ciascuno slave è determinato da 7 bit, ossia 128 dispositivi (= 27); in realtà nella maggior parte dei casi il programmatore potrà selezionare solo un sotto gruppo di tali 7 bit.

Figura 2: l’indirizzo del dispositivo è selezionato tramite i relativi pin presenti sul chip

Figura 2: l’indirizzo del dispositivo è selezionato tramite i relativi pin presenti sul chip

Ad esempio, nel caso del port expander MCP23008 della Microchip (figura 2) solo tre bit saranno selezionabili tramite i pin A2, A1 e A0; questo consente di collegare sul bus fino a 8 moduli (= 23). Considerato che il chip fornisce 8 linee di ingresso/uscita, si avranno ben 64 linee complessivamente che potranno essere aggiunge al proprio progetto. Tutto questo “sprecando” solo le due linee I2C del micro! I pin del port expander agiscono da pin satelliti per il processore, ampliando il suo raggio d’azione per svolgere operazioni come controllo di un pannello frontale (commutatori o LED), abilitazione e disabilitazione di altri dispositivi e quant’altro si possa pilotare con i  pin di un micro. Il  grande vantaggio consiste nel poter aggiungere a piacimento delle linee, eventualmente prevedendo il dispositivo nel progetto e montandolo solo se è richiesto. Oltre al numero di linee del PE, che rappresenta la caratteristica fondamentale, esistono delle varianti che consentono di gestire delle uscite con PWM. Queste possono essere utili per modificare la luminosità dei LED o per il controllo di motori brushless DC. Un altro aspetto da valutare nella scelta di un port expander è la sua modalità di configurazione.  I modelli più avanzati dispongono di una memoria non volatile che consente di salvare la configurazione dei pin (direzione, stato dell’uscita).

Interfacciare un keypad 4x4

Un tipica applicazione che richiede un discreto numero di linee del micro è rappresentata dal controllo di un tastierino numerico o keypad dotato di 16 tasti (4x4). L’utilizzo di un port expander permetterebbe di ridurre notevolmente  il numero di porte utilizzate. Nell’articolo sarà descritto l’uso di un modello in particolare: il port expander MCP23X08 di Microchip [1]. La famiglia degli MCP23X08 è costituita da due differenti dispositivi:

» MCP23008, che rappresenta la versione con interfaccia I2C;

» MCP23S08, che rappresenta la versione con interfaccia SPI.

L’MCP23008 è uno dei port expander proposti da Microchip, dotato di interfaccia I2C. Il relativo  pinout è mostrato in figura 3.

Figura 3: pinout del port expander MCP23008.

Figura 3: pinout del port expander MCP23008.

Come si nota i pin A2, A1 e A0 consento di selezionare l’indirizzo del chip sul bus, portandoli ad “1” o a “0”. Questi dispositivi risulta appropriati per realizzare un controllo di un keypad, grazie a due fondamentali caratteristiche:

» la possibilità di poter configurare indipendentemente le 8 linee come input o come output;

» la possibilità di poter gestire un linea di interrupt per effettuare la scansione e quindi velocizzare la risposta del dispositivo.

Linee di input ed output

Ci sono 3 linee di controllo del chip, come di seguito descritto:

1-Registro GPPU (GPIO Pull-Up Resistor). Esso controlla in modo indipendente la selezione del resistore di pull-up di 100k  . Se la corrispondente linea è impostata ad 1 allora il resistore  è selezionato.

2-Registro IODIR (I/O Direction). Esso controlla la direzione (input o output) di ciascuna  linea. Il valore “1” configura la linea come ingresso.

3-Registro GPIO (General Purpose I/O Port). Esso rappresenta  il valore da scrivere sulle linee (se configurate come uscita) oppure il valore da leggere (se configurate come ingresso).

Interrupt-on-change

A differenza di altri port expander,  il modello MCP23X08 dispone anche di una linea di interrupt (INT) che potrà essere gestita da un micro esterno in una delle due seguenti modalità:

1-L’interrupt scatterà quando almeno

una delle linee dati varierà il suo stato.

2-L’interrupt scatterà quando almeno una delle linee dati varierà il suo stato rispetto ad un valore di default.

Tale linea può essere configurata tramite il bit IOCON.INTPOL, per essere attivo basso oppure attivo alto. Per l’applicazione descritta sarà utilizza la modalità attivo basso.

Scansione del keypad

Un keypad è una matrice 4x4 costituita da 16 tasti e in questo esempio è stata collegata al port expander MCP23X08, come mostra la figura 4.

Figura 4: interfacciamento del port expander MCP23X08 con un keypad 4x4.

Figura 4: interfacciamento del port expander MCP23X08 con un keypad 4x4.

Le righe del keypad sono connesse al nibble alto del chip, mentre le colonne a quello basso. La figura 5 mostra il  diagramma di flusso delle operazioni da eseguire per il controllo del tastierino numerico:

■  1-Il chip MCP23X08 deve essere inizializzato dal micro.

2-Il micro deve determinare se è stato premuto un tasto. In caso affermativo, allora la MCU provvederà ad effettuare la scansione.

3-Il micro individuerà  il tasto che è stato premuto tramite una scansione prima delle righe e poi delle colonne.

4-Il micro attenderà che il tasto sia rilasciato.

Figura 5: diagramma di flusso per il controllo del keypad.

Figura 5: diagramma di flusso per il controllo del keypad.

In figura 6 è mostrata la condizione in cui l’utente preme un tast (evidenziato in verde).

Figura 6: tasto premuto, scansione delle righe.

Figura 6: tasto premuto, scansione delle righe.

Si riporta inoltre la configurazione e lo stato  di  tutti  i  registri  presenti nel MCP23X08. Per individuare la riga a cui appartiene il tasto premuto, sarà letto il valore contenuto nel registro INTCAP; si tratta di una registro in cui è memorizzato lo stato delle linee dati nel momento in cui scatta l’interrupt. Il nibble alto contiene lo stato delle quattro righe: ci saranno 3 bit al valore logico “1” ed uno solo a “0”. Quest’ultimo individua la riga in cui è stato premuto il tasto. Dopo aver effettuato la scansione delle righe, quando ancora il tasto è premuto, è necessario effettuare anche la scansione delle colonne per individuare univocamente il  tasto premuto. Per fare ciò è necessario  riconfigurare  i registri del port expander come così come mostrato in figura 7.

Figura 7: tasto premuto, scansione delle colonne.

Figura 7: tasto premuto, scansione delle colonne.

Il valore di riferimento in questo caso sarà contenuto nel registro GPIO. Riassumendo  i valori acquisiti:

RIGA = INTCAP     = 1110 0000
COLONNA = GPIO = 0000 1101

Sarà sufficiente  analizzare il nibble alto della variabile RIGA e quello basso della variabile colonna. La presenza dello zero in tali nibble indica la riga e la colonna in cui è stato premuto il tasto. In questo caso riga 4 e colonna 3. L’intersezione tra le due fornirà il tasto premuto. La figura 8 riporta il flow chart relativo alle operazioni di scansione della matrice del keypad.

Figura 8: diagramma di flusso della scansione.

Figura 8: diagramma di flusso della scansione.

 

 

 

Una risposta

  1. claudiol61 24 luglio 2018

Scrivi un commento

EOS-Academy