35
Predgovor U ovoj skripti ćete naučiti osnove programiranja mikrokontrolera.Skripta je prilagođena početnicima tako da su moguće male greške u principu rada pojedinih dijelova mikrokontrolera radi pojednostavljenja. Tokom čitanja obratite pažnju na napomene kako ne biste oštetili vaš mikrokontroler. Pored svakog programa koji je potpun i spreman za ubacivanje u mikrokontroler će biti napomena i šema spoja po kojoj ćete spajati vaš mikrokontroler. Zbog pojednostavljivanja problema, moguće je da ćemo u nekim primjerima koristiti više resursa mikrokontrolera nego što je to potrebno. Posebno poglavlje će biti posvećeno ovome tj. optimizaciji programa za naš mikrokontroler. Svi primjeri će biti kompatibilni i rađeni za mikrokontroler pod nazivom PIC16F84a. Taj mikrokontroler koristi 18-pinsko kućište i ima dva porta,PORTB koji je 8-bitni i PORTA koji je također 8-bitni ali kod kojeg su bitovi 6,7 i 8 neiskorišteni..... 1

Skripta for programming in c of pic mic

Embed Size (px)

DESCRIPTION

This will help you to learn programing of microchip controllers in C language.It also can help you to learn programming in C.It can teach you to program other MCUs like pic6f877a and so on...

Citation preview

Page 1: Skripta for programming in c of pic mic

PredgovorU ovoj skripti ćete naučiti osnove programiranja mikrokontrolera.Skripta je prilagođena početnicima tako da su moguće male greške u principu rada pojedinih dijelova mikrokontrolera radi pojednostavljenja. Tokom čitanja obratite pažnju na napomene kako ne biste oštetili vaš mikrokontroler. Pored svakog programa koji je potpun i spreman za ubacivanje u mikrokontroler će biti napomena i šema spoja po kojoj ćete spajati vaš mikrokontroler. Zbog pojednostavljivanja problema, moguće je da ćemo u nekim primjerima koristiti više resursa mikrokontrolera nego što je to potrebno. Posebno poglavlje će biti posvećeno ovome tj. optimizaciji programa za naš mikrokontroler. Svi primjeri će biti kompatibilni i rađeni za mikrokontroler pod nazivom PIC16F84a. Taj mikrokontroler koristi 18-pinsko kućište i ima dva porta,PORTB koji je 8-bitni i PORTA koji je također 8-bitni ali kod kojeg su bitovi 6,7 i 8 neiskorišteni.....

1

Page 2: Skripta for programming in c of pic mic

PIC

Da bismo znali programirati mikrokontroler potrebno je da znamo njegovu strukturu. Mikrokontroleri se sastoje od :

ROM(Read Only Memory) je vrsta memorije koja se koristi za trajno snimanje izvršnog programa. Veličina programa koji se može upisati u ROM memoriju zavisi od veličine memorije. ROM memorija može biti ugrađena u mikrokontroler ili dodana kao vanjski čip koja zavisi od vrste mikrokontrolera. Obje opcije imaju neke mane. Ako je ROM memorija dodana kao vanjski čip, mikrokontroler je jeftiniji i program može biti znatno duži. Istovremeno, broj dostupnih pinova se smanjuje jer mikrokontroler koristi vlastite I/O(Input(ulaz)/Output(izlaz)) pinove za vezu sa čipom. Unutrašnja ROM memorija obično je manja i skuplja, ali ostavlja više raspoloživih pinova za povezivanje sa perifernom okolinom. Veličina ROM memorije je od 64KB do 512KB.

RAM(Random Access Memory) je vrsta memorije koja se koristi za trenutno čuvanje podataka ili rezultata obrade podataka tokom rada mikrokontrolera. Sadržaj memorije je izgubljen kada nestane napajanja. Na primjer, ako program vrši sabiranje dva broja, nužno je imati registar koji je zadužen da čuva rezultat tj. sumu. Veličina RAM-a je nekoliko KB.

EEPROM( Electrically Erasable Programmable ROM) je specijalna vrsta memorije koju nemaju svi mikrokontroleri. Sadržaj ove memorije se može mijenjati tokom izvršavanja programa(slično RAM-u), ali ostaje vječno sačuvana čak i kada dođe do nestanka napajanja(slično ROM-u). Obično se koristi za čuvanje vrijednosti nastalih tokom izvršavanja programa. Nedostatak ove memorije je relativno spor proces programiranja. Reda nekoliko milisekundi.

slika

2

Page 3: Skripta for programming in c of pic mic

SFR(Special Function Registers) su dijelovi RAM memorije. Njihovu namjenu je definisao proizvođač i ne može se mijenjati. Kako su njihovi bitovi fizički vezani za pojedine el. krugove unutar mikrokontrolera, kao što su A/D konverteri , modul za serijsku komunikaciju itd. ,svaka promjena njihovog stanja direktno utiče na rad mikrokontrolera ili na neki od njegovih krugova.

Brojač pokreće program i ukazuje na memorijsku adresu koja sadrži sljedeću naredbu koja se treba izvršiti. Nakon svake izvršene naredbe, vrijednost brojača se povećava za 1. Zbog ovoga mikrokontroler izvršava samo jednu naredbu. Međutim,vrijednost brojača može biti promijenjena u bilo kojem trenutku što će prouzrokovati „skok“ na novu memorijsku lokaciju. Ovako se izvršavaju potprogrami. Poslije skoka brojač automatski nastavlja monotono brojanje +1,+1,+1...

CPU(Central Processor Unit) kao što joj i ime govori,ovo je jedinica koja nadzire i upravlja svim procesima u mikrokontroleru i korisnik ne može uticati na njen rad. Sadrži se od nekoliko manjih jedinica od kojih su najvažniji:

a. Instruction decoder je elektronski dio koji prepoznaje naredbe i u zavisnosti od naredbe pokreće druge el. krugove. Mogućnosti ovih el. krugova su izraženi u „instrukcijskom setu“ koji se drugačiji za svaki mikrokontroler.

