BoxIdee

DISPLAY SERIALE PER LCD HD44780

Introduzione

Questa idea ha ormai alcuni anni alle spalle; è nata per l'esigenza di avere a portata di mano un Display LCD (col classico chip HD44780) facilmente utilizzabile da un programma Host per visualizzare quello che serve al momento (ed. debug).
L'Host può inviare tutti i comandi di gestione, i caratteri da visualizzare e, eventualmente, dei numeri da formattare in diversi modi. Il tutto impiegando solo 1 pin dell'Host e senza appensatirlo con tutte le routine e driver richiesti.

L'hardware è sviluppato per collegarsi meccanicamente al display stesso, tipo 'piggyback', in modo da rendere il tutto molto compatto e facile da inserire nella meccanica del progetto.

Descrizione

Il progetto è stato recentemente rivisto nel Firmware dietro gentile richiesta dell'amico Fiorenzo che ha trovato interessante l'idea, ma non ha trovato sul sito il file dell'eseguibile. In effetti, questo è andato perduto in qualche 'trasloco' dell'HD; ho trovato una vecchia versione, scritta in Assembler, scoprendo che era veramente difficile da capire, anche per me :-), da qui la decisione di migrare il software in C, usando la piattaforma MPLABX di Microchip.
Sottolineo che non sono più in grado di verificare il funzionamento del progetto non avendo più il mio vecchio LAB, per cui il SW è tutto da testare e, quasi sicuramente, da correggere.

Con l'occasione ho rivisto in parte le funzionalità, togliendo quanto quasi inutile e introducendo una modifica fondamentale nella gestione della formattazione dei numeri. L'uso del C comporta la disponibilità delle funzioni offerte da printf per cui si presentano due casi:
- il software dell'Host (il programma che comanda il display) prevede anch'esso l'uso di questa libreria e può quindi inviare al display i numeri già formattati come preferisce.
- il software non usa la libreria e quindi delega a questo programma la formattazione usando un insieme di flag per comunicare cosa vuole ottenere.

Altra importante novità è data dai commenti (estesi e, spero, chiari) che ora illustrano il programma; con questi sono certo che chiunque sarà in grado di capire il programma e intervenire come richiesto.

Caratteristiche

Il progetto impiega ORA un processore PIC18F26K22, ma può essere facilmente portato su CPU simili (es. 18F2610, 18F2520, 18F2580).
La CPU è piuttosto sottoutilizzato, ma comoda per l'alta velocità di clock interno senza quarzi a (ora a 16MHz senza l'uso del PLL per ridurre i consumi) e per la quantità di ROM e RAM.
La comunicazione con l'Host utilizza la porta EUSART, col solo pin RX; anche il pin TX è comunque abilitato e previsto nel software per l'echo dei caratteri ricevuti o per il testing mediante la funzione 'SendByte'.
La velocità di comunicazione è selezionabile in SW tra 9600, 19200 e (default) 38400bps.

Il display è pilotato dagli 8 bit della porta B; è previsto, ma NON testato, il bit Busy, per la massima velocità di trasferimento dati; in alternativa, di default, mediante un flag SW (define) si applica un ritardo fisso di 50usec dopo ogni comando comune.

Tramite 2 jumpers sulla scheda, si seleziona la configurazione del display tra 16x2, 16x4, 20x2 e 20x4, letti all'avvio del programma.
Sulla scheda sono presenti il connettore ICSP per la programmazione e 2 pad (o un jumper) per il reset del modulo.
Il led ACT lampeggia con frequenza di 0.5Hz (1s ON, 1s OFF), per verificare il funzionamento. Il led RX è sul percorso dei dati ricevuti per visualizzarne l'attività.
La backlight è pilotata tramite un Mosfet per piccoli segnali tipo BS108 (attenzione: ho provato anche altri modelli, quali il più comune 2N7000, con risultati insoddisfacenti per la scarsa sensibilità). Si possono utilizzare anche dei transistor con buon guadagno; per questo sono previste 2 resistenze, sulla base e sul collettore, per adattarsi ad altre soluzioni.

Il modulo è alimentato a 5V, dall'Host (tramite il connettore a 4 fili di interfaccia) o tramite alimentazione esterna stabilizzata, portata a un secondo connettore a 2 fili dedicato.
L'assorbimento non è banale in quanto la MCU a 16MHz utilizza da sola circa 15mA; con i led si arriva intorno ai 30mA; la retro-illuminazione, se utilizzata, comporta carichi diversi a seconda del tipo di display. Tipicamente, si possono aggiungere dai 20 ai 120mA. Per diminuire il consumo, i led ACT e RX possono essere rimossi.


Descrizione del funzionamento

Durante l'inizializzazione vengono i letti i jumper di predisposizione per il formato dell'LCD, ovvero a 16 o 20 caratteri, per 2 o 4 righe.
Di default, ma deselezionabile via SW, sul disply viene mostrato un messaggio di benvenuto.
Il modulo si pone quindi in ricezione dei dati seriali: questi sono registrati in un buffer circolare di 256 caratteri e prelevati uno alla volta quando il SW non è impegnato in altre operazioni.
In assenza di istruzioni i caratteri letti sono inviati al display.
Le istruzioni accettate sono il simbolo di 'comando' e il simbolo di 'numero'.
I codici delle istruzioni, definiti come costanti nel modulo Header del programma, sono i caratteri '^' per i comandi e il carattere '|' (pipe) per i numeri.


Formato dei Comandi

In modalità comando vengono accettati 1 o 2 caratteri (comando base + variante) un massimo di 3 parametri numerici separati da una virgola; il comando è terminato da un Carriage Return (0x0D).
La tabella più avanti descrive in dettaglio i comandi riconosciuti e i parametri accettati.

In modalità numero è atteso un carattere di formattazione seguito da 1 a 4 byte binari del numero da visualizzare; non è richiesto il CR finale.
Per i numeri Word (16 bit) e Long (32 bit), devono essere inviati rispettivamente i 2 o 4 byte dei codici binari, a partire dal più significativo (MSB). Nel SW è prevista la possibilà di invertire la 'endianness, ovvero l'invio a partire dal LSB.

Ciascun bit del carattere di formattazione stabilisce come deve rappresentato il numero; la definizione dei bit è il seguente ('x' = indifferente, ovvero sono sovrapponibili):

  • B0: x1xx x001 = valore Byte
  • B1: x1xx x010 = valore Word
  • B2: x1xx x100 = valore Long
  • B3: x1xx 1xxx = valore Hex
  • B4: x1x1 xxxx = zero suppress (default il numero è riempito con 0 iniziali)
  • B5: x11x xxxx = allinea a sinistra (default è a destra)
  • B6: x1xx xxxx = bit fisso (ovvero = 0x40) per permettere il testing da terminale
  • B7: 11xx xxxx = usa prefisso Hex (non utilizzabile in testing da terminale) (**)

(**) Il carattere del prefisso Hex (es. '$' o 'h') è definibile nel programma

La presenza del bit 6 fisso a 1, ovvero con un codice minimo uguale a 0x40 (carattere 'spazio') consente di inviare una lettera da terminale, sommando i valori degli altri bit.
Alcuni esempi:

  • 'R' (0x52 = 0101 0010): numero Word decimale con zeri soppressi
  • 'd' (0x64 = 0110 0100): numero Long decimale con allineamento a sinistra
  • 'Z' (0x5A = 0101 1010): numero Word Hex con zeri soppressi

In ogni caso, dopo la visualizzazione del numero il cursore si riporta alla posizione iniziale, in modo da poter ristampare il numero ripetutamente.


Uso della retroilluminazione (backlight)

I led di illuminazione possono essere, da comando, spenti, accesi o temporizzati.
Una funzione interessante, utile per ridurre il consumo, è di accenderli per un tempo programmato (in secondi) dopo la ricezione di qualsiasi carattere. Questo è spiegato nel prossimo capitolo.


Funzioni temporizzate

