Esercitazioni ASM - PIC18

 


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

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 13/01/13.