b. ALU(Arithmetical Logical Unit) vrši sve matematičku i logičku obradu podataka.

c. Accumulator je registar specijalne namjene usko povezan sa radom aritmetičko-logičke jedinice. Koristi se za spremanje podataka nad kojim će se izvršiti neke operacije (sabiranje, rotacija itd..). Također se koristi za spremanje rezultata ovih operacija koji će se koristiti za buduće operacije. Jedan od registara specijalne namjene,zvani Status Registar, je usko povezan sa skupljačem i pokazuje u bilo kojem trenutku „status“ broja koji je u skupljaču (broj je pozitivan ili negativan itd...).

I/O Ports(Input/Output(Ulazni/Izlazni portovi)) Da bi mikrokontroler bio koristan, potrebno ga je povezati na periferne uređaje. Svaki mikrokontroler ima jedan ili više registara (zvanih portovi) koji su povezani na pinove mikrokontrolera.Zašto ih zovemo ulazno/izlazni portovi? Zovemo ih tako zato što je moguće promijeniti funkciju pina prema našim potrebama. Ovi registri su jedini registri čije se stanje može provjeriti voltmetrom.

3

Page 4: Skripta for programming in c of pic mic

Oscillator Impulsi generisani oscilatorom dozvoljavaju harmonijske i sinhrone operacije svih el. krugova u mikrokontroleru. Važno je reći da se programske naredbe ne izvršavaju tempom nametnutim oscilatorom, već nekoliko puta sporije. To je zbog toga što se svaka naredba izvršava u nekoliko koraka. Kod nekih mikrokontrolera je potreban isti broj ciklusa za izvršavanje bilo koje naredbe,a kod nekih mikrokontrolera broj ciklusa potreban za izvršenje naredbe zavisi od kompleksnosti same naredbe. Ako je frekvencija kristala 20MHz,vrijeme izvršenja jedne naredbe nije

T=1f= 1

20Mhz=50nS , već nekoliko puta veće jer mikrokontroler dijeli frekvenciju

sa 2n, n- cijeli pozitivan broj.

Slika

Timers/CountersVećina programa koristi ove minijaturne „štoperice“ u svojim operacijama. Ovo su obično 8-bitni ili 16-bitni registri čiji se sadržaj povećava svakim nadolazećim impulsom. Kada je registar potpuno popunjen , interrupt je generisan.

Ako ovi registri koriste interni kristalni oscilator kao izvor impulsa onda je moguće izmjeriti vrijeme između dva događaja. Ako je vrijednost registra T 1 u trenutku kada mjerenje počinje i T 2 u trenutku kada je mjerenje završeno,onda je vrijeme između ta dva trenutka T m=T 2−T 1.Ako registri koriste impulse koji dolaze iz vanjskog izvora onda je to brojač. Ovo je samo jednostavno objašnjenje rada. Malo je komplikovanije u praksi.

4

Page 5: Skripta for programming in c of pic mic

slika

Watchdog timer je timer koji je povezan sa potpuno odvojenim RC oscilatorom u mikrokontroleru. Ako je watchdog timer uključen, svaki put kada timer dodje do maximalne vrijednosti mikrokontroler se resetuje i program se počinje izvršavati od prve instrukcije. Cijela ideja zasnovana je na tome da ponekad mikrokontroler iz raznih razloga uđe u beskonačnu petlju i „zaglavi“ se u njoj. Mikrokontroler postaje beskoristan. Ako je watchdog timer podešen kako treba, on će resetovati mikrokontroler kada se on „zaglavi“.

Power Supply Circuit

Postoje dvije stvari koje su vrijedne pažnje,a vezane su za napajanje mikrokontrolera.a. Brown out je potencijalno opasno stanje koje se desi u trenutku kada se

mikrokontroler gasi ili kada napon napajanja padne na najmanji nivo zbog električnih šumova. Kako se mikrokontroler sastoji od nekoliko el. krugova koji imaju različit radni napon,ovo može izazvati nestabilan rad mikrokontrolera. Da bi se ovo spriječilo, mikrokontroler ima ugrađen brown out reset krug. Ovaj krug će resetovati mikrokontroler kada napon padne ispod donje granice.

b. Reset pin(Master Clear Reset (MCLR)) služi za vanjsko resetovanje mikrokontrolera tako što se na njega dovede logička 0 ili 1,zavisi od mikrokontrolera.

slika Serial Comunication

Paralelne veze između mikrokontrolera i perifernih uređaja ostvarenih preko I/O portova su idealna rješenja za kraće razdaljine(do nekoliko metara).Međutim, u drugim slučajevima, kada je potrebno ostvariti komunikaciju između dva uređaja na većim daljinama očigledno je da nije moguće koristiti paralelne veze. Onda je serijska komunikacija najbolja.

5

Page 6: Skripta for programming in c of pic mic

Danas, većina mikrokontrolera imaju nekoliko različitih ugrađenih sistema za serijsku komunikaciju kao standardnu opremu. Koji od tih sistema će biti iskorišten zavisi od mnogo faktora od kojih su najvažniji:

a. Sa koliko uređaja mikrokontroler razmjenjuje podatke?b. Kolika je brzina razmjene podataka?c. Koja je udaljenost između uređaja?d. Je li neophodno da se slanje i primanje podataka odvija istovremeno?

Jedna od najvažnijih stvari kada govorimo o serijskoj komunikaciji jeste protokol kojeg bi se striktno trebalo pridržavati. To je skup pravila koja moraju biti primjenjena kako bi uređaji mogli pravilno tumačiti podatke koje razmjenjuju. Na sreću, mikrokontroleri automatski vode računa o ovome tako da je posao programeru olakšan.

slika

