izdelava mobilnega robota z razvojnim sistemom robopic (2) · e-mail: [email protected] v...

9
JUNIJ 2005 SVET ELEKTRONIKE 24 Izdelava mobilnega robota z razvojnim sistemom roboPIC (2) Avtor: Silvan Bucik E-mail: [email protected] V pretekli tevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen predvsem mladim, ki se ukvarjajo s projektiranjem malih mobilnih robotov. Uporabo bi priporoLal tudi ostalim, predvsem zaLetni- kom. RoboPIC vam bo olajal prve korake, ko se boste spopadli s svojim prvim mikrokontrolerjem, ali pa boste eleli stopiti v svet vijega programskega jezika C. V razvojnem sistemu roboPIC so zajete tevilne ideje, ki so se mi porajale, ko sem kot mentor sodeloval z dijaki pri naLrtovanju avtonomnih mobilnih robo- tov. Sedaj jih posredujem tudi vam. Mikrokontroler Mogane robota predstavlja mikrokontroler PIC16F877. V njem je vpisan program, po katerem se robot med vonjo po prostoru ravna. Omenjeni mikrokontroler spada v Microchipovo druino 40-pinskih 8-bitnih mikrokontrolerjev. Za komunikacijo z zunanjim svetom uporablja 33 vhodno-izhodnih prikljuLkov, na katere so prikljuLene vse periferne naprave na tiskanem vezju (senzorji, po- gonski motorji, signalne led diode ). Njegova glavna naloga je skrb za nemoten potek izvajanja vseh operacij: to je komunicira- nje s senzorji, obdelava sprejetih podatkov, prikazovanje stanja na prikljuLkih senzorjev ter nadzor pogonskih motorjev. VeLina vhodno-izhodnih prikljuLkov mikrokontro- lerja opravlja le eno funkcijo v vezju. Nekaj prikljuLnih sponk pa je veLnamenskih. Po- men posameznih prikljuLkov nam opisuje tabela 1. Vir napajanja Vezje se napaja preko prikljuLkov X1 in X2. Preko prikljuLka X1 (linija +5 V) se napaja mikrokontroler in celoten senzorski del vez- ja. Vrednost te napetosti naj bo v obmoLju od 4,5 V pa do 5,5 V (izkunje so pokaza- le, da vezje e vedno deluje tudi pri nape- tosti 6 V). Napetost na prikljuLku X2 (linija +12 V) slui napajanju pogonskih motor- jev. Vrednost te napetosti omejujejo karak- teristike uporabljenih elektromotorjev. V ko- likor nimamo posebnih potreb po loLeni napajalni napetosti, lahko obe napajalni li- niji z mostiLkoma poveemo skupaj in zdru- imo v eno. Kdaj uporabiti loLeni napajanji in Lemu? Elektromotorji so v vezavi glavni onesna- evalci napajalnih linij. Zaradi indukcij v mo- torjih se preko njihovih prikljuLnih sponk, pa tudi po zraku, irijo elektromagnetne motnje. Nemalokrat so te motnje vzrok na- paLnega delovanja senzorjev, v doloLenih primerih pa celo motijo delovanje mikro- kontrolerja. Najhuje pri vsem tem pa je dej- stvo, da je tovrstne neveLnosti teko od- kriti in projektantom naredijo kar nekaj si- vih las. Teave reujemo s filtrirnimi kon- denzatorji, v skrajnih primerih pa se odlo- Lamo za loLeno napajanje »softverskega« in moLnostnega dela vezja (kar nam raz- vojna ploLa roboPIC tudi omogoLa). Tabela 1: Funkcije posameznih prikljuLkov mikrokontrolerja PROJEKTI / Izdelava mobilnega robota z razvojnim sistemom roboPIC

Upload: others

Post on 25-Oct-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Izdelava mobilnega robota z razvojnim sistemom roboPIC (2) · E-mail: silvan.bucik@tscng.net V pretekli ıtevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen

J U N I J 2 0 0 5 S V E T E L E K T R O N I K E

24

Izdelava mobilnega robota z razvojnimsistemom roboPIC (2)

Avtor: Silvan BucikE-mail: [email protected]

V pretekli �tevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen predvsem mladim, kise ukvarjajo s projektiranjem malih mobilnih robotov. Uporabo bi priporoèal tudi ostalim, predvsem zaèetni-kom. RoboPIC vam bo olaj�al prve korake, ko se boste spopadli s svojim prvim mikrokontrolerjem, ali paboste �eleli stopiti v svet vi�jega programskega jezika C. V razvojnem sistemu roboPIC so zajete �tevilneideje, ki so se mi porajale, ko sem kot mentor sodeloval z dijaki pri naèrtovanju avtonomnih mobilnih robo-tov. Sedaj jih posredujem tudi vam.

MikrokontrolerMo�gane robota predstavlja mikrokontroler PIC16F877. V njemje vpisan program, po katerem se robot med vo�njo po prostoruravna. Omenjeni mikrokontroler spada v Microchipovo dru�ino40-pinskih 8-bitnih mikrokontrolerjev. Za komunikacijo z zunanjim

svetom uporablja 33 vhodno-izhodnih prikljuèkov, na katere soprikljuèene vse periferne naprave na tiskanem vezju (senzorji, po-gonski motorji, signalne led diode �). Njegova glavna naloga jeskrb za nemoten potek izvajanja vseh operacij: to je komunicira-nje s senzorji, obdelava sprejetih podatkov, prikazovanje stanjana prikljuèkih senzorjev ter nadzor pogonskih motorjev. Veèina

vhodno-izhodnih prikljuèkov mikrokontro-lerja opravlja le eno funkcijo v vezju. Nekajprikljuènih sponk pa je veènamenskih. Po-men posameznih prikljuèkov nam opisujetabela 1.

