ESERCITAZIONE # 12b
Un driver universale per display LCD a
caratteri.
Abbiamo realizzato un driver per bus a 8 bit con RW.
Ma MPASM consente di fare di meglio: possiamo scrivere un driver unico che possa
essere utilizzato per varie implementazioni.
La direttiva #if è la chiave per scrivere un solo testo
sorgente che sarà compilato in modo differente a seconda delle condizioni
imposte. In base a quanto visto in precedenza, ecco un driver per display
LCD a caratteri di uso universale, ovvero adatto per qualsiasi controller e
modulo.
Nella realizzazione di questo driver sono stati considerati alcuni punti
essenziali:
- i moduli LCD possono essere differenti uno dall' altro non solo per il
numero di caratteri e di linee, ma anche per il controller che viene
impiegato
- questi controller, quando sono compatibili con il loro prototipo,
ovvero l' Hitachi 44780, possono differenziarsene per le temporizzazioni,
il set di comandi, le funzioni e l' inizializzazione. Il driver deve potersi
adattare quanto più possibile alle varie situazioni
- il driver deve comprendere una inizializzazione completa via software
- il driver deve considerare il clock del microcontroller nel range più
ampio possibile
- il driver deve comprendere il funzionamento sia utilizzando il pin RW sia
non utilizzandolo.
- il driver deve essere quanto possibile modulare e il software scritto deve
poter essere ri utilizzato al massimo
Per i punti 1 e 2, bisogna notare che la maggior parte dei lavori attorno
alla gestione di un LCD a caratteri considera solamente moduli con 44780, ma
questo chip costituisce una piccola parte di quanto disponibile sul
mercato. Una più ampia parte fa uso di altri chip, che possono differenziarsi
sia per il tempo di accesso che per la disponibilità di un set di comandi estesi o
per una diversa organizzazione della memoria DDRAM (ovvero degli indirizzi delle
varie linee), ecc. Il nostro driver tiene conto di questo, stabilendo una serie di
parametri che possono essere variati dall' utente per adattarsi al modulo in suo
possesso; questo adattamento avviene includendo un file di definizione delle
caratteristiche del
modulo nel sorgente del driver.
Se non viene inserito un file di definizione specifico, il driver contiene una
serie di parametri di default, come indicato. Questi sono di massima sicurezza,
consentendo un corretto funzionamento anche di moduli molto datati (compatibili
HI44780) collegati a microcontroller a clock elevato.
Per il punto 3, solitamente si fraintende o non comprende il senso
dell' inizializzazione via istruzioni e ci si basa solamente sull'
inizializzazione hardware dovuta all' arrivo della tensione di alimentazione.
Questo può essere adatto per alcune situazioni, ma non per altre. Una corretta
inizializzazione software permette di separare il reset del controller del
modulo LCD da quello del microprocessore.
Per il punto 4, solitamente i lavori disponibili sul WEB non tengono
in alcun conto le specifiche dei fogli dati e nemmeno le differenze di risposta
dei vari controller, anche in relazione alla tensione di alimentazione. Questo
può andare bene per applicazioni in cui il microcontroller gira con clock a
basse frequenze e a 5V, ma se si supera la decina di megahertz o si lavora con
tensioni di 3V, le cose possono cambiare
decisamente.
Il punto 6 ha dato origine ad una scrittura in cui la maggior parte del
codice è riutilizzabile e la creazione di un driver specifico per un differente
modulo LCD consiste nella variazione di poche righe.
Una spiegazione dettagliata dei moduli LCD a caratteri la trovate qui,
assieme a maggiori dettagli sui vari parametri e temporizzazioni di
lettura e scrittura. Tutti i dati specifici del modulo che state usando possono essere
facilmente rilevati dal foglio dati dello stesso.
Se pur è possibile scrivere un solo sorgente per le varie
possibili configurazioni dei collegamenti tra microcontroller e LCD, si è
preferito realizzare diverse versioni per:
-
collegamento a 8 bit, con o senza RW (10-11 fili)
-
collegamento a 4 bit, con o senza RW (6-7 fili)
-
collegamento seriale con modulo display dipendente da uno
shift register (3 fili)
Questo rende più facile comprendere ed eventualmente modificare il motore principale del driver. Gli statements
#if/#else/endif/#ifndef sono utilizzati
intensivamente
per far si che l' Assembler compili solamente le parti del sorgente volute.
Il driver, quindi, si adatta facilmente anche ad altre situazioni (connessione a
due fili, display seriali, ecc.) con poche modifiche esclusivamente sulla parte
di codice relativa alla comunicazione, lasciando invariato il restante.
Il package base è diviso in:
-
configuratore del controller LCD, che l' utente potrà
modificare per adattare i parametri a quelli del modulo che sta usando
-
configuratore dell' I/O, per adattare il driver alla
configurazione hardware scelta
-
subroutines, il core del driver
-
set di macro per semplificare l' uso dei comandi
-
libreria di simboli in CGRAM
Questa struttura modulare consente di utilizzare gran parte di
quanto scritto per tutte e tre le versioni del driver e, nello steso tempo,
permette con facilità di adattare il driver a qualsiasi altra configurazione o
modulo LCD, scrivendo solo una quantità minima di codice.
Iniziamo a considerare la versione per collegamento a 8 bit, con
o senza RW.
Le caratteristiche principali
-
linee dati: 8 bit consecutivi di un qualsiasi port
(port0=D0:port7=D7)
-
linee
di controllo RS e E su qualsiasi bit di qualsiasi port
-
RW
opzionale su qualsiasi bit di qualsiasi port.
Se RW viene usato, la gestione della comunicazione con il modulo LCD
avviene verificando il
flag BF ed è possibile la lettura di dati dal modulo.
L' impiego complessivo di I/O del microcontroller è 11 linee.
Se RW non è usato, la gestione della comunicazione avviene con delay
fissi e non è possibile la lettura dati dal modulo LCD.
L' impiego complessivo di I/O del microcontroller è 10 linee.
-
indipendenza dalla frequenza del processore (fino
a 48MHz) per le routines di tempo
-
parametri
del modulo LCD completamente definibile dall' utente. Una libreria è
fornita
come esempio e supporta alcuni dei modelli di LCD a caratteri più comuni.
-
comprende
un set di funzioni di controllo di base, estendibile con altre funzioni
di gestione
della presentazione di messaggi sul display.
-
comprende
una libreria di macro, tra cui quelle previste per un uso intuitivo
delle funzioni di comando del cursore
-
comprende una libreria di simboli speciali per la
CGRAM
Collegamenti
a 8 bit.
Dal punto di vista dell' hardware, le connessioni sono quelle
viste in precedenza:
|
Come già visto, il collegamento a 8 bit occupa un intero port per la
comunicazione con il controller dell' LCD.
A questo vanno aggiunti tre altri I/O per i segnali E, RS e RW.
Questa connessione, che utilizza 11 linee di I/O, è quella che
consente la massima velocità di trasferimento tra microcontroller e LCD.
Il driver consente di utilizzare qualsiasi port per i dati,
collegando Port0 con D0, Port1 con D1 e così via. Non è previsto l' impiego di pin sparsi su vari port per le linee dati:
anche se questo è possibile, si genera una notevole complicazione nel
driver per allineare bit e dati, il che fa cadere il vantaggio di
prestazione del collegamento a 8 bit.
|
Sarà poi possibile utilizzare per i tre segnali di controllo qualsiasi altro pin di qualsiasi
port.
La struttura del driver consente di sfruttare le linee dati e le linee
impegnate per i segnali RS e RW in altra applicazione quando non sono
utilizzati per la comunicazione con il modulo LCD. Ad esempio, si potrà
sfruttare queste linee per una tastiera o per comunicazione con altre
periferiche.
Questo è possibile in quanto il modulo LCD è disabilitato se la linea E
è a livello basso e qualunque livello assumano le altre linee, in questo
periodo, non comporta alcun problema al modulo.
|
|
Nel caso in cui non si intenda utilizzare la linea RW, il pin
corrispondente sarà collegato a massa (Vss) sul modulo LCD e si
risparmierà una linea di I/O del microcontroller. Il totale degli I/O
impegnati sarà quindi di 10 linee.
Nella configurazione precedente, la scrittura sul display sarà
effettuata con il check del flag BF e sarà possibile la lettura di dati
dal modulo.
Se la linea RW non è utilizzata, la comunicazione avviene con
temporizzazioni standard e non
sarà possibile la lettura di dati dal modulo LCD.
|
|