pdf - Univerzitet u Nišu
pdf - Univerzitet u Nišu
pdf - Univerzitet u Nišu
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