LCD con caratteri a matrice
|
L'
interfaccia hardware
Di base, il controller del display è accessibile attraverso un bus
parallelo a 8 bit, più tre bit di controllo.
denominati RW, RS e E. Dato che i pin dei microcontroller non paiono mai abbastanza, HD 44780 può
essere comandato anche con soli 4 bit paralleli e 2 bit di
controllo: se non si utilizza
la lettura della memoria o del flag BF, sono sufficienti solo RS e E.
In una comunicazione con bus a 8 bit, siccome comandi e dati
sono a 8 bit, per scrivere sul display basta questa sequenza:
-
porre i dati sul bus
-
aggiustare RS e RW per l' operazione voluta
-
dare un impulso alto sul pin E
-
riportare E a livello basso
La cattura dei dati sul bus viene effettuata dal controller
sul fronte di discesa dell' impulso E.
Analogamente per la lettura, dove E a livello alto abilita il
controller all' emissione sul bus dei dati richiesti.
Di conseguenza il bus è bi direzionale e, dal lato microcontroller, va
configurato come uscita o ingresso a seconda di quale operazione si voglia
effettuare.
Sul lato del controller del display, la commutazione ingresso-uscita del bus
dipende dallo stato della linea di controllo RW (1 per la lettura, 0 per la
scrittura).
Se però utilizziamo un bus a 4 bit, siccome comandi e
dati sono in ogni caso a 8 bit, per scrivere sul display occorre effettuare due
successive scritture a 4 bit:
-
porre il nibble alto dei dati sul bus
-
aggiustare RS e RW per l' operazione voluta
-
dare un impulso sul pin E
-
porre il nibble basso dei dati sul bus
-
ripetere l' impulso su E
In questo modo sarà il controller del display, al suo
interno, a ricostruire il dato a 8 bit ed a interpretarlo.
Analogamente per la lettura dove occorre leggere due volte il
bus a 4 bit per recuperare il dato a 8 bit.
Il diagramma qui sotto esemplifica l' andamento dei segnali.
Va da se che una connessione a 4 bit salverà linee, ma
penalizzerà il tempo di esecuzione rispetto alla connessione a 8 bit.
Molto importante da considerare è il fatto che:
durante l' esecuzione di un comando NON è possibile inviare
nulla al display
Ogni cosa inviata al controller durante la fase di
esecuzione del comando va perduta. |
La cosa ha una importanza rilevante dato che i tempi di
esecuzione dei comandi vanno da circa 40 us a oltre 1.5 ms, che, per il ciclo
di istruzione di un microcontroller con un clock veloce sono una enormità: a 10
MHz di clock, un PIC ha un ciclo di istruzione di 200 ns, ovvero può
effettuare oltre 7000 istruzioni nel tempo in cui il display esegue un comando
di Home
del cursore.
Come abbiamo detto, ogni cosa inviata al controller durante la fase di
esecuzione del comando va perduta, ma, nel caso peggiore, si vengono a creare
problemi al controller stesso, che riceve dati o camandi in modo parziale
o irregolare, fino a rendere necessario un reset per poterne
prendere di nuovo il controllo.
Questa situazione è risolvibile in due modi:
-
utilizzando un flag interno del controller, chiamato BF (Busy Flag)
: infatti il suo valore può essere letto in ogni momento. Se è a
livello 1 il controller è impegnato; quando torna a livello 0 si può
riprendere l' invio di dati o comandi
-
oppure si può utilizzare una attesa calibrata tra un
comando e il successivo, dato che i comandi hanno uno specifico tempo di
esecuzione, determinato dal clock del controller
Il primo modo richiede la possibilità di leggere dal
controller, quindi la possibilità che la linea RW possa andare sia a 1 che a
0.
Il secondo modo non richiede una lettura e quindi il pin RW può essere
fissato a massa per la sola scrittura, recuperando un I/O del microcontroller.
Per contro, il tempo di esecuzione dei comandi fornito dai fogli dati è un
"massimo" ed è probabile che l' esecuzione sia effettuata in un
tempo minore; di conseguenza, la lettura di BF mediamente accelera l' accesso
al display, anche se richiede un pin in più e una adeguata gestione della
fase di lettura.
All' atto pratico raramente può essere necessario recuperare anche quei pochi
micro secondi dati dall' uso di RW e quindi i due sistemi sono da considerarsi
equivalenti. Spesso si preferisce il secondo in quanto si salva un I/O del
microcontroller e una connessione al modulo del display.
|
Dal punto di vista hardware, questi moduli LCD sono stati
progettati per poter essere mappati sul bus di un
microprocessore
(6802, Z80, 8080, ecc).
Ecco alcuni esempi applicativi per MPU Z80 e 8085.
Il modulo LCD viene inserito sul bus delle periferiche di
I/O.
. |
|
Viene richiesta una più o meno complessa logica di interfaccia per
adeguare i segnali di controllo del bus del microprocessore agli
ingressi del modulo.
Nel caso di bus con clock ad alta frequenza potrà essere
necessaria la generazione di stati di wait per adattarsi alle
temporizzazioni relativamente lente del controller del modulo LCD. |
In generale, però, la destinazione di questi moduli è quella
di dipendere da un blocco di I/O (PIA e VIA di 6502, PIO di Z80, ecc), cosa
che diventa obbligo nel caso di collegamento ad un microcontroller.
in queste condizioni, la generazione dei giusti tempi di esecuzione è
lasciata interamente al software di controllo.
La possibilità di accedere sia a
4 che a 8 bit sul bus e di usare o meno la linea RW da origine a quattro diverse possibili configurazioni:
- 8 bit paralleli
- 3 bit di controllo
Vengono impegnati in tutto
11 pin di I/O.
Ne va aggiunto uno se si utilizza un comando remoto per la retro
illuminazione.
Questo è il modo che
impegna più I/O, ma che consente la massima velocità di trasferimento tra
il microcontroller e il display, dato che il controllo del flag BF consente
al micro di agire prontamente con un comando successivo verso il display.
|
|
- 8 bit paralleli
- 2 bit di
controllo
Vengono impegnati in
tutto 10
pin di I/O.
Ne va aggiunto uno se si utilizza un comando remoto per la retro
illuminazione.
Questo modo richiede temporizzazioni fisse per l'
esecuzione dei comandi, non potendo leggere lo stato di BF. Questo
penalizza il tempo di trasferimento in quanto spesso il controller del
display impiega meno tempo del massimo indicato sui fogli dati per
completare un comando, ma salva
un pin rispetto al collegamento precedente.
Occorre collegare a
massa il pin RW sul connettore del display.
|
|
- 4
bit paralleli
- 3 bit di controllo
Vengono impegnate 7 linee
di I/O. Ne
va aggiunto uno se si utilizza un comando remoto per la retro
illuminazione.
L' interfaccia a 4 bit
salva 4 I/O rispetto alle precedenti a 8 bit, ma costringe l' host a trasmettere
dati e comandi in due tempi successivi, rallentando le operazioni sul
display.
Occorre collegare a
massa i 4 bit del nibble basso sul connettore del display. Sul lato
microcontroller è indifferente utilizzare il nibble alto D7:4) o basso
(D3:0) del port.
|
|
- 4
bit paralleli
- 2
bit di controllo
Vengono impegnate
6
linee di I/O. Ne
va aggiunto uno se si utilizza un comando remoto per la retro
illuminazione.
La connessione salva 5 I/O rispetto al bus completo a 8 bit + 3
controlli, in cambio di un ulteriore rallentamento nel trasferimento di
dati e comandi.
Occorre collegare a
massa i 4 bit del nibble basso e il pin RW sul connettore del
display.
Sul lato microcontroller è indifferente utilizzare il nibble alto o basso
del port.
|
|
Un particolare riguarda i pin D0-D3 nella configurazione a 4
bit.
Questi pin, una volta inviato il comando di interfaccia a 4 bit, non vengono
più considerati in alcun modo dal controller.
Solitamente si collegano alla Vss in quanto questo li porta sicuramente
a potenziale 0 ed evita qualsiasi possibilità di captazione di disturbi
elettromagnetici. In effetti, solitamente i pin RS e RW e le linee dei dati
dispongono di un pull-up all' interno del controller. Questo consente di
utilizzare per il comando anche driver open collector e, in ogni caso,
fornisce un potenziale fisso ai pin non collegati ed una terminazione alle
linee di collegamento tra I/O del microcontroller e modulo LCD. In questo senso, D0-D3
potrebbero anche essere lasciati non collegati, dato che alla
polarizzazione ci pensano i pull up. Però, non costa nulla collegarli a massa
ed ottenere una migliore immunità ai disturbi.
Da notare che il pin E, al contrario degli altri, solitamente NON dispone
di pull-up (è attivo a livello alto).
La scelta scelta di un sistema di interfaccia o dell' altro dipende più che altro
dai pin di I/O disponibili sul microcontroller, dato che, come detto prima, differenze di
pochi microsecondi nell' esecuzione degli accessi sono generalmente trascurabili. Se però è necessaria la massima performance,
occorre usare la connessione a 8 bit, che evita il doppio ciclo di
scrittura.
Come consiglio pratico, è meglio usare per il bus dati i 4 o 8 bit appartenenti ad
un solo port : questo evita complicate contorsioni del software per
allineare i bit se si sono utilizzati pin appartenenti a port diversi. Nulla vieta di usare pin sparpagliati su vari
port, ma
provare per credere: l' uso di un solo port è molto, molto più pratico e
la possibilità di trovarsi senza almeno 4 bit consecutivi su uno stesso port
è molto remota.
Nel caso in cui fosse indispensabile usare il minimo numero di pin
probabilmente è più opportuno implementare una interfaccia seriale (SPI,
I2C, shift register) tra il microcontroller e il display oppure usare uno dei
tanti display con il controller già predisposto per l' accesso seriale (KS0073,
ST7036U, ecc).
In questo modo il numero dei pin richiesti all' I/O del microcontroller
si riduce a 2 o 3 che possono appartenere a port diversi, con una minima complicazione del
driver nel caso di impiego dei moduli integrati per le comunicazioni seriali.
I pin di controllo (RS, RW, E), invece, possono anche essere distribuiti
in vari port : dal punto di vista del software di gestione non ci sono
differenze.
Nel caso di comunicazione a 4 bit è
possibile far stare tutte le connessioni al modulo del display in un solo port, dato che sono al
massimo 7 fili. L' ottavo pin potrà essere usato per comandare la retro
illuminazione.
Infatti, se si utilizza la retro illuminazione comandata dal
microcontroller, occorre considerare la necessità di un I/O in più.
Da osservare che, se le connessioni tra microcontroller e display sono
lunghe più di una ventina di centimetri, il cavo può costituire un
problema in quanto degrada i segnali a causa della sua capacità e
induttanza parassite.
In tal caso può essere utile inserire un pull-up
esterni sulle varie linee.
Attenzione perchè si è verificato che il fan out di alcuni controller
è piuttosto limitato, per cui l' aggiunta di carichi sulle linee del
bus, che sono quelle che potranno essere pilotate in lettura dal display,
porta a errori nel trasferimento dei dati. Questo accade se si utilizzano
le linee del bus per accedere ad altre periferiche multiplexate, come ad
esempio una tastiera o dei LED.
Dal lato microcontroller il problema è relativo, in quanto, di solito, i
loro I/O possono pompare correnti consistenti; ad esempio, i PIC
hanno una capacità di 25 mA per pin e quindi comandano le linee di I/O con una
notevole sicurezza. Invece i buffer dei controller dei moduli LCD possono
trovarsi in difficoltà a comandare carichi di basso valore.
|
Una nota particolare per l' uso con i PIC di Microchip: non si sono mai
rilevati problemi nel caso in cui siano abilitati sul port del microcontroller
i weak pull-up, la cui presenza pare quindi indifferente anche a moduli
con fan out basso.
Se, però, la distanza tra il display e il microcontroller è elevata,
la soluzione non è quella di allungare i cavi di connessione, perchè, come
stiamo vedendo, servono a veicolare segnali abbastanza veloci.
L' unica
soluzione sensata è quella di utilizzare una connessione seriale, con un
driver adeguato, genere RS-323/RS-485
o, comunque, interporre un buffer, magari differenziale, a seconda della distanza.
Si possono così coprire distanze anche di decine di metri tra microcontroller
e display.
In relazione a collegamenti seriali, è
opportuno ricordare che protocolli del genere clock+dato (shift register, SPI)
sono molto robusti intrinsecamente rispetto alle temporizzazioni, nel senso
che il processo di trasmissione degli shift register può essere
arrestato e mantenuto in sospeso in un certo stato per un tempo indeterminato
e poi ripreso, dato che il clock è separato dai dati.
Questo è adeguato alla gestione dei moduli LCD, che sono periferiche molto
lente, con tempi di reazione da qualche decina a qualche migliaio di
microsecondi; tipicamente un driver per LCD a caratteri non utilizza interrupt,
ma può essere interrotto in qualsiasi momento da altri processi senza che la
comunicazione tra microcontroller e modulo sia danneggiata.
Diversa è l' operazione con seriali asincrone, in cui la
temporizzazione fa parte del segnale stesso; in questo caso la trasmissione di
un dato o comando verso il modulo LCD non potrà essere sospesa o disturbata,
pena la ricezione da parte del modulo di dati o comandi errati e diventa
consigliabile utilizzare periferiche integrate come UART/USART.
Va compreso
che questi moduli sono "intelligenti" nel senso che sono in grado di
gestire autonomamente la complicata attività relativa alla presentazione dei
caratteri sul pannello LCD, ma sono previsti per interfaccia parallela e
rispondono rigidamente al loro set di comandi.
In questo senso si potrà osservare che moduli LCD con interfaccia SPI, I2C o,
in generale, clock + dato, realizzano controller specifici (ad
esempio Sitronix ST7036), mentre moduli con interfaccia RS-232, RS-485 o USB
sono realizzati aggiungendo un microcontroller con le relative interfacce, cablato a bordo
del modulo o del circuito di supporto.
Ne deriva la presenza sul mercato di numerosi modelli del genere, anche con
tastierino integrato, previsti per il collegamento con PC (e le sue interfacce
tipiche: COM e USB) e per la gestione con linguaggi ad alto livello (BASIC,
C).
|