|
|
|
| Software projekti |
Autor: Dragan Golubović |
|
Funkcije u ARB 8051 U prošlom broju časopisa bio je predstavljen novi pri-stup u programiranju mikrokontrolera iz familije Intel 8051. Kratko podsećanje: uz pomoć standardnog C/C++ kompajlera stvaramo PC program čijim se izvršenjem generiše program za mikrokontroler, u odgovarajućem formatu. U ovom broju biće demonstrirane nove mogućnosti biblioteke ARB 8051, sa posebnim osvrtom na kreiranje funkcija. Sa stanovišta programa za
mikrokontroler funkcije u ARB imaju dvojako značenje: poziv(ImeFunkcije)(lcall), apoziv(ImeFunkcije) (acall). Pored ovoga, funkcija može sadržati sekvencu koja se izvršava posle ARB funkcija kao što su skok(reg Izraz,ImeFunkcije) ili skok(ImeFunkcije). O ovoj upotrebi funkcija može
se još puno govoriti,a ovoga puta biće više reči o drugom načinu
korišćenja funkcija. Naime, ukoliko funkcija prima argumente ili vraća
neku vrednost,tj. nije deklarisana kao reg & min(reg pReg1,direct pReg2) u programu ona može biti pozvana kao min(a,psw) ili r1=min(r2,lok) ili min(r0,tmod)+r3 , pa i ImeBloka.opet(min(r5,acc)). Gledano sa strane programa
za mikrokontroler, telo ove funkcije se umeće u program gde god ta
funkcija bude pozvana. Stoga se ovde može govoriti o primeni funkcije
kao makroa jer nema uštede u veličini koda ali se zato dobija na
brzini i vrlo fleksibilnoj primeni. Pre nego što bude prikazan kod za
funkciju min() predstavićemo jednu malu ali korisnu funkciju čija je
svrha komparacija vrednosti dva registra (Listing1).
Izvršenjem linije temp.napusti(pReg1!=pReg2) (odnosno cjne
pReg1,pReg2,izlaz) vrši se postavljanje bita c u zavisnosti da li je
pReg1 manji ili veći od pReg2. Zbog toga ova funkcija vraća objekat
tipa flag, tačnije c. Zahvaljujući tome, funkciju je moguće
primenjivati u izrazima gde god se javlja varijabla tipa flag. Evo kako
to izgleda u već pomenutoj funkciji min() (Listing 2)
} Najpre formiramo tabelu korišćenjem ARB 8051 funkcije db(int). Umesto da svakoj memorijskoj lokaciji dodeljujemo vrednost, pozivamo u pomoć jednu for-petlju kojom se look_up tabela ispunjava odgovarajućim vrednostima. Tabela zauzima 91 (a ne 181) bajt čime se štedi na prostoru. Funkcija sinus() vraća normalizovanu vrednost sinusa ugla od 0 do 180 stepeni. Ako se ovoj funkciji preda veća celobrojna vrednost od 180, ispisuje se poruka o grešci i uvećava varijabla LB.gr za jedan (ova promenljiva sadrži broj grešaka u programu: videti datoteku arb8051.h) kako se bi se izbeglo forniranje koda. Ukoliko je medjutim ova vrednost u ispravnom opsegu onda se ispituje u kom kvadrantu se nalazi zadati ugao. Zahvaljujući jednakosti sin(x)=sin(180-x) za ugao u intervalu 0 do 180, nije potrebno formirati tabelu za uglove od 0 do 180 stepeni već samo za uglove od 0 do 90 stepeni. Ostatak funkcije biće razumljiv ako se pogledaju komentari (Listing4). U programu ova funkcija može biti pozivana samostalno ili pridružena izrazima gde figuriše varijabla a kao na primer: r2=sinus(30); U nekom od sledećih nastavaka biće predstavljena ista funkcija sa promenljivom tipa reg kao predajnim parametrom koja bi u mnogim situacijama bila korisnija nego funkcija sa celobrojnim argumentom.
|
|
C o p y r i g h t 1998 mikroElektronika. All Right Reserved. Za sva pitanja obratite se redakciji |