ProgramZa razliku od drugih integrisanih kola koje je potrebno samo uključiti na napajanje,mikrokontroler se mora prvo isprogramirati. Većina inžinjera bježi od upotrebe mikrokontrolera jer se oni moraju isporgramirati.To je zamka koja uzrokuje velike gubitke jer je proces programiranja mikrokontrolera u osnovi jako jednostavan.

Da bi se napisao program za mikrokontroler možemo koristiti nekoliko jednostavnih programskih jezika kao što su Assembler,C i Basic. Proces programiranja se svodi na jednostavno pisanje naredbi koje se trebaju izvršiti. U ovoj skripti ćemo naučiti kako programirati mikrokontrolere u programskom jeziku C. Kompajler koji ćemo koristiti je MPLAB XC8.

6

Page 7: Skripta for programming in c of pic mic

Pojmovi: Bit je najmanja jedinica informacije u računarstvu i digitalnim

komunikacijama. Stanje bita može biti 0 ili 1. 0 možemo posmatrati kao 0v(nema napona),a 1 kao 5v,12v,15v(ima napona).

Bajt je informacija koja u sebi sadrži 8 bitova. Npr: 10101010,01010101,11110000,itd...

Registar je memorijska lokacija koja u sebi sadrži nekoliko bitova informacije. Registri mogu biti 8-bitni,16-bitni,32-bitni,64-bitni,itd...

Interrupt je signal procesoru emitovan od strane softvera ili hardvera i ukazuje na prekid izvršavanja trenutnog koda(programa) i nalaže izvršavanje potprograma.

Kompajler je program koji će vaš kod(program) pretvoriti u kod razumljiv mikrokontroleru,tj. mašinski kod(binarni kod,“jedinice i nule“)

7

Page 8: Skripta for programming in c of pic mic

REGISTRI

Registar je RAM memorijska lokacija unutar mikrokontrolera u koju se može upisivati, sa koje se može čitati, ili obavljati obje ove funkcije. Najlakše je da svaki od njih zamislimo kao kutiju u koju može stati do 255 klikera(različitih stanja).

Sljedeća slika prikazuje raspored registara unutar PIC16f84 mikrokontrolera koji ćemo obrađivati u ovoj skripti. Ovi registri su osmobitni.

Adresa BANK0 BANK1 Adresa0x00 INDF INDF 0x800x01 TMR0 OPTION_REG 0x810x02 PCL PCL 0x820x03 STATUS STATUS 0x830x04 FSR FSR 0x840x05 PORTA TRISA 0x850x06 PORTB TRISB 0x860x07 / / 0x870x08 EEDATA EECON1 0x880x09 EEADR EECON2 0x890x0A PCLATH PCLATH 0x8A0x0B INTCON INTCON 0x8B0x0C

∙∙∙∙∙

0x4F

68 registara opšte namjene (statička RAM

memorija)

Mapirani u BANK0

0x8C∙∙∙∙∙

0xCF

0x50∙∙∙

0x7F

/ /

0xD0∙∙∙

0xFF

/ - Neimplementovana memorijska lokacija (čita se kao 0)

8

Page 9: Skripta for programming in c of pic mic

Registri su podijeljeni u dvije grupe označene sa BANK0 i BANK1. BANK1 se uglavnom koristi za konfigurisanje mikrokontrolera. Program se uglavnom nalazi u BANK0 gdje se nalaze i najbitniji registri (PORTA i PORTB). Prvih 12 registara u bankama (0x00-0x0B) su specifični jer se njima direktno upravlja radom mikrokontrolera što ih čini povlaštenim (eng. Special Function Registers – registri specijalne namjene), dok je obična RAM memorija (eng. General Purpose Registers – registri opšte namjene) dostupna u registrima od 0x0C do 0xCF adresa.

Mijenjanjem sadržaja registara TRISA i TRISB direktno utječemo na I/O portove mikrokontrolera (PORTA i PORTB). TRIS registri određuju da li će pin nekog porta biti ulazni ili izlazni. Na primjer, ako je sadržaj TRISB registra TRISB=0b00000000, to znači da će svi pinovi na portu B (PORTB) biti izlazni (0 je slična slovu „o“ koje je početno slovo engleske riječi output što znači izlaz). Svi pinovi mikrokontrolera imaju dvojaku funkciju,mogu biti ulazni ili izlazni. Da li će biti ulazni ili izlazni zavisi od stanja odgovarajućeg TRIS registra (TRISA za PORTA i TRISB za PORTB).

slika

9

Page 10: Skripta for programming in c of pic mic

Nakon što smo odredili kakav će pin biti (ulazni ili izlazni) treba da odredimo njegovo stanje. Registri pomoću kojih upravljamo stanjima na pinovima mikrokontrolera jesu PORT registri (PORTA i PORTB). Ukoliko je sadržaj PORTB registra PORTB=0b11111111 to znači da će na svakom pinu porta B(PORTB) biti logička 1. Mijenjanje stanja na pinu ili cijelom portu mikrokontrolera (softverom) moguće je izvršiti samo ako je pin ili port konfigurisan kao izlazni. Ukoliko je pin konfigurisan kao ulazni,na njemu nije moguće postaviti stanje logičke jedinice.

PORTBpin RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

broj bita 7 6 5 4 3 2 1 0TRISB=0b 0 0 1 1 1 0 1 0Ulaz/Izlaz I I U U U I U I

Ako u TRISB registar stavimo vrijednost 00111010 (TRISB=0b00111010) onda možemo mijenjati stanje samo na izlaznim pinovima tj. na pinovima: RB0,RB1,RB5 i RB7. To znači da ako u PORTB stavimo vrijednost 11111111 (PORTB=0b11111111) logička jedinica će biti samo na izlaznim pinovima (RB0,RB1,RB5 i RB7). Stanje na ulaznim pinovima zavisi od vanjskih el. kola koji su spojeni na pinove mikrokontrolera. Ako pinovi mikrokontrolera koji su konfigurisani kao ulazni nisu spojeni ni na kakve vanjske el. sklopove, onda će stanje na njima biti logička nula(0v).

