24.07.2013 Views

pdf - Univerzitet u Nišu

pdf - Univerzitet u Nišu

pdf - Univerzitet u Nišu

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

UNIVERZITET U NIŠU<br />

ELEKTORNSKI FAKULTET<br />

KATEDRA ZA ELEKTRONIKU<br />

Programiranje i iščitavanje sadržaja<br />

serijskog EEPROM-a pomoću<br />

mikrokontrolera PIC16F877<br />

Studenti:<br />

Darko Prvulović 10610<br />

Ivan Trucić 9264<br />

Mentor:<br />

Mile K. Stojčev, prof. dr.<br />

1


Sadržaj<br />

Uvod.................................................................................3<br />

Serijska komunikacija – RS232.......................................4<br />

Serijski EEPROM...........................................................10<br />

Opšte karakteristike mikrokontrolera.............................15<br />

Funkcionalne jedinice mikrokontrolera..........................16<br />

RISK procesori i HARVARD arhitektura......................20<br />

Mikrokontroler PIC16F877............................................22<br />

Osnovne karakteristike mikrokontrolera........................25<br />

Arhitektura mikrokontrolera..........................................26<br />

Realizacija projektnog zadatka.......................................41<br />

Program u mikroC-u.......................................................46<br />

Program u asembleru......................................................47<br />

Heksadecimalni kod.......................................................58<br />

Sotver ICprog.................................................................59<br />

Softver microC...............................................................62<br />

UART terminal...............................................................63<br />

Laboratorijska vežba......................................................65<br />

Zaključak........................................................................73<br />

Literatura........................................................................74<br />

Kraće biografije autora...................................................75<br />

dodatak: Data sheet<br />

2


Uvod<br />

Osnovna ideja ovog projekta je praktična realizacija upisa i čitanja sadržaja<br />

serijskog EEPROM-a uz pomoć mikrokontrolera PIC16F877A.<br />

U drugom poglavlju ukratko je objašnjena serijska komunikacija na PC<br />

računarima, koja je u ovom slučaju realizovana uz pomoć kola MAX232 koje<br />

ima ulogu prilagođenja između serijskog porta računara i samog uređaja.<br />

Treće poglavlje opisuje serijski EEPROM 24C02 uz odgovarajuće slike<br />

samog kola i karakteristike.<br />

U četvrtom poglavlju opisane su opšte karakteristike mikrokontrolera, dok<br />

peto i šesto poglavlje opisuje funkcionalne jedinice mikrokontrolera, RISK<br />

procesore, kao i HARVARD arhitekturu. Poglavlja 7, 8, 9 i 10 vezana su<br />

konkretno za mikrokontroler koji je iskorišćen za ovaj projekat (PIC16F877).<br />

7. poglavlje opisuje pomenuti mikrokontroler, a prikazan je i njegov fizički<br />

izgled. U 8., 9., i 10. poglavlju, redom su opisane osnovne karakteristike<br />

mikrokontrolera, arhitektura mikrokontrolera, kao i oranizacija njegove<br />

memorije.<br />

Projektni zadatak, kao i programski kod u microC-u, program u asembleru<br />

i heksadecimalni kod, redom su opisani u poglavljima 11, 12, 13 i 14. Poglavlja<br />

15, 16, 17 opisuju način instalacije programa Icprog, microC i podešavanje<br />

parametara UART terminala.<br />

Laboratorijska vežba je detaljno opisana u osamnaestom poglavlju, da bi<br />

na kraju izveli zaključak i dali spisak literature korišćene prilikom izrade ovog<br />

projekta. Priložene su i kratke biografije autora projekta.<br />

Uz projekat su priloženi izvodi data sheet-ova serijskog EEPROMA 24C02<br />

i mikrokontrolera PIC16F877.<br />

3


Serijska komunikacija – RS232<br />

Komunikaciju mikrokontrolera sa računarom, odnosno zadavanje određenih<br />

naredbi, vršimo preko RS232 linije. U tekstu koji sledi objasnićemo serijsku<br />

komunikaciju između računara i mikrokontrolera AT89S8253.<br />

‘Telecommunication Industry Association, 1997-e godine izdala je TIA 232<br />

Version F serijsko komunikacijski protokol poznat kao RS 232 (Recommended<br />

Standard) protokol.<br />

RS232 standard je široko korišćen pri prenosu podataka brzinama u<br />

granicama od 115 do 330 kb/s, a maksimalna razdaljina za komunikaciju je oko<br />

30 metra.<br />

RS 232 predstavlja peer-to-peer komunikacijski standard, tako da je<br />

pogodan za aplikacije koje sadrže 2 čvora gde je na svakom od njih<br />

mikrokontroler ili računar, tako da možemo povezati jedan mikrokontroler za<br />

jedan PC.<br />

Pretpostavimo da brzina kojom šaljemo podatke sa računara 9600 baud-a<br />

odnosno 9600 bita u sekundi, što je i široko preporučljiva brzina za bezbedno<br />

slanje podataka. U tom slučaju će za slanje jednog bajta, plus jedan start i jedan<br />

stop bit, biti potrebno 1ms.<br />

Na Slici 1. prikazan je jedan od nacina realizacije serijske komunikacije<br />

MAX232 kolom.<br />

Slika 1. Realizacija serijskog prenosa MAX232 kolom<br />

4


Slika 2. Raspored pinova kod kola MAX232<br />

5


Slika 3. Fizičke dimenzije MAX232 kola<br />

Serijski port se drugačije naziva i komunikacijski (communication -<br />

COM) port i on je bidirekcioni. Bidirekciona komunikacija omogućuje uređaju<br />

i da prima i da šalje podatke. U zavisnosti od toga da li serijski uređaji koriste<br />

različite pinove za prijem i slanje ili samo jedan, moguće je razlikovati dva tipa<br />

komunikacije: full-duplex (informacije se mogu istovremeno prenositi u oba<br />

smera) i half-duplex (dok se informacije prenose u jednom smeru, prenos iz<br />

drugog smera je zabranjen).<br />

Serijski port se zasniva na UART kontrolerskom čipu, koji predstavlja<br />

ključnu komponentu serijske komunikacije. Ovaj čip, s jedne strane prihvata<br />

bajtove podataka od mikroprocesorskog sistema, transformiše ih u bitski niz i<br />

šalje bit-po-bit.<br />

Postoje dva glavna oblika serijskog prenosa: sinhroni i asinhoni. Sinhoni<br />

prenos podrazumeva da predajnik i prijemnik dele zajednički takt, ili da<br />

predajnik obezbedi poseban signal kojim će obaveštavati prijemnik kada<br />

dolazi sledeći podatak. Kod asinhronog prenosa ne postoji poseban signal već se<br />

sinhronizacija vrši pomoću posebnih bitova koji se umeću.<br />

Serijski port PC računara koristi se za serijski prenos podataka (bit po bit) i<br />

samim tim je sporiji od paralelnog porta. Uređaji koji koriste serijsku<br />

komunikaciju koriste dve vrste kablova i to: DCE (Data Communications<br />

6


Equipment) i DTE (Data Terminal Equipment). DCE koriste modemi, ploteri i<br />

sl. dok se DTE koristi za vezu između PC računara. Električne osobine serijskog<br />

porta su definisane EIA (Electronics Industry Association) RS232C<br />

standardom, čiji su parametri:<br />

Logička nula "SPACE" nalazi se u opsegu napona +3V do +25V<br />

Logička jedinica "MARK" je u opsegu -3V do - 25V<br />

Oblast između -3 do + 3 V nije definisana<br />

Napon na kolu ne sme da pređe 25V u odnosu na masu (GND)<br />

Struja kola ne sme preći 500 mA.<br />

Inače, serijski port koristi dve vrste konektora: DSUB-9 (9-pinski) i<br />

DSUB-25 (25-pinski). Oblik konektora i raspored pinova na njima kao i glavni<br />

signali na pojedinim pinovima dati su na Slikama 4. i 5. i Tabeli 1.<br />

Slika 4. Raspored pinova na konektoru DSUB-9<br />

7


Slika 5. Raspored pinova na konektoru DSUB-25<br />

DSUB-9 Signal Opis signala<br />

DSUB-25<br />

pin 2 pin 3 TD Transmit Data<br />

pin 3 pin 2 RD Receive Data<br />

pin 4 pin 7 RTS Request To Send<br />

pin 5 pin 8 CTS Clear To Send<br />

pin 6 pin 6 DSR Data Set Ready<br />

pin 7 pin 5 SG Signal Ground<br />

pin 8 pin 1 CD Carrier Detect<br />

pin 20 pin 4 DTR Data Terminal Ready<br />

pin 22 pin 9 RI Ring Indicator<br />

Tabela 1. Značenje pojedinih signala<br />

Oblik signala kod RS232 standarda dat je slici 6.<br />

Slika 6. Oblik signala kod RS232 standarda<br />

8


Situacija kada nema slanja podatka, tj. linija je slobodna, označena je<br />

MARK naponom. Prenos počinje kada linija pređe u SPACE stanje, što<br />

predstavlja START bit. Iza start bita dolaze bitovi podataka i to tako da je<br />

jedinica predstavljena negativnim naponom, a nula pozitivnim. Ovo je najčešće<br />

u suprotnosti sa ustaljenom logikom da je +5 V logička jedinica, a 0 V logička<br />

nula. Problem rešava prijemno kolo (npr. MAX232, ST232, ICL232,<br />

MAX3232, ST3232, ICL3232 itd.) konvertujući napo-ne tako da su prilagođeni<br />

naponima interfejsa koji se koristi. Posle bita podatka dolazi bit parnosti koji se<br />

koristi za detekciju jednostruke greške u prenosu. Iza bita parnosti signal se<br />

postavlja u MARK stanje što označava početak STOP bita. Prema RS232<br />

standardu broj stop bitova može biti: 1, 1.5 ili 2. Nakon završetka STOP bitova,<br />

linija je spremna za slanje novog karaktera. PC računari koriste kao DATA bite<br />

najčešće 7 ili 8 bita. Između slanja dva karaktera linija se nalazi u MARK<br />

stanju, a u toku prenosa više puta prelazi iz MARK u SPACE stanje u zavisnosti<br />

od broja jedinica i nula. To znači da se linija može nalaziti u SPACE stanju<br />

najviše u slučaju kada karakter sadrži sve nule. Ova osobina prenosa<br />

upotrebljena je za uvođenje specijalnog znaka nazvanog BREAK (prekid). Ovaj<br />

se signal ko-risti kako bi se dala prijemniku signalizacija da je došlo do<br />

problema u slanju podataka.<br />

Serijski prenos počinje tako da predajna strana šalje prijemnoj strani signal<br />

RTS - zahtev za slanjem, dok prijemnik ako je spreman za prijem odgovara<br />

signalom CTS - spreman za prijem. Predajnik zatim šalje podatke prijemniku.<br />

Nakon prijema podataka, prijemnik proverava da li su podaci primljeni bez<br />

greške i za to vreme javlja predajniku da je zauzet. Ako su podaci primljeni bez<br />

greške, prijemnik šalje predajniku signal potvrde ACK (Acknowledgment -<br />

ASCII 6), a u slučaju ako se pojavila neka greška, šalje signal nega tivne potvrde<br />

NAK (ASCII 21). Zavisno od upotrebljenog protokola, odgovor predajnika na<br />

dobijeni NAK signal može biti ponovno slanje podataka.<br />

Protokol za prenos može se izvesti na dva načina i to: hardverski i<br />

softverski. Za realizaciju hardverskog protokola neophodno je da postoje linije:<br />

RTS, CTS i linija za prenos bitova poruke. Softverska realizacija koristi umesto<br />

linija RTS i CTS, ASCII znakove XON i XOFF (nazivaju su i DC1 i DC3),<br />

zbog čega je umesto tri dovoljna samo jedna linija. Kada se primenjuje ovaj<br />

protokol prijemnici i na predaji i prijemu proveravaju svaki prispeli znak radi<br />

utvrđivanja da li je to XON, XOFF ili podatak. Strana koja ne može da primi<br />

karakter kao indikator tog stanja drugoj strani šalje XOFF znak.<br />

Prilikom serijskog prenosa podataka moguća je pojava sledećih vrsta<br />

grešaka:<br />

Greška uokvirenja ili greška rama podatka (framing error). Do ove<br />

greške dolazi u slučaju kada prijemnik očekuje STOP bit ali se on ne<br />

pojavljuje.<br />

9


Greška prekoračenja (overrun error). Nastaje kada se pojavljuje novi<br />

znak u prijemniku a prethodni nije upotpunosti primljen.<br />

Greška parnosti (parity error). Nastaje kada bit parnosti ne odgovara<br />

stanju bitova u bitovima podatka.<br />

Serijski EEPROM<br />

Serijski EEPROM-i su danas sve pristupačniji za korišćenje. Tome<br />

doprinose njegove male dimenzije (DIP 8), niska cena i mali broj potrebnih<br />

linija za njegovo povezivanje sa mikrokontrolerom. Najčešća primena serijskih<br />

EEPROM-a je u televiziji, SAT prijemnicima, video rekorderima gde služe za<br />

memorisanje kanala….<br />

Specifikacijom datom od strane proizvođača, prilikom nestanka napajanja<br />

garantovano je čuvanje podataka do 40 godina. Opseg radnog napona kreće su u<br />

granicama od 3V do 5,5V. U sam čip ugrađen je Power on Reset kojim su<br />

zabranjene sve funkcije sve dok napon ne dostigne nominalnu vrednost.<br />

Fabrički je određeno da serijski EEPROM ima isti sadržaj svih ćelija, $FF.<br />

Microchip 24Cxx kola su kompatibilna sa I 2 C protokolom razvijenim od<br />

strane Philipsa, koji omogućava korišćenje samo 2 bi-direkcione open-drain<br />

linije.<br />

Radna frekvencija kola kreće se u granicama od 100kHz do 400kHz.<br />

Slika 7. Serijski EEPROM 24C02<br />

10


Slika 8. Raspored pinova serijskog EEPROM-a<br />

PIN Function<br />

VCC Supply Voltage<br />

SDA Serial Data Address I/O<br />

SCL Serial Clock<br />

