Professional Documents
Culture Documents
Razvojni Sistem Za PIC16F877A
Razvojni Sistem Za PIC16F877A
Mikroprocesorski sistemi
RAZVOJNI SISTEM ZA
MIKROKONTROLER
PIC 16F877A
Mentor:
Prof.Dr Mile Stojcev
Studenti:
Branislav Dimirijevic,
Slobodan Aleksic,
Ivan Antic
Sadrzaj:
UVOD-----------------------------------------------------------------------------------1.MIKROKONTROLERI------------------------------------------------------------1.1 Mikroprocesori u odnosu na mikrokontrolere-------------------------------1.2 Mikroprocesori------------------------------------------------------------------1.3 Mikrokontroleri ----------------------------------------------------------------1.4 Razlika izmedju mikroprocesora i mikrokontrolera------------------------1.5 Terminologija-------------------------------------------------------------------1.6 Mikroracunar--------------------------------------------------------------------1.7 Ostala kola za podrsku rada sistema----------------------------------------- 1.8 Mikrokontroler PIC16F877A--------------------------------------------------1.9 Osnovne karakteristike mikrokontrolera PIC16F877A--------------------1.10 Kratak opis mikrokontrolera PIC16F877A---------------------------------1.11 Raspored nozica ---------------------------------------------------------- ----1.12 Generator takta (Oscilator)----------------------------------------------- ---1.13 Takt/Instrukcijski ciklus------------------------------------------------------1.14 Reset-----------------------------------------------------------------------------1.15 Watchdog timer----------------------------------------------------------------1.16 Prekidi---------------------------------------------------------------------------1.17 U/I portovi----------------------------------------------------------------------1.18 A/D konverzija-----------------------------------------------------------------1.19 Strujna,naponska i temperaturna ogranicenja------------------------------1.20 Organizacija memorije--------------------------------------------------------1.21 Tajmeri -------------------------------------------------------------------------1.22 CCP moduli --------------------------------------------------------------------1.23 Ostale periferne jedinice------------------------------------------------------1.24 Set instrukcija mikrokontrolera PIC16F877A-----------------------------2.HARDVERSKA STRUKTURA RAZVOJNOG SISTEMA------------------2.1 Programator---------------------------------------------------------------------2.2 Modifikovani Tait programator-----------------------------------------------2.3 Mikrokontrolerski sistem-------------------------------------------------------2.4 Tasteri-----------------------------------------------------------------------------2.5 Led--------------------------------------------------------------------------------2.6 Max232---------------------------------------------------------------------------2.7 Deo za ispravljanje i stabilizaciju napona------------------------------------2.8 Deo za analogno-digitalnu konverziju----------------------------------------2.9 Deo za povezivanje LCD-a----------------------------------------------------2.10 Povezivanje kola za reset i oscilatora---------------------------------------2.11 Fizicki izgled stampanih plocica---------------------------------------------2.12 Tabelarni prikaz komponenata sa vrednostima koriscenih za razvojni
sistem---------------------------------------------------------------------------------3.PRATECI SOFTVER ZA PC I DEMO PROGRAMI--------------------------
4
5
5
5
7
8
8
9
10
10
11
11
13
14
16
17
22
22
24
31
32
33
37
37
38
39
60
60
63
63
64
65
67
67
68
68
73
73
75
78
78
105
106
107
108
110
111
111
116
120
125
126
UVOD
Sistem oplemenjen mikrokontrolerom u potpunosti zamenjuje coveka, malih je
dimenzija i mala je potrosnja energije. To nas je podstaklo da odaberemo zadatak
koji zahteva realizaciju razvojnog sistema sa LED indikatorima, LCD-om i
komunikaciju s racunarom. Naravno, centralana komponenta naseg sistema je
mikrokontroler PIC16F877A. Realizacija ovakvog sistema zahtevala je veliku
upornost,trud i pozrtvovanje pocev od idejnog resenja zadatka, preko
projektovanja plocica u programskom paketu Protel , stampanja plocica,
lemljenja komponenata na ploce, testiranja i usavrsavanja citavog sistema. Cilj
nam je bio da od svih ideja odaberemo onu pravu koja podrazumeva, pre svega,
jedostavnost, male dimenzije i nisku cenu. U ovom trenutku smo svesni da je
resenje moglo da bude efikasnije, ali permanentnim ispitivanjem smo se uverili da
i ovo nase resenje daje dobre rezultate.
Program napravljen na racunaru se uz pomoc adekvatnog softvera (mi smo
koristili IC-Prog) i 25-to pinskog kabla prenosi u nas razvojni sistem. Tu ga
prihvata programator koji puni mikrokontrler zahtevanim programom. Po
zavrsetku programiranja na monitoru racunara dobijamo informaciju da je
zahtevano ucitavanje programa u mikrokontroler zavrseno i tada mozemo poceti
sa radom. Komunikacija korisnika sa ovim sistemom omogucena je sa 7 tastera od
kojih je jedan Reset taster,a ostali su tasteri za odabir reima rada. Pritiskom
svakog tastera izvrsava se razlicita sekvenca programa koja se nalazi u
mikokontroleru. Korisnik od sistema moze da dobija informacije o njegovom radu
na tri nacina: preko LED indikatora koji se pali onako kako je to korisnik unapred
programski definisao u odredjenom modu rada, LCD-a na kome se ispisuje tekst
koji,takodje, korisnik prethodno definise u programu i komunikacija sa racunarom
gde, na primer, mozemo posmatrati brojac na monitoru racunara i resetovati ga sa
Reset tastera na nasem sistemu. Razvojni sistem je, za komunikaciju sa
racunarom, vezan devetopinskim kablom.
Zahvaljuci cinjenici da mikrokontroler PIC16F877A firme Microchip pretstavlja
integraciju centralne procesorke jedinice (CPU), memorije i periferija, ne zahteva
se slozeni eksterni hardver da bi se realizovao mikroraunarski sistem. Ovaj
mikrokontroler je izradjen u CMOS tehnologiji sa ugradjenom FLASH i EEPROM
memorijom za memorisanje programa i podataka. PIC16F877A ima tipicnu RISC
arhtekturu. Ova arhitektura karakterise se manjim skupom instrukcija koje se brze
izvsavaju od instrukcija kod CISC arhitekture.
U daljem tekstu cemo se truditi da detaljnije opisemo svaki deo sistema i da
pokazemo kako citav sistem radi. U prvom poglavlju reci cemo nesto vise o
samom mikrokontroleru PIC 16F877A. Drugi deo ce sadrzati hardverski opis
citavog sistema, a u trecem delu cemo detaljno opisati kako se kreira program na
racunaru koji treba loadovati (ucitati) u PIC, koji softver se koristi u te svrhe, kako
se do njega dolazi, kako se on instalira i kako ga treba podesiti na racunaru. Tu
cemo se potruditi da kroz primere objasnimo kako se koristiti razvojni sistem i
kako funkcionise sam mikrokontroler.
1. Mikrokontroleri
1.1 Mikroprocesori u odnosu na mikrokontrolere
Da bi ukazali na to kakva razlika postoji izmedju mikroprocesora i
mikrokontrolera analiziracemo sliku 1.1 koja predstavlja jedan detaljan blok
dijagram mikroracunarskog sistema.
Dok je mikroprocesor (CPU) na jedinstvenom cipu sam, mikrokontroler, na
jedinstvenom cipu, sadrzi CPU, RAM i ROM memoriju i ostale ulazno-izlazno
orijentisane gradivne blokove (paralelni i serijski interfejsi ,tajmeri, logika za
prihvatanje prekida, A/D i D/A konvertore i dr.).
10
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
Aritmetiko-logika 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
13
14
Tabela 1.1
LP
32 kHz
200 kHz
Tabela 1.2
68-100pF
15-33pF
Kristal
Kristal
Rezonator
Rezonator
Rezonator
Kristal
Kristal
Kristal
Rezonator
Rezonator
Kristal
Kristal
Kristal
XT
100 kHz
455 kHz
2.0 MHz
4.0 MHz
Tabela 1.3
100-150pF
47-100pF
15-33pF
15-33
HS
4.0 MHz
8.0 MHz
10.0MHz
15-33pF
15-33pF
15-33pF
15
16
17
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.
R1
< 0.7 V
R2 + R1
19
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).
Tabela 1.5: Postavljanje registara nakon reseta
Program Counter
Power-on reset (POR)
000h
MCLR reset pri
000h
normalnom radu
MCLR reset prilikom
000h
SLEEP rezima rada
WDT Reset pri
000h
normalnom radu
WDT Wake-up
(budjenje iz SLEEP
PC+1
rezima rada)
Interapt
004h
20
STATUS reg.
0001 1xxx
000u uuuu
0001 0uuu
0000 1uuu
uuu0 0uuu
uuu1 0uuu
Tabela 1.6
Registar
00h
01h
02h
03h
04h
05h
06h
08h
09h
0Ah
0Bh
80h
81h
82h
83h
84h
85h
86h
88h
89h
8Ah
8Bh
INDF
TMR0
PCL
STATUS
FSR
PORTA
PORTB
EEDATA
EEADR
PCLATH
INTCON
INDF
OPTION
PCL
STATUS
FSR
TRISA
TRISB
EECON1
EECON2
PCLATH
INTCON
Power-on reset
Legenda:
x Nepoznato stanje
u Nepromenjeno stanje
q Stanje zavisi od uslova
- - Ne postoji fizicki cita se kao 0
21
Budjenje iz
SLEEP
-interapt
-WDT time out
---- ---uuuu uuuu
PC+1
uuuq quuu
uuuu uuuu
---u uuuu
uuuu uuuu
uuuu uuuu
uuuu uuuu
---u uuuu
uuuu uuuu
---- ---uuuu uuuu
PC+1
uuuq uuuu
uuuu uuuu
---u uuuu
uuuu uuuu
---0 uuuu
---- ------u uuuu
uuuu uuuu
22
23
24
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.
26
27
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
Port E je sirine 3 bita.Ima mogucnost A/D konverzije.Svaki pin porta E moze da
se konfigurise softverski kao ulazni ili izlazni. Ulazni bafer je Schmitt Trigger
tipa. Pinovi se mogu konfigurisati kao digitalni ili analogni,kao i u slucaju porta
A, sto je vec pomenuto. Na slikama 1.30 i 1.31 prikazana je strukturna blok sema
PORTE i tabelarni prikaz registara koji sluze za konfigurisanje.
30
31
32
-55 do +125C
-0.3V do(Vdd+0.3)
-65 do +150C
-0.3V do +7.5V
0 do +14V
0 do +8.5 V
Ukupna disipacija
Maksimalna izlazna struja na pinu Vss
Maksimalna ulazna struja na pinu Vdd
Ulazna struja kroz klamp diode IIK (VI < 0 ili VI > VDD)
Izlazna struja kroz klamp diode IOK (VO < 0 or VO > VDD)
Maksimalna struja koju moze da primi jedan pin
Maksimalna struja koju moze da da svaki pin
Maksimalna struja koju moze port da primi(port A,B,C,D i
E)
Maksimalna struja koju moze port da da (port A,B,C,D i E)
1W
300mA
250mA
+/- 20mA
+/- 20mA
25mA
25mA
200mA
200mA
33
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 omoguio brzi pristup i redukcija kda. 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.
Programski broja (PC) odredjuje adresu instrukcije u programskom flesu koja
ce sledeca biti pribavljena. Rec je o 13-bitnom registru. Simbolicko ime nizeg
bajta je PCL. To je registar koji se moze i upisivati i iscitavati. Teih pet bita
programskog brojaca smesteni su u izolovani registar PCH kojem se pristupa
samo preko leca PCLATH mapiranom u internom RAM-u na adresi 0x0A.
STATUS registar je veoma bitan i zato je predvidjeno da se moze adresirati iz
bilo koje banke. On pokazuje status aritmeticko-logicke jedinice, reset status
mikrokontrolera i sadrzi bite za selekciju banki internog RAM-a. Od navedenih
flegova posebno treba izdvojiti Zero bit (Z) koji se postavlja kad je rezultat
aritmeticke operacije jednak nuli i bit prenosa/pozajmice Carry (C).
Registar OPTION_REG se koristi za konfiguraciju preskalera za tajmer 0 ili
Watchdog, za upravljanje tajmerom0, selekciju ivice okidanja eksternog interapta,
i za omogucavanje Pull-up otpornika na portu B.
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
36
37
38
39
flegovi
C,DC,Z
Z
Z
Z
Z
Z
trajanje
1
1
1
1
1
1
Z
-
1
1
1
C,DC,Z
-
1
1
1
1
BTFSC f, b
BTFSS f, b
ADDLW k
ANDLW k
CALL k
CLRWDT
GOTO
IORLW k
MOVLW k
RETFIE
RETLW k
RETURN
SLEEP
SUBLW k
XORLW k
1/2
1/2
C,DC,Z
TO, PD
TO, PD
C,DC,Z
1. ADDWF f,d
Operandi: f (0 - 255)
d (0 - 1)
Operacija: (W) + (f) (dest)
Dodaje sadrzaj registra W sadrzaju registra 'f'.
Ako je 'd' = 0 rezultat se smesta u registar W. Ako je 'd'= 1 rezultat se smesta u u
registar 'f'.
Primer:
ADDWF
FSR, 0
Pre instrukcije:
W= 0x17
FSR = 0xC2
40
Posle instrukcije
W= 0xD9
FSR = 0xC2
2. ANDWF f,d
Operandi: f (0 - 127)
d (0 - 1)
Operacija: (W) .AND. (f) (dest)
Logicki AND sa sadrzajima reistra W i 'f'
Ako je 'd' = 0 rezultat se smesta u registar W. Ako je 'd'= 1 rezultat se smesta u u
registar 'f'.
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)
MOWLW 10110011b ;u bitove koje gasimo ide 0
ANDWF POTRB, 1
Pre instrukcije:
W = 10110011b
PORTB = 01100110b
Posle instrukcije:
W = 10110011b
41
PORTB = 00100010b
3. CLRF f
Operandi: f (0 - 127)
Operacija: 00h (f)
Brise sadrzaj registra 'f' i setuje Z flag.
Primer:
CLRF
FLAG_REG
Pre instrukcije:
FLAG_REG = 0x5A
Posle instrukcije:
FLAG_REG = 0x00
Z=1
4. CLRW
Operandi: nema
Operacija: 00h (W)
Brise sadrzaj registra W i setuje Z.flag
Primer:
CLRW
Pre instrukcije:
W = 0x5A
Posle instrukcije
W = 0x00
Z=1
5. COMF f,d
Operandi:
f (0 - 127)
d (0 - 1)
Operacija:
(f) (dest)
42
COMF REG1,0
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)
Operacija:
(f) - 1 (dest)
Umanjuje zadrzaj registra 'f'
Ako je 'd' = 0 rezultat se smesta u registat W. Ako je 'd'= 1 rezultat se smesta u
registar 'f'.
Primer:
DECF CNT,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:
OVDE
GOTO
DALJE
DECFSZ
PETLJA
-------
CNT, 1
Pre instrukcije:
PC = adresa OVDE
Posle instrukcije
CNT = CNT - 1
Ako je CNT = 0
PC = adresa DALJE
Ako je CNT <> 0
PC = adresa OVDE + 1
8. INCF f, d
Operandi:
f (0 - 127)
d (0 - 1)
Operacija:
(f) + 1 (dest)
INCF CNT,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)
OVDE
GOTO
DALJE
INCFSZ
PETLJA
-------
Pre instrukcije:
PC = adresa OVDE
Posle instrukcije:
CNT = CNT + 1
Ako je CNT = 0:
PC = adresa DALJE
Ako je CNT <> 0:
PC = adresa OVDE + 1
10. IORWF f,d
Operandi:
f (0 - 127)
d (0 - 1)
45
CNT, 1
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)
MOWLW 01001100b ;u bitove koje palimo ide 1
ANDWF POTRB,1
Pre instrukcije:
W = 01001100b
PORTB = 01100110b
Posle instrukcije:
W = 01001100b
PORTB = 01110110b
11. MOVF f,d
Operandi:
Operacija :
f (0 - 127)
d (0 - 1)
(f) (dest)
MOVF FSR,0
Posle instrukcije:
46
f (0 - 127)
(W) (f)
MOVWF OPTION,0
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:
REG1 = 1110 0110
C =0
Posle instrukcije
REG1 = 1110 0110
W = 1100 1100
C=1
15. RRF f, d
Operandi: f (0 - 127)
d (0 - 1)
RRF REG1,0
Pre instrukcije:
REG1 = 1110 0110
C=0
Posle instrukcije:
REG1 = 1110 0110
W = 0111 0011
C =0
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'.
Primer 1:
SUBWF REG1,1
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'.
Primer:
SWAPF REG1,0
Pre instrukcije:
REG1 = A5
Posle instrukcije:
REG1 = A5
W = 5A
18. XORWF f, d
Operandi:
Operacija:
f (0 - 127)
d (0 - 1)
(W) .XOR. (f) (dest)
XORWF REG,1
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>)
BCF
FLAG_REG, 7
Pre instrukcije:
FLAG_REG = C7
Posle instrukcije:
FLAG_REG = 47
20. BSF f, b
Operandi:
Operacija:
f (0 - 127)
b (0 - 7)
1 (f<b>)
BSF
FLAG_REG, 7
Pre instrukcije:
FLAG_REG = 0A
Posle instrukcije
FLAG_REG = 8A
21. BTFSC f, b
Operandi:
f (0 - 127)
b (0 - 7)
Operacija:
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.
Primer:
OVDE
NIJE
NASTAVI
BTFSC FLAG,1
GOTO RUTINA1
---
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)
OVDE
NIJE
NASTAVI
BTFSC FLAG,1
GOTO RUTINA1
---
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)
Operacija:
(W) + k (W)
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)
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)
ANDLF 10110011b ; u bitove koje gasimo ide 0
Pre instrukcije:
W = 11101001b
Posle instrukcije:
W = 10100001b
25. CALL k
Operandi:
Operacija:
k (0 - 2047)
(PC) + 1 TOS
k (PC<10:0>),
(PCLATH<4:3>) (PC<12:11>)
CALL TAMO
Pre instrukcije:
PC = adresa OVDE
Posle instrukcije
PC = adresa TAMO
TOS = adresa OVDE
26. CLRWDT
Operandi:
Operacija:
nema
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:
Operacija:
k (0 - 2047)
k (PC<10:0>)
(PCLATH<4:3>) (PC<12:11>)
TAMO
Posle instrukcije
PC = adresa TAMO
28. IORLW k
Operandi:
k (0 - 255)
Operacija:
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)
IORLF
01001100b ; u bitove koje gasimo ide 1
Pre instrukcije:
W = 00110110b
Posle instrukcije:
W = 01111110b
29. MOVLW k
Operandi:
Operacija:
k (0 - 255)
(k) (W)
5A
Posle instrukcije
W = 5A
30. RETFIE
Operandi:
Operacija:
nema
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:
Operacija:
k (0 - 255)
kW
TOS (PC)
Registar W uzima osmobitnu vrednost literala 'k'. PC uzima vrednost sa vrha steka
(adresa povratka) Instrukcija traje dva ciklusa.
Primer:
CALL
TABELa ;W sadrzi offset vrednost tabele
-;W sada zahtevanu ima vrednost iz
-;tabele
TABELA ADDWF PC
;W = offset
RETLW k1 ;Pocetak tabele
RETLW k2
RETLW k3
RETLW k4
Pre instrukcije
W = 04
Posle instrukcije
W = k4
32. RETURN
Operandi:
Operacija:
nema
TOS (PC)
57
33. SLEEP
Operandi:
Operacija:
nema
00h WDT
0WDT 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)
Operacija:
(W) - k (W)
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:
Operacija:
k (0 - 255)
(W) .XOR. (k) (W)
AF
Pre instrukcije:
W = B5
Posle instrukcije
W = 1A
59
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 ICPROG 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
62
63
64
VDD
5V
=
= 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.
Kao sto se vidi iz proracuna otpornik treba da je veci od 100. U
konkretnom resenju koriscen je otpornik od 4k7 sto je znatno veci od
proracunatog. Ova vrednost je uzeta da bi smanjili potrosnju sistema, jer u ovom
slucaju kroz tastere protice struja od 1mA.
2.5 LED
LED (LED-Light Emmiting Diode) koje su koriscene su crvene, zute i
zelene boje. Za svaki port na cijem je izlazu vezana LED koriscena je posebna
boja diode. Tako da na deo PORTA (od RA1 do RA6) su vezane crvene LED, za
deo PORTC (od RC0 do RC5) zute, za PORTE zelene i za deo PORTD (RD0 i
RD1) crvene. Sve diode su precnika 3mm i difuznog su tipa. U Dodatku (slika
D.14) date su elektricne, mehanicke i opticke karakteristike dioda.
Struja LED-a, za odgovarajuci osvetljaj, na osnovu kataloskih podataka,
iznosi 10mA. Svaka od dioda je preko odgovarajuceg otpornika povezana na +5
V, cija se vrednost odredjuje na sledeci nacin.
65
VDD - Uf 5V - 1.7V
=
= 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.
b)Proracun za zelene LED:
VDD - Uf 5V - 2.1V
Rg =
=
= 290W
If
10mA
Gde su:
VDD napon napajanja
Uf napon na diodi
If - struja kroz diodu
Uzimamo vrednost za otpornik 270, jer tacna vrednost ne postoji u E24 nizu.
c)Proracun za zute LED:
Ry =
VDD - Uf 5V - 2.1V
=
= 290W
If
10mA
Gde su:
VDD napon napajanja
Uf napon na diodi
If - struja kroz diodu
Uzimamo vrednost za otpornik 270, jer tacna vrednost ne postoji u E24 nizu.
Na slici 2.7. prikazan je nacin povezivanja LED-a na portu C. Nacin
povezivanja LED dioda na drugim portovima je identican.
66
2.6 Max232
MAX232 se koristi za povezivanje razvojnog sistema sa racunarom po
standardu RS232C. U konkretnoj realizaciji iskorisceno je pakovanje DIP16.
Kolo se napaja jednostrukim naponom od 5 V. Veza razvojnog sistema sa PCijem je dupleks tipa. Podaci od PC masine ka razvojnom sistemu se vode preko
drajverskog stepena koji povezuje pinove 11 i 14 (T1IN i T1OUT-slika 2.8), a od
razvojnog sistema ka PC masini preko drajverskog stepena 12 i 13 (R1OUT i
R1IN-slika 2.8). S obzirom da prenos podataka ne prati i prenos taktnih impulsa
komunikacija je asinhrona serijska. U Dodatku (slike D.15 do D.18) su dati
tehnicki podaci koji se odnose na kolo MAX232..
67
Sl.2.10. Transformator
2.8 Deo za analogno-digitalnu konverziju
U konkretnoj realizaciji izvrseno je samo prosledjivanje naponskih nivoa sa
spoljneg ulaza na pin RA0.Povezivanje je ostvareno preko pina konektora J5.
68
69
70
71
72
73
74
75
Vrednost komponente
4k7
4k7
4k7
4k7
4k7
4k7
4k7
270
270
270
270
R12
R13
R14
R15
R16
R17
R18
R19
R20
R21
R22
R23
R24
R25
R26
R27
R28
R29
R30
C1
C2
C3
C4
C5
C6
C7
C8
C9
C10
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Potenciometar
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Otpornik 1/4W
Blok kondenzator
Keramicki kondenzator
Keramicki kondenzator
Elektrolitski kondenzator
Elektrolitski kondenzator
Elektrolitski kondenzator
Elektrolitski kondenzator
Elektrolitski kondenzator
Elektrolitski kondenzator
Elektrolitski kondenzator
LED 3mm
LED 3mm
LED 3mm
LED 3mm
LED 3mm
LED 3mm
LED 3mm
LED 3mm
LED 3mm
LED 3mm
76
270
270
270
270
270
330
330
330
330
330
330
330
10k
1k
1k
1k
10k
10k
100k
100nF
27pF
27pF
10F
10F
10F
10F
470F
100F
100F
Zuta
Zuta
Zuta
Crvena
Crvena
Zelena
Zelena
Zelena
Zelena
Zelena
D11
D12
D13
D14
D15
D16
D17
D18
D19
D20
D21
D22
Q1
Q2
Q3
Q4
J3
J4
J6
J7
J11
TS
OSC
T1
T2
T3
T4
T5
T6
T7
LCD
Kabl
Kabl
Kabl
LED 3mm
LED 3mm
LED 3mm
LED 3mm
LED 3mm
LED 3mm
Dioda
GREC
L7812CV
TS7805
Dioda
Dioda
Mikrokontroler
MAX232
PNP Tranzistor
TTL Bafer
D9 PCB Konektor
Konektor
D25 PCB Konektor
Muska kontaktna letvica
Konektor
Transformator 6VA
Oscilator
Mikroprekidac
Mikroprekidac
Mikroprekidac
Mikroprekidac
Mikroprekidac
Mikroprekidac
Mikroprekidac
Hitachi HD44780
25-pinski 1:1
9-pinski 1:1
Za Napajanje
77
Crvena
Zelena
Crvena
Crvena
Crvena
Crvena
BAT42
1A
1A
1A
1N4148
1N4148
PIC16F877A
BC557
SN 74LS07
Zenski
Dvopinski
Zenski
Dvopinska
220V
220/15V 400mA
4MHz
Musko/Muski
Musko/Zenski
-
78
79
80
81
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
85
86
5. Klikom na taster (polje) Browse bira se direktorijum gde se instalira HiTech, a zatim klikom na polje NEXT nastavlja se instalacija
87
8. Odgovorom na YES na generisnom prozoru izvrsice se integracija HiTech u MPLAB razvojnom okuzenju.
88
89
90
91
92
93
94
95
96
97
98
99
10. Sada je potrbno ucitati HEX fajl koji se dobija kompajliranjem programa.
To mozeme da se uradi klikom na: FileOpen 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
101
102
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
105
Znacenje
Karakter podataka
Kljucna rec
char
integer
float
int
float
double
double
106
void
Bez vrednosti
void
signed
signed
unsigned
unsigned
long
long
short
short
Obim u bitovima
1
1
8
8
8
16
8
8
16
16
16
32
Opseg
0 ili1
0 ili 1
0 do 255
0 do 255
0 do 255
0 do 65535
-128 do 127
-128 do 127
0 do 65535
0 do 65535
-32768 do 32767
3.4E-38 do 3.4E+38
3.4 Prekidi
Prekidi mogu se inicirati od strane velikog broja razlicitih internih ili
eksternih izvora u odnosu na PICmicroMCU. Kada se javi prekid, PIC hardver
sledi fiksni model ponasanja prikazan na slici 3.1.
107
108
''fuses'' podesavanja
__CONFIG (LVPDIS&XT&PROTECT&PWRTEN&WDTDIS&DEBUGDIS);
((unsigned)(&adr)*8+(bit))
@
@
@
109
PORTBIT(PORTC,0); //
PORTBIT(PORTC,1); //
PORTBIT(PORTC,2); //
static bit
static bit
static bit
LED0
LED1
LED2
@
@
@
PORTBIT(PORTB,0); //
PORTBIT(PORTB,1); //
PORTBIT(PORTB,2); //
110
111
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//
void main(void) //pocetak glavnog programa//
{
TRISD=0x00; //definisemo PORTD kao izlazni//
TRISB=0x3f; // definisemo PORTB kao ulazni, osim RA6 i RA7 koje
stavljamo kao izlazne jer ih i ne koristimo//
TRISE=0b000; //definisemo PORTE kao izlazni//
TRISA=0b000001; //definisemo PORTA kao izlazni, sem pina RA0 koji je
ulazni//
TRISC=0x00; //definisemo PORTD kao izlazni//
PORTE=0b000; //gasimo PORTE//
PORTA=0b000000; //gasimo PORTA//
PORTC=0x00; //gasimo PORTC//
PORTD=0x00; //gasimo PORTD
OPTION=0b00000011; //podesavamo vrednost preskajlera za tajmer0//
ADCON1=0b10001110; //definisemo PORTA kao digitalni, osim RA0 koji je
analogni ulaz//
T0IE=1; //omogucavamo prekid koji izaziva tajmer0//
RBIE=1; //omogucavamo prekid koji izaziva promena stanja na pinovima RA4
do RA7//
GIE=1; //omogucavamo dozvoljene prekide//
while(1) //beskonacna petlja//
{
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
U programu sa slike 3.4 koriscen je bibliotecni potprogram delay.c. On ima
zadatak da unese kasnjenje u izvrsenju programa izrazeno u milisekundama.
Listing potprograma je dat na slici 3.5.
Potprogram "delay.c"
#include
"delay.h"
void
DelayMs(unsigned char cnt)
{
#if XTAL_FREQ <= 2MHZ
114
do {
DelayUs(996);
} while(--cnt);
#endif
#if
#ifndef DelayUs
#ifndef
XTAL_FREQ
#define
XTAL_FREQ
#endif
#define
#define
4MHZ
MHZ *1000
KHZ *1
#if
XTAL_FREQ >= 12MHZ
#define
DelayUs(x)
{
unsigned char _dcnt;
_dcnt = (x)*((XTAL_FREQ)/12MHZ);
while(--_dcnt != 0)
continue;
}
#else
#define
DelayUs(x)
{
unsigned char _dcnt;
_dcnt= (x)/(12MHZ/(XTAL_FREQ))|1;
while(--_dcnt != 0)
continue;
}
115
#endif
extern void DelayMs(unsigned char);
#endif
Sl. 3.6 Listing biblioteckog potprograma delay.h
#include <pic.h>
#include "delay.c"
#include "lcd.c"
__CONFIG(LVPDIS&XT&PROTECT&PWRTEN&WDTDIS&DEBUGDIS)
konfigurisemo PIC
//
// GLOBALNE Promenljive
116
void main(void)
{
TRISD=0x00;
PORTD=0x00;
GIE=0; // iskljucujemo sve interapte
lcd_init();
brojac = 0;
#include
<pic.h>
117
static bit
LCD_RS
PORTBIT(PORTD, 2); //
// koliko * 8
//----------------------------------------------------------//
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);
/* posalji komandu LCD-u */
void lcd_cmd(unsigned char ins)
{
LCD_RS = 0; // COMMAND
LCD_DATA = (LCD_DATA & 0x0f) | (ins & 0xf0);
LCD_STROBE();
LCD_DATA = (LCD_DATA & 0x0f) | ((ins << 4) & 0xf0);
LCD_STROBE();
DelayUs(40);
}
/* posalji podatak LCD-u */
void lcd_data(unsigned char ins)
{
LCD_RS = 1; // podaci
LCD_DATA = (LCD_DATA & 0x0f) | (ins & 0xf0);
LCD_STROBE();
LCD_DATA = (LCD_DATA & 0x0f) | ((ins << 4) & 0xf0);
LCD_STROBE();
LCD_RS = 0; // podaci
DelayUs(40);
}
/* ispisi string na LCD-u */
void lcd_puts(const char * s)
{
while(*s)
lcd_data(*s++);
}
118
119
#include <pic.h>
#include "delay.c"
__CONFIG(LVPDIS&XT&PROTECT&PWRTEN&WDTDIS&DEBUGDIS); //
konfigurisemo PIC
__EEPROM_DATA('R', 'S', '2', '3', '2', '_', '_', '_');
__EEPROM_DATA('v', 'e', 'r', '-', '1', '.', '0', '0');
__EEPROM_DATA('j', 'u', 'n', '-', '2', '0', '0', '6');
#define
#define
#define
proracun
#define
// 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);
}
// slanje jednog karaktera
void RS232_putch(unsigned char c)
{
while(!TXIF); //prelazi u '1' kada je prazan
TXREG = c;
DelayUs(60);
120
}
// prijem jednog karaktera
unsigned char RS232_getch()
{
if(RCIF) //prelazi u '1' kada je prun
{
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);
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;
ADCON1 = 0b10000111;
121
= 0;
}
}
Sl 3.9 Listim programa za komunikaciju PC masine sa razvojnim sistemom
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
// slanje jednog karaktera
void RS232_putch(unsigned char c)
{
while(!TXIF); //prelazi u 1 kada je prazan
TXREG = c;
DelayUs(60);
}
122
123
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
127
128
129
130
131
132
133
134
135
136
Dodatak 2
137
138