Tutorials - Elettronica

 

 

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:

  1. 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

  2. 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).


 


  • Copyright © afg. Tutti i diritti riservati.
    Aggiornato il 12/01/13.