PORTBpin RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

broj bita 7 6 5 4 3 2 1 0TRISB=0b 0 0 1 1 1 0 1 0PORTB=0b 1 1 1 1 1 1 1 1

stanje na pinu 1 1 0 0 0 1 0 1

Ako želimo da konfigurišemo pinove porta B (PORTB) da budu ulazni ili izlazni,koristit ćemo naredbu:

TRISB=0bXXXXXXXX;

-XXXXXXXX jesu bitovi koje biramo u zavisnosti od funkcije pina,tj. kakav će pin biti,ulazni ili izlazni. Bitovi se „broje“ s desna na lijevo počevši od nule,tj. 0,1,2,3,4,5,6,7. Za konfiguraciju pina RB0 koristit ćemo bit 0 TRISB registra, za pin RB1 koristit ćemo bit 1 TRISB registra itd...

Vrijednosti koje stavljamo u registar ne moraju biti u binarnom brojnom sistemu (oznaka 0b),one mogu biti u hexadecimalnom (oznaka 0x),decimalnom(bez oznake) i dr.

pin RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0broj bita 7 6 5 4 3 2 1 0

10

Page 11: Skripta for programming in c of pic mic

Za početak ćemo konfigurisati mikrokontroler tako da pinovi RB0,RB5 i RB7 budu ulazni a pinovi RB1,RB2,RB3,RB4 i RB6 budu izlazni.

TRISB=0b10100001;

Ako želimo konfigurisati samo jedan pin porta B (PORTB) ne mijenjajući stanje ostalih pinova koristit ćemo naredbu:

TRISBbits.TRISBx=0 ili 1;

Primjer 1: Konfigurisati mikrokontroler tako da pin RB5 bude izlazni ne mijenjajući konfiguraciju ostalih pinova.

Ako želimo da pin RB5 bude izlazni, koristit ćemo naredbu:

TRISBbits.TRISB5=0;

Primjer 2: Konfigurisati mikrokontroler tako da pin RA3 bude ulazni ne mijenjajući konfiguraciju ostalih pinova.

Ako želimo da pin RA3 bude ulazni,koristit ćemo naredbu:

TRISAbits.TRISA3 =1;

Primjer 3: Konfigurisati mikrokontroler tako da svi pinovi porta B(PORTB) budu ulazni.

Ako želimo da svi pinovi porta B (PORTB) budu izlazni,koristit ćemo naredbu:

TRISB=0b11111111;

ili

TRISB=0xFF;

Primjer 4: Konfigurisati mikrokontroler tako da svi pinovi porta B(PORTB) budu izlazni.

Ako želimo da svi pinovi porta B budu izlazni,koristit ćemo naredbu:

TRISB=0b00000000;

ili

TRISB=0x00;

11

Page 12: Skripta for programming in c of pic mic

IZLAZI

U prethodnom poglavlju smo naučili kako ćemo konfigurisati pinove mikrokontrolera. U ovom poglavlju ćemo naučiti kako ćemo promijeniti stanje na izlazom pinu mikrokontrolera i upoznat ćemo se sa strukturom porta A(PORTA) i porta B(PORTB).

PORTB ima 8 pinova,a to su : RB0,RB1,RB2,RB3,RB4,RB5,RB6 i RB7.

PORTA ima 5 pinova,a to su: RA0,RA1,RA2,RA3,RA4.

Kako su portovi A i B osmobitni trebali bi da imaju po 8 pinova. PORTA ima samo 5 pinova tako da 3 bita registra PORTA i TRISA (bitovi 7,6 i 5) ne utječu na rad mikrokontrolera.

Ako želimo promijeniti stanje na pinu porta B (PORTB) koristit ćemo naredbu:

PORTB=0bxxxxxxxx;

-xxxxxxxx svaki bit određuje logičko stanje na pojedinom pinu. Svaki bit odgovara jednom pinu mikrokontrolera. Sjećate li se ove tabele?

pin RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0broj bita 7 6 5 4 3 2 1 0

Ako želimo da mijenjamo stanje svih pinova na portu B(PORTB) onda ćemo ih prvo konfigurisati tako da su svi izlazni,a zatim možemo staviti bilo koje logičko stanje na pin kada to poželimo.

TRISB=0b00000000;

Kada smo konfigurisali sve pinove porta B (PORTB) kao izlazne,sada možemo mijenjati stanje na svakom pinu tog porta. Naredba kojom mijenjamo stanje na pinovima je:

PORTB=0b10101010;

PORTBpin RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

broj bita 7 6 5 4 3 2 1 0TRISB=0b 0 0 0 0 0 0 0 0PORTB=0b 1 0 1 0 1 0 1 0

stanje na pinu 1 0 1 0 1 0 1 0

Ako želimo promijeniti stanje na nekom pinu bez mijenjanja stanja na drugim pinovima,to možemo uraditi naredbom:

PORTBbits.RB5=0;

ili

PORTBbits.RB3=1;

Ovim naredbama smo stavili logičku 0(0v) na pin RB5 i logičku 1(5v) na RB3.

12

Page 13: Skripta for programming in c of pic mic

Programski jezik C(kompajler XC8)

Jedan jednostavan ali potpun program.

#include <xc.h>

void main(void)

TRISB=0b00000000; //svi pinovi porta B su izlazni

PORTB=0b11111111; //na svim pinovima porta B je logička 1

Tekst iza // ,uključujući i // , je komentar i nije dio programa,tj. kompajler ga neće uzimati u obzir prilikom pretvaranja programa u mehanički kod.

Primijetili ste par nepoznatih instrukcija, #include <xc.h> i void main(void).

#include <xc.h> je naredba kojom se od kompajlera(prevodioca) zahtjeva da uključi(include) u program datoteku xc.h koja sadrži informacije nužne za korištenje naredbi TRISB=, PORTB=, i dr.

