LCD con caratteri a matrice
|
Il
software di gestione: l' inizializzazione
Prima
che il display possa essere utilizzato, deve essere inizializzato
dal dispositivo di controllo (microcontroller, PC, ecc).
E' importante definire esattamente questa faccenda dell'
inizializzazione, cosa troppo spesso non considerata, in quanto una
inizializzazione non corretta porta all' impossibilità di utilizzare il
display.
All'arrivo della tensione di alimentazione il controller HD44780 si
predispone per ricevere i comandi, assestando alcuni registri ed assumendo
i valori di default al POR che sono i seguenti:
-
8 bit di interfaccia (DL = 1)
-
display su 1 linea (N = 0)
-
carattere a matrice 5x8 (F = 0)
-
Display off / cursore off / cursore lampeggiante (D= C = B = 0)
-
Display senza Shift (S = 0)
-
Movimento Cursore verso la destra (I / D = 1)
|
Per ottenere un reset hardware corretto occorre che la tensione di
alimentazione sia applicata con un fronte di salita tra 0.1 e 10 ms. Inoltre, cosa da non sottovalutare, occorre che, una volta sia
caduta la tensione, essa non si ripresenti prima di 1 ms, altrimenti
la successiva inizializzazione hardware non sarà completata
correttamente. Quindi il modulo è sensibile al brown out, come
peraltro lo sono tutti i microcontroller. |
-
Un secondo punto importante è che l' inizializzazione
hardware richiede un certo tempo di esecuzione, che è valutabile attorno a molti
millisecondi (da 15 a 40 o più, a seconda del modello di controller e
della tensione di alimentazione).
-
E durante questo tempo
iniziale il display non può accettare
ordini dall'esterno
Qualsiasi cosa inviata al display non ha conseguenza.
-
Va anche considerato che se durante questo tempo la
tensione viene a mancare e ritorna prima del limite sopra indicato, il
controller si resetterà in maniera parziale o incompleta, impedendo il
corretto uso del display.
Le conseguenze di quanto sopra sono evidenti:
- se le condizioni elettriche elencato nelle
specifiche Power Supply Conditions del foglio dati non sono
rispettate, il circuito di reset interno non funzionerà
normalmente e non riuscirà a inizializzare il HD44780U.
- Il reset all' arrivo della tensione imposta una interfaccia a
8 bit. Se l'interfaccia usata è a 4 bit, occorre un comando
differente.
- Analogamente, se il display dispone di più di una riga, per visualizzare le
successive occorre inviare il comando opportuno.
E se le funzioni di shift o del cursore richieste sono
differenti da quelle di default, occorrerà inviare i comandi
necessari.
-
Dopo il reset, il display è off,
ovvero attivo, ma spento, quindi non visualizza nulla. Occorre inviare i comandi
per attivare la
visualizzazione.
|
Alla luce di quanto sopra, il "fidarsi"
ciecamente del POR del controller non è sempre una buona pratica. Il reset al
power on sarà sicuro se sperimentato con il display voluto nelle condizioni
reali di impiego, verificando sia il tempo iniziale di assestamento, che può
essere anche abbastanza consistente ed avere tolleranza anche tra pezzi dello
stesso modello, e ancor più tra modelli diversi,
sia la corretta temporizzazione dell' alimentazione.
In questo caso, non occorre inviare altro al modulo se non i comandi
necessari per portarlo alle condizioni di lavoro volute (come detto, una serie
di comandi iniziali è indispensabile in ogni caso in cui il modulo debba
funzionare in modo diverso da quanto imposta il default).
Ricordare che, nel
caso in cui questi parametri non siano rispettati, il risultato è che il
controller non sarà correttamente inizializzato e non risponderà ai
successivi comandi, o, peggio, risponderà in maniera caotica.
|
Per un caso del genere, e
comunque ogni volta si voglia resettare il display durante il funzionamento,
l'inizializzazione
deve essere effettuata via software, attraverso una serie di istruzioni.
Una cosa sempre non considerata dagli utilizzatori e da grandissima parte
dei commentatori sul WEB è che:
Il reset del
microcontroller e quello dell' HD44780 sono due cose completamente
differenti !!!
Il reset del microcontroller NON resetta il controller del display.
Questo viene
"resettato" solo dalla caduta di tensione di alimentazione e dal
suo ritorno nei modi sopra indicati oppure dalla procedura software di
inizializzazione.
Quindi un riavvio del programma del microcontroller senza la caduta
della tensione deve prevedere un reset software per il display, pena l'
impossibilità di riprenderne il controllo.
|
Vediamo di chiarire ulteriormente.
La maggior parte delle applicazioni utilizza per il microcontroller e per il display la stessa tensione di alimentazione. In
genere, se ben realizzata, l' alimentazione soddisfa i requisiti per un POR
sia per il microcontroller, sia per il controller del display. Allora è
possibile utilizzare il reset hardware del display, facendo si che il
microcontroller attenda il tempo iniziale necessario per avere la sicurezza
che HD44780 abbia esaurito tutte le operazioni necessarie per il suo avvio
regolare.
Ma cosa succede quando premiamo il pulsante di reset del microcntroller
oppure
riavviamo l' emulazione ICD ?
Semplicemente solo il microcontroller sarà resettato,
riavviando il programma dal suo vettore di reset.
Ma il controller del display, non essendo mancata l' alimentazione, resta al
punto in cui è stato abbandonato e non esegue alcun reset.
Se la tensione di alimentazione non varia, tutte le
impostazioni (numero linee, font caratteri, direzione cursore, shift, ecc) e
il contenuto della RAM non sono alterate. Se il programma sul microcontroller riparte
dopo un reset imposto, ad esempio, al pin MCLR, e supponendo che il controller del display abbia eseguito un
reset hardware, i comandi che invierà avranno come minimo il risultato di
scombinare la visualizzazione o, nel caso peggiore, mandare in palla il
controller. A questo punto è probabile che l' unica via per riprendere il
controllo del display sia quella di togliere e rimettere l' alimentazione
al modulo.
Dunque, si può confidare nel reset hardware, dato che è
difficile che un buon alimentatore non rispetti le temporizzazioni previste
dal costruttore, e non implementare mai l' inizializzazione software.
La faccenda si basa sul solito "tanto
funziona anche senza...". Ma il "funziona anche senza" è
vero solo nel caso in
cui il reset hardware sia eseguito correttamente.
Nel caso in cui si riavvii il
microcotroller da istruzioni (ad esempio reset degli
enhanced) o ogni qualvolta
il microcontroller sia resettato separatamente, o ci siano condizioni di
brown out dell' alimentatore, ci si
troverà davanti a situazioni in cui il display si rifiuta di funzionare
correttamente, senza capirne le cause.
Siccome in ogni caso occorre:
-
attendere il tempo iniziale di reset dell' HD44780
-
inviare i comandi per la modalità voluta, se diversa dal default
non comporta che un minimo ulteriore consumo di tempo e di
istruzioni l' inizializzare il display con la procedura software
completa.
Questo elimina i problemi che si formano immancabilmente dove
non si faccia questo.
La procedura standard di Hitachi
Il foglio dati di
Hitachi per HD44780 raccomanda di utilizzare
questa sequenza di comandi per
l' inizializzazione software, ma anche subito dopo l' accensione del sistema e
propone anche un flow chart della sequenza::
|
- attendere per un tempo di almeno 15ms (con alimentazione a 5V) o di almeno 40ms (con alimentazione a 2,7V);
questo è necessario perchè al POR il microcontroller che gestisce
il sistema si avvia in un tempo molte volte inferiore a quello
richiesto dal controller del display. Quindi occorre farlo
attendere fino a che HD44780 ha effettuato il suo assestamento
iniziale. Intervenendo con comandi sul display prima di questo tempo
è inutile se non dannoso in quanto può produrre risultati
inaspettati
-
inviare il comando per un colloquio su
interfaccia a 8bit o
a 4bit, a
seconda di come è configurato l' hardware, ma senza
importanza
per il
numero di righe o caratteri
del visualizzatore,
nè per altre opzioni.
Il
comando
da inviare è
b'0011xxxx',
ovvero 30h.
-
attendere 4.1 ms
- ripetere il comando
- attendere 100 us
- ripetere il comando
Esaurita la fase
iniziale, occorre ora inviare i comandi per stabilire le modalità
operative del display. Ora è anche possibile testare il busy flag.
La sequenza consigliata è questa:
- Spegnere il display
Cancellare il contenuto di DDRAM (clear display)
Accendere il display con la modalità voluta
|
Il reset hardware porta il controller alla fine del punto 7 con i parametri di default sopra indicati.
Nel reset software il contenuto del punto 7 potrà essere variato se occorrono
parametri di funzionamento diversi; e questo sarà necessario anche dopo il
reset hardware, se il default non è quello necessario.
Va osservato al punto 2
che il comando iniziale 0x30 è
un caso speciale del set di comandi. Esso ha a un livello indifferente sui primi 4
bit, che non vengono considerati; quindi non importa che il collegamento tra
microcntroller e modulo sia a 4 o a 8 bit, dato che sono utilizzati solo i 4 bit alti.
Le tre ripetizioni del comando sono specificate nel foglio
dati Hitachi e in quello dei controller compatibili. Da prove sul campo,
risulta che alcuni display si inizializzano benissimo anche con un solo invio del
30h, ma non c'è ragione per non adeguarsi alle richieste delle specifiche
scritte dal produttore del controller (vedi più sotto).
In pratica, possiamo dire che il codice iniziale 30h serve a
costringere il controller, sia correttamente che non correttamente inizializzato dal reset hardware, a portarsi in un punto tale da cui potrà
accettare le successive istruzioni sul bus della larghezza
voluta.
Questa procedura, anche se apparentemente prolissa, si trasforma in pochissime
righe di codice e non c'è quindi ragione per non implementarla in ogni caso
in cui il foglio dati del componente la proponga.
Davvero non è comprensibile chi non voglia implementare questa procedura
("Tanto funziona anche senza..."),
peraltro esemplificata dagli stessi costruttori e in mille siti, per i più
comuni microcontroller e in tutti i possibili linguaggi!
Tra l' altro, i flow chart proposti da Hitachi sono di facile
interpretazione ed esempi di codice sono reperibili in un attimo da molte
sorgenti sul WEB.
Si può obiettare che "allunga il tempo di esecuzione..", ma
questo è relativo in quanto i moduli LCD a caratteri sono periferiche molto
lente e, in ogni caso in ogni caso, all' arrivo della tensione, occorrerebbe aspettare
comunque il tempo di assestamento del controller.
Alcune note per i "furbacchioni":
- Certamente si può verificare che le sequenze di ritardo
consigliate dal costruttore e la necessità di ripetere tre volte il primo
comando non siano strettamente necessarie per tutti i tipi di display.
Per esempio, alcuni dei display provati reagiscono in tempi molto
minori e necessitano di un solo invio del comando 30h.
Però questo non è certificato nei fogli dati, che, per qualsiasi
costruttore di controller compatibili, replicano solamente la sequenza indicata da Hitachi.
Per
contro, si sono verificati display, soprattutto nel low cost made
in China, con una certa ampiezza del range dei tempi e, si può
supporre, anche delle inizializzazioni.
Quindi, dato che il successo della prima fase dell'
inizializzazione è essenziale per i passi successivi, non c'è
alcuna ragione per non seguire la procedura consigliata.
Chi vuole
fare diversamente perchè ne ha sperimentata la non necessità per
un dato tipo di display, è opportuno che verifichi la
possibilità di ripetere la cosa anche con altri tipi di display o
con tensioni di alimentazioni diverse .
Potrebbe avere delle sorprese...
- Va
considerato, infatti, che minore è la tensione di alimentazione,
maggiore è il dilatarsi dei tempi necessari al controller per
eseguire le funzioni richieste.
E anche la temperatura ambiente è influente.
|
Può essere utile consultare a riguardo le pagine
relative ai problemi di applicazione dei moduli LCD a caratteri.
Il foglio dati propone
anche l' inizializzazione per l' interfaccia a 4 bit:
|
Qui possiamo osservare un particolare interessante.
Le fasi iniziali in cui viene inviato il comando 30h, nell'
interfaccia a 4 bit, che utilizza il nibble alto (D7:4), richiede
solamente l' invio dei bit da B7 a B4, ovvero 0011 e non deve essere
completata con la parte bassa del comando.
Ovvero, questa "sveglia" iniziale data al controller,
riguarda solamente i 4 MSbit, con il risultato che non ha alcuna
importanza iniziale la configurazione dell' interfaccia, che sarà
specificata solo successivamente.
E notiamo infatti che i comandi relativi alle funzioni, nella fase
7, richiedono entrambi i nibble, per cui ogni comando richiede due
cicli di scrittura: nel primo sono inviati i 4 bit del nibble alto e
nel secondo i 4 bit del nibble basso.
Ovviamente il primo comando di function set, subito dopo la terza
ripetizione del 0011, dovrà identificare l' interfaccia come composta
da 4 bit e non dagli 8 del default.
Seguendo questa procedura per ogni reset del display, compreso
quello all' accensione, non ci sono mai stati problemi di
inizializzazione con qualunque dei moduli provati, qualsiasi sia stato
il formato o il costruttore.
E' ovvio che se si richiedono specifiche funzioni al display, come
lo shift automatico o il movimento del cursore da destra a sinistra,
questi dati saranno impostati nel controller in questa fase.
In ogni momento è possibile variare le opzioni durante il
funzionamento, ad esempio attivando e disattivando il cursore o lo
shift.
Ovviamente la modalità di interfaccia a 4 o 8 bit, il numero delle
linee e la matrice dei caratteri, potranno essere impostate solo
durante l'inizializzazione completa. |
Durante la
fase iniziale (da 1 a 6) non è possibile fare altro sul display,
neppure leggere il flag di busy, che dovrebbe essere comunque
bloccato. Completata
la sequenza,
si è sicuri che il controller si è predisposto per ricevere i
comandi successivi e per i quali, se previsto dall' interfaccia
hardware, si può testare il flag di busy oppure operare ancora
con ritardi fissi.
In tutti i casi,infatti, alternativa a quanto indicato nei flow chart, al posto di
analizzare il flag BF, si potrà attendere un tempo fisso tra istruzione ed
istruzione. Questi tempi di esecuzione sono indicati più avanti nel dettaglio
dei comandi. Orientativamente occorre una attesa di 40 us per la maggior parte
dei comandi e di 1.6 ms per i comandi di clear e di home.
Display che hanno
controller diversi da HD44780 potranno richiedere sequenze di inizializzazione
diverse
con tempi più brevi, altre istruzioni iniziali e con un set di opzioni molto
più vasto.
Come sempre, la lettura del foglio dati del componente permetterà di
utilizzarlo al meglio.
|
Buona parte degli equivalenti diretti è in grado di operare con tempi di
circa il 50% inferiori e non richiede la triplice ripetizione del 30h
iniziale.
In compenso i fogli dati possono indicare un tempo di power on reset maggiore di
15 ms, anche 30 o 40 ms.
Quindi, l' uso di parametri di sicurezza nelle temporizzazioni rende più
universale un driver ben scritto, in quanto la prolissa inizializzazione di
Hitachi andrà bene per tutti i modelli compatibili, ma versioni "abbreviate"
potranno funzionare su alcuni moduli, ma non sui altri.
Ripetiamo che non c'è solitamente la necessità di tirare i tempi negli
gli accessi all' LCD, ma per chi volesse spremere il massimo, è consigliabile
iniziare con un driver "conservativo" e poi, quando tutto gira
correttamente, cercare di limare i vari ritardi, sempre verificando che il
tutto funzioni non solo alla temperatura ambiente del laboratorio, ma anche a
quelle reali di funzionamento. E, se il circuito deve essere ripetuto in più
esemplari, non limitarsi a verificare un solo modulo LCD, ma testarne diversi,
dato che le caratteristiche, anche all' interno di un determinato
costruttore/modello, possono non essere costanti.
In particolare, una considerazione particolare alla tensione di alimentazione.
Per
i display che funzionano al di sotto dei 4.5 V i fogli dati indicano
un aumento dei tempi, pari a circa il doppio.
Quindi, utilizzando un display (nei modelli in cui è possibile)
tra 2.7 e 4. 5V, le temporizzazioni dovranno essere verificate, in
quanto quelle applicabili ad una alimentazione di 5V hanno buone
probabilità di essere inadeguate.
|
Il fattore alimentazione diventa importante in apparati alimentati
direttamente a batteria, la cui tensione a fine carica e dopo ore di lavoro
può essere abbastanza diversa da determinare una differente risposta del
controller.
|