DC Don`t connect<br />

TEST Test PIN<br />

SDA serijski bidirekcioni kontakt sluzi za prenos adresa i podataka u<br />

memoriju, takođe i za prenos adresa i podataka iz memorije. Pošto je izveden<br />

kao Open Drain potrebno je i na njega priključiti ‘Pull up’ otpornik na<br />

VCC(tipična vrednost je 10kΩ za 100kHz, 1kΩ za 400kHz).<br />

SCL ulaz obezbeđuje sinhronizaciju podataka koji se u memoriju upisuju ili<br />

iščitavaju.<br />

Proizvođač u specifikaciji daje okvirnu procenu od oko 1,000,000 mogućih<br />

upisa-čitanja memorije. U komercijalno dostupnoj verziji kola, radna<br />

temperatura se kreće u granicama od 0 o C do 70 o C.<br />

11


EEPROM 24c02 ima kapacitet od ukupno 2kbit-a, organizovanih u singleblokove<br />

od 256 x 8 bita. Protok informacija iz kola i prema kolu je moguć samo<br />

kad je magistrala slobodna. Prenos podataka mora biti konstantan, a ukoliko<br />

dođe do određene varijacije, može doći do prekida(dolazeći bit moze biti<br />

interpretiran kao START ili STOP bit).<br />

START bit nastaje promenom logičkog nivoa na liniji SDA sa ‘1’ na ‘0’<br />

kada je SCL na visokom logičkom nivou. Komanda START mora prethoditi<br />

bilo kojoj komandi za transfer podataka.<br />

STOP bit nastaje promenom nivoa na liniji SDA sa ‘0’ na ‘1’ dok je linija<br />

SCL na visokom logičkom nivou. Naredba STOP prekida komunikaciju između<br />

master i slave čipa ( čip koji kontroliše protok podataka se zove master, a<br />

drugi drugi slave).<br />

Slika 9. Oblik START I STOP nivoa<br />

Ako je STOP komanda nastala nakon READ komande, tada EEPROM<br />

prelazi u “Stand by režim”, a ako je nastala nakon komande WRITE tada<br />

inicira interno upisivanje u EEPROM. Uspešno izveden prenos podataka<br />

potvrđuje se ACK (Acknowledge) bitom.<br />

12


Nakon generisanja START bita, master šalje slave adresu koju čine 4 “device<br />

select” bita (1010) i 3 ”don’t care” bita. Osmi bit ima vrednost 1 ili 0 za čitanje<br />

ili upis.<br />

Slika 10. Pozicija device-select bita u adresnoj reči<br />

13


Upisivanje u EEPROM<br />

Postoje 2 načina upisa u serijski EEPROM 24c02:<br />

- upisivanje pojedinačnih bajtova<br />

- upisivanje grupa bajtova<br />

Upisivanje pojedinačnih bajtova inicijalizuje START bit sa master kola.<br />

Za njim slede “device select” bitna reč (1010) i logička nula što znači da sledi<br />

upisivanje. Deveti bit je ACK, bit potvrde.<br />

Nakon potvrde, memorija čeka na osmobitnu adresu, kojom se određuje u<br />

koju od 256 lokacija, u jednom od odabranih blokova, treba da upiše bajt<br />

podataka. Po prijemu adresnog bajta memorija opet odgovara bitom potvrde.<br />

Master šalje osam bita podataka a slave posle osmog bita odgovara bitom<br />

potvrde. Master završava upisivanje slanjem STOP bita. Da bi se što više<br />

skratilo vreme potrebno za upisivanje vrši se ciklično ispitivanje bita potvrde.<br />

Drugim rečima, po prijemu bajta adrese i bajta podatka, memorija se<br />

“isključuje” sa BUS-a da bi izvršila interno upisivanje. To vreme iznosi<br />

maksimalno 10ms za režim upisivanja pojedinačnih bajtova. U stvarnosti je to<br />

vreme znatno kraće, pa se zato vrši ciklično ispitivanje bita potvrde.<br />

Upisivanje grupa bajtova na isti način počinje bajtom za upis, adresom i<br />

prvim bajtom iz grupe. Umesto generisanja STOP stanja, MASTER šalje do 8<br />

data bajtova koji su privremeno uskladišteni u bafreru čipa i koji će biti upisani<br />

u memoriju nakon što MASTER pošalje STOP bit.<br />

Nakon svakog pristiglog bajta, tri najniža adresna pokazivača svaki put se<br />

uvećavaju za jedan, dok pet viših ostaju nepromenjena. Ukoliko MASTER<br />

pošalje više od 8 bajtova, brojač adresa se vraća na početno stanje i upisani<br />

sadržaj se briše.<br />

14


Opšte karakteristike mikrokontrolera<br />

Mikrokontroleri su elektronske komponente namenjene konstruisanju<br />

elektronskih sistema za digitalno upravljanje i nadzor. Pomoću takvih sistema<br />

moguće je upravljati različitim eletronskim uređajima i sistemima, a takođe<br />

vršiti i prikupljanje i obradu različitih električnih i neelektričnih veličina.<br />

Digitalni sistemi zasnovani na mikrokontrolerima mogu se programirati da u<br />

zavisnosti od stanja upravljanog kola izvršavaju određene obrade i na osnovu<br />

rezultata tih obrada vrše upravljanja u kolu.<br />

Na početku je veoma važno napomenuti koje su razlike između<br />

mikrokontrolera i mikroprocesora. Mikroprocesori su elektronske komponente<br />

koje su namenjene različitim vrstama obrade u digitalnim računarima. Da bi se<br />

mikroprocesor mogao koristiti u sistemima digitalnog upravljanja, potrebno ga<br />

je povezati sa komponentama za memorisanje programa za obradu i podataka<br />

nad kojima se ta obrada izvodi, kao i sa komponentama za interakciju sa<br />

spoljnim svetom – ulaznim i izlaznim uređajima. Na taj način se dobija digitalni<br />

sklop koji je dosta složen i glomazan, te je stoga i dosta skup.<br />

Za razliku od mikroprocesora, mikrokontroleri su projektovani tako da<br />

objedine kompletan digitalni računar na jednom čipu, jer osim procesora sadrže<br />

i memorijske i periferne jedinice. Tako se postiže da željeni sistem ima<br />

minimalan broj komponenata, čime se štedi prostor i vreme potrebno za<br />

konstruisanje uređaja.<br />

U sadašnje vreme na tržištu postoji nekoliko velikih proizvođača<br />

mikrokontrolera koji u svom proizvodnom programu imaju najrazličitije<br />

familije mikrokontrolera. Najpoznatiji od njih su Intel, Motorola, Atmel i<br />

Microchip. Primene mikrokontrolera su veoma široke, što je posledica njihove<br />

osobine da sami zavisno od željene namene možemo da isprogramiramo<br />

kakvo će biti ponašanje digitalnog uređaja koji projektujemo.<br />

15


Funkcionalne jedinice savremenih<br />

mikrokontrolera<br />

U zavisnosti od tipa, odnosno namene, savremeni mikrokontroleri mogu da<br />

imaju sledeće funkcionalne jedinice:<br />

• ROM memorija<br />

• RAM memorija<br />

• EEPROM memorija<br />

• Registri posebne namene (SFR registri)<br />

• Programski brojač<br />

• Upravljačka jedinica<br />

• Aritmetičko logička jedinica<br />

• A/D konvertor<br />

• U/I portovi<br />

• Oscilator<br />

• Tajmeri<br />

• Sigurnosni tajmer – Watchdog tajmer<br />

• Jedinica za napajanje<br />

Mikrokontroleri mogu da imaju sve, ili samo neke od ovih funkcionalnih<br />

jedinica. Svaka od ovih jedinica ima svoju tačno definisanu funkciju, što je<br />

opisano do kraja ovog poglavlja.<br />

ROM memorija<br />

U ROM memoriji smešten je program koji mikrokontroler izvršava, a<br />

tokom normalnog rada sadržaj ove memorije se ne može menjati. ROM<br />

memorija savremenih mikrokontrolera može biti programabilna, pri čemu se<br />

jedan mikrokontroler može programirati više puta, čime se projektantu olakšava<br />

konstruisanje željenog sklopa. Programabilni ROM uglavnom je EEPROM ili<br />

Flash tipa, što zavisi od konkretnog mikrokontrolera. Sadržaj ROM memorije<br />

se ne menja nakon isključenja napona napajanja.<br />

16


RAM memorija<br />

Ova memorija ima funkciju privremenog pohranjivanja podataka,<br />

međurezultata i konačnih rezultata u toku izvođenja programa. Pristup ovoj<br />

memoriji je proizvoljan – može se i čitati i u nju upisivati podaci. RAM<br />

memorija gubi svoj sadržaj ukoliko se isključi napajanje .<br />

EEPROM memorija<br />

Sadržaj EEPROM memorije može da se menja tokom rada, ali se nakon<br />

isključivanja napajanja sadržaj ne gubi, nego ostaje sačuvan u memoriji. Kod<br />

mikrokontrolera EEPROM se uglavnom koristi kao memorija za postavljanje<br />

početnih podataka neophodnih za rad.<br />

Registri posebne namene SFR<br />

Grupa SFR registara predstavlja skup registara koji imaju tačno definisanu<br />

namenu, a neophodni su za rad mikrokontrolera. Hardverski se realizuju kao<br />

memorija RAM tipa. To su razni statusni i upravljački registri, na primer<br />

registar u kojem se definiše da li će određeni pinovi biti ulazni ili izlazni.<br />

Programski brojač<br />

Ovo je registar u mikrokontroleru koji ima funkciju da u sebi uvek sadrži<br />

adresu memorijske lokacije u programskoj memoriji u kojoj se nalazi sledeća<br />

instrukcija programa koju treba izvršiti, sem u slučaju da se trenutno izvršava<br />

instrukcija skoka.<br />

Upravljačka jedinica<br />

Upravljačka jedinica ima funkciju da upravlja radom mikrokontrolera i<br />

kontroliše izvršavanje svih operacija. U sklopu ove jedinice se uglavnom nalazi<br />

dekoder instrukcija i kontrolna logika koja na osnovu instrukcije koja se<br />

trenutno izvršava uključuje odgovarajuće upravljačke signale.<br />

17


Aritmetičko logička jedinica ALU<br />

Sve operacije nad podacima se izvršavaju u aritmetičko logičkoj jedinici.<br />

Zavisno od složenosti i tipa arhitekture, mikrokontroler može imati instrukcije<br />

za jednostavnije ili složenije aritmetičke i logičke operacije.<br />

Aritmetičko logička jedinica je čvrsto spregnuta sa akumulatorom.<br />

Akumulator je jedan od SFR registara u kome se nalazi podatak nad kojim se<br />

obavljaju sve operacije ALU.<br />

A/D konvertor<br />

Ovo je elektronski sklop koji ima ulogu da analognu ulaznu veličinu,<br />

uglavnom napon, pretvori u njen digitalni ekvivalent u odgovarajućem<br />

digitalnom kodu. Kod modernih mikrokontrolera ovi A/D konvertori su 8 bitni,<br />

10 bitni ili 12 bitni. Jedan mikrokontroler može da ima više A/D konvertora.<br />

U/I portovi<br />

Funkcija U/I portova je da obezbede mikrokontroleru povezivanje sa<br />

ostalim komponentama digitalnog sistema. Svaki od U/I portova ima dodeljeni<br />

registar u kojem je smešten podatak koji se šalje na port ili je primljen sa porta.<br />

Zavisno od konkretne arhitekture, portovi mogu biti bit adresibilni, što znači da<br />

se svakom bitu na portu može dodeliti da li će biti ulazni ili izlazni.<br />

Oscilator<br />

Oscilator obezbeđuje taktni signal određenog oblika i frekvencije koji je<br />

neophodan za dobru sinhronizaciju rada pojedinih komponenata u sistemu sa<br />

mikrokontrolerom. Za dobar rad sistema neophodno je da takt signal bude<br />

stabilne frekvencije i talasnog oblika, što se obezbeđuje spoljnom<br />

stabilizacijom, najčešće uz pomoć kristala kvarca. Kod većine mikrokontrolera<br />

interni takt signal sa kojim se sinhronizuju sve operacije dobija se deljenjem<br />

frekvencije oscilatora nekim brojem koji je dobijen celobrojnim stepenovanjem<br />

broja 2.<br />

18


Tajmeri<br />

Tajmeri su registri čije se stanje menja prilikom dovođenja impulsa na<br />

njihov ulaz. Mogu se koristiti za merenje vremena između dve pojave impulsa<br />

na ulazu, ukoliko se pobuda dovodi iz internog oscilatora. Ukoliko je izvor<br />

pobude izvan mikrokontrolera, tada se tajmer ponaša kao brojač impulsa.<br />

Watchdog tajmer (sigurnosni)<br />

Watchdog je specijalni tajmer koji je projektovan tako da nakon nekog<br />

vremenskog interval izaziva reset mikrokontrolera, ukoliko je omogućen. Reset<br />

se dešava svaki put kada dođe do prekoračenja opsega ovog tajmera. Prilikom<br />

normalnog izvršavanja programa, posebnim instrukcijama povremeno se vrši<br />

postavljanje stanja ovog tajmera na početnu vrednost inicijalizacija, te se na taj<br />

način ostvaruje da ne dolazi do reseta. Ukoliko iz bilo kog razloga program<br />

upadne u mrtvu petlju, neće se izvršavati instrukcije za inicijalizaciju Watchdog<br />

tajmera, tako da će on da broji sve do prekoračenja i izazvaće reset<br />

mikrokontrolera i program će ponovo početi da se izvršava od početne<br />

vrednosti.<br />

Jedinica za napajanje<br />

Ova jedinica kod većine mikrokontrolera sadrži logiku koja proverava<br />

kakvog je kvaliteta napajanje komponente, pošto je za kvalitetan rad kola<br />

neophodno stabilno napajanje dovoljne snage. Ova logika projektovana je tako<br />

da u slučaju nekvalitetnog napajanja, tzv. “brown out“ izazove reset<br />

mikrokontrolera. Sem toga, u sastavu ove jedinice nalazi se i spoljni priključak<br />

za reset, tako da se reset mikrokontrolera može izvršiti i izvan mikrokontrolera.<br />

19


RISK procesori i HARVARD arhitektura<br />

Osamdesetih godina prošlog veka dolazi do pojave procesora poznatih pod<br />

nazivom RISC procesori, čija je arhitektura nešto pojednostavljena u odnosu na<br />

do tada standardne procesore. Sam naziv RISC znači da su to procesori sa<br />

smanjenim brojem instrukcija – Reduced Instruction Set Components, dok je<br />

filozofija projektovanja RISC procesora takva da se sa jedne strane postignu<br />

bolje performanse pri obradi, a sa druge strane arhitektura učini vidljiva<br />

softveru. Osnovne osobine RISC arhitektura su:<br />

1. Instrukcije obavljaju primitivne operacije, tj jedna instrukcija može da<br />

obavlja samo jednu operaciju na registru ili memoriji.<br />

2. Sve instrukcije koje pristupaju memoriji u cilju čitanja sadržaja lokacija,<br />

pročitane podatke smještaju u registar, i obrnuto.<br />

3. Većina RISC procesora ima razdvojena registarska polja za celobrojne i<br />

podatke sa pokretnim zarezom.<br />

4. Da bi se pojednostavilo dekodiranje instrukcija, sve instrukcije RISC<br />

procesora su jednake dužine.<br />

5. Postavljanje markera uslova kod RISC procesora nije implicitno.<br />

RISC procesori imaju pojednostavljenu arhitekturu, te je stoga smanjena i<br />

površina potrebna za realizaciju RISC procesora. Na taj način je direktno<br />

smanjen i broj potrebnih tranzistora u kolu, a i sama potrošnja. Sa druge strane,<br />

čip sa manjim brojem tranzistora brže se projektuje, a i greške se lakše mogu<br />

uočiti i ispraviti. Prilikom proizvodnje, pošto je čip manji, u jednom<br />

proizvodnom ciklusu može se proizvesti veći broj čipova.<br />

RISC procesori imaju i određene nedostatke, od kojih je najznačajniji taj da<br />

se za obavljanje jedne operacije mora izvršiti veći broj RISC instrukcija, što<br />

povlači da je neophodno procesoru staviti na raspolaganje više memorije i više<br />

internih registara.<br />

20


Većina RISC procesora imaju protočnu arhitekturu, u kojoj se izvođenje<br />

jedne instrukcije obavlja u više faza. Broj faza u obradi definisan je brojem<br />

stepeni u protočnom sistemu. Broj stepeni u protočnom sistemu u uskoj je vezi<br />

sa složenošću arhitekture RISC procesora i brzinom njegovog rada. Uglavnom<br />

je kod većine protočnih procesora karakteristično da su razdvojene faze<br />

dobavljanja instrukcije iz memorije i njenog izvršavanja.<br />

Harvard arhitektura je jedan od načina realizacije RISC procesora koji ima<br />

osobinu da se za pristup podacima i instrukcijama koriste razdvojene<br />

memorijske komponente kojima se razdvojeno i pristupa. Pri tome je put za<br />

pribavljanje instrukcija maksimalno iskorišten, dok se put za pribavljanje<br />

podataka koristi samo kod operacija čitanja i pisanja u memoriju. Na ovaj način<br />

se postiže velika brzina rada, dok je potreban veći broj pinova za adrese i<br />

podatke. Naravno, to je potrebno samo ako se radi o mikroprocesoru, dok kod<br />

mikrokontrolera koji imaju memoriju unutar istog kućišta ne dolazi do<br />

povećanja broja pinova.<br />

Memorija za<br />

podatke<br />

Podaci<br />

Centralna<br />

procesorska<br />

jedinica<br />

Instrukcije<br />

Slika 11. Objašnjenje Harvard arhitekture<br />

Memorija za<br />

program<br />

RISC procesori se u današnje vreme mnogo više koriste nego<br />

konvencionalni CISC procesori u tzv. “embedded“ sistemima u industriji –<br />

raznim kontrolerima u robotici, štampačima, grafičkim kontrolerima itd.<br />

Naravno, postoji i veliki broj mikrokontrolera koji su realizovani kao RISC<br />

procesori. Dva osnovna razloga za ovakvu dominaciju su veća propusnost RISC<br />

procesora nego CISC procesora na istom radnom taktu i što za većinu ovih<br />

aplikacija ne postoji softver, pa je razvoj upravljačkog sklopa brži sa RISC<br />

procesorom.<br />

21


MIKROKONTROLER PIC16F877<br />

Mikrokontroler PIC16F877A predstavlja integraciju mikroprocesora<br />

(CPU), memorije i periferija. Ovaj mikrokontroler je izrađen u CMOS<br />

tehnologiji sa ugrađenim FLASH i EEPROM memorijama, za čuvanje programa<br />

i podataka. PIC16F877A ima tipičnu RISC arhtekturu (karakteriše manjim<br />

skupom instrukcija koje se brže izvšavaju u odnosu na CISC arhitekturu). Ovaj<br />

mikrokontroler poseduje većinu potrebnih periferija na samom čipu tako da je<br />

podesan za aplikacije na jednom čipu. U ovom projektu koristićemo<br />

mikrokontroler proizvođača Microchip.<br />

Možemo još reći da koristi ISP (In System Programming) tehniku<br />

programiranja, za čiji programator je dovoljno realizovati manji sklop od tri<br />

otpornika i imati vezu sa serijskim portom računara. Takođe, kompatibilan je sa<br />

ostalim mikrokontrolerima iz Microchip-ove familije u smislu instrukcijskog<br />

seta i arhitekture, tako da je prelazak na bilo koji drugi njihov mikrokontroler<br />

veoma jednostavan.<br />

RISC arhitektura omogućuje odvojene magistrale 8-bitnih podataka i 14bitne<br />

programske memorije, pa je moguće da se pribavlja naredna instrukcija<br />

dok se izvršava tekuća (eng. pipelining). Sve instrukcije traju jednako (osim u<br />

slučaju grananja programa) i završe se za četiri ciklusa oscilatora. Dakle, ako je<br />

oscilator konfigurisan na 4 MHz, dobija se da ciklus instrukcije iznosi 1 µs.<br />

Kao što smo ranije napomenuli, većina današnjih mikrokontrolera je<br />

bazirano na Harvard arhitekturi, koja jasno definiše četiri osnovne komponente<br />

potrebne za embedded sistem. To uključuje CPU jezgro, memoriju za program<br />

(ROM, EPROM ili Flash memorija), memoriju za podatke (RAM), jedan ili<br />

više tajmera (podesive i watchdog tajmere), kao i I/O linije za komunikaciju sa<br />

eksternim periferijama i dopunskim resursima – sve to treba da bude smešteno u<br />

jednom integrisanom kolu. U daljem tekstu detaljnije će biti opisani delovi od<br />

kojih je sastavljen mikrokontroler PIC16F877A.<br />

22


Jezgro mikrokontrolera PIC16F877 proizvodi se u 40-pinskom (DIP) ili u<br />

44-pinskim kućištima (QFP i PLCC), Slike 12 i 13.<br />

Slika 12. Fizički izgled mikrokontrolera PIC 16F877 u 40-pinskom kućištu<br />

Slika 13. Fizički izgled mikrokontrolera PIC 16F877 u 44-pinskom kućištu<br />

23


Na slikama 12. i 13, mogu se videti fizički izgledi mikrokontrolera PIC16F877<br />

u različitim varijantama, dok je na slici 14. ilustrovan raspored pinova kod<br />

pomenutog mikrokontrolera.<br />

Slika 14. Raspored pinova kod mikrokontrolera PIC16F877 u kućištu DIP40<br />

U narednim poglavljima biće reči o osnovnim karakteristikama<br />

mikrokontrolera PIC16F877, o njegovoj arhitekturi sa odgovarajućom šemom,<br />

kao i o vrstama oscilatora koji se koriste kao izvor takta za dotični<br />

mikrokontroler.<br />

24


Osnovne karakteristike mikrokontrolera<br />

RISC mikroprocesor visokih performansi<br />

35 instrukcija obima jedne reči<br />

Radna frekvencija do 20 MHz<br />

Trajanje taktnog intervala 200 ns, pri frekvenciji 20 MHz<br />

Opkôd obima 14 bita<br />

Harverski magacin sa osam nivoa<br />

Tri načina adresiranja (direktno,indirektno i relativno)<br />

Programska flash memorija kapaciteta 8 k X 14-bitnih reči<br />

Memorije za podatke tipa RAM kapaciteta 368 X 8 bita<br />

Memorije za podatke EEPROM tipa kapaciteta 256 X 8 bita<br />

Prekidi (do 14 izvora prekida)<br />

U/I portovi: A, B, C, D, E<br />

Tri tajmera:<br />

- Timer0 (TMR0): 8-bitni tajmer/brojač_događaja<br />

- Timer1 (TMR1): 16-bitni tajmer/brojač_događaja<br />

- Timer2 (TMR2): 8-bitni tajmer/brojač_događaja<br />

10-bitni 8-kanalni analogno-digitalni (A/D) konvertor<br />

Serijska komunikacija: MSSP, USART<br />

Paralelna komunikacija: PSP<br />

Power-on Reset - reset pri uključenju napajanja (POR)<br />

Power-up timer - unošenje kašnjenja nakon uključenja napajanja<br />

(PWRT)<br />

Oscillator Start-up Timer - unošenje kašnjenja nakon<br />

stabilizovanja radne frekvencije oscilatora (OST)<br />

Sleep mode - režim rada sa malim utroškom energije<br />

Watchdog tajmer sa sopstvenim integrisanim RC oscilatorom za<br />

nezavisni rad<br />

Izbor tipa oscilatora<br />

Radni napon od 2V do 5.5V<br />

Mala potrošnja energije: (


Arhitektura mikrokontrolera<br />

Kao što je istaknuto, mikrokontroler PIC16F877A poseduje tipičnu<br />

RISC arhitekturu, koja je prikazana na Sl.15. Arhitektura poseduje odvojene<br />

magistrale za podatke i programski kôd. Obim podataka je 8-bitni, dok je<br />

programski kôd 14-bitni. Moguće je protočno izvršenje (pipelining). Sve<br />

instrukcije su istog obima (osim instrukcija grananja) i izvšavaju se za četiri<br />

taktna intervala. Dakle, ukoliko se koristi oscilator od 20 MHz, ciklus<br />

instrukcije traje 200 ns. Na Sl.15 prikazani su gradivni blokovi mikrokontrolera<br />

PIC16F877A.<br />

U prethodnim celinama rečeno je da strukturu mikrokontrolera<br />

PIC16F877A čini nekoliko celina:<br />

Aritmetičko-logička jedinica (ALU)<br />

Akumulator (Working Register)<br />

Hardverski magacin (Stack) organizivan u 8 nivoa<br />

EEPROM memorija podataka obima 256 bajtova<br />

Flash programska memorija – 8 kiloreči obima 14 bita<br />

RAM (File Registers) – 368 bajtova<br />

Višekanalni A/D konvertor,<br />

USART,<br />

SPI interfejs,<br />

I2C interfejs,<br />

Šest U/I portova,<br />

Tajmere itd.<br />

26


Slika 15. Arhitektura mikrokontrolera PIC16F877A<br />

27


Organizacija memorije mikrokontrolera<br />

Memorija mikrokontrolera PIC16F877A je organizovan u sledeće tri<br />

celine:<br />

Programska memorija (FLASH)<br />

Memorija podataka (RAM)<br />

EEPROM memorija podataka.<br />

U mikrokontroleru postoji i magacin (stack), koji radi na principu<br />

cikličnog bafera, što znači da se u njega mogu staviti osam različitih adresa,<br />

dok se sa upisom devete adrese – briše prva i tako redom. Programski se ne<br />

može utvrditi da li je došlo do prepunjeja magacina.<br />

- Programska memorija (FLASH)<br />

U mikrokontroler PIC16F877A integrisan je trinaestobitni programski<br />

brojač (PC) koji je u mogućnosti da adresira 8K programskih reči od 14<br />

bita. Izvršavanje programa počinje od Reset vektora, a prekidni (interrupt)<br />

vektor je 0x0004. Mapa programske memorije i magacin su prikazani na<br />

Slici 14.<br />

- Memorija podataka (RAM)<br />

Memorija podataka je podeljena u više banki (banks), a čine je registri<br />

opšte namene (General Purpose Registers) i registri specijalne funkcije<br />

(Special Function Registers). U jednom od specijalnih registara, tzv.<br />

STATUS registru postoje dva bita RP1 i RP0 koji služe za izbor željene<br />

banke podataka.<br />

28


Slika 16. Mapa programske memorije i magacin (stack)<br />

Svaka banka može da sadrži do 128 registara (0x7F). Niže lokacije u banci<br />

zauzimaju specijalni registri, a ostatak prostora popunjavaju registri opšte<br />

namene implementirani kao statički RAM. Neki specijalni registri koji se<br />

često koriste mapirani su u sve banke da bi se omogućio brzi pristup i redukcija<br />

kôda. Mapa registara mikrokontrolera PIC16F877 prikazana je na Slici 17.<br />

Nekoliko specijalnih registara su registri jezgra, uskopovezani sa funkcionisanjem<br />

mikroprocesora kontrolera. Ostali registri su vezani za periferne module i<br />

služe za njihovo upravljanje i kontrolu statusa.<br />

Programski brojač (PC) je 13-bitni registar i određuje adresu naredne<br />

instrukcije u programskoj flash memoriji. Simboličko ime nižeg bajta je PCL i<br />

to je registar u koji se može i upisivati i iščitavati. Viših pet bita programskog<br />

brojača (PC) smešteni su u izolovani registar PCH kojem se pristupa samo<br />

preko latch-a PCLATH, mapiranom u internom RAM-u na ad-resi 0x0A.<br />

STATUS registar je veoma važan i zato je predviđeno da se može<br />

adresirati iz bilo koje banke. On pokazuje status aritmetičko-logičke jedinice,<br />

reset status mikrokontrolera i sadrži bite za selekciju banki internog RAM-a.<br />

Od navedenih flegova posebno treba izdvojiti Zero bit (Z), koji se postavlja kad<br />

je rezultat aritmetičke operacije jednak nuli i bit prenosa/pozajmice Carry (C).<br />

29


Registar OPTION_REG se koristi za konfiguraciju preskalera za tajmer 0<br />

ili Watchdog, za upravljanje tajmerom 0, selekciju ivice okidanja eksternog<br />

interapta, te za omogućenje Pull-up otpornika na portu B.<br />

INTCON je registar za manipulisanje sistemom prekida<br />

mikrokontrolera. Pored bita za omogućenje svih prekida (GIE) i bita za<br />

omogućenje perifernih prekida (PEIE), u ovom registru su interapt-flegovi i<br />

biti omogućenja prekida tajmera 0, spoljašnjeg prekida na pinu RB0/INT i<br />

prekida porta B na promenu stanja. Osim ova tri osnovna prekida postoji još<br />

11 periferijskih prekida. Bitovi za njihovo omogućenje nalaze se u registrima<br />

PIE1 i PIE2, a korespondentni flegovi, vesnici interapta, u registrima PIR1 i<br />

PIR2. Ovi se flegovi setuju čim se ispuni uslov interapta bez obzira na stanje<br />

njihovog bita omogućenja, a po izvršenju servis rutine potrebno ih je soſtverski<br />

resetovati.<br />

Kada je reč o registrima jezgra ne treba zaboraviti par FSR (File Select<br />

Register) i INDF (Indirect File), koji služe za indirektno adresiranje memorije<br />

podataka. Bilo koja instrukcija koja se obraća INDF registru, u stvari,<br />

indirektno pristupa onoj lokaciji internog RAM-a čija je adresa trenutno u<br />

registru FSR.<br />

Konačno, treba spomenuti registar PCON (Power Control Register). U<br />

PIC16F877 ovaj registar sadrži samo dva bita. Pomoću bita POR detektuje se<br />

razlika između Power-on reseta i reseta izazvanih drugim uzrokom. Drugi<br />

bit (BOR) služi kao indikacija Brown-out stanja (nedozvoljeni naponski nivoi u<br />

napajanju mikrokontrolera), zbog kojeg se takođe može desiti reset.<br />

30


- EEPROM memorija podataka<br />

Kada je potrebno da se upamte neki parametri (podaci) i posle prestanka<br />

napajanja mikrokontrolera, treba ih, prethodno, zapisati u interni EEPROM.<br />

Ova memorija je obima 256 bajtova.<br />

Slika 17. Mapa registara mikrokontrolera PIC16F877<br />

31


Oscilator<br />

Kod mikrokontrolera PIC16F877A postoje četiri konfiguracije oscilatora:<br />

RC Resistor/Capacitor<br />

XT Crystal / Resonator<br />

LP Low Power Crystal<br />

HS High Speed Crystal / Resonator.<br />

Najjednostavnija varijanta je RC oscilator, a to je ilustrovano na Sl.18.<br />

Ovakav pristup je ispravan u aplikacijama u kojima se ne zahteva precizna<br />

procena vremenskih intervala. Ovde ćemo naglasiti kako je moguće koristiti i<br />

interni RC oscilator, koji je integrisan u mikrokontroleru.<br />

Slika 18. Povezivanje eksternog RC oscilatora<br />

Frekvencija oscilovanja zavisi ne samo od vrednosti Rext i Cext, već i od<br />

napona napajanja kao i radne temperature. Vrednost otpornika Rext treba da<br />

bude u opsegu od 3 KΩ do 100K KΩ. Izvan ovog opsega rad oscilatora nije<br />

stabilan i osetljiv je na spoljašne uticaje. Kondenzator Cext se može čak i<br />

izostaviti. Međutim, zbog stabilnosti preporučuje se vrednost oko 20pF. Na pinu<br />

OSC2/CLKOUT generiše se taktni impuls čija je perioda četiri puta veća od<br />

periode rada oscilatora.<br />

32


Kod vremenski kritičnih aplikacija treba ugrađivati kvarcni oscilator ili<br />

keramički rezonator. Vrednosti kondenzatora C1 i C2 (Sl.19.), treba da budu<br />

identične.<br />

Slika 19. Povezivanje eksternog kvarca (LP, XT, HS)<br />

Mikrokontroleru PIC16F877A može da se dovede i spoljašnji takt, što je<br />

prikazano na Sl. 20.<br />

Slika 20. Dovođenje spoljašnjeg takta<br />

Odnos između takta i instrukcijskog ciklusa<br />

Takt koji se dovodi na pin OSC1 oscilatora u mikrokontroleru deli se na<br />

četiri vremenski nepre-klapajuća taktna signala nazvana Q1, Q2, Q3 i Q4.<br />

Skup ovih signala čine jedan instrukcijski cik-lus . U zavisnosti od trenutka<br />

generisanja u okviru ciklusa instrukcija, taktni signali Q1-Q4 se koriste za<br />

sledeće namene:<br />

Q1 - pribavljanje instrukcije iz programske memorije<br />

Q2 - dekodiranje naredbe iz prethodnog instrukcijskog ciklusa<br />

Q3 - izvršenje naredbe iz prethodna dva instrukcijska ciklusa<br />

Q4 - prenos opkôda naredbe pozvane u Q1 u instrukcijski registar.<br />

33


Portovi<br />

PIC16F877A poseduje pet portova (PORTA, PORTB, PORTC, PORTD i<br />

PORTE) i oni pred-tavljaju vezu njegove interne strukture sa spoljašnjim<br />

svetom. Svaki od njih može da se konfiguriše kao ulazni ili kao izlazni.<br />

Pomenuti portovi su različitog obima:<br />

8-pinski (PORTB, PORTC, PORTD)<br />

6-pinski (PORTA)<br />

3-pinski (PORTE).<br />

Svakom pinu bilo kojeg porta, u zavisnosti od režima rada, mogu da se<br />

dodele fiksne ili promen-ljive funkcije. Konfiguracija smera prenosa ostvaruje<br />

se upisom na odgovarajuću bit-poziciju u pripa-dajućem TRIS registru (0 - pin<br />

je izlazni, 1 – pin je ulazni).<br />

Svakom portu je dodeljen registar podataka (PORTX), preko kojeg se<br />

programski pristupa U/I pinovima. Upis u neki od tih registara iniciraće upis u<br />

latch tog porta, a njegovo čitanje rezultiraće čita-njem logičkih stanja direktno<br />

sa pinova. Sve instrukcije upisivanja su tipa read-modify-write . To znači da se<br />

pri upisu u port najpre očitaju stanja pinova, zatim izvrši modifikacija, a<br />

potom korigovana vrednost upiše u latch porta. Ne postoji velika razlika u<br />

konstrukciji pomenutih pet portova. Jedino se PortB od ostalih razlikuje zbog<br />

posebne opcije koju nude četiri MSB. Ukoliko se setuje bit RBIE u registru<br />

INTCON, svaka promena stanja na ovim pinovima, generisaće prekid<br />

mikrokontrolera.<br />

PortA<br />

PortA je 6-bitni (RA5-RA0) bidirekcioni port (podaci mogu da se šalju u<br />

oba smera). Sadržaj re-gistra TRISA određuje smer (ulazni ili izlazni) pinova na<br />

portu. Blok-dijagrami za pin RA4 je prikazan na Sl. 21 i 22, dok su u tabeli<br />

21.a) prikazane funkcije portaA i registri.<br />

34


Slika 21. Blok-dijagram pina RA4<br />

Sada ćemo kroz nekoliko primera ilustrovati postavljanje smerova na portu:<br />

TRISA = 0b000000 (PORTA je izlazni)<br />

TRISA = 0b111111 (PORTA je ulazni)<br />

TRISA = 0b101000 (RA5 i RA3 pinovi su ulazni, a RA4, RA2, RA1 i<br />

RA0 su izlazni)<br />

TRISA = 0b111000 (RA5-RA3 su ulazni, a RA2-RA0 su izlazni) itd.<br />

Tabela 21a). Funkcije PortaA i registri<br />

35


Slika 22. Blok-dijagram pinova RA5, RA3-RA0<br />

PortA ima mogućnost analogno-digitalne konverzije i prvenstveno se<br />

koristi u te svrhe. A/D kon-vertor, koji je integrisan u mikrokontroleru, je 10bitni<br />

sa 8 ulaznih kanala, jer se u ove svrhe koriste i svi pinovi PortaE (i pinovi<br />

PortaA izuzev RA4).<br />

Pin RA4 je sa otvorenim drejnom i može da se iskoristi za ulazni takt za<br />

tajmer TMR0.<br />

Port B<br />

Port B je 8-bitni bidirekcioni port. Svakom pinu porta korespondira<br />

odgovarajući bit u regis-tru TRISB, kojim se definiše smer. Svi pinovi unutar<br />

PortB poseduju pull-up otpornike. Ovi otpor-nici mogu da se uključe<br />

jednim kontrolnim bitom. To se postiže postavljanjem RBPU' bita na ‘0’.<br />

Pull-up otpornici se automatski isključuju kada se pin konfiguriše kao izlazni.<br />

Otpornici su isklju-čeni i kod Power-on reseta.<br />

Četiri pina na PORTB (RB7-RB4) imaju mogućnost generisanja prekida.<br />

Samo pinovi koji su definisani kao ulazni mogu da prouzrokuju prekid.<br />

36


Kombinacija prekida na promenu stanja PortaB i pull-up otpornik mogu se<br />

iskoristiti kao jednostavan interfejs za tastaturu. Na slikama 23. i 24. prikazana<br />

je struktura PORTB.<br />

Slika 23. Blok-dijagram pinova RB3-RB0<br />

Slika 24. Blok-dijagram pinova RB7-RB4<br />

37


Port C<br />

Tabela 24.a) Funkcije PortaB i registri<br />

Port C je 8-bitni bidirekcioni port. Posebnost ovog porta se ogleda u tome<br />

što poseduje ugrađen USART modul, koji služi za serijsku komunikaciju<br />

(npr. sa racunarom ili drugim mikrokontro-lerom). Modulu se pristupa preko<br />

pinova RC7 i RC6. Pinove treba softverski konfigurisati da budu u funkciji<br />

USART modula.<br />

Na Slikama 25. i 26. prikazana je struktura PortaC, dok je funkcionalna<br />

tabela registara koji se koriste za konfigurisanje samog porta data u Tabeli<br />

26.a).<br />

Slika 25. Blok-dijagram pinova RC7-RC5, RC2-RC0<br />

38


Slika 26. Blok-dijagram pinova RC7-RC5, RC2-RC0<br />

Tabela 26.a) Funkcije PortaC i registri<br />

39


Portovi D i E<br />

Port D je 8-bitni bidirekcioni port. Ovaj port može da se konfiguriše kao 8bitni<br />

paralelni mikro-procesorski port (parallel slave port-PSP) i to<br />

podešavanjem konfiguracionog bita PSPMOTE (TRISC). U ovom režimu<br />

rada ulazni bafer je TTL tipa.<br />

Port E je bidirekcioni veličine 3 bita. Ima mogućnost A/D konverzije.<br />

Ulazni bafer je tipa Schmitt Trigger. Pinovi mogu da se konfigurišu kao<br />

digitalni ili analogni, kao i u slučaju PortaA, o čemu je već bilo reči.<br />

Periferijske jedinice<br />

Mikrokontroler PIC16F877 poseduje nekoliko korisnih periferijskih<br />

modula. S obzirom da mikro-kontroler treba da razmenjuje podatke sa ostalim<br />

komoponentama (registrima, memorijama, drugim mikrokontrolerima itd.) u tu<br />

svrhu je opremljen sa tri hardverska komunikaciona modula.<br />

Prvi od njih je SSP modul (Synchronous Serial Port), koji služi za<br />

komunikaciju sa serijskim EEPROM-ima, pomeračkim registrima, displejdrajverima<br />

itd. Ovaj modul može da radi u jednom od dva režima:<br />

Serial Peripheral Interface (SPI)<br />

Inter-Integrated Circuit (I2C).<br />

Drugi serijski komunikacioni modul je USART (Universal Synchronous<br />

Asynchronous Receiver Transmiter). On uglavnom služi za povezivanje sa<br />

personalnim računarom, mada to nije jedina njegova mogućnost primene.<br />

USART može da se konfiguriše u neki od sledećih režima rada:<br />

Asinhroni rad (full duplex)<br />

Sinhroni master rad (half duplex)<br />

Sinhroni slave rad (half duplex).<br />

Osim serijskih, postoji i jedan paralelni komunikacioni modul. U<br />

pitanju je modul PSP (Pa-rallel Slave Port). Njegov zadatak je da PIC16F877<br />

direktno poveže na 8-bitnu magistralu podataka drugog mikroprocesora.<br />

Eksterni mikroprocesor tada, preko linija Read (RD) i Write (WR) može da<br />

čita i upisuje u registar PortD kao u svaki drugi 8-bitni latch.<br />

40


Realizacija projektnog zadatka<br />

Na Slici 27 je prikazana blok šema, dok je na Slici 28 prikazana električna<br />

šema veze mikrokontrolera PIC16F877 i serijskog EEPROM-a 24C02.<br />

Slika 27. Blok šema sprege mikrokontrolera i seijskog EEPROM-a<br />

41


1<br />

2<br />

S 1<br />

C 5<br />

2 7p F<br />

C 6<br />

2 7p F<br />

1<br />

2<br />

S W DI P -2<br />

R 1<br />

1 0K<br />

T T 1<br />

4<br />

3<br />

R 2<br />

1 0K<br />

Qu 1<br />

4 MH z<br />

D 8 1 N 58 1 9<br />

R 3<br />

1 0K<br />

D 1<br />

L E D<br />

IK 5<br />

A 0<br />

A 1<br />

N C<br />

R 4<br />

2 K 2<br />

G N D S D A<br />

2 4C 0 2<br />

V C C<br />

W P<br />

S C L<br />

C 1<br />

2 20 u F<br />

C 2<br />

1<br />

1 00 n F<br />

R 5<br />

1<br />

2<br />

3<br />

4<br />

5<br />

2 K 2<br />

D 2<br />

L E D<br />

6<br />

7<br />

8<br />

9<br />

1 0<br />

1 1<br />

1 2<br />

1 3<br />

1 4<br />

1 5<br />

R 6<br />

R 7 1 6<br />

1 7<br />

1 8<br />

1 0K 1 0K 1 9<br />

2 0<br />

IK 1<br />

V in<br />

L M78 0 5<br />

IK 2<br />

G n d<br />

2<br />

M C L R P B 7<br />

P A 0 P B 6<br />

P A 1 P B 5<br />

P A 2 P B 4<br />

P A 3 P B 3<br />

P A 4 P B 2<br />

P A 5 P B 1<br />

R D P B 0<br />

W R V D D<br />

C S V S S<br />

V D D P D 7<br />

V S S P D 6<br />

O S C 1 P D 5<br />

O S C 2 P D 4<br />

P C 0 P C 7<br />

P C 1 P C 6<br />

P C 2 P C 5<br />

P C 3 P C 4<br />

P D 0 P D 3<br />

P D 1 P D 2<br />

P IC 1 6 F8 7 7 -0 4<br />

IK 4<br />

A 0<br />

A 1<br />

N C<br />

G N D S D A<br />

2 4C 0 2<br />

V C C<br />

W P<br />

S C L<br />

V o ut<br />

3<br />

4 0<br />

3 9<br />

3 8<br />

3 7<br />

3 6<br />

3 5<br />

3 4<br />

3 3<br />

3 2<br />

3 1<br />

3 0<br />

2 9<br />

2 8<br />

2 7<br />

2 6<br />

2 5<br />

2 4<br />

2 3<br />

2 2<br />

2 1<br />

1<br />

2<br />

3<br />

C 3<br />

2 20 u F<br />

C 4<br />

1 00 n F<br />

R 8<br />

D 3<br />

5 V 1<br />

C 1 0<br />

C 9<br />

2 K 2 R 9<br />

D 4<br />

5 V 1<br />

1 00 n F<br />

1 00 n F<br />

C 8<br />

1 00 n F<br />

C 1 1<br />

1 00 n F<br />

IK 3<br />

1<br />

C 1 + V cc<br />

2<br />

V + G n d<br />

3<br />

C 1 - T 1o u t<br />

4<br />

C 2 + R 1 in<br />

5<br />

C 2 - R 1 ou t<br />

6<br />

V - T 1i n<br />

7<br />

T 2o u t T 2i n<br />

8<br />

R 2 in R 2 ou t<br />

Slika 28. Električna šema sprege mikrokontrolera i seijskog EEPROM-a<br />

Inače, mikrokontroler ima takt od 4MHz i napaja se preko standardnog<br />

stabilizatora napona LM7805 (Vout = 5V±0,1V, Imax = 500mA).<br />

Komunikacija između mikrokontrolera i računara ostvaruje se preko<br />

interfejsnog kola MAX232N. Komunikacija je bez handshaking-a.<br />

Uloga diode D8 je zaštita pogrešnog priključivanja napona napajanja.<br />

Tasterom TT1 se resetuje mikrokontroler.<br />

Na samoj pločici je omogućeno programiranje serijskog EEPROM-a i to se<br />

ostvaruje preko serijskog porta računara. Zener diodama se prilagođavaju<br />

naponski nivoi.<br />

Za definisanje režima rada koriste se DIPSW2 prekidači, a kao indikacija<br />

režima koriste se crvene LED i zelena LED sa malom potrošnjom (low-power).<br />

O ovome će detaljnije biti reči u poglavlju Laboratorijska vežba.<br />

J 1<br />

2 K 2<br />

MA X 23 2<br />

1 6<br />

1 5<br />

1 4<br />

1 3<br />

1 2<br />

1 1<br />

1 0<br />

9<br />

C 7<br />

2 20 n F<br />

1<br />

6<br />

2<br />

7<br />

3<br />

8<br />

4<br />

9<br />

5<br />

C N 1<br />

D B 9 /F<br />

42


Spisak komponenti:<br />

Designator Part Type Footprint<br />

1 R1 2K2, Carbon Film Resistor, 0.25W, 5% AXIAL0.4<br />

2 R2 2K2, Carbon Film Resistor, 0.25W, 5% AXIAL0.4<br />

3 R3 10K, Carbon Film Resistor, 0.25W, 5% AXIAL0.4<br />

4 R4 10K, Carbon Film Resistor, 0.25W, 5% AXIAL0.4<br />

5 R5 10K, Carbon Film Resistor, 0.25W, 5% AXIAL0.4<br />

6 R6 2K2, Carbon Film Resistor, 0.25W, 5% AXIAL0.4<br />

7 R7 2K2, Carbon Film Resistor, 0.25W, 5% AXIAL0.4<br />

8 C1 220uF, Electrolytic Capacitor 16V RB.1/.2<br />

9 C2 100nF, Polyester Block Capacitor, 5% RAD0.2<br />

10 C3 220uF, Electrolytic Capacitor 16V RB.1/.2<br />

11 C4 100nF, Polyester Block Capacitor, 5% RAD0.2<br />

12 C5 27pF, Multilayer Ceramic Capacitor, 5% RAD0.1<br />

13 C6 27pF, Multilayer Ceramic Capacitor, 5% RAD0.1<br />

14 C7 220nF, Polyester Block Capacitor, 5% RAD0.2<br />

15 C8 100nF, Polyester Block Capacitor, 5% RAD0.2<br />

16 C9 100nF, Polyester Block Capacitor, 5% RAD0.2<br />

17 C10 100nF, Polyester Block Capacitor, 5% RAD0.2<br />

18 C11 100nF, Polyester Block Capacitor, 5% RAD0.2<br />

19 Y1 Quartz HC-49U, 4MHz, 20ppm, 20pF XTAL1<br />

20 D1 L-53LRD, Red Diffused LED D0.1<br />

21 D2 L-53LYD, Green diffused LED D0.1<br />

22 D3 Zener Diode 5V1 AXIAL0.3<br />

23 D4 Zener Diode 5V1 AXIAL0.3<br />

24 D5 Shottkey Diode 1n5819 AXIAL0.3<br />

25 IK1 LM7805, Linear voltage regulator, 5V TO-126<br />

26 IK2 PIC16F877A, Microcontroller DIP40<br />

27 IK3 MAX232, Driver/Receiver for EIA/TIA-232E DIP16<br />

28 IK4 Serial EEPROM 24C02 DIP8<br />

29 DC YDJ-1134, Power Jack POWER3<br />

30 DB9F DB9F PCB, DB9 Connector DB9RA/F<br />

31 TT1 Tact switch TS-062 SW-4<br />

32 DIPSW2 Switch DIP2 DIPSW2<br />

33 LC8 Low_cost Socket DIP-8 DIP8<br />

34 LC8 Low_cost Socket DIP-8 DIP8<br />

35 LC40 Low_cost/Professional Socket DIP-40 DIP40<br />

36 J2 Pin_Header/F 1x3 PH3/F<br />

Tabela 27. Spisak komponenata za kolo sa Sl.7.1<br />

Legenda:<br />

Carbon Film Resistor Ugljenoslojni otpornik<br />

Carbon Trimmer Potentiometer Ugljenoslojni potenciometar<br />

Electrolytic Capacitor Elektrolitski kondenzator<br />

Polyester Block Capacitor Poliesterski blok kondenzator<br />

Multilayer Ceramic Capacitor Keramički kondenzator “through hole”<br />

43


Quartz Kristal kvarca<br />

Red Diffused LED Crvena difuzna LED dioda<br />

Yellow diffused LED Žuta difuzna LED dioda<br />

Linear voltage regulator Linearni regulator napona<br />

Microcontroller Mikrokontroler<br />

Driver/Receiver Drajver/prijemnik<br />

Power Jack Konektor (džek) za napajanje<br />

Switch Prekidač<br />

Tact switch Taster<br />

Low_cost/Professional Socket Jeftino/profesionalno podnožje<br />

Pin_Header/F Pin-letvica (muška)<br />

Slika 29. Izgled štampane ploče<br />

44


Slika 29a: Realizovani uređaj<br />

45


Program u mikroC-u<br />

unsigned short i=0, j=0, k;<br />

void main() {<br />

TRISA = 0b000011; //Definisanje pinova Porta A<br />

PORTA = 0;<br />

ADCON1 = 6;<br />

delay_ms(1000);<br />

PORTA.F3 = !PORTA.F0; // Nacin paljenja LED.<br />

PORTA.F2 = !PORTA.F1;<br />

i.F0 = !PORTA.F1;<br />

i.F1 = !PORTA.F0;<br />

// Inicijalizacija USART terminala<br />

Usart_init(2400);<br />

Usart_Write(i);<br />

Soft_I2C_Config(&PORTD, 1, 0); // Inicijalizacija USART terminala<br />

Soft_I2C_Start(); // Pocetak upisa<br />

Soft_I2C_Write(0xA2); // Adresa 24C02<br />

Soft_I2C_Write(i); // Pocetna lokacija<br />

while ((j < 10)&& (i!=0)) {<br />

Soft_I2C_Write(2*i+j);<br />

Usart_Write(2*i+j);<br />

j++;<br />

}<br />

Soft_I2C_Stop();<br />

j=0;<br />

if (i==0) {<br />

delay_ms(100);<br />

while (j < 32) { // Citanje lokacije EEPROM-a<br />

Soft_I2C_Start();<br />

Soft_I2C_Write(0xA2); // Adresa 24C02<br />

Soft_I2C_Write(j);<br />

Soft_I2C_Stop();<br />

Soft_I2C_Start();<br />

46


Soft_I2C_Write(0xA3);<br />

k = Soft_I2C_Read(0); // Citanje<br />

Usart_Write(k);<br />

Soft_I2C_Stop();<br />

j++;<br />

}<br />

delay_ms(100);<br />

Usart_Write(j-1);<br />

j=0;<br />

}<br />

}//~!<br />

Napomena:<br />

Korišćena je gotova I2C biblioteka iz kompajlera mikroC.<br />

Program u asembleru<br />

; ADDRESS OPCODE ASM<br />

; ----------------------------------------------<br />

$0000 $28F8 GOTO _main<br />

$0004 $ _Delay_1us:<br />

;delays.c,7 :: void Delay_1us() {<br />

;delays.c,8 :: Delay_us(1);<br />

$0004 $0000 NOP<br />

;delays.c,9 :: }<br />

$0005 $0008 RETURN<br />

$0006 $ _PutZerosToLAT:<br />

$0006 $0804 MOVF FSR, 0<br />

$0007 $1303 BCF STATUS, RP1<br />

$0008 $1283 BCF STATUS, RP0<br />

$0009 $00AA MOVWF PutZerosToLAT_k_L0<br />

$000A $0820 MOVF ___porti2c, 0<br />

$000B $0084 MOVWF FSR<br />

$000C $1384 BCF FSR, 7<br />

$000D $0800 MOVF INDF, 0<br />

$000E $00A9 MOVWF PutZerosToLAT_temp_L0<br />

$000F $10A9 BCF FLOC_PutZerosToLAT+0, ____sdai2c<br />

$0010 $1029 BCF FLOC_PutZerosToLAT+0, ____scli2c<br />

$0011 $0829 MOVF PutZerosToLAT_temp_L0, 0<br />

47


$0012 $0080 MOVWF INDF<br />

$0013 $082A MOVF PutZerosToLAT_k_L0, 0<br />

$0014 $0084 MOVWF FSR<br />

$0015 $0008 RETURN<br />

$0016 $ _Usart_Write:<br />

$0016 $ L_Usart_Write_3:<br />

$0016 $3000 MOVLW 0<br />

$0017 $1303 BCF STATUS, RP1<br />

$0018 $1683 BSF STATUS, RP0<br />

$0019 $1898 BTFSC TXSTA, 1<br />

$001A $3001 MOVLW 1<br />

$001B $00F1 MOVWF STACK_1<br />

$001C $0871 MOVF STACK_1, 0<br />

$001D $3A00 XORLW 0<br />

$001E $1D03 BTFSS STATUS, Z<br />

$001F $2822 GOTO L_Usart_Write_4<br />

$0020 $0000 NOP<br />

$0021 $2816 GOTO L_Usart_Write_3<br />

$0022 $ L_Usart_Write_4:<br />

$0022 $1283 BCF STATUS, RP0<br />

$0023 $0824 MOVF FARG_Usart_Write+0, 0<br />

$0024 $0099 MOVWF TXREG<br />

$0025 $0008 RETURN<br />

$0026 $ _Soft_I2C_Start:<br />

$0026 $1303 BCF STATUS, RP1<br />

$0027 $1283 BCF STATUS, RP0<br />

$0028 $0820 MOVF ___porti2c, 0<br />

$0029 $0084 MOVWF FSR<br />

$002A $1383 BCF STATUS, 7<br />

$002B $1480 BSF INDF, ____sdai2c<br />

$002C $2004 CALL _Delay_1us<br />

$002D $1400 BSF INDF, ____scli2c<br />

$002E $2004 CALL _Delay_1us<br />

$002F $2006 CALL _PutZerosToLAT<br />

$0030 $1080 BCF INDF, ____sdai2c<br />

$0031 $2004 CALL _Delay_1us<br />

$0032 $2006 CALL _PutZerosToLAT<br />

$0033 $1000 BCF INDF, ____scli2c<br />

$0034 $0008 RETURN<br />

$0035 $ _Soft_I2C_Write:<br />

$0035 $3008 MOVLW 8<br />

$0036 $1303 BCF STATUS, RP1<br />

$0037 $1283 BCF STATUS, RP0<br />

$0038 $00A5 MOVWF Soft_I2C_Write_temp_L0<br />

$0039 $01A6 CLRF Soft_I2C_Write_r_L0, 1<br />

$003A $0820 MOVF ___porti2c, 0<br />

$003B $0084 MOVWF FSR<br />

$003C $1383 BCF STATUS, 7<br />

$003D $ L_Soft_I2C_Write_0:<br />

$003D $0825 MOVF Soft_I2C_Write_temp_L0, 0<br />

48


$003E $1903 BTFSC STATUS, Z<br />

$003F $285A GOTO L_Soft_I2C_Write_1<br />

$0040 $2004 CALL _Delay_1us<br />

$0041 $2004 CALL _Delay_1us<br />

$0042 $2006 CALL _PutZerosToLAT<br />

$0043 $1000 BCF INDF, ____scli2c<br />

$0044 $2004 CALL _Delay_1us<br />

$0045 $0824 MOVF FARG_Soft_I2C_Write+0, 0<br />

$0046 $1903 BTFSC STATUS, Z<br />

$0047 $2848 GOTO L_Soft_I2C_Write_2<br />

$0048 $ L_Soft_I2C_Write_2:<br />

$0048 $2006 CALL _PutZerosToLAT<br />

$0049 $0DA4 RLF FARG_soft_i2c_write+0, F<br />

$004A $1C03 BTFSS STATUS, 0<br />

$004B $284F GOTO l_018<br />

$004C $1784 BSF FSR, 7<br />

$004D $1480 BSF INDF, ____sdai2c<br />

$004E $2851 GOTO l_01C<br />

$004F $ l_018:<br />

$004F $1784 BSF FSR, 7<br />

$0050 $1080 BCF INDF, ____sdai2c<br />

$0051 $ l_01C:<br />

$0051 $0000 NOP<br />

$0052 $2004 CALL _Delay_1us<br />

$0053 $1400 BSF INDF, ____scli2c<br />

$0054 $1384 BCF FSR, 7<br />

$0055 $1C00 BTFSS INDF, ____scli2c<br />

$0056 $2855 GOTO $-1<br />

$0057 $1784 BSF FSR, 7<br />

$0058 $03A5 DECF Soft_I2C_Write_temp_L0, 1<br />

$0059 $283D GOTO L_Soft_I2C_Write_0<br />

$005A $ L_Soft_I2C_Write_1:<br />

$005A $01A6 CLRF Soft_I2C_Write_r_L0, 1<br />

$005B $2004 CALL _Delay_1us<br />

$005C $2006 CALL _PutZerosToLAT<br />

$005D $0000 NOP<br />

$005E $1000 BCF INDF, ____scli2c<br />

$005F $2004 CALL _Delay_1us<br />

$0060 $1480 BSF INDF, ____sdai2c<br />

$0061 $2004 CALL _Delay_1us<br />

$0062 $2004 CALL _Delay_1us<br />

$0063 $0826 MOVF Soft_I2C_Write_r_L0, 0<br />

$0064 $1903 BTFSC STATUS, Z<br />

$0065 $2866 GOTO L_Soft_I2C_Write_3<br />

$0066 $ L_Soft_I2C_Write_3:<br />

$0066 $1400 BSF INDF, ____scli2c<br />

$0067 $1384 BCF FSR, 7<br />

$0068 $1C00 BTFSS INDF, ____scli2c<br />

$0069 $2868 GOTO $-1<br />

$006A $01A6 CLRF FLOC_soft_i2c_write+1<br />

49


$006B $2004 CALL _Delay_1us<br />

$006C $1384 BCF FSR, 7<br />

$006D $1880 BTFSC INDF, ____sdai2c<br />

$006E $1426 BSF FLOC_soft_i2c_write+1, 0<br />

$006F $2004 CALL _Delay_1us<br />

$0070 $2004 CALL _Delay_1us<br />

$0071 $2004 CALL _Delay_1us<br />

$0072 $2004 CALL _Delay_1us<br />

$0073 $2004 CALL _Delay_1us<br />

$0074 $2004 CALL _Delay_1us<br />

$0075 $2004 CALL _Delay_1us<br />

$0076 $2004 CALL _Delay_1us<br />

$0077 $2006 CALL _PutZerosToLAT<br />

$0078 $1784 BSF FSR, 7<br />

$0079 $1000 BCF INDF, ____scli2c<br />

$007A $1080 BCF INDF, ____sdai2c<br />

$007B $0826 MOVF Soft_I2C_Write_r_L0, 0<br />

$007C $00F0 MOVWF STACK_0<br />

$007D $0008 RETURN<br />

$007E $ _Soft_I2C_Stop:<br />

$007E $1303 BCF STATUS, RP1<br />

$007F $1283 BCF STATUS, RP0<br />

$0080 $0820 MOVF ___porti2c, 0<br />

$0081 $0084 MOVWF FSR<br />

$0082 $1383 BCF STATUS, 7<br />

$0083 $2006 CALL _PutZerosToLAT<br />

$0084 $1080 BCF INDF, ____sdai2c<br />

$0085 $2004 CALL _Delay_1us<br />

$0086 $1400 BSF INDF, ____scli2c<br />

$0087 $1384 BCF FSR, 7<br />

$0088 $1C00 BTFSS INDF, ____scli2c<br />

$0089 $2888 GOTO $-1<br />

$008A $1784 BSF fsr, 7<br />

$008B $2004 CALL _Delay_1us<br />

$008C $2004 CALL _Delay_1us<br />

$008D $2004 CALL _Delay_1us<br />

$008E $2004 CALL _Delay_1us<br />

$008F $1480 BSF INDF, ____sdai2c<br />

$0090 $2004 CALL _Delay_1us<br />

$0091 $0008 RETURN<br />

$0092 $ _Soft_I2C_Read:<br />

$0092 $3008 MOVLW 8<br />

$0093 $1303 BCF STATUS, RP1<br />

$0094 $1283 BCF STATUS, RP0<br />

$0095 $00A5 MOVWF Soft_I2C_Read_temp_L0<br />

$0096 $01A6 CLRF Soft_I2C_Read_r_L0, 1<br />

$0097 $0820 MOVF ___porti2c, 0<br />

$0098 $0084 MOVWF FSR<br />

$0099 $1383 BCF STATUS, 7<br />

$009A $ L_Soft_I2C_Read_4:<br />

50


$009A $0825 MOVF Soft_I2C_Read_temp_L0, 0<br />

$009B $3C00 SUBLW 0<br />

$009C $1803 BTFSC STATUS, C<br />

$009D $28B4 GOTO L_Soft_I2C_Read_5<br />

$009E $2004 CALL _Delay_1us<br />

$009F $0000 NOP<br />

$00A0 $1480 BSF INDF, ____sdai2c<br />

$00A1 $2004 CALL _Delay_1us<br />

$00A2 $0826 MOVF Soft_I2C_Read_r_L0, 0<br />

$00A3 $1903 BTFSC STATUS, Z<br />

$00A4 $28A5 GOTO L_Soft_I2C_Read_6<br />

$00A5 $ L_Soft_I2C_Read_6:<br />

$00A5 $1400 BSF INDF, ____scli2c<br />

$00A6 $1384 BCF FSR, 7<br />

$00A7 $1C00 BTFSS INDF, ____scli2c<br />

$00A8 $28A7 GOTO $-1<br />

$00A9 $1880 BTFSC INDF, ____sdai2c<br />

$00AA $1403 BSF STATUS, C<br />

$00AB $1C80 BTFSS INDF, ____sdai2c<br />

$00AC $1003 BCF STATUS, C<br />

$00AD $0DA6 RLF FLOC_soft_i2c_read+1, F<br />

$00AE $2004 CALL _Delay_1us<br />

$00AF $2006 CALL _PutZerosToLAT<br />

$00B0 $1784 BSF FSR, 7<br />

$00B1 $1000 BCF INDF, ____scli2c<br />

$00B2 $03A5 DECF Soft_I2C_Read_temp_L0, 1<br />

$00B3 $289A GOTO L_Soft_I2C_Read_4<br />

$00B4 $ L_Soft_I2C_Read_5:<br />

$00B4 $1480 BSF INDF, ____sdai2c<br />

$00B5 $2004 CALL _Delay_1us<br />

$00B6 $0824 MOVF FARG_Soft_I2C_Read+0, 0<br />

$00B7 $1903 BTFSC STATUS, Z<br />

$00B8 $28BA GOTO L_Soft_I2C_Read_7<br />

$00B9 $2006 CALL _PutZerosToLAT<br />

$00BA $ L_Soft_I2C_Read_7:<br />

$00BA $0824 MOVF FARG_soft_i2c_read+0, W<br />

$00BB $1903 BTFSC STATUS, 2<br />

$00BC $28BE GOTO L_07C<br />

$00BD $1080 BCF INDF, ____sdai2c<br />

$00BE $ L_07C:<br />

$00BE $0000 NOP<br />

$00BF $2004 CALL _Delay_1us<br />

$00C0 $1400 BSF INDF, ____scli2c<br />

$00C1 $1384 BCF FSR, 7<br />

$00C2 $1C00 BTFSS INDF, ____scli2c<br />

$00C3 $28C2 GOTO $-1<br />

$00C4 $1784 BSF FSR, 7<br />

$00C5 $2004 CALL _Delay_1us<br />

$00C6 $2006 CALL _PutZerosToLAT<br />

$00C7 $1000 BCF INDF, ____scli2c<br />

51


$00C8 $2004 CALL _Delay_1us<br />

$00C9 $2006 CALL _PutZerosToLAT<br />

$00CA $1080 BCF INDF, ____sdai2c<br />

$00CB $0826 MOVF Soft_I2C_Read_r_L0, 0<br />

$00CC $00F0 MOVWF STACK_0<br />

$00CD $0008 RETURN<br />

$00CE $ GlobalIniI2C:<br />

$00CE $3000 MOVLW 0<br />

$00CF $1303 BCF STATUS, RP1<br />

$00D0 $1283 BCF STATUS, RP0<br />

$00D1 $00A1 MOVWF _i+0<br />

$00D2 $3000 MOVLW 0<br />

$00D3 $00A2 MOVWF _j+0<br />

$00D4 $0008 RETURN<br />

$00D5 $ _Usart_Init:<br />

$00D5 $1303 BCF STATUS, RP1<br />

$00D6 $1683 BSF STATUS, RP0<br />

$00D7 $1698 BSF TXSTA, 5<br />

$00D8 $3090 MOVLW 144<br />

$00D9 $1283 BCF STATUS, RP0<br />

$00DA $0098 MOVWF RCSTA<br />

$00DB $1683 BSF STATUS, RP0<br />

$00DC $1787 BSF TRISC, 7<br />

$00DD $1307 BCF TRISC, 6<br />

$00DE $ L_Usart_Init_0:<br />

$00DE $1283 BCF STATUS, RP0<br />

$00DF $1E8C BTFSS PIR1, 5<br />

$00E0 $28E4 GOTO L_Usart_Init_1<br />

$00E1 $081A MOVF RCREG, 0<br />

$00E2 $00A8 MOVWF Usart_Init_tmp_L0<br />

$00E3 $28DE GOTO L_Usart_Init_0<br />

$00E4 $ L_Usart_Init_1:<br />

$00E4 $0008 RETURN<br />

$00E5 $ _Soft_I2C_Init:<br />

$00E5 $1303 BCF STATUS, RP1<br />

$00E6 $1283 BCF STATUS, RP0<br />

$00E7 $0824 MOVF FARG_Soft_I2C_Init+0, 0<br />

$00E8 $0084 MOVWF FSR<br />

$00E9 $0800 MOVF INDF, 0<br />

$00EA $00A5 MOVWF Soft_I2C_Init_temp_L0<br />

$00EB $10A5 BCF FLOC_Soft_I2C_Init+0, ____sdai2c<br />

$00EC $1025 BCF FLOC_Soft_I2C_Init+0, ____scli2c<br />

$00ED $0825 MOVF Soft_I2C_Init_temp_L0, 0<br />

$00EE $0080 MOVWF INDF<br />

$00EF $1784 BSF FSR, 7<br />

$00F0 $0804 MOVF FSR, 0<br />

$00F1 $00A0 MOVWF ___porti2c<br />

$00F2 $1480 BSF INDF, ____sdai2c<br />

$00F3 $1400 BSF INDF, ____scli2c<br />

$00F4 $1384 BCF FSR, 7<br />

52


$00F5 $1C00 BTFSS INDF, ____scli2c<br />

$00F6 $28F5 GOTO $-1<br />

$00F7 $0008 RETURN<br />

$00F8 $ _main:<br />

;I2C.c,3 :: void main() {<br />

;I2C.c,4 :: TRISA = 0b000011; //Definisanje pinova Porta A<br />

$00F8 $20CE CALL GlobalIniI2C<br />

$00F9 $3003 MOVLW 3<br />

$00FA $1683 BSF STATUS, RP0<br />

$00FB $0085 MOVWF TRISA<br />

;I2C.c,5 :: PORTA = 0;<br />

$00FC $1283 BCF STATUS, RP0<br />

$00FD $0185 CLRF PORTA, 1<br />

;I2C.c,6 :: ADCON1 = 6;<br />

$00FE $3006 MOVLW 6<br />

$00FF $1683 BSF STATUS, RP0<br />

$0100 $009F MOVWF ADCON1<br />

;I2C.c,7 :: delay_ms(1000);<br />

$0101 $3006 MOVLW 6<br />

$0102 $00FC MOVWF STACK_12<br />

$0103 $30FF MOVLW 255<br />

$0104 $00FB MOVWF STACK_11<br />

$0105 $30FF MOVLW 255<br />

$0106 $00FA MOVWF STACK_10<br />

$0107 $0BFC DECFSZ STACK_12, F<br />

$0108 $290A GOTO $+2<br />

$0109 $2911 GOTO $+8<br />

$010A $0BFB DECFSZ STACK_11, F<br />

$010B $290D GOTO $+2<br />

$010C $2910 GOTO $+4<br />

$010D $0BFA DECFSZ STACK_10, F<br />

$010E $290D GOTO $-1<br />

$010F $290A GOTO $-5<br />

$0110 $2907 GOTO $-9<br />

$0111 $301A MOVLW 26<br />

$0112 $00FB MOVWF STACK_11<br />

$0113 $30FF MOVLW 255<br />

$0114 $00FA MOVWF STACK_10<br />

$0115 $0BFB DECFSZ STACK_11, F<br />

$0116 $2918 GOTO $+2<br />

$0117 $291B GOTO $+4<br />

$0118 $0BFA DECFSZ STACK_10, F<br />

$0119 $2918 GOTO $-1<br />

$011A $2915 GOTO $-5<br />

$011B $3042 MOVLW 66<br />

$011C $00FA MOVWF STACK_10<br />

$011D $0BFA DECFSZ STACK_10, F<br />

$011E $291D GOTO $-1<br />

;I2C.c,8 :: PORTA.F3 = !PORTA.F0; // Nacin paljenja LED.<br />

$011F $3001 MOVLW 1<br />

53


$0120 $1283 BCF STATUS, RP0<br />

$0121 $1805 BTFSC PORTA, 0<br />

$0122 $3000 MOVLW 0<br />

$0123 $00F0 MOVWF STACK_0<br />

$0124 $3000 MOVLW 0<br />

$0125 $1870 BTFSC STACK_0, 0<br />

$0126 $3008 MOVLW 8<br />

$0127 $0605 XORWF PORTA, 0<br />

$0128 $3908 ANDLW 8<br />

$0129 $0685 XORWF PORTA, 1<br />

;I2C.c,9 :: PORTA.F2 = !PORTA.F1;<br />

$012A $3001 MOVLW 1<br />

$012B $1885 BTFSC PORTA, 1<br />

$012C $3000 MOVLW 0<br />

$012D $00F0 MOVWF STACK_0<br />

$012E $3000 MOVLW 0<br />

$012F $1870 BTFSC STACK_0, 0<br />

$0130 $3004 MOVLW 4<br />

$0131 $0605 XORWF PORTA, 0<br />

$0132 $3904 ANDLW 4<br />

$0133 $0685 XORWF PORTA, 1<br />

;I2C.c,11 :: i.F0 = !PORTA.F1;<br />

$0134 $3001 MOVLW 1<br />

$0135 $1885 BTFSC PORTA, 1<br />

$0136 $3000 MOVLW 0<br />

$0137 $00F0 MOVWF STACK_0<br />

$0138 $3000 MOVLW 0<br />

$0139 $1870 BTFSC STACK_0, 0<br />

$013A $3001 MOVLW 1<br />

$013B $0621 XORWF _i, 0<br />

$013C $3901 ANDLW 1<br />

$013D $06A1 XORWF _i, 1<br />

;I2C.c,12 :: i.F1 = !PORTA.F0;<br />

$013E $3001 MOVLW 1<br />

$013F $1805 BTFSC PORTA, 0<br />

$0140 $3000 MOVLW 0<br />

$0141 $00F0 MOVWF STACK_0<br />

$0142 $3000 MOVLW 0<br />

$0143 $1870 BTFSC STACK_0, 0<br />

$0144 $3002 MOVLW 2<br />

$0145 $0621 XORWF _i, 0<br />

$0146 $3902 ANDLW 2<br />

$0147 $06A1 XORWF _i, 1<br />

;I2C.c,14 :: Usart_init(2400);<br />

$0148 $3067 MOVLW 103<br />

$0149 $1683 BSF STATUS, RP0<br />

$014A $0099 MOVWF SPBRG<br />

$014B $1518 BSF TXSTA, BRGH<br />

$014C $20D5 CALL _Usart_Init<br />

;I2C.c,15 :: Usart_Write(i);<br />

54


$014D $0821 MOVF _i, 0<br />

$014E $00A4 MOVWF FARG_Usart_Write+0<br />

$014F $2016 CALL _Usart_Write<br />

;I2C.c,16 :: Soft_I2C_Config(&PORTD, 1, 0); // Inicijalizacija USART terminala<br />

$0150 $3008 MOVLW PORTD<br />

$0151 $00A4 MOVWF FARG_Soft_I2C_Init+0<br />

$0152 $20E5 CALL _Soft_I2C_Init<br />

;I2C.c,17 :: Soft_I2C_Start(); // Pocetak upisa<br />

$0153 $2026 CALL _Soft_I2C_Start<br />

;I2C.c,18 :: Soft_I2C_Write(0xA2); // Adresa 24C02<br />

$0154 $30A2 MOVLW 162<br />

$0155 $00A4 MOVWF FARG_Soft_I2C_Write+0<br />

$0156 $2035 CALL _Soft_I2C_Write<br />

;I2C.c,19 :: Soft_I2C_Write(i); // Pocetna lokacija<br />

$0157 $0821 MOVF _i, 0<br />

$0158 $00A4 MOVWF FARG_Soft_I2C_Write+0<br />

$0159 $2035 CALL _Soft_I2C_Write<br />

;I2C.c,21 :: while ((j < 10)&& (i!=0)) {<br />

$015A $ L_main_0:<br />

$015A $300A MOVLW 10<br />

$015B $0222 SUBWF _j, 0<br />

$015C $1803 BTFSC STATUS, C<br />

$015D $2982 GOTO L_main_1<br />

$015E $0821 MOVF _i, 0<br />

$015F $3A00 XORLW 0<br />

$0160 $1903 BTFSC STATUS, Z<br />

$0161 $2982 GOTO L_main_1<br />

$0162 $ L64_ex_L_main_1:<br />

;I2C.c,24 :: Soft_I2C_Write(2*i+j);<br />

$0162 $3001 MOVLW 1<br />

$0163 $00F4 MOVWF STACK_4<br />

$0164 $0821 MOVF _i, 0<br />

$0165 $00F0 MOVWF STACK_0<br />

$0166 $0874 MOVF STACK_4, 0<br />

$0167 $ L_main_7:<br />

$0167 $1903 BTFSC STATUS, Z<br />

$0168 $296D GOTO L_main_8<br />

$0169 $0DF0 RLF STACK_0, 1<br />

$016A $1070 BCF STACK_0, 0<br />

$016B $3FFF ADDLW 255<br />

$016C $2967 GOTO L_main_7<br />

$016D $ L_main_8:<br />

$016D $0822 MOVF _j, 0<br />

$016E $0770 ADDWF STACK_0, 0<br />

$016F $00A4 MOVWF FARG_Soft_I2C_Write+0<br />

$0170 $2035 CALL _Soft_I2C_Write<br />

;I2C.c,25 :: Usart_Write(2*i+j);<br />

$0171 $3001 MOVLW 1<br />

$0172 $00F4 MOVWF STACK_4<br />

$0173 $0821 MOVF _i, 0<br />

55


$0174 $00F0 MOVWF STACK_0<br />

$0175 $0874 MOVF STACK_4, 0<br />

$0176 $ L_main_9:<br />

$0176 $1903 BTFSC STATUS, Z<br />

$0177 $297C GOTO L_main_10<br />

$0178 $0DF0 RLF STACK_0, 1<br />

$0179 $1070 BCF STACK_0, 0<br />

$017A $3FFF ADDLW 255<br />

$017B $2976 GOTO L_main_9<br />

$017C $ L_main_10:<br />

$017C $0822 MOVF _j, 0<br />

$017D $0770 ADDWF STACK_0, 0<br />

$017E $00A4 MOVWF FARG_Usart_Write+0<br />

$017F $2016 CALL _Usart_Write<br />

;I2C.c,27 :: j++;<br />

$0180 $0AA2 INCF _j, 1<br />

;I2C.c,28 :: }<br />

$0181 $295A GOTO L_main_0<br />

$0182 $ L_main_1:<br />

;I2C.c,29 :: Soft_I2C_Stop();<br />

$0182 $207E CALL _Soft_I2C_Stop<br />

;I2C.c,31 :: j=0;<br />

$0183 $01A2 CLRF _j, 1<br />

;I2C.c,32 :: if (i==0) {<br />

$0184 $0821 MOVF _i, 0<br />

$0185 $3A00 XORLW 0<br />

$0186 $1D03 BTFSS STATUS, Z<br />

$0187 $29C4 GOTO L_main_4<br />

;I2C.c,33 :: delay_ms(100);<br />

$0188 $3082 MOVLW 130<br />

$0189 $00FB MOVWF STACK_11<br />

$018A $30FF MOVLW 255<br />

$018B $00FA MOVWF STACK_10<br />

$018C $0BFB DECFSZ STACK_11, F<br />

$018D $298F GOTO $+2<br />

$018E $2992 GOTO $+4<br />

$018F $0BFA DECFSZ STACK_10, F<br />

$0190 $298F GOTO $-1<br />

$0191 $298C GOTO $-5<br />

$0192 $3087 MOVLW 135<br />

$0193 $00FA MOVWF STACK_10<br />

$0194 $0BFA DECFSZ STACK_10, F<br />

$0195 $2994 GOTO $-1<br />

$0196 $0000 NOP<br />

;I2C.c,35 :: while (j < 32) { // Citanje lokacije EEPROM-a<br />

$0197 $ L_main_5:<br />

$0197 $3020 MOVLW 32<br />

$0198 $0222 SUBWF _j, 0<br />

$0199 $1803 BTFSC STATUS, C<br />

$019A $29B1 GOTO L_main_6<br />

56


;I2C.c,36 :: Soft_I2C_Start();<br />

$019B $2026 CALL _Soft_I2C_Start<br />

;I2C.c,37 :: Soft_I2C_Write(0xA2); // Adresa 24C02<br />

$019C $30A2 MOVLW 162<br />

$019D $00A4 MOVWF FARG_Soft_I2C_Write+0<br />

$019E $2035 CALL _Soft_I2C_Write<br />

;I2C.c,38 :: Soft_I2C_Write(j);<br />

$019F $0822 MOVF _j, 0<br />

$01A0 $00A4 MOVWF FARG_Soft_I2C_Write+0<br />

$01A1 $2035 CALL _Soft_I2C_Write<br />

;I2C.c,39 :: Soft_I2C_Stop();<br />

$01A2 $207E CALL _Soft_I2C_Stop<br />

;I2C.c,40 :: Soft_I2C_Start();<br />

$01A3 $2026 CALL _Soft_I2C_Start<br />

;I2C.c,41 :: Soft_I2C_Write(0xA3);<br />

$01A4 $30A3 MOVLW 163<br />

$01A5 $00A4 MOVWF FARG_Soft_I2C_Write+0<br />

$01A6 $2035 CALL _Soft_I2C_Write<br />

;I2C.c,42 :: k = Soft_I2C_Read(0); // Citanje<br />

$01A7 $01A4 CLRF FARG_Soft_I2C_Read+0, 1<br />

$01A8 $2092 CALL _Soft_I2C_Read<br />

$01A9 $0870 MOVF STACK_0, 0<br />

$01AA $00A3 MOVWF _k<br />

;I2C.c,43 :: Usart_Write(k);<br />

$01AB $0870 MOVF STACK_0, 0<br />

$01AC $00A4 MOVWF FARG_Usart_Write+0<br />

$01AD $2016 CALL _Usart_Write<br />

;I2C.c,44 :: Soft_I2C_Stop();<br />

$01AE $207E CALL _Soft_I2C_Stop<br />

;I2C.c,45 :: j++;<br />

$01AF $0AA2 INCF _j, 1<br />

;I2C.c,47 :: }<br />

$01B0 $2997 GOTO L_main_5<br />

$01B1 $ L_main_6:<br />

;I2C.c,48 :: delay_ms(100);<br />

$01B1 $3082 MOVLW 130<br />

$01B2 $00FB MOVWF STACK_11<br />

$01B3 $30FF MOVLW 255<br />

$01B4 $00FA MOVWF STACK_10<br />

$01B5 $0BFB DECFSZ STACK_11, F<br />

$01B6 $29B8 GOTO $+2<br />

$01B7 $29BB GOTO $+4<br />

$01B8 $0BFA DECFSZ STACK_10, F<br />

$01B9 $29B8 GOTO $-1<br />

$01BA $29B5 GOTO $-5<br />

$01BB $3087 MOVLW 135<br />

$01BC $00FA MOVWF STACK_10<br />

$01BD $0BFA DECFSZ STACK_10, F<br />

$01BE $29BD GOTO $-1<br />

$01BF $0000 NOP<br />

57


;I2C.c,49 :: Usart_Write(j-1);<br />

$01C0 $0322 DECF _j, 0<br />

$01C1 $00A4 MOVWF FARG_Usart_Write+0<br />

$01C2 $2016 CALL _Usart_Write<br />

;I2C.c,50 :: j=0;<br />

$01C3 $01A2 CLRF _j, 1<br />

;I2C.c,53 :: }<br />

$01C4 $ L_main_4:<br />

;I2C.c,54 :: }//~!<br />

$01C4 $29C4 GOTO $<br />

Heksadecimalni kôd<br />

:10000000F828FF3FFF3FFF3F0000080004080313EC<br />

:100010008312AA002008840084130008A900A910F4<br />

:100020002910290880002A088400080000300313E2<br />

:10003000831698180130F1007108003A031D222838<br />

:100040000000162883122408990008000313831265<br />

:100050002008840083138014042000140420062048<br />

:1000600080100420062000100800083003138312BB<br />

:10007000A500A601200884008313250803195A2827<br />

:100080000420042006200010042024080319482816<br />

:100090000620A40D031C4F288417801451288417B0<br />

:1000A00080100000042000148413001C55288417BD<br />

:1000B000A5033D28A601042006200000001004200E<br />

:1000C00080140420042026080319662800148413D1<br />

:1000D000001C6828A601042084138018261404201C<br />

:1000E00004200420042004200420042004200620EE<br />

:1000F0008417001080102608F000080003138312F4<br />

:100100002008840083130620801004200014841328<br />

:10011000001C882884170420042004200420801454<br />

:1001200004200800083003138312A500A60120084C<br />

:10013000840083132508003C0318B4280420000021<br />

:100140008014042026080319A52800148413001C19<br />

:10015000A72880180314801C0310A60D0420062075<br />

:1001600084170010A5039A2880140420240803197A<br />

:10017000BA28062024080319BE2880100000042095<br />

:1001800000148413001CC2288417042006200010C9<br />

:100190000420062080102608F00008000030031319<br />

:1001A0008312A1000030A2000800031383169816E2<br />

:1001B00090308312980083168717071383128C1EC2<br />

:1001C000E4281A08A800DE28080003138312240874<br />

:1001D00084000008A500A5102510250880008417BC<br />

:1001E0000408A000801400148413001CF5280800E3<br />

:1001F000CE200330831685008312850106308316D6<br />

:100200009F000630FC00FF30FB00FF30FA00FC0BC3<br />

:100210000A291129FB0B0D291029FA0B0D290A298E<br />

58


:1002200007291A30FB00FF30FA00FB0B18291B29A5<br />

:10023000FA0B182915294230FA00FA0B1D29013052<br />

:10024000831205180030F0000030701808300506E1<br />

:1002500008398506013085180030F000003070182C<br />

:100260000430050604398506013085180030F00099<br />

:1002700000307018013021060139A106013005183F<br />

:100280000030F00000307018023021060239A1065B<br />

:100290006730831699001815D5202108A400162070<br />

:1002A0000830A400E5202620A230A4003520210833<br />

:1002B000A40035200A302202031882292108003ABE<br />

:1002C000031982290130F4002108F0007408031991<br />

:1002D0006D29F00D7010FF3F672922087007A400F8<br />

:1002E00035200130F4002108F000740803197C293E<br />

:1002F000F00D7010FF3F762922087007A400162029<br />

:10030000A20A5A297E20A2012108003A031DC4290D<br />

:100310008230FB00FF30FA00FB0B8F299229FA0B89<br />

:100320008F298C298730FA00FA0B9429000020309D<br />

:1003300022020318B1292620A230A4003520220869<br />

:10034000A40035207E202620A330A4003520A4015F<br />

:1003500092207008A3007008A40016207E20A20A34<br />

:1003600097298230FB00FF30FA00FB0BB829BB292C<br />

:10037000FA0BB829B5298730FA00FA0BBD2900001D<br />

:100380002203A4001620A201C429FF3FFF3FFF3F24<br />

:02400E00313D42<br />

:00000001FF<br />

Softver IC-Prog<br />

Za programiranje mikrokontrolera PIC16F877A može da se koristi softver<br />

IC-Prog. Inače, ovaj softver je kompatibilan sa mnogim bootstrap loader-ima,<br />

kao što su JDM Programmer, TAFE Programmer, TAIT Programmer,<br />

Conquest Programmer, ProPIC 2 Programmer itd. ICProg poseduje<br />

mogućnost čitanja, upisa i verifikacije (Read, Write, Verify) sadržaja<br />

mikrokontrolera. Naravno, softver dozvoljava mogućnost podešavanja<br />

parametara (WDT, PWRT, BODEN, LVP, CPD, CO, Debugger), kao i izbor<br />

oscilatora (RC, LP, XT, HS).<br />

Program IC-Prog se ne instalira na računaru, već se pokreće direktno –<br />

tačnije, klikom na fajl ICPROG.EXE (Sl. 30).<br />

Slika 30. Startovanje programa<br />

59


Ako programer ima računar sa verzijom Windows-a «višom» od<br />

Windows-a 98, odmah po startovanju progra-ma IC-Prog na ekranu će se<br />

pojaviti prozor sa upozorenjem, koji je prikazan na Slika 31. Razlog je što su<br />

kod svih Windows-a sa platformom NT zaštićeni portovi. Zbog toga je<br />

neophodno da se instalira odgovarajući drajver.<br />

Slika 31. Upozorenje prilikom pokretanja programa<br />

Korak 1. Instaliranje drajvera<br />

Ulaskom u podmeni Misc, koji se nalazi u meniju Options, ostvaruje se<br />

instaliranje/uključivanje drajvera icprog.sys (Settings → Options → Misc: √<br />

Enable 2000/NT/XP), što je ilustrovano na Slika 32. Na taj način omogućava se<br />

pristup serijskom portu računara. Isto tako, neophodno je da se prioritet<br />

programiranja postavi ili na High ili na Realtime, a nikako na Normal. Ovo<br />

potonje je veoma bitno. Naime, program po startovanju automatski podesi<br />

normalan prioritet i ukoliko se ne promeni na High ili Realtime, računar ne<br />

može da pristupi PIC mikrokontrolerima preko serijskog porta.<br />

60


Slika 32 Uključivanje drajvera i prioriteta<br />

Slika 33. Podešavanje parametara programa<br />

61


Korak 2. Podešavanje hardverskih parametara<br />

Nakon što je instaliran/uključen drajver, program će se restartovati i<br />

ponudiće opciju podešavanja hardverskih parametara, koji treba da budu<br />

postavljeni kao na Slika 33. Ic-Prog ima sličnu konfiguraciju kao JDM<br />

Programmer, signali su bez inverzije – dok se komunikacija obavlja preko, na<br />

primer, serijskog porta COM2. Ako računar ima samo jedan serijski port,<br />

podrazumeva se da je to COM1.<br />

Softver mikroC<br />

mikroC predstavlja moćan softverski alat, koji je razvila beogradska<br />

Mikroelektronika, i namenjen je pisanju kôda za Microchip-ove PIC<br />

mikrokontrolere. Koristeći mikroC, programeru je omogućen jednostavan način<br />

da kontroliše proces programiranja i napravi kvalitetan firmware.<br />

Osnovne karakteristike programa mikroC su sledeće:<br />

Pisanje C kôda korišćenjem kvalitetnog editora, što se ogleda<br />

automatskom kontrolom i upozorenjima vezanim za sintaksu kôda,<br />

korišćenih parametara, kao i automatskoj korekciji pojedinih grešaka<br />

Preglednost strukture programa (kôda), promenljivih i funkcija<br />

omogućava Code explorer<br />

Jasan asemblerski kôd i standardna kompatibilnost generisanih HEX<br />

datoteka toka programa preko ugrađeg debagera (debugger)<br />

Programer ima na raspolaganju veliki broj integrisanih biblioteka i<br />

rutina, koje značajno ubrzavaju pisanje programa<br />

Detaljan izveštaj i grafičko predstavljanje RAM i ROM mape,<br />

statistike kôda i slično.<br />

Moramo da napomenemo kako mikroC odstupa od ANSI standarda u<br />

nekoliko segmenata. Neka odstupanja su načinjena su u cilju da se olakša<br />

programiranje, dok su druge rezultat hardverskih ograničenja PIC<br />

mikrokontrolera. Pomenućemo neke specifičnosti:<br />

Rekurzivne funkcije (function recursion) su podržane sa izvesnim<br />

ograničenjima, koja su posledica nešto složenijeg pristupa magacinu<br />

(stack) i ograničenja vezana za memoriju<br />

Pokazivači (pointers) promenljivih i pokazivači konstanti nisu<br />

kompatibilni, tj. nije moguća međusobna dodela ili upoređivanje<br />

mikroC tretira označavanje const kao “true constans” (kod C++),<br />

što omogućava koriš-ćenje const objekta na mestima gde ANSIC<br />

62


očekuje constant izraz .Ukoliko se teži ka prenosivosti programa,<br />

treba koristiti tradicionalno pretprocesorsko definisanje konstanti<br />

mikroC dozvoljava C++ stil jednolinijskih komentara, koristeći dve<br />

kose crte (//). Komentar može da počne bilo gde i traje do sledeće<br />

nove linije programskog kôda<br />

Brojne standardne C biblioteke (ctype, math, stdlib, string )<br />

implementirane su u mikroC, uz individualna odstupanja.<br />

Napominjemo da mikroC podržava gotovo sve PIC mikrokontrolere serija<br />

12, 16 i 18. Izuzetak su mikrokontroleri koji imaju staro hardversko jezgro kao<br />

na primer PIC12C508, PIC12F508, PIC12C509, PIC12F509 itd. Inače, ograničena<br />

verzija (do 2KB programa) može da s preuzme sa sajta Mikroelektronike<br />

(www.mikroe.com). U sličaju ako se želi potpuna verzija (neograničen kapacitet<br />

programa), mora da se plati licenca od 99€.<br />

UART terminal<br />

Slici 34. Pokretanje terminala mikroC-a preko Tools → USART Terminal<br />

Na Slici 34 ilustrovano je startovanje internog (softverskog) terminala za<br />

UART komunikaciju.<br />

Na Slici 35 je prikazan izgled prozora UART terminala. Kao što se vidi,<br />

moguće je podesiti veliki broj parametara. Navešćemo najvažnije:<br />

63


Serijski port (u padajućem meniju treba izabrati željeni serijski port, a<br />

kod standardnih računara to su COM1 i COM2)<br />

Brzina prenosa (za frekvenciju kvarca od 4MHz treba izabrati 2400<br />

bauda, za 8MHz bira se 9600 bauda itd.)<br />

Broj stop bitova (1, 1.5 i 2)<br />

Izbor parnosti (bez, parna, neparna itd.)<br />

Broj bitova koji čine karakter (5, 6, 7 ili 8)<br />

Uključivanje/isključivanje handshaking signala (RTS i DTR)<br />

Izbor formata podatka koji se šalje (ASCII, heksadecimalni - HEX ili<br />

dekadni - DEC)<br />

Način slanja (odmah po kucanju ili kada se klikne na opciju SEND) itd.<br />

Slika 35. Izgled prozora kod UART komunikacionog terminala<br />

Čim se podese parametri, terminal se startuje klikom na komandno dugme<br />

Connect. Odmah zatim, terminal je spreman da prihvati komande (vidi Sliku<br />

36). Kada se završi komunikacija, treba kliknuti na komandno dugme<br />

Disconnect.<br />

64


Laboratorijska vežba<br />

(I)<br />

Podesiti parametre USART terminala (COM1, 2400bauda, One Stop Bit)<br />

Startovati program terminala pritiskom na komandno dugme Connect:<br />

Postaviti DIPSW2 prekidače u isključeno stanje (stanje «01» ili Off_On).<br />

Dovesti napajanje mikrokontroleru, odnosno uređaju.<br />

Posle jedne sekunde treba da se upali samo žuta LED na štampanoj ploči.<br />

Na ekranu će se pojaviti povorka osmobitnih reči:<br />

prva reč čini početnu adresu sa koje počinje upis (0x01), zatim sadržaj na<br />

toj memorijskoj lokaciji (0x02), zatim se upisuje sadržaj susedne<br />

memorijske lokacije (0x03) itd. Ukupno se upisuje 10 osmobitnih reči u<br />

deset susednih memorijskih lokacija, što je ilustrovano na Slici 36.<br />

Pritiskom na taster TT1, mikrokontroler se resetuje i on počinje da<br />

izvršava program iznova.<br />

Isključiti napajanje uređaja, isključiti USART terminal na komandno<br />

dugme Disconnect.<br />

Slika 36. Prozor USART terminala (DIPSW2 = «01»)<br />

65


Prebaciti serijski EEPROM 24C02 u donje podnožje, koje je bliže<br />

konektoru DB9F.<br />

Startovati program IC-Prog, klikom na ikonicu.<br />

Izabrati memoriju 24C02 kao što je prikazano na Slici 37.<br />

Pritiskom na taster «F8» pročitati sadržaj memorije (ovo može da se uradi<br />

i iz Command menija).<br />

Na Slici 38 je prikazan sadržaj memorije.<br />

Obrisati memoriju na načina ilustrovan na Slikama 39-40 (učitati<br />

blank.hex fajl i programirati pritiskom na taster «F5»). Brisanje može da<br />

se obavi i na drugi način, tj. učitavanjem sadržaja praznog bafera (npr.<br />

Buffer 2).<br />

Slika 37. Izbor memorije 24C02 u programu IC-Prog<br />

66


Slika 38. Sadržaj memorije 24C02 za DIPSW2 = «01»<br />

Slika 39. Fajl blank.hex se učitava iz File menija<br />

67


Slika 40. Sadržaj prozora posle koga treba pritisnuti «F5» za programiranje<br />

(II)<br />

Podesiti parametre USART terminala (COM1, 2400bauda, One Stop Bit)<br />

Startovati program terminala pritiskom na komandno dugme Connect:<br />

Postaviti DIPSW2 prekidače u isključeno stanje (stanje «11» ili On_On).<br />

Dovesti napajanje mikrokontroleru.<br />

Posle dve sekunde treba da se upale obe diode.<br />

Na ekranu će se pojaviti povorka osmobitnih reči:<br />

prva reč čini početnu adresu sa koje počinje upis (0x03), zatim sadržaj na<br />

toj memorijskoj lokaciji (0x06), zatim se upisuje sadržaj susedne<br />

memorijske lokacije (0x07) itd. Ukupno se upisuje 10 osmobitnih reči u<br />

deset memorijskih lokacija (Slika 41).<br />

Isključiti napajanje uređaja, isključiti USART terminal na komandno<br />

dugme Disconnect.<br />

68


Prebaciti serijski EEPROM 24C02 u donje podnožje, koje je bliže<br />

konektoru DB9F.<br />

Startovati program IC-Prog, klikom na ikonicu.<br />

Izabrati memoriju 24C02 kao što je prikazano na Slici 37.<br />

Pritiskom na taster «F8» pročitati sadržaj memorije (ovo može da se uradi<br />

i iz Command menija).<br />

Na Slici 8 je prikazan sadržaj memorije.<br />

Obrisati memoriju na načina ilustrovan na Slikama 39-40 (učitati fajl<br />

blank.hex i programirati pritiskom na taster «F5»).<br />

Slika 41.. Prozor USART terminala (DIPSW2 = «11»)<br />

69


Napomena:<br />

Slika 42. Sadržaj memorije 24C02 za DIPSW2 = «11»<br />

Posle svake operacije upisa serijskog EEPROM-a i provere sadržaja,<br />

vršiti brisanje EEPROM-a 24C02.<br />

(III)<br />

Ponoviti postupak za stanja DIPSW2 = «10» . Treba da se dobije sadržaj<br />

serijskog EEPROM-a, kao na Slici 42.<br />

70


(iv)<br />

Slika 42. Sadržaj memorije 24C02 za DIPSW2 = «10»<br />

Prebaciti serijski EEPROM 24C02 u donje podnožje, koje je bliže<br />

konektoru DB9F.<br />

Startovati program IC-Prog i u njemu proizvoljno upisati sadržaj prvih 20<br />

memorijskih lokacija serijskog EEPROM-a.<br />

Postaviti DIPSW2 prekidače u isključeno stanje (stanje «00» ili Off_Off).<br />

Startovati program USART terminal.<br />

Dovesti napajanje mikrokontroleru, odnosno uređaju.<br />

Posle jedne sekunde ne treba da se upale diode.<br />

Na ekranu će se pojaviti povorka od 20 osmobitnih reči koje su upisane<br />

programom IC-Prog.<br />

Proces je ilustrovan na slikama 43 i 44. Na Slici 44 su povorka<br />

osmobitnih reči započinje prvom (0x00), a završava se krajnjom adresom<br />

(0x19).<br />

71


Slika 43. Sadržaj memorije 24C02 posle proizvoljnog programiranja<br />

72


Zaključak<br />

Slika 44.. Prozor USART terminala (DIPSW2 = «00»)<br />

U radu smo se bavili praktičnom realizacija upisa i čitanja sadržaja serijskog<br />

EEPROM-a preko mikrokontrolera PIC16F877-04 i softvera IC-Prog.<br />

Najpre smo opisali serijsku komunikaciju kod PC računara, koja je u ovom<br />

slučaju ostvarena preko kola MAX232 koje prilagođava naponske nivoe<br />

između serijskog porta računara i mikrokontrolera.<br />

U trećem poglavlje je opisan serijski EEPROM 24C02, uz odgovarajuće<br />

slike samog kola i njegove karakteristike.<br />

U četvrtom poglavlju opisane su opšte karakteristike mikrokontrolera, dok<br />

peto i šesto poglavlje opisuje funkcionalne jedinice mikrokontrolera, RISK<br />

procesore, kao i HARVARD arhitekturu.<br />

73


Poglavlja 7, 8, 9 i 10 vezana su konkretno za mikrokontroler koji je<br />

iskorišćen za ovaj projekat (PIC16F877-04).<br />

Zatim su prikazane blok šema i električna šema uređaja koji predstavlja<br />

spregu mikrokontrolera PIC16F877-04 i serijskog EEPROM-a 24C02.<br />

Na kraju je opisan postupak izvođenja laboratorijske vežbe, gde studenti<br />

mogu da se upoznaju sa načinom upisa i iščitavanja sadržaja serijskog<br />

EEPROM-a.<br />

Literatura<br />

[1] PIC16F87X, Datasheet, Microchip Tecnology, http://www.microchip.com<br />

[2] 24C0xx, Serial EEPROM, http://datasheetarchive.com<br />

[3] Serijska komunikacija računara i USART modula mikrokontrolera<br />

PIC16F877A, Dejan Lazić, Ivan Novaković, Elektronski fakultet - Niš,<br />

(seminarski rad), http://es.elfak.ni.ac.yu/students.html<br />

[4] Softver mikroC, Mikroelektronika - Beograd, http://mikroe.com<br />

[5] IC-Prog, Version 1.05, http://www.ic-prog.com<br />

[6] Serijski EEPROM, http://www.mikroe.com/sr/tools/eeprom<br />

[7] Mikrokontroleri, http://milan.milanovic.org/skola/mikkon/mikkon-06.htm<br />

74


Ime<br />

Prezime<br />

Datum rođenja<br />

Bračno stanje<br />

Adresa stanovanja<br />

E-mail adresa<br />

Obrazovanje<br />

Stepen stručne spreme<br />

Godina upisa na<br />

Elektronski fakultet<br />

Smer<br />

Poznavanje jezika<br />

Poznavanje softvera<br />

Interesovanja<br />

Osobine<br />

Ostalo<br />

Darko<br />

Prvulović<br />

08.05.1982.<br />

Neoženjen<br />

Đ. A. Kuna 13/9, Bor<br />

darko019@gmail.com<br />

„Mašinsko-elektrotehnička škola“ - Bor<br />

IV stepen, elektrotehničar elektronike<br />

2001.<br />

Telekomunikacije (T)<br />

Engleski (napredno)<br />

MS Office, CorelDRAW, Windows okruženje,<br />

Adobe Photoshop, ACDSee<br />

Mobilne komunikacije i mobilna telefonija, bežični<br />

linkovi, kablovska televizija<br />

Ambicioznost, temeljnost, tačnost...<br />

Više puta učesnik okružnih takmičenja iz<br />

matemetike u osnovnoj i srednjoj školi, član „FK<br />

Bor“ (1990-1996)<br />

75


Ime Ivan<br />

Prezime Trucić<br />

Datum rođenja 15.02.1977.<br />

Bračno stanje Neoženjen<br />

Adresa stanovanja Vojvode Mišića 17<br />

E-mail adresa trucic@gmail.com<br />

Obrazovanje Tehnička škola Zaječar<br />

Stepen stručne spreme IV stepen, Elektrotehničar automatike<br />

Godina upisa na<br />

Elektronski fakultet<br />

1997.<br />

Smer Telekomunikacije (T)<br />

Poznavanje jezika Engleski (napredno)<br />

Poznavanje softvera Windows operativni sistem, Microsoft<br />

Interesovanja<br />

Osobine<br />

Ostalo<br />

Office, Adobe Photoshop<br />

Elektronika, programiranje, mobilne<br />

komunikacije, satelitske komunikacije,<br />

fotografija, sport<br />

Istrajnost, samouverenost, komunikativnost<br />

Učesnik takmičenja iz matematike u<br />

osnovnoj i srednjoj školi, aktivno bavljenje<br />

sportom(odbojka i košarka)<br />

76

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!