Tajmeri
Verovatno najinteresantnija
oblast u programiranju mikrokontrolera su tajmeri. U ovom članku su oni razmatrani u
sklopu MCX11. Pitanje je šta se dobija njihovom primenom?
Ovaj mali serijal o programiranju
motorolinog mikrokontrolera 68HC11 na osnovu real-time operativnog sistema (RTOS) MCX11
kao cilj ima da predstavi kako se mikrokontroler može bolje i efikasnije (is)koristiti.
Sledi kratki osvrt na teme o kojima se pisalo u prethodna četiri broja. Počelo se sa
opisom jednog mikrokontrolerskog sistema za merenje brzine obrtanja elektromotora. Posle
toga je predstavljen MCX11 kao softve-rska biblioteka i njegove mogu-ćnosti. Nakon toga
je sledio opis pojedinih klasa funkcija koje su deo MCX11. Prvo su analizi-rane funkcije
namenjene za kontrolu rada »taskova« (engl. task – zadatak, posao). Podsetimo se da
taskovi izvršavaju specifične poslove u aplikaciji, i obično se nazivaju drajveri
(engl. driver – onaj koji pokreće). Poslednja tema su bili »semafori« kao mehanizam
koji podržava sinhronizaciju u radu sistema.

|
Šta se podrazumeva pod pojmom
»tajmer« u MCX11? Možda je najjednostavnije objašnjenje - davalac vremena. Dakle,
postoji »neko ko meri vreme« (na neki način) i kome je dozvoljeno da pruža informacije
i preduzima određene akcije. Zadatak korisnika tajmera je da postavi pravo pitanje.
Ostaje još mala nedoumica kakva pitanja smemo postavljati? Običnim rečima, neki subjekt
X može, na primer, zahtevati:
»Od ovog trenutka želim da budem obavešten da je prošlo 10 sekundi.«
»Od ovog trenutka želim da budem obaveštavan svakih 5 sekundi.«
»Neka Y (neko drugi) bude obavešten po isteku 15 sekundi od ovog trenutka (pretpostavka
je da Y čeka signal).« itd.
Na osnovu gornjih rečenica se može steći uvid u to šta možemo zahtevati od davaoca
vremena. Vraćajući se u oblast inženjerske prakse, gornja pitanja se moraju prevesti na
jezik mikrokontrolera, ili još preciznije prilagoditi se onim mogućnostim koje pruža
MCX11 jer je pretpostavka da se koristi upravo taj RTOS. Od kontrolera do kontrolera
postoje različiti RTOS-ovi, ali je njihova ideja ista. Dakle, pažnja ne bi trebala biti
usmerena na način kako se to radi u konkretnom RTOS-u na konkretnom mikrokontroleru (mada
je i to vrlo važno), već na uopšteno shvatanje šta mehanizam davaoca vremena pruža.
Multitasking i tajmeri
Sve postaje mnogo interesantnije kada se prisetimo činjenice da je MCX11 multitasking
sistem sa prioritetima taskova vođen događajima u realnom vremenu. To znači da je
omogućen visok stepen paralelizma rada taskova. Pošto se ovde držimo filozofije kako se
nešto koristi ne ulazeći u detalje kako je to urađeno »iznutra« tako se ovde samo
kratko napominje da je mehanizam davaoca vremena u MCX11 zasnovan na mogućnosti Real Time
Interrupt-a koji ima vremensku bazu 4.096, 8.192, 16.384 i 32.768ms, zavisno od
podešavanja preskalera. Takođe se mogu definisati i multipli gornje četiri vremenske
baze. Vremenska baza može biti 49ms (kao u primeru koji sledi) ako se uvede faktor 3 =
49ms/16.384ms. Podrazumeva se da je preskaler podešen na odgovarajuću vrednost.
Postoje tri »funkcije« (u priručniku za korištenje MCX11 se one nazivaju ESR –
Executive Service Routines) koje su namenjene za rad sa davaocem vremena:
.delay. (TASK, SEMA,
TOCK)
.timer. (TASK, SEMA, TOCK)
.purge. (TASK, SEMA, PNTR).
U zagradama su navedeni ulazni
argumenti koji se prosleđuju tako što se prvi argument smešta u akumulator ACCA, drugi
u akumulator ACCB i treći u registar IX. TASK i SEMA jednoznačno definišu tajmer, TOCK
predstavlja vremenski interval koji se odnosi na dati tajmer i PNTR (kod .purge.) govori
da li se radi o svim tajmerima za dati task ili ne.
Primena .delay.-a stavlja definisani task u stanje čekanja za zadati vremenski interval.
Kada istekne definisani vremenski interval (TOCK) nastavlja se izvršavanje zaustavljenog
taska. Kada se koristi funkcija .timer., situacija je malo drugačija jer specificirani
task ne ide u stanje čekanja. Možda će tek kasnije uraditi .wait. (u prošlom broju je
bilo reči o ovoj funkciji) tj. preći u stanje čekanja na signal kao posledicu
definisanog tajmera. Upotreba funkcije .purge. poništava zahteve za tajmerima.
Primer
Sledi primer u kome su objedinjeni sledeći elementi iz MCX11:
- Kontrola rada taskova (execute,terminate)
- Upotreba semafora (wait, signal)
- Upotreba tajmera (delay, timer).

