Come risolvere alcuni
problemi comuni nell'uso
dei display LCD a caratteri
|
Nell' impiego di display LCD a caratteri (LCD dot matrix display) ci
si può trovare di fronte ad alcuni problemi la cui soluzione può far perdere
parecchio tempo.
Raccogliamo qui alcuni consigli derivati dalla pratica.
Il display non funziona...
In generale, se il modulo LCD appare "morto", al di là del fatto
che sia guasto, si tratta solitamente di problemi relativi ai collegamenti o
al software di controllo.
La prima cosa da fare, prima di gettarsi alla ricerca di problemi nel
programma di gestione è quella di assicurarsi che l' hardware sia a posto,
ovvero che:
- i collegamenti del modulo siano corretti: se contengono errori, è
impossibile che il modulo faccia quello che ci si aspetta. In particolare,
invertendo l' alimentazione per un tempo sufficiente, si distrugge il
controller !
- che il cablaggio sia ordinato e non un ammasso arruffato di fili: non
potete pretendere che segnali a livello logico possano superare metri e
metri di cavo tra microcontroller e display o che essi arrivino a
destinazione intatti dopo essere passati in ammassi di cavetti dove
circolano anche segnali di potenza, alimentazioni, ecc.
- che le saldature o i connettori siano a posto e non originino contatti
instabili: basta un solo contatto fasullo per creare problemi di
difficilissima identificazione.
- che la tensione di alimentazione sia corretta: alcuni moduli possono
funzionare correttamente solo per tensioni superiori a 4.5V. Tentativi di
alimentazione a tensioni minori portano, nel migliore dei casi, a
funzionamenti instabili e casuali. Per contro, esistono moduli che possono
essere alimentati anche nell' area 2.7-3V: questo non si vede dall'
esterno, ma solo consultando il foglio dati.
Inoltre, va considerato che a tensioni inferiori a 4.5V, in generale i
controller richiedono temporizzazioni più lunghe e di questo va tenuto
conto nel firmware di gestione.
- che al tensione di contrasto sia corretta: nelle pagine
relative ai moduli LCD a caratteri, sono state date alcune
indicazioni di come realizzare un semplice circuito per la tensione di
contrasto.
Va ricordato ancora che è possibile che alcuni moduli richiedano una
tensione negativa, sopratutto nel caso in cui l' alimentazione è minore
di 5V.
- che eventuale backlight sia acceso, almeno un poco: solitamente, se la
retro illuminazione non è accesa, il display ha, a luce ambiente, un
contrasto debolissimo tra punti accesi e spenti, il che impedisce di
vedere i caratteri presentati. Solamente i display realizzati per il
funzionamento a luce ambiente renderanno i caratteri visibili anche senza
retro illuminazione.
Tenete presente che la maggior parte dei problemi nascono solamente da
collegamenti errati, instabili, caotici e da saldature mal fatte.
Se tutto quanto sopra è in ordine, una semplicissima procedura di verifica
del funzionamento del modulo è descritta qui.
Solo se il modulo supera queste verifiche si potrà indirizzare la ricerca
del mancato funzionamento al software scritto.
Alcune verifiche da effettuare nel caso in cui il
display non funzioni
Se, alimentato il modulo, esso non funziona le cause probabili sono:
- Connessioni errate all' alimentazione
- Tensione di contrasto non regolata correttamente. Verificare seguendo le
istruzioni indicate qui.
- Modulo guasto
Se, alimentato correttamente, il test
iniziale è positivo, ma, inviando i comandi inizili non appare
nulla, le cause possono essere:
- Collegamenti dei bus dati errati
- Collegamenti dei segnali RS/RW/E errati
- Saldature o connessioni instabili
- Tempi di esecuzione dei comandi troppo brevi
- Durata dell' impulso E troppo breve
- Sequenza di inizializzazione impropria
- Livelli elettrici dei segnali inadeguati
- Tensione di alimentazione inadeguata (fuori tolleranza nei tempi di
power-up, brown out, ripple eccessivo, ecc)
Se il display presenta caratteri casuali o mancano caratteri di inizio riga
e simili, verificate i punti precedenti, con particolare riferimento ai tempi
di esecuzione dei comandi.
Se non sono visibili parte di caratteri o dei punti che compongono uno o più
caratteri, la causa è da ricercare nello zebra-connector tra circuito
stampato e pannello del display. Solitamente questo fatto è conseguenza di un
tentativo di smontaggio mal eseguito, di un eccessivo sforzo meccanico
(pressione, torsione)sul pannello LCD o comunque della mancanza di uno o più
contatti del connettore elastomero.
Se il pannello LCD presenta macchie questo è dovuto ad eccessiva pressione
o riscaldamento applicati al pannello stesso, che ha portato al danneggiamento della struttura
e del liquido nematico.
Si ricorda anche che i moduli LCD, realizzati in tecnologia MOS e previsti
per funzionamenti a bassissime tensioni, sono molto sensibili all'
elettricità statica: un maneggio incauto, senza la minima precauzione a
riguardo, può distruggere il controller o il pannello LCD.
Per le stesse ragioni, togliere la tensione di alimentazione prima di
effettuare collegamenti al modulo.
Anche una applicazione della tensione di alimentazione errata o superiore ai
valori massimi ammessi distrugge il modulo in modo da renderlo
irrecuperabile.
Una checklist da seguire per essere sicuri del
funzionamento del modulo
- Verificare la tensione di alimentazione. Alcuni moduli possono operare a
tensione minore di 5V, altro no.
- Verificare che la tensione di alimentazione sia di buona qualità, senza
disturbi eccessivi. Nel caso di alimentazione a batteria, verificare il
funzionamento sia con batterie cariche che con le batterie a fine carica.
- Per alcuni modelli, il parametro Vdd-Vo è maggiore di 4V, per
cui, con alimentazione al di sotto dei 4.5V, la tensione di contrasto deve
essere negativa. In caso contrario, i caratteri saranno visibili con
grandissima difficoltà.
- Sviluppare un software di controllo che sia il più possibile ordinato e
in cui gli elementi di tempo siano facilmente controllabili e
manipolabili.
- Verificare se l' impulso sul pin E è realmente uguale o maggiore di
quanto indicato sul foglio dati. Questo è in relazione al clock del
microcontroller (con un quarzo a 4MHz un PIC ha un clock di istruzione di
1 MHz, ovvero un periodo di 1 us, ma con un cristallo da 40MHz, il periodo
si riduce a 100 ns...).
- Verificare che i segnali RS e RW e i dati sul bus siano posizionati prima
dell' impulso E, almeno 150-200 us, sempre in relazione al clock del
processore. RS e RW non vanno applicati assieme a E !
- Rispettare i tempi dei esecuzione dei comandi, sopratutto in relazione
ai comandi "lunghi" che richiedono tempi di esecuzione maggiori
di 1.5 ms.
- Nel caso di lettura del flag BF, osservare il tempo necessario tra l'
applicazione dell' impulso su E e la stabilizzazione dei segnali in uscita
sul bus, che può essere maggiore di 160 us.
Il fatto che si rovino sul WEB applicazioni che violano le regole di
temporizzazione dei segnali indicate sui fogli dati, non è scusante per
seguire questa linea di condotta. Infatti, se anche è possibile che un
particolare modulo, in una specifica configurazione, possa grosso modo
funzionare, non vuol dire certo che lo stesso sarà per moduli diversi, o
perfino per altri campioni dello stesso modello, nè tanto meno per diverse
connessioni, diversa lunghezza del ciclo di istruzioni del microcontroller
ospitante, perfino diversa temperatura ambiente. Il driver del modulo LCD deve
essere sicuro, in quanto esso non ha possibilità di verificare che il
carattere o il comando inviati sono andati a buon fine; e, nel momento in cui
questo non accade, a causa di temporizzazioni e sequenze non rispettate o
mancanza di cura nella connessione con il microcontroller, l' utilità del
pannello LCD, come elemento di comunicazione con lo svolgersi del programma,
si annulla.
E' utile inserire un condensatore di filtraggio
sulla tensione di contrasto?
Assolutamente da evitare !!! Un condensatore posto sul pin della Vo (o Vee),
assieme alla resistenza di regolazione del contrasto, crea una rete RC che,
allo spegnimento della tensione di alimentazione del modulo, può portare ad
un effetto di hold-up della tensione di contrasto, distruggendo il controller.
Uso del pin E
Va osservato che il pin E di enable è attivo a livello alto. In una
grande varietà di dispositivi è comune che l' enable sia attivo a livello
basso, ma non è questo il caso dei moduli LCD a caratteri.
Questi controller sono disattivati da E=0: in queste condizioni
qualsiasi variazione dello stato delle altre linee è completamente ignorata.
La situazione dipende dal fatto che E è essenzialmente un impulso di latch
che cattura lo stato delle linee sul fronte di discesa. Occorre quindi che i
dati e controlli siano posizionati con E=0; poi E viene portato a livello 1 e,
dopo il tempo necessario all' assestamento (250-1000 us a seconda del tipo di
controller e della tensione di alimentazione) viena riportato a 0. I fogli
dati dei vari controller specificano le temporizzazioni necessarie.
Queste, a parte la durata dell' impulso di E e il suo ciclo minimo, sono
relativamente poco sensibili quando il modulo è associato ad un
microprocessore in cui il tempo di esecuzione delle istruzioni (us) è
abbastanza superiore ai tempi di assestamento del controller (ns) .
Diversa considerazione deve essere fatta nel caso di collegamenti lunghi
tra I/O del microcontroller e modulo: si tratta di segnali a livello logico,
che risentono della capacità/induttanza delle connessioni. In questi casi è
utile inserire brevi attese (nop) per permettere ai segnali di stabilizzarsi.
Il display funziona, ma su due linee, ne visualizza
una sola...
Analogamente, un display a 4 linee visualizza solamente la prima e la
terza.
Questo comportamento, al reset, è corretto, in quanto l' inizializzazione
hardware di default del controller comprende la definizione di una sola linea.
Se il modulo ha più linee, occorre che sia inserito il comando relativo a
interfaccia/linee/font:
0 |
0 |
1 |
DL |
N |
F |
- |
- |
Interfaccia (DL), numero linee (N) e matrice
caratteri (F).
|
0 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
38h, 56d |
8 bit, 2 linee, font 5x7 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
28h, 40d |
4 bit, 2 linee, font 5x7 |
|
La necessità di questo comando non è bizzarria dei progettisti del
controller, ma deriva dal fatto che, come descritto , la struttura fisica del
display e quella logica del controller sono differenti: il controller
"non sa" quante sono le linee del display, in quanto per lui non si
tratta di "linee", ma di locazioni di memoria.
Si vede bene nel caso del display a 4 linee, dove la terza linea non è che la
continuazione dell' area di memoria che il controller identifica come
appartenete alla linea 1, mentre la seconda e la quarta linea sono, dal punto
di vista organizzativo del controller, la "seconda linea".
Peraltro, anche in semplici controller 16 caratteri su una sola linea, è
possibile che il costruttore abbia organizzato i primi 8 come appartenenti
alla linea 1 logica e gli altri 8 come appartenenti alla seconda linea logica.
In particolare, per display organizzati in questo modo (1 sola linea fisica,
due linee "logiche"), la mancanza del comando con N=1 impedisce la
visualizzazione di parte dei caratteri.
I progettisti hanno scelto di un default a 1 linea per l' avviamento del
controller, lasciando poi all'
utente l'operazione di modifica se l' organizzazione fisica dei caratteri lo
richiede.
Se, dopo il reset, non viene fornito il
comando di inizializzazione delle due linee (che vale, per quanto detto, sia
per display a 2, a 3 o a 4 linee), sarà visualizzata una sola linea (o solo
alcune linee o parti di linea a seconda di come è organizzato il display).
Anche dopo una inizializzazione via software, il display
presenta una sola linea e non due...
Nell' inizializzazione per istruzioni del display secondo il flowchart proposto da
Hitachi, la sequenza comprende l' invio, ripetuto tre volte, del comando 0011
(3) sui bit più alti (quindi 30h nel caso di interfaccia a 8 bit).
In questo comando non importa il valore assunto dai bit 3-0 dell' interfaccia.
Anche se non chiarissimamente argomentato dai fogli dati, si deduce che questo
"mezzo comando" e la sua ripetizione costringono il controller a
predisporsi per una interfaccia a 8 bit con 1 linea e font 5x7, come dopo un
reset hardware. A questo punto, si può iniziare l' invio dei comandi
specifici per attivare il modulo alle condizioni volute.
Il primo di questi comandi è quello visto al punto precedente, che determina
l'interfaccia, i font e il numero delle linee. Quando questo comando manca o
è errato, il default è di una linea e quindi il display lavorerà su una
linea sola.
La cosa, però è stata verificata anche se la sequenza di inizializzazione
è perfettamente corretta. In relazione a questo,
Hitachi precisa solamente il tempo tre tempi di attesa:
- l' attesa di 15 ms tra arrivo della tensione e completamento dell'
attività di reset interno del controller
- l' attesa di 4.1 ms tra il primo 30h e il successivo
- una attesa di 100 us tra la seconda e la terza ripetizione del comando
dopo di che non sono indicati ulteriori tempi e questo fa supporre che ci
si debba attenere a quelli indicati per l' esecuzione dei comandi (40 e 1640
us).
Si è verificato in pratica che un certo numero di moduli richiedesse un
tempo consistente tra l' ultima ripetizione del 3 e l' inizio dei comandi
successivi. Mentre alcuni moduli funzionano alla perfezione anche con una
attesa di 40 us, altri richiedo un tempo insolitamente lungo, oltre i 1800 us.
Questa caratteristica, che non abbiamo trovato sui fogli dati, è, invece,
stata rilevata da alcune pagine sul WEB, dove viene segnalata l' inserzione di
una attesa di 4.1ms.
Se non si inserisce questo tempo, il comando successivo inviato al modulo,
ovvero quello di passare a due linee, non viene recepito e, probabilmente,
questo capita anche uno o due dei successivi, con il risultato di attivare il display in
modo ad 1 linea, se non in modo del tutte errato, ad esempio con font 5x11 e
posizioni casuali iniziali del cursore.
In effetti, questa necessità è reale; come detto, non tutti i moduli ne
hanno bisogno, ma siccome un ampio numero lo richiede, consigliamo di
inserirla nella sequenza di inizializzazione.
La giustificazione della necessità del tempo ulteriore è abbastanza
evidente: la sequenza dei 30h forza una condizione di reset del controller
pari a quella dovuta all' arrivo dell' alimentazione e quindi richiede un
certo tempo perchè il controller esegua le operazioni relative.
E' necessaria l'inizializzazione completa via
software?
In assoluto, no.
L' inizializzazione per istruzioni è necessaria solo nel caso in cui il
reset di arrivo della tensione di alimentazione non sia corretto, a causa o di
una alimentazione inadeguata o, molto più comunemente, della mancata attesa
del tempo iniziale necessario per il reset.
Al momento dell' applicazione della tensione, il controller del modulo LCD
dispone di un sistema di reset proprio al power on che esegue le seguenti
funzioni:
- Display clear
- Function set:
DL = 1 ; 8-bit interface data
N = 0 ; 1-line display
F = 0 ; 5 x 8 dot character font
- Display on/off control:
D = 0 ; Display off
C = 0 ; Cursor off
B = 0 ; Blinking off
- Entry mode set:
I/D = 1 ; Increment by 1
S = 0 ; No shift
Questo reset, per completarsi, impiega un tempo variabile, dell' ordine di
vari millisecondi. Quindi, il programma di gestione del display, prima di
iniziare qualsiasi operazione sul modulo, attende per sicurezza almeno 15-50
ms o più dal momento del POR del microcontroller.
Qualunque comando inviato prima che il reset sia completato è ignorato
o, al peggio, origina una inizializzazione confusa.
Che questa operazione di reset sia completata lo si osserva con il test
iniziale, dove le linee dispari (che sono poi la linea 1) saranno
visualizzabili regolando il contrasto. Se, data alimentazione al modulo, si
ottiene la visualizzazione della prima riga, tutto è ok, almeno dal punto di
vista del reset. Non occorre alcuna altra azione: se all' accensione questo
reset iniziale avviene, NON è necessaria alcuna sequenza di 30h iniziali.
A questo punto si inizia a inviare al display i comandi necessari per
impostarlo nel modo operativo voluto, ad esempio attivando più linee e
interfaccia a 4 bit, ecc.
E' utile, comunque, avere il reset da istruzioni disponibile nel firmware
nel caso in cui sia presente qualche condizione che la richieda, come:
- brown out sull' alimentazione
- reset del microcontroller senza caduta dell' alimentazione
Si fa presente che non abbiamo mai verificato una condizione in cui l'
alimentazione era di qualità così scadente all' avvio da impedire il reset
del microcontroller: batterie, regolatori a tre terminali, smps, non hanno mai
dato problemi di reset al por per i moduli LCD. Quindi, all' accensione, l'
inizializzazione per istruzioni non serve.Questo consente di risparmiare parecchi
millisecondi ed è utile nel caso in cui il tempo di avviamento iniziale del
sistema sia importante.
I problemi iniziali sono solitamente riguardanti la mancata attesa del
completamento del reset, andando a cercare di scrivere sul display
immediatamente dopo il reset del microcontroller.
Per contro, se l' applicazione è a rischio di un reset diverso per il
microcontroller rispetto a quello dovuto all' arrivo della tensione di
alimentazione, una inizializzazione completa via software è consigliabile,
sopratutto per sistemi che funzionano in ambienti industriai, critici, con
collegamenti molto lunghi, non presidiati e comunque nelle situazioni in cui
sia necessaria una particolare attenzione.
Va tenuto presente che non tutti i controller dei moduli LCD hanno le stesse
caratteristiche ed alcune famiglie non necessitano di particolari
inizializzazioni, mentre, per contro, è possibile che tra moduli diversi, pur
compatibili, si presentino forti differenze nei tempi necessari all'
esecuzione dei comandi. In particolare, si rimanda al punto precedente, ovvero
alla possibile necessità di inserire un tempo consistente dopo l' ultimo 30h
e prima di ogni altro comando.
Quindi, una implementazione sicura del display LCD deve considerare le
condizioni reali di funzionamento.
Come posso resettare il controller del modulo senza
staccare l' alimentazione?
Quando il modulo è collegato con cavi molto lunghi al microcontroller, si
possono generare situazioni casuali di trasmissione errata dei comandi o di
disturbi indotti che "sballano" la presentazione dei caratteri sul
display. Oppure, semplicemente, si sono valutati tempi di esecuzione dei
comandi "al limite" e basta una decisa variazione della temperatura
ambiente per far si che casualmente essi risultino troppo brevi.
Una inizializzazione via software può essere una soluzione dove sono
possibili questi fenomeni o dove può esserci la difficoltà di resettare il
modulo separatamente dal processore, mentre un incremento dei tempi di attesa
granatisce un margine di sicurezza.
Certamente la possibilità di un reset hardware che sia gestito direttamente
dal controller del modulo potrebbe essere utile in vari casi. In questa
direzione, va considerato che esistono controller, pur compatibili con lo
standard Hitachi per quanto riguarda i comandi di base, dotati di ingresso di
reset, proprio per poter essere resettati con sicurezza nel caso di
alimentazioni instabili (brown out) o a comando dal microcontroller.
Un'altra via è quella di usare un pin del microcontroller per uno switch
MOSFET che possa interrompere l' alimentazione del modulo ed effettuare così
un reset hardware "remoto" (o semplicemente minimizzare il consumo
del sistema quando il display non è necessario). Dato che l' assorbimento del
modulo LCD è bassissimo (la corrente derivata dalla Vdd solitamente è assai
minore di 5mA), non occorre neppure un buffer e la corrente erogata
direttamente dall' I/O del microcontroller è sufficiente. Bisogna, però,
ricordare che una eventuale retro illuminazione ha un consumo ben maggiore e
va esclusa da questo meccanismo. Inoltre, sul pin di I/O è presente la caduta
di tensione del MOS interno, solitamente dell' ordine di 0.4-07V; va
verificato che questo non influenzi il funzionamento del modulo LCD. Se si
verificasse che la riduzione della tensione di alimentazione è critica, si
potrà inserire un piccolo MOSFET come buffer.
Il display funziona, ma capita che il primo
carattere della linea non venga visualizzato
Se osservate il vostro listato, probabilmente prima della scrittura sulla
linea avete fatto eseguire al controller un comando di clear o clear &
home. Per l' esecuzione, questi comandi richiedono 1,5ms mediamente, ma
capitano moduli in cui sia necessario temporizzare per almeno 1.8/1.9 ms o
anche di più. Durante questo tempo, qualsiasi cosa spedita al controller non
viene considerata, per cui è probabile che il primo carattere inviato per la
visualizzazione sparisca.
Se, dopo il comando, non viene verificato il flag BF (il che richiede l' uso
del pin RW), ma si utilizzano tempi fissi, basterà aumentare la durata dell'
attesa di fine comando
Il display funziona, ma visualizza caratteri
incomprensibili o a caso
Escluso in problema di connessioni, si tratta di una questione di tempi.
Come per il caso precedente, se non si utilizza il test del flag BF, occorre
che i tempi di attesa di esecuzione dei comandi siano sufficientemente lunghi.
Da notare che la scrittura di un carattere o la lettura di un dato è anch'
esso un processo che richiede tempo. Se i tempi non sono sufficientemente
lunghi, è possibile che l' invio successivo troppo rapido di caratteri o
comandi dia origine a errate interpretazioni da parte del controller, che
solitamente si realizzano con la visualizzazione caotica di caratteri casuali.
Il display consuma le batterie in un attimo
Il modulo LCD e la sua elettronica di controllo ha un consumo tipico tra 2
e 5 mA, anche meno in modelli a basso consumo. Se, però, è presente una
retro illuminazione, questa è causa di un assorbimento di anche oltre 100 mA.
Maggiore è la brillantezza voluta, maggiore sarà la corrente assorbita.
Tenendo anche presente che alcuni costruttori usano una forte retro
illuminazione per compensare display economici con basso contrasto.
Quindi, per apparati a batteria, sarà meglio utilizzare moduli con display
visibile a luce ambiente e senza retro illuminazione. Avendo necessità
di usare modelli con backlight, è indispensabile spegnerla quando il display
non è in uso.
Peraltro, è facile constatare che il display potrà essere ben visibile anche
senza pompare nei LED la massima corrente; una resistenza serie o un controllo
PWM potranno ridurre sensibilmente il consumo senza penalizzare eccessivamente
l' immagine.
I moduli dotati di retro illuminazione elettroluminescente hanno un
bassissimo consumo, dato che questa si comporta come un condensatore.
Analogamente, i moduli VFD hanno gli elementi intrinsecamente luminosi, per
cui non richiedono retro illuminazione, pur essendo ben visibili in piena
luce.
Però i moduli EL, CLF e i VFD richiedono generatori di tensione ausiliari che
consumano corrente. Se è la soluzione ideale per i grossi pannelli,
sfortunatamente, per piccoli moduli come quelli a caratteri, questa corrente
può anche essere dell' ordine o anche maggiore di quella della retro illuminazione
a LED, annullando qualsiasi vantaggio.
Alcuni caratteri non corrispondono a quelli attesi
I caratteri visualizzabili dal modulo sono determinati dal Character
Generator del controller. Anche se buona parte dei controller disponibili nel
mercato europeo hanno lo stesso set, i costruttori implementano vari set
standard di caratteri, oltre ad un numero imprecisato di font custom richiesti
da utenti particolari. Per esempio, esistono controller con set di caratteri
solamente per una data lingua, come il cinese, oppure con simboli particolari.
Quindi è possibile che ad un certo codice, su un certo modulo sia
visualizzato un carattere e un diverso carattere su un altro modulo che,
ovviamente, dispone di un set interno differente. Questo è comune da rilevare
su moduli recuperati da apparecchiature commerciali.
Ho recuperato un modulo LCD da un apparecchiatura
commerciale ma non riesco a farlo funzionare
I moduli realizzati per gli OEM, pur avendo connettori standard, possono
avere collegamenti diversi dallo standard. Questo capita su moduli LCD
presenti in macchine FAX, fotocopiatrici, strumenti. Ne risulta l'
impossibilità di determinare quali funzione hanno i singoli pin.
Sfortunatamente può non essere facile recuperare una qualche informazione a
riguardo e, in mancanza di queste, diventa molto difficoltoso stabilire
esattamente quale funzione hanno i singoli collegamenti.
Se si riesce a determinare con certezza quali sono i pin di alimentazione, si
può tentare di scoprire la funzione degli altri con una serie di prove, dato
che, trattandosi di ingressi logici, basta non superare le tensioni ammesse
per minimizzare le possibilità di danni.
Inviando un carattere ad una certa posizione in una
data linea, il carattere non si vede o va a finire da un' altra parte
Non tutti i moduli hanno lo stesso rapporto tra la memoria interna del
controller e la posizione dei caratteri sul display.
Solitamente le linee successive alla prima partono da indirizzi noti, ma,
sfortunatamente, ci possono essere costruttori che, per varie ragioni, hanno
organizzato il modulo in modo differente. Ad esempio, moduli 1 riga da 16
caratteri possono essere organizzati sia come 1 linea da 16, sia come due
linee da 8 consecutive. Quindi, nel primo caso, l' ottavo carattere avrà
indirizzo 10h, nel secondo avrà indirizzo .
Occorre consultare il foglio dati del prodotto.
Trovo indicato l' indirizzo C0h, ma anche 40h, come
inizio della seconda linea; quale è corretto?
Entrambi. Nel primo caso viene indicato l' indirizzo assoluto rispetto alla
mappa di memoria del controller. Nel secondo caso viene indicato l' indirizzo
relativo alla DDRAM.
In pratica, nella mappa di memoria, la DDRAM visibile ha un accesso con un
comando che necessita del bit 7=1, il che corrisponde agli
indirizzi successivi a 80h, cioè 10000000 binario.
Il primo carattere della
prima linea è accessibile inviando il comando 80h. Il primo carattere della
seconda riga corrisponde a C0h.
Se, però, consideriamo che, logicamente, è più semplice considerare la
partenza da 0 e non da 80, possiamo dire che Il primo carattere della prima
linea corrisponde alla locazione di DDRAM, relativa al display, 00h e che il
primo carattere della seconda riga corrisponde alla locazione 40h. Abbiamo
solo considerato comune e sottinteso il bit 7 di accesso che è a 1.
Posizione primo carattere
di un display 20x4 |
Memoria relativa al
display |
Accesso alla memoria
del controller |
prima linea |
00h - 00000000 |
80h - 10000000 |
seconda linea |
40h - 01000000 |
C0h - 11000000 |
terza linea |
10h - 00010000 |
94h - 10010000 |
quarta linea |
14h - 00010100 |
D4h - 11010000 |
Il problema di inviare il byte alla giusta locazione è risolto nel driver.
Ecco, ad esempio, una macro che trasforma l' indirizzo relativo nel comando di
accesso alla memoria DDRAM
LCDDDADR macro DDRamAdr
Local value = DDRamAdr | b'10000000' ; mask command
movlw value
call LCDWrCmd
endm |
|