Vir napajanjaVezje se napaja preko prikljuèkov X1 in X2.Preko prikljuèka X1 (linija +5 V) se napajamikrokontroler in celoten senzorski del vez-ja. Vrednost te napetosti naj bo v obmoèjuod 4,5 V pa do 5,5 V (izku�nje so pokaza-le, da vezje �e vedno deluje tudi pri nape-tosti 6 V). Napetost na prikljuèku X2 (linija+12 V) slu�i napajanju pogonskih motor-jev. Vrednost te napetosti omejujejo karak-teristike uporabljenih elektromotorjev. V ko-likor nimamo posebnih potreb po loèeninapajalni napetosti, lahko obe napajalni li-niji z mostièkoma pove�emo skupaj in zdru-�imo v eno.Kdaj uporabiti loèeni napajanji in èemu?Elektromotorji so v vezavi glavni onesna-�evalci napajalnih linij. Zaradi indukcij v mo-torjih se preko njihovih prikljuènih sponk,pa tudi po zraku, �irijo elektromagnetnemotnje. Nemalokrat so te motnje vzrok na-paènega delovanja senzorjev, v doloèenihprimerih pa celo motijo delovanje mikro-kontrolerja. Najhuje pri vsem tem pa je dej-stvo, da je tovrstne nev�eènosti te�ko od-kriti in projektantom naredijo kar nekaj si-vih las. Te�ave re�ujemo s filtrirnimi kon-denzatorji, v skrajnih primerih pa se odlo-èamo za loèeno napajanje »softverskega«in moènostnega dela vezja (kar nam raz-vojna plo�èa roboPIC tudi omogoèa).Tabela 1: Funkcije posameznih prikljuèkov mikrokontrolerja

P R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I C

Page 2: Izdelava mobilnega robota z razvojnim sistemom roboPIC (2) · E-mail: silvan.bucik@tscng.net V pretekli ıtevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen

S V E T E L E K T R O N I K E J U N I J 2 0 0 5

25

Slika 1: Izvedba napajanja na razvojnem sistemu roboPIC

Drugi razlog, zakaj se odloèamo za loèevanje napajanja senzorskega in moènostnegadela vezja, tièi �e nekje drugje. Poglejmo si na primeru. Potem, ko se robot bolj ali manjuspe�no �e sprehaja po labirintu, se nemalokrat pripeti, da se robot »nabije« na stenoali pa obtièi v kak�nem vogalu. Kaj se takrat dogaja? Robot se sku�a na vsak naèinre�iti iz dane situacije in zato sku�a pogonska kolesa zavrteti v smeri re�itve iz objema.

Ker je robot blokiran,se kolesa ne morejoobraèati oziromaspodrsavajo. Pri temse tok skozi motorjemoèno poveèa. Po-veèana obremenitevbaterije, ki vezje na-paja, pa povzroèi se-sedanje napetosti(posebno, èe je bate-rija �e nekoliko iztro-�ena). V primerih, kose iz istega napajal-nega vira, kot se na-pajajo pogonski mo-torji, napajajo tudisenzorji, bodo sled-nji posledièno izme-rili napaène vredno-sti, kar se ne bi sme-lo zgoditi. V tem pri-meru po�ljejo sen-zorji v mikrokontrolernapaène podatke,mikrokontroler papriène robota usmer-jati v napaèno smer.Iz povedanega je ja-sno razvidno, da jeloèeno napajanje bo-lj�a re�itev, vendarpotrebujemo dvakompleta baterij, karpoveèa stro�ke obra-tovanja robota. Po-

Slika 2: Namestitev senzorjev na mobilnemu robotu

Slika 3: Prikljuèki za prikljuèitev analognih senzorjev na razvojni plo-�èi

P R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I C

Page 3: Izdelava mobilnega robota z razvojnim sistemom roboPIC (2) · E-mail: silvan.bucik@tscng.net V pretekli ıtevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen

J U N I J 2 0 0 5 S V E T E L E K T R O N I K E

26

leg tega pa ne smemo pa pozabiti, da veèje �tevilo baterijskihvlo�kov pomeni tudi veèjo maso robota. Tak�no odloèitev, enot-no ali loèeno napajanje, na koncu prepu�èam vam, dragi bralci.

SenzorjiRazvojna plo�èa podpira uporabo dveh osnovnih tipov senzorjevrazdalje: analognih in digitalnih IR senzorjev. Kak�na je razlikamed njima? Analogni senzor daje na svojem izhodu napetost, kije premosorazmerna z izmerjeno razdaljo do ovire. Digitalni sen-zor pa na izhodu daje le dve stanji: napetost 5 V, èe senzor nezazna ovire oziroma 0 V, èe je senzor pred seboj zaznal oviro.

Digitalni senzorjiKot digitalne senzorje smemo uporabiti le senzorje dru�ineSFH5110. V primeru, da �elite uporabiti kak drug tip senzorjev,predhodno preverite, ali imajo ti senzorji enako razporeditev vho-dno-izhodnih prikljuèkov.Digitalni senzor SFH5110 ne deluje samostojno. Uporabljamoga v paru z IR led diodo, ki oddaja modulirano infrardeèo svetlo-bo ustrezne frekvence. Tovrstnim senzorjem so namenjeni pri-kljuèki SEN1-SEN6 vkljuèno s konektorjem K3. Na prikljuèkeSEN1-SEN6 ve�emo IR sprejemnike SFH5110, IR led diode pana prikljuèek K3. Razvojni sistem omogoèa uporabo osmih IRled diod. Te so vezane v vezavo s skupno anodo. Skupna spon-ka, kamor so povezane anode IR led diod, je povezana z izvoromsignala frekvence pribli�no 40 kHz, ki ga generira èasovno vezjeNE555. Frekvenco je mo�no v doloèenem obmoèju spreminjatipreko trimerja P9. Delovanje posameznih IR led diod se omogo-èi z logièno 1 na pripadajoèem prikljuèku vrat PORTD. Ti izhodiso dodatno tokovno ojaèeni (èeprav, to ne bi bilo nujno potrebo)preko polja tranzistorjev ULN2803 (IC2).Vzporedno z izhodi sprejemnikov SFH5110 so vezane tudi mi-krotipke. Te nam omogoèajo simulacijo - predhodno preverjanjeprograma pred vkljuèitvijo senzorjev v vezavo.

