Professional Documents
Culture Documents
ITrucic - DPrvulovic - Programiranje Serijskog EEPROM-A Mikrokontrolerom PIC16F877A
ITrucic - DPrvulovic - Programiranje Serijskog EEPROM-A Mikrokontrolerom PIC16F877A
ELEKTORNSKI FAKULTET
KATEDRA ZA ELEKTRONIKU
Studenti:
Darko Prvulović 10610
Ivan Trucić 9264
Mentor:
Mile K. Stojčev, prof. dr.
1
Sadržaj
Uvod.................................................................................3
Serijska komunikacija – RS232.......................................4
Serijski EEPROM...........................................................10
Opšte karakteristike mikrokontrolera.............................15
Funkcionalne jedinice mikrokontrolera..........................16
RISK procesori i HARVARD arhitektura......................20
Mikrokontroler PIC16F877............................................22
Osnovne karakteristike mikrokontrolera........................25
Arhitektura mikrokontrolera..........................................26
Realizacija projektnog zadatka.......................................41
Program u mikroC-u.......................................................46
Program u asembleru......................................................47
Heksadecimalni kod.......................................................58
Sotver ICprog.................................................................59
Softver microC...............................................................62
UART terminal...............................................................63
Laboratorijska vežba......................................................65
Zaključak........................................................................73
Literatura........................................................................74
Kraće biografije autora...................................................75
2
Uvod
Osnovna ideja ovog projekta je praktična realizacija upisa i čitanja sadržaja
serijskog EEPROM-a uz pomoć mikrokontrolera PIC16F877A.
U drugom poglavlju ukratko je objašnjena serijska komunikacija na PC
računarima, koja je u ovom slučaju realizovana uz pomoć kola MAX232 koje
ima ulogu prilagođenja između serijskog porta računara i samog uređaja.
Treće poglavlje opisuje serijski EEPROM 24C02 uz odgovarajuće slike
samog kola i karakteristike.
U četvrtom poglavlju opisane su opšte karakteristike mikrokontrolera, dok
peto i šesto poglavlje opisuje funkcionalne jedinice mikrokontrolera, RISK
procesore, kao i HARVARD arhitekturu. Poglavlja 7, 8, 9 i 10 vezana su
konkretno za mikrokontroler koji je iskorišćen za ovaj projekat (PIC16F877).
7. poglavlje opisuje pomenuti mikrokontroler, a prikazan je i njegov fizički
izgled. U 8., 9., i 10. poglavlju, redom su opisane osnovne karakteristike
mikrokontrolera, arhitektura mikrokontrolera, kao i oranizacija njegove
memorije.
Projektni zadatak, kao i programski kod u microC-u, program u asembleru
i heksadecimalni kod, redom su opisani u poglavljima 11, 12, 13 i 14. Poglavlja
15, 16, 17 opisuju način instalacije programa Icprog, microC i podešavanje
parametara UART terminala.
Laboratorijska vežba je detaljno opisana u osamnaestom poglavlju, da bi
na kraju izveli zaključak i dali spisak literature korišćene prilikom izrade ovog
projekta. Priložene su i kratke biografije autora projekta.
Uz projekat su priloženi izvodi data sheet-ova serijskog EEPROMA 24C02
i mikrokontrolera PIC16F877.
3
Serijska komunikacija – RS232
Komunikaciju mikrokontrolera sa računarom, odnosno zadavanje određenih
naredbi, vršimo preko RS232 linije. U tekstu koji sledi objasnićemo serijsku
komunikaciju između računara i mikrokontrolera AT89S8253.
‘Telecommunication Industry Association, 1997-e godine izdala je TIA 232
Version F serijsko komunikacijski protokol poznat kao RS 232 (Recommended
Standard) protokol.
RS232 standard je široko korišćen pri prenosu podataka brzinama u
granicama od 115 do 330 kb/s, a maksimalna razdaljina za komunikaciju je oko
30 metra.
RS 232 predstavlja peer-to-peer komunikacijski standard, tako da je
pogodan za aplikacije koje sadrže 2 čvora gde je na svakom od njih
mikrokontroler ili računar, tako da možemo povezati jedan mikrokontroler za
jedan PC.
Pretpostavimo da brzina kojom šaljemo podatke sa računara 9600 baud-a
odnosno 9600 bita u sekundi, što je i široko preporučljiva brzina za bezbedno
slanje podataka. U tom slučaju će za slanje jednog bajta, plus jedan start i jedan
stop bit, biti potrebno 1ms.
Na Slici 1. prikazan je jedan od nacina realizacije serijske komunikacije
MAX232 kolom.
4
Slika 2. Raspored pinova kod kola MAX232
5
Slika 3. Fizičke dimenzije MAX232 kola
6
Equipment) i DTE (Data Terminal Equipment). DCE koriste modemi, ploteri i
sl. dok se DTE koristi za vezu između PC računara. Električne osobine serijskog
porta su definisane EIA (Electronics Industry Association) RS232C
standardom, čiji su parametri:
7
Slika 5. Raspored pinova na konektoru DSUB-25
8
Situacija kada nema slanja podatka, tj. linija je slobodna, označena je
MARK naponom. Prenos počinje kada linija pređe u SPACE stanje, što
predstavlja START bit. Iza start bita dolaze bitovi podataka i to tako da je
jedinica predstavljena negativnim naponom, a nula pozitivnim. Ovo je najčešće
u suprotnosti sa ustaljenom logikom da je +5 V logička jedinica, a 0 V logička
nula. Problem rešava prijemno kolo (npr. MAX232, ST232, ICL232,
MAX3232, ST3232, ICL3232 itd.) konvertujući napo-ne tako da su prilagođeni
naponima interfejsa koji se koristi. Posle bita podatka dolazi bit parnosti koji se
koristi za detekciju jednostruke greške u prenosu. Iza bita parnosti signal se
postavlja u MARK stanje što označava početak STOP bita. Prema RS232
standardu broj stop bitova može biti: 1, 1.5 ili 2. Nakon završetka STOP bitova,
linija je spremna za slanje novog karaktera. PC računari koriste kao DATA bite
najčešće 7 ili 8 bita. Između slanja dva karaktera linija se nalazi u MARK
stanju, a u toku prenosa više puta prelazi iz MARK u SPACE stanje u zavisnosti
od broja jedinica i nula. To znači da se linija može nalaziti u SPACE stanju
najviše u slučaju kada karakter sadrži sve nule. Ova osobina prenosa
upotrebljena je za uvođenje specijalnog znaka nazvanog BREAK (prekid). Ovaj
se signal ko-risti kako bi se dala prijemniku signalizacija da je došlo do
problema u slanju podataka.
Serijski prenos počinje tako da predajna strana šalje prijemnoj strani signal
RTS - zahtev za slanjem, dok prijemnik ako je spreman za prijem odgovara
signalom CTS - spreman za prijem. Predajnik zatim šalje podatke prijemniku.
Nakon prijema podataka, prijemnik proverava da li su podaci primljeni bez
greške i za to vreme javlja predajniku da je zauzet. Ako su podaci primljeni bez
greške, prijemnik šalje predajniku signal potvrde ACK (Acknowledgment -
ASCII 6), a u slučaju ako se pojavila neka greška, šalje signal nega tivne potvrde
NAK (ASCII 21). Zavisno od upotrebljenog protokola, odgovor predajnika na
dobijeni NAK signal može biti ponovno slanje podataka.
Protokol za prenos može se izvesti na dva načina i to: hardverski i
softverski. Za realizaciju hardverskog protokola neophodno je da postoje linije:
RTS, CTS i linija za prenos bitova poruke. Softverska realizacija koristi umesto
linija RTS i CTS, ASCII znakove XON i XOFF (nazivaju su i DC1 i DC3),
zbog čega je umesto tri dovoljna samo jedna linija. Kada se primenjuje ovaj
protokol prijemnici i na predaji i prijemu proveravaju svaki prispeli znak radi
utvrđivanja da li je to XON, XOFF ili podatak. Strana koja ne može da primi
karakter kao indikator tog stanja drugoj strani šalje XOFF znak.
Prilikom serijskog prenosa podataka moguća je pojava sledećih vrsta
grešaka:
9
Greška prekoračenja (overrun error). Nastaje kada se pojavljuje novi
znak u prijemniku a prethodni nije upotpunosti primljen.
Greška parnosti (parity error). Nastaje kada bit parnosti ne odgovara
stanju bitova u bitovima podatka.
Serijski EEPROM
Serijski EEPROM-i su danas sve pristupačniji za korišćenje. Tome
doprinose njegove male dimenzije (DIP 8), niska cena i mali broj potrebnih
linija za njegovo povezivanje sa mikrokontrolerom. Najčešća primena serijskih
EEPROM-a je u televiziji, SAT prijemnicima, video rekorderima gde služe za
memorisanje kanala….
Specifikacijom datom od strane proizvođača, prilikom nestanka napajanja
garantovano je čuvanje podataka do 40 godina. Opseg radnog napona kreće su u
granicama od 3V do 5,5V. U sam čip ugrađen je Power on Reset kojim su
zabranjene sve funkcije sve dok napon ne dostigne nominalnu vrednost.
Fabrički je određeno da serijski EEPROM ima isti sadržaj svih ćelija, $FF.
Microchip 24Cxx kola su kompatibilna sa I2C protokolom razvijenim od
strane Philipsa, koji omogućava korišćenje samo 2 bi-direkcione open-drain
linije.
Radna frekvencija kola kreće se u granicama od 100kHz do 400kHz.
10
Slika 8. Raspored pinova serijskog EEPROM-a
PIN Function
VCC Supply Voltage
11
EEPROM 24c02 ima kapacitet od ukupno 2kbit-a, organizovanih u single-
blokove od 256 x 8 bita. Protok informacija iz kola i prema kolu je moguć samo
kad je magistrala slobodna. Prenos podataka mora biti konstantan, a ukoliko
dođe do određene varijacije, može doći do prekida(dolazeći bit moze biti
interpretiran kao START ili STOP bit).
START bit nastaje promenom logičkog nivoa na liniji SDA sa ‘1’ na ‘0’
kada je SCL na visokom logičkom nivou. Komanda START mora prethoditi
bilo kojoj komandi za transfer podataka.
STOP bit nastaje promenom nivoa na liniji SDA sa ‘0’ na ‘1’ dok je linija
SCL na visokom logičkom nivou. Naredba STOP prekida komunikaciju između
master i slave čipa ( čip koji kontroliše protok podataka se zove master, a
drugi drugi slave).
12
Nakon generisanja START bita, master šalje slave adresu koju čine 4 “device
select” bita (1010) i 3 ”don’t care” bita. Osmi bit ima vrednost 1 ili 0 za čitanje
ili upis.
13
Upisivanje u EEPROM
Nakon svakog pristiglog bajta, tri najniža adresna pokazivača svaki put se
uvećavaju za jedan, dok pet viših ostaju nepromenjena. Ukoliko MASTER
pošalje više od 8 bajtova, brojač adresa se vraća na početno stanje i upisani
sadržaj se briše.
14
Opšte karakteristike mikrokontrolera
15
Funkcionalne jedinice savremenih
mikrokontrolera
U zavisnosti od tipa, odnosno namene, savremeni mikrokontroleri mogu da
imaju sledeće funkcionalne jedinice:
• ROM memorija
• RAM memorija
• EEPROM memorija
• Registri posebne namene (SFR registri)
• Programski brojač
• Upravljačka jedinica
• Aritmetičko logička jedinica
• A/D konvertor
• U/I portovi
• Oscilator
• Tajmeri
• Sigurnosni tajmer – Watchdog tajmer
• Jedinica za napajanje
ROM memorija
U ROM memoriji smešten je program koji mikrokontroler izvršava, a
tokom normalnog rada sadržaj ove memorije se ne može menjati. ROM
memorija savremenih mikrokontrolera može biti programabilna, pri čemu se
jedan mikrokontroler može programirati više puta, čime se projektantu olakšava
konstruisanje željenog sklopa. Programabilni ROM uglavnom je EEPROM ili
Flash tipa, što zavisi od konkretnog mikrokontrolera. Sadržaj ROM memorije
se ne menja nakon isključenja napona napajanja.
16
RAM memorija
Ova memorija ima funkciju privremenog pohranjivanja podataka,
međurezultata i konačnih rezultata u toku izvođenja programa. Pristup ovoj
memoriji je proizvoljan – može se i čitati i u nju upisivati podaci. RAM
memorija gubi svoj sadržaj ukoliko se isključi napajanje .
EEPROM memorija
Sadržaj EEPROM memorije može da se menja tokom rada, ali se nakon
isključivanja napajanja sadržaj ne gubi, nego ostaje sačuvan u memoriji. Kod
mikrokontrolera EEPROM se uglavnom koristi kao memorija za postavljanje
početnih podataka neophodnih za rad.
Programski brojač
Ovo je registar u mikrokontroleru koji ima funkciju da u sebi uvek sadrži
adresu memorijske lokacije u programskoj memoriji u kojoj se nalazi sledeća
instrukcija programa koju treba izvršiti, sem u slučaju da se trenutno izvršava
instrukcija skoka.
Upravljačka jedinica
Upravljačka jedinica ima funkciju da upravlja radom mikrokontrolera i
kontroliše izvršavanje svih operacija. U sklopu ove jedinice se uglavnom nalazi
dekoder instrukcija i kontrolna logika koja na osnovu instrukcije koja se
trenutno izvršava uključuje odgovarajuće upravljačke signale.
17
Aritmetičko logička jedinica ALU
Sve operacije nad podacima se izvršavaju u aritmetičko logičkoj jedinici.
Zavisno od složenosti i tipa arhitekture, mikrokontroler može imati instrukcije
za jednostavnije ili složenije aritmetičke i logičke operacije.
Aritmetičko logička jedinica je čvrsto spregnuta sa akumulatorom.
Akumulator je jedan od SFR registara u kome se nalazi podatak nad kojim se
obavljaju sve operacije ALU.
A/D konvertor
Ovo je elektronski sklop koji ima ulogu da analognu ulaznu veličinu,
uglavnom napon, pretvori u njen digitalni ekvivalent u odgovarajućem
digitalnom kodu. Kod modernih mikrokontrolera ovi A/D konvertori su 8 bitni,
10 bitni ili 12 bitni. Jedan mikrokontroler može da ima više A/D konvertora.
U/I portovi
Funkcija U/I portova je da obezbede mikrokontroleru povezivanje sa
ostalim komponentama digitalnog sistema. Svaki od U/I portova ima dodeljeni
registar u kojem je smešten podatak koji se šalje na port ili je primljen sa porta.
Zavisno od konkretne arhitekture, portovi mogu biti bit adresibilni, što znači da
se svakom bitu na portu može dodeliti da li će biti ulazni ili izlazni.
Oscilator
Oscilator obezbeđuje taktni signal određenog oblika i frekvencije koji je
neophodan za dobru sinhronizaciju rada pojedinih komponenata u sistemu sa
mikrokontrolerom. Za dobar rad sistema neophodno je da takt signal bude
stabilne frekvencije i talasnog oblika, što se obezbeđuje spoljnom
stabilizacijom, najčešće uz pomoć kristala kvarca. Kod većine mikrokontrolera
interni takt signal sa kojim se sinhronizuju sve operacije dobija se deljenjem
frekvencije oscilatora nekim brojem koji je dobijen celobrojnim stepenovanjem
broja 2.
18
Tajmeri
Tajmeri su registri čije se stanje menja prilikom dovođenja impulsa na
njihov ulaz. Mogu se koristiti za merenje vremena između dve pojave impulsa
na ulazu, ukoliko se pobuda dovodi iz internog oscilatora. Ukoliko je izvor
pobude izvan mikrokontrolera, tada se tajmer ponaša kao brojač impulsa.
Jedinica za napajanje
Ova jedinica kod većine mikrokontrolera sadrži logiku koja proverava
kakvog je kvaliteta napajanje komponente, pošto je za kvalitetan rad kola
neophodno stabilno napajanje dovoljne snage. Ova logika projektovana je tako
da u slučaju nekvalitetnog napajanja, tzv. “brown out“ izazove reset
mikrokontrolera. Sem toga, u sastavu ove jedinice nalazi se i spoljni priključak
za reset, tako da se reset mikrokontrolera može izvršiti i izvan mikrokontrolera.
19
RISK procesori i HARVARD arhitektura
20
Većina RISC procesora imaju protočnu arhitekturu, u kojoj se izvođenje
jedne instrukcije obavlja u više faza. Broj faza u obradi definisan je brojem
stepeni u protočnom sistemu. Broj stepeni u protočnom sistemu u uskoj je vezi
sa složenošću arhitekture RISC procesora i brzinom njegovog rada. Uglavnom
je kod većine protočnih procesora karakteristično da su razdvojene faze
dobavljanja instrukcije iz memorije i njenog izvršavanja.
Harvard arhitektura je jedan od načina realizacije RISC procesora koji ima
osobinu da se za pristup podacima i instrukcijama koriste razdvojene
memorijske komponente kojima se razdvojeno i pristupa. Pri tome je put za
pribavljanje instrukcija maksimalno iskorišten, dok se put za pribavljanje
podataka koristi samo kod operacija čitanja i pisanja u memoriju. Na ovaj način
se postiže velika brzina rada, dok je potreban veći broj pinova za adrese i
podatke. Naravno, to je potrebno samo ako se radi o mikroprocesoru, dok kod
mikrokontrolera koji imaju memoriju unutar istog kućišta ne dolazi do
povećanja broja pinova.
Centralna
Memorija za procesorska Memorija za
podatke Podaci Instrukcije program
jedinica
21
MIKROKONTROLER PIC16F877
Mikrokontroler PIC16F877A predstavlja integraciju mikroprocesora
(CPU), memorije i periferija. Ovaj mikrokontroler je izrađen u CMOS
tehnologiji sa ugrađenim FLASH i EEPROM memorijama, za čuvanje prog-
rama i podataka. PIC16F877A ima tipičnu RISC arhtekturu (karakteriše manjim
skupom instrukcija koje se brže izvšavaju u odnosu na CISC arhitekturu). Ovaj
mikrokontroler poseduje većinu potrebnih periferija na samom čipu tako da je
podesan za aplikacije na jednom čipu. U ovom projektu koristićemo
mikrokontroler proizvođača Microchip.
22
Jezgro mikrokontrolera PIC16F877 proizvodi se u 40-pinskom (DIP) ili u
44-pinskim kućištima (QFP i PLCC), Slike 12 i 13.
23
Na slikama 12. i 13, mogu se videti fizički izgledi mikrokontrolera PIC16F877
u različitim varijantama, dok je na slici 14. ilustrovan raspored pinova kod
pomenutog mikrokontrolera.
24
Osnovne karakteristike mikrokontrolera
25
Arhitektura mikrokontrolera
Kao što je istaknuto, mikrokontroler PIC16F877A poseduje tipičnu
RISC arhitekturu, koja je prikazana na Sl.15. Arhitektura poseduje odvojene
magistrale za podatke i programski kôd. Obim podataka je 8-bitni, dok je
programski kôd 14-bitni. Moguće je protočno izvršenje (pipelining). Sve
instrukcije su istog obima (osim instrukcija grananja) i izvšavaju se za četiri
taktna intervala. Dakle, ukoliko se koristi oscilator od 20 MHz, ciklus
instrukcije traje 200 ns. Na Sl.15 prikazani su gradivni blokovi mikrokontrolera
PIC16F877A.
26
Slika 15. Arhitektura mikrokontrolera PIC16F877A
27
Organizacija memorije mikrokontrolera
Memorija mikrokontrolera PIC16F877A je organizovan u sledeće tri
celine:
28
Slika 16. Mapa programske memorije i magacin (stack)
Svaka banka može da sadrži do 128 registara (0x7F). Niže lokacije u banci
zauzimaju specijalni registri, a ostatak prostora popunjavaju registri opšte
namene implementirani kao statički RAM. Neki specijalni registri koji se
često koriste mapirani su u sve banke da bi se omogućio brzi pristup i redukcija
kôda. Mapa registara mikrokontrolera PIC16F877 prikazana je na Slici 17.
Nekoliko specijalnih registara su registri jezgra, uskopovezani sa funkcionisa-
njem mikroprocesora kontrolera. Ostali registri su vezani za periferne module i
služe za njihovo upravljanje i kontrolu statusa.
Programski brojač (PC) je 13-bitni registar i određuje adresu naredne
instrukcije u programskoj flash memoriji. Simboličko ime nižeg bajta je PCL i
to je registar u koji se može i upisivati i iščitavati. Viših pet bita programskog
brojača (PC) smešteni su u izolovani registar PCH kojem se pristupa samo
preko latch-a PCLATH, mapiranom u internom RAM-u na ad-resi 0x0A.
STATUS registar je veoma važan i zato je predviđeno da se može
adresirati iz bilo koje banke. On pokazuje status aritmetičko-logičke jedinice,
reset status mikrokontrolera i sadrži bite za selekciju banki internog RAM-a.
Od navedenih flegova posebno treba izdvojiti Zero bit (Z), koji se postavlja kad
je rezultat aritmetičke operacije jednak nuli i bit prenosa/pozajmice Carry (C).
29
Registar OPTION_REG se koristi za konfiguraciju preskalera za tajmer 0
ili Watchdog, za upravljanje tajmerom 0, selekciju ivice okidanja eksternog
interapta, te za omogućenje Pull-up otpornika na portu B.
Kada je reč o registrima jezgra ne treba zaboraviti par FSR (File Select
Register) i INDF (Indirect File), koji služe za indirektno adresiranje memorije
podataka. Bilo koja instrukcija koja se obraća INDF registru, u stvari,
indirektno pristupa onoj lokaciji internog RAM-a čija je adresa trenutno u
registru FSR.
Konačno, treba spomenuti registar PCON (Power Control Register). U
PIC16F877 ovaj registar sadrži samo dva bita. Pomoću bita POR detektuje se
razlika između Power-on reseta i reseta izazvanih drugim uzrokom. Drugi
bit (BOR) služi kao indikacija Brown-out stanja (nedozvoljeni naponski nivoi u
napajanju mikrokontrolera), zbog kojeg se takođe može desiti reset.
30
- EEPROM memorija podataka
31
Oscilator
RC Resistor/Capacitor
XT Crystal / Resonator
LP Low Power Crystal
HS High Speed Crystal / Resonator.
32
Kod vremenski kritičnih aplikacija treba ugrađivati kvarcni oscilator ili
keramički rezonator. Vrednosti kondenzatora C1 i C2 (Sl.19.), treba da budu
identične.
33
Portovi
PIC16F877A poseduje pet portova (PORTA, PORTB, PORTC, PORTD i
PORTE) i oni pred-tavljaju vezu njegove interne strukture sa spoljašnjim
svetom. Svaki od njih može da se konfiguriše kao ulazni ili kao izlazni.
Pomenuti portovi su različitog obima:
PortA
34
Slika 21. Blok-dijagram pina RA4
35
Slika 22. Blok-dijagram pinova RA5, RA3-RA0
Port B
Port B je 8-bitni bidirekcioni port. Svakom pinu porta korespondira
odgovarajući bit u regis-tru TRISB, kojim se definiše smer. Svi pinovi unutar
PortB poseduju pull-up otpornike. Ovi otpor-nici mogu da se uključe
jednim kontrolnim bitom. To se postiže postavljanjem RBPU' bita na ‘0’.
Pull-up otpornici se automatski isključuju kada se pin konfiguriše kao izlazni.
Otpornici su isklju-čeni i kod Power-on reseta.
Četiri pina na PORTB (RB7-RB4) imaju mogućnost generisanja prekida.
Samo pinovi koji su definisani kao ulazni mogu da prouzrokuju prekid.
36
Kombinacija prekida na promenu stanja PortaB i pull-up otpornik mogu se
iskoristiti kao jednostavan interfejs za tastaturu. Na slikama 23. i 24. prikazana
je struktura PORTB.
37
Tabela 24.a) Funkcije PortaB i registri
Port C
39
Portovi D i E
Port D je 8-bitni bidirekcioni port. Ovaj port može da se konfiguriše kao 8-
bitni paralelni mikro-procesorski port (parallel slave port-PSP) i to
podešavanjem konfiguracionog bita PSPMOTE (TRISC<4>). U ovom režimu
rada ulazni bafer je TTL tipa.
Port E je bidirekcioni veličine 3 bita. Ima mogućnost A/D konverzije.
Ulazni bafer je tipa Schmitt Trigger. Pinovi mogu da se konfigurišu kao
digitalni ili analogni, kao i u slučaju PortaA, o čemu je već bilo reči.
Periferijske jedinice
41
D8 1 N 58 1 9 IK 1
1 3
1 V in V o ut
2
G nd
C11
1 00 n F
L M78 0 5 IK 3 CN1
C1 C2 C3 C4 1 16 1
1 00 n F
2
C10 C1+ V cc
2 15 6
2 20 u F 1 00 n F 2 20 u F 1 00 n F V+ Gn d
3 14 2
C1- T1o u t
4 13 7
C2+ R 1 in
5 12 3
1 00 n F
C 2 - R 1 ou t
C9 6 11 8
V- T1i n
7 10 4
T2o u t T2i n
8 9 9
R 2 in R 2 ou t
5
C8 MA X 23 2
C7
1 00 n F 2 20 n F D B 9 /F
R1 R2 R3
1 0K 1 0K 1 0K
TT1
IK 2
1 40
M C LR P B 7
2 39
S1 PA0 PB6
3 38
R4 PA1 PB5
1 4 4 37
R5 PA2 PB4
2 3 5 36
2K2 PA3 PB3
6 35
2K2 PA4 PB2
S W DI P -2 D1 D2 7 34
PA5 PB1
LED LED 8 33
RD PB0
9 32
C5 WR VDD
10 31
CS VSS
11 30
VDD PD7
Qu 1 12 29
2 7p F VSS PD6
13 28
OSC 1 PD5
14 27
OSC 2 PD4
15 26
C6 4 MH z PC0 PC7
R6 R7 16 25
PC1 PC6
17 24
PC2 PC5
18 23
2 7p F PC3 PC4
1 0K 1 0K 19 22
PD0 PD3
20 21
PD1 PD2
P IC 1 6 F8 7 7 -0 4
J1
1
2
3
IK 4
IK 5 R8
A0 VC C
A0 VC C
A1 WP 2K2 R9
A1 WP
NC SCL
NC SCL
GND SDA 2K2
GND SDA
2 4C 0 2 D3 D4
2 4C 0 2 5V1 5V1
42
Spisak komponenti:
Legenda:
43
Quartz Kristal kvarca
Red Diffused LED Crvena difuzna LED dioda
Yellow diffused LED Žuta difuzna LED dioda
Linear voltage regulator Linearni regulator napona
Microcontroller Mikrokontroler
Driver/Receiver Drajver/prijemnik
Power Jack Konektor (džek) za napajanje
Switch Prekidač
Tact switch Taster
Low_cost/Professional Socket Jeftino/profesionalno podnožje
Pin_Header/F Pin-letvica (muška)
44
Slika 29a: Realizovani uređaj
45
Program u mikroC-u
i.F0 = !PORTA.F1;
i.F1 = !PORTA.F0;
// Inicijalizacija USART terminala
Usart_init(2400);
Usart_Write(i);
Soft_I2C_Config(&PORTD, 1, 0); // Inicijalizacija USART terminala
Soft_I2C_Start(); // Pocetak upisa
Soft_I2C_Write(0xA2); // Adresa 24C02
Soft_I2C_Write(i); // Pocetna lokacija
Soft_I2C_Write(2*i+j);
Usart_Write(2*i+j);
j++;
}
Soft_I2C_Stop();
j=0;
if (i==0) {
delay_ms(100);
}
delay_ms(100);
Usart_Write(j-1);
j=0;
}
}//~!
Napomena:
Program u asembleru
47
$0012 $0080 MOVWF INDF
$0013 $082A MOVF PutZerosToLAT_k_L0, 0
$0014 $0084 MOVWF FSR
$0015 $0008 RETURN
$0016 $ _Usart_Write:
$0016 $ L_Usart_Write_3:
$0016 $3000 MOVLW 0
$0017 $1303 BCF STATUS, RP1
$0018 $1683 BSF STATUS, RP0
$0019 $1898 BTFSC TXSTA, 1
$001A $3001 MOVLW 1
$001B $00F1 MOVWF STACK_1
$001C $0871 MOVF STACK_1, 0
$001D $3A00 XORLW 0
$001E $1D03 BTFSS STATUS, Z
$001F $2822 GOTO L_Usart_Write_4
$0020 $0000 NOP
$0021 $2816 GOTO L_Usart_Write_3
$0022 $ L_Usart_Write_4:
$0022 $1283 BCF STATUS, RP0
$0023 $0824 MOVF FARG_Usart_Write+0, 0
$0024 $0099 MOVWF TXREG
$0025 $0008 RETURN
$0026 $ _Soft_I2C_Start:
$0026 $1303 BCF STATUS, RP1
$0027 $1283 BCF STATUS, RP0
$0028 $0820 MOVF ___porti2c, 0
$0029 $0084 MOVWF FSR
$002A $1383 BCF STATUS, 7
$002B $1480 BSF INDF, ____sdai2c
$002C $2004 CALL _Delay_1us
$002D $1400 BSF INDF, ____scli2c
$002E $2004 CALL _Delay_1us
$002F $2006 CALL _PutZerosToLAT
$0030 $1080 BCF INDF, ____sdai2c
$0031 $2004 CALL _Delay_1us
$0032 $2006 CALL _PutZerosToLAT
$0033 $1000 BCF INDF, ____scli2c
$0034 $0008 RETURN
$0035 $ _Soft_I2C_Write:
$0035 $3008 MOVLW 8
$0036 $1303 BCF STATUS, RP1
$0037 $1283 BCF STATUS, RP0
$0038 $00A5 MOVWF Soft_I2C_Write_temp_L0
$0039 $01A6 CLRF Soft_I2C_Write_r_L0, 1
$003A $0820 MOVF ___porti2c, 0
$003B $0084 MOVWF FSR
$003C $1383 BCF STATUS, 7
$003D $ L_Soft_I2C_Write_0:
$003D $0825 MOVF Soft_I2C_Write_temp_L0, 0
48
$003E $1903 BTFSC STATUS, Z
$003F $285A GOTO L_Soft_I2C_Write_1
$0040 $2004 CALL _Delay_1us
$0041 $2004 CALL _Delay_1us
$0042 $2006 CALL _PutZerosToLAT
$0043 $1000 BCF INDF, ____scli2c
$0044 $2004 CALL _Delay_1us
$0045 $0824 MOVF FARG_Soft_I2C_Write+0, 0
$0046 $1903 BTFSC STATUS, Z
$0047 $2848 GOTO L_Soft_I2C_Write_2
$0048 $ L_Soft_I2C_Write_2:
$0048 $2006 CALL _PutZerosToLAT
$0049 $0DA4 RLF FARG_soft_i2c_write+0, F
$004A $1C03 BTFSS STATUS, 0
$004B $284F GOTO l_018
$004C $1784 BSF FSR, 7
$004D $1480 BSF INDF, ____sdai2c
$004E $2851 GOTO l_01C
$004F $ l_018:
$004F $1784 BSF FSR, 7
$0050 $1080 BCF INDF, ____sdai2c
$0051 $ l_01C:
$0051 $0000 NOP
$0052 $2004 CALL _Delay_1us
$0053 $1400 BSF INDF, ____scli2c
$0054 $1384 BCF FSR, 7
$0055 $1C00 BTFSS INDF, ____scli2c
$0056 $2855 GOTO $-1
$0057 $1784 BSF FSR, 7
$0058 $03A5 DECF Soft_I2C_Write_temp_L0, 1
$0059 $283D GOTO L_Soft_I2C_Write_0
$005A $ L_Soft_I2C_Write_1:
$005A $01A6 CLRF Soft_I2C_Write_r_L0, 1
$005B $2004 CALL _Delay_1us
$005C $2006 CALL _PutZerosToLAT
$005D $0000 NOP
$005E $1000 BCF INDF, ____scli2c
$005F $2004 CALL _Delay_1us
$0060 $1480 BSF INDF, ____sdai2c
$0061 $2004 CALL _Delay_1us
$0062 $2004 CALL _Delay_1us
$0063 $0826 MOVF Soft_I2C_Write_r_L0, 0
$0064 $1903 BTFSC STATUS, Z
$0065 $2866 GOTO L_Soft_I2C_Write_3
$0066 $ L_Soft_I2C_Write_3:
$0066 $1400 BSF INDF, ____scli2c
$0067 $1384 BCF FSR, 7
$0068 $1C00 BTFSS INDF, ____scli2c
$0069 $2868 GOTO $-1
$006A $01A6 CLRF FLOC_soft_i2c_write+1
49
$006B $2004 CALL _Delay_1us
$006C $1384 BCF FSR, 7
$006D $1880 BTFSC INDF, ____sdai2c
$006E $1426 BSF FLOC_soft_i2c_write+1, 0
$006F $2004 CALL _Delay_1us
$0070 $2004 CALL _Delay_1us
$0071 $2004 CALL _Delay_1us
$0072 $2004 CALL _Delay_1us
$0073 $2004 CALL _Delay_1us
$0074 $2004 CALL _Delay_1us
$0075 $2004 CALL _Delay_1us
$0076 $2004 CALL _Delay_1us
$0077 $2006 CALL _PutZerosToLAT
$0078 $1784 BSF FSR, 7
$0079 $1000 BCF INDF, ____scli2c
$007A $1080 BCF INDF, ____sdai2c
$007B $0826 MOVF Soft_I2C_Write_r_L0, 0
$007C $00F0 MOVWF STACK_0
$007D $0008 RETURN
$007E $ _Soft_I2C_Stop:
$007E $1303 BCF STATUS, RP1
$007F $1283 BCF STATUS, RP0
$0080 $0820 MOVF ___porti2c, 0
$0081 $0084 MOVWF FSR
$0082 $1383 BCF STATUS, 7
$0083 $2006 CALL _PutZerosToLAT
$0084 $1080 BCF INDF, ____sdai2c
$0085 $2004 CALL _Delay_1us
$0086 $1400 BSF INDF, ____scli2c
$0087 $1384 BCF FSR, 7
$0088 $1C00 BTFSS INDF, ____scli2c
$0089 $2888 GOTO $-1
$008A $1784 BSF fsr, 7
$008B $2004 CALL _Delay_1us
$008C $2004 CALL _Delay_1us
$008D $2004 CALL _Delay_1us
$008E $2004 CALL _Delay_1us
$008F $1480 BSF INDF, ____sdai2c
$0090 $2004 CALL _Delay_1us
$0091 $0008 RETURN
$0092 $ _Soft_I2C_Read:
$0092 $3008 MOVLW 8
$0093 $1303 BCF STATUS, RP1
$0094 $1283 BCF STATUS, RP0
$0095 $00A5 MOVWF Soft_I2C_Read_temp_L0
$0096 $01A6 CLRF Soft_I2C_Read_r_L0, 1
$0097 $0820 MOVF ___porti2c, 0
$0098 $0084 MOVWF FSR
$0099 $1383 BCF STATUS, 7
$009A $ L_Soft_I2C_Read_4:
50
$009A $0825 MOVF Soft_I2C_Read_temp_L0, 0
$009B $3C00 SUBLW 0
$009C $1803 BTFSC STATUS, C
$009D $28B4 GOTO L_Soft_I2C_Read_5
$009E $2004 CALL _Delay_1us
$009F $0000 NOP
$00A0 $1480 BSF INDF, ____sdai2c
$00A1 $2004 CALL _Delay_1us
$00A2 $0826 MOVF Soft_I2C_Read_r_L0, 0
$00A3 $1903 BTFSC STATUS, Z
$00A4 $28A5 GOTO L_Soft_I2C_Read_6
$00A5 $ L_Soft_I2C_Read_6:
$00A5 $1400 BSF INDF, ____scli2c
$00A6 $1384 BCF FSR, 7
$00A7 $1C00 BTFSS INDF, ____scli2c
$00A8 $28A7 GOTO $-1
$00A9 $1880 BTFSC INDF, ____sdai2c
$00AA $1403 BSF STATUS, C
$00AB $1C80 BTFSS INDF, ____sdai2c
$00AC $1003 BCF STATUS, C
$00AD $0DA6 RLF FLOC_soft_i2c_read+1, F
$00AE $2004 CALL _Delay_1us
$00AF $2006 CALL _PutZerosToLAT
$00B0 $1784 BSF FSR, 7
$00B1 $1000 BCF INDF, ____scli2c
$00B2 $03A5 DECF Soft_I2C_Read_temp_L0, 1
$00B3 $289A GOTO L_Soft_I2C_Read_4
$00B4 $ L_Soft_I2C_Read_5:
$00B4 $1480 BSF INDF, ____sdai2c
$00B5 $2004 CALL _Delay_1us
$00B6 $0824 MOVF FARG_Soft_I2C_Read+0, 0
$00B7 $1903 BTFSC STATUS, Z
$00B8 $28BA GOTO L_Soft_I2C_Read_7
$00B9 $2006 CALL _PutZerosToLAT
$00BA $ L_Soft_I2C_Read_7:
$00BA $0824 MOVF FARG_soft_i2c_read+0, W
$00BB $1903 BTFSC STATUS, 2
$00BC $28BE GOTO L_07C
$00BD $1080 BCF INDF, ____sdai2c
$00BE $ L_07C:
$00BE $0000 NOP
$00BF $2004 CALL _Delay_1us
$00C0 $1400 BSF INDF, ____scli2c
$00C1 $1384 BCF FSR, 7
$00C2 $1C00 BTFSS INDF, ____scli2c
$00C3 $28C2 GOTO $-1
$00C4 $1784 BSF FSR, 7
$00C5 $2004 CALL _Delay_1us
$00C6 $2006 CALL _PutZerosToLAT
$00C7 $1000 BCF INDF, ____scli2c
51
$00C8 $2004 CALL _Delay_1us
$00C9 $2006 CALL _PutZerosToLAT
$00CA $1080 BCF INDF, ____sdai2c
$00CB $0826 MOVF Soft_I2C_Read_r_L0, 0
$00CC $00F0 MOVWF STACK_0
$00CD $0008 RETURN
$00CE $ GlobalIniI2C:
$00CE $3000 MOVLW 0
$00CF $1303 BCF STATUS, RP1
$00D0 $1283 BCF STATUS, RP0
$00D1 $00A1 MOVWF _i+0
$00D2 $3000 MOVLW 0
$00D3 $00A2 MOVWF _j+0
$00D4 $0008 RETURN
$00D5 $ _Usart_Init:
$00D5 $1303 BCF STATUS, RP1
$00D6 $1683 BSF STATUS, RP0
$00D7 $1698 BSF TXSTA, 5
$00D8 $3090 MOVLW 144
$00D9 $1283 BCF STATUS, RP0
$00DA $0098 MOVWF RCSTA
$00DB $1683 BSF STATUS, RP0
$00DC $1787 BSF TRISC, 7
$00DD $1307 BCF TRISC, 6
$00DE $ L_Usart_Init_0:
$00DE $1283 BCF STATUS, RP0
$00DF $1E8C BTFSS PIR1, 5
$00E0 $28E4 GOTO L_Usart_Init_1
$00E1 $081A MOVF RCREG, 0
$00E2 $00A8 MOVWF Usart_Init_tmp_L0
$00E3 $28DE GOTO L_Usart_Init_0
$00E4 $ L_Usart_Init_1:
$00E4 $0008 RETURN
$00E5 $ _Soft_I2C_Init:
$00E5 $1303 BCF STATUS, RP1
$00E6 $1283 BCF STATUS, RP0
$00E7 $0824 MOVF FARG_Soft_I2C_Init+0, 0
$00E8 $0084 MOVWF FSR
$00E9 $0800 MOVF INDF, 0
$00EA $00A5 MOVWF Soft_I2C_Init_temp_L0
$00EB $10A5 BCF FLOC_Soft_I2C_Init+0, ____sdai2c
$00EC $1025 BCF FLOC_Soft_I2C_Init+0, ____scli2c
$00ED $0825 MOVF Soft_I2C_Init_temp_L0, 0
$00EE $0080 MOVWF INDF
$00EF $1784 BSF FSR, 7
$00F0 $0804 MOVF FSR, 0
$00F1 $00A0 MOVWF ___porti2c
$00F2 $1480 BSF INDF, ____sdai2c
$00F3 $1400 BSF INDF, ____scli2c
$00F4 $1384 BCF FSR, 7
52
$00F5 $1C00 BTFSS INDF, ____scli2c
$00F6 $28F5 GOTO $-1
$00F7 $0008 RETURN
$00F8 $ _main:
;I2C.c,3 :: void main() {
;I2C.c,4 :: TRISA = 0b000011; //Definisanje pinova Porta A
$00F8 $20CE CALL GlobalIniI2C
$00F9 $3003 MOVLW 3
$00FA $1683 BSF STATUS, RP0
$00FB $0085 MOVWF TRISA
;I2C.c,5 :: PORTA = 0;
$00FC $1283 BCF STATUS, RP0
$00FD $0185 CLRF PORTA, 1
;I2C.c,6 :: ADCON1 = 6;
$00FE $3006 MOVLW 6
$00FF $1683 BSF STATUS, RP0
$0100 $009F MOVWF ADCON1
;I2C.c,7 :: delay_ms(1000);
$0101 $3006 MOVLW 6
$0102 $00FC MOVWF STACK_12
$0103 $30FF MOVLW 255
$0104 $00FB MOVWF STACK_11
$0105 $30FF MOVLW 255
$0106 $00FA MOVWF STACK_10
$0107 $0BFC DECFSZ STACK_12, F
$0108 $290A GOTO $+2
$0109 $2911 GOTO $+8
$010A $0BFB DECFSZ STACK_11, F
$010B $290D GOTO $+2
$010C $2910 GOTO $+4
$010D $0BFA DECFSZ STACK_10, F
$010E $290D GOTO $-1
$010F $290A GOTO $-5
$0110 $2907 GOTO $-9
$0111 $301A MOVLW 26
$0112 $00FB MOVWF STACK_11
$0113 $30FF MOVLW 255
$0114 $00FA MOVWF STACK_10
$0115 $0BFB DECFSZ STACK_11, F
$0116 $2918 GOTO $+2
$0117 $291B GOTO $+4
$0118 $0BFA DECFSZ STACK_10, F
$0119 $2918 GOTO $-1
$011A $2915 GOTO $-5
$011B $3042 MOVLW 66
$011C $00FA MOVWF STACK_10
$011D $0BFA DECFSZ STACK_10, F
$011E $291D GOTO $-1
;I2C.c,8 :: PORTA.F3 = !PORTA.F0; // Nacin paljenja LED.
$011F $3001 MOVLW 1
53
$0120 $1283 BCF STATUS, RP0
$0121 $1805 BTFSC PORTA, 0
$0122 $3000 MOVLW 0
$0123 $00F0 MOVWF STACK_0
$0124 $3000 MOVLW 0
$0125 $1870 BTFSC STACK_0, 0
$0126 $3008 MOVLW 8
$0127 $0605 XORWF PORTA, 0
$0128 $3908 ANDLW 8
$0129 $0685 XORWF PORTA, 1
;I2C.c,9 :: PORTA.F2 = !PORTA.F1;
$012A $3001 MOVLW 1
$012B $1885 BTFSC PORTA, 1
$012C $3000 MOVLW 0
$012D $00F0 MOVWF STACK_0
$012E $3000 MOVLW 0
$012F $1870 BTFSC STACK_0, 0
$0130 $3004 MOVLW 4
$0131 $0605 XORWF PORTA, 0
$0132 $3904 ANDLW 4
$0133 $0685 XORWF PORTA, 1
;I2C.c,11 :: i.F0 = !PORTA.F1;
$0134 $3001 MOVLW 1
$0135 $1885 BTFSC PORTA, 1
$0136 $3000 MOVLW 0
$0137 $00F0 MOVWF STACK_0
$0138 $3000 MOVLW 0
$0139 $1870 BTFSC STACK_0, 0
$013A $3001 MOVLW 1
$013B $0621 XORWF _i, 0
$013C $3901 ANDLW 1
$013D $06A1 XORWF _i, 1
;I2C.c,12 :: i.F1 = !PORTA.F0;
$013E $3001 MOVLW 1
$013F $1805 BTFSC PORTA, 0
$0140 $3000 MOVLW 0
$0141 $00F0 MOVWF STACK_0
$0142 $3000 MOVLW 0
$0143 $1870 BTFSC STACK_0, 0
$0144 $3002 MOVLW 2
$0145 $0621 XORWF _i, 0
$0146 $3902 ANDLW 2
$0147 $06A1 XORWF _i, 1
;I2C.c,14 :: Usart_init(2400);
$0148 $3067 MOVLW 103
$0149 $1683 BSF STATUS, RP0
$014A $0099 MOVWF SPBRG
$014B $1518 BSF TXSTA, BRGH
$014C $20D5 CALL _Usart_Init
;I2C.c,15 :: Usart_Write(i);
54
$014D $0821 MOVF _i, 0
$014E $00A4 MOVWF FARG_Usart_Write+0
$014F $2016 CALL _Usart_Write
;I2C.c,16 :: Soft_I2C_Config(&PORTD, 1, 0); // Inicijalizacija USART terminala
$0150 $3008 MOVLW PORTD
$0151 $00A4 MOVWF FARG_Soft_I2C_Init+0
$0152 $20E5 CALL _Soft_I2C_Init
;I2C.c,17 :: Soft_I2C_Start(); // Pocetak upisa
$0153 $2026 CALL _Soft_I2C_Start
;I2C.c,18 :: Soft_I2C_Write(0xA2); // Adresa 24C02
$0154 $30A2 MOVLW 162
$0155 $00A4 MOVWF FARG_Soft_I2C_Write+0
$0156 $2035 CALL _Soft_I2C_Write
;I2C.c,19 :: Soft_I2C_Write(i); // Pocetna lokacija
$0157 $0821 MOVF _i, 0
$0158 $00A4 MOVWF FARG_Soft_I2C_Write+0
$0159 $2035 CALL _Soft_I2C_Write
;I2C.c,21 :: while ((j < 10)&& (i!=0)) {
$015A $ L_main_0:
$015A $300A MOVLW 10
$015B $0222 SUBWF _j, 0
$015C $1803 BTFSC STATUS, C
$015D $2982 GOTO L_main_1
$015E $0821 MOVF _i, 0
$015F $3A00 XORLW 0
$0160 $1903 BTFSC STATUS, Z
$0161 $2982 GOTO L_main_1
$0162 $ L64_ex_L_main_1:
;I2C.c,24 :: Soft_I2C_Write(2*i+j);
$0162 $3001 MOVLW 1
$0163 $00F4 MOVWF STACK_4
$0164 $0821 MOVF _i, 0
$0165 $00F0 MOVWF STACK_0
$0166 $0874 MOVF STACK_4, 0
$0167 $ L_main_7:
$0167 $1903 BTFSC STATUS, Z
$0168 $296D GOTO L_main_8
$0169 $0DF0 RLF STACK_0, 1
$016A $1070 BCF STACK_0, 0
$016B $3FFF ADDLW 255
$016C $2967 GOTO L_main_7
$016D $ L_main_8:
$016D $0822 MOVF _j, 0
$016E $0770 ADDWF STACK_0, 0
$016F $00A4 MOVWF FARG_Soft_I2C_Write+0
$0170 $2035 CALL _Soft_I2C_Write
;I2C.c,25 :: Usart_Write(2*i+j);
$0171 $3001 MOVLW 1
$0172 $00F4 MOVWF STACK_4
$0173 $0821 MOVF _i, 0
55
$0174 $00F0 MOVWF STACK_0
$0175 $0874 MOVF STACK_4, 0
$0176 $ L_main_9:
$0176 $1903 BTFSC STATUS, Z
$0177 $297C GOTO L_main_10
$0178 $0DF0 RLF STACK_0, 1
$0179 $1070 BCF STACK_0, 0
$017A $3FFF ADDLW 255
$017B $2976 GOTO L_main_9
$017C $ L_main_10:
$017C $0822 MOVF _j, 0
$017D $0770 ADDWF STACK_0, 0
$017E $00A4 MOVWF FARG_Usart_Write+0
$017F $2016 CALL _Usart_Write
;I2C.c,27 :: j++;
$0180 $0AA2 INCF _j, 1
;I2C.c,28 :: }
$0181 $295A GOTO L_main_0
$0182 $ L_main_1:
;I2C.c,29 :: Soft_I2C_Stop();
$0182 $207E CALL _Soft_I2C_Stop
;I2C.c,31 :: j=0;
$0183 $01A2 CLRF _j, 1
;I2C.c,32 :: if (i==0) {
$0184 $0821 MOVF _i, 0
$0185 $3A00 XORLW 0
$0186 $1D03 BTFSS STATUS, Z
$0187 $29C4 GOTO L_main_4
;I2C.c,33 :: delay_ms(100);
$0188 $3082 MOVLW 130
$0189 $00FB MOVWF STACK_11
$018A $30FF MOVLW 255
$018B $00FA MOVWF STACK_10
$018C $0BFB DECFSZ STACK_11, F
$018D $298F GOTO $+2
$018E $2992 GOTO $+4
$018F $0BFA DECFSZ STACK_10, F
$0190 $298F GOTO $-1
$0191 $298C GOTO $-5
$0192 $3087 MOVLW 135
$0193 $00FA MOVWF STACK_10
$0194 $0BFA DECFSZ STACK_10, F
$0195 $2994 GOTO $-1
$0196 $0000 NOP
;I2C.c,35 :: while (j < 32) { // Citanje lokacije EEPROM-a
$0197 $ L_main_5:
$0197 $3020 MOVLW 32
$0198 $0222 SUBWF _j, 0
$0199 $1803 BTFSC STATUS, C
$019A $29B1 GOTO L_main_6
56
;I2C.c,36 :: Soft_I2C_Start();
$019B $2026 CALL _Soft_I2C_Start
;I2C.c,37 :: Soft_I2C_Write(0xA2); // Adresa 24C02
$019C $30A2 MOVLW 162
$019D $00A4 MOVWF FARG_Soft_I2C_Write+0
$019E $2035 CALL _Soft_I2C_Write
;I2C.c,38 :: Soft_I2C_Write(j);
$019F $0822 MOVF _j, 0
$01A0 $00A4 MOVWF FARG_Soft_I2C_Write+0
$01A1 $2035 CALL _Soft_I2C_Write
;I2C.c,39 :: Soft_I2C_Stop();
$01A2 $207E CALL _Soft_I2C_Stop
;I2C.c,40 :: Soft_I2C_Start();
$01A3 $2026 CALL _Soft_I2C_Start
;I2C.c,41 :: Soft_I2C_Write(0xA3);
$01A4 $30A3 MOVLW 163
$01A5 $00A4 MOVWF FARG_Soft_I2C_Write+0
$01A6 $2035 CALL _Soft_I2C_Write
;I2C.c,42 :: k = Soft_I2C_Read(0); // Citanje
$01A7 $01A4 CLRF FARG_Soft_I2C_Read+0, 1
$01A8 $2092 CALL _Soft_I2C_Read
$01A9 $0870 MOVF STACK_0, 0
$01AA $00A3 MOVWF _k
;I2C.c,43 :: Usart_Write(k);
$01AB $0870 MOVF STACK_0, 0
$01AC $00A4 MOVWF FARG_Usart_Write+0
$01AD $2016 CALL _Usart_Write
;I2C.c,44 :: Soft_I2C_Stop();
$01AE $207E CALL _Soft_I2C_Stop
;I2C.c,45 :: j++;
$01AF $0AA2 INCF _j, 1
;I2C.c,47 :: }
$01B0 $2997 GOTO L_main_5
$01B1 $ L_main_6:
;I2C.c,48 :: delay_ms(100);
$01B1 $3082 MOVLW 130
$01B2 $00FB MOVWF STACK_11
$01B3 $30FF MOVLW 255
$01B4 $00FA MOVWF STACK_10
$01B5 $0BFB DECFSZ STACK_11, F
$01B6 $29B8 GOTO $+2
$01B7 $29BB GOTO $+4
$01B8 $0BFA DECFSZ STACK_10, F
$01B9 $29B8 GOTO $-1
$01BA $29B5 GOTO $-5
$01BB $3087 MOVLW 135
$01BC $00FA MOVWF STACK_10
$01BD $0BFA DECFSZ STACK_10, F
$01BE $29BD GOTO $-1
$01BF $0000 NOP
57
;I2C.c,49 :: Usart_Write(j-1);
$01C0 $0322 DECF _j, 0
$01C1 $00A4 MOVWF FARG_Usart_Write+0
$01C2 $2016 CALL _Usart_Write
;I2C.c,50 :: j=0;
$01C3 $01A2 CLRF _j, 1
;I2C.c,53 :: }
$01C4 $ L_main_4:
;I2C.c,54 :: }//~!
$01C4 $29C4 GOTO $
Heksadecimalni kôd
:10000000F828FF3FFF3FFF3F0000080004080313EC
:100010008312AA002008840084130008A900A910F4
:100020002910290880002A088400080000300313E2
:10003000831698180130F1007108003A031D222838
:100040000000162883122408990008000313831265
:100050002008840083138014042000140420062048
:1000600080100420062000100800083003138312BB
:10007000A500A601200884008313250803195A2827
:100080000420042006200010042024080319482816
:100090000620A40D031C4F288417801451288417B0
:1000A00080100000042000148413001C55288417BD
:1000B000A5033D28A601042006200000001004200E
:1000C00080140420042026080319662800148413D1
:1000D000001C6828A601042084138018261404201C
:1000E00004200420042004200420042004200620EE
:1000F0008417001080102608F000080003138312F4
:100100002008840083130620801004200014841328
:10011000001C882884170420042004200420801454
:1001200004200800083003138312A500A60120084C
:10013000840083132508003C0318B4280420000021
:100140008014042026080319A52800148413001C19
:10015000A72880180314801C0310A60D0420062075
:1001600084170010A5039A2880140420240803197A
:10017000BA28062024080319BE2880100000042095
:1001800000148413001CC2288417042006200010C9
:100190000420062080102608F00008000030031319
:1001A0008312A1000030A2000800031383169816E2
:1001B00090308312980083168717071383128C1EC2
:1001C000E4281A08A800DE28080003138312240874
:1001D00084000008A500A5102510250880008417BC
:1001E0000408A000801400148413001CF5280800E3
:1001F000CE200330831685008312850106308316D6
:100200009F000630FC00FF30FB00FF30FA00FC0BC3
:100210000A291129FB0B0D291029FA0B0D290A298E
58
:1002200007291A30FB00FF30FA00FB0B18291B29A5
:10023000FA0B182915294230FA00FA0B1D29013052
:10024000831205180030F0000030701808300506E1
:1002500008398506013085180030F000003070182C
:100260000430050604398506013085180030F00099
:1002700000307018013021060139A106013005183F
:100280000030F00000307018023021060239A1065B
:100290006730831699001815D5202108A400162070
:1002A0000830A400E5202620A230A4003520210833
:1002B000A40035200A302202031882292108003ABE
:1002C000031982290130F4002108F0007408031991
:1002D0006D29F00D7010FF3F672922087007A400F8
:1002E00035200130F4002108F000740803197C293E
:1002F000F00D7010FF3F762922087007A400162029
:10030000A20A5A297E20A2012108003A031DC4290D
:100310008230FB00FF30FA00FB0B8F299229FA0B89
:100320008F298C298730FA00FA0B9429000020309D
:1003300022020318B1292620A230A4003520220869
:10034000A40035207E202620A330A4003520A4015F
:1003500092207008A3007008A40016207E20A20A34
:1003600097298230FB00FF30FA00FB0BB829BB292C
:10037000FA0BB829B5298730FA00FA0BBD2900001D
:100380002203A4001620A201C429FF3FFF3FFF3F24
:02400E00313D42
:00000001FF
Softver IC-Prog
Za programiranje mikrokontrolera PIC16F877A može da se koristi softver
IC-Prog. Inače, ovaj softver je kompatibilan sa mnogim bootstrap loader-ima,
kao što su JDM Programmer, TAFE Programmer, TAIT Programmer,
Conquest Programmer, ProPIC 2 Programmer itd. ICProg poseduje
mogućnost čitanja, upisa i verifikacije (Read, Write, Verify) sadržaja
mikrokontrolera. Naravno, softver dozvoljava mogućnost podešavanja
parametara (WDT, PWRT, BODEN, LVP, CPD, CO, Debugger), kao i izbor
oscilatora (RC, LP, XT, HS).
Program IC-Prog se ne instalira na računaru, već se pokreće direktno –
tačnije, klikom na fajl ICPROG.EXE (Sl. 30).
59
Ako programer ima računar sa verzijom Windows-a «višom» od
Windows-a 98, odmah po startovanju progra-ma IC-Prog na ekranu će se
pojaviti prozor sa upozorenjem, koji je prikazan na Slika 31. Razlog je što su
kod svih Windows-a sa platformom NT zaštićeni portovi. Zbog toga je
neophodno da se instalira odgovarajući drajver.
60
Slika 32 Uključivanje drajvera i prioriteta
61
Korak 2. Podešavanje hardverskih parametara
Softver mikroC
mikroC predstavlja moćan softverski alat, koji je razvila beogradska
Mikroelektronika, i namenjen je pisanju kôda za Microchip-ove PIC
mikrokontrolere. Koristeći mikroC, programeru je omogućen jednostavan način
da kontroliše proces programiranja i napravi kvalitetan firmware.
Osnovne karakteristike programa mikroC su sledeće:
62
očekuje constant izraz .Ukoliko se teži ka prenosivosti programa,
treba koristiti tradicionalno pretprocesorsko definisanje konstanti
mikroC dozvoljava C++ stil jednolinijskih komentara, koristeći dve
kose crte (//). Komentar može da počne bilo gde i traje do sledeće
nove linije programskog kôda
Brojne standardne C biblioteke (ctype, math, stdlib, string )
implementirane su u mikroC, uz individualna odstupanja.
UART terminal
63
Serijski port (u padajućem meniju treba izabrati željeni serijski port, a
kod standardnih računara to su COM1 i COM2)
Brzina prenosa (za frekvenciju kvarca od 4MHz treba izabrati 2400
bauda, za 8MHz bira se 9600 bauda itd.)
Broj stop bitova (1, 1.5 i 2)
Izbor parnosti (bez, parna, neparna itd.)
Broj bitova koji čine karakter (5, 6, 7 ili 8)
Uključivanje/isključivanje handshaking signala (RTS i DTR)
Izbor formata podatka koji se šalje (ASCII, heksadecimalni - HEX ili
dekadni - DEC)
Način slanja (odmah po kucanju ili kada se klikne na opciju SEND) itd.
64
Laboratorijska vežba
(I)
66
Slika 38. Sadržaj memorije 24C02 za DIPSW2 = «01»
67
Slika 40. Sadržaj prozora posle koga treba pritisnuti «F5» za programiranje
(II)
68
Prebaciti serijski EEPROM 24C02 u donje podnožje, koje je bliže
konektoru DB9F.
Startovati program IC-Prog, klikom na ikonicu.
Izabrati memoriju 24C02 kao što je prikazano na Slici 37.
Pritiskom na taster «F8» pročitati sadržaj memorije (ovo može da se uradi
i iz Command menija).
Na Slici 8 je prikazan sadržaj memorije.
Obrisati memoriju na načina ilustrovan na Slikama 39-40 (učitati fajl
blank.hex i programirati pritiskom na taster «F5»).
69
Slika 42. Sadržaj memorije 24C02 za DIPSW2 = «11»
Napomena:
(III)
70
Slika 42. Sadržaj memorije 24C02 za DIPSW2 = «10»
(iv)
72
Slika 44.. Prozor USART terminala (DIPSW2 = «00»)
Zaključak
U radu smo se bavili praktičnom realizacija upisa i čitanja sadržaja serijskog
EEPROM-a preko mikrokontrolera PIC16F877-04 i softvera IC-Prog.
Najpre smo opisali serijsku komunikaciju kod PC računara, koja je u ovom
slučaju ostvarena preko kola MAX232 koje prilagođava naponske nivoe
između serijskog porta računara i mikrokontrolera.
U trećem poglavlje je opisan serijski EEPROM 24C02, uz odgovarajuće
slike samog kola i njegove karakteristike.
U četvrtom poglavlju opisane su opšte karakteristike mikrokontrolera, dok
peto i šesto poglavlje opisuje funkcionalne jedinice mikrokontrolera, RISK
procesore, kao i HARVARD arhitekturu.
73
Poglavlja 7, 8, 9 i 10 vezana su konkretno za mikrokontroler koji je
iskorišćen za ovaj projekat (PIC16F877-04).
Zatim su prikazane blok šema i električna šema uređaja koji predstavlja
spregu mikrokontrolera PIC16F877-04 i serijskog EEPROM-a 24C02.
Na kraju je opisan postupak izvođenja laboratorijske vežbe, gde studenti
mogu da se upoznaju sa načinom upisa i iščitavanja sadržaja serijskog
EEPROM-a.
Literatura
[1] PIC16F87X, Datasheet, Microchip Tecnology, http://www.microchip.com
[2] 24C0xx, Serial EEPROM, http://datasheetarchive.com
[3] Serijska komunikacija računara i USART modula mikrokontrolera
PIC16F877A, Dejan Lazić, Ivan Novaković, Elektronski fakultet - Niš,
(seminarski rad), http://es.elfak.ni.ac.yu/students.html
[4] Softver mikroC, Mikroelektronika - Beograd, http://mikroe.com
[5] IC-Prog, Version 1.05, http://www.ic-prog.com
[6] Serijski EEPROM, http://www.mikroe.com/sr/tools/eeprom
[7] Mikrokontroleri, http://milan.milanovic.org/skola/mikkon/mikkon-06.htm
74
Ime Darko
Prezime Prvulović
Datum rođenja 08.05.1982.
Bračno stanje Neoženjen
Adresa stanovanja Đ. A. Kuna 13/9, Bor
E-mail adresa darko019@gmail.com
Obrazovanje „Mašinsko-elektrotehnička škola“ - Bor
Stepen stručne spreme IV stepen, elektrotehničar elektronike
Godina upisa na 2001.
Elektronski fakultet
Smer Telekomunikacije (T)
Poznavanje jezika Engleski (napredno)
Poznavanje softvera MS Office, CorelDRAW, Windows okruženje,
Adobe Photoshop, ACDSee
Interesovanja Mobilne komunikacije i mobilna telefonija, bežični
linkovi, kablovska televizija
Osobine Ambicioznost, temeljnost, tačnost...
Ostalo Više puta učesnik okružnih takmičenja iz
matemetike u osnovnoj i srednjoj školi, član „FK
Bor“ (1990-1996)
75
Ime Ivan
Prezime Trucić
Datum rođenja 15.02.1977.
Bračno stanje Neoženjen
Adresa stanovanja Vojvode Mišića 17
E-mail adresa trucic@gmail.com
Obrazovanje Tehnička škola Zaječar
Stepen stručne spreme IV stepen, Elektrotehničar automatike
Godina upisa na 1997.
Elektronski fakultet
Smer Telekomunikacije (T)
Poznavanje jezika Engleski (napredno)
Poznavanje softvera Windows operativni sistem, Microsoft
Office, Adobe Photoshop
Interesovanja Elektronika, programiranje, mobilne
komunikacije, satelitske komunikacije,
fotografija, sport
Osobine Istrajnost, samouverenost, komunikativnost