void main(void) je funkcija,glavna funkcija u programu(main- glavna) koju sadrži svaki program i može imati jedan ili više argumenata i obično vraća neku vrijednost. Deklaracijom se uvodi ime funkcije,broj i tip argumenta koje uzima i tip povratne vrijednosti. U našem primjeru ime funkcije je main i ona ne uzima niti jedan argument. To je deklarisano tako što je u oble zagrade stavljena ključna riječ void(void –prazan). Povratna vrijednost je tipa void,što znači da funkcija ne vraća nikakvu vrijednost. Iza oblih zagrada dolaze vitičaste zagrade koje omeđuju tijelo funkcije. Tijelo funkcije je sastavljeno od izvršnih naredbi i/ili deklaracija varijabli. U našem primjeru nemamo deklaracija varijabli. U većini programa nije važno koju će vrijednost funkcija vratiti jer nećemo praviti takve programe u ovoj skripti.

U ovom primjeru smo konfigurisali sve pinove na portu B kao izlazne i postavili na njih stanje logičke 1.

Primjer koji smo napisali će biti korišten u svim našim programima,samo što će tijelo funkcije biti promijenjeno jer je to mjesto gdje ćemo pisati naše programe. U narednim poglavljima ćemo se upoznati sa jos nekoliko naredbi.

Važno je naglasiti da poslije svake naredbe dolazi znak ( ; ) i on označava kraj naredbe.

Prilikom izvršavanja programa,mikrokontroler će izvršavati naredbu po naredbu. U našem slučaju,prvo će izvršiti naredbu TRISB=0b00000000; a zatim PORTB=0b11111111;.

13

Page 14: Skripta for programming in c of pic mic

Kada izvrši naredbu PORTB=0b11111111; mikrokontroler je došao do kraja programa. U ovom slučaju, mikrokontroler će ponovo izvršiti program samo kada se resetuje tj. kada se isključi sa napajanja i ponovo uključi.

Naš prvi program

Pokušajmo napraviti program kojim ćemo upaliti LED diodu na sljedećoj šemi.

NAPOMENA: NEMOJTE POKUŠAVATI PROGRAMIRATI VAŠ MIKROKONTROLER ILI GA STAVLJATI NA NAPAJANJE TOKOM IZUČAVANJA SLJEDEĆIH PRIMJERA!

Kako bi LED 1 svijetlila potrebno je da stanje na pinu RB4 bude logička 1 tj. 5v. Prvo ćemo konfigurisati mikrokontroler tako da pin RB4 bude izlazni, a potom ćemo na njega „poslati“ log. 1.

#include <xc.h>

void main(void)

TRISBbits.TRISB4=0; //RB4 je postavljen kao izlazni pin (0-Output- izlaz).

PORTBbits.RB4=1; // na RB4 smo poslali log. 1.

Ukoliko želimo da istu LED ugasimo,na RB4 ćemo poslati log. 0.

#include <xc.h>

void main(void)

TRISBbits.TRISB4=0; //RB4 je postavljen kao izlazni (0-Output- izlaz).

PORTBbits.RB4=0; // na RB4 smo poslali log. 0.

14

Page 15: Skripta for programming in c of pic mic

Sada ćete reći: „Nema potrebe da je gasimo kada će biti ugašena iako ne koristimo naredbu PORTBbits.RB4=0!“. Ukoliko mi ne izvršimo promjenu sadržaja nekog registra u našem programu (npr. PORTB,TRISB,PORTA,itd...) on će imati vrijednost FF (11111111).To znači da će registri i TRISB i PORTB po defaultu imati vrijednosti:

TRISB=0b11111111;

PORTB=0b11111111;

Ako posmatramo sadržaj registara PORTB i TRISB vidimo da su svi pinovi porta b konfigurisani kao ulazni i na njih poslana logička 1. Kako smo već ranije rekli,ukoliko je pin konfigurisan kao ulazni,nije važno koji je sadržaj registra PORTB jer on ne utječe na stanje na pinovima koji su konfigurisani kao ulazni. Ako napišemo ovakav program,

#include <xc.h>

void main(void)

TRISBbits.TRISB4=0; //RB4 je postavljen kao izlazni (0-Output- izlaz).

naš mikrokontroler će na pinu RB4 imati stanje log. 1 jer je postavljen kao izlazni i zato što je sadržaj PORTB registra po defaultu 11111111.

Pokušajmo napraviti program kojim ćemo napraviti da LED treperi,tj. da se LED pali i gasi. Šema:

#include <xc.h>

void main(void)

TRISBbits.TRISB4=0; //RB4 je postavljen kao izlazni (0-Output- izlaz).

PORTBbits.RB4=0; //ugasimo LED

15

Page 16: Skripta for programming in c of pic mic

PORTBbits.RB4=1; // upalimo LED

Ako ovaj program ubacimo u naš mikrokontroler, i spojimo ga prema šemi onda ćemo primjetiti da će LED konstantno svijetliti,tj. da se neće paliti i gasiti. Šta smo pogriješili? -Ništa.

LED će se prvo ugasiti pa upaliti kako smo i napisali u programu. Međutim, naš program će se izvršiti samo jednom. Sada je potrebno da „naredimo“ mikrokontroleru da stalno izvršava naš program tj. da kada izvrši program i dođe do kraja programa da „skoči“ na početak i da nastavi izvršavati program. To ćemo postići koristeći oznaku i naredbu goto. Primjer:

POCETAK: //oznaka za početak

//naš program koji treba da se stalno izvršava.

goto POCETAK; //naredba mikrokontroleru da se vrati na početak programa.

Hajdemo dopuniti naš program.

#include <xc.h>

void main(void)

POCETAK:

TRISBbits.TRISB4=0; //RB4 je postavljen kao izlazni (0-Output- izlaz).

PORTBbits.RB4=0; //ugasimo LED

PORTBbits.RB4=1; // upalimo LED

goto POCETAK;