Slika 1. Šema povezivanja
|
Razmotrimo sledeću klasu
problema koja se često javlja u procesima automatizacije. Sistem se sastoji od dva ulaza
i tri izlaza. Izlazi (obično su to releji) su funkcije vremena i ulaza. Ulazi su »input
capture« linije IC1 i IC2 koje su povezane sa tasterima 1 i 2 (Slika 1.).

Slika 2. Stanje na linijama PG0, PG1 i PG2 kao funkcija vremena
|
Detektovanje pritiska tastera se
vrši preko mehanizma prekida. Izlazne linije su bitovi PG0, PG1 i PG2 porta G. »Logika«
problema je sledeća (Slika 2.):
Na početku su sve diode na
portu G ugašene.
Nakon 2 sekunde se pali dioda
PG0 i ostaje upaljena dok se ne pritisne taster na IC1 liniji. Zatim se ona gasi. Nakon
toga treba da protekne 1.5 sekundi da bi se upalila dioda PG2 koja predstavlja treći task
i koja ostaje upaljena 3 sekunde nakon čega se gasi.
Pritisak tastera na IC2
startuje povorku PWM (Pulse Width Modulation) signala na PG1 – task 2. Broj signala se
prikazuje na četverocifrenom 7-segmentnom displeju. Ova sekvenca se ponavlja pet puta
što se vidi na displeju.
| Listing
1. Linije IC1 i IC2 se kontrolišu pomoću interapta |
- ic1_isr tst intlvl
- bne notlvl01
- tst curtsk
- beq notlvl01
- ldx curtcb
- sts ACTSP,x
- lds #SYSTACK
-
- notlvl01 inc intlvl
- ldaa #$02
omoguciti novi
interapt
- oraa $1023
- staa $1023
- ldab #SEMA_1 signal
tasku 1 koji čeka
- jmp isrrtn
-
- ic2_isr tst intlvl
- bne notlvl02
- tst curtsk
- beq notlvl02
- ldx curtcb
- sts ACTSP,x
- lds #SYSTACK
-
- notlvl02 inc intlvl
- ldaa #$04
omoguciti novi interapt
- oraa $1023
- staa $1023
- ldab #SEMA_2 signal tasku 2 koji
čeka
- jmp isrrtn
|
U primeru se koriste tri
semafora. Dva su “povezana” sa rutinama za obradu prekida IC1 (SEMA_1) i IC2 (SEMA_2)
(Listing 1.), a treći omogućava međusobnu komunikaciju taskova 1 i 3 (SEMA_3, Listing
2.).
| Listing
2. Deo koda u kome su programirani taskovi |
- tsk1
<inicijalizacija SPI
komunikacije, inicijalizacija IC1 i IC2 i def. porta G kao izlaznog>
-
- ldaa #T2 ; pokreni T2
- swi
- FCB .execute.
-
- clra ; čekaj 2 sek.
- clrb
- ldx #2000/49
- swi
- FCB .delay.
-
- ldaa PORTG ; pali PG0
- oraa #$01
- staa PORTG
-
- ldab #SEMA_1 ; čekaj
IC1
- swi
- FCB .wait.
-
- ldaa PORTG ; gasi PG0
- anda #$FE
- staa PORTG
-
- ldaa #T3 ; pokreni task
3
- swi
- FCB .execute.
-
- ldaa #T3 ; postavi
tajmer
- ldab #SEMA_3 ; za task
4
- ldx #1500/49 ; 1.5 sek.
- swi
- FCB .timer.
-
- clra ; kraj taska 2
- swi
- FCB .terminate.
-
-
- tsk2
ldab #SEMA_2 ; cekaj IC2
- swi
- FCB .wait.
- clr BROJ ; brojac na 0
- LOOP clra ; 2/3 sek.
- clrb
- ldx #667/49
- swi
- FCB .delay.
- ldaa PORTG ; pali PG1
- oraa #$02
- staa PORTG
- clra ; 1/3 sek.
- clrb
- ldx #333/49
- swi
- FCB .delay.
- ldaa PORTG ; gasi PG1
- anda #$FD
- staa PORTG
- ldd BROJ ; inkrementiraj
- addd #1 ; BROJ
- std BROJ
- jsr PRIKAZ ; prikazi BROJ
- ldd #5 ; izvršavava se
- cpd BROJ ; 5 taktova
- bgt LOOP
- clra ; kraj taska2
- swi
- FCB .terminate.
-
- tsk3
ldab #SEMA_3 ; čekaj signal
- swi ; tajmera, vidi
- FCB .wait. ; task 2
- ldaa PORTG ; pali PG2
- oraa #$04
- staa PORTG
- clra ; 3 sek.
- clrb
- ldx #3000/49
- swi
- FCB .delay.
- ldaa PORTG ; gasi PG2
- anda #$FB
- staa PORTG
- clra
- swi
- FCB .terminate. ; kraj taska 3
|
Prvi semafor se odnosi na
događaj koji signalizira da se treba ugasiti dioda na PG0. Na drugom semaforu se čeka
pritisak tastera na IC2 liniji. Treći semafor je povezan sa tajmerom u tasku 3, a koji
postavlja task 1. U kodu koji se odnosi na ovaj primer je prikazano kako se koriste rutine
za obradu prekida (IC1 i IC2) i kako se povezuju u tablei prekida (Listing 3.).
| Listing
3. Tabela vektora prekida |
- ORG $FFF0
- FDB rtiisr RTI Vector
- ORG $FFF6
- FDB mcxsrv SWI Vector to enter MCX11
ESRs
- ORG $FFFE
- FDB mcxinit Power-On/Reset Vector
- ORG $FFEC
- FDB ic2_isr IC2 vectors (user's)
- ORG $FFEE
- FDB ic1_isr IC1 vectors (user's)
|
Od interesa je da pojava ova dva
događaja automatski prevodi taskove koji čekaju (WAIT) u stanje spreman (READY).
Namena gornjeg primera je bila da pokaže kako se rešavaju slični problemi, u kojima se
kombinuje rad više taskova u vremenskom domenu. Konkretni problemi iz prakse su veoma
slični, sa napomenom da svaki poseduje neke svoje specifičnosti. Možda ovde nije
naodmet spomenuti da se gornji zadatak može veoma lako rešiti primenom PLC-a. Međutim,
programiranje u RTOS je daleko fleksibilnije, istina i teže.
Raznovrsnost mikrokontrolera koja se može naći na tržištu je velika. Isto tako je
velik i izbor softvera koji se koristi za programiranje. Ovo je verovatno otežavajuća
činjenica pri izboru istih. Ono što je bio zadatak predstavljanja MCX11, real-time
operativnog sistema za Motorolin mikrokontroler 68HC11 jeste savet da se pri složenijim
zahtevima valja osloniti na funkcije koje su namenski napravljene. Autori MCX11 su A. T.
Barret & Associates, 11501 Chimney Rock, Houston, Texas 77035, (713) 728 – 9688.
Takođe se korisne informacije mogu dobiti od: AMCU Applications, M/S OE39, Motorola,
Inc., 6501 William Cannon Drive West, Austin, Texas 78735, (512) 891 – 6517.
Interesantnu ideju Brian-a Dombrowskog je preveo u delo Grant Beattie i koja se sastoji u
sledećem: iskoristiti postojeći RTOS MCX11 koji je napisan u asembleru IAS11 i uraditi
jednu vrstu »omotača« oko njega primenjujući ImageCraftov C – kompajler. Tako se
dobija vrlo efikasan kernel koji je napravljen u asembleru, a istovremeno se mogu
koristiti prednosti C-a (pregledniji i kompaktniji kod, funkcije, itd.) da se napravi kod
za »taskove«. Detaljnije o ovom »novom« C-ovskom RTOS-u bit će više reči u nekom
sledećem broju.
Korisna adresa: www.mcu.motsps.com/freeweb/pub/mcu1
| Pročitajte više o ovoj
temi |
|
|
|