Alcuni comandi prevedono una temporizzazione, realizzata mediante il Timer0 con un timeout di circa 50mSec.
Ogni timeout ('Tick'' la routine 'NewTick' chiamata dal gestore di Interrupt di basso livello esamina lo stato di alcuni contatori e flags e attiva altre azioni quando dovute.
- il led ACT commuta stato ogni secondo per verificare che il circuito e il programma siano attivi.
- come anticipato, se i Led sono temporizzati la routine verifica se il tempo di accensione è azzerato e li spegne.
- vengono attivate, se abilitate, le funzioni di Roll (rotazione verticale Su/Giu del testo) e di Shift (scivolamento a Destra/Sinistra di tutto il display o solo di una riga).


Caratteri speciali personalizzabili

Il chip HD44780 consente di memorizzare fino a 8 caratteri personalizzati nella CGRAM ' Character Graphics RAM nelle posizioni corrispondenti ai codici ASCII da 0x00 a 0x07.
Tipicamente questi caratteri rappresentano simboli speciali da aggiungere al set di caratteri stampabili. Il presente SW include 2 set di caratteri: il primo (Set 0) fornisce gli 8 elementi utili per 'disegnare' una 'frame' rettangolare; il secondo (Set 1) ha i l simbolo di grado Celsius, il simbolo F in negativo, due simboli tipo 'checkbox', uno vuoto e uno selezionato, e 4 freccie.
Altri set possono essere creati con applicazioni esterne e codificati come array di caratteri nell'Header del programma.
Per default all'accensione viene caricato in memoria il Set 0; un comando specifico permette di scegliere il Set 1.
Un altro comando di test visualizza sul display gli 8 caratteri al momento attivi.


Comandi di controllo e test

Simbolo Parametri Comando Descrizione
--- --- ANNULLA comando vuoto senza parametri: annulla l'operazione di animazione in corso
B --- M [T] BACKLIGHT controlla l'illuminazione del display: M stabilisce il modo:
0=sempre spento, 1=sempre acceso, 3=acceso temporizzato per T secondi.
In temporizzato, ogni carattere ricevuto provoca l'accensione e la ripartenza del timer (Es. B3,5)
C --- [N] CLEAR cancella tutto il display (con N=0 o assente) oppure solo la riga [N]
C A R N P CLEAR AT nella riga R cancella N caratteri a partire da P (Es. CA2,5,10)
D --- 1..7 DISPLAY cambia la modalità del display secondo le combinazioni di questi 3 valori:
1=display acceso, 2=cursore sottolineato, 4=cursore lampeggia, (Es. D3)
H --- [N] HOME sposta il cursore a inizio display (con N=0 o assente) oppure alla riga N (Es. H3)
L S N LOAD SET Carica il set personalizzato N [1..8] nel display (caratteri da 0 a 7) (Es. ST4)
P --- X Y POSITION sposta il cursore alla posizione definita da X (1..maxX) e Y (1..maxY) (Es. P8,2)
R D T [N] ROLL DOWN ruota in verticale berso il basso con tempo T tutto il display per N volte, o continuamente con N=0 (Es. RD3,8)
R [U] T [N] ROLL UP ruota in verticale berso l'alto con tempo T tutto il display per N volte, o continuamente con N=0 (Es. R3,8)
S [L] T [N] [R] SHIFT LEFT slitta a sinistra con tempo T la riga R (o tutto il display con R=0) per N volte, o continuamente con N=0 (Es. S5,10,2)
S R T [N] [R] SHIFT RIGHT slitta a destra con tempo T la riga R (o tutto il display con R=0) per N volte, o continuamente con N=0 (Es. SR5,10,2)
X X SOFT RESET riavvia il programma azzerando le impostazioni: NOTA: non è un Reset HW
T S N TEST SET cancella il display e visualizza il Set N (Es. TS0)
W WELCOME visualizza il quadro di Welcome adeguato alla risoluzione impostata da HW

NOTA: i valori tra parentesi [] sono opzionali; possono essere vuoti oppure a 0


Download e programmazione

» Scarica la cartella del progetto

La cartella zippata ontiene:

  • Questo documento
  • La cartella 'LCSserial.X' del progetto SW in XC8 da aprire in MPLABX IDE di Microchip
  • La cartella 'HW' con i file da aprire con EagleCad (schema, pcb, layout) e le immagini relative

NOTA BENE:
la programmazione della CPU deve essere eseguita senza il display montato nello zoccolo in quanto i pin B6 e B7 di programmazione sono connessi al display e possono impedirne la programmazione.



Click su qualsiasi immagine per ingrandire


Schema elettrico


Circuito stampato


Disposizione componenti


PCB Top


PCB Bottom


Il tutto finito e montato