|
Inicializacija mikrokrmilnika (MAM, VPB in PLL) Besedilo vaje: Izdelajte program, ki bo na prikazovalnik LCD izpisoval trenutne frekvence urinega signala procesnega jedra, urinega signala perifernega vodila VPB, tokovno krmiljenega oscilatorja v fazno ujeti zanki in število ciklov potrebnih za polnjenje pomnilniškega pospeševalnika. Ob pritisku tipk T0, oziroma T1, naj se frekvenca urinega signala procesnega jedra poveča, oziroma zmanjša. Podobno naj se ob pritisku tipk T2, oziroma T3, frekvenca urinega signala perifernega vodila VPB poveča, oziroma zmanjša. 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. Opis datotek, ki se nahajajo v paketu, najdete v uvodu razlage prve vaje (samostojni zagon). Lastno kodo, ki izvaja to vajo, dodate v prazno definicijo funkcije main() v datoteki main.c. Najprej morate mikrokrmilnik inicializirati, kar naredite s klicem funkcije init() v funkciji start_up() v datoteki startup.c. Za njeno uporabo morate vključiti datoteko init.h. Opis funkcije init() prav tako najdete v razlagi prve vaje (samostojni zagon). Podatek o frekvenci urinega signala procesnega jedra fclk lahko preberete v registru PLLSTAT. Biti msel podajajo konstanto m, ki pravzaprav določa fclk. In sicer velja fclk = m * fosc , pri čemer je fosc = 12MHz. Od tu dobite frekvenco urinega signala perifernega vodila VPB fVPB. Register VPBDIV podaja faktor deljenja n. Velja fVPB = fclk / n . Frekvenca tokovno krmiljenega oscilatorja v fazno ujeti zanki fcco je podana s konstanto p, ki se nahaja v bitih psel v registru PLLSTAT. Velja fcco = 2 * p * fclk . Podrobnejšo razlago vsebine registrov PLLSTAT in VPBDIV, ter pomena posameznih bitov, najdete v skripti. Maski bitov msel in psel v registru PLLSTAT podajata v naprej definirana makroja:
#define msel 0x0000001f
Preostane še število ciklov potrebnih za polnjenje pomnilniškega pospeševalnika. Podatek se nahaja v registru MAMTIM. Podrobnejši opis pomnilniškega pospeševalnika prav tako najdete v skripti. Zbrane podatke s pomočjo gonilnika lcd_driver_1() izpišete na prikazovalnik LCD. Izvorna koda gonilnika je priložena v datoteki main.c. Gonilnik ob vsakem klicu na prikazovalnik LCD izpiše vsebino niza, na katerega kaže globalni kazalec lcd_string (glej prvo vajo - samostojni zagon). Vsak pritisk na katerokoli izmed tipk povzroči spremembo nastavitev mikrokrmilnika. Spremenite jih tako, da mikrokrmilnik enostavno ponovno inicializirate z novimi nastavitvami, kar naredite s klicem funkcije init(). Pri tem morate paziti le na meje možnih nastavitev. Primer: če je frekvenca urinega signala procesnega jedra fclk enaka 60MHz, potem je kljub pritisku tipke T0 ne moremo več povečevati, saj ima fclk že največjo možno vrednost. Za odčitavanje stanja tipk uporabite funkcijo get_keys(), katere izvorna koda se nahaja v datoteki gpio.c. Deklaracija funkcije get_keys() je naslednja: int get_keys(); Funkcija vrne odčitano stanje tipk v vrednosti tipa integer. Biti na mestih tipk T0, T1, T2 ali T3, ki so pritisnjene, so postavljeni na ena. Maske posameznih tipk podajajo v naprej definirani makroji T0, T1, T2 in T3 (glej prvo vajo - samostojni zagon). Posebno pozornost je potrebno posvetiti temu, da vsak pritisk tipke spremeni nastavitve mikrokrmilnika le za en korak, neglede na to, koliko časa je tipka pritisnjena. V ta namen moramo pazljivo načrtovati algoritem vaje, ki je podan na sliki spodaj. Inicializacija mikrokrmilnika je v algoritmu izpuščena.
Vidimo, da se nastavitve mikrokrmilnika spremenijo le v primeru, ko je tipka pritisnjena na novo. Za to poskrbi spremenljivka ready, ki je enaka ena le v primeru, ko ni pritisnjena nobena tipka. Takrat nov pritisk katerekoli tipke povzroči spremembo nastavitev mikrokrmilnika. | |
![]() |
![]() |
![]() |