Analogni senzorjiAnalogne senzorje ve�emo na prikljuèka K1 in K2, pri èemer ko-nektor K1 slu�i za nadzor delovanja senzorjev, na konektor K2

pa so prikljuèeni izhodi analognih senzorjev. Delovanje analog-nega senzorja omogoèimo z logièno 1 na pripadajoèemu prikljuè-ku konektorja K1. Ker analogni senzorji obièajno potrebujejo tu-di napajanje, sta na konektorju K2 dodani �e napajalni liniji: +5 Vin masa (^). Podrobnosti delovanja in uporabe teh senzorjev bo-mo spoznali v bli�nji prihodnosti.

Enosmerni motorjiRazvojni sistem podpira krmiljenje dveh enosmernih motorjev, kiju ve�emo na prikljuèka X3 in X4. Zaradi prevelike porabe �alenosmernih motorjev ne moremo vezati neposredno na prikljuè-ke mikrokontrolerja. Zato je med mikrokontrolerjem in motorèko-ma name�èen gonilnik L293 (IC4). To je integrirano vezje, ki je vosnovi mostièna vezava tranzistorjev in nam omogoèa dvosmer-no krmiljenje dveh enosmernih motorjev.Gonilnik ima vgrajenih tudi nekaj »izbolj�av«. Prva je loèitev na-pajanja logiènega dela (VCC1) in moènostnega dela (VCC2) in-tegriranega vezja. Z uporabo te mo�nosti si zagotovimo, da namelektromotorji ne bodo »smetili« z motnjami po napajalni liniji vezja,preko katere se lahko med drugim napajajo tudi senzorji in mi-krokontroler. V na�i aplikaciji smo se odloèili za enotno napaja-nje integriranega vezja; senzorji in mikrokontroler se namreè na-pajajo posebej, preko svoje napajalne linije.Drugi pribolj�ek, ki nam ga ponuja gonilnik L293, je mo�nostspreminjanja vrtljajev posameznega elektromotorja. Moè oziro-ma vrtljaje spreminjamo s prevajalnim razmerjem PWM signala,ki je pripeljan na prikljuèka ENABLE. Vrtljaje lahko nastavljamoloèeno - za vsak motor posebej, kar odpira �iroke mo�nosti prinaèinu vodenja robota.

Servomotorji3-pinska konektorja K4 in K5 sta namenjena prikljuèitvi servomo-torjev. Dve nogici sta napajalni (linija +5 V ali +12 V in masa),tretja pa je krmilna sponka. Servomotorji se krmilijo direktno spulzno-�irinsko modulacijo (PCM), torej ne potrebujemo dodat-nih gonilnikov. Pri uporabi tovrstnih motorjev bodimo pozorni naizbiro napajalne napetosti. Servomotorji se namreè lahko napa-jajo z najveè 6 V. Da ne bi pri�lo do kak�nih nev�eènosti, imamopreko mostièa JP2 mo�nost izbire izvora napajanja. Izbiramo medlinijama +5 V in +12 V. Linija +12 V je sicer namenjena napajanjupogonskih motorjev. Vendar pa èe ta napetost iz kakr�nihkoli raz-logov presega vrednost 6 V, smo primorani servomotor napajati

Slika 4: Izhodni sponki za priklop enosmernih motorjev Slika 5: Izhodni sponki za priklop servomotorjev

P R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I CP R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I C

Page 4: Izdelava mobilnega robota z razvojnim sistemom roboPIC (2) · E-mail: silvan.bucik@tscng.net V pretekli ıtevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen

S V E T E L E K T R O N I K E J U N I J 2 0 0 5

27

preko linije +5 V, ki sicer napaja mikrokontroler in senzorski del.V tem primeru �al napajanji senzorskega dela in motorjev nistaveè loèeni, kar pa v praksi ne pomeni, da na� robot ne bo mogeluspe�no voziti.

Programiranje mikrokontrolerjaMikrokontroler PIC16F877 spada v dru�ino mikrokontrolerjev, kiomogoèajo direktno pisanje po programskem prostoru med de-lovanjem samim (Flash Memory Writting). Drugaèe povedano,mikrokontroler lahko sam sebe programira. Proizvajalèevega da-rila se ne gre braniti, zato bomo s pridom izkoristili ponujenomo�nost. Za programiranje ne potrebujemo posebej izdelanegaprogramatorja, kajti mikrokontroler se lahko programira kar meddelovanjem samim. Prenos poteka po serijskem protokolu RS232preko serijskega COM prikljuèka K6, mimo vmesnika MAX232(IC5) do mikrokontrolerja (no�ici RC6 in RC7). Postopek pro-gramiranja je enostaven. S pomoèjo programèka PIC downloader(dobimo ga na svetovnih spletnih straneh) po�ljemo iz osebnegaraèunalnika podatke na tiskano vezje. Nato s pritiskom tipke S1pro�imo hardverski reset mikrokontrolerja. Vpisovanje programatraja le nekaj sekund in je bistveno hitrej�e, kot poteka programi-ranje s »klasiènim« programatorjem, kot je Microchipov PicStartPlus ali brezplaèna internetna razlièica program IC prog.�al v »prazen« mikrokontroler ne bomo mogli vpisovati nièesar.Pred prièetkom uporabe je potrebno v mikrokontroler vpisati �eprogramèek, imenovan bootloader, ki bo omogoèil samoprogra-miranje. Tako bootloader kot program PIC downloader je moèdobiti na svetovnih spletnih straneh. En tak�en lep paketek zaprosto uporabo je ponudil gospod Petr Kolomaznik iz Èe�ke:http://www.ehl.cz

