Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

download Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

of 85

Transcript of Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    1/85

    ipak postoji resenje,

    . . . .II. . . .. . .IIi=II:~-I~-I."- - - - ~ " - - - - - - - - - - - - ~ I N~_ ,- .I I l d !. . .,

    IIIispadate u gruP" ljudi koja seupoznala sa mikrokontroler imaa pri tom yam je programiranje uassembleru suvise mukotrpno?Da Ii su yam visi program skijezici koje ste probaJi nedovoljnof leksibilni i skuceni? Mislimo da

    , . .

    pisanih za dva najpopularnija PICCkompajlera - CCS C iHi-Tech PICC

    - ProgramirajteMicrochip PIC Knjiga je namenjena pocetnicima, ali iiskusnij im embedded programerimakoja vas kroz 11 poglavlja vodi krozmagicni svet jezika C sa dosta primera

    mikrokontrolerena jeziku C -M~ II~ - - - - - - - - - - - - - - - - - - - - - - ~ I KU 1=A

    koji se nalaze na prilozenorn disku.

    pocetni,}""srednji~"~..,..,---___"/

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    2/85

    ,

    UVOD

    UvodZasto koristiti C?C jezik su napravili u Bell laboratorijama u ranim 1970-im, Dennis Ritchie iBrian Kernighan. Jedna od prvih platformi za implementaciju je bio PDP-11koji je radio u UNIX okruzen]u. Od svog nastanka, on se razvio i standardi-zovao u racunarsko] industriji kao osnovni jezik za razvoj. PCje postao vred-na razvojna platforma korisceniem C++ iii drugih srodnih verzija ANSII stan-darda.C je prenosiv jezik namenjen da ima minimalno izmena kada se programiprenose sa jednog na drugi racunar, Ovo je odlicno kada se radi na PC-ju ivelikim racunarirna, ali mikrokontroleri i mikroprocesori su druga vrsta. Glav-nitok programa je u osnovi nepromenjen, dok ce razna setovanja i upravlja-nja portovima i periferijama biti mikro specificna. Kao primer ovoga je registarsmera porta na PICmicroMCU koj i se postavl ja na 1 za ulaz i 0 za izlaz, dokje kod H8 0 ulaz, a 1 iz laz.Koriscenje C-a u mikrokontrolerskim aplikaeijama je pocelo od kako su pro-izvodjaci omoqucili veee programske i RAM memorije uz dodatak brzih ope-raeija.Evo odlicnoq i neverovatnog primera: za funkeiju stoperice potrebno je 2/3dana u C-u i ii 2 sedmiee u asembleru. Zasto bismo se onda rnucif i p isal i uasembleru? Radi se 0 efikasnosti koda - program napisan u asembleru je t i-plene 80% velicine C verzije. Dobro je za velike memorije, ali nije efikasno zamanje uredjaje. Dajte novae i kupite svoj PIC!PC zasnovano u odnosu na PICmicroMCUzasnovano programsko okruzen]elnzenjeri koji su razvoj zapoceli na PC zasnovanim proizvodima imaju luksuzvee razvijenog osnovnog hardvera (npr. tastatura, proeesor, memorija, U/I,starnpac i ekran). Razvoj proizvoda se svodi na pisanje softvera i ispravlja-nje gresaka.Oni koji su na PIC zasnovanom razvoju treba da kreiraju sve interfejse pre-ma spoljasnjern svetu u obliku ulaznog i izlaznog hardvera. PC programerrnoze napisati poruku "Hello World" i onda kompajlirati program i tako dobitiporuku na ekranu. PIC programer mora da napravi RS232 interfejs, postavikomunikaeioni port unutar PIC-a, prikljuci razvojnu plocicu na komunikacioniport PC-a i omoquci da se poruka vidi.

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    3/85

    UVClD

    "Zasto se muciti?" - rekli biste. Radi se 0 prenosivost i proizvoda. Ako bi ceoPC mogao da se smesti u 40- pinsko OIL kuciste (ukljucujuci i monitor i tasta-turu) korist ili b ismo ga; danasnja minijatur izaci ja n ije dostigla ove granice.Zato cerno nastaviti da koristimo mikrokontrolere kao sto je PIC za jevtine iprenosne aplikacije.Razvojni alati za PIC zasnovane projekte nude projektantu u osnovi iste mo-qucnost i kao i PC zasnovanom razvoju uz izuzetak qrafi ck ih b ib lioteka.

    Razvoj proizvodaRazvoj proizvoda je kombinaci ja srece i i skus tva. Neki od jednostavnih zada-taka mogu uzeti dosta vremena za razvoj i usavrsavan]e u odnosu na ceopro izvod - zato budite paz lj iv i gde su vremenski rokovi k rit icn i,Za razvoj proizvoda potrebno je: vreme - mir i tisina - toqicko razmisljanje inajvaznije od svega potpuno razumevanje zahteva.Najlaksi nacin za zapoclnjanje bilo kojeg razvoja je pocetak sa praznim l istompapira zajedno sa speci fikac ijom ii i i dejom.Zapocnite cr tanjem vise rnoqucih resenja i i sp itajte svako da bis te zakl juci likoje je najjednostavnija i najbolja opcija. Ne zanemarujte ni ostale ideje naovom stepenu peste su one jos uvek moquce alternat ive.Nacrtaj te d ijagram toka, b lok dijagram, Ut i p lan spajanja i ii b ilo koji pogodancrtez za pocetak.Napravi te p locicu prototipa iii p locicu hardverske simulac ije sa sv im konf igu-risanim utI. Nemojte zaboraviti Uti pi nove ko]i se mogu zameniti kako bistepojednostavi li plocicu kasnije - obicno sa minimalnim modif ikaci jama u soft -veru.Onda pocnite pisanje koda - u blokovima koji se mogu testirati - i postepenorazvijajte svoj program. avo smanju je bro j pokusaja za ispravl janje qresakau 2000 linija na samo jedan prolaz!Ako je ovo vas prvi projekat - NEKA BUOE JEONOSTAVAN - pokusajte daukl jucujete LED iii dye pornocu tastera da biste postali bliski sa instrukcl jama,tehnikom asemblera i ispravljanja qresaka pre nego sto pokusate neki veciprojekat.Pravi te program u jednostavnim koracima - tes tirajte kako napredujete. Pre-radite svoj d ijagram toka da bude azuran.

    I

    UVDD

    IdejaIdeja je rodjena - rnozda vasa u pravom EUREKA stilu iii neko drugi ima po-trebu za proizvodom - osnovni koncept je isti.Pre nego sto pocne proces projektovanja, potrebno je razumeti osnovnu ter-minologiju - kao kada se uci novi jezik. Tako u slucaju mikrokont rolera zasni-vanih na PICmicroMCU, pot rebno je potpuno razumet i PIC jezik (set inst ruk-cija, termini i razvojni kit) pre nego sto projektovanje rnoze da pocne.Zapocnimo sada sa opsti rn terminima, nekim cinjenicarna 0 PIC-u i razl ici i z-medju mikroprocesorski i mikrokontrolerski zasnovanih sistema

    TerminologijaZapocnirno sa nekim osnovnim termin ima koji se koriste.Mikr okontroler Komad plastike, metala i prociscenoq peska, koj i bez softve-ra, nije nista. Kada softver upravlja radom mikrokontrolera, onda on imauglavnom neoqranicenu primenu.U/ I Spojni p in prema spof jasnjern svetu koji se rnoze konf igur isat i kao ulazniii i i zlazni . Ut i je neophodan u vecini s lucajeva da ornoquc i mik rokont roleru dakomunicira, upravlja i ii c lta informaci je.Softver Informacija koja je mikrokontroleru potrebna za r ad. avo podrazu-meva da je bez qresaka kako bi aplikacija iii proizvod bio uspesan. Softverse rnoze napisati u raznim jezicima kao sto su C, Paskal iii asembler ( jedannivo iznad pisanja vaseq sof tvera u binarnom kodu).Hardver Mikrokont ro ler, memor ija, komponente inter fe jsa, i zvori za napaja-nje, kola za prilagodjavanje signala i sve komponente - spojene da mogu darade i napr ave vezu sa spoljasnjirn svetom. Orugi nacin gledanja na to ( po-sebno kad nece da radi) jeste da ga mozete udariti.S imulator MPLAB razvojno okruzenje ima svoj ugradjeni s imulator koji omo-qucava pristup nekim internim operaci jama mikrokontrolera. avo je dobar na-cin testiranja vasih projekata ako znate kada se dogadjaj desava. Ako se do-gadjaj desi "negde oko toga", simulator yam moze biti oqranicavajuci. Punopracenje, kor ak i debug rnoqucnosti su, ipak, dostupne. Jos jedan proizvod16C5x razvoja je SIM ICE - hardverski simulator koji nudi neke od ICE mo-qucnostl ali za dec cene.Emulator u kolu (ICEPIC iii PICmicroMCU) vr lo koris tan uredja j ko ji se spa-ja izmedju vaseq PC- ja i konektora gde se nalazi mikrokontroler. On omogu-cava da se softver pokrene na PC-ju ali da izgleda kao mikrokontroler naI

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    4/85

    UVOD

    starnpano] plocici, ICE yam omoqucava kretanje korak po korak kroz pro-gram, gledanje sta se desava unutar mikr okontrolera i kako on komunicira saspoljasnjim svetom.Programator Uredjaj koji ornoqucava da program bude upisan u memor ijumikrokontrolera sto ce mu ornoquciti da ga izvrsi bez upotrebe ICE-a. ani do-laze u razlicitirn oblicima i velicinarna, a i cena varira. I PICSTART PLUS iPROMATE II od Micr ochip-a se spajaju na ser ijski por t.Izvorna datoteka Program napisan u asemblerskom jeziku koji vi razumete.Izvorna datoteka se prvo mora obradit i kako bi je mikrokont ro ler razumeo.Asembler I kompajler Softverski paket koji prevodi izvornu datoteku uobjek tnu. Provera qresaka je vee ugradjena i ona je veoma koriscena rnoquc-nost u trazenju qresaka u programu posto su greske oznacene za vreme pro-cesa asembliranja. MPASM je poslednji asembler od Microchip-a koji podr-zava celu PIC famil iju.Objektna datoteka avo je datoteka koju pro izvodi asembler I kompajler, a uobliku je koji progr amator, simulator iii ICE razume i moze da koristi za svo-je funkcionisanje. Ekstenzija datoteke je .OBJ iii .HEX zavisno od direktiveasembleru.Listing datoteka Ovo je datoteka koju pro izvodi asembler I kompajler i sa-drzi sve instrukci je iz izvorne datoteke zajedno sa njihovim heksadecimalnimvrednostima pored i komentarima koje ste pisali. avo je najkorisnija datote-ka za ispitivanje kada se ispr avljaju gr eske zato sto imate vece sanse da pra-tite sta se desava unutar softver a nego iz listinga izvorne datoteke. Eksten-zi ja datoteke je .LST.Ostale datoteke Datoteka gresaka ( .ERR) sadzi listu qresaka ali ne daje ni-kakvu indikaci ju odak le pot icu, Datoteku .COD korist i emulator.8agovi Greske koje v i krei rate. Ovde spadaju qreske od jednostavnih gresa-ka u kucanju do poqresnoq koriscenja sintakse jezika. Vecinu ovih qresakace pronaci kompajler i prikazati u .LST datoteci, dok ee ostale biti potrebnopronaci trazenjem i metodom probe i qreske.

    ~MikroprocesorMikroprocesor iii digitalni kompjuter je sastavljen od tri osnovna dela: CPU,U/I i memorije - uz dodatak kola za podrsku.Svaki dec r noze varirati u kompleksnosti od osnovnog do jako komplikova-nog.

    I

    UVOD

    I/ODIGITALPWMANALOGRS23212C

    MEMORYRA~1

    EPROMEEPROM

    Tipican mikroprocesorski sistem

    Razmotr imo svaki od njih:Ulaz/izlaz (uti) moze se sasto jat i od dig italn ih, analognih i speci ja ln ih funkci -ja , kao i dela koji komunici ra sa spol jasnj lm svetom.Centralna procesorska jedinica (CPU - central processor unit) je srce si-stema i moze raditi u 4, 8 iii 16-bitnom formatu za lzvrsen]e kalkulacija i ob-rade podataka.Memorija rnoze biti RAM, ROM, EPROM, EEPROM iii bilo koja njihova kom-binaci ja i rnoze se kor ist it i za srnestanje program i podataka.Oscilator je potreban da pobudjuje mikroprocesor. Njegova funkcija je dataktuje podatke i instr ukcije unutar CPU, racuna rezultate i onda izbacuje in-formaciju. Osc ilator moze bit i naprav ljen od diskretn ih komponenti ii i kao go-tOYmodul.Ostala kola koja su pridruzena mikroprocesoru su watch dog timer - za po-moe sistemu od zamrzavanja, baferovanje adresne i magist ra le podataka ka-ko bi se omoguCilo da vise cipova bude povezano zajedno bez narusavanjaloqickih nivoa i logika za dekodovanje adr esa i U/I za izbor jednog od vise ko-la spojenih na istu magistralu.Uobicajeno je da se mikroprocesor om naziva oblast koja je uglavnom CPUsa okruzenjern u sistemu. U/I i memor ija se mogu sastojati od odvojenih ci-pova i zahtevaju magistralu podataka, adresnu magistralu i dekodovanjeadresa da bi se ornoqucilo pravi lno funkcionisanje.

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    5/85

    UVDD

    MikrokontroleriPICmicroMCU, sa druge strane, je mikrokontroler i ima sve CPU, memoriju,oscilator, watchdog i U/I ugradjen unutar samog cipa. Ovo stedi prostor, vre-me projektovanja i vreme spoljasnjih periferija i probleme komaptibilnosti, aliu nekim slucajevlrna rnoze oqranicavati projektovanje na datu velicinu me-morije i U/I moqucnosti,PIC familija mikrokontrolera nudi sirok opseg U/I, memorije i specijalnih funk-cija da zadovolje vecinu zahteva inzenjera projektanta.Pronacicete mnogo opstlh knjiga po bibliotekama koje se bave projoktovanjem mikrokontrolera, mikroprocesora i kompjutera, tako da sustina nece bi-ti prosirivana niti ponavljana ovde osim za objasnjenje osnovnih razlika.Zasto koristiti PIC?Efikasnost koda PIC je 8-bitni mikrokontroler zasnovan na harvardskoj arhi-tekturi - sto znaci da postoje odvojene unutrasnje magistrale za memoriju ipodatke. Propusna moe je zato povecana zbog paralelnog pristupa i podaci-ma i programskoj memoriji. Standardni mikrokontroleri nastoje da imaju jed-nu unutrasnju magistralu i za podatke i za program. Ovo usporava rad za naj-manje 2 puta kada se uporedi sa PICmicroMCU.Sigurnost Sve instrukcije su srnestene u 12 iii 14-bitnu programsku memorij-sku rec, Zato ne postoji verovatnoca da softver skoci u DATAsekciju progra-ma i pokusa da izvrsi DATAkao instrukcije. Ovo se rnoze desiti u neharvard-skoj arhitekturi mikrokontrolera koji koriste 8-bitne magistrale.Set instrukcija Postoje 33 instrukcije koje treba da naucite kako biste pisalisoftver za 16C5x familiju i 35 za 16Cxx komponente. Sve instrukcije koje ko-risti PIC zasnovane su na registrima i duzine su 12 bitova za 16C5x famil ijui 14 bitova za 16Cxx famil iju. Svaka instrukcija, uz izuzetak CALL, GOTO iiifunkcija testiranja bitova (BTFSS, INCFSZ), izvrsava se u jednom ciklusu.Brzina PIC ima unutrasnji delitel j sa 4 spojen izmedju oscilatora i unutra-snjeg takta magistrale. Ovo ornoqucava lako racunanje vremena instrukcije,posebno ako koristi te kristal od 4 MHz. Svaki ciklus instrukcije onda traje 1us. PIC je"veoma brz mikrokontroler za rad sa npr. kristalom od 20 MHz stoje ekvivalentno sa 5 mil iona instrukcija u sekundi ! - skoro dva puta brze od386SX-33!Statickl rad PIC je potpuno staticki mikroprocesor; drugim recirna, ako zau-stavite takt, sadrzaji svih registara ce ostati sacuvani. U praksi ovo necete ra-dit i, vee cete PIC prebaciti u Sleep mod - ovo zaustavlja takt i postavlja raz-ne f legove unutar PIC-a da bi yam se ornoqucilo da znate stanje pre Sleep

    IIIII

    UVDD

    moda. U Sleep modu, PIC trosi samo svoju standby struju sto je manje od 1~A.Mogucnost pobudjivanja PIC ima moqucnost jake pobude i rnoze direktnopobudjivati LED, trijake i sl, Svaki U/I pin rnoze primi ti 25 mA, ii i 100 mA zacelu komponentu.Opcije Razne varijante brzine, temperature, pakovanja, U/llinija, funkcija taj-mera, serijskih komunikacija, AID i velicina memorije je dostupno kod PIC fa-milije kako bi se zadovoljile sve vase potrebe.Raznovrsnost PIC je vrlo raznovrstan mikrokontroler i uglavnom je jevtinazamena cak i za nekoliko loqickih kapija; posebno gde je prostor kritican.

    Cocc Counret

    Osnovni PIC blok dijagram

    Sigurnost PICmicroMCU irna rnoqucnost zastite koda koja je jedna od naj-boljih u industriji. Jednom kada se isprogramira bit zastite, sadrzaj program-ske memorije se ne rnoze procitati kako bi se rekonstruisao programski kod.Razvoj PIC je dostupan u flash i verzi ji sa prozorcicern za razvoj i OTP (onetime programmable - jedanput programabilnoj) verziji za proizvodnju. Alati zarazvoj su dostupni i mogu ih priustiti i kucni entuzijasti.Proba i testiranje kodaUhvatiti se ukostac sa C-om rnoze bit i zastrasujuci zadatak i u startu zahte-va C kompajler, emulator u kolu i neophodni hardver jer PIC rnoze bit i ogra-I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    6/85

    UVOD

    nicavajuci u oocetnorn s tadijumu projekta. C kompajl~r se n:oz~.sk. in~t i s~ In-temeta. Prvo t reba probati osnovne primere I funkcije, testi rati ih I videti prenego sto se predje na PIC specificne C kompajlere koji rade sa U/1 i sl.

    C standardi za kodiranjePisanje programa je kao zidanje kuce - ako je temelj los, ostatak ce se sru-siti, Ako je temelj slab, kod ce qresiti na tom iii neko.m drugom mestu. Slede-ce preporuke su uzete iz dokumenta C++ Standardi I pri laqodjeni su za PIC.Imena - neka opisuju svoju funkcijuImena su srce programir anja pa zato birajte imena tako da odgovaraju svo-joj funkciji i onome za sta se koriste u pr ogr amu.Korist ite i mala i ve li ka s lova da pobolisate c it lji vost.ErrorCheck je cit lj iv i]e od ERRORCHECKIspred imena dodajte prefiks sa malim slovom njihovog tipa, ponovo da bi sepoboljsala citljivost:9 Globalnors

    ReferencaStatic

    gLog;rStatus () ;sValueIn;

    Zagrade {}Zagrade ( velike zagrade) se kor iste na standardni UNIX nacin

    if (condition) {

    iii bolji metod koji je laksi za citanjeif (condition)

    ,Tabovi i uvlacen]eKoristite praznine umesto tabova posto normalno postavljanje taba od 8 pra-znina zahteva previse siroku stranicu. Uvlacite tekst samo kada je potrebnoda bi softver bio citljivi]l. Takodje, pcdesavanje taba u jednom editoru ne mo-ra biti isto u drugom - pravite kod da bude prenosiv.

    I

    UVOD

    Duzina linijeZadrzite duzinu linije na 78 znakova zbog kompatibilnosti izmedju monitora istarnpaca.Else If formatiranjeDodajte jednu dodatnu Else komandu za obradu svih s lucajeva koji n isu po-kriveni predhodnim If-ovimaif (condition)

    else if (condition)

    else/* obrada svega sto nije obradjeno iznad */

    Formatiranje uslovaKada to kompajler dozvoljava, uvek stavite konstantu sa leve strane opera-cije jednakosti / nejednakosti. Ako se jedan znak = izostavi, kompajler ceyam pronaci qresku. Vrednost se takodje postavl ja na v id lji vo mesto.if (6 = = ErrorNum) ...

    Incijalizujte sve promenljivePostavi te sve promenlj ive na poznate vrednost i kako bis te sprecil i "pli va juceiii slucajne uslove"

    int a = 6, b 0;KomentariKomentari kreiraju drugu polovinu price koju pisete. Vi znate kako vas pro-gram radi danas, ali da Ii cete se secati za dve sedmice iii dve godine, iii daIi ce neko drugi r noci da pr ati vas pr ogram onakav kakav je danas?Korist ite komentare da oznacite oblast i gde jo nesto t reba doradit i, qreske ko-je t reba popravi ti i ii mesta za buduca prosirenja proizvoda.

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    7/85

    UVOD

    OsnoveSvi racunarski programi imaju pocetak. Pocetna tacka mikrokont rolera je re-set vektor . Reset 14-bitnog jezgra (PIC 16Cxx fami li je) je na OOh,a 12-bitnogjezgra (PIC 16C5x i 12C50x) je na najvisoj tacki u memoriji - 1 FFh, 3FFh,7FFh.Zavrsna tacka programa rnoze bit i gde program zaustavlja svoje izvrsavanjeako se lzvrsava samo jednom, npr . rutina za postavljanje parametara komu-nikacije. Ostali progr ami se mogu vratiti nazad u petlju do startne tacke kaosto je npr. kontrola osvetljenja. Jedan od najcesce koriscenih pr vih primerapr ogramir anja u jezicima visokog nivoa kao sto su Basic iii C je star npanje"Hello World" na ekranu racunara.Koriscen]e C-a i PC-ja je jednostavno posto su ekr an, tastatur a i procesorvee spojeni. Glavni zadatak jeste postaviti program da poveze program saperiferijama. Kada se razvija program za PICmicroMCU iii neki dr ugi mikr o-procesorsk i / mikrokont rolersk i s is tem, pot reban je ne samo softver vee i har -dver za njihovo povezivanje sa spoljasnjirn svetom. Jedan takav s is tem je pri -kazan ispod.

    L__ ... \

    r--I ICE

    TARG~T aOARI)

    PC

    COMMS

    Kor iscenje ovakve kof iguraci je ornoqucava da se uradi osnova U/I i komuni-kacija, testiranje i ispravljanje qresaka. Kor tscen]e ICE-a, mad a nije neop-hodno, ubrzava proces razvoja na mnogo nacina i tako smanjuje ukupnu ce-nu razvoja i smanjuje inzenjer ske glavobolje. Pocetno ulaganje moze izgle-dati ve liko na pocetku projekta, a li us tedjeno vreme projek tovanja i ispravl ja-n ja qresaka se ubrzo isplat i.Neophodan hardver za probu projekta rnoze bit i kori sn icki naprav ljena PCB,protoploclca iii neka nezavisna razvojna plocica kao sto je nasa PICmic-r oMCU Milenijum ploca (neko od vas je vee mozda ima!). Milenijum ploca sa-

    I

    UVCD

    drz: say osnovni hardver koji or noqucava zapocinjanje vecine projekata uzzadrzavan]e pocetnoq ulaganja minimalnim.Sastavite sledeCi har dver u obliku koji najvise volite. Bice yam potr eban PICprogramator kao sto je PICSTART Plus kao minimalni uslov uz C kompajler.Jednostavan program koji se kor isti kada se inzenjeri uce 0 PIC-u je "Pritisnitaster / ukljuci LED". Zapocnite sa jednostavnim progr amom - ne sa 2000 li-nija koda!U asembler u ovo bi bilo:main btfss porta,switch ;test for switch closuregoto main ;loop until pressedbsf portb, led ukljuci ledlpl btfsc porta,switch da Ii je prekidac otvoren?goto lpl cekaj dok ne bude otvorenbcf portb, led iskljuci ledgoto main vrati se na startU C-U ovo se prevodi na:main ()( set_tris_b{OxOO) ;while (true)

    (

    II postavi port b kao izlaze

    if (input(PIN_AO)) II ispitaj zatvorenost prekidacaoutput_high(PIN_BO); II ako je zatvoren ukljuci ledelseoutput_low(PIN_BO); II ako je otvoren iskljuci led

    Kada se asembli ra , kod izg leda ovako:main()( set_tris_b(OxOO) ;

    0007 MOVLW 000008 TRIS 6while (true)

    ( if (input(PIN_AO))0009 BTFSS 05,0OOOA GOTO 000output_high(PIN_BO) ;OOOB BSF 06,0else oooe GOTO OOEoutput_low(PIN_BO) ;

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    8/85

    UVOD

    0000 BCF 06,0OOOE GOTO 009

    Kao sto rnozete videti kompajl irana verzija zauzima vise reci u memorij i - 14u C-u u odnosu na 9 u asembleru. Ovo ni je pravi pr imer sto se tice koda, alikako program raste, C postaje sve efikasniji.

    8" '"'" ~zo 8 DZ

    80 co'" DZ'0 ~

    0" '"90 ~. " . " DZ00

    En 8"

    '0 ~zn . " o,Co ~ ~~~~

    ~~"0

    ~D~UDU

    I

    OSNOVE

    Osnove C jezikaOvo poglavlje predstavlja neke od kljucnih aspekata C programskog jezika.Dace se kratak pregled svakog od ovih aspekata. Cilj je da dobijete osnovnoznanje 0 C jeziku kako biste mogli da razumete primere date u poglavljimakoja slede.Teme koje ce se obraditi su:Struktura programaKomponente C programa#pragmamain#include directiveprint statementPromenljiveKonstanteKomentariFunkcijeC kljucne reci1.1 Struktura C programaSvi C programi sadrze pretprocesorske direktive, deklaracije, definicije,izraze, iskaze i funkcije.Pretprocesorske direktivePretprocesorska direktiva je komanda C pretprocesoru (koja se automatskipoziva kao prvi korak pri kompajliranju programa). Dve uobicajene pretpro-cesorske direktive su #define direktiva, koja zamenjuje tekst za specifici-rani identif ikator, i #include direktiva, koja ukljucuje tekst spoljasnjedatoteke u program.DeklaracijeDeklaracije uspostavljaju imena i atribute promenljivih, funkcija i t ipovakoriscenih u programima. Globalne promenljive se deklarisu izvan funkcija ividlj ive su od kraja deklaracije do kraja datoteka. Lokalne promenljive sudeklarisane unutar funkcije i vidljive su od kraja deklaracije do kraja funkcije.

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    9/85

    OSNClVE

    DefinicijaOefinicija postavlja sadrzaj promenljive iii funkcije. Oefinicija takode alocirapotreban prostor za promenljive i funkcije.IzraziIzrazi su kombinacija operatora i operanada koji daju pojedinacnu vrednost.IskazIskazi kontrolisu tok iii redosled programskbg izvrsavanja u C programu.FunkcijeFunkci ja je kolekci ja deklaracija, definicija, izraza i iskaza i ona izvrsavaodredeni zadatak. Zagrade ograduju telo funkci je. Funkci je ne mogu bitiuqnezdene u C jeziku.main FunkcijaSvi C programi moraju da sadrze funkciju po imenu main gde pocinje izvrsa-vanje programa. Zagrade koje ograduju main funkciju definisu pocetnu i kra-jnju tacku programa.Primer: Osnovna C programska struktura#include /* pretprocesorska direktiva *//* ukljucuje standardne C bibliotecne datoteke */# define PI 3.142 /* definise simbolicku konstantu */float area; /* globalna deklaracija */int square (int r) /* deklaracija prototipa */main(){ /* pocetak main funkcije i programa */int radius_squared; /* lokalna deklaracija */int ~dius = 3; /* deklaracija i inicijalizacija */radius_squared = square (radius); /* prenosenje/*vrednosti funkciji */area = PI * radius squared; /* iskaz dodeljivanja */printf("Povrsina je %6.4f kvadratnih jedinica\n", area);/* zavrsavanje main funkcije & programa */square(int r) /* glava funkcije */{int r_squared; /* deklarisana promenljivaI

    OSNClVE

    /* je poznata same funkciji square*/r_squared = r *r;return (r_squard); /* vra~a vrednost pozivnom iskazu */}

    1.2 Komponente C programaSvi C programi sadrze izvesne osnovne komponente kao sto su iskazi ifunkcije. Iskazi su delovi programa koji zapravo izvrsavaju operacije. Svi Cprogrami sadrze jednu iii vise funkcija. Funkcije su potprogrami i svaka sadrzijednu iii v ise iskaza i rnoze se pozivati iz drugih delova programa. Pri pisan-ju programa, uvlacen]e linija pri pisanju programa, prazne linije i komentari,znacajno povecavaju citl jivost programa - ne samo vama pri naknadnomcitanju programa, nego i drugima koj i nasleduju vas kod. Sledeci primerpokazuje neke od zahtevanih delova C programa.#include / * Moj prvi C program */main(){ printf ("Hello world!");

    Iskaz #include govori kompajleru da u program ukljuci izvornikod iz datoteke 'stdio. h' .Ekstenzija .h oznacava header datoteku. Header datoteka sadrzi informaci-je 0 standardnim funkcijama koje se koriste u programu. Header datotekastdio. h je se naziva STandarD Input and Output (standardna ulazna i izlaz-na) header datoteka. Neophodno je da ukljucite samo one datoteke koje ceu program ukliuciti one bibliotecne funkcije koje yam trebaju./ * Moj prvi C program */ je komentar u C jeziku. Tradicionalnikomentari pocinju sa / * a zavrsavaju se sa * /. Noviji stil podrazumeva dakomentari pocinju sa " i da idu do kraja tekuce linije. Kompajler iqnorise pos-tojanje komentara tako da njihovo postojanje u izvornom kodu ne utice nabrzinu i duzinu kompajliranog koda.Svi C programi moraju da imaju main () funkciju. Toje ulazna tacka u pro-gram. Sve funkcije imaju isti format:ImeFunkcije (){kod

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    10/85

    OSNOVE

    lskazi unutar funkcija se izvrsavaju sekvencijalno, pocinju otvorenim vlticas-tim zagradama i zatvaraju se zatvorenim viticastirn zagradama.Vi ticaste zagrade { i } pokazuju pocetne i krajnje blokove koda u C-u.Na kraju, iskaz printf ("Hello world!"); predstavlja tipican C iskaz.Skoro svi C iskazi se zavrsavaju znakom tacka-zapeta (;). Karakter end-of-line (kraj l inije) se ne prepoznaje od strane C kompajlera kao zavrsetak lini-je. Stoga, ne postoje oqranicenja u poziciji iskaza unutar linije iii broja iskazana liniji.Svi iskazi imaju znak tacka-zapeta (;) na svom kraju kako bi informisali kom-pajler da je dostigao kraj iskaza i da bi mogao da ga izdvoji od slede6egiskaza. Ukoliko bi se qreskorn zaboravilo njihovo postavljanje, generisao bise fleg qreske u SLEDECOJ linij i. Iskaz if je slozeni iskaz i znak ; mora dabude na kraju ovog slozenoq iskaza:if (OvoJeIstina)IzvrsiOvuFunkciju() ;

    1.3 #pragma#Pragma komanda daje instrukcije kompajleru da izvrsi odredenu funkciju utoku kompajl iranja kao sto je recimo definisanje koji ce se PICmicro koristi tii ii u kom formatu datoteke ce se generisati kod.#pragma device PIC16CS4

    U CCS C-U upotreba pragma komande je opciona tako daje slede6i kod pri-hvatljiv:#device pic16cS4

    1.4main ()Svaki program mora da ima main funkciju koja se moze pojavlj ivat i samojednom. Nijedan parametar se ne rnoze staviti unutar ( ) zagrada. Kljuenarec voi~ se rnoze opciono pojavi ti izmedu ( i ) kako bi se pojasnilo da mainfunkcija nema parametara. Posto jemain klasifikovana kao funkcija, sav kodkoji sledi mora da bude srnesten unutar zagrada { } i ii v it icastih zagrada.main(){telo programa

    I

    CJSNOVE

    1.5 #includeHeader datoteka (poznaje se po .h ekstenziji) sadrzi informacije 0 bibliotecn-im funkcijama kao na primer koji argument(e) funkcija prihvata i koji argu-ment(e) funkcija vraca iii lokaciju PICmicroMCU registra za odredeni PIC.#include

    Ovu informaciju kompajler koristi da poveze medusobno sve hardverskespecifikacije i izvorne programe.#include #include #use rs232 (baud=9600, xmit=PIN_BO,rcv=PIN_Bl)main(){

    printf ("Unesi karaktere: ");while (TRUE)putc(toupper(getc() ;

    Definicije za PIN_BO i PIN B1 se nalaze u header datoteci 16C71.H.Funkcija TOUPPER se nalazi u header datoteci CTYPE.H. U programu semoraju koristi ti obe header datoteke kako bi kompaj ler imao neophodneinformacije 0 funkcijama koje koristite. Uocite da mnogi C kompajleri zahte-vaju header datoteke za 1/ 0 funkci je kao sto su printf i putc. Postojeugradene funkcije za PICmicroMCU koje se ucitavaju za #USE RS232 i nezahtevaju izdvojene header datoteke.Uglaste zagrade#include

    govori pretprocesoru da potrazi datoteku u predefinisanom direktorijumu zasmestanje datoteka koje se ukljucuju pri kompajliranju, dok navodnici govorepretprocesoru da datoteku prvo potrazi u tekucern direktorijumu.#include "thatfile.h"

    Verovatno ste uocili da #include direktiva nema na kraju znak tacka-zarsz.Razlog je taj sto #include direktiva nije C iskaz, vee pretprocesorska direk-tiva kompajleru.Tokom faze kompajl iranje cela include datoteka se urnece u izvorisnudatoteku. I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    11/85

    OSNOVE

    1.6 prinf funkcijaPrintf funkcija je standardna bibliotecna funkcija koja or ncqucava pro-gramerima da salju informacije koje se mogu star npati, Uopsteni format zaprintf () iskaz je:printf("control_string" , argument_list);Control string je string oqranicen duplim navodnicima na oba svojakraja. UnUtar str inga se r noze koristiti bilo koja kombinacija slova, brojeva isimbola. Speci ja lni simboli ko ji se naz ivaju speci fi katori formata se prepoz-naju po znaku % . U printf () funkci ji obavezno mora bit i prisutan con-trol string. Lista argumenata se ne mora navoditi ako format stringa nezahteva speci fikator formata. Argument list se rnoze sastojati od ken-stanti i promenl ji vih . S ledeca dva primera pokazuju printf () iskaze koj ikao promenlj ive koriste konstantu, a potom promenlj ivu.prin tf ("Hello wold!");printf("Microchip je %d!",l);

    Specifikator formata (%d) je zavisan od tipa podatka koji ce se prikazivati.Tabela koja sledi prikazuje sve specifikatore formata u C jeziku i tipovepodataka na koje uticu.Specifikator formata printf ()%c pojedinacan karakter%d pojedinacna decimalna celobrojna vrednost%f pokretni zarez (decimalna notacija - mora ukl jucivati decimalnu tacku)%e pokretni zarez (eksponenci jalna i ii naucna notacija)%s string%u neoznaceni decimalni ceo bro j%x neoznaceni heksadecimaln i ceo broj (mala s lova)%x neoznaceni heksadecimaln i ceo broj (ve lika s lova)1 prefiks koji se koristi sa %d, %u, %x da bi se definisao long integerNAPOMENA: 0 (nula) pracena % karakterom unutar formata st ringa forsirastarnpan]e vodecih nula. Bro j ko ji sledi definise si rinu cds tampanoq polja.printf ("The Hex of decimal 12 is %02x\n", 12) ;

    Ovaj iskaz bi i zazvao izlazno stampan]e obli kaThe hex of decimal 12 is Oc.

    I

    OSNOVE

    Escape sekvence\n nova linija\t hor izontalni tab \b backspace\r carriage return \0 null karakter\f form feed \v vertikalni tab\' jednostruki navodnik \xhhh umece HEX kod hhh\? dvostruki navodnik\\ backslash% % znak procenat\? znak pitanjaSpecifikacija formata se rnoze takode prikazati kao % [flagovi][sirina] [.preciznost] tako da ce u prethodnom pr imeru linija:printf("Area is %6.4f square units\n", area);

    znaci da t reba s tarnpati v rednost area u polju sirine 6, sa preciznoscu od 4decimalne tacke:Podrazumevano printf izlaz ide na poslednji definisani RS232 port. Izlazse, medutim, rnoze usmeriti na bilo sta sto definisite vasorn sopstvenomizlaznom funkcijom. Na primer:void lcd_putc(char c){

    II Umetnite kod koji salje karakter na LCD

    printf (lcd_putc, "value is %u", value);

    1.7 PromenljivePromenlji va je ime za spec if icnu memorij sku lokaciju. Ova memor ijska lokaci -ja r noze da sadrzi razlicite vrednosti zavisno od nacina kako su promenljivedeklarisane. U C jeziku, sve promenljive moraju biti pre upotrebe deklar-isane. Deklaracije promenljivih govor e kompajler u koji se tip promenljivekoristi. Sve deklaracije promenljivih su C iskazi i stoga se moraju zavrsitiznakom tacka-zapeta.Neki od osnovnih tipova koje C podrzava su char, int, float i long.Uopstena forma za deklar isanje promenl ji vih je:type variable_name;

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    12/85

    OS~::JVE

    Primer deklarisanje promenljive je char ch; Kompajler ce interpretirati ovajiskaz tako sto ce smatrati daje promenljiva ch deklarisana kao char (8-bitnineoznaceni ceo broj).

    1.8 KonstanteKonstanta je fiksna vrednost koja se ne rnoze menjati programski. Na primer,25 je konstanta. Celobrojne (integer) konstante se definisu bez razlomljenogdela, na primer -100 iii 40.Konstante sa pokretnim zarezom zahtevaju da uopisu imaju decimalnu tacku pracenu frakcionim delom konstante. Broj456.75je konstanta zapisana u formi pokretnog zareza. Karakter konstantesu omedane izmedu pojedinacnih navodnika na primer 'A' iii '&'.Kada kompajler naide na konstantu u vasern programu, on mora da odreditip konstante. C kompajler ce, podrazumevano, smestiti konstantu u najmanjikompatibi ln i tip podataka u koj i rnoze da stane. Tako je 15 int a 640000unsigned long.Konstanta se rnoze deklarisati upotrebom #define iskaza.#define value

    definise ime koje cete koristi ti kroz program, value je vrednostkoju dodeljujete konstanti .#define TRUE 1#define pi 3.14159265359

    C dozvoljava da konstante budu definisane u heksadecimalnom i oktalnomformatu. Heksadecimalne konstante moraju imati prefiks 'Ox' a oktalne kon-stante moraju imati prefiks '0'. Na primer, OxA4 je validna heksadecimalnakonstanta, a 037je validna oktalna konstanta. Uz numericke konstante, Cpodrzava i string konstante. String konstante su skup karaktertera ogradenihsa dvostrukim navodnicima.Konstante definisane sa #DEFINE se tekstualno zamenjuju pre kompajliran-ja kod~ u stanju koje se naziva pretprocesiranje.Direktive koje pocinju sa # se nazivaju pretprocesorske direktive. Mozete sa#DEFINE definisati bilo koji tekst. Na primer:#define NOT OLD (AGE

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    13/85

    OSNOVE

    1.10 FunkcijeFunkcije su osnovni gradivni blokovi C programa. Svi C programi sadrze barjednu funkciju, main () . Mnogi programi koje cete pisati ce sadrzati mnogefunkcije. Format C programa sa mnogo funkcija je:main(){}

    functionl (){}

    function2 (){}

    Pri izvrsavanju programa prvo se poziva main () funkcija. Oruge funkcije,functionl () i function2 () se mogu pozvati od strane bilo koje drugefunkcije u programu.Tradicionalno semain () funkcija ne poziva od strane drugih funkcija, madaC nema restrikcija pOtom pitanju.Sledi primer dve funkcije u C-u.functionl ();main(}{ printf("I ");functionl() ;printf ("c.") ;

    functionl (){ printf("like "};

    Jedno freba da zapamtite pri pisanju vasif funkcija- a to je da ce, posle sti-zanja do viticastih linija kojima se zatvara vasa funkcija, program startovatiizvrsavanje koda od prve linije nakon tacke gde je vasa funkcija pozvana.Pogledajte takode odeljak 3.1.

    1

    OSNOVE

    1.11 Makroi#DEFINE je rnocna direktiva kao sto je i lustrovano u prethodnim odeljcima.C omoqucava definisanje parametara koji ce bit i i mnogo rnocruji. Kada sekoriste parametri to se naziva makro. Makroi se koriste za povecan]ecit lj ivosti i ii smanjivanje potrebnog kucanja koda. Primer jednostavnogmakroa:#define var(x,v) unsigned int x=v;var(a,l)var(b,2)var(c,3)

    je isto kaounsigned int a=l;unsigned int b=2;unsigned int c=3;

    Sledeci primer koji ce biti mnogo korisniji nakon citanja poglavlja 0 izrazima:#define MAX (A,B) ((A>B)?A:B)z=MAX(x,y); II z ce koristiti vecu vrednost ad x i y

    1.12 Uslovna kompilacijaC ima neke pretprocesorske direktive koje omoqucavaju da delovi koda buduukl juceni ii i iskljuceni iz kompajl iranja zavisno od setovanja koja uticu uvreme kompajliranja. Razmotrimo sledeci primer:#define HW VERSION 5#if HW VERSION>3output_high (PIN_BO);#elseoutput_low(PIN_BO) ;#endif

    Prethodni primer ce kompajlirati samo jednu liniju zavisno od setovanje vred-nosti HW_VERSION.Moze biti desetak ovih #if uslova u datoteci i ist i kod sernoze kompajlirati za razlicite verzije hardvera samo promenom jedne kon-stante. #if se izracunava i zavrsava pri likom kompajl iranja programa zarazliku od normalnog if koji se izracunava tokom izvrsavanja programa.#IFDEF jednostavno proverava da vidi da Ii je 10bio #DEFINED.

    I'

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    14/85

    OSNDVE

    Primer:#define DEBUG#ifdef DEBUGprintf ("ENTERING FUNC X");#endif

    U ovom primeru sve debugging linije iz programa se mogu eliminisati iz kom-pilacije uklanjanjem iii stavljanjem pod komentar jedne #DEFINE linije.

    1.13 Hardverska kompatibilnostKompajler mora da zna na kom ce se hardveru izvrsavati kod kako bi korek-tno kompajlirao kod. Tipican program pocinje na sledeci nacin:#include #fuses hs,nowdt#use delay(clock=8000000)

    Prva linija ukljucuie za uredaj specificne #define kao sto su imena pinova.Druga linija postavlja PICmicroMCU fuses. U ovom slucaju brzi oscilator ibez watch dog tajmera. Poslednja lini ja govori kompajleru koja je brzinaoscilatora. Evo jos nekoliko primera linija koda:#use rs232 (baud=9600, xmit=PIN_C2, rcv=PIN_C7)#use i2c(master, sCi=PIN_B6, sda=PIN_B7)

    Primeri programa u ovoj knjizi ne pokazuju linije koda koje se ticu podesa-vanja hardvera. One se zahtevaju pri kompajliranju i RCW ovih programa.Uz to, C promenljive se mogu kreirat i i mapirat i u hardverske registre. Ovevarijable mogu da budu bit i i ii bajtovi. Nakon definisanja, mogu se koristi ti uprogramu kao bilo koje druge promenljive. Primeri:#bit carry=3.0#byte portb=6#byte intcon=ll,1.14 C kljucne reelANSI C standard definise 32 kljucne reci za primenu u C jeziku. U C jeziku,izvesne reel su rezervisane od strane kompajlera za definisanje t ipovapodataka iii za upotrebu u petljama. Sve C kljucne reci moraju bit i ispisanemalim slovima kako bi ih kompajler mogao prepoznati. Tiplcno ce mnogi C

    I

    OSNDVE

    kompajleri dodati nekoliko dodatnih kljuenih reci kako bi iskoristili prednostiprocesorske arhitekture.Sledi l ista kljucnih reci koje su rezervisane i ne mogu se koristi ti kao imenapromenljivih.auto double int structbreak else long switchcase enum register typedefchar extern return unionconst float short unsignedcontinue for signed voiddefault goto sizeof volatiledo if static while

    VEZBA:Napisite program koji ispisuje vase ime na ekranu.Napisite program koji deklarise integer promenljivu pod nazivom godina.Ovoj promenljivoj treba dati vrednost tekuce godine, a potom, upotrebomprintf () iskaza, prikazite vrednost godine na ekranu. Rezultat vaseq pro-grama treba da izgleda ovako: Ova je godina 2004.

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    15/85

    PROMENL.JIVE

    PromenljiveVazan aspekt C jezika je nacin kako se srnestaju podaci. U ovom odeljku cese detaljnije ispitati kako se u C jeziku koriste promenljive za smestanjepodataka.Teme koje se obraduju u ovom odeljku su:Tipovi podatakaDeklaracijeDodeljivanjeOpsezi tipova podatakaKonverzija podataka

    2.1 Tipovi podatakaC programski jezik podrzava pet osnovnih tipova podataka i cetir i modifika-tora tipova. sledeca tabela pokazuje znacenje osnovnih tipova podataka imodifikatora tipova.

    Tip Znacenje Kljucna reecharacter karakter podataka charinteger neoznacenl celi brojevi intfloat brojevi u pokretnom zarezu floatdouble brojevi u pokretnom zarezu dvostruke preciznosti doublevoid bez vrednosti voidsigned pozit ivni iiinegativni brojevi signedunsigned samo pozit ivni brojevi unsignedlong duf opseg bro ja long, short kraci opseg broja short

    Svaki od tipova podataka predstavlja odqovarajuci opseg brojeva, koji sernoze menjat i zavisno od kor iscenoq modif ikatora. Sledeca tabela prikazujernoqucl opseg vrednost i za sve rnoquce kombinaci je osnovnih t ipova podata-ka i modifikatora.

    I

    PROMENL.JIVE

    Tip Sirina u bitim Opseqshort 1 o i ii 1short int 1 o i ii 1int 8 o do 255char 8 o do 255unsigned 8 o do 255unsigned int 8 o do 255signed 8 128 do 127signed int 8 128do127long 16 o do 65535long int 16 a do 65535signed long 16 32768 do 32767float 32 3.4E-38 to 3.4E+38

    NAPOMENA: Pogledajte pojedinacnu dokumentaciju za C kompajlere zaak tuelne t ipove podataka i numericke opsege.C omoqucava skracenu notaciju za tipove podataka unssigned int,short int i long into Jednostavno kor is tite rec unsigned, short iiilong bez reci int . Da bi o laksao arit rnet icke operaci je za CPU, C predstavl jasve negat ivne brojeve u formi drugog komplementa. Da bis te iz racunali drugikomplement broja jednostavno inver tujte sve bite i dodajte 1 rezultatu. Napr imer , da bis te konver tovali oznaceni bro j 29 u drugi komplement :00011101 2911100010 invertovani svi bit i

    1. dodavanje 111100011 -29Primer dodavanje long vrednosti 12000 promenl jivoj variable a. Broj12000 se u hex format prikazuje kao 2EEO. Sledi dec koda koji nizu rec (EO)dodeljuje registru 11h a gornju r ec (2E) r egistru 12h.long a = 12000.main(){

    0007 : MOVLW EO0008:0009:OOOA:

    MOVWF 11MOVLW 2EMOVWF 12

    VEZBA: Napisite iskaz na drugi nacin:I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    16/85

    PROMENL..JIVE

    long int i;Da biste razumeli razliku izmedu oznacenoq i neoznacenoq broja, napisitesledeci program. Neoznaceni integer 35000 se predstavlja kao -30536 u for-matu oznacenoq broja.main(){ int i;

    unsigned int/* signed integer */u; /* unsigned integer */

    u = 35000;i = u;printf ("%d %u\n", i , u);

    2.2 Deklaracija promenljivihPromenljive se mogu deklarisati na dva osnovna mesta: unutar funkcije i iiizvan svih funkcija. Promenljive se nazivaju lokalnim iii globalnim, respek-tivno. Promenljive se deklarisu na sledeci nacin:type promenljiva_ime;

    gde je type jedan od validnih C tipova podataka, a promenljiva_ime jeime promenljive.Lokalne promenljive (deklarisane unutar funkcije) se mogu koristiti samo uiskazima unutar funkcija gde su deklarisane.Vrednosti lokalne promenljive se ne moze pristupiti iz iskaza funkcija izvan tefunkcije. Najvazniju stvar koju morate zapamtiti u vezi lokalnih promenljivih jeto da se one kreiraju nakon ulaska u datu funkciju i da se unistavaju prinapustan]u funkcije. Takode treba zapamtiti da se lokalne promenljive mora-ju deklarisati na samom pocetku funkcije pre iskaza.Prihvatlj ivo je da lokalne promenljive u razlicltim funkcijama imaju isto ime.Razrnotrmo sledeci primer:void f2(void)

    int count;for (count=O; count

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    17/85

    PROMENL..JIVE

    I lokalne i globalne promenljive mogu da dele isto ime u C jeziku. Otkucajtesledeci program.int count;fl O{ int count;count =100;printf ("count in f1(): %d\n" count);

    main(){ count =10;printf("count in main 0 : %d\n" count);

    return 0;U main () r eferenca na count je globalna promenl jiva. U f1() lokalnapromenljiva count prepisuje upotrebu globalne promenl jive.

    2.3 Dodeljivanje vrednosti promenljivimaDo sad a smo samo govorili 0 tome kako se deklarise pr omenljiva u progra-mu, a ne zapravo i kako im se dodeljuje vrednost. Dodeljivanje vrednostipromenljivama je jednostavno:promen1jiva_ime= vrednost;

    Posto je dodeljivanje vrednosti pr omenljivoj iskaz, moramo na kr aju iskazada dodamo tacku-zapetu. Primer dodeljivanja vrednosti 100 integer pro-menlj ivoj po imenu count je:count = 100;

    Vrednost 100 se naziva konstantom.Vrednosts promenljivih se mogu inicijalizovati u isto vreme kada su i deklar -isane. Time se olaksava, i mnogo je pouzdanije postavljanje pocetnih vr ed-nosti u programu na poznate uslove. Na pr imer:int a = 10, b = 0, c = Ox23;

    Mnogo raz li ci tih t ipova konstanti pos to je u C jeziku. Konstante t ipa karakterase deftnisu tako sto se ograduju jednostrukim navodnicima, kao na primer'M' . Celi bro jev i se kor is te pr i dodelj ivanju vrednosti promenl ji vama t ipa inte-ger . Bro jevi u formi pokretnog zareza moraju da kor is te vrednost sa dec imal-I

    PROMENL.JIVE

    nom tackorn. Na primer, da biste rekli C.-u da je vrednost 100 vrednost uformi pokretnog zareza, kor is tite 100.0.P~ome~lj iva~a se takode rnoze dodel it i v rednost druge promenlji ve. S ledecipnmer ilustruje ovo dodeljivanje.main(){ int i;int j;

    i=O;j=i;

    VEZBA:Napisi te program koji deklari se integer promenlj ivu po nazivu count. Dodel itec::ountpromenl jivoj vrednost 100 i kor isti te printf () iskaz da biste prikaza-I i v rednost . Izlaz t reba da izg leda ovako:100 je vrednost od count

    Napisi te program koji deklarise t ri promenl ji ve char, float i doublepromenlji vama po imenu ch, f i d. Dodelite 'R' promenl jivoj char, 50.5pr~m~nljvoj tipa pokretnog zareza i 156. 007 promenl jivoj t ipa double.Prikazite vrednost ovih promenljivih na ekranu. Izlaz treba da izgleda otpri-like ovako:ch jef jed je

    R50.5156.007

    2.4 EnumeracijaU C jeziku je r noquce da napravite listu imenovanih integer konstanti. Ovadek!araci j~ ~~ zove enumeracija. Lista kons tanti kreiran ih enumeraci jom semoze koristiti na bile kom mestu gde se rnoze koristiti integer. Uopstenaforma za gener isanje enumeracije je:enum name {enumeration lis}) variable(s);

    Lista va~i}abli je opciona stavka enumeraci je. Enumerisana promenl jiva rnozeda sadrz i same vrednost i koje su def in isane u enumeracionoj l is ti. Na primer,iskaz I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    18/85

    PRDMENL.JIVE

    enum color_type {red, green, yellow} color;promenljivoj color se rnoze samo dodeliti vrednost red, green iii yellow.(na primer color = red;).Kompajler ce dodeliti integer vrednosti enumeracionoj listi pocevsi od 0 kojudodeljuje prvoj stavki l iste. Svaka stavka je za jedan veca od prethodne. Stou prethodnom primeru znaci da je red 0, green je 1 i yellow je 2. Defaultvrednost se rnoze prepisati definisuci vrednost za konstantu. Ovaj primerilustruje tu tehniku:enum color_type {red, green=9, yeilow} color;

    Ovaj iskaz dodeljuje 0za red, 9 za green i 10za yellow.Nakon sto je jednom enumeracija definisana, ime se rnoze koristiti zakreiranje drugih promenljivih bilo gde u programu. Na primer, promenljivamycolor se rnoze kreirat i pornocu colortype enumeracije na sledecinacin:enum color_type mycolor;

    promenljive se takode mogu medusobno testirati:if (color ==fruit)II uradi nesto

    Esencijalno, enumeracija pomaze pri dokumentovanju koda. Umesto dodelji-vanja vrednosti odredenoj promenljivoj, enumeracija se moze koristi ti zapojasnjenje znacen]a vrednosti.VEZBA:Napravite enumeraciju familija PIXI7CXX kontrolera.Krei rajte enumeraciju od vrednost i novcanica, od najmanje do najvecenovcanlce.Da Ii je sjsdeci fragment korektan? Zasto/ Zasto ne?

    enum {PIC16C5l,PIC16C52,PIC16C53} device;device = PIC16C52;printf ("Prvi PIC je bio %s \n", device);

    I

    PRDMENL,JIVE

    2.5 typedefIskaz typedef se koristi za definisanje novih tipova umesto postojecih tipo-va. Format je:typedef staro_ime novo_ime;

    Novo ime se rnoze upotrebljavati za deklarisanje promenljivih. Na primer,sledeci program koristi ime smallint za tip signed char.

    typedef signed char smallint;main()

    smallint i;for(i=O;i

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    19/85

    PRDMENL..IIVE

    mozete da koristite sledeci typedef iskaz za deklarisanje counterpromenljivih.typedef int counter;

    Neko ko cita vas kod tako rnoze da prepozna da se svaka promenljiva deklar-isana kao counter kor isti kao brojac u programu.VEZBA: Napravite novo ime za unsigned long po nazivu UL. Koristitetypedef u kratkom programu koji deklarise promenljivu koristeci UL,dodelite joj vrednost i prikazite tu vrednost na ekran.Oa lije sledeCi segment koda ispravan?typedef int height;typedef height length;typedef length depth;depth d;

    2.6 Konverzije tipovaC yam ornoqucava da rnesate razlicite tipove podataka u jednom iskazu. Naprimer, sledi jedan ispravan dec koda:char ch = '0';int i = 15;float f 25.6;f += i;i += ch;f-= ch;

    Mesanje tipova podataka je vodeno strogim pravilima za konverziju kako bikompajler znao kako da razresi razlike. Prv i dec skupa pravi la je promo-visanje t ipa. C kompajler ce automatski promovisati char ii i short int Uizrazu u int vrednost pri izracunavanju iskaza. Promovisanje t ipa je jedinovalidno tokom izracunavanja iskaza, sama promenljiva ne postaje f izlckiveca.

    Nakon sto su kompletirana automatska promovisanja tipova, C kompajler cekonvertovati sve promenljive u iskazu u tip najvece varijable. Ovaj posao seizvrsava tako sto se ispi tuje operacija po operacija. Sledeci algori tampokazuje konverzije tipova:IFTHENELSE IF

    operand je long doubledrugi operand se konvertuje u long doubleoperand je double

    I

    PROMENL..IIVE

    THENELSE IFTHENELSE IFTHENELSE IFTHENELSE IFTHEN

    drugi operand se konvertuje u doubleoperand je floatdrugi operand se konvertuje u floatoperand je unsigned longdrugi operand se konvertuje u unsigned longoperand je longdrugi operand se konvertuje u longoperand je unsigneddrugi operand se konvertuje u unsigned.Pogledajmo u prethodni primer i otkri jmo koji se tipovi promovisanja i kon-verzije oesavaju. Najpre se ch prornovise u int. Prva operacija je rnnozenjeeh sa i. Posto se obe promenljive sada integeri, ne desava se nikakva kon-verzija. Sledeca operacijaje deljenje izmedu ch*i i f. Algoritam definise da,ako je jedan operand tipa float, tada se i drugi konvertuje u float. Rezultat oden *i :,c konvertuje u floating point broj a potom se deli sa f. Na kraju, vred-nost od izraza ch*i/f je float, ali ce se konvertovati u double za srnestanjeu promenl jivu resul t.Umesto da se oslonite na kompajler i njegovo pravljenje konverzije t ipova,rnozete i sami da specificirate tip konverzije tako sto cete da koristite sledeciformat: (type) valueOvo se naziva type casting. Prouzrokuje privremenu promenu u promenljivoj.type je val idni C tip podataka i value je promenljiva i ii konstanta. Sledecidec koda pokazuje kako da stampate celobrojni dec broja u pokretnomzarezu.float f;f = 100.2;prlntf("%d?m (int)f);

    Broj 100 ce se starnpati na ekranu nakon izvrsavanja dela koda.Ako se pomnoze dve 8-bitne velicine, rezultat ce biti 8-bitna vrednost. Ako serezultujuca vrednost dodeli promenjivoj tipa long, rezultat ce i dalje biti 8-bitniinteger, posto je aritrneticka operacija izvrsena pre nego sto se rezultat dode-lie novoj promenljivoj.int a =250, b = 10;long c;c = a * b;

    rezultat ce bit i 196

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    20/85

    PRDMENL.JIVE

    Tako da, ukoliko zellte da long vrednost bude odgovor, tada bar jedna vred-nost mora da bude inicijalno definisana kao long iii typecast.c = (long) a *b ;

    Rezultat ce bit 2500 posto je a prvo promenilo tip na long, a zatim jeizvrseno long rnnozenje.

    2.7 Srnestanje promenljivih u memoriju(variable Storage Class)Svaka promenljiva i funkcija u C jeziku ima dva atr ibuta - tip i stor age class.Do sada su diskutovani tipovi char , in t i td. Postoje cetir : storage class-es: automatic, external, static i register. Ovi storageclasses imaju sledeca C imena:auto extern static register

    AutoPromenl ji ve deklar isane unutar funkci je podrazumevano su tipa auto sto setice Storage Class , tako da je :

    char c;int a, b, e;

    isto kao:

    auto char c;auto int a, b, e;

    Kada se primi blok koda, kompajler dodeljuje RAM prostor za deklarisanepromenlj ive. RAM lokac ije se kor iste u tom ' Iokalnom' b loku koda i rnoze/b icekoriscen od drugih blokova koda.main(){ char c = 0;

    int a = 1, b = 3, e = 5;0007: CLRF OE - registar OE je dodeljen C-u0008: MOVLW1 - uei,tavanje w sa 10009: MOVWFOF - ue i,avanje registra dodeljenom asa w

    I

    PROMENL.JIVE

    OOOA:MOVLW30008: MOVWF0sa wOOOC: MOVLWs0000: MOVWF1sa w

    - ueitavanje w sa 3ueit avanje regis tra a dodelj enom b

    - ueitavanje w sa 5- ueitavanje registra dodeljenom e

    ExternExtern kljucna rec deklarise promenljivu iii funkciju i specificira da imaeksterni link. To znaci da je ime promenljive vidljivo i u datotekama van oneu kojoj je definisano. Ne postoji funkcija unutar CCS C-a.

    StaticKlasa promenljive static def in ise global no ak tivne promenlj ive koje su in i-c ijali zovane na nulu, os im ako nije druqaci]e def in isano.void test ()

    char x,y, z;static int count = 4;printf("count = %d\n",++count);

    Promenljiva count se jed nom inici ja li zu je, a potom se inkrement ira svaki putpri pozivu test funkcije.

    RegisterVariable class registar potice od aplikacija u velikim sistemima u koji-ma bi rezervisali brzu memoriju za promenljive koje se najcesce koriste.Class se kor isti samo da bi posavetovao kompajler - nema nikakvu funkci-ju unutar CCS C.

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    21/85

    FUNKCI..JE

    FunkcijeFunkcije su osnovni gradivni blokovi C jezika. Svi iskazi se moraju nalazit iunutar funkcija. U ovom poglavlju cerno diskutovati kako se prenose argu-menti funkcij i i kako da se prime argument iz funkcije.U ovom poglavlju ce se obraditi sledece teme:Prenosenje argumenata funkcijiVracanje argumenata iz funkcijaPrototipovi funkcijaKlasicne i moderne deklaracije funkcija

    3.1 FunkcijeU prethodnim odeljcima, videli smo mnogo instanci funkcija koje se pozivajuizmain (osnovnog) programa. Na primer:main(){

    fl();

    int fl()return 1;

    U stvarnosti, ovaj program bi izazvao gresku iii, u najmanju ruku, upozoren-je. Razlog je taj sto i funkcija f1()mora bit i deklarisana iii definisana prenego sto se koristi , bas kao i promenljive. Ako koristi te standardnu C funkci-ju, header datoteka koju ukljucujete na vrhu vaseq programa, ona ce veeinformisati kompajler 0 funkciji. Ako koristite jednu od vasih funkcija, postojedva nacina za ispravljanje ove qreske. Jedan od nacina je da koristi te pro-tot ipe funkcije, sto je objasnjeno u sledecern odeljku. Drugi nacin je da reor-ganizujete vas program na sledeci nacin:I

    FUNKCI..JE

    int f1(){ return 1;

    main(){

    f1();

    U ovom slucaju se nece generisati qreska posto je function f1 () deklar-isana pre nego sto je pozvana umain () funkciji.

    3.2 Prototipovi funkcijaKoriste se dva metoda za informisanje kompajlera koji t ip vrednosti vracafunkcija. Uopstena forma je:type function_name();Na primer, iskaz int sum() ce reci kompajleru da funkcija sum() vracainteger. Drugi nacin za informisanje kompajlera 0 povratnoj vrednosti funkci-je je preko prototipa funkcije. Prototip funkcije ne daje samo povratnu vred-nost funkcije, vee takode deklarise broj i tip argumenata koje funkcija prihva-taoPrototip mora u potpunosti da se slaze sa deklaracijom funkcije.Prototip pornaze programeru da identifikuje qreske u programu izvestavajucisve ilegalne type conversion izmedu argumenata koji se prenose funkci-j i i deklaracije funkcije. Takode izvestava ukoliko broj argumenata koji sesalju funkciji nije isti kao sto je dato u deklaraciji funkcije.Uopsteni format za prototip funkcije je:type function_name(type var1, type var2, type var3);

    U prethodnom primeru, tip svake promenljive rnoze da bude dnrqaciji. Primerprototipa funkcije je dat u ovom programu. Funkcija def inise zapreminudefinisuci duzinu, sirinu i visinu.int volume(int 51, int s2, int s3);void main ()

    int vol;vol = volume(S,7,12);printf("volume: %d\n" ,vol);I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    22/85

    FUNKCI.JE

    int volume(int 51, int 52, int 53)return 51*52*53;

    Uocf te da povratna vrednost korist i iz raz umesto konstante i ii promenlj ive.Vaznost pr ototipa rnozda nije toliko ociqledna na malim progr amima sa koji-ma smo se do sada radili. Medutim, kako velicina programa raste od neko-li ko l in ija do nekoli ko stot ina l in ija, vaznost prototipa pri procesu otk ri vanjaqresaka postaje ociqledna.VEZBA:Da biste pokazali kako kompajler 'hvata' qreske, promeni te sledeCi programtako da salle cetir i parametra funkci ji volume.vol = volume (5,7,12,15);Da I i je sledeci program korektan? Zasto jeste/ni je?double myfunc ()void main(void)

    printf("%f\n", myfunc(10.2;

    double myfunc(double num)

    return num/2.0;

    FUNKC.JE

    3.3 VoidIzuzetak je kada funkcija nema ni jedan parametar koj i ulazi ii i iz lazi iz funkci -je . Takva funkci ja b i se dek lari sa la na sledeci nac in:void nothing (void)

    Primer ovakve funkci je b i b io:double pi (void) II defini5anje funkcijeII koja nema nikakve ulazne parametre

    return 3.1415926536;main()( double pi_val;pi_val = pi(); II pozivanje vredno5ti od piprintf("%d\n" ,pi_val);

    3.4 Upotreba argumenata funkcijeArgument funkcije je vrednost koja se prenosi funkciji pr i pozivu funkcije. Cdozvoljava prenosenje od nula do nekoliko argumenata funkcijama. Brojargumenata koje funkcija moze da pr ihvati zavisi od kompajlera, ali ANSI Cstandard definise da funkcija mora da bude u stanju da prihvati bar 31 argu-ment.Pri definisanju funkcije, moraju se deklarisati speci jalne promenl jive za pri jemparametara. Ove speci ja lne promenljive se definisu kao formalni parametr i.Ovi parametri se deklarlsu izmedu zagrada koje prate ime funkcije. Naprimer , funkc ija koja sledi iz racunava i s tarnpa sumu dva integer bro ja koji sesal ju funkcij i pri njenom pozivanju.

    void 5um(int a, int b)printf("%d\n", a+b);

    Primer kako bi se funkcija zvala iz programa je:void 5um(int a, int b); II OVO je prototip funkcijeI I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    23/85

    FUNKCI.JE

    main (){ sum(l,lO) ;sum(15,6);sum(lOO ,25);

    void sum(int a, int b)printf("%d\n", a+b);

    Kada se pozove sum () r kompajler ce kopirat i v rednost svakog argumenta upromenljive a i b. Vazno je da zapamtite da se vrednosti koje se prenosefunkciji (1,10,15,6,100,25) naziva ju argument ima, ada su promenl ji vea i b formalni argumenti.Funkcije mogu da prenose argumente na dva nacina. Prvi nacin se zove"poziv po vrednost i" . Ovaj metod kopira vrednost argumenta u formaln i para-metri funkci je . B ilo koja promena formalnog parametra ne utice na originalnuvrednost pozivne rutine. Drugi metod se zove "poziv po referenci". U ovommetodu se adresa ar gumenta kopira u formalni parametar funkcije. Unutarfunkcije, formalni parametar se koristi za pr istup pravoj promenljivoj u pozi-vajucoj rutini. To znaci da se promene mogu naciniti na promenljivoj upotre-bom formalnog parametra. Ovo cerno detal jn ije prodiskutovat i u poglavl ju 0pokazivacima (pointerima). Za sada, koristicerno samo metod poziva povrednosti pri prenosenju argumenata funkcij i.VEZBA: Napisite funkciju koja kao argument prihvata integer i ispisuje ovuvrednost na ekran.Sta je poqr esno u ovom programu?print_it(int nurn){ printf("%d\n", num);,main (){ print_it(156.7) ;

    I

    FUNKC c E

    3.5 Upotreba funkcija za vracan]e vrednostiSvaka funkcija u C jeziku moze da vrati vrednost pozivnoj rutini. Tipicno sefunkcija stavlja na desnu stranu znaka jednakosti (=). Povratna vr ednost nemora neophodno da se koristi u pozivnom bloku, ali se rnoze koristiti uprintf () iskazu. Uopsteni format koj i govor i kompajleru da funkci ja vracavrednost je:type function_name(formal parameters){

    return value;

    gde type spec if ici ra t ip podatka povratne vrednost i funkc ije. Funkci ja rnozeda vrati bilo koji tip podataka izuzev niza. Ako se ne specificira nikakav tippodatka, C kompajler pretpostavlja da funkcija integer (int). Ako vasafunkcija ne vraca vrednost, ANSI C standard specificir a da funkcija treba davrati void. To eksplic itno govor i kompajleru da funkci ja ne vraca vrednost.Ovaj pr imer pr ikazuje t ip icnu primenu funkcije koja ima povratnu vrednost .#include main (){

    double result;result = sqrt(16.0);printf("%f\n", result);Ova funkci ja poziva funkc iju sqrt () koja vraca br oj u formatu pokr etnogzareza. Ovaj broj se dodeljuje promenljivoj result. Uccite da je ukljucenaheader datoteka math.h pes te ona sadrzi informacije 0 sqrt () koje koristikompajler.Vazno je da uskladite t ip podatka povratne vrednost i funkci je sa t ipom podat-ka promenl ji ve kojo j ce se vrednost funkci je dodeli ti. Isto vazt i za argumentekoje saljete funkciji.Kako vr acate vrednost iz funkcije? Uopstena forma je:return variable_name;

    gde je variable_name konstanta, promenljiva iii bilo koji validni C izr az kojiima is ti t ip podatka kao i povratna vrednost. S ledeci primer pr ikazuje oba t ipafunkcija.

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    24/85

    FUNKC1.JE

    func ();sum(int a, int b);maine)( int num;num = func();printf("%d\n", num);num = sum(S,127);

    printf("%d\n", num);func()( return 6;

    sum(int a, int b){ int result;result = a + b;return result;

    Uocite jednu vaznu stvar, kada se naide na return iskaz, funkcija se vracaodmah pozivnoj rutini. Svi iskazi nakon return iskaza se nece izvrsavati, Nezahteva se da se povratna vrednost funkci je dodel i promenlj ivoj i ii da sekoristi u izrazu, ali , ukoliko se ne dodeli, njena vrednost se gubi.VEZBA:Napisite program koji prihvata celobrojni broj izmedu 1 i 100 i vraca kvadrattog broja.Sta je poqresno u ovoj funkciji?main ()( double result;result = f1 ();printf("%f\n",result) ;

    inf f1()return 60;

    I

    FUNKC1.JE

    3.6 Klasicne i moderne deklaracije funkcijaOriginalna verzija C jezika je koristila druqacl] metod deklarisanja formalnihparametara. Ova forma, koja se danas naziva klasicna forma, je izgledalaovako:type function_name(var1,var2, ..,varn)type var1;type var2;

    type yarn;(

    Uocite da je deklaraci ja podel jena na dva dela. Samo su imena parametaraukl jucena unutar zagrada. Izvan zagrade su specificirani tipovi podataka iimena formalnih parametara.Moderna forma, koji smo koristili u prethodnim primerima je data sa:type function_name(type var 1, .,. type var n)

    U ovom tupu deklarisanja funkcije, i t ipovi podataka i imena formalnih para-metara su definisani unutar zagrada.ANSI C standard dozvoljava oba tipa deklarisanja funkcija. Razlog jeodrzavanje kompatibilnosti sa starijim C programima u kojima ima bukvalnobil ion l inija C koda. Ako vidite klasicnu formu u delu koda, nemojte se brinu-t i, vas C kompaj ler je u stan ju da se sa t im izbor i. Ali nadalje b i t rebalo da pripisanju koda koristite modernu formu.VEZBA: Sta je prototip funkcije i koje su prednosti od njenog koriscenja?Konvertujte ovaj program koji koristi klasicnu formu za deklarisanje funkcijatako da koristi modernu formu.void main(void)

    printf("area %d\n", area(10,lS;area (1,w)int 1,w;

    return l*w;

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    25/85

    FUNKCI.JE

    3.7 Prenosenje konstantnih stringovaPosto PICmicroMCU ima oqranicenja u ROM pris tupu, kons tantni st ringovise ne mogu preneti funkcijama na obican nacin.CCS kompajler razr esava ovu situaciju na nestandardni nacin. Ako se kon-stantni st ring prenosi funkc iji ko ja dozvoljava samo karak ter parametar tadase funkcija poziva za svaki karakter u stringu. Na primer:void lcd_putc(char c) (

    lcd_putc ("abcd") ;

    Je isto kao:

    lcd_putc('a') ;lcd_putc( 'b');lcd_putc('c') ;1cd_putc (,d ' ) ;

    I

    FUNKCI..JE

    C operatoriU C jeziku, izrazi igraju vaznu ulogu. Razlog je taj sto C definise veci brojoperatora od vecine drugih jez ika. Izraz je kombinaci ja operatora i operana-da. U vecini slucajeva, C operatori slede algebarska pravila i trebalo bi dayam budu poznati .U ovom poglavl ju cerno disktutovati mnogo razlici tih t ipova operatora ukl jucu-juci:ArltrnetickeRelacioneLoqlckeBitskeInkrement i dekrementPrelrnucstvo operatora

    4.1 Aritmetlckl operatoriC jezik definise pet aritrnetickih operatora za sabiranje, oduzimanje,rnnozenje, deljenje i deljenje po modulu.

    + sabiranje- oduzimanje* mno :enje/ deljenje% deljenje po moduluOperatori + , -, * i / se mogu koristiti sa bilo kojim tipom podatka.Modulus operator % se rnoze kor ist it i samo sa celobrojnim vrednostima.Modulus operator daje ostatak celobrojnog deljenja. Stoga ovaj operatornema nikakvo znacenje ako se primeni na broj u pokretnom zarezu.Operator _ se rnoze koristiti na dva nacina, prvi je kao operator oduzi-

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    26/85

    C OPERATERI

    manja. Drugi nacin je kor iscenje za obr tanje znaka broja. Sledeci pr imeri lust ruje dva razli ci ta nacina primene - znaka.

    a = a - b ; oduzimanjea = -a ; promena znaka promen1jive aAritrneticke operacije se mogu koristiti u bilo kojoj kombinaciji konstanti i/ilipromenlji vih. Na primer, s ledeci iz raz je validni C iskaz.result = count - 163;

    C yam takode daje neke preeice pri koriscenju ari trnet ick ih operatora. Jedanod prethodnih primera a = a -b se moze napisati i kao a-=b;. Ovaj metodse moze koristite sa +, -, * i / operatorima. Primer prikazuje razlicitenacine implementacije ovog metoda.a*=b a=a*ba/=b a=a/ba+=b a=a+ba-=b a=a-ba%=b a=a%ba=b a=aba=b a=aba&=b a=a&bal =b a=albaA=b a=aAb

    Uzirnajuci C kod i poredeci ga sa asembiranom verzijom pokazuje se kakose ari trneticke funkcije realizuju unutar PIC-a.

    int a, b, c;a = b + c;

    postaje0007:MOVF OF,W0008: ADDWF 10, W0009: MOVWF OEa = b -c;

    ueitavanje bdodavanje c na beuvanje u a

    postaje0007:MOVF OF,W uei.t.avan [e beuvanje u aueitavanje coduzimanje od a0008: MOVWF OE0009:MOVF 10,WOOOA:SUBWF OE,F

    I

    C OPERATERI

    vaznost razumevanja asemblera postaje oc iq ledna pri resavanju problema -Otkrio sam, vremenom, da se gledanjem u asembler ski listing (.LST) moguuociti neke qr eske u C-u. Jedna jednostavna greska je upotreba = iii ==

    a = b;postaje0007: MOVF0008:MOVWF OE

    doka==bpostaje0007:MOVF0008:SUBWF OE,W0009:BTFSCOOOA:GOTO

    OF,W ; ueitavanje b; euvanje u a

    OF,W ueitavanje boduzimanje od a03,2 testiranje da 1i je nu1a000 da -znaei preskoei

    U prvom primeru, a postaje isti kao b, dok se u drugom slucaju a testira dabi se videlo da Ii isti kao b.

    VEZBA:Napisi te program koji nalaz i os tatak deljena 5/5, 5/4, 5/3, 5/2 i 5/1.Napisi te program koji i zracunava broj sekundi u godin i.

    4.2 Relacioni operatoriRelacioni oper atori u C jeziku porede dve vrednosti i vr acaju vr ednost tacnoi ii netacno zavisno od rezultata poredenja. Relacioni operator i su> veci od>= veci od ili jednak< manji od

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    27/85

    C DPERATER

    SIede6i primeri prikazuje neke izraze sa relacionim operatorimavar > 15 ako je rezultat manji ili jednak 15,rezultat je 0 (false)var != 15 ako je rezultat ve~i ili manji od 15,rezultat je 1 (true)

    VEZBA:Ponovo napisite slede6i izraz koriste6i druqaci]: relacioni operator.count ,= 0

    Kada je ovaj izraz true iii false? Zasto?count >= 354.3 Logicki operatoril.oqicki operatori podrzavaju osnovne loqicke operacije AND, OR i NOT.Ponovo, ovi operator i vracaju ii i 0 za false iii 1 za true. l.oqicki operatori itabela istinitosti za ove operatore se prikazuje kao:

    AND OR NOTP q p&&q pllp !p0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0

    Loqicki i relacioni operatori su tesno vezani pri izracunavanju izraza. Primerpovezivanja ovih operatora je:count>max I I ! (max==57) && var>=O

    Drugi dec C jezika koji kor isti relacione i loqicke operatore su iskazi pro-gramske kontrole koji c e se obraditi u slede6em poglavlju.VEZBA: Napisite na drugi nacin slede6i izraz upotrebljavaju6i bilo koju kom-binaciju relacionih i loqickih operatora.cont == 0result

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    28/85

    C CPERATERI

    XOR00000101 (5)00000110 (6)00000011 (3)

    SIFT u1evo00000101 (5) 2= 00010100 (20)

    NOT00000101 (5)11111010 (250)

    Sift udesno00000101 (5) 200000001 (1)

    NAPOMENA: Ne siftujte za veci broj bita nego sto ih ima operand - dobicese nedefinisan rezultata = b I c;

    postaje0007:MOVF OF,W ueitavanje b0008:IORWF 10,W ink1usivno iIi sa c0009:MOVWF OE saeuvajte u aa = b &c;

    postaje0007:MOVF OF,W ueitavanje b0008:ANDWF 10,W and funkcija sa c0009:MOVWF OE saeuvajte u aa = b 3

    postaje0007:MOVF OF,W ueitavanje b0008:MOVWF OE saeuvajte u a0009:RRF OE,F rotiranje sadr_ajaOOOA:RRF OE,F triOOOB:RRF OE,F putaOOOC:MOVLW IF primena maske na sadr ajOOOD:ANDWF OE,F registra za a

    I

    C CPERATERI

    j = -a;postaje

    0009:MOVF OF,W ueitavanje aOOOA:MOVWF OE euvanje u jOOOB:COMF OE,F komplement od jVEZBA: Napisite program koji invertuje samo MSB oznacenoq karakteraNapisite program koji prikazuje binarnu prezentaci ju broja podatka t ipakarakter.

    4.5 Operatori inkrementiranja i dekrementiranjaKako biste inkrementirali iii dekrementirali promenljivu za jedan? Verovatnoyam jedan iii dva iskaza padaju napamet. Mozdaa = a+1; iii a = a-I;

    Opet, stvoritelji C jezika su se pojavili sa skracenorn notacijom za inkremen-tiranje iii dekrementiranje broja. Uopstena forma je:a++ iIi ++aa-- iIi -- a za inkrementza dekrement

    Kada ++ iii -- znak prethodi prornenljivoj, promenljiva se inkrementira a ondase ta vrednost kor isti u izrazu. Kada ++ ii i - - slede iza vari jable, vrednostvarijable se najpre koristi u izrazu a potom se inkrementira.int j, a = 3;0007: MOVLW 030008: MOVWF OF ;registar pridruzen aj ++a;0009: INCF OF,FOOOA: MOVF OF,WOOOB: MOVF OE

    a++;OOOC: MOVF OF,WOOOD: INCF OF,FOOOE: MOVF OE

    a = 4ucitavanje a u wsmestanje w u jj

    ucitavanje vrednosti od a u wa = 5j = 4NAPOMENA: Ne koristi te formata = a++;

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    29/85

    C DPERATER

    jerce se generisatislede6ikod:MOVF OE,WI NC F O E, FMOVWF OE

    vrednost od a je ueitana u wv re dn os t u a i nk re me nt ir an ap re th od na p on ov o u ei ta nav re dn os t p re pi su je i nk re me nt ir an u v re dn os t

    Sledeci primerilustrujeve dve primenevoid main (void)

    int i,j;i = 10 ;j = i++;printf("ii = 10 ;j = ++i;printf("i = %d\n", i, j);

    }

    %d\n", i, j);

    Prviprintf () iskazce starnpati 11za i i 10 za j. Drugiprintf () iskazce starnpatii 11 iz a i iz a j.

    Mesanje svega ovoga zajednoNapisano Operacijasu m = a+b++ su m = a+ bb = b+ 1sum a+b-- sum = a+ bb b- 1sum a+ ++b b b+ 1

    su m = a+ bsu m = a+ --b b = b- 1su m = a+ b

    VEZBA :1. P o no vo n ap is i teo pe r at or e u ovom p ro gr am u u i nk re me nt d ek re me ntiskazima.

    void main (void)

    I

    C OPERATERJ

    int a, b;a = 1;a = a+1;b a;b b-1;p rintf( "a=%d, b=%d\ n", a , b);

    2. Koja jevrednost promenljiviha ib nakon zavrsetka izvrsavanja sledeceqdela koda?a = 0;b 0;a = ++a + b++;a++;b++;b = -a + ++b;

    4.6 Redosled prvenstva operatoraRedosled p rv en s tv a u k a zu je n a r ed o sl ed p o k om e s e o pe ra t or ip ro ce s ir aj uo d s t ra ne C kompajlera.Na primer,ako se u vasern p r og ra mu n ai de n a i z ra za+b*c, koja ce se operacijaprva izvrsiti? Sabiranje iiinnozenje? C jezikodrzava redosled izvrsavanja za sve operatore.Sledi prikazprvenstva odnajviseq d o n a jn iz e q.Prior itetperat or Primer

    1 () ++ -- (a+b)/c zagrade2 sizeof & * a= -b plus/minus/NOT+ - - ! ++ komplement/inkrement/dekrement/sizeof3 * / % a%b rnnozenje/deljenje~modules4. + - a+ b sabiranje/dodavanje5 a=bc p om er an je l ev oHi desno6 < > = a>=b vece/manje/jednako7. != a==b8 & a=b&c bitsko AND9 a=b"c bitsk o XO R10 a=blc bitsk o OR11 && a&&b logicko AND12 II a l lb l og ic ko O R13 = *= /= %= a+=b dodeljivanjeI

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    30/85

    C OPERATERI

    += -= = =$= A= 1=N k d ovih operatora nismo jos pokril i, ali ne brini te, bite kasnije pokr iveni .e lOt k sto i kDruga l ini ja je sastavl jena u potpunosti od unarnih operda0f .r~ a~ s 0 Jdenl rde-ment iii dekrement. Zagrade se mogu koristiti za e uusanje re os e alzvrsavania operatora.Par primera upotrebe zagrada za pojasnjenje iii promenu redosleda lzvrsa-vanja u okv iru iskaza su:10-2*5 = 0(10-2)*5 = 40count*num+88/val-19%count(count*num) +(88/va1) - (19%count)

    VEZBAKoja je vrednost promenljvih a i b nakon zavrsetka lzvrsavan ja del a koda?int a=O,b=O;a = 6*8+3*b++;b += -a*2+3*4;

    I

    ISKAZI

    Iskazi kontrole toka C programaU ovom poglav lju tete nauciti 0 iskazima koje C koristi za kontrolu tokalzvrsavan ja vaseq programa. Takode tete nauci ti kako se relacioni i logickioperatori koris te sa ovim kontrolnim iskaz ima. Takode cerno pokriti nacinizvrsavanja petlji.Iskazi koj i ce se obradi ti u ovom poglav lju su:ifif-elseforwhiledo-whilenesting loopsbreakcontinueswitchnullreturn

    5.1 if iskazIf iskaz je uslovni iskaz . B lok koda pridruzen i f i skazu se izv rsava zavisnood uslova iskaza. Ponovo ponavljamo, svaka vrednost razlicita od nule sesmatra za tacnu ( true) , a vrednost nu la je netacno ( fa lse) . Naj jednostavn ijaforma je:if (izraz)iskaz; NAPOMENA: ne; iza izraza

    Izraz rnoze da bude bilo koji validni C iskaz. If iskaz izracunava vrednostizraza, a rezultat moze da bude true iii false. Ako je rezultat izraza true(tacna), iskaz se izvrsava. Ako je rezul ta t false (neiscno), program nastavljasa radom bez izvrsavanja iskaza. Jednostavan primer za if je:if (num > 0)printf("Broj je pozitivan \n");

    Ovaj primer prikazuje kako se relacioni operatori koriste u iskazima pro-gramske kontrole.

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    31/85

    ISKAZI

    If iskaz se takode moze koristiti za kontrolu izvrsavanja blokova koda.Uopsteni format je:if (izraz)

    iskaz;

    Zagrade { i } se koriste za oqranicavanje bloka koda. To govori kompajleruda ukoli ko je iz raz tacan, izvrsi kod izmedu zagrada.Primer za if i blok koda je:if (count < 0)

    count = 0;printf("Count down\n");

    iIi if(TestMode == 1)... stampanje parametara korisniku

    Ostali operatori poredenja koji se koriste u if iskazu je:x == yX ,= Yx > yx < yx =yx && Yx II y

    x jednak yx nije jednak yx veale od yx manje od yx manje iIi jednako yx veale iIi jednako ylogieko ANDlogieko OR

    Pr imer jedne ovakve fukcije - konvertovane u asember je:int j, a = 3;

    0007: MOVLW 030008: MOVWF OFif (j ==2)

    0009: MOVLW 02OOOA: SUBWF OE,WOOOB: BTFSS

    ueitavanje sa 3

    ; ueitavanje w sa 2testiranje da Ii postoji slaganje sa j03,2 ; ako je nu1a preskaee se

    I

    ISKAZI

    j =a;0000: MOVFOOOE: MOVWF DE OF,W ako je nu1a tadaueitaj a u j

    VEZBA: Koj i od izraza rezul tuje tacnorn vredooscuva. 0b. 1c. -1d. 5*5

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    32/85

    ISKAZI

    if (num 20)printf ("broj je vecei od 20 ");count-;

    Napisite program koji ispisuje i ii cent, 5 centi, 10 centi, 20 centi, 20 centi i iidolar zavisno od vrednosti promenljive. Validne vrednosti promenljive su1,5,10, 25,50 i 100, a ostale vrednosti se smatraju nevalidnim.

    5.3 ? operator? operator je zapravo verzija izraza if else iskaza. Format je:(expr1) ? (expr2) : (expr3);

    pri cernuje svaki od expr? validni C iskaz. Najpre se izracunava exprl. Akoje rezultat TRUE (zapamtite da je to vrednost razlicita od nule), izracunavase expr2. Ako je rezultat FALSE (nula) tada se izracunavan expr3. Slediprimer? operalora.int i,i;i = 1;i ? j=O : j=l; OR j=?O:l;

    Posto je i jednako 1 Ij razlicit od nule, izracunace se izraz j=O.Za razliku od if iskaza ? operator vraca vrednost. Na primer:i = (i

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    33/85

    ISKAZI

    Oeo inicijalizacija se koristi za dodeljivanje inicijalne vrednostipromenl ji vo j brojac pet lje . Uoci te da ova bro jacka promenl ji va mora da budedeklarisana pre nego sto se for petlja rnoze koristiti. Ovaj dec for petlje selzvrsava samo jednom. Test_uslov se izvrsava pre svakog izvrsen]a petl -je. Uobicajeno se u ovoj sekciji petlje testira vrednost brojaca petlje na trueiii false uslov. Ako je test uslov true izvrsava se petlja. Ako jetest uslov false, napusta sepet lja i nas tav lja se za izvrsavanjern progra-mao I~krement dec for pet lje normalno inkrement ira vrednost brojaca petl-je.Evo primera for petl je :void main (void)

    int i;for (i=O; i

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    34/85

    ISKAZI

    Uocicete da prvi iskaz daje karakter sa tastature. Potom se izracunava izraz.Sve dok vrednost ch nije q, program ce nastaviti da prima sledeci karaktersa tastature. Posto se primi q, printf () se izvrsava i program se zavrsa-va.VEZBA: Sta radi sledeci while iskaz?while (i

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    35/85

    ISKAZI

    void main (void)int i;for(i=O;i

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    36/85

    ISKAZI

    ch = getch ();if (ch=='x ')return 0;switch (ch)case '0':printf("Nedelja\n") ;

    break;case '1': printf("ponedeljak\n") ;

    break;case '2':printf("Utorak\n") ;

    break;case '3':printf("Sreda\n") ;

    break;case '4':printf("Eetvrtak\n") ;break;case '5':printf("Petak\n") ;

    break;case '6':printf("subota\n") ;

    break;default:printf("Ulazna vrednost nije validna\n");

    U ovom pr imeru ce program citati broj ci ja je vrednost l zrnedu 0 !.6. Ukoli koje broj i zvan ovog opsega, i splsace se poruka Ulazna vrednos t rnje val idna.Sled i drug i p rimer u kome se postav lja b ro j karaktera po. l i .~ .i jina. LCD d ispl~-j u. Ci ta se DIP prek idac i zadata vrednost.karaktera p? 1,lnIJI,zat im ~e od.vaJ~od drugih b ita i po tom se kor is ti za vracan ]e odqovarajuce vrodnosti poz ivno jrutini.byte cp1_sw_get(){

    II karakteri po 1inijibyte cp1;cp1 = portd & Ob01110000; II maskiranje nezeljenih bitaswitch (cp1) II rad sa dekodovanom velicinom

    I

    ISKAZI

    case OxOO: cp1 = 8; break;case Ox10: cp1 =16; break;case Ox20: cp1 =20; break;case Ox30: cp1 28; break;default: cp1 = 40; break;return (cp1); II vracanje povratne vrednosti pozivnoj rutini

    ANSI standard propisuje da C kompajler mora da podrzava bar 257 caseiskaza. Ova case uslova u switch petlji ne mogu imati istu vrednost.Takode, swi tch petl je se mogu medusobno ugn jezdavat i, sve dok unu trasn-ja i spol jasn ja swi tch pet lja nemaju kon fl ik t svoj ih vrednost i. ANSI kompa jlermora da obezbedi 15 nivoa uqn jezdavan ]a za switch iskaze. Sledi primeruqnjezdenih switch petlji:switch (a){ case 1:switch (b)

    { case 0:printf("b je netacno");break;case 1:printf("b je tacno");break;

    break;case 2:

    Break iskaz u okviru switch iskaza je takode opcion. To znaci da dva caseiskaza mogu da dele is ti dec koda. Primer koji sl edi to il ustruje:void main (void)

    int a=6,b=3;char ch;printf("Sprintf ("0printf ("Mprintf("Dch=getch ();

    Sabiranje\n") ;Oduzimanje\n") ;Mnozenje\n") ;Deljenje\n") ;

    switch (ch) I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    37/85

    ISKAZI

    case '0':printf I"\t\t%d" ,a-b);break;case'S' :printf I"\t\t%d",a+b);break;case 'M':printf I"\t\t%d",a*b);break;case 'D':printf I"\t\t%d" ,a/b) ;break;default:printfl"\t\ta ste hteli da zadate?");

    VEZBA:Sta je poqresno u ovom delu koda?float f;

    ISKAZI

    Iskazi kao sto su do, for, if i while zahteva da se izvrsna komandapojavljuje u telu iskaza. Null i skaz zadovol java uslove sintakse u ovim sluca-jevima.for li=O; i

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    38/85

    ISKAZI

    Nizovi i stringoviU ovom poglavlju cerno diskutovati nizove i stringove. Niz je jednostavno listaelemenata istog tipa podataka.String se definise kao niz karaktera zavrsenih vrsdnoscu nul l, a takode jepoznat kao najpoznatiji i najcesci jednodimenzionalni niz.Teme koje ce se obradit i u ovom poglavlju su:NizoviStringoviJednodimenzionalni nizoviVisedimenzioni nizoviInicijalizacija6.1 Jednodimenzionalni nizoviNiz je lista promenljivih istog tipa na koje se moze ukazati preko istog imena.Pojedinacna promenljiva u nizu se naziva elemenat niza. Toje jednostavannacin upravljanja grupama medusobno zavisnih elemenata.Opsta forma deklarisanja jednodimenzionalnih nizova je:

    type var_name [size];gde type predstavlja korektan C tip podataka, var_name predstavlja imeniza, a size odreduje koliko elemenata ima u nizu. Na primer, ako zelirno nizod 50 elemenata mozerno da koristimo ovaj iskaz.

    int height [50];C definise da, u deklarisanom nizu, prvi elemenat niza ima index O . Ako nizima 50 elemenata, poslednji elemenat ima indeks 49. Koriste6i prethodniprimer, pretpostavimo da zelirno da indeksiramo 25-ti elemenat niza height ida mu dodelim vrednost 60. SIede6i primer pokazuje kako da se to uradi:

    height [24] = 60;C srnesta jednodimenzione nizove kontinualno u sukcesivne memorijskelokacije. Prvi elemenat se nalazi na najnizo] adresi. Ako se slede6i elemenatkoda izvrsava ...

    I

    NIZOVI I STRINGOVI

    int num[10] ;int i;for (i=0;i

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    39/85

    NIZDVI I STRINGDVI

    nizu. Medutim, to rnoze dovesti do katastrofalnih rezultata, Cesto to mozedovesti ne samo do pada celog programa vee i do obaranja celog racunara,C yam ne dozvoljava da dodelite vrednost jednog niza drugom nizu jednos-tavnim koriscenjern dodeljivanja na sledeCi nacin:int a[10], b [10];

    a=b;Prethodni primer je nekorektan. Ukoliko zelite da kopirate sadrzaj jednogniza u drugi morate da kopirate svaki pojedinacan elemenat prvog niza udrugi niz. Sledeei primer pokazuje kako da kopirate niz a [ ] u b[] pod pret-postavkom da niz ima 20 elemenata.for(i=0;i

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    40/85

    NIZOVI I STRIN130VI

    int number [5][5]; //koristi 25 ram lokacijaDodatne dimenzije se mogu dodati jednostavnim dodavanjem dodatnog sku-pa zagrada.Radi jednostavnosti cerno diskutovati samo dvodimenzine nizove, ali se sversceno rnoze primeniti i na visedimenzione nizove. Dvodimenzioni nizovi senajbolje reprezentuju u vrsta/kolona formatu. Stoga se dvodimenzionim nizo-vima pristupa po vrstama, i to sleva na desno.Dvodimenzioni nizovi se koriste na potpuno isti nacin kao i jednodimenzioninizovi. Na primer, sledeci program smesta u 5 x4 niz, u svaki elemenat nizaproizvod indeks vrednosti elementa niza, a potom prikazuje sadrzaj niza uvrsta/kolona formatu.void main (void)

    int array[5] [4];int i,j;for (i=O;i

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    41/85

    NZClVI I STRINGClVI

    int num[3] [3] {1, 2, 3,4, 5, 6,7, 8, 9};

    VEZBA:Da Iije ova deklaracija ispravna?int count[3] = 10.0, 5.6, 15.7;

    Napislte program koji ima lookup tabelu za kvadrat i kub broja. Svaki redtreba da sadrzi broj, kvadrat broja i kub tog broja. Napravite niz dimenzija 9x3ko]i c e sadrzati ove informacije za brojeve 1-9. Pi tajte kor isnika za brojupotrebom iskaza scanf ("%d", &num); lspisite na ekranu broj, kvadrat ikub tog broja.

    6.5 Niz stringovaNiz stringova je veoma povoljan u C-u. Moze se deklarisati i inicijalizovati kaobi lo koj i drugi niz. Nacin na koj i se korisit i n iz je donekle razlicit nego koddrugih nizova. Na primer, sta sledeca deklaracija definise?char names [10] [40];

    Ovaj iskaz dafinise niz name koji sadrzi 10 imena, pri cemu je svako imeduqacko 40 karaktera (ukljucuiuci nUll). Za pristup stringu iz tabele dovoljnoje specificirati samo prvi indeks. Na primer, da bi se ispisalo peto ime iz ovogniza koristi se slede6i iskaz.printf ("%s", names[4]);

    Isto pravilo vazi i za nizove koji imaju vise od dve dimenzije. Na primer, akoje niz animals deklarisan na slede6i nacin:char animals [5] [4] [80];

    Da biste pristupil i odredenom stringu, koristi6ete prve dye dimenzije. Naprimer, da biste pristupil i drugom stringu u trecoj l isti , specificirajte ani-mals [2][1].VEZBA:Napisite program koji pravi tabelu stringova koji sadrze reb za brojeve od 0do 9. Omogu6ite korisniku da unese pojsdinacnu cifru, a potom vas programtreba da ispise odqovarajucu rec. Da biste dobili indeks unutar tabele,oduzmite '0' od unetog karaktera.

    I

    NZOVI I STRINGClVI

    6.6 String funkcijeUnutar p~ogramase stringovima rnoze manipulisati na mnogobrojne nacine,Jedan pn~er Jekopiranje sa izvorista na odrediste pornocu strcpy komande.Toomogucava da se stnng konstanti unese u RAM.

    II bib1ioteka string funkcijainc1ude Iidefinise string nizhar string[10];

    strcpy (string, "zdravo svima"); Ilpostav1janje karaktera u stringUocite da ukazivac i na ROM nisu validni u PICmicroMCU tako da nernozete da prenesete constant str ing u neku od ovih funkcija. strlen("Zdravo") nije validan. Jos primera:char sl[10], s2[10];strcpy(sl, "abc");strcpy(s2, "def");strcat(sl,s2) ;printf("%u",strlen(sl)) ;printf(sl) ; II stampace 6II stampace abcdefif (strcmp(sl,s2) !=O)printf("ne slazu se"}; II stampace "ne slazu se"

    Dostupne su i druge string funkcije kao sto su:strcatstrchrstrrchrstrcmpstrncmpstricmpstrncpystrlenstrlwrstrpbrkstrstr

    Vrsi spajanje dva stringaTrazi prvo pojavljivanje karaktera u stringuTrazi poslednje pojavljivanje karakteraPoredi dva stringaPoredi broj karaktera u dva stringaPoredi dva stringa iqnorisuci razliku u velicini slova (da Iisupisana velikim iii malim slovom)Kopira definisani broj karaktera izjednog stringa u drugi stringlzracunava duzinu stringaZamenjuje velika slova malim slovimaLocira mesto slaganja prvog karaktera u dva stringaLocira prvo pojavljivanje sekvence karaktera u stringu

    Obezbedite da string niz odgovara velicini stringa kojim se manipulise.

    I

  • 5/13/2018 Program Ski Jezik C Za PIC Mikrokontrolere (Nebojsha Pejchic)

    42/85

    POKAZIVACI I PONTERI

    Pokazivaci - pointeriOvo poglavlje pokriva jednu od najvaznijih, ali istovremeno i najprob-lernat lcnii ib karakter ist ika C jezika, a to su pokaz ivac i, Pokazivac je u osnov iadresa objekta.Neke od tema koje cerno obraditi u ovom poglavlju su:Osnovni pokazivaclPokazlvacl i nizoviPrenosen]e pokazivaca u funkcijama7.1 Uvod u pokazivacePokazivac je memorijska lokacija (promenljiva) koja sadrzi adresu drugememorijske lokacije. Na pr imer, ako pokazivac promenljiva a sadrzi adresupromenljive b, tada a ukazuje na b. Ako je b promenljiva na lokaciji 100 umemoriji, tada ce a sadr zati vrednost 100.Uopsteni obli k deklari sanja promenl ji ve t ipa pokazivac je:type *var_name;

    Tip promenlj ive pokazivac je jedan od vazecih C t ipova podataka. Oek lari sn it ip ukazuje na t ip promenlj ive na koji var _name rnoze da ukazuje. Mozete dauoci te da znak zvezdica * prethodi var_name . To govori kompajleru da jevar _name promenlj iva t ipa pokazivac. Na pr imer , sledeci iskaz pravi pokazi -vac na celobrojnu vrednost.int *ptr;

    Ova specialna operatera pridruzena radu sa pokazivaci rnaa su * i &. Adresipromenlj ive se rnoze pris tupit i tako sto se ispred nje stav i & operator. * oper-ator vraca vrednost srnestenu na adresu na koju ukazuje promenljiva. Naprimer,#include

    void main (void)int *a,b; I l v i s e od jednog bajta moze ukazivati na ab = 6;a = &b;printf("%d", *a);

    I

    POKAZIVACI I PONTERI

    NAPOMENA:Podrazumevano, kompajler koristi jedan bajt za pointere. To znaci da ser noze uvesti pokazivac samo na lokacije 0-255. Za delove koji sadrze vecemem.ori je, rnozda ce se zahtevati kor iscenje dvobajtnih pokazivaca (16-bita) .Oa bis ts izabrali 16-bi tni pokazivac, korist ite sledece iskaze;#device *=16

    Budite svesni da ce se u tom slucaju generisati vise ROM koda posto je 16-bitna ari tmetika manje efikasna.Prvi iskaz definise dve promenljive: a, koja je pokazivac na celobrojnu vred-nost I b koja je celobrojna vrednost. Sledeci iskaz dodeljuje promenljivoj bvrednost 6. Potom se adresa od b (&b) dodeljuje pokazivac varijabli a. Ovalinija koda se rnoze citati kao: dodeli a adresu od b. Na kraju se vrednostpromenljive b prikazuje na ekranu upotrebom * operatora sa pokaz ivacpromenlj ivom a. Ova lini ja rnoze starnpat i v rednost sa adrese na koju ukazu-je a. Ovaj proces ukazivanja na vrednost preko pokazivaca se naziva indi-rekci ja . U daljem tekstu je prikazan grafick i pr imer :

    100 3 i102 5 i104 -1 k106 102 ptr

    inti, j, k;int *ptr;inicijalno

    i. je 3&a