Ako ubacimo ovaj program u naš mikrokontroler i uključimo ga na napajanje,primjetiti ćemo da LED ne treperi već stalno svijetli ali malom jačinom svjetlosti. To je zato što je vrijeme između dva stanja jako malo pa ljudsko oko to ne primjeti. Potrebno je dodati pauzu između naredbi za paljenje i gašenje LED tako da možemo vidjeti da se LED pali i gasi.

Da bismo koristili pauzu u našem programu potrebno je definisati frekvenciju oscilatora kojeg koristimo. Ako koristimo kristalni oscilator frekvencije 4 MHz za definisanje nj. frekvencije koristit ćemo naredbu:

#define _XTAL_FREQ 4000000

Naredba za korištenje pauze u programu je:

__delay_ms(x); x- broj milisekundi

dvije donje crtice

16

Page 17: Skripta for programming in c of pic mic

Naš program za paljenje i gašenje LED na pinu RB4 izgleda ovako:

#include <xc.h>

#define _XTAL_FREQ 4000000

void main(void)

TRISBbits.TRISB4=0; //RB4 je postavljen kao izlazni (0-Output- izlaz).

POCETAK:

PORTBbits.RB4=0; //ugasimo LED

__delay_ms(1000); //sačekaj 1 sekundu (1000ms=1s) da vidimo da je LED ugašena

PORTBbits.RB4=1; // upalimo LED

__delay_ms(1000); //sačekaj 1 sekundu (1000ms=1s) da vidimo da je LED upaljena

goto POCETAK;

NAPOMENA: Ovaj program je potpun i neće naštetiti vašem mikrokontroleru ukoliko koristite sljedeću šemu spoja.

17

Page 18: Skripta for programming in c of pic mic

ULAZI

Do sada smo samo pisali po portu B da bi se uključivala i isključivala LED. U ovom poglavlju naučit ćete upotrebu ulaznih pinova. Na taj način moguće je na pinove mikrokontrolera povezati spoljno elektronsko kolo, i programirati mikrokontroler da različito reaguje u zavisnosti od spoljnih signala. Da bi se konfigurisao odgovarajući pin na portu B ili portu A kao izlazni,treba poslati 0 na njemu odgovarajuće mjesto u TRISB ili TRISA registru. Da bi se konfigurisao kao ulazni,treba poslati 1.

TRISBbits.TRISB3=1; //pin RB3 konfigurisan kao ulazni

Sada kada je pin konfigurisan kao ulazni,stanje na njemu zavisi samo od spoljnih elektronskih kola. Ukoliko želimo provjeriti stanje na pinu RB3 tj. da li je na njemu logička 1 ili logička 0 koristit ćemo naredbu:

if (PORTBbits.RB3==1)

// prostor za naš program ukoliko je uslov zadovoljen (uslov je da na RB3 pinu bude log. 1)

ili

if (PORTBbits.RB3==0)

// prostor za naš program ukoliko je uslov zadovoljen (uslov je da na RB3 pinu bude log. 0)

Ukoliko navedeni uslovi nisu zadovoljeni,mikrokontroler preskače ovu naredbu i izvršava sljedeću.

Sada ćemo napisati program kojim će LED treperiti jednom brzinom,a kada se pritisne prekidač onda će treperiti duplo sporije. Šema spoja:

18

Page 19: Skripta for programming in c of pic mic

#include <xc.h>

#define _XTAL_FREQ 4000000

void main(void)

TRISAbits.TRISA0=1; //pin RA0 konfigurisan kao ulazni (1-Input- ulaz).

TRISAbits.TRISA2=0; //pin RA2 konfigurisan kao izlazni.

POCETAK: //oznaka za početak programa

if (PORTAbits.RA0==0) // ako je na pinu RA0 logička 0 onda će se izvršiti program:

PORTAbits.RA2=0; // na pin RA2 pošalji log. 0

__delay_ms(200); //ne radi ništa 200ms

PORTAbits.RA2=1; //na pin RA2 pošalji log. 1

__delay_ms(200); // ne radi ništa 200ms

if (PORTAbits.RA0==1) // ako je na pinu RA0 logička 0 onda će se izvršiti program:

PORTAbits.RA2=0; // na pin RA2 pošalji log. 0

__delay_ms(100); //ne radi ništa 100ms

PORTAbits.RA2=1; //na pin RA2 pošalji log. 1

__delay_ms(100); // ne radi ništa 100ms

goto POCETAK; //idi na početak

Napomena: Ovaj program je potpun i neće naštetiti vašem mikrokontroleru ukoliko koristite datu šemu spoja.

Objašnjenje šeme:

Pinovi VDD i MCLR su povezani na +5v. Na pin VDD se dovodi napajanje a na pinu MCLR mora biti log. 1 tj. +5v kako se mikrokontroler ne bi stalno resetirao. Na pin VSS se dovodi – pol izvora ili ground. OSC1 i OSC2 su pinovi na koje spajamo naš oscilator. Otpornik 10kΩ koji povezuje pin RA0 na masu se zove pull down otpornik. Uloga ovog otpornika je da na pinu RA0 drži stanje log. 0(jer je povezan na masu) ako na pin ne djeluje drugi naponski nivo. Zašto nam je ovo potrebno? Ako na pin ništa nije priključeno to ne znači da je na njemu logička 0. U slučaju djelovanja vanjskih smetnji ili elektromagnetskih talasa može se desiti da napon na pinu poraste što može prouzrokovati nepravilno očitanje i pogrešan rad mikrokontrolera. Šta će se desiti kada na pin počne djelovati +5v? Napon +5v je stabilan i osigurat će konstantnu struju upliva u mikrokontroler pa ćemo na pinu imati log 1. Otpornik 330Ω je tu kako bi ograničio struju kroz LED. Maximalna struja koju smijemo „vući“ iz izlaznog pina je 25mA.

19

Page 20: Skripta for programming in c of pic mic

VARIJABLE