Programska opremaMicrochip je za svoje uporabnike razvil prijazno razvojno okoljeMPLAB IDE. Ta uporabniku omogoèa programiranje tako v zbir-niku kot v vi�jem programskem jeziku C. Oba jezika sta podprtatudi s simulacijo programa, kar nam omogoèa zgodnje odkriva-nje napak v programu. Program MPLAB IDE je brezplaèen in gadobite na proizvajalèevih spletnih straneh: http://www.microchip.comMPLAB IDE �al nima vgrajenega C prevajalnika, tega moramonamestiti posebej. Na spletnih straneh sreèamo veè ponudni-kov, ki pa v veèini ponujajo èasovno omejene verzije programov.Lepo potezo je napravilo podjetje HI-TECH, ki je za dijake in �tu-

Slika 6: Program PIC downloader

dente pripravilo sicer malo okle�èeno verzijo prevajalnika, ven-dar brez èasovne omejitve uporabe. Program se imenuje PICCLite in je dostopen na straneh omenjenega podjetja HI-TECH:http://www.htsoft.com.Glavne omejitve prevajalnika se nana�ajo na uporabo program-skega prostora (najveè 2 kB), RAM spomina (do 176 bajtov) in�tevilom podprtih mikrokontrolerjev (10 razliènih dru�in). Zadnjaomejitev je imela najveèjo te�o pri izbiri mikrokontrolerja(PIC16F877) razvojnega sistema roboPIC.

Uvod v programski jezik CZaradi la�jega razumevanja in veèje preglednosti programov gra-dimo program po vnaprej doloèenih pravilih. Pri pisanju upo�te-vamo naèela lepega programiranja. Pazimo na ustrezne razmakemed posameznimi bloki programa, smiselne celote pa zamika-mo s presledki (tabulatorji). Ne pozabimo na vnos dodatnih opi-sov (komentarjev), s pomoèjo katerih postane napisani programla�je razumljiv.Program obièajno razdelimo na veè sklopov:� glavo progama,� konfiguracijske nastavitve,� deklaracije in definicije,� inicializacijo,� glavni program,� prekinitveni program in� funkcije (podprograme).

Prvi trije sklopi vsebujejo informacije in nastavitve, ki jih potrebu-je C prevajalnik. V glavi programa se nahaja tudi mno�ica infor-macij, ki za delovanje programa sicer niso nujno potrebne, se paizka�ejo kot zelo koristne. Zadnji �tirje sklopi sestavljajo program-ski del. To je tisti del, kjer bi lahko rekli, da gre zares. Naèin obli-kovanja programskega besedila:

GLAVA PROGRAMA

// KONFIGURACIJSKE NASTAVITVE

// DEKLARACIJE IN DEFINICIJE// INICIALIZACIJA

void main (void)

