Asistent

Osnove
mikroprocesorskih
sistemov
  Laboratorijske vaje
    Samostojni zagon
Inicializacija
mikrokrmilnika

Časovnik
Zunanje prekinitve
Prekinitve
Ura realnega časa in
zapis v pomnilnik flash

A/D in D/A pretvorba
Asinhrona zaporedna komunikacija
Vodilo I2C

Računalniško
načrtovanje vezij II


Mikroprocesorji
v elektroniki

Samostojni zagon programa na učnem razvojnem sistemu Šarm

Besedilo vaje: Izdelajte program, ki bo na prikazovalnik LCD izpisal vaše ime in priimek. Delujoč program nato zaženite brez uporabe razvojnega okolja na osebnem računalniku.

Razlaga: Program 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 nahaja tudi nekaj v naprej pripravljenih datotek z izvorno kodo, kjer so že napisani splošni deli programske opreme. In sicer:

   - mam.c in mam.h ... inicializacija pomnilniškega pospeševalnika (MAM),
- pll.c in pll.h ... inicializacija fazno ujete zanke (PLL),
- vpbdiv.c in vpbdiv.h ... inicializacija perifernega vodila VPB,
- timer.c in timer.h ... inicializacija časovnikov timer0 in timer1,
- gpio.c in gpio.h ... delo s splošnimi vhodno/izhodnimi pini (GPIO),
- init.c in init.h ... celotna inicializacija mikrokrmilnika (uporablja kodo iz vseh zgoraj naštetih datotek),
- interrupts.c in vic.h ... prazne prekinitvene funkcije in
- crt0.s ... zagonska koda mikrokrmilnika napisana v zbirniku.

Ob zagonu programa se začne izvrševati zbirniška zagonska koda v datoteki crt0.s. Najprej prepiše strojno kodo programa iz pomnilnika flash v pomnilnik RAM. Nato postavi kazalce skladov in preskoči na izvajanje programske kode napisane v funkciji start_up(). Pri tem zbirnik zamenja programski jezik C. Funkcija start_up() se nahaja v datoteki startup.c, kjer boste mikrokrmilnik inicializirali.

Preden začnete s konkretnim programiranjem, morate mikrokrmilnik inicializirati. To naredite s klicem funkcije init(), ki je že napisana v datoteki init.c. Za njeno uporabo morate vključiti datoteko init.h. Deklaracija funkcije init() je naslednja:

  void init(int clock, int div, int input, int output, int value);

Pet vrednosti tipa integer predstavlja argumente funkcije, ki pomenijo sledeče:

   - clock ... frekvenca urinega signala procesnega jedra v MHz (možne vrednosti: 12, 24, 36, 48 in 60),
- div ... faktor deljenja urinega signala procesnega jedra za urin signal perifernega vodila VPB (možne vrednosti: cclk, cclk_2 in cclk_4),
- input ... maska vhodnih pinov na vratih port0,
- output ... maska izhodnih pinov na vratih port0 in
- value ... privzeta (začetna) vrednost na izhodnih pinih vrat port0 (možni vrednosti: 0 in 1).

Maski vhodnih in izhodnih pinov se med seboj ne smeta prekrivati, saj posamezen pin ne more biti hkrati tako vhoden kot izhoden. Če določen pin ni naveden niti v maski vhodnih, niti v maski izhodnih pinov, potem funkcija init() njegove konfiguracije ne spreminja. Med razvojem programske opreme definiramo pine, ki jih ne uporabljamo, kot vhodne. Tako se izognemo morebitnim kratkim stikom, ko mikrokrmilnik in neka zunanja enota vsiljujeta vsak svojo napetost na istem pinu. V končnem izdelku pa neuporabljene pine zaradi porabe definiramo kot izhodne.

