Professional Documents
Culture Documents
Mikroprocesorski sistemi
RAZVOJNI SISTEM ZA
MIKROKONTROLER
PIC 16F877A
Mentor: Studenti:
Prof.Dr Mile Stojcev Branislav Dimirijevic,
Slobodan Aleksic,
Ivan Antic
Sadrzaj:
UVOD------------------------------------------------------------------------------------ 4
1.MIKROKONTROLERI------------------------------------------------------------- 5
1.1 Mikroprocesori u odnosu na mikrokontrolere-------------------------------- 5
1.2 Mikroprocesori------------------------------------------------------------------- 5
1.3 Mikrokontroleri ----------------------------------------------------------------- 7
1.4 Razlika izmedju mikroprocesora i mikrokontrolera------------------------- 8
1.5 Terminologija-------------------------------------------------------------------- 8
1.6 Mikroracunar--------------------------------------------------------------------- 9
1.7 Ostala kola za podrsku rada sistema----------------------------------------- - 10
1.8 Mikrokontroler PIC16F877A--------------------------------------------------- 10
1.9 Osnovne karakteristike mikrokontrolera PIC16F877A--------------------- 11
1.10 Kratak opis mikrokontrolera PIC16F877A---------------------------------- 11
1.11 Raspored nozica ---------------------------------------------------------- ----- 13
1.12 Generator takta (Oscilator)----------------------------------------------- ---- 14
1.13 Takt/Instrukcijski ciklus------------------------------------------------------- 16
1.14 Reset------------------------------------------------------------------------------ 17
1.15 Watchdog timer----------------------------------------------------------------- 22
1.16 Prekidi---------------------------------------------------------------------------- 22
1.17 U/I portovi----------------------------------------------------------------------- 24
1.18 A/D konverzija------------------------------------------------------------------ 31
1.19 Strujna,naponska i temperaturna ogranicenja------------------------------- 32
1.20 Organizacija memorije--------------------------------------------------------- 33
1.21 Tajmeri -------------------------------------------------------------------------- 37
1.22 CCP moduli --------------------------------------------------------------------- 37
1.23 Ostale periferne jedinice------------------------------------------------------- 38
1.24 Set instrukcija mikrokontrolera PIC16F877A------------------------------ 39
2.HARDVERSKA STRUKTURA RAZVOJNOG SISTEMA------------------- 60
2.1 Programator---------------------------------------------------------------------- 60
2.2 Modifikovani Tait programator------------------------------------------------ 63
2.3 Mikrokontrolerski sistem-------------------------------------------------------- 63
2.4 Tasteri------------------------------------------------------------------------------ 64
2.5 Led--------------------------------------------------------------------------------- 65
2.6 Max232---------------------------------------------------------------------------- 67
2.7 Deo za ispravljanje i stabilizaciju napona------------------------------------- 67
2.8 Deo za analogno-digitalnu konverziju----------------------------------------- 68
2.9 Deo za povezivanje LCD-a----------------------------------------------------- 68
2.10 Povezivanje kola za reset i oscilatora---------------------------------------- 73
2.11 Fizicki izgled stampanih plocica---------------------------------------------- 73
2.12 Tabelarni prikaz komponenata sa vrednostima koriscenih za razvojni
sistem---------------------------------------------------------------------------------- 75
3.PRATECI SOFTVER ZA PC I DEMO PROGRAMI-------------------------- 78
2
3.1 Instalacija softvera--------------------------------------------------------------- 78
3.2 Kreiranje aplikacija na programskom jeziku C za mikrokontroler
PIC16F877A-------------------------------------------------------------------------- 105
3.3 Tipovi podataka------------------------------------------------------------------ 106
3.4 Prekidi----------------------------------------------------------------------------- 107
3.5 Primena programskog jezika C (primeri) ------------------------------------ 108
3.6 Upisivanje parametara u DATA EEPROM----------------------------------- 110
3.7 Opcije za optimizaciju kôda pri kompajliranju ------------------------------ 111
3.8 Program za ukljucivanje i iskljucivanje LED-------------------------------- 111
3.9 Program koji upravlja radom LCD-a------------------------------------------ 116
3.10 Program za komunikaciju razvojnog sistema sa racunarom-------------- 120
ZAKLJUCAK-------------------------------------------------------------------------- 125
DODATAK----------------------------------------------------------------------------- 126
3
UVOD
4
1. Mikrokontroleri
1.2 Mikroprocesori
5
Sl.1.2 Blok dijagram mikroprocesora(CPU-a)
6
mikroprocesor memorisani su na disku odakle se citaju i smestaju u RAM. Deo
programa, najcesce malog obima, se obicno smesta i u ROM-u.
1.3 Mikrokontroleri
7
Mikrokontroler koristi ogranicen skup jedno- ili dvo-bajtnih instrukcija koje se
koriste za pribavljanje programa i podataka iz interne memorije. Veliki broj
ulazno-izlaznih pinova mikrokontrolera se moze koristiti za vise namena sto se
softverski definise.
Mikrokontroler komunicira sa spoljnim svetom (pribavlja i predaje podatke) preko
svojih pinova, pri cemu je arihitektura i skup instrukcija projektovan za
manipulisanje podacima obima bajt ili bit.
1.5 Terminologija
U/I pin – spoljni pin prema spoljasnjem svetu koji se moze konfigurisati kao
ulazni, odnosno izlazni. U/I je neophodan u vecini slucajeva da omoguci
mikrokontroleru da komunicira, upravlja ili cita informacije.
8
Izvorna datoteka – program napisan u asemblerskom jeziku koji mi razumemo.
Izvorna datoteka se mora prvo obraditi (iskompajlirati) kako bi je mikrokontroler
razumeo.
1.6 Mikroracunar
9
Ukazimo sada u kratkim crtama na strukturu i funkcije koje obavljaju osnovni
gradivni blokovi mikroracunarskog sistema:
Centralna procesorska jedinica (CPU) – srce sistema i moze biti realizovana kao
4, 8 ili16-bitna procesorska jedinica.
Memorija – moze biti RAM, ROM, EPROM, EEPROM i FLASH tipa ili bilo koja
njihova kombinacija. Memorija se koristiti za cuvanje programa i podataka.
10
1.9 Osnovne karakteristike mikrokontrolera PIC16F877A:
Kao sto smo vec naglasili mikrokontroler PIC16F877A poseduje tipcnu RISC
arhitekturu. Arhitektura poseduje odvojene magistrale za podatke i programski
kôd. Obim podataka je 8-bitni, dok je programski kôd 14-bitni. Moguce je
protocno izvrsenje (pipelining). Sve insrukcije su istog obima (osim instrukcija
grananja) i izvsavaju se za cetiri taktna intervala. Dakle, ako koristimo oscilator
11
npr. od 20 MHz dobijamo da ciklus instrukcuije traje 200 ns. Sa blok dijagrama
(slika 1.5) mogu se uociti sledeci gradivni blokovi:
· Flash programska memorija – 8 kiloreci obima 14 bita
· RAM (File Registers) – 368 bajtova
· Aritmetičko-logička jedinica (ALU)
· Akumulator (Working Register)
· Hardverski magacin (Stack) organizivan u 8 nivoa
· EEPROM memorija podataka obima 256 bajtova
· Razne periferne jedinice (portovi, tajmeri, A/D konvertor, USART,...)
12
1.11 Raspored nozica
13
1.12 Generator takta (Oscilator)
Kod vremenski kriticnih aplikacija treba ugradjivati kvarcni oscilator ili keramicki
rezonator. Vrednosti kondenzatora C1 i C2 (slika 1.8), treba da su jednaki.
14
Tabela 1.1
LP
32 kHz 68-100pF - Kristal
200 kHz 15-33pF - Kristal
Tabela 1.2
XT
100 kHz 100-150pF - Kristal
455 kHz 47-100pF Rezonator -
2.0 MHz 15-33pF Rezonator Kristal
4.0 MHz 15-33 Rezonator Kristal
Tabela 1.3
HS
4.0 MHz 15-33pF - Kristal
8.0 MHz 15-33pF Rezonator Kristal
10.0MHz 15-33pF Rezonator Kristal
Najcesce se koristi spoljni kristalni oscilator (XT) radne frekvencije 4MHz. Bice
prikazano kako se spaja kristalni oscilator sa mikrokontrolerom (slika 1.10) i kako
izgleda oblik signala generisan iz oscilatora u trenutku ukljucenja (slika 1.11).
Oscilatoru treba neko vreme ΔT da se stabilizira na potrebnu frekvenciju i
amplitudu
15
Sl.1.10 Spajanje kristalnog oscilatora Sl.1.11 Oblik signala pri ukljucenju
oscilatora
16
Sl 1.12 b) Protocnost kod izvrsenja sekvence instrukcije
1.14 Reset
17
Sl.1.13. Povezivanje kola za reset
Power-on reset (POR) impuls se generise u samom kolu kada se detektuje porast
napona napajanja (oko 1,2 – 1,7 V). Da bi se POR iskoristio dovoljno je MCLR
nozicu prikljuciti na Vdd direktno ili preko otpornika (sl. 1.10). Ukoliko je porast
napona napajnja spor neophodno je na MCLR postaviti spoljnje kolo za reset.
Sema kola za POR reset je prikazana na slici 1.14.
18
Interno POR kolo nece generisati Reset signal kad napon napajanja padne ispod
minimuma. Za situacije kada je moguca pojava BROWN-OUT-a (privremeni pad
napona ispod Vmin) prebno je napraviti spoljnje Brown-out reset kolo,sto je
prikazano na slici 1.15.
Kolo ce generisati Reset impuls kada napon bude ispod (Vz + 0.7) V
Vz – napon na Zener diodi.
R1
Vdd * < 0.7 V
R2 + R1
19
kristalni oscilator ili rezonator startuju stabilnom frekvencijom. OST se aktivira
samo kod XT, LP i HS rezima rada i to pri:
· POR, i
· budjenju iz SLEEP rezima rada.
Stanja na kojima se postavljaju interni registri CPU-a nakon Reseta zavisi od vrste
Reseta i rezima rada u kojima se nalazi procesor (Sleep i normalni).
Stanje nekih registara ostaje nedifinisano, neki zadrzavaju svoje stanje, a ostali se
postavljaju u unapred definisana stanja (vidi Tabele 1.5 i 1.6).
20
Tabela 1.6
MCLR reset pri:
Budjenje iz
-normalnom radu
SLEEP
Registar Power-on reset -SLEEP mod
-interapt
WDT reset pri
-WDT time out
normalnom radu
00h INDF ---- ---- ---- ---- ---- ----
01h TMR0 xxxx xxxx uuuu uuuu uuuu uuuu
02h PCL 0000 0000 0000 0000 PC+1
03h STATUS 0001 1xxx 000q quuu uuuq quuu
04h FSR xxxx xxxx uuuu uuuu uuuu uuuu
05h PORTA ---x xxxx ---u uuuu ---u uuuu
06h PORTB xxxx xxxx uuuu uuuu uuuu uuuu
08h EEDATA xxxx xxxx uuuu uuuu uuuu uuuu
09h EEADR xxxx xxxx uuuu uuuu uuuu uuuu
0Ah PCLATH ---0 0000 ---0 0000 ---u uuuu
0Bh INTCON 0000 000x 0000 000u uuuu uuuu
80h INDF ---- ---- ---- ---- ---- ----
81h OPTION 1111 1111 1111 1111 uuuu uuuu
82h PCL 0000 0000 0000 0000 PC+1
83h STATUS 0001 1xxx 000q quuu uuuq uuuu
84h FSR xxxx xxxx uuuu uuuu uuuu uuuu
85h TRISA ---1 1111 ---1 1111 ---u uuuu
86h TRISB 1111 1111 1111 1111 uuuu uuuu
88h EECON1 ---0 x000 ---0 q000 ---0 uuuu
89h EECON2 ---- ---- ---- ---- ---- ----
8Ah PCLATH ---0 0000 ---0 0000 ---u uuuu
8Bh INTCON 0000 000x 0000 000u uuuu uuuu
Legenda:
x – Nepoznato stanje
u – Nepromenjeno stanje
q – Stanje zavisi od uslova
- - Ne postoji fizicki cita se kao 0
21
Struktura Reset logike za PIC 16F877A data je na slici 1.17:
1.16 Prekidi
22
putem testira stanje markera koji se postavljaju kada se aktivira odgovarajuci
prekid (interrupt flags polling).Kada se ustanovi koji je od uredjaja generisao
zahtev za prekid prelazi se na izvrsenje odgovarajuce rutine za obradu tog
prekida. Povratna adresa prekinutog programana cuva se automatski u hardverski
magacin.Povratak iz prekidnog programa se vrsi instrukcijom RETFIE.
Upravljacki registar INTCON se koristi za maskiranje prekida.
Pregled sadrzaja marker bitova kojim se generise zahtev za prekid je definisan na
slici 1.18. Znacenje pojedinih markera je sledece:
· T0IF (INTCON:2) setuje se na prekoracenje Timer0
· INTF (INTCON:1) setuje se u slucaju da nastupi spoljni prekid na pinu
RBO/INT
· RBIF (INTCON:0) setuje se kada se dogodi promena stanja na nekom od
pinova RB4, RB5, RB6, RB7
· PSPIF (PIR1:7) PSP marker bit koji se koristi u opreciji citanja i upisa na
PORTD kada je on konfigurisan kao PSP
· ADIF (PIR1:6) marker koji se koristi za vreme analogno-digitalne
konverzije
· RCIF (PIR1:5) marker koji oznacava da je prijemni bafer koji koji koristi
USART blok, pun
· TXIF (PIR1:4) marker koji pokazuje da je bafer za slanje podataka koji
koristi USART prazan
· SSPIF (PIR1:3) marker koji se koristi za rad sinhronog serijskog porta
· CCP1IF (PIR1:2) marker koji koristi CCP1 blok
· TMR2IF (PIR1:1) marker koji setije Timer2 kada dodje do prkoracenja
· TMR1IF (PIR1:0) marker koji setije Timer2 kada dodje do prkoracenja
· EEIF (PIR2:4) marker koji se setuje kada se zavrsi upis u interni
EEPROM
· BCLIF (PIR2:3) marker koji koji korist SSP blok kada je konfigurisan da
radi u I2C master rezimu rada
· CCP2IF (PIR2:0) marker koji koristi CCP2 blok.
Pored bita za dozvolu rada svih prekida General Interrupt Enable (GIE) i bita za
dozvolu rada prekida generisanih os strane periferija (PEIE), ovom registru
pripadaju i markeri prekida (interrupt-flags) i bitovi koji dozvoljavaju prekid koji
izaziva tajmer0, spoljasnji prekid na pinu RB0/INT i prekida porta B na promenu
stanja. Osim ova tri osnovna prekida postoji jos 11 periferijskih prekida. Bitovi za
njihovo omogucenje nalaze se u registrima PIE1 i PIE2, a korespodentni
flegovi,u registrima PIR1 i PIR2. Ovi se flegovi setuju cim se ispuni uslov
interapta bez obzira na stanje njihovog bita omogucenja, a po izvrsenju servis
rutine potrebno ih je soſtverski resetovati.
Na sledecoj slici (sl. 1.18) prikazana je logicka sema svih interrupt-a sa tabelom
u kojoj su oni pobrojani:
23
Sl.1.18 Sema logike za prihvatanje zahteva za prekid i sadrzaj
Port A
Port A je 6-to bitni bidirekcioni port i sadrzi pinove od RA0 do RA5. TRISA je
direkcioni registar koji odredjuje smer pinova na portu. Ako postavimo TRIS na 1
pin je ulazni, u suprotnom pin je izlazni. Npr. ako je TRISA=0b111111 ceo port A
je ulazni, a ako je TRISA=0b000000, ceo port A je izlazni. Moguce je podeliti
port A, tako da, na primer, prva 2 bita budu ulazna,a ostala 4 izlazna
(TRISA=0b110000).
24
Na slikama 1.19 i 1.20 bice prikazan blok dijagram porta A:
25
Port B
Port B je 8-mo bitni bidirekcioni port. Svi pinovi imaju odgovarajuce bitove u
TRISB registru kojim moze da se pinovi konfigurisu kao izlazni ili kao ulazni. ‘1’
u nekom bitu u TRISB registru stavlja odgovarajuci pin u stanje visoke impedanse
i on radi kao ulazni pin. ‘0’ u TRISB registru prosledjuje sadrzaj bita iz izlaznog
(latch) registra na pin i on radi kao izlazni.
Svi pinovi u PORTB imaju pull-up otpornike. Ovi otpornici se mogu ukljuciti
jednim kontrolnim bitom. To se radi stavljanjem RBPU' bita na ‘0’. Pull-up
otpornici se automatski iskljucuju kad se pin konfigurise kao izlazni. Otpornici su
iskljuceni kod Power-on-reset-a.
Cetri pina na PORTB (RB7-RB4) imaju mogucnost generisanja interapta. Samo
pinovi definisani kao ulazni mogu prouzrokovati interapt. Vrednost na pinovima
se poredi sa starom vrednoscu uhvacenoj kod zadnjeg citanja porta B. Nad ovim
vrednostima se vrsi OR operacija da bi se generisao interapt na promenu stanaja
na PORTB. Ovaj interapt moze probuditi kontroler iz SLEEP rezim rada. Korisnik
moze u rutini za obradu prekida ponistiti prekid sledecim postupcima:
· Citanjem ili pisanjem u PORTB. Ovo ce ukloniti neslaganje na portu i
uslov za interapt.
· Resetovanjem flag bita RBIF.
Neslaganje na portu B ce nastaviti da setuje RBIF. Citanje PORTB-a ce prekinuti
neslaganje i uslov za interapt i omoguciti resetovanje bita RBIF
Kombinacija interapta na promennu stanja PORTB i pull up otpornika se moze
iskoristiti za jednostavan interfejs za tastaturu.
Da bi promena na U/I pinu bila prepoznata sirina impusa mora da bude majmanje
koliko i jedan masinski ciklus (4 * Fosc).
Na slikama 1.22 i 1.23 prikazana je struktura PORTB.
Sl.1.22 Struktura pinova od RB0 do RB3 Sl.1.23 Struktura pinova od RB4 do RB7
26
Na slici 1.24 su prikazane tabele sa funkcijama pojedinih pinova i registara koji
se koriste za konfigurisanje porta B.
Pin RB0 ima mogucnost da izazove prekid mikrokontrolera. Ako je ovaj interapt
omogucen (setovan bit 4 (INTE) u INTCON registru) i na RB0/INT pinu se pojavi
odgovarajuca ivica (definisana INTEDG bitom OPTION registra) nastupice
interapt. Na kraju interapt rutine potrebno je u programu resetovati INTF bit u
INTCON registru, kako bi naredni interapt bio moguc.
Port C
Port C je 8-mo bitni bidirekcioni port. Ovaj port je poseban sto na pinovima RC6 i
RC7 ima ugradjen USART modul koji sluzi za serisku komunikaciju (npr. Sa
racunarom). Prilikom koriscenja modula za serisku komunikaciju potrebno je
softverski konfigurisati pinove RC6 i RC7 tako da budu u funkciji USART
modula. Na slikama 1.25 i 1.26 su prikazane blok seme PORTC, a funkcionalna
tabela registara koji se koriste za konfigurisanje samog porta data je na slici 1.27.
27
Sl.1.25. Struktura pinova od RC0 do Sl.1.26.Struktura pinova od RC3
RC2 i od RC5 do RC7 i RC4
28
Port D
Port D je 8-mo bitni bidirekcioni port. Ovaj port se moze konfigurisati kao 8-mo
bitni paralelni mikroprocesorski port (parallel slave port-PSP), podesavanjem
konfigurisuceg bita PSPMOTE (TRISC<4>). U tom rezimu rada ulazni bafer je
TTL tipa. Na slikama 1.28 i 1.29 je prikazana blok sema PORTD i funkcionalna
tabela registara koji se koriste za konfigurisanje samog porta.
29
Port E
30
1.18 A/D konverzija
31
Sl.1.33 Podesavanje tipa kanala (analogni/digitalni)
32
Ukupna disipacija 1W
Maksimalna izlazna struja na pinu Vss 300mA
Maksimalna ulazna struja na pinu Vdd 250mA
Ulazna struja kroz klamp diode IIK (VI < 0 ili VI > VDD) +/- 20mA
Izlazna struja kroz klamp diode IOK (VO < 0 or VO > VDD) +/- 20mA
Maksimalna struja koju moze da primi jedan pin 25mA
Maksimalna struja koju moze da da svaki pin 25mA
Maksimalna struja koju moze port da primi(port A,B,C,D i 200mA
E)
Maksimalna struja koju moze port da da (port A,B,C,D i E) 200mA
33
Sl.1.34 Mapa programske memorije i stack
34
Svaka banka moze da sadrzi do 128 registara (0x7F). Nize lokacije u banci
zauzimaju specijalni regisri, a ostatak prostora popunjavaju registri opste namene
implementirani kao staticki RAM. Neki specijalni registri koji se cesto 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 1.36. Nekoliko
specijalnih registara su registri jezgra, usko povezani sa funkcionisanjem CPU.
Ostali registri su vezani za periferne module i sluze njihovom upravljanju i
kontroli statusa.
Kada je rec o registrima jezgra ne treba zaboraviti par FSR (File Select Register) i
INDF (Indirect File), koji sluze za indirektno adresiranje memorije podataka. Bilo
koja instrukcija koja se obraca INDF registru ustvari indirektno pristupa onoj
lokaciji internog RAM-a cija je adresa trenutno u registru FSR.
35
Sl.1.36 Mapa registra PIC16F877
36
Interni EEPROM za podatke
1.21 Tajmeri
37
Sl.1.37 Pojednostavljeni blok-dijagram PWM modula
PWM_perid = [(PR2)+1]*4*Tosc*TMR2_preskajler
Vreme ispune (Duty Cycle Time) menja se upisom u registar CCPR1L i dva bita
registra CCP1CON (biti 5 i 4). Time je omogucena maksimalno 10-bitna
rezolucija PWM izlaza. Formula za proracun je:
PWM_Duty_Cycle = (CCPR1L:CCP1CON<5:4>)*Tosc*TMR2_preskajler
38
1. Asinhroni rad (full duplex)
2. Sinhroni master rad (half duplex)
3. Sinhroni slave rad (half duplex)
Osim serijskih, postoji i jedan paralelni komunikacioni modul. Rec je o modulu
PSP (Parallel Slave Port). On sluzi da se PIC16F877 direktno poveze na 8-bitnu
magistralu podataka drugog mikroprocesora. Eksterni procesor tada koristeci
linije Read (RD) i Write (WR) moze citati i upisivati PORTD registar kao svaki
drugi 8-bitni lec.
39
Bit Test f, Skip if
BTFSC f, b - 1/2
Clear
Bit Test f, Skip if
BTFSS f, b - 1/2
Set
ADDLW k Add literal and W C,DC,Z 1
AND literal with
ANDLW k Z 1
W
CALL k Call subrutine - 2
Clear Watchdog
CLRWDT TO’, PD’ 1
Timer
GOTO k Go to address - 2
Inclusive OR
IORLW k Z 1
literal with W
MOVLW k Move literal to W - 1
Return from
RETFIE - 1
interrupt
Return with literal
RETLW k - 1
in W
Return from
RETURN - 1
subroutine
Go into stanby
SLEEP TO, PD 1
mode
Subtract W from
SUBLW k C,DC,Z 1
literal
Exclusive OR
XORLW k Z 1
literal with W
1. ADDWF f,d
Operandi: f (0 - 255)
d (0 - 1)
Pre instrukcije:
W= 0x17
FSR = 0xC2
40
Posle instrukcije
W= 0xD9
FSR = 0xC2
2. ANDWF f,d
Operandi: f (0 - 127)
d (0 - 1)
Primer 1:
ANDWF FSR, 1
Pre instrukcije:
W= 0x17
FSR = 0xC2
Posle instrukcije:
W = 0x17
FSR = 0x02
Primer 2:
Primena ove instrukcije je zgodna ukoliko treba nekoliko bita u nekom registru
postaviti da budu 0 a da pritom ostali zadrze svoje stanje.
Recimo u PORTB treba ugasiti 2,3 i 6 bit, bez obzira na mjihovo renutno stanje.
Ostali bitovi (0,1,4,5,7) treba da zadrze njihovo trenutno stanje.(Na izlazu nam
treba x0xx00xxb)
Posle instrukcije:
W = 10110011b
41
PORTB = 00100010b
3. CLRF f
Operandi: f (0 - 127)
Operacija: 00h → (f)
Pre instrukcije:
FLAG_REG = 0x5A
Posle instrukcije:
FLAG_REG = 0x00
Z=1
4. CLRW
Operandi: nema
Operacija: 00h → (W)
Primer: CLRW
Pre instrukcije:
W = 0x5A
Posle instrukcije
W = 0x00
Z=1
5. COMF f,d
Operandi: f (0 - 127)
d (0 - 1)
42
Ako je 'd' = 0 rezultat se smesta u registat W. Ako je 'd'= 1 rezultat se smesta u u
registar 'f'.
Pre instrukcije:
REG1 = 0x13
Posle instrukcije
REG1 = 0x13
W = 0xEC
odnosno
REG1 = 0b00010011
W = 0b11101100
6. DECF f, d
Operandi: f (0 - 127)
d (0 - 1)
Pre instrukcije:
CNT = 0x01
Z =0
Posle instrukcije
CNT = 0x00
Z =1
7. DECFSZ f,d
Operandi: f (0 - 127)
d (0 - 1)
43
Operacija: (f) - 1 → (dest); preskoci ako je rezultat 0
Pre instrukcije:
PC = adresa OVDE
Posle instrukcije
CNT = CNT - 1
Ako je CNT = 0
PC = adresa DALJE
PC = adresa OVDE + 1
8. INCF f, d
Operandi: f (0 - 127)
d (0 - 1)
Pre instrukcije:
CNT = 0xFF
44
Z=0
Posle instrukcije
CNT = 0x00
Z =1
9. INCFSZ f,d
Operandi: f (0 - 127)
d (0 - 1)
Uvecava sadrzaj registra 'f'. Ako je 'd' = 0 rezultat se smesta u registar W. Ako je
'd'= 1 rezultat se smesta u u registar 'f'.Ako je rezultat 0, preskace se operacija koja
neposredno sledi. Umesto nje se izvrsava NOP. Instrukcija traje 2 ciklusa.
DALJE ---
---
---
Pre instrukcije:
PC = adresa OVDE
Posle instrukcije:
CNT = CNT + 1
Ako je CNT = 0:
PC = adresa DALJE
PC = adresa OVDE + 1
Operandi: f (0 - 127)
d (0 - 1)
45
Operacija: (W) .OR. (f) → (dest)
Logicki OR sa sadrzajima reistra W i 'f'
Ako je 'd' = 0 rezultat se smesta u registar W. Ako je 'd'= 1 rezultat se smesta u
registar 'f'.
Primer:
IORWF RESULT,0
Pre instrukcije:
W = 0x91
RESULT = 0x13
Posle instrukcije:
W = 0x13
RESULT = 0x93
Primer 2:
Primena ove instrukcije je zgodna ukoliko treba nekoliko bita u nekom registru
postaviti da budu 1 a da pritom ostali zadrze svoje stanje.
Recimo u PORTB treba ugasiti 2,3 i 6 bit, bez obzira na njihovo renutno stanje.
Ostali bitovi (0,1,4,5,7) treba da zadrze svoje trenutno stanje. (Na izlazu nam treba
x1xx11xxb)
Posle instrukcije:
W = 01001100b
PORTB = 01110110b
Operandi: f (0 - 127)
d (0 - 1)
Operacija : (f) → (dest)
Posle instrukcije:
46
W ce imati vrednist FSR registra.
12. MOVWF f
Operandi: f (0 - 127)
Operacija: (W) → (f)
Pre instrukcije:
OPTION = 0xFF
W = 0x4F
Posle instrukcije:
OPTION = 0x4F
W = 0x4F
13. NOP
Operandi: Nema
Operacija: Nema
Kontroler jednostavno ne radi nista, osim sto trosi vreme, jer ova instrukcija traje
jedan masinski ciklus.
Primer: NOP
14. RLF f, d
Operandi: f (0 - 127)
d (0 - 1)
47
Primer: RLF REG1,0
Pre instrukcije:
Posle instrukcije
15. RRF f, d
Operandi: f (0 - 127)
d (0 - 1)
Pre instrukcije:
C=0
Posle instrukcije:
16. SUBWF f, d
Operandi: f (0 - 127)
d (0 - 1)
48
Operacija: (f) - (W) → (dest)
Oduzima sadrzaj registra W od sadrzaja 'f' registra i zavisno od rezultata setuje C
bit u statusnom registru.Ako je 'd' = 0 rezultat se smesta u registar W. Ako je 'd'=
1 rezultat se smesta u registar 'f'.
Pre instrukcije:
REG1 = 3
W=2
C=?
Posle instrukcije:
REG1 = 1
W=2
C = 1 ; rezultat je pozitivan
Primer 2:
Pre instrukcije:
REG1 = 2
W=2
C=?
Posle instrukcije
REG1 = 0
W=2
C = 1 ; rezultat je nula
Primer 3:
Pre instrukcije:
REG1 = 1
W=2
C=?
Posle instrukcije
REG1 = FF
W=2
C = 0 ; rezultat je negativan
49
17. SWAPF f, d
Operandi: f (0 - 127)
d (0 - 1)
Operacija: (f <3:0>) → (dest <7:4>),
(f <7:4>) → (dest <3:0>)
Visi i nizi nibl u registru 'f' ce zameniti mesta.Ako je 'd' = 0 rezultat se smesta u
registar W. Ako je 'd'= 1 rezultat se smesta u registar 'f'.
Pre instrukcije:
REG1 = A5
Posle instrukcije:
REG1 = A5
W = 5A
18. XORWF f, d
Operandi: f (0 - 127)
d (0 - 1)
Operacija: (W) .XOR. (f) → (dest)
Pre instrukcije:
W = B5
RESULT = AF
Posle instrukcije:
W = B5
RESULT = 1A
50
19. BCF f, b
Operandi: f (0 - 127)
b (0 - 7)
Operacija: 0 → (f<b>)
Pre instrukcije:
FLAG_REG = C7
Posle instrukcije:
FLAG_REG = 47
20. BSF f, b
Operandi: f (0 - 127)
b (0 - 7)
Operacija: 1 → (f<b>)
Pre instrukcije:
FLAG_REG = 0A
Posle instrukcije
FLAG_REG = 8A
21. BTFSC f, b
Operandi: f (0 - 127)
b (0 - 7)
51
Ako je bit 'b' u registru 'f' nula tada ce naredna instrukcija biti preskocena.Ako je
bit 'b' nula, instrukcija koja neposredno sledi se ne izvrsava. Umesto nje se
izvrsava NOP i u tom slucaju instrukcija traje dva ciklusa.
Pre instrukcije:
PC = adresa OVDE
Posle instrukcije
Ako je FLAG<1> = 0
PC = adresa NASTAVI
Ako je FLAG<1> = 1
PC = adresa NIJE
22. BTFSS f, b
Operandi: f (0 - 127)
b (0 - 7)
Ako je bit 'b' u registru 'f' setovan tada ce naredna instrukcija biti preskocena.Ako
je bit 'b' setovan, instrukcija koja neposredno sledi se ne izvrsava. Umesto nje se
izvrsava NOP i u tom slucaju instrukcija traje dva ciklusa.
Pre instrukcije:
PC = adresa OVDE
Posle instrukcije:
Ako je FLAG<1> = 0
PC = adresa NIJE
52
Ako je FLAG<1> = 1
PC = adresa NASTAVI
23. ADDLW k
Operandi: k (0 - 255)
Sadrzaju registra W bice dodata osmobitna vrednost literala 'k', i rezultat ce biti
smesten u registar W.
Primer:
ADDLW 15
Pre instrukcije:
W = 10
Posle instrukcije
W = 25
24. ANDLW k
perandi: k (0 - 255)
Primer:
ADDLW 5F
Pre instrukcije:
W = A3
Posle instrukcije:
W = 03
Primer 2:
Primena ove instrukcije je zgodna ukoliko treba nekoliko bita u nekom registru
postaviti da budu 0 a da pritom ostali zadrze svoje stanje.
53
Recimo u PORTB treba ugasiti 1,4 i 5 bit, bez obzira na njihovo renutno stanje.
Ostali bitovi (0,2,3,6,7) treba da zadrze svoje trenutno stanje. (Na izlazu nam treba
x0xx00xxb)
Posle instrukcije:
W = 10100001b
25. CALL k
Operandi: k (0 - 2047)
Operacija: (PC) + 1 → TOS
k → (PC<10:0>),
(PCLATH<4:3>) → (PC<12:11>)
Primer:
Pre instrukcije:
PC = adresa OVDE
Posle instrukcije
PC = adresa TAMO
TOS = adresa OVDE
26. CLRWDT
Operandi: nema
Operacija: 00h → WDT
0 → WDT preskaler
1 →TO
1 → PD
Resetuje watchdog tajmer. Takodje resetuje preskaler za WDT isetuje bitove TO' i
PD'.
54
Primer:
CLRWDT
Pre instrukcije:
WDT = ?
Posle instrukcije
WDT = 0
WDT preskaler = 0
TO' = 1
PD' = 1
27. GOTO k
Operandi: k (0 - 2047)
Operacija: k → (PC<10:0>)
(PCLATH<4:3>) → (PC<12:11>)
Primer:
GOTO TAMO
Posle instrukcije
PC = adresa TAMO
28. IORLW k
Operandi: k (0 - 255)
Primer:
IORLW 35
Pre instrukcije:
W = 9A
55
Posle instrukcije
W = BF
Primer 2:
Primena ove instrukcije je zgodna ukoliko treba nekoliko bita u nekom registru
postaviti da budu 1 a da pritom ostali zadrze svoje stanje. Recimo u PORTB treba
ugasiti 1,4 i 5 bit, bez obzira na njihovo renutno stanje. Ostali bitovi (0,2,3,6,7)
treba da zadrze svoje trenutno stanje. (Na izlazu nam treba x1xx11xxb)
Posle instrukcije:
W = 01111110b
29. MOVLW k
Operandi: k (0 - 255)
Operacija: (k) → (W)
Primer:
MOVLW 5A
Posle instrukcije
W = 5A
30. RETFIE
Operandi: nema
Operacija: TOS → (PC)
1 → GIE
Uzima se vrednost sa vrha steka (TOS) i stavlja u PC. Dalji interapt je omogucen
automatskim setovanjem bita GIE (Global Interapt Enable). Instrukcija traje dva
ciklusa.
Primer:
RETFIE
Posle instrukcije
56
PC = TOS
GIE = 1
31. RETLW k
Operandi: k (0 - 255)
Operacija: k→W
TOS → (PC)
Registar W uzima osmobitnu vrednost literala 'k'. PC uzima vrednost sa vrha steka
(adresa povratka) Instrukcija traje dva ciklusa.
Primer:
Pre instrukcije
W = 04
Posle instrukcije
W = k4
32. RETURN
Operandi: nema
Operacija: TOS → (PC)
Primer:
RETURN
Posle instrukcije
PC = TOS
57
33. SLEEP
Operandi: nema
Operacija: 00h → WDT
0→WDT preskaler
1 → TO’
0 → PD’
Power down bit (PD’) se resetuje. Setuje se bit Time-out (TO’). Watchdog Timer i
njegov preskaler se resetuju i procesor ide u SLEEP mod sa zaustavljenim
oscilatorom.
Primer:
SLEEP
34. SUBLW k
Operandi: k (0 - 255)
d (0 - 7)
Primer:
SUBLW 02
Pre instrukcije:
W=1
C=?
Posle instrukcije
W=1
C = 1 ; rezultat je pozitivan
Pre instrukcije:
W=2
C=?
58
Posle instrukcije
W=0
C = 1 ; rezultat je nula
Pre instrukcije:
W=3
C=?
Posle instrukcije
W = FF
C = 0 ; rezultat je negativan
35. XORLW k
Operandi: k (0 - 255)
Operacija: (W) .XOR. (k) → (W)
Primer:
XORLW AF
Pre instrukcije:
W = B5
Posle instrukcije
W = 1A
59
2.Hardverska struktura razvojnog sistema
U ovom delu je detaljno opisana hardverska struktura razvojnog sistem, kao i
detaljan prikaz svih delova koji cine razvojni sistem. Krakteristike komponenata
date su u Dodatku . Na mestima gde je bilo potrebno prikazan je detaljan proracun
za pojedine komponente.
Ovaj razvojni sistem mozemo grubo podeliti u dva dela:
1. Programator-gradivni blok koji se koristi za punjenje kreiranog programa.
Kreirani program se prethodno unosi, kompajlira i debagira u host-u tipa
PC masina, a zatim se program serijskom komunikacijom prenosi do
programatora. Nakon programiranja kontroler je sposoban da izvrsava
odgovarjuci program.
2. Mikrokontrolerski sistem-predstavlja srce sistema i definisano je
hardverom tipicnim za aplikaciju.
2.1 Programator
60
Na semi sa slike 2.1 mozemo uociti dva glavna dela programatora: deo za
napajanje i logika koje se koristi za programiranje. Deo za napajanje se sastoji od
dva linearna stabilizatora napona: LM7805 i LM7812. Stabilizator 7805 se koristi
za napajanje mikrokontrolera i dela logickih kola, dok stabilizator 7812
obezbedujuje potrebne napone za programiranje. Za programiranje
mikrokontrolera potreban je napon od 12V do 14V koji se dovodi na pinu
MCLR. Ovaj napon se generise na izlazu stabilizatora 7812 (slika 2.2) koji na
pinu GND ima povezane dve diode prema masi, cime je obezbedjeno da napon
na pinu OUT bude 13.2V . Logiku programatora cini kolo SN 74LS07 i tranzistor
BC557. Kolo SN 74LS07 je sestostruki bafer sa otvorenim kolektorom, dok PNP
traznistor BC557 ima ulogu prekidaca napona za programiranje. Programator se
povezuje preko LTP porta na host. Na hostu je instaliran softver nazvan IC-
PROG cijim se pokretanjem vrsi programiranje kontrolera. Komunikacija izmedju
PC-racunara i programatora je serijska i sinhronizovana sa bitskom brzinom. To
znaci da imamo jednu liniju kojom se prenosi taktni signal, a drugu liniju po kojoj
se prenose podaci. Tranzistor Q2 na slici 2.1 se koristi kao prekidac. Kada je u
stanju ON tada je napon na pinu MCLR 13 V, a kada je ustanju OFF napon na
pinu MCLR je 0 V.
61
Sl.2.3. Povezivanje programatora
62
2.2 Modifikovani Tait programator
63
vezuje sa COM port PC masine. D1 je sotki dioda i ima ulogu za vreme
programiranja.
2.4 Tasteri
64
Sl.2.6. Nacin povezivanja tastera sa mikrokontrolerom
VDD 5V
R³ = = 100 W
Itas 50mA
Gde je:
VDD – napon napajanja;
R- otpornost otpornika vezakog izmedju 5 V napajanja i tastera
Itas – maksimalna dozvoljena struja kroz taster.
2.5 LED
65
a)Proracun za crvene LED:
VDD - Uf 5V - 1.7V
Rr = = = 330W
If 10mA
Gde su:
VDD – napon napajanja
Uf – napon na diodi
If - struja kroz diodu
Uzimamo proracunatu vrednost za otpornost, je postoji u nizu E24.
66
2.6 Max232
67
Sl.2.9. Usmeracki deo razvojnog sistema
Sl.2.10. Transformator
68
1. konektor za prenos podtaka, LCD_DATA;
2. konektor kojim se predaju komande LCD-u, LCD_DATA1;
3. konekor za napajanje, LCD_NAP.
LCD displej je instaliran na gornjrm desnom uglu osnovne ploce. Regulacija
osvetljaja LCD displeja ostvarena je preko potenciometra R24 nominalne
vrednosti 10k. Nacin povezivanja LCD displeja na napajanje i interfejsa, za
regulaciju osvetljaja prikazan je na slici na slici sl.2.11.:
69
Sl.2.12. Fizicki izgled organizacije prikaza LCD-a i adresne organizacije
memorije za prikaz
70
· dvosmerne magistrala za podatke, D0 do D7, preko ovih linija
mikrokontroler moze da upisuje u ili cita podatke iz LCD displeja
· jednosmerne upravljacke magistrale – cine je linije RS, R\W i E. Signal E
kada je aktivan (E=1) dozvoljava rad displeja. Signal R\W definise
operaciju citanja ili upisa (R\W=1 obavlja se operacija citanja, u
suprotnom je upis). Signalom RS definise se kom se registru vrsi pristup,
kada je RS =1 registrima za podatke nazvanih DDRAM-a (Display Data
Ram) i CGRAM-a (Character Generator Ram), a kada je RS=0 pristupa se
komandnom registru.
71
Sl.2.15. Nacin povezivanja LCD-a i mikrokontrolera
72
2.10 Povezivanje kola za reset i oscilatora
73
Sl.2.18. Izgled stampane plocice sa raspodelom elemenata-pogled odozgo
74
Sl.2.20. . Izgled stampane plocice napajanja sa raspodelom veza-pogled odozgo
75
R12 Otpornik 1/4W 270Ω
R13 Otpornik 1/4W 270Ω
R14 Otpornik 1/4W 270Ω
R15 Otpornik 1/4W 270Ω
R16 Otpornik 1/4W 270Ω
R17 Otpornik 1/4W 330Ω
R18 Otpornik 1/4W 330Ω
R19 Otpornik 1/4W 330Ω
R20 Otpornik 1/4W 330Ω
R21 Otpornik 1/4W 330Ω
R22 Otpornik 1/4W 330Ω
R23 Otpornik 1/4W 330Ω
R24 Potenciometar 10k
R25 Otpornik 1/4W 1k
R26 Otpornik 1/4W 1k
R27 Otpornik 1/4W 1k
R28 Otpornik 1/4W 10k
R29 Otpornik 1/4W 10k
R30 Otpornik 1/4W 100k
C1 Blok kondenzator 100nF
C2 Keramicki kondenzator 27pF
C3 Keramicki kondenzator 27pF
C4 Elektrolitski kondenzator 10μF
C5 Elektrolitski kondenzator 10μF
C6 Elektrolitski kondenzator 10μF
C7 Elektrolitski kondenzator 10μF
C8 Elektrolitski kondenzator 470μF
C9 Elektrolitski kondenzator 100μF
C10 Elektrolitski kondenzator 100μF
D1 LED 3mm Zuta
D2 LED 3mm Zuta
D3 LED 3mm Zuta
D4 LED 3mm Crvena
D5 LED 3mm Crvena
D6 LED 3mm Zelena
D7 LED 3mm Zelena
D8 LED 3mm Zelena
D9 LED 3mm Zelena
D10 LED 3mm Zelena
76
D11 LED 3mm Crvena
D12 LED 3mm Zelena
D13 LED 3mm Crvena
D14 LED 3mm Crvena
D15 LED 3mm Crvena
D16 LED 3mm Crvena
D17 Dioda BAT42
D18 GREC 1A
D19 L7812CV 1A
D20 TS7805 1A
D21 Dioda 1N4148
D22 Dioda 1N4148
Q1 Mikrokontroler PIC16F877A
Q2 MAX232 -
Q3 PNP Tranzistor BC557
Q4 TTL Bafer SN 74LS07
J3 D9 PCB Konektor Zenski
J4 Konektor Dvopinski
J6 D25 PCB Konektor Zenski
J7 Muska kontaktna letvica Dvopinska
J11 Konektor 220V
TS Transformator 6VA 220/15V 400mA
OSC Oscilator 4MHz
T1 Mikroprekidac -
T2 Mikroprekidac -
T3 Mikroprekidac -
T4 Mikroprekidac -
T5 Mikroprekidac -
T6 Mikroprekidac -
T7 Mikroprekidac -
LCD Hitachi HD44780 -
Kabl 25-pinski 1:1 Musko/Muski
Kabl 9-pinski 1:1 Musko/Zenski
Kabl Za Napajanje -
77
3.Prateci softver za PC i demo programi
3.1 Istalacija softvera
78
3. Cekira se polje ''I ACCEPT'' i klikom misa na polje ''NEXT'' sledi
nastavak nstalacije i generise se prikaz sledeceg oblika
79
5. Aplikacija nas pita da li zelimo da napravimo precicu u start meniju.
Odabiramo jednu od ponudjenih opcija(npr. Yes), a zatim sledi klik na
taster NEXT.
80
7. Ako je korisnik spreman za instalaciju to potvrdjuje tasterom NEXT pa se
dobija sledeci prozor:
81
9. Za nastavak instalacije (posle odabira yes ili no) kliknuti na NEXT.
10. nakon citanje poruke koja seodnosi na USB Driver Installition Please read
treba kliknuti na NEXT.
82
11. nakon citanje poruke koja seodnosi na Driver Installition You MUST read
treba kliknuti na NEXT.
12. nakon citanje poruke koja seodnosi na USB Driver Installition Please read
treba kliknuti na CONTINUE.
83
13. nakon citanje poruke koja seodnosi na USB Driver Installition Please read
treba kliknuti na CONTINUE.
84
Nakon instalacije paketa MPLAB potrebno je instalirati programski paket
Hi-Tech i integrisati ga u MPLAB. Da bi se obavila ova aktivnost potrebno je
preuzeti sledece korake:
1. Instalacija pocinje pokretanjem aplikacije picclite-setup koja se nalazi na
prilizenom disku (u folderu Hi-Tech_PICC_v8.05_lite pokrenuti aplikaciju
picclite.exe). Po pokretanju aplikacije na monitoru dobijamo sledeci
prozor:
85
3. Da bi se nastavilo sa instalacijom treba kliknuti na NEXT.
86
5. Klikom na taster (polje) Browse bira se direktorijum gde se instalira Hi-
Tech, a zatim klikom na polje NEXT nastavlja se instalacija
87
7. u ovom trenutku potrebno je scekat izvesni vremenski period da se zavrsi
istalacija Hi-Tech..
88
9. Za nastavak kliknuti na OK.
89
11. Klikom na YES zavrsavamo instalaciju Hi-Tech i po automatizmu se
restaruje racunar.
90
2. Za natavak kliknuti na NEXT.
91
5. Kliknuti NEXT za nastavak instalacije.
92
7. Na ovom prozoru treba odabrati folder u kojoj se nalazi napisan nas
program koji zelimo da kompajliramo. Klikom na potrebni fajl, pa zatim
na ADD , stikliranjem polja ispred imena odabranog fajla i klikom na
NEXT generise se prozir:
93
8. Klikom na FINISH zavrsavaju se potrebna podesavanja i generise se
prozor:
94
9. U potprozoru koji se nalazi na sedini glavnog prozora nalazi se listing
napisanog programa koji moze da se dodatno edituje ili ako je sve u redu
da se pokrene proces kompajliranja.
95
11. U slucaju da ima greske u programu kompajler ce dati detaljno
obavestenje o gresci.
12. Rezultat kompajliranja je HEX fajl koji se kasnije da ucitava u Ic-Prog.
96
4. Za ukljucivanje drajver potrebno je uraditi: Odabrati settings→optionns
(kao na slici)
97
5. Da bi ukljucili drajver, koji je potreban za rad IC-Prog pod OS XP,
potrbno je podesiti Ic-Prog kao na prilozenoj slici, a zatim kliknuti na
polje OK:
98
7. Treba sacekati da se program resetuje i potvrdno odgovoriti na
postavljeno pitanje na pitanje.
99
10. Sada je potrbno ucitati HEX fajl koji se dobija kompajliranjem programa.
To mozeme da se uradi klikom na: File→Open File... (kao na sledecoj
slici).
11. Nakon toga se generise prozor kao na sledecoj slici na kome je potrebno
selektovati zeljeni HEX fajl i kliknuti na polje OK.
100
12. Kada se prethodna procedura, na monitoru ce se generisti prozor. Na
njemu se moze videti hexadecimalni sadrzaj iskompajliranog programa.
Potrbno je na njemu podesiti tip oscilatora i fuses podesavanja, ako vec
nisu programski podesena. U nasem slucaju potrbno je samo iskljuciti fleg
''CP''.
101
13. Pre pocetka loadovanja prozor bi trebalo da izgleda kao na prilozenoj
slici:
102
15. Na prozoru koji ce se pojaviti treba kliknuti Yes za nastavak.
16. Zatim pocinje proces loadovanja i prozor izgleda kao na prilozenoj slici:
103
17. Nakon zavrsetka loadovanja, ukoliko nije bilo greski, proram ce generisati
prozor sa obavestenjem da je proces zavrsen. Tada je potrebno kliknuti
OK. U slucaju da je doslo do greske program ce dati detaljne informisati o
gresci. Posle toga je potrbno utvrditi gde je greska, otkloniti je i ponoviti
proces loadovanja.
104
Nakon toga dobijamo sledeci prozor:
105
1. kod PORTA , pinovi RA1- RA5 su povezani na LED, pa se zbog toga
ovi pinovi moraju programski konfigurisati kao izlazni. RA0 je predvidjen
kao ulaz za analogno-digitalnu konverziju, i njega je potrebo konfigurisati
kao ulazni upisom komandne 0b000001 reci u registar TRISA.
2. PORTB je predvidjen kao ulazni port zbog toga sto ima mogucnost da
generise prekid usled promene stanja na nekim od njegovih pinova (pinovi
od RB4 do RB7). Ova mogucnost se pokazala kao veoma korisna pri
analizi tastera pa smo se zbog toga opredelili da to iskoristimo. Pinovi od
RB0 do RB3 nemaju ovu mogucnost, pa je zato njih potrebno analizirati
softverski (najcesce primenom Timer0). Pinovi RB6 i RB7 iako imaju
mogucnost, kao sto smo vec rekli, da generisu prekid, nismo ih iskoristili
kao ulazne nego su ostali slobodni (koriste se u procesu programiranja).
Ovaj port se kofigurise upisom komandne reci 0x3f u registar TRISB.
3. PORTC je predvidjen za komunikaciju sistema sa racunarom i za LED
indikaciju stanja na pojedinim pinovima. Pinovi RC0-RC5 su povezani na
LED diode, a preko pinova RC6 i RC7 povezano je kolo MAX232.
Aktiviranjem USART modula po programskom automatizmu pinovi RC6 i
RC7 se konfigurisu ka RxD i TxD, respektivno, a pinove RC0-RC5 je
potrebno rucno konfiguristi kao izlazne. Nije greska ako se inicjalizira
registar TRISC na vrednost 0x00, a zatim aktivira modul za komunikaciju
sa racunarom.
4. PORTD je predvidjen za povezivanje LCD displeja i LED indikaciju. LCD
modul je povezan na pinove od RD2 do RD7 ( RD2 se vezuje na RS pin
displeja, RD3 vezuje se za E pin, a RD4, RD5, RD6, RD7 su iskorisceni za
prenos podataka). Za pinove RD0 i RD1 su vezane LED za indikaciju
stanja. Ovaj port se konfigurise kao izlazni TRISD={0x00}.
5. PORTE je ceo iskoriscen za LED indikaciju. Konfigurise se kao izlazni
TRISE={0b000}.
106
void Bez vrednosti void
signed Pozitivni ili negativni brojevi signed
unsigned Samo pozitivni brojevi unsigned
long Duzi opseg broja long
short Kraci opseg broja short
3.4 Prekidi
107
Sl. 3.1 Algoritam izvrsenja programa pri nastanku prekida
Napomena:
Obratite paznju da je C jezik ''case-sensitive'' pa nije sve jedno da li se koriste
mala ili velika slova!!! Primer: ako deklarisete promenljivu unsigned char
bRojAC; Pokusaj da je koristite kao brojac=0; izazvace gresku. Pravilno je
bRojAC=0;
108
''fuses'' podesavanja
__CONFIG (LVPDIS&XT&PROTECT&PWRTEN&WDTDIS&DEBUGDIS);
Napomena:
Ne sme se zaboraviti obavezno podesavanje smerova pinova koji se koriste u
odgovarajucim TRIS registrima.
109
static bit LED0 @ PORTBIT(PORTB,0); //
static bit LED1 @ PORTBIT(PORTB,1); //
static bit LED2 @ PORTBIT(PORTB,2); //
__EEPROM_DATA('L','C','D','T','_','B','R','1');
__EEPROM_DATA('v','e','r','-','1','.','0','0');
__EEPROM_DATA('s','e','p','-','2','0','0','6');
110
zahtevima. U primerima koji su navedeni, obavezno je koriscenje maksimalne
optimizacije kako bi generisani kôd rutine Delay bio odgovarajuceg trajanja.
Ukljucivanje optimizacije Hi-Tech kompajlera u MPLAB razvojnom
okruzenju se izvodi na sledeci nacin: u meniju Project>Build options... potrebno
je odabrati Project. U tabu PICC Compiler treba stiklirati Use alternate settings i
zatim u praznom polju upisati -0 –Zg (ako vec nije bilo upisano). Zatim se klikne
na OK. Ukljucivanje optimizacije Hi-Tech kompajlera prikazana je na slici3.3.
111
#include "delay.c" //potprogram koji unosi kasnjenje, o njemu bice reci
kasnije//
__CONFIG(LVPDIS&XT&PWRTEN&WDTDIS&DEBUGDIS); //podesavanje
PIC-a//
112
if(!ts3) //da li je pin RB3 na logicku nulu, ako jeste promenjiva k dobija
vtrednost 0//
{
i=0;
j=0;
k=1;
}
T0IF=0; //resetujemo fleg T0IF//
GIE=1;
}
} //zavsavamo prekidnu rutinu//
{
if(i==1)
{
led2=1; //ukljucujemo datu diodu//
DelayMs(250); //kasnjenje od 250ms//
DelayMs(250);
DelayMs(250);
DelayMs(250);
led2=0; //iskljucujemo datu diodu//
PORTC=0b10101010; //ukljucujemo svaku drugu diodu porta C//
DelayMs(250);
DelayMs(250);
113
DelayMs(250);
DelayMs(250);
PORTC=0x00; //iskljucujemo PORTC//
PORTE=0b101;
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
PORTE=0x00;
PORTA=0b101010;
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
PORTA=0b000000;
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
}
if(j==1)
{
PORTC=0x00;
PORTE=0b101;
PORTA=0x00000;
}
if(k==1)
{
PORTC=0x00;
PORTE=0b000;
PORTA=0b101010;
}
} //kraj beskonacne petlje//
} //kraj programa//
Sl 3.4 Listing programa za ukljucivanje LED
Potprogram "delay.c"
#include "delay.h"
void
DelayMs(unsigned char cnt)
{
#if XTAL_FREQ <= 2MHZ
114
do {
DelayUs(996);
} while(--cnt);
#endif
#ifndef DelayUs
#ifndef XTAL_FREQ
#define XTAL_FREQ 4MHZ
#endif
#define DelayUs(x)
{
unsigned char _dcnt;
_dcnt= (x)/(12MHZ/(XTAL_FREQ))|1;
while(--_dcnt != 0)
continue;
}
115
#endif
#include <pic.h>
#include "delay.c"
#include "lcd.c"
__CONFIG(LVPDIS&XT&PROTECT&PWRTEN&WDTDIS&DEBUGDIS) //
konfigurisemo PIC
///////////////////////////////////////////////////////
/////////////////////////// MAIN //////////////////////
116
void main(void)
{
TRISD=0x00;
PORTD=0x00;
Napomena:
Ovaj potprogram moze da se upotrbi samo za LCD-ove koji su formata 2X16
karaktera i kompatibilni su sa displejom baziranim na cip-setu HD44780.
#include <pic.h>
117
static bit LCD_RS @ PORTBIT(PORTD, 2); //
//-----------------------------------------------------------
// Procedure za kontrolu LCD-a HD44780 16x2
//-----------------------------------------------------------
#define LCD_STROBE() LCD_E = 1; LCD_E = 0
#define lcd_cursor(x) lcd_cmd(((x)&0x7F)|0x80)
#define lcd_clear() lcd_cmd(0x01); DelayMs(2);
#define lcd_putch(x) lcd_data(x)
#define lcd_goto(x) lcd_cmd(0x80+(x)); DelayUs(40);
#define lcd_gotoxy(x,y) lcd_cmd(0x80+x+(0x40*y));DelayUs(40);
#define lcd_cursor_right() lcd_cmd(0x14)
#define lcd_cursor_left() lcd_cmd(0x10)
#define lcd_display_shift() lcd_cmd(0x1C)
#define lcd_home() lcd_cmd(0x02); DelayMs(2);
118
// *-----------------------------------------
// * Konverzija decimalnih brojeva u string
// u opsegu od 0 do 999
// *----------------------------------------*/
void lcd_dec2str3(unsigned int x)
{
unsigned int y;
if (x<1000)
{
y=x/100;
lcd_putch(y+0x30);
x-=(y*100);
y=x/10;
lcd_putch(y+0x30);
x-=(y*10);
lcd_putch(x+0x30);
}
else lcd_puts("Err");
}
/* inicijalizacija LCD-a */
void lcd_init()
{
// {8 bit interfejs/i cekaj 5ms}
LCD_DATA = (LCD_DATA & 0b00001111) | 0x30;
LCD_STROBE();
DelayMs(5);
// {8 bit interfejs/i cekaj 160uS}
LCD_DATA = (LCD_DATA & 0b00001111) | 0x30;
LCD_STROBE();
DelayUs(160);
// {8 bit interfejs/i cekaj 160uS}
LCD_DATA = (LCD_DATA & 0b00001111) | 0x30;
LCD_STROBE();
DelayUs(160);
// {4 bit interfejs}
LCD_DATA = (LCD_DATA & 0b00001111) | 0x20;
LCD_STROBE();
DelayUs(160);
lcd_clear();
lcd_home();
}
Sl 3.8 Listing potprograma lcd.c
119
3.10 Program za komunikaciju razvojnog sistema sa racunarom
#include <pic.h>
#include "delay.c"
__CONFIG(LVPDIS&XT&PROTECT&PWRTEN&WDTDIS&DEBUGDIS); //
konfigurisemo PIC
// PROMENLJIVE
unsigned char brojac;
unsigned char primljeni_podatak;
// PROCEDURE
void Delay_1s() // procedura koja unosi kasnjenje
{ // od 1 sekunde
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
}
120
}
// slanje stringa
void RS232_putst(register const char *str)
{
while((*str)!=0)
{
RS232_putch(*str);
if (*str==13) RS232_putch(10);
if (*str==10) RS232_putch(13);
str++;
}
}
// *-----------------------------------------
// * Konverzija decimalnih brojeva u string
// u opsegu od 0..99 za RS232 komunikaciju
// *----------------------------------------*/
void RS232_dec2str2(unsigned int x)
{
unsigned int y;
if (x<100)
{
y=x/10;RS232_putch(y+0x30);x-=(y*10);
RS232_putch(x+0x30);
}
else RS232_putst("Err");
}
void main(void)
{
TRISA = 0b11111111;
TRISB = 0b00000000;
TRISC = 0b11111111;
121
// (5 analog channels = digital inputs xxxx 011x)
GIE = 0;
Na slici 3.10 je dat oblik potprograma koji moze da koristi kod kreiranja
nekih slozenijih programa. U njemu je sadrzana konverzija decimalnog broja u niz
ASCII karaktera, kao i predaja i prijem podataka ka/iz serijskog porta.
#include <pic.h>
#include „delay.c“
122
// prijem jednog karaktera
unsigned char RS232_getch()
{
if(RCIF) //prelazi u ’1’ kada je pun
{
RCIF = 0;
return RCREG;
}
CREN = 0; //ukoliko je doslo do greske obrisi je
CREN = 1; //enable reception
return 255; // ako nema podatka primljenog
}
// slanje stringa
void RS232_putst(register const char *str)
{
while((*str)!=0)
{
RS232_putch(*str);
if (*str==13) RS232_putch(10); //prelaz u novi red
if (*str==10) RS232_putch(13); //vrati se na pocetak reda
str++;
}
}
// *-----------------------------------------
// * Konverzija decimalnih brojeva u string
// u opsegu od 0..99 za RS232 komunikaciju
// *----------------------------------------*/
void RS232_dec2str2(unsigned int x)
{
unsigned int y;
if (x<100)
{
y=x/10;RS232_putch(y+0x30);x-=(y*10);
RS232_putch(x+0x30);
}
else RS232_putst(„Err“);
}
Sl 3.10 Listing potprograma za komunikaciju razvojnog sistema sa PC masinom
123
komunikacioni port po se predaju i primaju podaci). Ukoliko je sve u redu i COM
port uspesno inicijalizovan potrebno je kliknuti na dugme [Connect], a u prozoru
terminala bi trebao da se pojavi rezultat izvrsenja programa.
124
Zakljucak
Kao i realizacija prakticnog dela naseg zadatka, nimalo nije bilo jednostavno
opistai citav razvojni sistem i objasniti sve njegove delove. Od velike koristi nam
je bila literatura koju smo uspeli da nadjemo surfujuci po Internetu. Pre svega
''PIC16F87X Data Sheet'' iz koje smo koristili detalje koji se odnose na tehnicke
karateristike mikrokontrolera. To je bila i tema prvog poglavlja ovog rada.
Moramo pomenuti nekoliko skripti i diplomskih radova koji su na Internetu
postavile nase kolege i njihovi nastavnici sa tehnickih fakulteta bivse Jugoslavije.
U drugom delu opisana je hardverska struktura sistema zasnonovana na
mikrokontroleru PIC16F877A.. U trecem delu smo integrisali potreban softver za
punjenje programa u mikrokontroler, gde smo slikovito opisali kako se i kojim
redosledom softver instalira i listing samih programa koje smo dali i time
kompletirali razvojni sistem.
S postovanjem:
Branislav Dimitrijevic,
Slobodan Aleksic,
Ivan Antic
125
Dodatak 1
126
Sl.D.3 Logicka sema bafera
127
Sl.D.6 Elektricne osobine logickog kola 74ls07
(strujna i naponska ogranicenja)
128
Raspred nozica, izgled kucista, fizicke dimenzije i elektricne karakteristike
tranzistora BC557 date su na slikama od D8 do D12.
129
Sl.D.10 Elektricne karakteristike tranzistora BC557
130
Sl.D.12 Fizicke dimenzije tranzistora BC557
131
Na slici (sl.D.13) prikazan je njihov izgled i njihovi tehnicki podaci:
132
Sl.D.14 Tehnicki parametri i fizicki izgled koriscenih dioda
133
Sl.D.16 Logicka sema i fizicki izgled MAX232
134
Sl.D.18 Elektricne karakteristike maks 232
135
Sl.D.20 Fizicki izgled usmeraca
136
Dodatak 2
137
Branislav R. Dimitrijevic, rodjen 21.02.1983. godine u
Surdulici. U istom mestu zavrsio je srednju tehnicku
skolu na smeru automatika. Upisuje 2002. godine
Elektronski fakultet u Nisu, smer telekomunikacije, na
kome i danas uspesno studira. Student je pete godine. U
toku studiranja izradio je par projekata medju kojima je i
ovaj. Interesovanja: mikroprocesorki i mikrokontrolerski
sistemi, satelitske kimunikacije, projektovanje
telekomunikacionih sistema, web programiranje,
elektroakustika...
138