{// GLAVNI PROGRAM}

// PREKINITVENI PROGRAMvoid interrupt ime_prekinitvenega_programa (void){}

// FUNKCIJEvoid ime_funkcije (void){return;}

Glava programaV glavo programa vpisujemo glavne informacije, ki so vezane naprogram: podatke o avtorju, èasu nastanka programa, deskripci-jo programa, napotke uporabnikom in druge pomembne infor-

P R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I CP R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I C

Page 5: Izdelava mobilnega robota z razvojnim sistemom roboPIC (2) · E-mail: silvan.bucik@tscng.net V pretekli ıtevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen

J U N I J 2 0 0 5 S V E T E L E K T R O N I K E

28

macije. Glavo programa obièajno oblikujemo ob zakljuèku pisa-nja, vendar je zaznamke priporoèljivo vna�ati sproti. Med pisa-njem nemalokrat kaj pomembnega pozabimo, zato si je osnovneinformacije pametno zabele�iti, in glava programa je ravno prav-�nji prostor za tovrstne zapiske.Primer glave programa:

IME PROGRAMAdeskripcija programa

avtor: Guido Bièerin, 2005Program dela takole in takole.Pri uporabi bodite pozorni na to in to.Ne posku�ajte nemogoèega.Pa veliko u�itkov.

Glave programa prevajalnik ne prevaja, med prevajanjem jo obrav-nava kot komentar. C jezik pozna dva naèina zapisa komentarjev,in sicer:� z znakom //; v tem primeru se kot komentar obravnava le vse-

bina zapisa v tekoèi vrstici desno od oznaèbe;� z oznaèbama /* in */; prevajalniku sporoèata, da se vsebina

med njima obravnava kot komentar, ne glede na dol�ino ko-mentarja (tudi, èe je komentar dalj�i od ene vrstice).

Primera zapisa:

// TO JE KOMENTAR/* VSE TO JE KOMENTAR */

Konfiguracijske nastavitveTa del programa bi lahko oznaèili z nalepko NE TIKAJ. V temdelu se namreè nahaja cel kup nastavitev, na katere vam vsaj vzaèetku ne bo potrebno misliti, saj je vse to uredil nekdo drugnamesto vas. Mladim programerjem - zaèetnikom bo to vsekakorolaj�alo delo. Izku�enej�im programerjem pa tak�en koncept mo-goèe ne bo ustrezal veè in si bodo omislili drugaène nastavitve.Naj nekaj vrstic namenimo tudi njim.

Konfiguracijska besedaKonfiguracijska beseda (__CONFIG) nosi pomembno informa-cijo glede naèina delovanja mikrokontrolerja. V njej:� izberemo tip oscilatorja (RC, HS, XT, LP), kateri poganja pro-

gram v mikrokontrolerju,� se odloèamo o uporabi varnostnega reset vezja - »watch dog«

(WDTEN, WDTDIS),� omogoèimo mo�nost zakasnitve zagona ob priklopu napajal-

ne napetosti na mikrokontroler (PWRTEN, PWRTDIS) ter� mo�nost pro�enja reset funkcije ob padcu napajalne napeto-

sti (BOREN, BORDIS),� se odloèamo o mo�nosti uporabe nizkonapetostnega progra-

miranja (LVPEN, LVPDIS),� lahko za�èitimo programski del pomnilnika pred pisanjem

(DPROT, DUNPROT, WRTEN, WRTDIS) ali� za�èitimo pred branjem programa (PROTECT, UNPROTECT)

ter� izberemo mo�nosti uporabe razhro�èevalnika (DEBUGEN,

DEBUGDIS).

Natanènej�i opisi na�tetih nastavitev so na razpolago v katalo-�kih podatkih mikrokontrolerja dru�ine PIC16F87x.Primer zapisa konfiguracijske besede za programe v aplikacijahroboPIC:

__CONFIG(HS&WDTDIS&PWRTEN&BORDIS&LVPDIS&DUNPROT&WRTDIS&DEBUGDIS&UN-PROTECT);

Vkljuèevanje zunanjih datotekV konfiguracijskih nastavitvah navedemo tudi datoteke, na kate-re se med programiranjem sklicujemo in jih zato prevajalnik po-trebuje. Najpogosteje sreèujemo dve vrsti datotek: »header« in»C« datoteke.V »header« datotekah je opravljen velik posel programskega pi-sanja. Tak�en primer je »header« datoteka pic.h, ki jo v svojihmapah vsebuje �e sam prevajalnik. V njej so definirani vsi nasloviregistrov mikrokontrolerja in imena njihovih posameznih bitov. Mi-krokontroler namreè ne pozna besednih naslovov, ampak upo-rablja le �tevilène naslove registrov. Brez pojasnil, ki jih vsebuje»header« datoteka, bi prevajalnik ne vedel, da na primer vrednostnaslova 0x0006 ustreza naslovu vhodno-izhodnih vrat PORTB.Drugi tip vkljuèenih datotek so »C« datoteke. Te datoteke so se-stavni del programa. Zaradi bolj�e preglednosti dalj�e programeobièajno razdelimo na veè poddatotek - tako imenovanih »C« da-totek. Poddatoteke obièajno oblikujemo tako, da jih zlahka lahkouporabljamo tudi drugih programih, ne le v dani aplikaciji. S tempostajajo programi kraj�i, preglednej�i, predvsem pa enostav-nej�i, programiranje pa postaja uèinkovitej�e.Primeri zapisov:

#include <pic.h>// header datoteka, ki se nahaja v mapi prevajalnika#include »moj_header.h«// header datoteka, ki se nahaja v lokalni mapi#include <delay_mili.c>// C datoteka, ki se nahaja v mapi prevajalnika

Oznaka, ki oklepa ime datoteke, <> pomeni, da se datoteka, nakatero se sklicujemo, nahaja v mapi prevajalnika, zato je prevajal-nik ne i�èe v lokalni mapi. Narekovaja »« pa prevajalniku sporoèa-ta, da se omenjena datoteka nahaja v lokalni mapi.

Deklaracije in definicijeDefinicije konstantKadar se neka konstanta v programu pogosto pojavlja, se lahkoposlu�imo elegantnej�ega zapisa, ki naredi program preglednej-�i. Konstante definiramo z ukazom #define, s èimer ji poleg ime-na priredimo tudi vrednost. V spodnjem primeru konstanti fre-kvenca_kHz priredimo vrednost 1000. Povsod v programu, kjerse bo pojavila frekvenca_kHz, bo prevajalnik ime nadomestil s�tevilom 1000. Prednost tak�nega zapisovanja je tudi v tem, daèe �elimo vrednost konstante spremeniti, to storimo le na enemmestu v programu.Primer:

#define frekvenca_kHz 1000;

Izraz #define priredi konstanti frekvenca_kHz vrednost 1000. VroboPIC programih ta konstanta definira frekvenco oscilatorja v

P R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I CP R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I C

Page 6: Izdelava mobilnega robota z razvojnim sistemom roboPIC (2) · E-mail: silvan.bucik@tscng.net V pretekli ıtevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen

S V E T E L E K T R O N I K E J U N I J 2 0 0 5

29

kHz, kar pri dani vrednosti ustreza frekvenci 1 MHz. Ta nastavi-tev je nujno potrebna, kadar se sklicujemo na datoteke iz knji�ni-ce roboPIC: delay.c, pwm.c, servo.c in ad_con.c. V ostalih pri-merih podatka o frekvenci oscilatorja ni potrebno navajati.

Makro ukaziPoglejmo si sledeèi primer zapisa:

((unsigned)(&adr)*8+(bit))

Izraz nam omogoèa operacije nad posameznimi biti spremenljivk,pri èemer &adr pomeni naslov oziroma ime spremenljivke ali re-gistra, bit pa mesto bita, nad katerim �elimo izvajati matematiènooperacijo. Programski jezik C �al elegantnej�ega zapisa ne poz-na, zato si pri pisanju programov pomagamo z makro ukazi.Primer:

#define BITNUM(adr,bit) ((unsigned)(&adr)*8+(bit))

Zapis BITNUM(adr, bit) v programu nadomesti matematièni izraz((unsigned)(&adr)*8+(bit)). Na ta naèin si prihranimo pisanje dol-gih enaèb. Vsekakor moramo priznati, da je makro zapis velikoprijaznej�i.

Deklaracije spremenljivkFunkcije in spremenljivke, ki jih bomo v programu uporabljali, jepotrebno predhodno deklarirati. Deklaracijo sestavljata ime intip spremenljivke. Spremenljivke so lahko bitnega tipa, znakov-nega tipa, celo�tevilènega tipa ali nastopajo kot �tevila s plavajo-èo vejico.Primeri deklaracij spremenljivk:

char spremenljivka;// 8-bitna spremenljivka

char spremenljivka@50;// 8-bitna spremenljivka, ki je locirana na// naslovu 0x0050

char spremenljivka=30;// 8-bitna spremenljivka z zaèetno vrednostjo 30

bit lucka@BITNUM(PORTA,2);// 1-bitna spremenljivka, ki smo ji dodelili// mesto bita 2 na vratih PORTA

int spremenljivka;// 16-bitna spremenljivka

long spremenljivka;// 32-bitna spremenljivka

float spremenljivka;// 32-bitna spremenljivka s plavajoèo vejico

Primeri deklaracij funkcij:

void ime_funkcije(void);// funkcija, ki nima ne vhodnih spremenljivk// in ne vraèa vrednosti

void ime_funkcije(char,char);// funkcija, ki ima dve vhodni spremenljivki,// obe sta znakovnega tipa

int ime_funkcije(int,char);// funkcija, ki ima dve vhodni spremenljivki// in vraèa izhodno 16-bitno spremenljivko

Pri deklaraciji funkcije je poleg imena potrebno navesti �e tipevhodnih in izhodnih spremenljivk; imena spremenljivk izpustimo.

Uporaba prireditvenih imenZa la�je pisanje programa in bolj�i nadzor nad delovanjem je smi-selno bite, nad katerimi izvajamo operacije posebej poimenovati.Pri prireditvi novih imen si pomagamo z makro ukazom BITNUM(spremenljivka, bit). Omenjeni ukaz lahko uporabljamo le na spre-menljivkah, ki so statiènega tipa in imajo vnaprej definiran na-slov. Posameznim bitom spremenljivk, katerim naslov prevajalnikdoloèi samodejno, imen �al ne moremo dodeliti.Primeri uporabe:

char sen_control @ 0x0050;// v deklaraciji spremenljivki sen_con// doloèimo tudi naslovno lokacijo (0x0050)

bit senzor2 @ BITNUM(sen_control,2);// bitu 2 v spremenljivki sen_control priredimo

ime// senzor2

bit Irled4 @ BITNUM(PORTD,4);// bitu 4 na vratih PORTD priredimo ime Irled4

bit lucka @ BITNUM(PORTB,3);// bitu 3 na vratih PORTB priredimo ime lucka

Programski delKot smo uvodoma omenili, je programski del sestavljen iz �tirihpodsklopov:� inicializacije programa,� glavnega programa,� prekinitvenega programa in� funkcij.

V resnici tako prevajalnik kot mikrokontroler poznata le tri pod-sklope: glavni program, prekinitveni program in funkcije; iniciali-zacija programa pa je vsebovana v glavnem delu programa.

Inicializacija programaInicializacija je del programa, ki se izvede le enkrat, in sicer obzagonu programa. V tem delu programa doloèimo, katere pri-kljuène sponke mikrokontrolerja se bodo obna�ale kot vhodi aliizhodi, odloèamo se o morebitni rabi posameznih modulov mi-krokontrolerja kot so: èasovniki, PWM generatorji, A/D pretvor-niki in drugo. V inicializaciji tudi odloèamo o mo�nosti uporabeprekinitvenih rutin ter njihovem naèinu delovanja.Inicializacija je sklop, ki je smiselno loèen od glavnega progra-ma, vendar sta, gledano z vidika prevajanja programa, inicializa-cija in glavni progam ena celota (funkcija main()).

Glavni program (funkcija main())Glavni program (funkcija main) je funkcija, ki ima med funkcijamiposebno mesto. Posebnost te funkcije je, da se vedno klièe obzagonu programa. Ostale funkcije - podprogrami se klièejo popotrebi (paè takrat, ko jih potrebujemo), in sicer iz glavne funkci-je ali prekinitvene rutine. V funkciji main sta zajeta tako glavniprogram kot inicializacija in skupaj tvorita eno celoto.Glavni program priènemo z navedbo imena funkcije void main(void) (glavni program nosi vedno tak�no ime). Nadaljujemo zznakom {, ki oznaèuje prièetek programske zanke, nato sledijostavki. Vsak stavek zakljuèimo s podpièjem(;), ob koncu pa fun-

P R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I CP R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I C

Page 7: Izdelava mobilnega robota z razvojnim sistemom roboPIC (2) · E-mail: silvan.bucik@tscng.net V pretekli ıtevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen

J U N I J 2 0 0 5 S V E T E L E K T R O N I K E

30

kcijo zakljuèimo z znakom }.Primer oblikovanja zapisa:

// INICIALIZACIJA // tu izvedemo inicializacijovoid main (void) // ime glavne funkcije{ // znak, ki oznaèuje zaèetek funkcijeTRISA = 0B11111111; // INICIALIZACIJSKIADCON1 = 0x07; // DELTRISB = 0B11110111; // PROGRAMATRISC = 0B11111111; //TRISD = 0B11111111; // vsak stavek sodi v svojo vrsticoTRISE = 0B00000111; // in se zakljuèi z znakom ;

// GLAVNI PROGRAM // sem sodi vsebina glavnega programa

do{if (RE0 == 0) // GLAVNI{RB3 = 0;} // PROGRAMelse{RB3 = 1;}}

while (1>0);} // znak, ki oznaèuje konec funkcije

Prekinitveni programPrekinitveni programi so posebnost delovanja mikrokontrolerjev.Prekinitveni program je del programa, ki se izvaja le po potrebi inle ob doloèenih trenutkih. V mikrokontrolerju istoèasno teèetadva programa: glavni in prekinitveni program. V normalnem re�i-mu delovanja se izvaja le glavni program, prekinitveni pa le obdoloèenih trenutkih.Zahteva po prekinitvi programa se pro�i ob nekem dogodku (pri-mer pritiska na tipko). Tedaj se izvajanje glavnega programa pre-kine in po�ene se prekinitveni program. Po koncu izvajanja preki-nitvene rutine se izvajanje programa nadaljuje na istem mestu,od koder je bila prekinitev klicana. Prekinitveni programi se izva-jajo razlièno pogosto. V nekaterih primerih se program skorajves èas vrti v prekinitveni rutini, medtem ko se v drugih aplikaci-jah prekinitveni program izvede bolj poredko.Zahteva po prekinitvi se pojavi, ko nastopi doloèen dogodek inso izpolnjeni pogoji za izvr�itev prekinitvenega programa. Bistve-na razlika med klicanjem funkcije in izvajanjem prekinitvene ruti-ne je, da funkcijo vedno klièemo z izbranega mesta v programu(paè od tam, kjer smo klic funkcije zapisali), medtem ko prekini-tveni program spro�i izbrani dogodek. Lahko je to preliv katere-ga od èasovnikov, zakljuèek A/D pretvorbe, sprememba stanjana vhodu RB0 ali enem od prikljuèku od RB4 do RB7... Trenutekklicanja prekinitvene rutine je nemogoèe napovedati, saj je ta ve-dno odvisen od zunanjih dejavnikov. Ostale podrobnosti gledeizvajanja prekinitvenega programa so navedene v katalo�kih po-datkih mikrokontrolerja PIC16F877.Prekinitveni program se od ostalih funkcij razlikuje po imenu vo-id interrupt. Pisanje prekinitvenega programa pa poteka po prejopisanih naèelih.Primer prekinitvenega programa:

// PREKINITVENI PROGRAMIvoid interrupt timer0 (void)

// ime prekinitvenega programa{ // znak, ki oznaèuje prièetek preki

nitvene rutine

RB0 = !RB0; // programsko besediloOPTION = 0B00000110;TMR0 = 61; // prekinitvenegacontrol.b0 = 1;T0IF = 0; // programa

} // znak, ki oznaèuje konec prekini tvene rutine

