ESERCITAZIONE # 12b
Inizializzazione
Una importanza non secondaria è da attribuire alla routine di
inizializzazione del controller.
Solitamente questa parte è del tutto trascurata, in quanto, al primo avvio, l'
arrivo della tensione al modulo resetta il controller e lo predispone per l'
uso. Però vanno considerati alcuni punti:
- un reset del microcontroller NON resetta il modulo LCD, che mantiene le
ultime impostazioni programmate fino alla prossima caduta di tensione o ad
una nuova programmazione. Questo può impedire l' uso corretto del modulo.
-
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). Durante questo tempo
iniziale il display non può accettare ordini dall'esterno Qualsiasi
cosa inviata al display non ha conseguenza al minomo, mentre può essere
interpretata come una serie di comandi errati, nel caso peggiore.
-
Va anche considerato che se la tensione viene a mancare
e ritorna , o arriva inizialmente, in mod non conforme alle specifiche del
foglio dati del controller, questo si resetterà in maniera parziale o
incompleta, impedendo il corretto uso del display.
Per maggiori informazioni consultate le
pagine relative ai moduli LCD.
L' inizializzazione effettuata dal nostro driver è, invece, una completa
inizializzazione software secondo le specifiche fornite dal costruttore.
Essa comprende nella fase iniziale anche la corretta inizializzazione dei
port interessati al controllo del modulo LCD. Una struttura #if-#else-#endif
permette di includere o meno la linea RW.
;********************************************************************
; LCDinit - Subroutine
; The routine initialize the interested I/O and perform a
; complete reset by instructions of the LCD.
; End with display module configured as:
; - 8 bit mode, 5x7 dots, display on, cursor on (no blink)
;
; LCDTYPE = 0 Long initialization (Hitachi) HI44780, SPLC780D, ST7066
; NT3881D, SED1278, NJU6468, NJU6470, NJU6408, LC7985NA
; LCDTYPE = 1 Initialization as before, but with short timing set
; LCDTYPE = 2 Short initialization S6A0069, KS066U, KS0070B, KS0073
; LCDTYPE = 4 Short + special set for controller KS7033
;
; Resources : call LCDXMIT, LCDClk, DelayUS, LCDCMD
;********************************************************************
LCDInit:
; set I/O
bcf LCD_Ew
; clear LCD clock latch
#if LCDRW == 0
; if no-check-BF-mode selected
#else
; no operation
bcf LCD_RWw
; else clear RW pin latch
#endif
bcf LCD_RSw
; clear RS pin latch
clrf LCDportw
; clear data port latch
bcf LCD_Etris
; set command lines to output
bcf LCD_RStris
#if LCDRW == 0
; if no-check-BF-mode
#else
; no operation
bcf LCD_RWtris
; else RW pin as out
#endif
clrf LCDtris
; set data lines as out |
La routine procede fissano un tempo iniziale di attesa per la stabilizzazione
del controller. Il tempo viene determinato a seconda del tipo di controller in
uso. Certmente si potrebbe utilizzare un unico tempo generico, ma è inutile una
attesa più lunga del necessario e, per contro, è pericoloso avviare le
operazioni sul display prima del tempo indicato dal foglio dati.
La routine di tempo utilizzata è la procedura DelayUS, descritta
qui. Va tenuto presente che in questo driver le routine di tempo sono del
genere waste time, ovvero impegnano il processore in loop di istruzioni,
solitamente a decrementare contatori. Può essere considerato poco
efficace in quanto si occupa il microcontroller solamente in una attesa, ma per
questa applicazione il metodo è stato ritenuto il più valido, in quanto il comando del modulo
display è certamente la task a più basso livello in un insieme di altre
attività che costituiscono un programma complesso. Le altre task faranno uso di
interrupt, se necessario, mentre non è previsto alcun interrupt per questo
driver, la cui attività può essere interrotta in qualsiasi punto e ripresa
dopo qualsiasi tempo senza che l' operazione in corso venga danneggiata.
Questo non vieta, se necessario, di introdurre un conteggio diverso del tempo,
ma si tratta sicuramente di casi molto particolari.
Se la tensione di alimentazione è minore di 4.5V, il tempo di attesa
iniziale è aumentato.
; Initial delay
; >= 15ms for HD44780 and >= 30ms for other controllers
; Delay done repeating a single 5 ms delay.
DelayMS 5 ; 15 ms
DelayMS 5
DelayMS 5
#if LCDTYPE > 1
; add other 15 ms
DelayMS 5
DelayMS 5
DelayMS 5
#endif
#if LCDVOLT < 5
; if Vdd low, add 10 ms
DelayMS 5
DelayMS 5
#endif
|
L'inizializzazione per istruzione è aderente a quanto indicato sul foglio
dati del controtler HD44780 di Hitachi.
Non esiste alcuna ragione per fare diversamente e non esiste alcuna ragione di
abbreviare o modificare la sequenza che il costruttore ha stabilito. Qualsiasi
variazione fa correre il rischio di ritrovarsi con il display non correttamente
inizializzato.
; LCD initialization by instructions start here.
; Cannot check BF during initial setup
movlw 0x30
; send b'00110000' - 8 bit mode
LCDXMIT
; on data bus
rcall LCDClk
; clock LCD
#if (LCDTYPE == 0)
; Long initialization - Flowchart from Hitachi document
; The following repeat 3 times the start 8 bit mode command
; waiting for the scheduled delays
DelayUS 4100
; 1st delay
rcall LCDClk
; 2nd time the same command
DelayUS 100
; 2nd delay
rcall LCDClk
; 3th time the same command
DelayUS 4100
; 3th delay
#endif
|
Questa inizializzazione va bene per tutti i tipi di controller compatibili
con HD44780.
Per contro, Samsung non include per i suoi controller l' inizializzazione
ripetizione del comando 3.
Quindi il driver esclude questa, se richiesto, e invia i comandi di setttaggio
delle modalità di funzionamento.
; other LCD - Samsung controller
; Short initialization - Flowchart from Samsung document
; LCD working mode definition
; From now can check BF (if RW is enabled).
#if LCDLINENUM == 1 ; 1 line module
LCDCMD LCD_1L ; 8 bit, 1 line, 5x7
#else
; more lines module
LCDCMD LCD_2L ; 8 bit, 2 lines, 5x7
#endif
LCDCMD LCD_OFF ; display off
LCDCMD LCD_CLR ; clear display and home
LCDCMD LCD_CR ; entry mode : cursor move l->r
|
Nel caso in cui si stia impiegando un modulo con controller KS0073, ad
esempio EA DIP204, l'
inizializzazione riguarda anche le funzioni speciali.
#if LCDTYPE == 2
; initialization for KS0073 controller - EA DIP204-4
; add special command setup
LCDCMD LCD_E2L
;$34 8 bit mode, 2 lines, RE=1
LCDCMD LCD_EL4
;$09 4 lines
LCDCMD LCD_E0L
;$30 extended off, RE=0
LCDCMD LCD_ONC
;$0C display on, cursor off, blink off
LCDCMD LCD_CLR
;$01 clear display & home
LCDCMD LCD_CR
;$06 cursor l -> r, shift off
LCDCMD LCD_E1L
;RE = 1
LCDCMD LCD_BID0
;BID = 0
LCDCMD LCD_ShL0
;no shift enabled
LCDCMD LCD_E0L
;RE=0
#endif
return |
|