Varijable su jednostavna imena koja se odnose na neku memorijsku lokaciju- lokaciju koja sadrži vrijednost sa kojom radimo. Možete zamisliti varijablu kao ekvivalent vrijednosti u memorijskoj lokaciji. Svaka varijabla je povezana sa nekom memorijskom lokacijom tj. registrom unutar mikrokontrolera. Naš kompajler automatski dodjeljuje registar svakoj varijabli koju deklarišemo. Koja je prednost varijable? Prednost varijable je u tome što ne moramo koristiti adresu registra u kojem se traženi podatak ili vrijednost nalazi,umjesto toga,mi ćemo koristiti varijablu. Deklaracija varijable je jednostavan postupak. Prvo je potrebno znati šta želimo da varijabla sadrži. Da li je to cijeli broj,decimalni broj ili neki tekst. Prema tome,imamo različite tipove varijabli. Tipovi varijabli su:

int-integer(eng. integer- cijeli broj)

char- character(eng. character- znak)

float- deklaracija korištena za decimalne brojeve

i dr.

Mi ćemo u našim programima samo koristiti varijable tipa integer(cijeli broj). Ukoliko želimo da brojimo, npr. koliko je puta taster pritisnut,koristit ćemo varijablu tipa integer. Deklaracija se vrši na ovaj način:

int ImeVarijableBezRazmaka;

Tokom daljnjeg objašnjenja varijabli,našoj varijabli dat ćemo ime „X“.

int X;

Ukoliko želimo da dodijelimo neku vrijednost varijabli, to ćemo uraditi ovako:

X=5;

Kada želimo da povećamo vrijednost varijable,to ćemo uraditi ovako:

X=X+1; //povećaj vrijednost X za 1

ili

X++; //povećaj vrijednost X za 1;

Programski jezik C dozvoljava osnovne matematičke operacije nad varijablama. Varijable možemo sabirati,oduzimati,množiti i dijeliti. Primjer

int suma;

int razlika;

int proizvod;

int količnik;

int a;

int b;

suma=a + b; proizvod=a * b;

razlika=a - b; količnik=a / b;

20

Page 21: Skripta for programming in c of pic mic

Prilikom deklarisanja varijabli koristili smo previše naredbi. Ako su varijable istog tipa (u našem primjeru sve su integer) onda ih možemo deklarisati na sljedeći način:

int suma,razlika,proizvod,količnik,a,b;

Kako su naše varijable tipa integer tj. deklarisane su kao cjelobrojne bez obzira na rezultat matematske operacije. Kada govorimo o sabiranju,oduzimanju i množenju cijelih brojeva (ukoliko se operacije vrše nad cijelim brojevima) rezultat će uvijek biti cijeli broj. Međutim, prilikom dijeljenja može se desiti da rezultat matematske operacije nije cijeli broj. Ukoliko vršimo dijeljenje broja 5 brojem 2 dobit ćemo rezultat 2.5 što nije cijeli broj. Vrijednost koju će poprimiti varijabla „količnik“ je 2 jer će mikrokontroler zaokružiti dobivenu vrijednost na prvi cijeli broj. Primjer:

ime varijable vrijednost varijablia 5 6 14 25 3 10b 2 4 5 6 7 3

količnik 2 1 2 4 0 3

Slike za bolje pojašnjenje varijabli.

21

Page 22: Skripta for programming in c of pic mic

INTERAPTI(interrupts)

Interrupt je proces ili signal koji prekida izvršavanje glavnog mikrokontrolerskog programa i prebacuje njegovo izvršavanje na potprogram koji je zadužen za obradu interrupta. Po povratku iz potprograma, glavni program nastavlja sa radom kao da se ništa nije dogodilo. Primjer interrupta u stvarnom životu: Pretpostavimo da sjedite u kući i čitate ovu skriptu. Odjednom vam mobitel signalizira dolazak SMS poruke. Prekidate čitanje ove skripte,pročitate poruku (eventualno odgovorite), i nastavite sa čitanjem skripte sa mjesta na kom ste stali. Možemo zamisliti čitanje kao glavni program,zvonjavu mobitela kao izvor interrupta,a proces čitanja poruke (i eventualnog odgovora na nju) kao potprogram za obradu interrupta. Mikrokontroleri imaju nekoliko izvora interrupta. PIC16F84 ima 4 izvora interrupta. Dva eksterna i dva interna.Za sada ćemo naučiti primjenu eksternih izvora,a interni će biti objašnjeni kasnije. Ukoliko pogledate oznake PIC16F84 vidjet ćete da je na pinu 6 oznaka RB0/INT. Očigledno je da je pin RB0 ulazno izlazni pin PORTB registra. INT označava da se on može konfigurisati kao eksterni izvor interrupta (INT- interrupt). Kada je pin RB0/INT konfigurisan kao izvor eksternog interrupta on se ponaša kao Šmitov okidač što otežava pojavu lažnih signala okidanja. Drugi eksterni izvor interrupta jesu pinovi RB4 do RB7. Svaka promjena stanja na pinovima RB4,RB5,RB6 i RB7 će se smatrati kao da se desio interrupt. Što se tiče pina RB0/INT, interrupt će se desiti samo kada se desi promjena sa log 1 na log 0 ili log 0 na log 1 zavisi od konfiguracije. O tome ćemo malo kasnije. Sada ćemo proučiti strukturu SFR registra pod nazivom INTCON.

bit 7 bit 0GIE EEIE T0IE INTE RBIE T0IF INTF RBIF

GIE (Global Interrupt Enable) bit INTCON registra je kao glavni prekidač za sve interrupte. Ako je on setovan onda su interapti uključeni. Ako je on 0 onda su interapti isključeni.

1= interapti uključeni0= interapti isključeni

EEIE ( EE Write Complete Interrupt Enable) bit dozvoljava da se interrupt desi kada se završi pisanje u EEPROM memoriju. Ovaj interrupt će nam trebati jer je proces pisanja u EEPROM memoriju dugotrajan. Ova sposobnost omogućava mikrokontroleru da radi druge stvari dok se upis u EEPROM memoriju ne završi.