Funkcije

Zaradi bolj�e preglednosti in la�jega programiranja dolga pro-gramska besedila razbijemo na veè kraj�ih delov, imenujemo jihfunkcije ali tudi podprogrami. Funkcije lahko uporabimo tudi vdrugih programih, tako nam jih ni potrebno pisati vsakokrat po-sebej. V programu funkcije klièemo po potrebi, lahko tudi veè-krat. Klic funkcije sestavljata ime funkcije z v oklepaju zapisanimivhodnimi spremenljivkami.Primer klica funkcije:

pwm1_out(5000,71);

Funkcija se od glavnega in prekinitvenega programa loèi tudi potem, da funkcija lahko ob koncu izvajanja vrne vrednost (return();); medtem ko prej omenjeni rutini pa ne.Pri pisanju funkcije najprej navedemo njeno ime (void ime_pro-grama (void)), nadaljujemo z znakom {, ki oznaèuje njen prièetek,sledijo stavki, ob koncu pa funkcijo zakljuèimo z return; in zna-kom }.Primer funkcije, ki ne vraèa vrednosti:

void pocakaj (void)// IME FUNKCIJE

{// znak, ki oznaèuje prièetek programskega besedila

int del_reg1;// lokalna spremenljivka// v funkciji

for (del_reg1=0x06FA;del_reg1!=0;del_reg1�)// programsko{#asm // del programa besedilonop // v zbirni�kem#endasm // jeziku funkcije

}return;