Če hočemo na učnem razvojnem sistemu Šarm na primer uporabljati diode LED (pri tej vaji jih ne uporabljamo), potem moramo ustrezne pine vrat port0 definirati kot izhodne. In sicer so izhodni pini tisti, kamor so zvezane diode od LD0 do LD3. Maske posameznih diod LED podajajo v naprej definirani makroji:

  #define LED0 0x00000010
  #define LED1 0x00000020
  #define LED2 0x00000040
  #define LED3 0x00000080

Z logičnim operatorjem ali jih lahko med seboj povežemo v masko izhodnih pinov diod LED (LED0 | LED1 | LED2 | LED3).

Podobno velja za vhodne pine vrat port0. Med razvojem programske opreme vse pine, ki jih eksplicitno ne uporabljamo drugače, definiramo kot vhodne. Naj na tem mestu posebej omenimo le podmasko vhodnih pinov tipk od T0 do T3, ki jo lahko naredimo iz v naprej definiranih makrojev:

  #define T0 0x00001000
  #define T1 0x00002000
  #define T2 0x00004000
  #define T3 0x00008000

Maske posameznih tipk z logično operacijo ali sestavimo v podmasko vhodnih pinov tipk (T0 | T1 | T2 | T3).

Poleg izhodnih pinov diod LED in vhodnih pinov tipk, so na učnem razvojnem sistemu Šarm izhodni pini pravzaprav tudi tisti, na katere je priključen prikazovalnik LCD. Vendar teh ni potrebno navesti v maski izhodnih pinov, kajti za njihovo konfiguracijo avtomatsko poskrbi funkcija init(). Pri tem opozorimo, da funkcija init() inicializira tudi prikazovalnik LCD. V kolikor prikazovalnik LCD ni priklopljen, je potrebno njegovo inicializacijo iz funkcije init() izključiti.

Pri naši vaji ne uporabljamo niti diod LED niti tipk, uporabili pa bomo prikazovalnik LCD. Zato vse pine vrat port0 definiramo kot vhodne, funkcija init() pa bo poskrbela za prekonfiguracijo pinov prikazovalnika LCD v izhodne.

Po inicializaciji mikrokrmilnika je klicana funkcija main(), ki se nahaja v datoteki main.c. Tukaj boste dodali kodo, ki jo zahteva ta vaja. Na prikazovalnik LCD izpišete svoje ime in priimek. To naredite s pomočjo gonilnika lcd_driver_1(), katerega izvorna koda je priložena v datoteki main.c. Gonilnik je napisan splošno in se sam prilagaja frekvenci urinega signala. Deklaracija gonilnika lcd_driver_1() je naslednja:

  void lcd_driver_1();

Gonilnik ne sprejema argumentov. Ob vsakem klicu na prikazovalnik LCD izpiše znakovni niz, na katerega kaže globalni kazalec lcd_string, in je vedno dolg 32 znakov (dve vrstici po 16 znakov). Tako morate v vaši kodi pripraviti znakovni niz z zahtevanim besedilom, nakar kazalcu lcd_string priredite naslov začetka niza. S klicem gonilnika lcd_driver_1() se zahtevano besedilo izpiše na prikazovalniku LCD. Algoritem vaje je zelo enostaven in ga prikazuje spodnja slika.

Program je zaključen z neskončno zanko v funkciji start_up().

Ko program deluje, ga lahko zaženemo brez uporabe razvojnega okolja. Zapremo delovni prostor (angl. workspace) in razvojno okolje. Odklopimo učni razvojni sistem Šarm (pazite na pravilen odklop naprave, ki je z osebnim računalnikom povezana preko USB konektorja). S prestavitvijo stikala (angl. jumper) J9 na učnem razvojnem sistemu onemogočimo vgrajen USB-JTAG razhroščevalnik. Ob vklopu napajanja se program v pomnilniku flash mikrokrmilnika samodejno požene. Učni razvojni sistem Šarm deluje povsem samostojno in ne komunicira z razvojnim okoljem.