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 | 
     
   
 
   
 |