Asistent

Osnove
mikroprocesorskih
sistemov


Računalniško
načrtovanje vezij II


Mikroprocesorji
v elektroniki
  Laboratorijske vaje
    Programiranje v zbirniku
Zbirniška funkcija
Zapis s plavajočo vejico
Digitalna ura
Generator vlaka
impulzov

Gonilnik
prikazovalnika LCD

Gonilnik asinhronih
zaporednih vrat

Uporaba operacijskega
sistema v realnem času

Gonilnik prikazovalnika LCD

Besedilo vaje: Napišite gonilnik za prikazovalnik LCD, ki bo prirejen za zelo kratke časovne rezine. Gonilnik naj na prikazovalnik ves čas izpisuje niz 32-ih znakov, na katere kaže globalni kazalec lcd_string.

Razlaga: Opravilo napišete v razvojnem okolju, ki teče na osebnem računalniku. Pripravljen delovni prostor (angl. workspace) z vsemi pripadajočimi datotekami najdete tukaj. V njem se poleg nastavitev projekta nahajajo tudi datoteke s spremljajočo izvorno kodo.

Po končanem zagonu pristanemo v prazni funkciji start_up(), ki se nahaja v datoteki startup.c. Tu mikrokrmilnik inicializirate, kar naredite s klicem funkcije init(). Za njeno uporabo morate vključiti datoteko init.h. Napisano opravilo preizkusite v danem operacijskem sistemu, ki ga dvignete s klicem funkcije sch_on(). Pri tem določite tudi dolžino časovne rezine. Opravilo seveda navedete v seznamu opavil sch_tab[] v datoteki rtos_tasks.c, s pripadajočo extern deklaracijo v datoteki rtos_tasks.h. Ne pozabite dodati tudi prazno priviligirano opravilo. Razlago delovanja in opis izvorne kode operacijskega sistema najdete v skripti.

Gonilnik za prikazovalnik LCD lcd_driver_1() smo že uporabljali kot samostojno funkcijo, pa tudi kot opravilo. Gonilnik počne prav to, kar od nas zahteva vaja. Ob vsakem klicu na prikazovalnik LCD izpiše niz 32-ih znakov, na katere kaže globalni kazalec lcd_string. Za osvežitev celotnega prikazovalnika potrebuje gonilnik lcd_driver_1() nekaj manj kot 10ms. Kot opravilo ga tako lahko uporabimo le, ko je časovna rezina vsaj tako dolga, ali daljša.

V datoteki main.c bomo napisali nov gonilnik za prikazovalnik LCD, ki ga bo možno uporabljati tudi v krajših časovnih rezinah. Poimenujmo ga lcd_driver_2(). Namesto da ob vsakem klicu osvežimo celoten prikazovalnik LCD, bo naš gonilnik vsakič osvežil le en znak. Zaradi tega bo mnogo krajši in tako primeren za krajše časovne rezine. Vendar bo posledično za osvežitev celotnega prikazovalnika potrebnih 32 klicev. Prav tako bo gonilnik lcd_driver_2() poleg globalnega kazalca lcd_string potreboval še indeks, poimenujmo ga lcd_index, ki bo podajal zaporedno številko znaka, ki ga gonilnik trenutno osvežuje. Algoritem gonilnika je enostaven in ga prikazuje slika spodaj.

Prikazovalniku LCD pošiljamo podatke, oziroma osvežujemo znake s pomočjo funkcije lcd_write_data(). Funkcija se nahaja v datoteki gpio.c, njena deklaracija pa je naslednja:

  void lcd_write_data(int data);

   - data ... znak, ki ga zapišemo na mesto prikazovalnika LCD, kjer se trenutno nahaja kurzor

Poleg osveževanja znakov moramo upoštevati, da je vsaka vrstica prikazovalnika LCD dolga 40 znakov, od katerih jih je prikazanih le 16. Zato je potrebno ob koncu prve vrstice podati ukaz za preskok na začetek druge vrstice in obratno. Ukaze pošiljamo s pomočjo funkcije lcd_write_comm(). Funkcija se zopet nahaja v datoteki gpio.c, njena deklaracija pa je naslednja:

  void lcd_write_comm(int com);

   - com ... ukaz (možne vrednosti podajajo makroji v datoteki gpio.h)

Za uporabo obeh funkcij morate vključiti datoteko gpio.h, kjer so zbrani tudi ukazi prikazovalnika. Posamezen ukaz je sestavljen iz ukaza in pripadajočih zastavic, ki jih povežemo bitnim ali (|) operatorjem. V našem primeru uporabimo ukaz DDRAM za nastavljanje 7-bitnega naslova notranjega dinamičnega pomnilnika prikazovalnika LCD. Naslovi prve vrstice (40 znakov) so na intervalu od 0x00 do 0x27, naslovi druge vrstice pa na intervalu od 0x40 do 0x67. Primer: če se hočemo postaviti na tretji znak v drugi vrstici, potem to dosežemo z ukazom DDRAM | 0x42. Več o krmiljenju prikazovalnika LCD, ki je dodan učnemu razvojnemu sistemu Šarm, lahko najdete v opisu mikrokrmilnika HD44780.

V razmislek. Naš gonilnik pošlje ob koncu vrstice prikazovalniku dva bajta. Najprej osveži zadnji znak v vrstici, nakar se postavi na začetek druge vrstice. Poskusite gonilnik predelati tako, da bo ob vsakem klicu poslal le en bajt, podatek ali ukaz. S tem zmanjšamo najdaljši čas izvajanja opravila približno še za polovico.

Gonilniku bi lahko z nekaj dodatne kode dodali še več učinkovitosti. Namesto, da osvežujemo vse znake po vrsti, bi lahko osveževali le tiste, ki so se spremenili.