Mikrokontroleri - 68HC11

Autor: Stevan Tošić

   

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.

5b121.jpg (26401 bytes)

Š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).

5b122.gif (4709 bytes)
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.).

5b123.gif (3539 bytes)
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.):

  1. Na početku su sve diode na portu G ugašene.

  2. 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.

  3. 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
Vezni igrač
MCX11 MicroController eXecutive za 68HC11
Programiranje u MCX11
Semafori
cMCX11 Real Time operativni sistemi u programskom jeziku C 

C o p y r i g h t  1998 mikroElektronika. All Right Reserved. Za sva pitanja obratite se redakciji