1= EE Write Complete Interrupt uključen

0= EE Write Complete Interrupt isključen

T0IE (TMR0 Overflow Interrupt Enable) bit dozvoljava interrupt kada tajmer TMR0 izbroji do 255(28=255 , 1111111111(2)=255(10)) i krene ponovno brojanje od 0.

1= TMR0 interrupt uključen0= TMR0 interrupt isključen

INTE (RB0/INT External Interrupt Enable) bit dozvoljava interrupt prilikom djelovanja signala na pin RB0. Interrupt će se desiti prilikom rastuće ili opadajuće ivice signala na pinu. Da li će se interrupt desiti prilikom rastuće ili opadajuće ivice signala zavisi od stanja INTEDG bita u OPTION_REG registru (o ovome malo kasnije).

1= RB0/INT External Interrupt uključen0= RB0/INT External Interrupt isključen

22

Page 23: Skripta for programming in c of pic mic

RBIE (The Port Change Interrupt) bit dozvoljava interrupt prilikom promjene stanja na pinovima RB7, RB6, RB5 i RB4.

1= RB port change interrupt uključen0= RB port change interrupt isključen.

T0IF (The TMR0 Overflow Interrupt Flag) bit koristi mikrokontroler kako bi otkrio da li se interrupt desio zato što je TMR0 prekoračio vrijednost 255. Potprogram će se izvršiti ukoliko se bilo koji od interrupta desi tako da se ovi bitovi koriste u programu kako bi povjerili o kojem izvoru interrupta se radi. Prilikom pisanja potprograma za obradu interrupta potrebno je na kraju očistiti ovaj bit kako se interrupt ne bi desio odmah nakon izvršavanja potprograma.

1=TMR0 je prekoračio vrijednost 255 (mora se očistiti u programu)0=TMR0 nije prekoračio vrijednost 255

INTF (The RB0/INT External Interrupt Flag) koristi mikrokontroler kako bi otkrio da li se interrupt desio zato što je došlo do promjene stanja na RB0/INT pinu. Ovaj bit se koristi i u programu kako bi se otkrio izvor interrupta. Prilikom pisanja potprograma za obradu interrupta potrebno je na kraju očistiti ovaj bit kako se interrupt ne bi desio odmah nakon izvršavanja potprograma.

1=RB0/INT interrupt se desio0=RB0/INT se nije desio

RBIF (The Port Change Interrupt Flag) bit koristi mikrokontroler kao bi otkrio da se interrupt desio zbog promjene stanja na pinovima RB7:RB4. Prilikom pisanja potprograma za obradu interrupta potrebno je na kraju očistiti ovaj bit kako se interrupt ne bi desio odmah nakon izvršavanja potprograma.

1=desila se promjena na nekom od pinova RB7:RB40=nije se desila promjena ni na jednom od pinova RB7:RB4

U ovoj skripti ćemo naučiti upotrebu jednog eksternog izvora interapta (RB0/INT) i jednog internog izvora interapta (TMR0 interrupt). Sada više o RB0/INT kao izvoru interrupta.

Kako bismo koristili pin RB0/INT kao izvor interrupta potrebno je prvo da uključimo interrupte tako što ćemo setovati GIE bit i INTE bit INTCON registra. Setovanjem GIE bita uključujemo interrupte generalno dok setovanjem INTE bita uključujemo RB0/INT pin kao izvor interrupta.

INTCON=0b10010000;

ili

INTCONbits.GIE=1;

INTCONbits.INTE=1;

Napomena: Prilikom setovanja ili čišćenja bitova SFR registara (PORTA, PORTB, TRISA, INTCON...) možemo koristiti sljedeće naredbe:

RB0=1;

RA3=0;

GIE=1;

INTE=1;

T0IE=1; itd...

Umjesto pisanja INTCONbits.GIE=1 , možemo napisati samo GIE=1;

23

Page 24: Skripta for programming in c of pic mic

Sada ćemo uključiti interrupte na RB0/INT.

TRISB0=1; //RB0 pin mora biti ulazni

GIE=1; //uključi interrupte

INTE=1; //uključi RB0/INT kao izvor interrupta

Ovim naredbama smo konfigurisali mikrokontroler da koristi pin RB0/INT kao izvor interrupta. Sada je potrebno napisati potprogram za obradu interrupta.

Mjesto za pisanje potprograma za obradu interrupta će biti u funkciji po imenu YourLowPriorityISRCode() bez argumenata (void).

void interrupt YourLowPriorityISRCode()//naš program za obradu interrupta

Naš program će sada izgledati:

#include <xc.h>

void interrupt YourLowPriorityISRCode()

if (INTF==1)

//naš program za obradu interrupta

INTF=0; //čišćenje flag bitova izvora interrupta koji koristimo.

void main(void)

KONFIGURACIJAMIKROKONTROLERA:

TRISB0=1;

GIE=1;

INTE=1;

POCETAKGLAVNOGPROGRAMA:

//naš glavni program

goto POCETAKGLAVNOGPROGRAMA;

24

Page 25: Skripta for programming in c of pic mic

Primjer: Napravimo program koristeći izvor interrupta na RB0/INT tako da mikrokontroler broji koliko je puta taster pritisnut i kada pritisnemo taster 4 puta da se upali LED.

Program:

#include <xc.h>

int tasterbroj;

void interrupt YourLowPriorityISRCode()

if (INTF==1)

tasterbroj++;

INTF=0; //čišćenje flag bitova izvora interrupta koji koristimo.

void main(void)

KONFIGURACIJA:

TRISB0=1;

GIE=1;

INTE=1;

TRISB7=0;

POCETAK:

if (tasterbroj>=4)

RB7=1;

else RB7=0;

goto POCETAK;

(šema spoja)

NAPOMENA: Ovaj program je potpun i neće naštetiti vašem mikrokontroleru ukoliko koristite datu šemu spoja.

25