// funkcija ne vraèa vrednosti

} // znak, ki oznaèuje konec programskega besedila

Primer funkcije, ki vrne vrednost:

get_ad(char chanel,char mode)// IME FUNKCIJE

P R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I CP R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I C

Page 8: Izdelava mobilnega robota z razvojnim sistemom roboPIC (2) · E-mail: silvan.bucik@tscng.net V pretekli ıtevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen

S V E T E L E K T R O N I K E J U N I J 2 0 0 5

31

{// znak, ki oznaèuje prièetek programskega besedila

if (mode==1)ADCON1 = 0B10000101;

elseADCON1 = 0B10000100;

if (frq<1250)ADCON0 = 0B00000000;

else if (frq<5000)ADCON0 = 0B01000000;

else if (frq<20000)ADCON0 = 0B10000000;

elseADCON0 = 0B11000000;

if (chanel==3)ADCON0 = (ADCON0&0B11000000)|(0B00011001);

else if (chanel==1)ADCON0 = (ADCON0&0B11000000)|(0B00001001);

else if (chanel==0)ADCON0 = (ADCON0&0B11000000)|(0B00000001);

else{ad_res = 0;goto napaka;}

wait_milli(1);ADGO = 1;while (ADGO==1)

{}ad_res = ADRESH<<8|ADRESL;napaka:return(ad_res);

// funkcija vrne vrednostspremenljivke ad_res} // znak, ki oznaèuje konecprogramskega besedila

Vhodno-izhodna vrata mikrokontrolerjaPreden nadaljujemo z delom, bi nekaj vrstic namenili �e mikro-kontrolerju oziroma prikljuèkom mikrokontrolerja.Mikrokontroler vsebuje 5 vhodno-izhodnih vrat (PORTA, PORTB,PORTC, PORTD ter PORTE), ki jih uporablja za komunikacijo zzunanjim svetom. Vrata imajo obièajno po 8 prikljuèkov; izjemista PORTA, ki imajo 6 prikljuèkov in PORTE, ki imajo le 3 pri-kljuèke.Za komunikacijo z izhodnimi prikljuèki mikrokontrolerja skrbi re-gister PORTx. Vsako vpisovanje v ta register bo povzroèilo spre-membo stanja na izhodnih sponkah. Podoben uèinek povzroèibranje registra PORTx; prebrana vrednost bo enaka stanju naizhodnih sponkah mikrokontrolerja.

Smer delovanja vratAli bo posamezni prikljuèek deloval kot vhod ali izhod, je odvisnood nastavitve registra TRISx. Èe na pripadajoèem mestu (TRISx?)vpi�emo vrednost 1, pomeni, da bo prikljuèek (Rx?) deloval kotvhod, pri vrednosti 0, pa bo prikljuèek deloval kot izhod.Vse prikljuèke, ki ostanejo neizkori�èeni (v aplikaciji jih ne potre-bujemo), definiramo kot vhode. Èe so ti prikljuèki doloèeni kotizhodi, bodo v primeru kratkih stikov na teh mestih stekli kratko-stièni tokovi, ki bodo unièili izhodne ojaèevalnike vhodno-izho-dnih vrat.

Vaja 1: Pri�ig led diodeTako, dovolj teorije. Pa preizkusimo na�e razumevanje. Prvo vajobomo namenili prebijanju ledu. Program, ki ga bomo napisali, bo

Tabela 2

Slika 7: Slika vezava led diode

pri�ig led diode na izhodni sponkiRB0. Preden priènemo z razmi�lja-njem, predlagam, da si pogledamo ve-zavo led diode na omenjenem prikljuè-ku slika 7Dioda je prikljuèena v vezavo s sku-pno anodo. To pomeni, da na delova-nje diode vplivamo z napetostjo na ka-todi, ta pa je vezana na prikljuèek RB0vrat PORTB. Dioda bo zasvetila, èe bo

na tem prikljuèku napetost 0 V, povedano »po digitalno« logièna0. V nasprotnem primeru bo ostala ugasnjena.

Kako re�iti problem?� Vse zunanje prikljuèke mikrokontrolerja definiramo kot vho-

de, razen prikljuèka RB0, ki ga definiramo kot izhod.� Pri�gemo led diodo z vpisom logiène 0 na izhod RB0.

Re�itev problema v programskem jeziku C:

// INICIALIZACIJAvoid main (void) // IME GLAVNE FUNKCIJE{

P R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I CP R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I C

Tabela 3

Page 9: Izdelava mobilnega robota z razvojnim sistemom roboPIC (2) · E-mail: silvan.bucik@tscng.net V pretekli ıtevilki smo se spoznali z razvojnim sistemom roboPIC. Izdelek je namenjen

J U N I J 2 0 0 5 S V E T E L E K T R O N I K E

32

TRISA = 0B11111111; // PORTA definiramo kot vhodADCON1 = 0x07;

// PORTA definiramo kot digitalna vhodno-izhodna vrata

TRISB = 0B11111110; // RB0 doloèimo kot izhod, vsi ostali prikljuèki so vhodi

TRISC = 0B11111111; // PORTC definiramo kot vhodTRISD = 0B11111111; // PORTD definiramo kot vhodTRISE = 0B00000111 // PORTE definiramo kot vhod// GLAVNI PROGRAM RB0 = 0; // pri�gemo led diodo, dioda gori ob

aktivni logièni 0stop: // ustavimo izvajanje programagoto stop;}

Samostojno re�ite sledeèe naloge:1. Spremenite program tako, da se bo pri�gala led dioda na pri-

kljuèku RB6.2. Spremenite program tako, da se bosta istoèasno pri�gali led

diodi na prikljuèkih RB3 in RB5.3. Pri�gite vse led diode na vratih PORTB.

Do naslednjega snidenjaDanes smo namenili veè èasa teoriji. �al brez ustreznih temeljevuspe�nega nadaljevanja ne more biti. Pa nasvidenje � do pri-hodnjiè! l

Literatura:[1] Microchip, PIC16F87x data sheet, Microchip Technology Incorpo-rated, 2001,http://ww1.microchip.com/downloads/en/DeviceDoc/30292c.pdf;[2] B. Per�iè, Gradnja mikroprocesorskih sistemov, Ljubljana: Fakultetaza elektrotehniko, 1998,[3] HI-TECH, PICC Lite C Manual, HI-TECH Software, 2002,http://www.htsoft.com/downloads/manuals.php;[4] B.W. Kernighan, D.M. Ritchie, Programski jezik »C«, Ljubljana: Fa-kulteta za elektrotehniko, 1991,Programska oprema:[1] Microchip, MPLAB IDE v6.61,http://ww1.microchip.com/downloads/en/DeviceDoc/mp661.zip;[2] HI-TECH software, PICC lite COMPILER v8.05PL2,http://www.htsoft.com/products/PICClite.php;[3] Microchip, PIC18F/PIC16F Quick Programmer,h t t p : / / w w w . m i c r o c h i p . c o m / s t e l l e n t /idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en012031;[4] Petr Kolomaznik, EHL elektronika, PIC downloader v1.08,http://www.ehl.cz;[5] Herman Aartsen, TNO - The Netherlands, PIC Bootloader +,http://www.microchipc.com/

Slika 2: Slika razporeditev indikacijskih led diod na tiskanem vezju

P R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I CP R O J E K T I / I z d e l a v a m o b i l n e g a r o b o t a z r a z v o j n i m s i s t e m o m r o b o P I C