Esercitazioni ASM - PIC18

 


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:

  1. 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
  2. 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
  3. il driver deve comprendere una inizializzazione completa via software
  4. il driver deve considerare il clock del microcontroller nel range più ampio possibile
  5. il driver deve comprendere il funzionamento sia utilizzando il pin RW sia non utilizzandolo.
  6. 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.


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 18/12/12.