|
Zunanje prekinitve Besedilo vaje: Izdelajte program, ki bo �tel �tevilo impulzov dveh pravokotnih zunanjih signalov. Vsak impulz prvega signala naj �tevec pove�a za ena, impulz drugega signala pa naj ga zmanj�a za ena. Trenutno stanje �tevca prikazujte na prikazovalniku LCD. Za generiranje obeh pravokotnih signalov uporabite tipki T0 in T1. Tako bo program pri�teval pritiske tipke T0 in od�teval pritiske tipke T1. 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), datoteka vic.c pa je opisana v tretji vaji (�asovnik). Dodani sta datoteki extint.c in extint.h, kjer se nahaja koda za nastavljanje zahtev po zunanjih prekinitvah. Lastno kodo, ki izvaja to vajo, dodate v datoteko main.c, kjer se nahaja tudi prazna definicija funkcije main(). 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). Pri tej vaji ne potrebujemo nobenega izhodnega pina. Tako ob inicializaciji vse pine vrat port0 definiramo kot vhodne. Za �tetje dveh vlakov impulzov moramo dva pina vrat port0 dolo�iti kot vhodna pina za zunanje prekinitve. Podrobnej�o razlago, katere pine je mogo�e uporabiti v ta namen, najdete v skripti. Pri tem bodite posebej pazljivi pri pinih p0.9, p0.16 in p0.20 (na starej�ih �armih z zaporedno �tevilko manj�o od 50000 tudi pri pinu p0.1). Pin p0.9 je mogo�e definirati kot vhodni pin za zunanje prekinitve, vendar na u�nem razvojnem sistemu �arm temu ni povsem tako. Z elektri�ne sheme lahko razberemo, da je omenjeni pin zvezan na izhod prilagodilnika nivojev MAX232. Zaradi tega lahko zunanje prekinitve na omenjenem pinu zahteva le prilagodilnik nivojev MAX232. Podobno velja za pina p0.16 in p0.20, ki ju uporablja prikazovalnik LCD. Pine dolo�imo za vhode zunanjih prekinitev s pomo�jo funkcije extint_init(), ki je �e napisana v datoteki extint.c. Funkcijo extint_init() kli�emo iz funkcije start_up(), kjer so zbrane vse inicializacije. Za njeno uporabo morate vklju�iti datoteko extint.h. Deklaracija funkcije extint_init() je naslednja: void extint_init(int pins, int wake, int sensitivity, int trig); Argumenti funkcije extint_init() podajajo nastavitve zunanjih prekinitev:
Izbrani zunanji prekinitvi bosta pro�ili tipki T0 in T1, ki sta vezani na pina p0.12 in p0.13. Ob pritisku tipke napetost pade iz visokega v nizko stanje. Zato moramo zunanji prekinitvi nastaviti tako, da sta pro�eni s padajo�o fronto. Vhodna pina zunanjih prekinitev moramo s tipkama seveda povezati z �icama. Preostane nam �e postavitev vektorskega nadzornika prekinitev, kar naredimo s klicem funkcije vic_init(). Opis funkcije vic_init() najdete v razlagi tretje vaje (�asovnik). Nastavimo ga tako, da izbrani zunanji prekinitvi ob postavitvi zahteve tudi dejansko spro�ita vsaka svojo prekinitev. V ta namen potrebujemo dve prekinitveni funkciji, ki pripadata vsaka svoji prekinitvi. Pritiski na tipko T0 bodo povzro�ili izvr�itev prve, pritiski na T1 pa druge funkcije. Algoritma obeh funkcij prikazuje slika spodaj. S tem je glavni program, ki pravzaprav vsebuje le nastavitve, zaklju�en. Kon�amo ga z neskon�no zanko.
Obe prekinitveni funkciji sta sila preprosti. Prva pove�a in prika�e trenutno vrednost �tevca, druga ga zmanj�a in ravno tako prika�e. �tevec mora biti globalna spremenljivka, tako da je v obeh funkcijah viden. Za prikaz na prikazovalniku LCD uporabimo gonilnik lcd_driver_1(), ki smo ga spoznali �e v prvi vaji (samostojni zagon). Gonilnik je prilo�en v datoteki main.c. Ob vsakem klicu na prikazovalnik LCD izpi�e vsebino niza, na katerega ka�e globalni kazalec lcd_string. V obeh funkcijah je potrebno v ta namen narediti niz s trenutno vrednostjo �tevca. Z izvr�itvijo funkcije je trenutna zahteva po zunanji prekinitvi obdelana, zato jo umaknemo. V na�em primeru to storimo z vpisom ene izmed v naprej definiranih konstant EINTi (glej datoteko extint.h) v register EXTINT. Podrobnej�o razlago najdete v skripti. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |