209
PIC16F84 UPUTSTVO ZA RUKOVANJE Staza za plažu 6 kaca na Moravici u Sokobanji 1

PIC16F84

Embed Size (px)

Citation preview

Page 1: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 1/209

PIC16F84UPUTSTVO ZA RUKOVANJE

Staza za plažu 6 kaca na Moravici u Sokobanji

1

Page 2: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 2/209

1. Predgovor

Zašto baš PIC16F84? Taj mikrokontroler je zastareo, veliki, spor, skup...

Međutim da li je baš sve tako. Star? Pa šta. Nijedan moj kompjuter nije (u trenutkukupovine) bio mlađi od 4 godina. Prvi put sam na internet izašao mašinom sa100MHz i 16Mb. Ukoliko i dalje može poslužiti, godine mu nisu bitne. Čak zato ima i

 jednu prednost: ima ga na svakom ćošku!

 Njegova veličina za početnike može predstavljati samo pogodnost. Početniku jedaleko lakše lemljenje osamnaestopinskog DIP nego šezdesetčetvoropinskog TQFPkućišta, naravno na jednoslojnoj štampanoj pločici.

Brzina mikrokontrolera pri učenju ne igra nikakvu ulogu. Štaviše, na više mesta u programima datim u uputstvu namerno se moralo izazivati kašnjenje.

Cena mikrokontrolera! Jeste skup. Danas se mogu kupiti mnogo moćnijimikrokontroleri po manjoj ceni. Ali ukoliko se uzme u obzir i cena odgovarajućeg

 programatora (pogotovu mogućnost samogradnje), PIC16F84 je i dalje najjeftinijimikrokontroler.

Početniku u svetu mikrokontrolera najteže je napraviti onaj prvi korak. Nadam se daće mu ovo uputstvo će pomoći u tom putu. A posle? Lako će se sa stečenim znanjemnaučiti i mnogo komplikovaniji i savremeniji mikrokontroleri. Iako se hardverskemogućnosti mikrokontrolera neprekidno usavršavaju, softver uglavnom ostaje isti.

Za lakše razumevanje ovog uputstva poželjan je pristup internetu i potrebna suodređena predznanja:

● Osnovno poznavanje elektronskih kola (anoda i katoda LED, povezivanjeLED displeja, funkcija taster prekidača, obeležavanje izvoda integrisanih kola,

 pojam pina, funkcija diode u logičkim kolima, naponski nivoi logičke 0 i 1,visokoimpedansno stanje, Šmitov okidač)

● Osnovno poznavanje binarnih sistema (bit, bajt, binarno, decimalno,heksadecimalno, BCD i označavanje negativnih brojeva)

● Osnovne logičke operacije (Bulova algebra)

● Pojam multipleksa

● Princip serijskog prenosa podataka

 Nemojte dozvoliti da Vas ovaj spisak obeshrabri. Veliki deo ovoga je objašnjen uuputstvu.

Gradivo u uputstvu izloženo je od poznatih ka nepoznatim i od lakših ka težimlekcijama. Za dosta specifičnosti dati su primeri programa u kojima se upotrebljavaju.

Trudio sam se da gradivo što interesantnije izložim. Nadam se da sam uspeo.

2

Page 3: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 3/209

2. Dobar stil programiranja

Pre nego što uđete u finese programiranja, mislim da bi trebalo objasniti stilove programiranja.

● Ukoliko stavite ; (tačku-zarez) bilo gde u Vašem programu, kompajler ćeignorisati sve karaktere iza njega sve dok ne dođe do znaka za novi red. Ovoznači da možete staviti komentar unutar programa kako bi Vas podsetio šta seuopšte u njemu radi. Ovo je dobra praksa, čak i za najjednostavnije programe.Možda sada u potpunosti razumete šta program radi, ali za par meseci, samoćete se češkati po glavi. Zbog toga, komentarišite što više. Nema ograničenja.

● Možete pridružiti imena konstantama i registrima (više o ovome kasnije).Dosta je lakše čitati na srpskom u šta upisujete, ili šta označava broj, nego da

 pokušavate da se setite šta znače svi ti brojevi. Zbog toga, koristite opisna

imena kao npr. ZBIR. Primetili ste da sam napisao ime velikim slovima. Onose tako ističe.

●  Napravite zaglavlje programa koristeći tačku-zarez. Primer je dat ispod.

;*********************************************************; Autor : Pera Ždera Datum : 12.4.2008.; Verzija : 0.5 Naslov : Test;; Opis hardvera :; - RC oscilator 200KHz.

; - Svi tasteri su povezani od pinova ka masi.; T1 na RB0, T2 na RB1. Uključeni su interni Pull-up otpornici.; - Sve LED od +5V ka pinovima. LED1 na RA0, LED2 na RA2.;; Opis softvera :; - Stanje LED1 menja se prilikom svakog interapta sa T1; - Stanje LED2 menja se tajmerom na svakih 0,5S jedino; ukoliko je istovremeno pritisnut T2;; Dodatni fajlovi : p16F84.inc

;*********************************************************

Uočili ste da je napravljena neka vrsta kocke. Ovako izgleda preglednije.

● Izdvojite instrukcije od početka reda i labela sa par razmaka ili „Tab“dugmetom. Na taj način asembler prepoznaje da li je reč o instrukciji ili labeli,a program izgleda preglednije.

●  Najzad, isprobajte i dokumentujte Vaš program i na papiru. Možete koristitigrafike, algoritme ili šta god želite. To će vam pomoći u pisanju programa,korak po korak, kao i u njegovoj kasnijoj analizi.

A sada prelazimo na pravu stvar.

3

Page 4: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 4/209

3. Registri

Registar je RAM memorijska lokacija unutar mikrokontrolera u koju se možeupisivati, sa koje se može čitati, ili obavljati obe ove funkcije. Najlakše je da svaki odnjih zamislite kao kutiju u koju može stati do 255 klikera (različitih stanja).

Sledeća skica prikazuje raspored registara unutar PIC16F84 mikrokontrolera. Slika prikazuje adrese na kojima je smeštema RAM memorija (u obliku osmobitnihregistara) unutar mikrokontrolera, što će Vam pomoći pri razumevanju njihovogadresiranja.

Adresa BANK0 BANK1 Adresa0x00 INDF(1) INDF(1) 0x80

0x01 TMR0 OPTION_REG 0x81

0x02 PCL PCL 0x820x03 STATUS STATUS 0x83

0x04 FSR FSR   0x84

0x05 PORTA TRISA 0x85

0x06  PORTB TRISB 0x86 

0x07  / / 0x87 

0x08 EEDATA EECON1 0x88

0x09 EEADR EECON2(1) 0x89

0x0A PCLATH PCLATH 0x8A

0x0B INTCON INTCON 0x8B

0x0C 

 .

 .

 .

 .

 .

0x4F 

68 Registra opštenamene (statičkaRAM memorija)

Mapirani u BANK0

0x8C 

 .

 .

 .

 .

 .

0xCF 

0x50

 .

 .

 .

0x7F 

/ /

0xD0

 .

 .

 .

0xFF 

/ - Neimplementovana memorijska lokacija (čita se kao 0)(1) - Nije fizički registar 

4

Page 5: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 5/209

Primećujete da su registri podeljeni u dve grupe, označene sa BANK0 i BANK1.BANK1 se uglavnom koristi za konfigurisanje trenutnog hardverskog stanjamikrokontrolera. Uglavnom mu je (za jednostavnije programe) dovoljno pristupitisamo prilikom početne inicijalizacije mikrokontrolera. Kako se najbitniji registri(PORTA i PORTB) nalaze u BANK0, program će uglavnom biti u njoj. Sledećuspecifičnost predstavljaju prvih 12 registara u bankama (0x00 – 0x0B). Njima se

direktno upravlja radom mikrokontrolera što ih čini povlašćenim (eng. S pecialFunction R egisters - registri specijalne namene), dok je obična RAM memorija (eng.General Purpose R egisters - registri opšte namene) dostupna u registrima od 0x0C do0x4F, a istovremeno joj se može pristupiti i preko 0x8C do 0xCF adresa.

Sigurno ste već videli rampe za prolaznike po supermarketima ili autobuskimstanicama. One propuštaju prolaznike samo u jednom smeru. Unutar mikrokontroleraTRIS (TRISA i TRISB) registri izvršavaju ovu funkciju. Oni se nalaze na adresama0x85 i 0x86, respektivno. Da biste programirali željeni pin tako da bude ulazni iliizlazni (propušta prolaznike unutra ili napolje), pošaljete 1 ili 0 na njegov bit uodgovarajućem TRIS registru. Pri tome možete koristiti bilo koji (binarni, decimalni

ili heksadecimalni) format brojeva, međutim binarnim se slikovitije predstavlja stanježeljenog pina. Ukoliko niste vični pretvaranju binarnih u decimalne iliheksadecimalne brojeve i obratno, koristite bilo koji napredniji kalkulator.

Svi RA (RA0 do RA4) i RB (RB0 do RB7) pinovi mikrokontrolera imaju dvojakufuknciju. Oni mogu biti ulazni ili izlazni. Da li će biti ulazni ili izlazni podešava se uodgovarajućem TRIS registru.

 Na primer ukoliko se u TRISB nalazi sledeća binarna vrednost: b'00101111' pinovi će biti konfigurisani kao na slici. Primećujeteda bit 7 (eng. MSB –  Most Single Bit - bit najveće težine )

odgovara pinu RB7 i da se on prilikom binarnog označavanjanalazi sa leve strane. Nasuprot njemu bit 0, bit najmanje težine(eng LSB – Low Single Bit) odgovara pinu RB0. Potpuno istasituacija je i sa TRISA registrom, sa tom razlikom što su njemugornji bitovi neiskorišćeni (jer nemaju pripadajućih pinova).

 Na gornjoj slici pinovi su konfigurisani po sledećem:

 pin RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

 bit broj ( MSB)7 6 5 4 3 2 1 0(LSB)

stanje 0 0 1 0 1 1 1 1

Ulaz / Izlaz I I U I U U U U

Kako se TRISB nalazi u banci 1 (BANK1) potrebno je prebaciti se tamo. Da bi se prebacili iz banke u banku koristi se bit 5 STATUS registra. Za prebacivanje iz banke0 u banku 1 potrebno ga je setovati, a za vraćanje u banku 0, resetovati. STATUSregistar se nalazi na adresi 0x03 (0x03 ili h'03' označava brojeve uheksadecimalnom formatu. Binarni format se piše kao b'00000011', a decimalni

kao .03 ili d'03').

5

Page 6: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 6/209

Čemu konfigurisanje pinova? Ukoliko je odgovarajući pin konfigurisan (preko svogTRIS registra) kao izlazni, na njega se iz mikrokontrolera mogu poslati naponski nivoiod 0V i +5V, odnosno na njemu će se u svakom trenutku nalaziti jedan od ovihnapona. Pri tome se naponski nivo od 0V predstavlja kao logička 0, a napon od +5Vkao logička 1. Ukoliko je pak pin konfigurisan kao ulazni, mikrokontroler će usvakom trenutku moći da očita gore pomenute vrednosti napona na pinu, i u

zavisnosti od logičkog nivoa na pinu preduzme odgovarajuću akciju.

Pinove koji se ne upotrebljavaju u električnoj šemi potrebno je konfigurisati kaoizlazne. U protivnom varijacije napona na njima prouzrokuju povećanu potrošnju igrejanje mikrokontrolera, a eventualno i njegovu neispravnost.

Da biste postavili jedan od izlaznih pinova na visoki logički nivo, jednostavno treba poslati “1” na njemu odgovarajući bit u PORTA ili PORTB registru. Format zapisa jeisti kao i za TRIS registre. Slično tome, da biste pročitali da li se neki pin (ranijekonfigurisan kao ulazni) nalazi na logičkoj 0 ili 1, treba da proverite da li jeodgovarajući bit u PORTA ili PORTB registru u setovanom ili resetovanom stanju.

Pre nego što proučite primer asemblerskog kôda, treba objasniti funkciju još jednogregistra: W.

W (eng. Working - radni) registar je registar opšte namene u koji možete smestiti bilokoju brojčanu vrednost (u opsegu od .0 do .255) sa kojom želite raditi. Nakon što ste

 pridružili određenu vrednost registru W, možete mu pridružiti neku drugu vrednost(oprez – time biste automatski obrisali prethodnu) ili zapamćenu vrednost iz njega

 premestiti na neku drugu memorijsku lokaciju (registar). Za razliku od ostalihregistara on nema svoju adresu, već je integrisan u sklopu samog mikrokontrolera. Uopisima instrukcija se mogu sresti oznake f, k, b i d. Pri tome je sa f  (eng. f ile)

označena adresa jednog od registra iz tabele sa početka ovog poglavlja, k označavakonstantnu vrednost, b je redni broj bita u registru a d označava odredište (eng.destination) rezultata operacije.

Ilustrovaćemo sve do sada naučeno. Nemojte još uvek isprobavati ni kompajlirati kôd- to ćete uraditi kada dođete do prvog celovitog programa. Za sada pokušajte da

 prepoznate način na koji se konfigurišu portovi, i pripremite se da naučite par asemblerskih instrukcija.

Za pisanje kôda možete koristriti bilo koji tekst editor koji snima čist .txt fajl bezikakvih formatiranja. Na primer odličan Notepad++ (ugradio sam mu prepoznavanje inaglašavanje asemblerskih instrukcija),  Code Edit Pro (sam naglašava instrukcije),Windowsov Notepad ili Linuxov Leafpad. U jednom od narednih poglavlja,upoznaćete se sa MPLAB razvojnim okruženjem, i njegovim editorom.

 Najpre je potrebno prebaciti program iz banke 0 u banku 1. Ovo se radi setujući bit 5STATUS registra, čija je adresa 0x03.

 bsf 0x03,5

BSF f,b znači “setuj bit b u registru f” (eng. Bit Set f ). Ovde je f=0x03 što je adresaSTATUS registra (pogledajte raniju tabelu) i b=5 što označava redni broj bita u

STATUS registru. Dakle ovim je rečeno “setuj bit 5 na adresi 0x03”.

6

Page 7: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 7/209

Sada se, dakle, program nalazi u banci 1.

 movlw b'00101111'

Ovom instrukcijom smešta se binarni broj b'00101111' u W registar. Ovo isto mogliste da uradite sa heksadecimalnim brojem i tada bi instrukcija izgledala ovako:

 movlw 0x2F

Obe instrukcije rade potpuno istu stvar. MOVLW k znači “ubaci vrednost koja sledidirektno u registar W” (eng. Move Literal to W).

Sada treba premestiti ovu vrednost u TRISB registar, da bi se konfigurisali pinoviPORTB registra.

 movwf 0x86

Instrukcija MOVWF f znači: “premesti vrednost registra W u f registar” (eng. Move

W to f ). U ovom slučaju adresa f je adresa registra TRISB (vidite u tabeli). Bitno je primetiti da ovo nije premeštanje u svom bukvalnom značenju, jer je W registar nakoninstrukcije ostao nepromenjen. Pre bi joj odgovarao prevod kopiraj (eng. copy).

TRISB registar sada sadrži željenu vrednost, čime su konfigurisani ulazno/izlazni(skraćeno U/I) pinovi. Sada je potrebno prebaciti program u banku 0, kako bi se daljemoglo manipulisati signalima na U/I pinovima.

 bcf 0x03,5

Ova instrukcija je suprotna od BSF. BCF f,b znači “resetuj bit b u registru f” (eng. Bit

Clear f ). Brojevi koji slede su adresa registra (f), u ovom slučaju STATUS registra i broj bita (b), u ovom slučaju bit 5. Dakle ovim je u stvari resetovan bit 5 STATUSregistra. Posledica poslednje instrukcije je da se program ponovo nalazi u BANK0.

Primećujete da je adresa STATUS registra ista, iako bi u BANK1 trebala biti 0x83. Nemoj da vas to buni. Svim registrima u BANK1 može se pristupati preko adresaregistra u BANK0, jedino je bitno pravilno podesiti u kojoj se banci nalazi program.Ipak, ne preterujte sa ovim. Razumljivije je čitati program sa normalnim adresama. Zaregistre koji su zajednički za obe banke, ovo je potpuno svejedno.

Ceo prethodni kôd zapisan u jednom bloku izgleda ovako:

 bsf 0x03,5 ; Idi u BANK1 movlw b'00101111' ; Stavi b'00101111' u W movwf 0x86 ; Prebaci b'00101111' u TRISB bcf 0x03,5 ; Vrati se u BANK0

 Nakon što snimite fajl, promenite mu txt ekstenziju u asm. Za ovo će vam uWindowsu trebati Total Commander , a u Linuxu npr. Gnome Commander .

Proučite prethodni primer nekoliko puta, sve dok ne budete u stanju da ga u

 potpunosti razumete. Za sada ste naučili 4 instrukcije. Još samo 31!

7

Page 8: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 8/209

4. Izlazi

U prethodnom poglavlju ste naučili kako da konfigurišete U/I pinove porta tako da budu ulazni ili izlazni. U ovom poglavlju ćete naučiti kako da pošaljete odgovarajućilogički nivo na portove. U primeru koji sledi cilj će Vam biti da omogućite treptanje

 jedne LED (eng. Light Emitting Diode), i u njemu ćete videti jedan potpuni program. Nemojte još uvek isprobavati, kompajlirati ni programirati Vaš PIC listinzima kojislede, jer su oni dati samo kao ilustracija.

 Najpre treba podesiti drugi bit PORTA registra tako da bude izlazni:

 bsf 0x03,5 ; Idi u banku 1 movlw b'00000000' ; Stavi 00000 u W movwf 0x85 ; Prebaci 00000 u TRISA – svi pinovi su izlazni bcf 0x03,5 ; Vrati se u BANK0

Ovo bi trebalo da Vam bude poznato iz prethodnog primera. Jedina razlika je u tomešto ste sada podesili sve pinove PORTA registra kao izlazne, šaljući 0x00 u TRISAregistar.

Zatim treba uključiti LED. Zato treba na jedan od pinova (onaj na kome je povezanaLED) poslati logičku 1. Evo kako se to radi. (Obratite pažnju na komentare kôda):

 movlw b'00000100' ; Upiši .4 u W registar.

 movwf 0x05 ; Prebaci sadržaj iz W (.4) u PORTA, čija adresa je

; 0x05. To postavlja logičku 1 samo na pinu RA2.

; Pošto je LED uključena, treba je isključiti.

 movlw b'00000000' ; Upiši .0 u W registar.

 movwf 0x05 ; Prebaci sadržaj iz W (.0) u PORTA, čija adresa je 0x05

Ovim ste postigli da jednom uključite, i zatim isključite LED. Ono što želite da postignete jeste da LED neprekidno treperi. To se može implementirati vraćajućiizvršenje programa na početak. Postavite “labelu” (oznaku) na početak programa, izatim recite programu da nastavi svoje izvršavanje sa tako označene pozicije.

Labela se postavlja veoma jednostavno: upišite ime, recimo Poc, i zatim prepišitesledeći kôd:

Poc movlw b'00000100' ; Upiši .4 u W registar.

 movwf 0x05 ; Prebaci sadržaj iz W (.4) u PORTA, čija adresa je; 0x05. To postavlja logičku 1 samo na pinu RA2.

8

Page 9: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 9/209

; Pošto je LED uključena, treba je isključiti.

 movlw b'00000000' ; Upiši .0 u W registar.

 movwf 0x05 ; Prebaci sadržaj iz W (.0) u PORTA, čija adresa je 0x05; To postavlja logičku 0 na sve pinove (RA0 do RA4)

goto Poc ; Nastavi dalje izvršavanje programa od labele Poc

Kao što primećujete, najpre je ispred instrukcije na početku reda stavljena labela“Poc”. Na samom kraju programa je “goto Poc” instrukcijom nastavljeno daljeizvršavanje programa od labele. Instrukcija GOTO k znači “idi na” (eng. Go-idi, To-na) adresu (k) ili labelu.

Program će sada neprekidno uključivati i isključivati LED od trenutka dovođenjanapona napajanja, a prestaće po njegovom nestanku.

Pogledajte još jednom isti program:

 bsf 0x03,5 movlw b'00000000' movwf 0x85 bcf 0x03,5

Poc movlw b'00000100' movwf 0x05 movlw b'00000000' movwf 0x05goto Poc

Komentari su namerno izostavljeni i sve što možete videti jesu nizovi instrukcija i brojeva. Ovo može da bude krajnje zbunjujuće ukoliko kasnije pokušavate daispravite eventualno otkrivenu grešku u programu, ali već i tokom prvobitnog pisanja

 programa, kada treba zapamtiti sve te pojedinačne adrese. Čak i kada biste dodalikomentare, program bi i dalje delovao nejasno. Zbog toga treba svim brojevima datiimena. Ovo može da se uradi naredbom “equ”, koja jednostavno znači “jednakonečemu drugom” (eng. Equal – jednak). Važno je da primetite da ovo nije instrukcijaza PIC već tzv. direktiva koja ima uticaj na sam asembler (više o njemu kasnije).Program koji sadrži “equ” direktivu će, dakle, nakon asembliranja u mašinski kôdPIC-a, biti identičan programu bez “equ” direktive. Ovom direktivom samozamenjujete željeni broj imenom.

Postupite ovako: izbacite sve komentare ali imenujte registre u Vašem programu, azatim ocenite čitljivost takvog programa.

STATUS equ 0x03 ; Ovo pridružuje naziv STATUS broju 0x03, koji; predstavlja adresu STATUS registra

TRISA equ 0x85 ; Ovo pridružuje naziv TRISA broju 0x85, koji; predstavlja adresu TRISA registra

9

Page 10: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 10/209

PORTA equ 0x05 ; Ovo pridružuje naziv PORTA broju 0x05, koji; predstavlja adresu PORTA registra

RP0 equ 0x05 ; Ovo pridružuje reč RP0 broju 0x05, koji predstavlja; redni broj bita unutar STATUS registra.

Imena moraju biti definisana pre nego što budu upotrebljena, i zbog toga ih uvek definišite na početku svakog programa. Nakon imenovanja registara, unesite njihovaimena i u aktivni deo programa. Ukoliko sada prepišete program bez komentara, ali saimenovanim registrima, moći ćete da uporedite preglednost i čitljivost takvog listingasa prethodnim:

STATUS equ 0x03TRISA equ 0x85PORTA equ 0x05RP0 equ 0x05

 bsf STATUS,RP0 movlw b'00000000' movwf TRISA bcf STATUS,RP0

Poc movlw b'00000100' movwf PORTA movlw b'00000000' movwf PORTAgoto Poc

Sigurno ste primetili da imenovani registri čine praćenje programa znatno lakšim, čak i bez ikakvih komentara. Takođe možete primetiti da se imenovani registri razlikujuod labele po tome što su im sva slova velika. Na taj način ne možete doći u situacijuda kasnije razmišljate da li je neka takva oznaka labela ili imenovani registar.

Možda vam deluje čudno što PORTA registar i RP0 bit STATUS registra imaju istuvrednost (0x05). Međutim, razlika je očigledna. PORTA predstavlja adresu registra, aRP0 bit 5 STATUS registra. Asembler ne pravi razliku između njih jer im je vrednostista (čak se mogu i zameniti), ali vodi računa o njihovom redosledu unutar instrukcije.

Takođe možete videti da su instrukcije odvojene od početka reda. To je obavezno, da

ih asembler ne bi preveo kao labele.

10

Page 11: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 11/209

5. Prazne petlje

U prethodnom programu postoji mala greška. Skoro svaka instrukcija zahteva jedaninstrukcijki ciklus da bi se izvršila. Instrukcijski ciklus je 4 puta veći od taktaoscilatora. Ukoliko kao oscilator za takt za PIC16F84 koristite kvarcni kristal od4MHz trajanje svake instrukcije će biti 4MHz/4ciklusa, ili 1μS. Kako se koristi samo5 instrukcija, LED će se uključiti i isključiti u samo 6μS. Zbog čega 6 a ne 5? Zbogtoga što instrukcije koje menjaju stanje programskog brojača (eng. Program Counter – više o njemu kasnije) poput GOTO za svoje izvršenje troše 2 instrukcijska ciklusa.Kako je to treptanje previše brzo da biste ga uopšte mogli primetiti, zbog sporosti okadelovaće Vam kao da LED svetli konstantno, ali sa pola snage. Dakle potrebno jenapraviti adekvatno kašnjenje između trenutka uključenja i isključenja LED.

Uobičajeni princip po kome se implementira kašnjenje jeste da mikrokontroleruzadate da odbrojava od prethodno postavljenog broja do nule, i da u trenutku

dostizanja nule prekine odbrojavanje. Nulta vrednost, dakle, predstavlja kraj i izlazak iz petlje, nakon čega PIC nastavlja sa izvršavanjem daljeg programa.

 Najpre treba definisati konstantnu vrednost koja će predstavljati inicijalnu vrednost brojača. Nazovite je BROJAC. Zatim treba odlučiti kolika će biti stvarna vrednostovog broja. Najveći broj koji se može zadati je d'255' odnosno 0xFF. Međutim, kao što je napomenuto u prethodnom poglavlju, naredba equ pridružujeimena običnim brojevima, ne praveći razliku između adresa registra i bitova. Zatoćete, ukoliko probate njom pridružiti vrednost 0xFF, dobiti grešku pri kompajliranju

 programa. Ovo se dešava jer memorijska adresa 0xFF nije implementovana u

PIC16F84, i zbog toga joj ne možete pristupiti. Pa kako onda pridružiti željeni broj?Za to je potrebno da sa strane sagledate situaciju. Ukoliko imenu BROJAC pridružite,na primer adresu 0x0C, ona će ukazivati na adresu registra opšte namene (RAMmemoriju koju možete slobodno koristiti). Prilikom dobijanja napona napajanja, svineiskorišćeni registri u mikrokontroleru (osim registara specijalne namene)

 postavljaju se na vrednost 0xFF. Zato će BROJAC imati vrednost 0xFF.

Ali, kako onda podesiti BROJAC na drugu vrednost? Sve što trebate uraditi je daubacite željenu vrednost u taj registar. Na primer, ukoliko želite da BROJAC sadrživrednost 0x85, ne možete napisati BROJAC equ 0x85, jer će onda BROJAC sadržatiadresu TRISA registra. Zato trebate uraditi sledeće:

 movlw 0x85 ; Najpre stavite broj 0x85 u W registar, movwf 0x0C ; a onda ga prebacite u 0x0C registar 

Sada možete slobodno napisati BROJAC equ 0x0C. Vrednost unutar imenovanogregistra BROJAC koji se nalazi na adresi 0x0C će biti 0x85.

Korišćenje neinicijalizovanih (0xFF) vrednosti može dovesti do zabune prilikomkasnije analize programa. Verovatno ćete se pitati kako ste mogli smanjiti vrednost uregistru bez njegove prethodne inicijalizacije. U primerima u ovom uputstvu one sukorišćene isključivo zbog štednje prostora. Ukoliko ih Vi budete koristili u svojim

 programima obavezno to naglasite odgovarajućim komentarima.

11

Page 12: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 12/209

Znači, najpre je potrebno imenovati registar:

BROJAC equ 0x0C

Dalje se treba smanjivati vrednost registra BROJAC sve dok ne dostigne vrednost0x00. Unutar PIC postoji instrukcija kojom se može ovo uraditi, uz malu pomoć

instrukcije goto i labele. Ta instrukcija ima sledeći oblik:

decfsz BROJAC,1

Instrukcija DECFSZ f,d (eng. Decrement f , Skip if  zero) znači “Smanji vrednostregistra f (u ovom slučaju BROJAC odnosno 0x0C) i stavi dobijenu vrednost u W ako

 je d=0, odnosno u registar f ako je d=1. Ukoliko je rezultat nakon smanjenja jednak 0 preskoči sledeću instrukciju”.

Kako se odredište rezultata koristi u dosta instrukcija, a kao što ste već naučili lakše je pamtiti imena umesto brojeva, moguće je i bitu odredišta dati ime, na sledeći način:

W equ .0F equ .1

Mnogo reči, za jednu instrukciju. Pogledajte njenu primenu u praksi.

BROJAC equ 0x0CPet decfsz BROJAC,F

goto Pet

 Nastavi odavde

Ovde je najpre (inicijalno) postavljena konstanta BROJAC na 0xFF. U sledećem redudefinisana je labela nazvana Pet, i zadana je decfsz instrukcija. Decfsz BROJAC,Fsmanjuje vrednost registra BROJAC za 1, i rezultat vraća u registar BROJAC. Onaistovremeno proverava da li je nova vrednost registra BROJAC jednaka 0. Ukolikonije, program se nastavlja od sledeće linije. U sledećoj liniji imamo instrukciju goto,koja vraća izvršenje programa na decfsz instrukciju.

To se ponavlja sve dok vrednost registra BROJAC ne bude jednaka nuli. Onda program preskače sledeću instrukciju (u ovom primeru goto) i nastavlja od mesta gde je napisano “Nastavi odavde”. Kao što vidite, ovim se program “vrti” u jednom mestutačno određeno vreme (kao brojanje u žmurkama), pre nego što nastavi dalje. To se

naziva “prazna petlja”. Kako bi se jednom petljom postiglo maksimalno kašnjenje od3μS * 256 = 768μS, biće Vam potrebne bar dve petlje (jedna unutar druge) ukupnogkašnjenja od 3μS * 256 * 256 = 0,2S da biste mogli primetiti kako LED treperi.

U prošlom poglavlju to nije naglašeno, ali svakom programu potrebno je definisati početak (adresu unutar PIC16F84 sa koje počinje snimanje kôda) i kraj (posle koganema više instrukcija). Početak programa se definiše sledećom direktivom

ORG 0x00

Sada ubacite ove petlje u program, i dovršite ga praveći pravi program sa

komentarima:

12

Page 13: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 13/209

; ****** Imenovanje registra ******STATUS equ 0x03 ; Adresa STATUS registraTRISA equ 0x85 ; Adresa TRISA registraPORTA equ 0x05 ; Adresa PORTA registraBROJAC1 equ 0x0C ; Prvi brojač za praznu petlju. Inicijalno 0xFFBROJAC2 equ 0x0D ; Drugi brojač za praznu petlju. Inicijalno 0xFF

RP0 equ 0x05 ; Oznaka bita 5 STATUS registraF equ .1 ; Oznaka odredišta rezultata instrukcije

; ****** Podešavanje porta ******org 0x00

 bsf STATUS,RP0 ; Prebacuje program u banku 1 movlw b'00000000' ; Postavlja sve pinove movwf TRISA ; kao izlazne movwf TRISB ; bcf STATUS,RP0 ; Vraća program u banku 0

; ****** Uključi LED ******

Poc movlw b'00000100' ; Uključuje LED stavljajući vrednost movwf PORTA ; b'00000100' u W, a zatim i u PORTA

; ****** Prva petlja aktivna pri uključenoj LED oko 0,2S ******

Pet1 decfsz BROJAC1,F ; Smanji BROJAC1 za 1goto Pet1 ; Ukoliko je BROJAC1 jednak 0, nastavi daljedecfsz BROJAC2,F ; Smanji BROJAC2 za 1

goto Pet1 ; Ukoliko je BROJAC2 jednak 0, nastavi dalje,; u suprotnom vrati se na početak petlje.; Ovaj brojač broji nadole od 255 do 0, 255 puta; To je tzv. petlja unutar petlje.

; ****** Kašnjenje završeno. Sada isključi LED ******

 movlw b'00000000' ; Isključi LED stavljajući 0 u W registar, movwf PORTA ; a zatim u PORTA

; ****** Druga petlja aktivna pri isključenoj LED oko 0,2S ******

Pet2 decfsz BROJAC1,F ; Druga petlja drži LED isključenomgoto Pet2 ; dovoljno dugo da bi se to moglo primetitidecfsz BROJAC2,F ;goto Pet2 ;

; ****** Sada se program vraća na početak ******goto Poc ; Vraćanje na početak programa

; ****** Kraj programa ******

end; Direktiva za označavanje kraja programa.

13

Page 14: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 14/209

 Naravno, želećete da isprobate program da bi videli da li zaista radi. Evo električnešeme koju trebate napraviti za test ovog programa.

Takt mikrokontrolera određen jeupotrebljenim RC oscilatornimkolom (otpornik od 10kΩ i

kondenzator od 33pF).

Iako za dati primer nije potrebnokonfigurisati pinove oba porta, to je

 poželjno ukoliko su pinovi naPORTB nepovezani. Bolje jeutrošiti instrukciju više negorizikovati nepouzdan rad ilioštećenje mikrokontrolera.

Isto tako LED je moguće povezati

direktno na pin (bez otpornika), pošto PIC16F84 ima internoograničenje izlazne struje na max.25mA. Međutim to nije poželjno.Cena otpornika je zanemarljiva uodnosu na cenu mikrokontrolera.

U praksi se češće sreće inverzna logika za povezivanje LED tako što se anoda LED poveže na +5V, a katoda (preko otpornika) na pin. Pri tome će LED svetleti podovođenju logičke 0 na pin. Ovo je moguće jer pin pri logičkoj 0 može upijati strujudo 25mA, a i poželjno zbog manjeg grejanja i potrošnje mikrokontrolera.

Čestitamo. Upravo ste napravili svoj prvi program, i napravili kolo kojim se LEDuključuje i isključuje. Za sada ste sledeći ova uputstva naučili 7 od ukupno 35instrukcija, i već kontrolišete ulazno izlazni port.

U sledećem poglavlju naučićete kako da svoj kôd kompajlirate i snimite u PIC.

14

Page 15: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 15/209

6. MPLAB Asembler

U ovom poglavlju upoznaćete se sa MPLAB razvojnim okruženjem, i specijalnimfunkcijama njegovog editora.

Sa sajta http://www.microchip.com/  trebate skinuti programski paket MPLAB. Onima integrisan editor (umesto Windows Notepada), asembler, simulator i drajvere zasvoje programatore. Na žalost nas sa dial-up vezom, sam paket teži oko 65Mb.

Funkcija editora bi trebalo da vam je jasna. Generisanje čistog .asm fajla. Asembler služi da tekstualne instrukcije iz .asm fajla pretvori u mašinski kôd koji PIC razume.U protivnom, umesto instrukcije movlw 0x01 trebali bi pisati binarni mašinski kôd110000 00000001.

Verovatno Vam je već dosadilo da iznova i iznova pišete STATUS equ 0x03 i ostala

standardna imena. MPLAB asembler ima mogućnost učitavanja fajla koji sadrži svaova imena. Još bolje, u sebi ima i predefinisane obrasce (eng. standard code template)za upis asemblerskog programa sa zaglavljem, uobičajenim direktivama, posebnimdelom za interapte (više o njima kasnije)...

MPLAB ima jedan poznat bag koji se ogleda u nemogućnosti rada sa putanjom dofoldera dužom od 51 karaktera. Zato direktno u C: napravite folder „Moji programi“.U njega kopirajte sledeći fajl:

P16f84.inc - sadrži sve standardne labele

Ovaj fajl trebalo bi da se nalazi u folderuC:\Program Files\Microchip\MPASM Suite\P16f84.inc

Onda u Vašem tekst editoru napravite sledeće zaglavlje,

;**********************************************************; Autor :; Datum :; Verzija :; Naslov :;

; Opis hardvera :; Opis softvera :; Potrebni fajlovi : p16F84.inc;

;**********************************************************

list p=16F84 ; Definiše upotrebljeni mikrokontroler 

#include <p16F84.inc> ; Ubacuje nazive registra u program

15

Page 16: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 16/209

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC; Podešava konfiguracione bitove.; Više o njima kasnije.

ORG 0x00 ; Definiše start programa

; Prostor za vaše programe.

end ; Kraj programa

i snimite ga u folder „C:\Moji programi“ sa nazivom „Zagl.asm”.

Unutar foldera „C:\Moji programi“ napravite folder „Proba“.

Ovo zaglavlje možete koristiti za svaki novi program koji pravite, međutim uvek gamožete promeniti, tako da odgovara Vašim specifičnim potrebama.

Ukoliko zavirite u strukturu p16F84.inc fajla (F3 iz Total Commandera), možete primeriti da su u njemu imenovani svi registri, pa čak i bitovi pojedinih registra.Ukoliko Vam njegova trenutna struktura iz bilo kog razloga ne odgovara, i ovaj fajlmožete editovati po sopstvenim potrebama. U tom slučaju uvek ga čuvajte zajednosa .asm programom.

Sada uključite MPLAB IDE. Ne obazirite se na prozore koje je otvorio, već sleditesledeću proceduru: Project, Project Wizard, Next, izaberite PIC16F84, Next

Izaberite (ukoliko već nije) Microchip MPASM Toolsuite.

Kliknite na „MPASM Assebmler (Mpasmwin.exe)“, i proverite da li se nalazi ufolderu C:\Program Files\Microchip\MPASM Suite. Ukoliko ga nema,locirajte ga ručno klikom na Browse. Ostala dva fajla Vam (za sada) nisu bitna.

 Next, Upišite ime projekta (npr. Proba) i izaberite putanju do ranije napravljenogfoldera C:\Moji programi\Proba

 Next, Uđite u C:\Moji programi. Kliknite naizmenicno na P16f84.inc,Zagl.asm, i na Add, tako da se oba fajla pojave u desnom prozoru. Kliknite naslova A pored njih dok se ne promene u C (Copy). Na taj način se odabrani fajlovikopiraju u trenutni projekat (u folderu Proba), tako da originali ostaju nepromenjeniza idući put. Ostale moguće opcije su U (User) – relativna putanja do fajlova, S(System) – apsolutna putanja i A (Auto) – MPLAB sam odlučuje.

 Next i kliknite na Finish.

U novootvorenom prozoru „Proba.mcw“ duplo kliknite na Zagl.asm. Otvara se prozor editora u kome možete pisati Vaš program.

Možda vam ovaj postupak trenutno izgleda komplikovano, ali u praksi je potrebno ponoviti ga 2 do 3 puta da bi postao to što i jeste. Obična rutina.

16

Page 17: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 17/209

Sa svim ovim podešavanjima kompletan program bi trebao izgledati otprilike ovako:

;**********************************************************; Autor Pera Detlić; Datum 23.3.2008; Verzija 7,8

; Naslov Treptanje LED;; Opis hardvera : - RC oscilator, LED od pina RA2 ka masi; Opis softvera : - Ovim programom omogućeno je treptanje LED;; Potrebni fajlovi : p16F84.inc

;**********************************************************

; ****** Inicijalizacija asemblera ******

list p=16F84 ; Definiše upotrebljeni mikrokontroler 

#include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitove.

; ****** Imenovanje registra ******

BROJAC1 equ 0x0C ; Prvi brojač za praznu petlju. Inicijalno 0xFFBROJAC2 equ 0x0D ; Drugi brojač za praznu petlju. Inicijalno 0xFF

; ****** Podešavanje porta ******

org 0x00 bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw b'00000000' ; Postavlja sve pinove movwf TRISA ; kao izlazne movwf TRISB

 bcf STATUS,RP0 ; Vraća program u BANK0

; ****** Uključi LED ******

Poc movlw b'00000100' ; Uključi LED stavljajući b'00100'

 movwf PORTA ; u W registar, a zatim i u PORTA

; ****** Prve petlja aktivna pri uključenoj LED oko 0,2S ******

Pet1 decfsz BROJAC1,F ; Smanji BROJAC1goto Pet1 ; Ukoliko je BROJAC1 jednak 0, nastavi daljedecfsz BROJAC2,F ; Smanji BROJAC2goto Pet1 ; Ukoliko je BROJAC2 jednak 0, nastavi dalje,

; u suprotnom vrati se na početak petlje.; Ovaj brojač broji nadole od 255 do 0, 255 puta; To je tzv. petlja unutar petlje.

17

Page 18: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 18/209

; ****** Kašnjenje završeno. Sada isključi LED ******

 movlw b'00000000' ; Isključi LED stavljajući 0 u W registar, movwf PORTA ; a zatim u PORTA

; ****** Druga petlja aktivna pri isključenoj LED oko 0,2S ******

Pet2 decfsz BROJAC1,F ; Druga petlja drži LED isključenomgoto Pet2 ; dovoljno dugo da bi se to moglo primetitidecfsz BROJAC2,F ;goto Pet2 ;

; ****** Vraćanje programa na početak ******

goto Poc ; Vraćanje na početak programa

; ****** Kraj programa ******

end ; Kraj programa.

Kao što ste i sami pretpostavili direktiva #include <p16F84.inc> ubacuje fajlp16F84.inc ispred vašeg asemblerskog programa. Sam asembler će pri konverzijiinstrukcija u mašinski kôd uzeti iz fajla nazive samo onih imenovanih registra koji sekoriste u programu. Na taj način program je pregledniji, Vama je skraćeno vreme

 pisanja programa (za imenovanje registra), a program nije ništa duži nego inače.

Sada možete kompajlirati program. Za kompajliranje pritisnite taster F10 na tastaturi.

U novootvorenom prozoru „Output“ videćete kratak opis uspešnosti operacije.Možete slobodno ignorisati Message [302]. Ona Vas podseća da upotrebljeni registri(npr. TRISA) nisu u BANK0. Ukoliko Vas ova poruka nervira, možete pre prveinstrukcije napisati "ERRORLEVEL -302".

U „Output“ prozoru najbitnija je zadnja poruka. Ona mora biti „BUILDSUCCEEDED“.

U folderu „Proba“ sada se nalazi par fajlova. Bitni su vam jedino oni sa ekstenzijom.err, .lst i .hex.

U fajlu sa .err ekstenzijom, možete videti spisak grešaka i upozorenja nastalih priasembliranju programa.

Fajl sa .lst ekstenzijom predstavlja detaljan pregled svih upotrebljenih instrukcija,komentara... Iz njega možete videti u kom trenutku je tačno nastupila greška uasembliranju.

Fajl sa .hex ekstenzijom predstavlja fajl spreman za snimanje u PIC. Postupak snimanja, naučićete u narednim poglavljima.

18

Page 19: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 19/209

7. Programatori

Za snimanje .hex fajla u PIC neophodan vam je programator kao hardverski deo iodređeni softver u kompjuteru preko koga se vrši programiranje.

 Nemojte se zaleteti pa odmah kupiti najskuplji Microchipov programator. Funkcija programatora je programiranje PIC mikrokontrolera možda 5-6 puta dnevno. Da li ćeon biti na USB ili paralelnom portu uopšte Vam nije bitno. Ionako ćete uglavnomsnimati manje od 1KB programa. Jedino bih preporučio izbegavanje programatora saserijskim portom, zbog nejednakosti njegovih karakteristika na raznim matičnim

 pločama (uglavnom na laptopovima). Ukoliko imate iskustva u pravljenjuelektronskih kola, možete napraviti jedan od programatora sa sajta http://www.ic-

 prog.com/. Na istom sajtu nalazi se i pripadajući softver za programiranje. Proguglajtemalo. Možda naiđete i na nešto lakše.

Ukoliko želite kupiti programator, možete pogledati sledeće sajtove:● AllPic programator  Oko 15 €

● Programator i razvojni sistem u jednom Oko 100 €

I opet pre kupovine pretražite internet. Vaš novac je u pitanju.

Unutar mikrokontrolera nalaze se takozvani konfiguracioni bitovi. Njima se određujuhardverske specifičnosti mikrokontrolera. Iako su inicijalno ubačeni u __CONFIGdiirektivu, neki programatori je ignorišu i postupaju po sopstvenim setovanjima.

Za PIC16F84 konfiguracioni bitovi su:

Watchdog Timer – dozvoljava odnosno zabranjuje upotrebu WDT u programuPower Up Timer Enable – prouzrokuje kašnjenje pri dovođenju napona napajanja

da bi se oscilator mikrokontrolera stabilizovaoCode Protection – onemogućava iščitavanje kôda iz PIC – kopiranje programaOscillator – omogućuje izbor jednog od 4 standardna tipa oscilatora, odnosno

RC – (eng. R esistor Condensator) 1 otpornik i 1 kondenzator LP – (eng. Low Power) Za kristalne oscilatore male potrošnje 32KHz-200KHzXT – Za klasične kristalne oscilatore 100KHz-4MHz

HS – (eng. High S peed) Za kristalne oscilatore veće brzine 4MHz-10MHz

Upotrebu Watchdog Timera naučićete kasnije. Za skoro sve primere u ovom uputstvu,on treba biti isključen – WDT OFF.

Power Up Timer Enable bit je (osim kada imate kvalitetan oscilator i kada vam je potreban brz start mikrokontrolera) preporučljivo ostaviti uključenim – PWRTE ON.

Code Protection je poželjno isključiti, kako biste mogli verifikovati program nakon programiranja. Međutim, ukoliko trebate prodati PIC sa Vašim programom na koji steutrošili 3 meseca rada, obavezno ga uključite. U ovom uputstvu, neka bude isključen -

CP OFF.

19

Page 20: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 20/209

Vrste oscilatora naučićete kasnije. Za sada je bitno da znate da ovde koristite RC(R esistor – Capacitor) oscilator.

Dosta je toga o asembleru i hardveru. Vreme je za učenje novih instrukcija. Usledećem poglavlju naučićete upotrebu potprograma koji će Vam pomoći da program

 bude manji i jednostavniji.

20

Page 21: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 21/209

8. Potprogrami

Potprogram je deo kôda, ili program, koji možemo pozvati kao takav kad god je potreban. Potprogrami se koriste u slučajevima višestrukog izvršavanja jedne istefunkcije, kao na primer rutine sa praznom petljom za kašnjenje. Prednosti korišćenja

 potprograma su u lakoći menjanja vrednosti brojača jednom unutar potprograma, negonpr. deset puta kroz glavni program, i u smanjenju količine memorije koju programzauzima unutar PIC.

Pogledajte strukturu jednostavnog potprograma:

BROJAC equ 0x0C ; Uzima inicijalnu vrednost 0xFF

Pet decfsz BROJAC,F ; Smanjuje i proveravagoto Pet ; sve do 0

return ; Povratak iz potprograma

Prvo trebate labelom dati potprogramu ime, i u ovom slučaju izabrano je da to bude“Pet”. Onda se upisuje kôd koji se izvršava u okviru potprograma. U ovom slučaju, to

 je kašnjenje za program sa LED. Na kraju se potprogram završava RETURNinstrukcijom. Da biste pozvali potprogram iz glavnog programa, jednostavno upišiteCALL instrukciju i labelu početka potprograma.

Kada glavni program dođe do dela sa instrukcijom CALL k (eng. Call Subroutine)“pozovi potprogram”, gde je k adresa ili labela potprograma, on skače na mesto nakojem se nalazi potprogram. Tamo nastavlja sa izvršavanjem komandi unutar 

 potprograma sve do nailaska na instrukciju RETURN (eng. Return from Subroutine)“povratak iz potprograma”. Po nailasku na RETURN program nastavlja izvršavanjeod instrukcije koja se nalazi iza CALL instrukcije. Možete pozvati potprogram kolikogod puta želite, i zbog toga se korišćenjem potprograma smanjuje ukupna dužina

 programa. Ipak postoje dve stvari na koje morate obratiti pažnju. Prvo, u glavnom programu, svi registi moraju biti imenovani i inicijalizovani pre nego što se upotrebe.Oni se mogu imenovati u samom potprogramu, ili na početku glavnog programa.

 Najpraktičnije je imenovati ih na početku programa. Na taj način ćete znati da su susvi na istom mestu. Drugo, morate biti sigurni da će izvršavanje glavnog programazaobići potprogram. Ukoliko stavite potprogram na kraj Vašeg programa i zaboraviteda stavite instrukciju goto koja bi nastavila izvršavanje dalje od potprograma, program

će nastaviti sa izvršavanjem i izvršiti i potprogram želeli Vi to ili ne. PIC ne pravirazliku između potprograma i glavnog programa.

Ovde treba napomenuti i mogućnost istovremenog imenovanja više registara. To seizvodi „cblock“ i „endc“ direktivama.

Ukoliko u programu imate dve promenljive, trebate ih pamtiti u dva registra opštenamene. Međutim, za veći broj registara, praktičnije je definisati ih unutar jednog

 bloka. Na taj način mikrokontroler preuzima obavezu određivanja adresa pojedinačnihregistara (određujete mu samo prvu), i poboljšavate portabilnost programa za moćnijeserije mikrokontrolera. Očigledno da ovo nije velika ušteda pri korišćenju samo dvaregistra. Međutim, pri više registara ovo može biti od pomoći.

21

Page 22: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 22/209

Prepravite program za treperenje LED tako da koristi potprogram.

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitove.cblock 0x0C ; Početak slobodnih registaraBROJAC1 ; Prvi brojač za petlju. Inicijalno 0xFFBROJAC2 ; Drugi brojač za petlju. Inicijalno 0xFF

endc ; Kraj bloka registara

; ****** Podešavanje porta ******org 0x00

 bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw b'00000000' ; Postavlja sve pinove movwf TRISA ; kao izlazne movwf TRISB bcf STATUS,RP0 ; Vraća program u BANK0

; ****** Uključi LED ******Poc movlw b'00000100' ; Uključi LED stavljajući b'00100'

 movwf PORTA ; u W registar, a zatim i u PORTA

; ****** Dodaj kašnjenje ******call Pet

; ****** Kašnjenje završeno, sada isključi LED ****** movlw b'00000000' ; Isključi LED stavljajući b'00000' movwf PORTA ; u W registar, a zatim i u PORTA

; ****** Dodaj još jedno kašnjenje ******call Pet

; ****** Sada se vrati na početak programa ******goto Poc

; ****** Potprogram za kašnjenje od oko 0,2S ******

Pet decfsz BROJAC1,F ; Ove dve petlje služe za brojanje nadole odgoto Pet ; 255 do 0, 255 puta, omogućavajući dadecfsz BROJAC2,F ; se može primetiti kako LED treperigoto Pet

return ; Povratak iz potprograma

; ****** Kraj programa ******end ; Kraj programa.

Možete videti da je korišćenjem potprograma smanjena veličina programa. Svaki putkada je potrebno napraviti pauzu, bez obzira svetli li LED ili ne, pozove se

 potprogram. Na kraju potprograma program se vraća na red iza CALL instrukcije.

22

Page 23: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 23/209

U primeru se najpre uključuje LED. Onda se poziva potprogram. Nakon povratka iz potprograma može se isključiti LED. Opet se poziva potprogram, i po povratku iznjega, izvršava se sledeća instrukcija, odnosno “goto Poc”.

Bitno je napomenuti i to da je moguće pozivanje drugog potprograma unutar prvog. Na primer ovo je potpuno moguće:

Pocetak call Prog1 ; Pozivanje prvog potprogramagoto Pocetak ; Neprekidno vraćanje na početak u mrtvoj petlji

Prog1 call Prog2 ; Pozivanje drugog potprogramareturn ; Povratak iz prvog potprograma

Prog2 return ; Povratak iz drugog potprograma

Ovako se može ići samo do osmog nivoa dubine na šta se mora obratiti pažnja. Za onekoje interesuje, originalan program bio je dug 121 bajtova. Korišćenjem potprograma,

smanjen je na 104 bajta. Ovo možda i ne izgleda mnogo, ali imajte u vidu damemorija PIC16F84 mikrokontrolera iznosi samo 1024 bajta. Svaki bajt je bitan.

U sledećem poglavlju naučićete kako da PIC očita spoljne signale.

23

Page 24: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 24/209

9. Ulazi

Do sada ste samo pisali po portu A da bi se uključivala i isključivala LED. U ovom poglavlju naučićete upotrebu ulaznih pinova. Na taj način moguće je na pinovemikrokontrolera povezati spoljno elektronsko kolo, i programirati PIC da različitoreaguje u zavisnosti od spoljnih signala.

Kao što Vam je poznato, da bi konfigurisali U/I pinove treba prebaciti program iz banke 0 u banku 1. Najpre to uradite:

 bsf STATUS,RP0 ; Banka 1

Da bi se konfigurisao odgovarajući pin na portu A kao izlazni, treba poslati 0 nanjemu odgovarajuće mesto u TRISA registru. Da bi se konfigurisao kao ulazni, treba

 poslati 1.

 movlw b'00000001' ; Stavi b'00001' u W, a zatim u movwf TRISA ; TRISA registar. Tako je pin RA0 ulazni. bcf STATUS,RP0 ; Banka 0

Ovim je RA0 pin konfigurisan kao ulazni. Sada je potrebno proveriti da li je na njemu prisutan nivo logičke jedinice ili nule. Za ovo se koristi instrukcija BTFSC ili BTFSS.

BTFSC f,b (eng. Bit Test f , Skip if Clear) instrukcija znači “Testiraj bit b registra f.Ako je bit jednak 0, preskoči sledeću instrukciju“. BTFSS f,b (eng. Bit Test f , Skip if Set) znači “Testiraj bit b registra f. Ako je bit jednak 1, preskoči sledeću instrukciju“.

Koju instrukciju ćete koristiti zavisi od toga kako želite da program reaguje kadatestirate željeni bit. Na primer, ukoliko čekate da se na ulaznom pinu javi nivo logičke1, možete iskoristiti instrukciju BTFSS ovako:

Početak programa

Test btfss PORTA,0goto Test

 Nastavi odavde

Program će nastaviti izvršavanje od “Nastavi odavde” samo ukoliko je bit 0 PORTAregistra setovan, odnosno ukoliko je na pinu RA0 prisutan nivo logičke 1 (+5V).

 Napišite sada program kojim će LED treptati jednom brzinom, a ukoliko se pritisne prekidač, ona će treptati duplo sporije. Možete probati da sami napišete ceo program,da biste videli da li ste shvatili postupak.

24

Page 25: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 25/209

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitove.BROJAC1 equ 0x0C ; Prvi brojač petlje. Inicijalno 0xFFBROJAC2 equ 0x0D ; Drugi brojač petlje. Inicijalno 0xFF

org 0x00

; ****** Podešavanje porta ****** bsf STATUS,RP0 ; Banka 1 movlw b'00000001' ; Stavi b'00001' u TRISA. Tako je pin movwf TRISA ; RA0 ulazni, a RA2 izlazni. movlw b'00000000' ; Stavi b'00000000' u TRISB. Tako su movwf TRISB ; svi pinovi izlazni. bcf STATUS,RP0 ; Banka 0

; ****** Uključenje LED ******Poc movlw b'00000100' ; Uključi LED stavljajući b'00100' u

 movwf PORTA ; W registar, a zatim i u port A

; ****** Proveri da li je prekidač zatvoren ****** btfsc PORTA,0 ; Testiraj stanje bita 0 porta A. Ako je 0

; preskoči prvu pauzu. Ako je 1 prođi krozcall Pet ; obe pauze, kao da se ništa ne događa

; ****** Dodavanje još jedne pauze ******call Pet ; Ova pauza se uvek izvršava

25

Page 26: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 26/209

; ****** Pauza završena. Sada isključi LED ****** movlw b'00000000' ; Isključi LED stavljajući b'00000' movwf PORTA ; u W registar, a zatim i u port A

; ****** Proveri da li je prekidač i dalje zatvoren ****** btfsc PORTA,0 ; Testiraj stanje RA0 pina. Ako je na logičkoj 0

; preskoči prvu pauzu. Ako je na 1 prođi krozcall Pet ; obe pauze, kao da se ništa ne događa

; ****** Dodavanje još jedne pauze ******call Pet ; Ova pauza se uvek izvršava

; ****** Pauza završena. Sada se vrati na početak ******goto Poc ; Vrati se na početak 

; ****** Potprogram za kašnjenje od oko 0,2S ******Pet decfsz BROJAC1,F ; Ove dve petlje služe za brojanje nadole od

goto Pet ; 255 do 0, 255 puta, omogućavajući dadecfsz BROJAC2,F ; se može primetiti da LED treperigoto Pet

return ; Povratak iz potprograma

; ****** Kraj programa ******end ; Kraj programa.

Otpornik od 4k7Ω obavezan je da bi pin RA0 i pri otvorenom prekidaču bio ustabilnom logičkom stanju (logička 0). U protivnom, pin bi zbog svoje visoke ulazne

impedanse postao previše osetljiv na spoljnje smetnje (npr. grmljavinu), ili bi pak neprestano bio u logičkoj 1 bez obzira na stanje prekidača. U praksi se umestootpornika prema masi, češće sreće otpornik prema naponu napajanja. Više o potrebi zaovim (pull-up i pull-down) otpornicima naučićete u narednim poglavljima.

Program najpre uključuje LED. Onda proverava da li je prekidač zatvoren. Ukolikonije (na ulazu je logicka 0), program se izvršava kao da se ništa nije desilo, i prolazikroz oba poziva za potprogram. Ukoliko jeste (na ulazu je nivo logičke 1), prvi pozivza potprogram se preskače, pa je pauza u tom slučaju ista kao kod ranije napisanih

 programa. Isto se dešava i nakon što se isključi LED.

Možete kompajlirati i isprobati ovaj program. Ipak da Vas odmah upozorim. Kolo i program neće impresionirati nekog koga ne interesuje programiranje mikrokontrolera.Zato se nemojte uznemiravati kada svojoj porodici i prijateljima pokažete kakomožete menjati brzinu treptanja LED prekidačem, a oni za to pokažu veoma malointeresovanja.

Ukoliko ste iz početka pratili ova uputstva, onda biste možda voleli da znate da ste dosada naučili 10 od ukupno 35 instrukcija za PIC16F84! Sve su naučene uključivanjemi isključivanjem LED i testiranjem prekidača.

26

Page 27: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 27/209

10. Simulator

Simulacija je proces virtuelnog simuliranja izvršavanja instrukcija iako još ništakonkretno nije hardverski napravljeno.

Jedan od najpopularnijih (i najjednostavnijih) simulatora je svakako PIC Simulator  IDE. U njemu je dovoljno kliknuti na željeni pin mikrokontrolera da bi se logičkostanje na njemu promenilo. Nažalost, može se koristiti samo 30 dana pre isteka

 probnog perioda.

Još jedan odličan simulator je Proteus. On pruža mogućnost integracijemikrokontrolera sa eksternim hardverom. Ni on nije besplatan.

Besplatan je jedino Misim, ali nije dovoljno upotrebljiv.

MPLAB IDE ima u sebi odličan a besplatan simulator. U ovom poglavlju biće opisanenjegove specifičnosti.

Da biste uključili simulator idite na Debugger, Select Tool, MPLAB SIM. U toolbaruće se pojaviti nekoliko novih ikonica. Kliknite na treću (Animate - dve strelicenadesno) i pratite izvršavanje programa u prozoru sa .asm fajlom. Vidite kako jedošao do petlje i kako neprestano izvršava dve iste instrukcije. Na drugoj ikoni (Halt)

 pauzirate program. Na prvoj (Run - jedna strelica nadesno) se program izvršavamaksimalnom brzinom, ali bez animiranosti njegovog izvršavanja. Četvrtom ikonom(Step Into) se kada je program u pauziranom stanju vrši prelaz na sledeću instrukciju,korak po korak. Petom (Step Over) se maksimalnom brzinom izvršava potprogram ili

naredna instrukcija. Šestom ikonom (Step Out) nasilno se izlazi iz potprograma.Zadnjom ikonom se vrši reset programa, i tako njegovo izvršavanje može početi iz početka. Registri opšte namene pri tome zadržavaju svoje vrednosti.

Da biste videli aktuelni sadržaj registara BROJAC1 i BROJAC2 možete zadržati mišiznad njih, ili ići na View, File Registers. U prozoru koji se otvorio možete videti dase registar na adresi 0x0C (koja je izabrana za BROJAC1) u koracima smanjuje do 0.Kada dostigne 0, smanjuje se BROJAC2 na adresi 0x0D. Verovatno će Vam lakši biti

 prikaz labela, a ne adresa. Promenite prikaz klikom na „Symbolic“ tab.

Donji deo MPLAB prozora pruža Vam korisne informacije o trenutnom stanju banke,

W registra i pojedinih bitova STATUS registra. Velika slova Z, DC i C pri dnu ekranaoznačavaju da su ti bitovi setovani. Upotrebu ovih bitova naučićete kasnije.

Detaljnije praćenje promena registara, možete uključiti preko View, Watch opcije.Osenčite željeni registar, i prevucite ga u Watch prozor. Desnim klikom preko registraunutar Watch prozora i izborom opcije Properties dobijate mogućnost podešavanjaželjenog formata brojeva. Za BROJAC1 i BROJAC2 najpregledniji bi bio decimalniformat. Duplim klikom na vrednosti pored registara, možete ih nasilno promeniti.

Možda vam je animacija brzine izvršavanja programa previše spora? Povećajte je naDebugger, Settings, Animation / Realtime Updates pod Animate step time. Umesto

500mS stavite npr. 50. Brzina simuliranja ograničena je brzinom vašeg kompjutera.

27

Page 28: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 28/209

Ukoliko Vas interesuje realna brzina (eng. Real Time) kojom bi program radio,možete je proveriti preko Debugger, Stopwatch (eng. stopwatch – štoperica) opcije.Dovoljno je izabrati brzinu oscilatora u Debugger, Setings, Osc / trace opciji. Za datevrednosti RC oscilatora (10kΩ i 33pF), ona je oko 3,5MHz.

 Nekada nema svrhe čekati da se završi određeni proces (npr. prazna petlja). MPLAB

simulator Vam omogućava da u programu postavite tačke prekida (eng. Breakpoint)duplim klikom na željenu instrukciju. Crvena oznaka B pojavljuje se leve strane prozora editora. Čim simulator naiđe na taj deo, zaustaviće dalju simulaciju što ćeVam omogućiti pregled stanja registara ili proračun vremena (preko štoperice)

 potrebnog za izvršavanje instrukcija.

Upotreba štoperice može biti izuzetno korisna. Na primer da biste tačno odredilivreme za koje je LED aktivna, dovoljno je postaviti jednu tačku prekida na callinstrukciju. Onda se program izvrši (Run - bez animiranja) do prve tačke prekida, i tuse resetuje štoperica i klikne na Step Over. Potprogram se izvršava maksimalnom

 brzinom (bez animiranja) i nakon što se završi iščita se proteklo vreme iz štoperice.

Iako je prikaz svih izlaznih pinova portova veoma lako implementirati, ukoliko je potrebno simulirati program koji treba reagovati na signale sa ulaznih pinova (tipa pritisnut prekidač T1) stanje se iz osnova menja. Da bi to bilo moguće mora sedefinisati određeni stimulans (eng. Stimulus) po kome će se odvijati promene. Željeniscenario promena definišete sa Debugger, Stimulus Controller, New Scenario. Na

 primer, ukoliko je prekidač na RA0 pinu svo vreme pritisnut (a pin je definisan kaoulazni), potrebno je izabrati asinhroni (Asynch) tab, a zatim u jednom od redovaubaciti RA0 i Set High akciju. Da bi se menjalo ulazno stanje određenog pina

 potrebno je izabrati željeni pin (npr. isto RA0) i Toggle akciju. Pri njoj se klikom naFire polje pored željenog pina menja njegovo logičko stanje, što možete pratiti u File

Registers ili Watch prozoru.

Ukoliko je potrebno da pin u određenom logičkom stanju bude tačno određeno vreme,možete izabrati Pulse High ili Pulse Low akciju. U tom slučaju trebate odrediti iželjenu dužinu impulsa datu u vremenu ili broju instrukcijskih ciklusa. Početak impulsa se takođe određuje klikom na Fire polje pored željenog pina.

U asinhronom tabu potrebno je u željenom trenutku fizički kliknuti na polje za pokretanje određenih opcija. U Register Injection tabu željeni trenutci promene stanja pinova (bitova) mogu se definisati eksternim fajlom, a u Register Trace tabu može sedefinisati eksterni fajl koji će snimati stanje određenih bitova po unapred zadatimkriterijumima.

Clock Stimulus tabom definišu se logička stanja pinova koja će se javljati u tačnoodređenim trenutcima. Za složenija stanja, morao bi se koristiti Register Injection tab.

Pin / Register Actions i Advanced Pin / Register tabovima definišu se složenije akcijekoje će se odvijati po promeni ili dostizanju unapred zadatog stanja bita ili registra.

Za početak, koristite jedino asinhroni tab. U sledećem poglavlju naučićete kako se programska memorija mikrokontrolera može efikasnije iskoristiti.

28

Page 29: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 29/209

11. Efikasno korišćenje memorije

Do sada ste programirali PIC da uključuje i isključuje LED. Onda ste upravljalinjegovim radom dodavši mu prekidač, i menjajući brzinu treptanja diode. Jedini

 problem je u tome što je program bio dugačak, i bespotrebno je trošio memoriju. Da bi ga skratili trebate naučiti još par instrukcija.

CLRW instrukcija postavlja vrednost 0x00 u W, a CLRF f u željeni registar.Tako umesto

 movlw b'00000000'

 movwf TRISB

možete pisaticlrw

 movwf TRISB

ili

clrf TRISB

Hajde da vidimo kako ste do sada uključivali i isključivali LED.

 movlw b'00000100' movwf PORTA movlw b'00000000' movwf PORTA

 Najpre je ubačena vrednost 0x04 u W registar, zatim je prosleđena na PORTA da bi seuključila LED. Da bi se isključila obrisan je W registar, i ponovo je njegova vrednost

 prosleđena na PORTA. Između ovih rutina pozivan je potprogram za kašnjenje da bise moglo primetiti da LED treperi. Znači dva puta su prebacivana 2 seta podataka(jednom u W registar, a onda u PORTA) i dva puta je pozivan potprogram (jednomnakon uključenja i jednom nakon isključenja LED).

Kako se ovo može efektnije rešiti? Koristeći logičku operaciju zvanu XOR.

XOR (eng. Exclusive Or) operacija izvršava logičku operaciju “ekskluzivno ili” naregistru koji odredite, sa vrednošću koju mu date. Trebalo bi ovo malo bolje objasniti.

 XOR

0 0 0

0 1 1

1 0 1

1 1 0

00101110

XOR 10010110= 10111000

Rezultat XOR operacije će biti logička 1 samo ukoliko su muoba operanda različita. Ukoliko su ista (obe 0 ili obe 1), rezultatće biti logička 0.

XOR (kao i sve ostale logičke instrukcije) se može izvršiti jedino nad celim bajtovima, pri čemu se vodi računa o njihovom položaju. LSB bit rezultata sadržaćerezultat XOR operacije nad LSB bitovima prvog i drugog operanda.

29

Page 30: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 30/209

Uočavate li da XOR operacijom nad bitom koji je stalno na logičkoj 1 i prethodnimstanjem bita menja stanje rezultata sa 0 na 1 i sa 1 na 0?

I II00000000 00000001

XOR 00000001 XOR 00000001

= 00000001 = 00000000

Ta specifičnost XOR operacije može biti iskorišćena za naizmenično uključivanje iisključivanje LED.

Još jedna interesantna osobina XOR operacije je da bilo koja vrednost dva puta XOR-ovana istim brojem vraća originalnu vrednost.

I II00101110 10111000

XOR 10010110 XOR 10010110

= 10111000 = 00101110

XOR operacija može se naći u instrukcijama PIC16F84 u dva oblika.

1. XORLW k gde se XOR operacija izvršava nad W i konstantnom vrednošću k.Vrednost k mora biti u opsegu od 0 do 255 (0x00 – 0xFF). Rezultat operacijeće biti u W registru.

2. XORWF f,d gde se XOR operacija izvršava nad W i vrednosti unutar registračija je adresa označena sa f. Sa „d“ je označeno gde će biti smešten rezultatXOR operacije. Ukoliko je d=0, rezultat će biti u W registru, a ukoliko je d=1,

rezultat će biti smešten u f registru.

Upotrebom ove instrukcije su za naizmenično uključenje i isključenje LED dovoljnesamo dve linije kôda:

 movlw b'00000100' ; b'00000100' u Wxorwf PORTA,F ; Promeni stanje bita 2 u PORTA registru

Ovde je vrednost 0x04 (b'00100') XOR-ovana sa ranijim sadržajem porta A. Ukoliko je bit 2 u portu A bio 1, postaće 0, a ukoliko je bio 0 postaće 1. Čak nema ni potrebeza inicijalizacijom vrednosti u portu A. Zbog čega? Pa ukoliko je njegov bit 2 bio 0,

 promeniće se. Ukoliko je bio 1, opet će se promeniti. Međutim, nedostatak inicijalizacije porta A može uticati na stanje ostalih pinova, tako da je ona svakako

 preporučljiva.

Iako je direktna manipulacija nad portovima sasvim moguća, direktno menjanjePORTA (ili PORTB) registra ne spada u dobru programersku praksu. Zbog čega?Zbog internog RMW (eng. R ead Modify Write) ciklusa mikrokontrolera.

RMW ciklus znači da mikrokontroler prilikom promene stanja nekog od bitovaodgovarajučeg registra najpre očita ceo registar (svih 8 bitova), zatim izvrši željenuoperaciju nad njim, i na kraju vrati rezultat u taj isti registar.

30

Page 31: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 31/209

Zamislite da je korisnik rešio da izvuče LED na neko udaljenije mesto (kao što mnogiizvlače signalizaciju jeftine struje sa strujomera). Kablovi preko kojih je povezanaLED ponašaju se usled svoje velike dužine i male daljine jedan od drugog kaokondenzator male kapacitivnosti. Zato je ukoliko želite brzo uključiti i isključiti LEDmoguće da ona neposredno nakon uključenja ne zasvetli zbog previše male otpornostina njenim vodovima (dok se takav virtuelni kondenzator ne napuni). Ukoliko odmah

 po uključenju očitate stanje sa PORTB registra, videćete da LED i dalje nijeuključena. PORTB (i PORTA) se pri očitavanju stanja ponašaju kao da su povezanikao ulazi, bez obzira na ranije konfigurisano stanje pinova. To može dovesti doočitavanja pogrešnog stanja, a samim tim i nepravilnog rada programa. PIC jehardverski konstruisan tako da je moguće čak i da se očitavanje stanja sa portovamože završiti i pre ranije zadate promene njihovih stanja. Zbog toga je pouzdanije sveoperacije izvršavati nad određenim registrom opšte namene (obično se taj registar naziva shaddow registar (eng. Shaddow – senka)), a tek onda kada je to neophodnokopirati rezultat iz njega u odgovarajući port. Više o shaddow registrima možetenaučiti na http://www.piclist.com/tecHREF/readmodwrite.htm sajtu.

Pogledajte sada novi asemblerski kôd. Prvi je originalni program za treperenje LED, au drugom je dodat prekidač. U oba programa kao shaddow registar upotrebljen je Wregistar, jer se njegovo stanje ne menja u ostalim delovima programa. Da se menja,koristio bi se neki od registara opšte namene.

Treptuća LED

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitove.BROJAC1 equ 0x0C ; Prvi brojač petlje. Inicijalno 0xFFBROJAC2 equ 0x0D ; Drugi brojač petlje. Inicijalno 0xFF

org 0x00

; ****** Inicijalizacija i podešavanje porta ****** bsf STATUS,RP0 ; Banka 1clrf TRISA ; Postavlja sve pinoveclrf TRISB ; kao izlazne.

 bcf STATUS,RP0 ; Banka 0clrw ; W je inicijalizovan na 0x00

; ****** Uključenje i isključenje LED ******Poc xorlw b'00000100' ; Promeni stanje bita 2 u W registru

 movwf PORTA ; Kopiraj W u PORTA

; ****** Pauza ******call Pet

; ****** Pauza završena. Vrati se na početak programa ******goto Poc ; Vrati se na početak 

31

Page 32: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 32/209

; ****** Potprogram za kašnjenje od oko 0,2S ******Pet decfsz BROJAC1,F ; Ove dve petlje služe za brojanje nadole od

goto Pet ; 255 do 0, 255 puta, omogućavajući da sedecfsz BROJAC2,F ; može primetiti kako LED treperigoto Petreturn ; Povratak iz potprograma

; ****** Kraj programa ******end ; Kraj programa

Treptuća LED sa prekidačem

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitove.BROJAC1 equ 0x0C ; Prvi brojač petlje. Inicijalno 0xFFBROJAC2 equ 0x0D ; Drugi brojač petlje. Inicijalno 0xFF

org 0x00

; ****** Podešavanje porta ****** bsf STATUS,RP0 ; Banka 1 movlw b'00000001' ; Stavi b'00001' u TRISA. Tako je bit 0 movwf

TRISA; porta A ulazni, a bit 2 izlazni.

clrf TRISB ; Svi pinovi na portu B su izlazni. bcf STATUS,RP0 ; Banka 0clrw ; W je inicijalizovan na 0x00

; ****** Uključenje i isključenje LED ******Poc xorlw b'00000100' ; Promeni stanje bita 2 u W registru

 movwf PORTA ; Kopiraj W u port A

; ****** Proveri da li je prekidač zatvoren ****** btfsc PORTA,0 ; Uzmi vrednost sa pina RA0. Ukoliko je 0

; preskoči prvu pauzu. Ukoliko je 1 prođi krozcall Pet ; obe pauze, kao da se ništa ne događa

; ****** Dodavanje još jedne pauze ******call Pet ; Ova pauza se uvek izvršava

; ****** Pauza završena. Vrati se na početak programa ******goto Poc ; Vrati se na početak 

32

Page 33: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 33/209

; ****** Potprogram za kašnjenje od oko 0,2S ******Pet decfsz BROJAC1,F ; Ove dve petlje služe za brojanje nadole od

goto Pet ; 255 do 0, 255 puta, omogućavajući da sedecfsz BROJAC2,F ; može primetiti kako LED treperigoto Petreturn ; Povratak iz potprograma

; ****** Kraj programa ******end ; Kraj programa

 Nadam se da ste uočili da je upotrebom novih instrukcija prilično smanjena veličina programa. Da biste lakše uočili ovu razliku, ispod su prikazni nazivi programa,izmene koje su izvršene, i njihove veličine.

Program Izmena Veličina (instrukcija)

Treptuća LED Original 18Treptuća LED Dodat potprogram 17Treptuća LED Dodata ekskluzivno ili funkcija 14LED sa prekidačem Original 22LED sa prekidačem Dodata ekskluzivno ili funkcija 17

Vidite da ste ne samo naučili nove instrukcije, već ste i smanjili veličinu programa.

33

Page 34: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 34/209

12. Logičke operacije

Jednu logičku operaciju (XOR) ste već naučili. Sada ćete se upoznati sa još tri.

AND „logičko I“ operacija daće na svom izlazu logičku 1 samo ukoliko su joj na obaulaza dovedene logičke 1. Ovde je njena tablica istinitosti.

 AND

0 0 0

0 1 0

1 0 0

1 1 1

01101011AND 10100101= 00100001

Rezultat AND operacije biće logička 1 samo ukoliko su obaoperanda na logičkoj 1. Ukoliko bar jedan nije, rezultat će bitilogička 0.

Kao i XOR i AND operacija se može naći u dva oblika.

1. ANDLW k koja izvršava AND operaciju nad registrom W i konstantnomvrednošću k. Rezultat operacije će biti u W registru.

2. ANDWF f,d koja izvršava AND operaciju nad vrednošću W i vrednošću f registra. Sa „d“ je označeno gde će biti smešten rezultat operacije. Ukoliko jed=0, rezultat će biti u W registru, a ukoliko je d=1, rezultat će biti u f registru.

Sledi IOR operacija:

 IOR

0 0 0

0 1 1

1 0 1

1 1 1

01101011IOR 10100101= 11101111

Rezultat IOR operacije biće logička 1 ukoliko je bar na jednomoperandu prisutna logička 1. Ukoliko su oba na logičkoj 0, irezultat će biti jednak logičkoj 0.

I ona se javlja u dva oblika.

1. IORLW k koja izvršava IOR operaciju nad registrom W i konstantnom

vrednošću k. Rezultat operacije će biti u W registru.

2. IORWF f,d koja izvršava IOR operaciju nad vrednošću W registra i f registra.Ukoliko je d=0, rezultat će biti u W registru, a ukoliko je d=1, rezultat će biti uf registru.

Zadnja logička operacija koju podržava PIC16F84 je komplement.

COM 

0 1

1 0

COM 01101011= 10010100

Komplement, negacija ili invertovanje je logička operacija u

kojoj svaki bit unutar bajta menja svoje stanje.

34

Page 35: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 35/209

Za razliku od ostalih logičkih operacija komplemen se izvršava nad samo jednim bajtom. Zbog toga ova operacija ima samo jedan oblik instrukcije.

COMF f,d instrukcijom se invertuju svi bitovi u registru f. Ukoliko je d=0 rezultat će biti u W, a ukoliko je 1 u f registru.

Verovatno uočavate da ste ovu logičku operaciju mogli upotrebiti u ranijem programuumesto XOR. Jedina razlika je u tome što bi se onda invertovali svi bitovi PORTAregistra, a ne samo onaj koji je potreban.

Slično kao XOR operacija, duplo komplementovana vrednost vraća originalnu:

I IICOM 01101011 COM 10010100= 10010100 = 01101011

 Sve do sada naučene logičke operacije menjaju vrednost bita 2 STATUS registra u

slučaju da je rezultat njihove operacije jednak nuli. Kako je bit 2 po tome specifičanon ima svoju posebnu oznaku „nulti bit“ (eng. Zero flag). Termin „flag“ koristi se zaoznačavanje bitova koje mikrokontroler sam setuje ili resetuje u zavisnosti od svogtrenutnog stanja (u ovom slučaju rezultata prethodne logičke instrukcije).

Dakle ukoliko je rezultat XOR operacije sledeći:

00011010XOR 00011010= 00000000

Zero flag STATUS registra će biti setovan. Ovo se može iskoristiti za brzo poređenjevrednosti u registru tako što se u W registar postavite željeni oblik bitova a onda izvršiXOR operaciju nad njim i željenim registrom. Ukoliko je stanje unutar registra

 jednako stanju u W registru, Zero flag će biti setovan.

Iako nema mnogo smisla Zero flag možete setovati čak i operacijomkomplementovanja.

COM 11111111= 00000000

U prilogu ovog uputstva možete videti uporedni prikaz instrukcija u kome jenavedeno koje sve instrukcije menjaju stanje Zero flaga.

35

Page 36: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 36/209

13. Rotacija

RLF (R otate Left f  Through Carry) instrukcija rotira ulevo bitove unutar zadatogregistra. Sintaksa instrukcije je sledeća:

RLF f,d pri čemu je f registar nad čijim sadržajem se obavlja rotacija. Ukoliko je d=0,rezultat operacije će biti u W registru, a ukoliko je d=1, rezultat će biti u registru f.

Šta radi ova instrukcija? Ukoliko npr. u registru 0x0C imate vrednost b'00011001'nakon instrukcije RLF 0x0C,F registar 0x0C će dobiti vrednost b'00110010'. Nakon

 još jedne iste instrukcije u registru će biti vrednost b'01100100'. Kao što vidite ovainstrukcija rotira sadržaj registra ulevo. A šta kada 1 dođe do kraja – pitate se vi. Nećese izgubiti. Za vreme rotacije ulevo MSB se smešta se u tzv. “bit prekoračenja” (eng.Carry flag). On se nalazi na mestu bita 0 STATUS registra.

Dakle kada jedinica dođe do kraja, događa se sledeće:

  Carry Bitovi 0x0C registra  flag 76543210

rlf 0x0C,F 0 01000000rlf 0x0C,F 0 10000000rlf 0x0C,F 1 00000000rlf 0x0C,F 0 00000001rlf 0x0C,F 0 00000010

. . .

Vidite da je Carry flag ovde iskorišćen kao osmi bit registra.

Ukoliko vam je to potrebno možete ubaciti 0 ili 1 u Carry flag pre rotacijeinstrukcijama bsf STATUS,C i bcf STATUS,C (C je imenovani bit 0 STATUSregistra). Tako će se vrednost iz Carry flaga pojaviti na bitu 0 nakon rlf instrukcije.Preporučljivo je ovo uraditi neposredno pre rotacije kako na bitu 0 nakon rotacije ne

 bi dobili nepoznatu vrednost. Ne utiče samo RLF instrukcija na Carry flag.

Interensantno je da se rotacijom ulevo (sa prethodno resetovanim Carry flagom) broj

unutar registra množi sa 2.

C 765432100 01011001 = 890 10110010 = 1781 01100100 = 356 (računajući i Carry flag)

Ukoliko vam je potrebno množenje sa 2 većih brojeva možete koristiti uzastopnurotaciju dva ili više registra. Carry flag iz prvog registra preneće se na početak drugog.

Kada već postoji instrukcija za rotaciju ulevo, logično bi bilo da postoji i instrukcija

za rotaciju bitova udesno. Postoji!

36

Page 37: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 37/209

RRF (R otate R ight f Through Carry)

Sintaksa instrukcije je ista kao i kod RLF.

Kako se rlf instrukcijom sadržaj u registru množi sa 2, rrf instrukcijom (i resetovanim

Carry flagom) se sadržaj registra deli sa 2. LSB se premešta u Carry flag po sledećem:  Carry Bitovi 0x0Ch registra  flag 76543210

rrf 0x0C,F 0 00000010rrf 0x0C,F 0 00000001rrf 0x0C,F 1 00000000rrf 0x0C,F 0 10000000

Instrukcije RLF i RRF mogu se upotrebiti za simulaciju trčećeg svetla. U tom slučajumogući algoritam bi bio:

SPORTB equ 0x0Crlf SPORTB,F ; Rotacija u SHADDOW registru

 movf SPORTB,W ; Kopiranje iz SHADDOW u W movwf PORTB ; Kopiranje iz W u PORTB.

Instrukcija movf f,d. (eng. Move f ) vrednost iz registra f prebacuje u W (pri d=0) ili utaj isti registar f (pri d=1). Zbog čega bi iko želeo da sadržaj registra upiše u taj istiregistar? U praksi se ta mogućnost koristi jedino pri testiranju sadržaja registra navrednost 0x00, jer movf instrukcija utiče na Zero flag.

Sledećom šemom ilustrovana je upotreba logičkih i instrukcija rotacije:

37

Page 38: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 38/209

Upotreba logičkih i instrukcija rotacije

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitove.DATA equ 0x0C ; Registar za privremene podatkeorg 0x00

; ****** Podešavanje porta ****** bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw b'00000011' ; Stavi b'00011' u TRISA. Tako su bit 0 i movwf TRISA ; bit 1 ulazni, a bit 2 izlazni.clrf TRISB ; Svi pinovi na PORTB su izlazni.

 bcf STATUS,RP0 ; Vraća program u BANK0

; ****** Testiranje prekidača ******Poc rlf PORTA,W ; Rotiraj sadržaj PORTA i stavi rezultat u W

; registar, Tako je bit 0 došao na mesto bita 1xorwf PORTA,W ; Izvrši XOR nad PORTA i W registrom,

; i stavi rezultat u W (interesuje nas; XOR nad bitom 1 ova dva registra).

; ****** Prebacivanje rezultata na izlaz ****** movwf DATA ; Premesti sadržaj iz W u DATA jer se rotacija

; ne može izvršiti direktno nad W registromrlf

DATA,W; Rotiraj sadržaj. Tako je bit 1 došao na mesto; bita 2 (na mesto izlaznog bita) i vrati rezultat; u W registar.

 movwf PORTA ; Stavi rezultat u PORTA. Kako su bit 0 i bit 1; ulazni, neće reagovati, a na bitu 2 će se; pojaviti rezultat XOR operacije nad; postavljenim stanjem prekidača.

goto Poc ; Povratak na početak.

; ****** Kraj ******end ; Kraj programa.

Kompajlirajte program, programirajte PIC i isprobajte njegov rad. Iz komentara semože lako zaključiti šta program radi.

Evo šta će se dogoditi u programu u slučaju da su oba prekidača zatvorena:

PIC uzima vrednost iz PORTA. Kako su oba tastera pritisnuta ona je b'00011'. Tavrednost se rotira, i postaje b'00110'. Rezultat se smešta u W registar. Dalje seizvršava ekskluzivno ili nad tom vrednošću i trenutnom vrednošću PORTA koji je idalje b'00011'.

38

Page 39: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 39/209

Sada se rezultat b'00101' prebacuje u privremeni registar DATA gde se rotira.Rotirana vrednost je b'01010', i ona se preko W registra smešta u PORTA. Kako su naPORTA bit 0 i bit 1 ulazni, vrednost koja će doći na njih biće ignorisana, a bit 3 nasionako ne interesuje i njegova vrednost se može ignorisati. Kao što vidite na krajusvega bit 2 sadrži vrednost XOR operacije (u ovom slučaju 0). Kako je ovaj bitizlazni, LED neće svetleti. Možete proveriti rezultat funkcije pritiskanjem prekidača

 po tablici XOR operacije. Program je napisan tako da inicijalna vrednost Carry flaganema uticaja na njegovo izvršavanje, pa njegovo brisanje ovde nije potebno.

 bitovi 43210PORTA 00011

W posle rotacije 00110

PORTA 00011

W posle XOR  00101

PORTA posle rotacije 01011

Kako je ovaj program dat kao ilustracija korišćenja instrukcija nema potrebe zaograničenjem setovanja bita 3 PORTA registra. U praksi taj pin ne bi bio povezan, ili

 bi se bit 3 „maskirao“.

Prepravite sada program po sledećem:

Umesto xorwf PORTA,W ; Izvrši XOR nad PORTA i Wnapišite andwf PORTA,W ; Izvrši AND nad PORTA i W

Program radi isto što i ranije, s tom razlikom što umesto XOR primenjuje ANDoperaciju. Pritiskanjem prekidača možete videti da će LED svetleti jedino ukoliko su

oba prekidača (T1 i T2) zatvorena (na oba ulaza dovedena logička jedinica).Ukoliko u programu zamenite instrukciju ANDWF instrukcijom IORWF možeteisprobati rad ove operacije. LED1 će svetleti ukoliko je uključen bar jedan prekidač.

A ukoliko upotrebite COMF instrukciju, LED će svetleti suprotno od stanja prekidačaT1 ignorišući stanje prekidača T2.

Do sada ste naučili 22 od 35 instrukcija. Čestitamo. To je više od polovine.

39

Page 40: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 40/209

14. Brojanje i sabiranje

Već ste videli kako PIC16F84 može množiti i deliti sa dva u binarnom brojnomsistemu. Sada ćete naučiti kako može brojati unapred i unazad kao i sabirati.

INCF (eng. Increment f ) instrukcija služi za inkrementaciju. Njen oblik je:

INCF f,d pri čemu d određuje gde će ići rezultat (u W ili F).

Ovom instrukcijom se vrši povećanje sadržaja registra f za 1. Ukoliko je npr. vrednostregistra opšte namene 0x0Ch bila 0x00, nakon instrukcije inc 0x0C,F njegovavrednost će postati 0x01, a nakon sledeće iste instrukcije 0x02.

A šta će biti kada se dođe do 0xFF - pitate se vi. Odmah ćete videti.

Bitovi STATUS76543210 Zero flag11111110 0

incf 0x0C,F 11111111 0incf 0x0C,F 00000000 1incf 0x0C,F 00000001 0

Ukoliko vam je potrebna inkrementacija do većih vrednosti možete detektovati stanjeZero flaga, i onda pokrenuti sledeći registar za inkrementaciju. Ili za još veće brojevemožete kao u primeru sa praznom petljom staviti petlju unutar petlje.

Instrukcija suprotna ovoj je DECF f,d (eng. Decrement f ). Ova instrukcija smanjujevrednost registra f za 1, odnosno dekrementuje ga. Sintaksa joj je ista kao kod INCFinstrukcije. U slučaju da brojač dođe do 0 desiće se sledeće:

Bitovi STATUS76543210 Zero flag00000001 0

decf 0x0C,F 00000000 1decf 0x0C,F 11111111 0decf 0x0C,F 11111110 0

Dva specijalna oblika ovih instrukcija su: DECFSZ f,d koju ste već naučili u praznoj petlji i INCFSZ f,d (Increment f , Skip if zero) koja povećava sadržaj registra f za 1 poistom principu kao INCF instrukcija, i koja preskače sledeću instrukciju u slučaju da

 je rezultat operacije jednak 0.

Poc incfsz 0x0C,F ; Povećaj vrednost u registru 0x0C za 1,goto Poc ; i vrati se na početak. Ukoliko se nakon povećanja

; dobije 0, preskoči goto instrukciju i nastavi dalje. Nastavi odavde

Ove instrukcije za razliku od običnih INCF i DECF ne utiču na Zero flag.

40

Page 41: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 41/209

ADD (eng. saberi) operacija sabira dva broja.

Pogledajte kako se izvršava operacija sabiranja u binarnom brojnom sistemu:

 ADD

0 0 0

0 1 1

1 0 1

1 1 10

C 11001101 .205ADD 10111000 .184

= 1 10000101 .389

Prilikom sabiranja dve logičke 1 javlja se prenos u bit većetežine. Ukoliko ni MSB nije dovoljan za prenos, setovaće seCarry flag.

Kod ovakvih slučajeva bit prekoračenja smešta se u Carry flag. Ukoliko je potrebnosabirati brojeve čiji zbir može biti veći od 255, Carry flag mora se uzeti u obzir pri

 prenosu u bajt veće težine.

U instrukcijama za PIC operacija sabiranja ima dva oblika:

ADDLW k sabira sadržaj W registra i konstantne vrednosti k. Rezultat će se naći u Wregistru.

ADDWF f,d sabira sadržaj W registra i registra f. Sa d se određuje gde će se naćirezultat.

Aritmetičke operacije sabiranja (i oduzimanja) pored Carry i Zero flaga utiču još i natzv. DC flag (eng. Digit Carry), odnosno bit 1 STATUS registra. On će biti setovan

 pri prekoračenju donjeg četvorobitnog dela bajta (tzv. nibla). Menja se po istom principu kao i Carry flag.

C DC 1111 1111 C DC 0000 1111ADD 0000 0001 ADD 0000 0001= 1 1 0000 0000 = 0 1 0001 0000

Deljenje bajta na niblove ima smisla ukoliko je potrebno jednim niblom prikazivati jednu cifru, a drugim drugu (npr u digitalnom časovniku za minute gornji nibl od 0 do5, a donji od 0 do 9). Uvećanje samo gornjeg nibla rešava se sabiranjem sa

 b'00010000'.

41

Page 42: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 42/209

15. Negativni brojevi i oduzimanje

Kod negativnih brojeva uzeto je pravilo da bit najveće težine (eng. Most Signle Bit – kod osmobitnih brojeva bit 7) predstavlja znak minus. Ukoliko je MSB setovan, broj

 je negativan.Pošto mikrokontroler koristi jedino 0 i 1 za predstavljanje brojeva, postavlja selogično pitanje kako predstaviti negativne brojeve. Osnovna ideja je invertovanje svih

 bitova unutar bajta. (to bi bio obični, odnosno prvi komplement). Međutim, ovaj princip ima tu manu što se nula može predstaviti dvojako (00000000 i 11111111).Stoga je praktičniji način invertovanje svih bitova i dodavanje broja 1.

+1 = 00000001 -1 = 11111110+1 = 11111111+0 = 00000000 -0 = 11111111+1 = 00000000

Kao što vidite, ovako postoji samo jednostruko predstavljanje broja 0. Takav postupak naziva se drugi komplement ili komplement dvojke.

Računanje drugog komplementa broja može se izvršiti sledećim algoritmom:

comf BROJ,F ; Prvi komplementincf BROJ,F ; Dodaj broj 1

Ručno pretvaranje pozitivnih u negativne brojeve najlakše možete izvršiti računajućidrugi komplement broja. Računanje će vam biti utoliko lakše ukoliko se prisetiteobičnog komplementovanja (ili invertovanja ako vam je tako lakše). Drugi

komplement predstavlja običan komplement kome je dodat broj 1.

COM 01011011 +.9110010000 + 1

= 10100101 -.91

Kao što vidite, MSB ima ulogu znaka (0-pozitivan, 1-negativan). Za prikazivanjerezultata ostaje vam još 7 bitova, tako da se unutar osmobitnog bajta mogu naći

 pozitivni (0 do 127) i negativni (-1 do -128) brojevi. Ovakvi brojevi nazivaju seoznačenim, za razliku od običnih neoznačenih (0-255) brojeva. Zato je bitno unapredodrediti da li ćete raditi sa označenim ili neoznačenim brojevima. Granice označenih

 brojeva ne smeju se prekoračiti, jer PIC ne pravi razliku između označenih ineoznačenih brojeva, pa može doći do netačnog rezultata operacije.

Operacija suprotna sabiranju je SUB (eng. Substract) „oduzmi“. Oduzimanje seunutar mikrokontrolera izvršava upravo sabiranjem prvog broja sa komplementomdvojke drugog broja.

Za razliku od sabiranja, kod koga se Carry flag setuje pri prekoračenju, kododuzimanja je primenjena negativna logika, tako da je Carry flag setovan ukolikonema prekoračenja (tačnije pozajmice). Znači kod oduzimanja manjeg broja od većeg(i u slučaju da su brojevi jednaki), Carry flag će biti setovan. Njegovo stanje se tada

treba ignorisati. Pogledajte to na sledećem primeru: 100-55.

42

Page 43: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 43/209

+.100 C 01100100 +.55 00110111-.55 11001001

+(-.55) 11001001= +.45 1 00101101

Kod oduzimanja većeg od manjeg broja, prilikom sabiranja sa komplementom dvojke

nema prekoračenja, pa se Carry flag ne setuje. Pogledajte to na primeru: 56-87.

+.56 C 00111000 +.87 01010111-.87 10101001

+(-.87) 10101001= -.31 0 11100001

Testiranjem MSB možete utvrditi da li je označeni rezultat pozitivan ili negativan, atestiranjem Zero flaga da li je rezultat 0. Isto kao i sabiranje, i instrukcija zaoduzimanje može se javiti u dva oblika.

SUBLW k oduzima sadržaj W registra od konstantne vrednosti k. Rezultat će se naćiu W registru.

SUBWF f,d oduzima sadržaj W registra od registra f. Sa d se određuje gde će se naćirezultat.

Ukoliko Vam je oduzimanje i testiranje Carry flaga naporno, uradite isto što imikrokontroler. Saberite jedan broj sa drugim komplementom dvojke drugog broja.

Ukoliko se rotacijom izvršava množenje ili deljenje sa 2 nad označenim brojevima,obavezno se mora obratiti pažnja na MSB, jer on označava pripadnost pozitivnim,

odnosno negativnim brojevima.

U praksi se retko kada sreće potreba za primenom označenih brojeva. Skoro sveoperacije izvršavaju se nad neoznačenim brojevima. Označeni brojevi mogli bi imati

 primenu u funkciji mikrokontrolera kao termometra, kada je potrebno izmeriti i prikazati temperature iznad i ispod nule.

43

Page 44: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 44/209

16. Dekapling, debouncing,šmitov okidač, pull up otpornici...

Imate PIC16F84 mikrokontroler. Unutar njega sve je digitalno. On razume jedino

logičku 0 i logičku 1, odnosno naponske nivoe od 0V i +5V. Međutim, ponekad sedogodi da mu se umesto ovih napona dovedu naponi koji odstupaju od onih

 preporučenih u njegovim specifikacijama. Funkcija svih ovih gore nabrojanih termina je da se spreče upravo takvi efekti.

Dekapling predstavlja zaštitu mikrokontrolera od smetnji na vodovima napajanja. Zastabilizaciju ovog napona uglavnom se koristi popularni 78L05 integrisani stabilizator napona. Međutim, da bi se sprečile oscilacije napona napajanja na njegovom izlazu,

 poželjno je zalemiti keramički kondenzator od 100nF paralelno napojnim pinovimamikrokontrolera (pinovi Vss i Vdd), a što bliže njima. Ukoliko u projektu koristiteviše integrisanih kola, poželjno je ovo uraditi kod svakog od njih. Na taj načinkondenzator sprečava bilo kakve nepoželjne oscilacije napona (obično nastale usledindukcije napona sa izlaznih pinova). U šemama u ovom uputstvu nisu nacrtani jedinozbog veće preglednosti. Detalji na http://en.wikipedia.org/wiki/Decoupling_capacitor .

Sigurno vam se već desilo da prilikom uključenja ili isključenja svetla na prekidaču primetite varničenje kontakta. Idealno bi bilo kada bi prekidač odjednom mogao prebaciti svoje stanje od uključenog u isključeno i obrnuto. Međutim, kako se kontakti prekidača fizički ne mogu previše brzo kretati, neizbežno je javljanje par varnica prekonačne promene stanja. Kod uključenja ili isključenja svetla, ova pojava nije bitna.Ali mikrokontroler zbog svoje velike brzine usled ove pojave može zaključiti da jetaster na njegovom ulaznom pinu umesto jednom pritisnut više puta. Da bi se ova

 pojava neutralisala potrebno je u mikrokontroleru realizovati smanjenje šuma naulaznom signalu, odnosno debouncing.

Debouncing rutina testira stanje pina, sačeka malo (koliko je potrebno da sestabilizuje stanje prekidača) i onda ga opet testira. Testiranje se ukoliko je potrebnaveća preciznost može uzastopno izvršavati i više od dva puta. Ukoliko su u svimslučajevima dobijena ista logička stanja na pinu, to znači da je taster sigurno pritinut(otpušten), a u protivnom da nije. Ovaj princip standardno koriste kompjutersketastature. Za više detalja pogledajte http://www.ganssle.com/debouncing.pdf .

Alternativno, moguće je realizovati i hardverski debouncing, ali za njega svaki pinmora imati svoj prekidač što onemogućava multipleks ulaza (više o njemu kasnije) isa svakim tasterom potrebno je povezati dva otpornika i kondenzator. To direktno

 poskupljuje proizvodnju, uvećava mogućnost pojave hardverskih grešaka i zahteva povećanje dimenzije i težine hardvera.

PIC sam po sebi ne bi mogao mnogo toga uraditi bez par ulaznih elemenata(prekidači, senzori, sonde...). Elementi koje mu dodajemo mogu, ali i ne moraju bitidigitalni. U tehničkom uputstvu preporučeno je da ulazni logički nivoi (pri naponunapajanja od 5V) budu u intervalu od 0 do 0,8V za logičku 0, i od 2,4V do 5V zalogičku 1. Šta će se dogoditi ukoliko ovi elementi umesto precizno definisanih

logičkih nivoa na ulazni pin dovedu napon od npr. 1,5V?

44

Page 45: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 45/209

Kod mikrokontrolera nema „sivog“ stanja. Stanje na njegovom pinu mora biti ilicrveno ili belo (navijam za Zvezdu). Ukoliko se ulaznom pinu mikrokontroleradovede ovako nedefinisan napon, on može pročitati 0, a može i 1. Nema pravila.Ukoliko ulazni pin (u najgorem mogućem slučaju) nije povezan na eksterno kolo,napon na njemu može zaoscilovati, pa čak prouzrokovati uništenje mikrokontrolera.

U praksi se nekad javi situacija da je potrebno na mikrokontroler dovesti upravoovakav „sivi“ napon. U tom slučaju poželjno je koristiti uzlaze sa šmitovim okidačem(eng. Schmitt trigger), ili ih dodati eksterno (npr. preko 7414 šestostrukog invertora).

U PIC16F84 šmitov okidač nalazi se na RA4 pinu. Na RB0 pinu nalazi se samo kada je ovaj definisan kao izvor interapta (više o njima kasnije).

Kod ulaza sa šmitovim okidačem nema nedefinisanih stanja ulaznog pina. Stanje na pinu promeniće se tek kada se signal dovoljno približi njegovoj definisanoj oblasti.Ako se nakon toga vrati ka srednjoj (sivoj) oblasti, ulaz će i dalje javljati njegovo

 poslednje stabilno definisano stanje. Više o ovome imate na sajtu

http://en.wikipedia.org/wiki/Schmitt_trigger .

Očigledno je da će pri povezivanju taster prekidača na ulaze PIC16F84mikrokontrolera biti potrebno da njegovi ulazi budu u svakom trenutku na tačnodefinisanom logičkom nivou. Ovo se hardverski realizuje Pull-up (povući nagore) iliPull-down (povući nadole) otpornicima.

Pull up otpornik je otpornik povezan između napona napajanja mikrokontrolera iulaznog pina, pri čemu se taster prekidač vezuje između pina i mase. Kada je taster otpušten, pull up otpornik dovodi napon napajanja direktno na pin, postavljajući gatako u stanje logičke jedinice, sve dok se ne pritisne taster. Bez njega bi napon na pinu

verovatno zašao u nedefinisano stanje. Ovaj otpornik ne treba biti previše malevrednosti zbog manje potrošnje struje pri pritisnutom taster prekidaču. Preporučenevrednosti su od 4,7kΩ do 10kΩ. Na isti način na željeni pin mikrokontrolera može se

 postaviti pull down otpornik prema masi, kada bi se prekidač postavio prema naponunapajanja, što je ilustrovano u ranijim šemama. Više o pull-up otpornicima možetesaznati na http://en.wikipedia.org/wiki/Pull-up_resistor .

Postavljanje eksternih pull up otpornika komplikuje izradu štampane pločice. Stoga suna pinovima PORTB registra oni hardverski implementirani, a uključuju seresetovanjem bita 7 (Port B Pull U p) OPTION_REG registra. Primećujete da je ovosuprotno od onoga što biste mogli očekivati! Zato se takvi „nelogični“ bitovioznačavaju sa crticom iznad njih ili NOT_ predznakom. To označava da je logička 0njihovo aktivno stanje.

Resetovanjem NOT_RBPU bita povezuju se interni otpornici mikrokontrolera nasvaki od ulaza PORTB registra prema naponu napajanja mikrokontrolera. Interniotpornici spajaju se na sve ulazne pinove porta B. Pored te, OPTION_REG registar ima i razne druge funkcije, pa je stoga najpraktičnije ne menjati sadržaj njegovihostalih bitova.

Još jedna stvar vredna pažnje je elekrtomagnetna interferencija. Da bi se zaštitili odnje, poželjno je na svaki pin pre bilo kakvog hardvera povezati redni otpornik.

45

Page 46: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 46/209

17. Još malo o hardveru

Do sada ste pisali i pisali programe. Vreme je da se malo pozabavite unutrašnjomstrukturom mikrokontrolera. Nakon toga neke stvari će vam biti jasnije.

Sve instrukcije sa kojima radi PIC16F84 su četrnaestobitne. Međutim, unutar samihinstrukcija nalazi se kôd instrukcije (po kome se npr. instrukcija CALL razlikuje odMOVLW) i operand, koji predstavlja podatak sa kojim radimo (bit, bajt ili oba u npr.

 bsf PORTA,2 instrukciji). Postoje i instrukcije koje nemaju operand (npr. CLRW).

Pre izvršenja svake instrukcije PIC gleda sadrežaj registra PCL i PCLATH. Oni(tačnije bitovi 0-5 PCLATH + 0-8 PCL) čine jedinstven trinaestobitni PC (eng.Program Counter) registar. U njemu je smeštena adresa izvršavanja tekuće instrukcije.Po izvršavanju instrukcije, PC se uvećava za 1, i prelazi na sledeću instrukciju.Ukoliko je tekuća instrukcija instrukcija uslovnog skoka (DECFSZ, INCFSZ, BTFSC

ili BTFSS), rezultat instrukcije (tačno ili netačno – 1 ili 0) dodaje se na PC, čime jeomogućen skok preko sledeće instrukcije. Međutim ukoliko je tekuća instrukcijaGOTO, ona će u PC postaviti novi adresu, i izvršenje programa nastaviće se odatle.Specijalan slučaj predstavlja koriščenje CALL instrukcije. PIC mora na neki načinupamtiti mesto sa koga je skočio na potprogram. Ta informacija čuva se u steku.

Stek je interni deo mikrokontrolera (kao uostalom i W registar) kome mogu pristupiti jedino instrukcije skoka i povratka iz potprograma ili interapt rutine (više o njojkasnije). Njega možete zamisliti kao cev zatvorenu sa jedne strane u koju redomubacujete klikere. Crveni, zeleni, žuti i plavi. Očigledno, ne možete izvući zelenikliker ukoliko prethodno ne izvučete plavi pa žuti.

Pri nailasku na CALL instrukciju, adresa naredne instrukcije se stavlja na stek, i vršise izmena PC. Mikrokontroler skače na potprogram, i tamo nastavlja izvršenje

 programa sve do instrukcije povratka. Po nailasku na instrukciju povratka,mikrokontroler preuzima adresu povratka sa steka, i smešta je u PC. Dalje izvršenje

 programa nastavlja se odatle. Međutim, stek nije beskonačan. U njega se može upisatimaksimalno 8 adresa za povratak (još manje ukoliko se koriste interapti). Nakon toganove adrese povratka prebrisaće početne (crveni pa zeleni kliker...), što će

 prouzrokovati nepravilan rad programa. Ovo ograničenje ne bi trebalo preterano daVas brine. U praksi uglavnom nema potrebe za potprogramima koji idu više od drugeili treće dubine. Ukoliko u programu imate više pozivanja potprograma, prilikom

simulacije programa proverite sadržaj steka opcijom View, Hardware stack.

Iako PIC nema set instrukcija kojima bi se mogle koristiti tabele u programu, moguće je implementirati ih upotrebom PCL i PCLATH registra i instrukcije RETLW k.

Retlw k (Return with Literal in W) instrukcija omogućava povratak iz potprograma(isto kao i RETURN instrukcija), pri čemu se nakon povratka bajt k nalazi u Wregistru. Za obične potprograme to i nije neka velika pogodnost, ali je za tabeleneophodno. Tabele se koriste pozicionirajući PCL registar na odovarajuću instrukciju.U primeru koji sledi tabela se koristi za odabir odgovarajućeg šablona za crtanje

 brojeva od 0 do 9 na sedmosegmentnom LED displeju.

46

Page 47: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 47/209

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitove.BROJ equ 0x0C ; Promenljiva za broj koji se prikazuje (0x00-0x09)BROJAC equ 0x0D ; Brojač za pauzu. Inicijalno 0xFF

org 0x00

; ****** Podešavanje porta ****** bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw 0x01 ; Konfiguriše pinove tako da su RB1 do movwf TRISB ; RB7 izlazni, a da je RB0 ulazni.clrf TRISA ; Svi pinovi na PORTA su izlazni.

 bcf OPTION_REG,NOT_RBPU ; Uključeni interni „pull up“; otpornici na PORTB

 bcf STATUS,RP0 ; Vraća program u BANK0

; ****** Inicijalizacija ******Ini clrf BROJ ; Postavljanje na 0

call Disp ; Prikaz broja na displeju

47

Page 48: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 48/209

; ****** Testiranje prekidača ******Cek1 btfss PORTB,0 ; Testiranje otpuštenosti prekidača

goto Cek1 ; Nije otpuštencall Pau ; Jeste otpušten. Pozovi pauzu.

 btfss PORTB,0 ; Još jedno testiranje zbog imunosti nagoto Cek1 ; eventualna varničenja kontakta.

Cek2 btfsc PORTB,0 ; Testiranje pritisnutosti prekidačagoto Cek2 ; Nije pritisnutcall Pau ; Jeste pritisnut. Pozovi pauzu.

 btfsc PORTB,0 ; Još jedno testiranje zbog imunosti nagoto Cek2 ; eventualna varničenja kontakta.

; ****** Brojanje ****** movlw 0xF6 ; .246 u W (.246+.9+.1 = setovan Carry flag)addwf BROJ,W ; Saberi sa BROJ, rezultat u W

 btfsc STATUS,C ; Da li je došlo do prekoračenja (Carry flag)?

goto Ini ; Jeste, resetuj brojačincf BROJ,F ; Nije, uvećaj brojač,call Disp ; prikaži rezultat i.goto Cek1 ; nastavi sa testiranjem i brojanjem

; ****** Potprogram za prikaz na LED displeju ******Disp call Tabl ; Obrazac za prikaz u W

 movwf PORTB ; Prikaži na displejureturn ; Povratak iz potprograma

; ****** Tabela ******Tabl movf BROJ,W ; U promenljivoj BROJ nalazi se vrednost od

addwf PCL,F ; .0 do .9. Ta vrednost se dodaje na PCL.retlw b'01111110' ; Obrazac za crtanje cifre 0 - 0

retlw b'00001100' ; Obrazac za crtanje cifre 1 - 1

retlw b'10110110' ; Obrazac za crtanje cifre 2 - 2

retlw b'10011110' ; Obrazac za crtanje cifre 3 - 3

retlw b'11001100' ; Obrazac za crtanje cifre 4 - 4

retlw b'11011010' ; Obrazac za crtanje cifre 5 - 5

retlw b'11111010' ; Obrazac za crtanje cifre 6 - 6

retlw b'00001110' ; Obrazac za crtanje cifre 7 - 7

retlw b'11111110' ; Obrazac za crtanje cifre 8 - 8retlw b'11011110' ; Obrazac za crtanje cifre 9 - 9

; ****** Pauza ******Pau decfsz BROJAC,F ; Pauza zbog debouncing

goto Pau ; rutinereturn ; Povratak iz potprograma

; ****** Kraj programa ******end ; Kraj programa.

48

Page 49: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 49/209

Duplim testiranjem pritisnutosti taster prekidača sa pauzom između testiranjarealizovana je debouncing rutina. Testiranje na otpuštenost, a zatim na pritisnutostsprečava nastavak brojanja ukoliko se prekidač neprekidno drži pritisnut, i omogućava

 promenu stanja prilikom pritiska, a ne prilikom otpusta tastera.

Testiranje prekoračenja realizovano je sabiranjem vrednosti sa brojem 246 i

testiranjem Carry flaga. Za vrednosti od 0 do 9 sabrane sa .249 Carry flag neće bitisetovan, ali hoće za vrednosti veće od njih (.10). One će prouzrokovati ponovnuinicijalizaciju brojača, i ciklus brojanja će ponovo početi od 0.

Prikaz dekadnog broja realizovan je direktnim dovođenjem napona na pojedinesegmente LED displeja. Ovi segmenti su na LED displeju označeni su slovima a, b, c,d, e, f i g. Segment dp (eng. decimal point) „decimalna tačka“ ovde nije iskorišćen.Iako je program je napravljen za rad sa displejem sa zajedničkom katodom, možemože se prepraviti za rad sa displejem sa zajedničkom anodom prepravkom tabele nataj način što se svi bitovi u tabeli (LSB nema uticaja na rad programa jer je pin RB0

 povezan na taster) invertuju:

retlw b'01111110' ; 0 promeniti u b'10000001'retlw b'00001100' ; 1 promeniti u b'11110011'retlw b'10110110' ; 2 promeniti u b'01001001'

U tom slučaju potrebno je prepraviti električnu šemu tako da se zajednička anoda poveže na +5V.

U potprogramu za prikaz možete videti klasičan primer pozivanja drugog potprograma iz prvog.

MPLAB asembler ima direktivu DT (eng. Define Table) kojom se mogu brže unositiželjene vrednosti u tabelu. Njen oblik je sledeći:

addwf PCL,F ; Saberi sa PCLdt d'10', d'18', d'0', d'253', d'84', d'5' ; Vrednosti

Iako na prvi pogled deluje da se na ovaj način štedi memorija mikrokontrolera, to nijeslučaj. Asembler će dt direktivom naredne memorijske lokacije napuniti retlwinstrukcijama koje sadrže vrednosti navedene iza direktive. Pri tome se mogu

 primenjivati svi načini označavanja brojeva (decimalni, heksadecimalni...). Ova

 pogodnost najviše dolazi do izražaja pri upisivanju ASCII karaktera:addwf PCL,F ; Saberi sa PCLdt “Proba ispisa teksta“ ; ASCII karakteri u tabeli

U radu sa tabelama morate obratiti pažnju na dve stvari.

1. Morate biti sigurni da je broj koji sabirate sa PCL u tačno određenimgranicama. U slučaju prekoračenja izvršavanje programa će se nastaviti saslučajne memorijske adrese što će prouzrokovati nepravilan rad ili blokadu

 programa.

49

Page 50: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 50/209

2. Kako je PC trinaestobitni registar čiji donji deo (0-255) je u PCL, a gornji(>255) u bitovima 0-5 PCLATH, potrebno je osigurati da tabela ne izađe iz

 bloka od 256 bajtova. Kod programa navedenog kao primer, to nije problem, jer je on ionako dug samo 43 bajta. Ukoliko je neophodno koristiti tabele savećom količinom podataka, rešenje bi moglo biti u postavljanju više tabela.Veličinu bloka najjednostavnije možete proveriti brojanjem upotrebljenih

instrukcija (bez direktiva), ili analizom .lst fajla generisanog prilikomasembliranja. Za postavljanje početka tabele na željeno mesto (početak bloka)možete koristiti ORG direktivu.

Umesto tabele moguće je napraviti skok na proračunate memorijske lokacije addwf PCL,F instrukcijom, pri čemu se adresa na koju se treba skočiti čuva u W registru uobliku broja instrukcija koje se trebaju preskočiti da bi se došlo do željene.Ogrančenja vezana za tabele važe i u ovom slučaju. Da biste ih prevazišli, pogledajteAN548 sa http://www.microchip.com/.

50

Page 51: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 51/209

18. Watchdog tajmer

Pretpostavimo da ste napisali program koji se neprekidno izvršava namikrokontroleru. Normalno, želeli bi da se osigurate da će program uvek nastaviti saizvršavanjem bez obzira na to šta se sa njim događa. Uzmite u obzir sledeći slučaj.Pretpostavimo da PIC nadgleda određeni ulazni pin. Kada se na ovaj pin dovedelogička 1, program skače na naredni deo i čeka da sledeći pin dobije logičku 1.Ukoliko se to ne desi, PIC će se vrteti u petlji i čekati. Izaći će iz petlje tek kada se na

 pinu pojavi 1. Pogledajte sada malo drugačiji primer. Pretpostavimo da ste napisali program, kompajlirali ga, čak i simulirali njegov rad u simulatoru. Međutim posledugo vremena program se zaglavi u nekoj petlji (koliko ste samo puta Vi pritisnuliCtrl Alt Delete kombinaciju na Windowsu). U oba slučaja potrebna Vam je neka vrstareseta ukoliko se program zaglavi. To je svrha Watchdog (eng. pas čuvar) tajmera.

Watchdog tajmer (skraćeno WDT) nije ništa novo. Mnogi mikrokontroleri i

mikroprocesori imaju ga u sebi. Ali kako on radi? Unutar mikrokontrolera nalazi seinterni RC oscilator koji obezbeđuje jedinstven takt, nezavistan od taktamikrokontrolera. Kada se WDT uključi, njegov brojač počinje sa 0x00, i redom seinkrementuje sve dok ne dostigne maksimalnu vrednost 0xFF. U trenutku prelaska sa0xFF na 0x00 (što je 0xFF+1) PIC će se resetovati bez obzira na njegovo stanje.Jedini način na koji se može sprečiti ovaj reset, je periodično resetovanje WDT na 0kroz program. Sada možete i sami uvideti da u slučaju zaglavljivanja mikrokontrolerau petlji WDT neće biti resetovan, što će prouzrokovati reset mikrokontrolera.

Da biste mogli uspešno koristiti WDT potrebno je da znate tri stvari. Prvo za kolikovremena će WDT preći sa 0x00 na 0xFF, drugo kada ga trebate resetovati i treće kako

 podesiti softver programatora za njegovo uključenje.

Vreme WDT 

WDT ima vreme prelaska sa 0x00 na 0xFF od oko 18mS. Ovo vreme zavisno je odnekoliko spoljnih faktora kao što su napon napajanja, temperatura mikrokontrolerai.t.d. Zbog lakšeg objašnjavanja zaokružiću ovo vreme na tačno 18mS. Ipak, ono semože i produžiti.

bit 2,1,0 Odnos Vreme

0, 0, 0 1:1 18mS0, 0, 1 1:2 36mS

0, 1, 0 1:4 72mS

0, 1, 1 1:8 144mS

1, 0, 0 1:16 288mS

1, 0, 1 1:32 576mS

1, 1, 0 1:64 1,1S

1, 1, 1 1:128 2,3S

Unutar mikrokontrolera nalazi se tzv. preskaler (eng. pre podeliti). On se može

 programirati za deljenje WDT taktagenerisanog internim RC oscilatorom. Što seveći odnos deljenja koristi, takt WDT će bitisporiji.

Preskaler se nalazi u OPTION_REG registru(0x81) na mestu od nultog do drugog bita. Utabeli je prikazan odnos bitova, odnosdeljenja takta i vreme prekoračenja vrednostiWDT.

51

Page 52: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 52/209

Upamtite da su ova vremena nezavisna od takta oscilatora mikrokontrolera. Mislite oovim vremenima kao stvarnim (eng. real time), nasuprot taktu mikrokontrolera kojimožete menjati fizičkom zamenom par delova u oscilatoru. Pretpostavimo da želite daWDT resetuje PIC nakon pola sekunde. Najbliža standardna vrednost je 576mS,odnosno 0,576S, pa je dovoljno poslati vrednost b101 u OPTION_REG registar.

 movlw b'101' ; Ovo je 0x05 movwf 0x81 ; Adresa OPTION_REG registra.

Međutim nije baš sve tako jednostavno. Po inicijalizaciji PIC-a postskaler je pridruženinternom tajmeru mikrokontrolera (više o njemu kasnije). To znači da je potrebno

 prebaciti ga na WDT. Kako i interni i watchdog tajmer koriste iste bitoveOPTION_REG registra Microchip preporučuje sledeću proceduru kako ne bi došlo donehotičnog reseta PIC.

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSCorg 0x00 ; Podešava konfiguracione bitove.

; ****** Podešavanje WDT ******* bsf STATUS,RP0 ; BANK1* movlw b'xx0x0111' ; Izaberi tajmer i preskaler različit od 000* movwf OPTION_REG

* bcf STATUS,RP0 ; BANK0clrf TMR0 ; Brisanje vrednosti internog tajmera i

; preskalera – pri upisu u tajmer, bsf STATUS,RP0 ; BANK1 movlw b'xxxx1111' ; Izaberi WDT, bez menjanja odnosa

; preskalera movwf OPTION_REG

clrwdt ; Obriši WDT movlw b'xxxx1xxx' ; Izaberi WDT, i postavi zeljeni odnos

; preskalera xxx.; Za 0,576S to je b'xxxx1101'

 movwf OPTION_REG

 bcf STATUS,RP0 ; BANK0

U slučaju željenog odnosa različitog od 1:1 (vrednost preskalera 000) mogu se izbacitiinstrukcije označene zvezdicom.

Vrednosti u OPTION_REG registru levo od preskalera označene sa x imaju specijalnefunkcije (poput uključenja Pull-Up otpornika) koje ćete naučiti u delu sa tajmerom iinteraptima. Iz tog razloga im ovde nisu dodeljene konkretne vrednosti. Za sada jedovoljno da znate da se bitom 3 OPTION_REG registra vrši selekcija tajmera komeće biti pridružen delitelj po sledećem:

1 – postskaler WDT

0 – preskaler internog tajmera.

52

Page 53: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 53/209

U primeru ste naučili upotrebu CLRWDT (eng. Clear Watchdog timer) instrukcije. Nakon nje, TO bit (eng. Time Out – isteklo vreme) STATUS registra biće iznovasetovan, a naći će se u resetovanom stanju jedino prilikom WDT reseta. Više o tomenaučićete u poglavlju sa reset funkcijom.

Vreme izvršavanja instrukcija

Kao što se sećate, PIC deli takt oscilatora sa 4. Ovo vreme naziva se instrukcijskiciklus. Ukoliko je kao izvor takta upotrebljen kristal od 4MHz, PIC će izvršavatiinstrukcije brzinom od 4MHz/4=1MHz, odnosno za jednu instrukciju koja traje 1instrukcijski ciklus će mu trebati 1μS, dok će mu za instrukciju koja traje 2instrukcijska ciklusa trebati 2μS. Način da zapamtite broj instrukcijskih ciklusa za sveinstrukcije je prilično lak. Pretpostavite da sve instrukcije traju 1 instrukcijski ciklus.Ali, ukoliko instrukcija prouzrokuje nastavak programa sa neke druge adrese(promenjen je sadržaj PC), onda će ona trajati 2 instrukcijska ciklusa. Na primer MOVWF instrukcija traje 1 instrukcijski ciklus, jer samo premešta podatak sa jednogna drugo mesto. GOTO instrukcija traje 2 ciklusa jer prouzrokuje da PC skoči na neko

drugo mesto u programu. RETURN instrukcija traje 2 ciklusa, jer se PC vraća naglavni program. Međutim, postoje 4 instrukcije koje mogu trajati 1 ili 2 instrukcijskaciklusa. To su DECFSZ, INCFSZ, BTFSC i BTFSS. One će preskočiti sledećuinstrukciju u slučaju da je određeni uslov ispunjen i onda će trajati 2 ciklusa. Ukolikotaj uslov nije ispunjen, izvršiće se naredna instrukcija kao da se ništa nije ni desilo, ionda će trajati 1 ciklus. Pogledajte sada sledeći program.

 movlw 0x02 movwf BROJAC

Pet decfsz BROJAC,Fgoto Pet

end

Prva instrukcija postavlja vrednost 0x02 u W. Ovo ne prouzrokuje menjanje PC, paona traje 1 instrukcijski ciklus. Sledeća instrukcija je slična. Ona takođe ne menjastanje PC, pa i ona traje 1 ciklus. Sada će sledeća instrukcija izvršiti prvo smanjenjeregistra BROJAC za 1 i rezultat „testa na vrednost 0“ = 0 pridružiti PC. Na ovaj načinPC se ne menja, pa instrukcija traje 1 ciklus. Sledeća instrukcija je GOTO, i ona traje2 ciklusa. Onda se ponovo vrši smanjenje registra BROJAC za 1, ali kako je sadarezultat „testa na vrednost 0“ = 1, PC će promeniti svoju vrednost na PC+1, što troši 2instrukcijska ciklusa. Znači ovaj program zauzeće ukupno 7 instrukcijskih ciklusa. Uzkristal od 4MHz program će trajati

4MHz / 4takta = 1μS po instrukcijskom ciklusu, što za 7 ciklusa iznosi 7 * 1μS = 7μS.

Vidite koliko zbunjujući može biti instrukcijski ciklus instrukcija uslovnog skoka.

 Softver programatora

Sećate se __CONFIG direktive? Za korišćenje WDT, on se mora preko nje uključiti saWDT ON. A pošto je neki programatori ignorišu, potrebno je i unutar njihovogsoftvera podesiti konfiguracione bitove. Postupak njihovog podešavanja razlikuje seod programatora, do programatora (softvera). Uglavnom se traži njihov upisneposredno pre programiranja mikrokontrolera.

53

Page 54: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 54/209

Sledećim programom namerno sedozvoljava prekoračenje WDT. Njegovtakt koristi se za treptanje LED.

Primećujete da je LED povezana takoda svetli pri dovođenju logičke 0 na

 pin, a da joj se napon dovodi direktnosa napajanja! To je bolje zbog manjeggrejanja i potrošnje. Osim toga PIC

 pored ograničenja struje po pojedinačnim pinovima (20mA) ima iograničenje struje koju može dati ceo

 port (do 50mA za PORTA i do 100mAza PORTB), kao i ograničenje ukupnestruje koju prima i kojom moženapajati eksterne potrošače (150mA).

PIC pri ovakvom povezivanju podnosido 25mA po pinu, do 80mA zaPORTA i do 150mA za PORTB.

 Za pin RA4 ovo je i jedino moguće rešenje, jer on na svom izlazu ne može datilogičku 1.

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitove.org 0x00

; ****** Test WDT reseta ****** btfss STATUS,TO ; Testiraj stanje TO bitagoto Led ; Resetovan je, znači WDT reset

; ****** Podešavanje porta ****** bsf STATUS,RP0 ; Prebacuje program u BANK1clrf TRISA ; Svi pinovi

clrf TRISA ; su izlazni.clrf TMR0 ; Brisanje vrednosti internog tajmera i; preskalera – pri upisu u tajmer,

; ****** Podešavanje WDT ****** bcf STATUS,RP0 ; Vraća program u BANK0clrf TMR0 ; Brisanje vrednosti internog tajmera i

; preskalera – pri upisu u tajmer, bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw b'10001111' ; Isključi Pull-up otpornike i

; izaberi WDT, sa maksimalnim; vremenom preskalera

 movwf OPTION_REG

54

Page 55: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 55/209

clrwdt ; Obriši WDT movlw b'10001110' ; Izaberi WDT, i postavi odnos

; preskalera od 1,1S movwf OPTION_REG

 bcf STATUS,RP0 ; BANK0

; ****** Inicijalizacija W i prvo prekoračenje WDT ******clrw ; Obriši W

Pet goto Pet ; Mrtva petlja. Vrti se ovde do; prvog WDT reseta

; ****** Naredna prekoračenja WDT ******Led xorlw b'00000100' ; Izmeni stanje bita 2 u W

 movwf PORTA ; Prebaci stanje iz W u PORTAPet2 goto Pet2 ; Mrtva petlja. Vrti se ovde do

; sledećeg WDT reseta; ****** Kraj programa ******

end ; Kraj programa.

 Nakon početne inicijalizacije program će se vrteti u prvoj mrtvoj petlji. Kako u njojnema CLRWDT instrukcije, nakon 1,1S nastupiće WDT reset. Po resetu program ćese izvršiti od početka, ali će deo sa testiranjem TO bita detektovati je li nastupio WDTreset ili ne, i ukoliko jeste dalje izvršavanje programa nastaviće se od labele Led gdeće se izmeniti stanje RA2 pina.

 Nestabilnost WDT oscilatora usled promene temperature može biti efektnoiskorišćena za merenje temperature mikrokontrolera (samim tim i spoljne

temperature) bez ikakvih eksternih senzora. Za detalje pogledajte AN828.

55

Page 56: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 56/209

19. Tajmer

U slučaju da pišete program koji mora imati veliku ali tačno definisanu pauzu sigurnovam se neće svideti mogućnost postavljanja jedne petlje unutar druge i proračunavanja

 broja ciklusa za željenu dužinu pauze. Postoji elegantniji način rešavanja ovog problema. PIC16F84 ima u sebi integrisan tajmer. Impulsi ovog tajmera mogu bitisinhronizovan sa taktom izvršavanja instrukcija mikrokontrolera ili sa taktomeksternog oscilatora čiji impulsi se dovode na pin 3 (RA4/T0CKI). Glavna funkcijatajmera je brojanje (.0-.255) koje je za razliku od WDT sinhronizovano sa ovimtaktom. U trenutku prekoračenja maksimalne vrednosti, flag tajmera se setuje, i ciklus

 brojanja opet počinje od nule. Prednost tajmera nad običnom petljom za kašnjenje je učinjenici da je brojanje interni proces mikrokontrolera, i da ni na koji način ne utiče na

 brzinu izvršavanja glavnog programa. Dovoljno je povremeno proveriti stanje flagatajmera, kako bi program znao da je ciklus brojanja završen.

Kako na ovaj način nije moguće dobiti veće periode, tajmer isto kao i WDT možekoristiti preskaler.

Budući da se za korišćenje i WDT i internog tajmera pretežno vrši manipulacija nadOPTION_REG registrom, vreme je da se bliže upoznate sa njegovom unutrašnjomstrukturom.

bit7 bit0

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

●  NOT_RBPU (eng. Port B  Pull U p) bit OPTION_REG registra služi za

 povezivanje internih otpornika PORTB registra na napon napajanja.

● Upotrebu INTEDG (eng. Interrupt edge) bita naučićete u sledećem poglavlju.

● T0CS (eng. Timer 0 Clock Select)  bit omogućava izbor takta tajmera. Ukoliko je resetovan, brojanje će se odvijati sinhronizovano sa taktom izvršavanjainstrukcija koji je četiri puta manji od takta oscilatora. Ovaj takt se možedobiti sa CLKOUT pina mikrokontrolera.

Ukoliko je T0CS bit setovan, brojanje će biti sinhronizovano sa eksternimtaktom koji se treba dovesti na pin 3 (RA4/T0CKI).

● T0SE (eng. Timer 0 Source Edge)  bit ima smisla jedino pri upotrebi eksternogtakta. Njime se bira hoće li se brojanje vršiti pri prelasku sa logičke 0 na 1(resetovan T0SE) ili sa logičke 1 na 0 (setovan T0SE).

● PSA (eng. Prescaller  Assigment) bit se koristi za selekciju pridruženosti preskalera. Ukoliko je setovan, postskaler će biti pridružen WDT, a ukoliko jeresetovan preskaler će biti pridružen tajmeru.

● Bitovima PS0 do PS2 bira se odnos deljenja preskalera po sledećoj tablici.

56

Page 57: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 57/209

 Bit 

2, 1, 0

TMR0

odnos

WDT 

odnos

0, 0, 0 1:2 1:1

0, 0, 1 1:4 1:2

0, 1, 0 1:8 1:4

0, 1, 1 1:16 1:8

1, 0, 0 1:32 1:16

1, 0, 1 1:64 1:32

1, 0, 1 1:128 1:64

1, 1, 1 1:256 1:128

Primećujete da se i ovde pominje WDTodnos. On je tu jer se odnos tajmera od 1:1može dobiti jedino pridruživanjem preskaleraWDT, setovanjem PSA bita. Za takvo

 podešavanje primenjuje se kôd opisan u prošlom poglavlju sa instrukcijama

označenim zvezdicama.

Budući da se pri samom programiranjuPIC16F84 vrši uključenje ili isključenje WDT(podešavanjem konfiguracionih bitova), nemože se doći u situaciju da se WDT samuključi, i tako izazove reset mikrokontrolera,iako mu je pridružen preskaler.

Registar tajmera TMR0 (eng. Timer0) nalazi se na adresi 0x01, a njegov flag T0IF(eng. Timer 0 Overflow Interrupt Flag) nalazi se u INTCON registru. Više o ovom

registru naučićete u delu sa interaptima.

Sledi program koji ilustuje upotrebu tajmera. On će instrukcijski ciklus preskaleromdeliti sa 256, zatim softverski još sa 6, a onda će heksadecimalne brojeve (0x00 do0x0F) prikazivati na LED displeju.

Deljenje sa dva se kao što se sećate može realizovati rotacijom bitova unutar registra.U programu će biti upotrebljen ranije ilustrovani princip prikaza na LED displeju.

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitoveDISP equ 0x0C ; Promenljiva za broj koji se prikazuje

; na displeju (0x00-0x0F)DEL equ 0x0D ; Promenljiva za rotaciju

ORG 0x00 ; Definiše start programa

; ****** Inicijalizacija tajmera i displeja ******clrf TMR0 ; Inicijalizacija tajmeraclrf

INTCON; Brisanje flaga tajmera

 bsf STATUS,RP0 ; Prelazak u BANK1clrf PORTA ; Postavlja sve pinoveclrf TRISB ; kao izlazne

 movlw b'10000111' ; Tajmer je sinhronizovan sa; instrukcijskim ciklusom, i preskaler je

 movwf OPTION_REG ; podešen za odnos 1:256; Pull up otpornici su isključeni

 bcf STATUS,RP0 ; Povratak u BANK0

57

Page 58: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 58/209

; ****** Inicijalizacija brojača ******Ini movlw 0x00 ; Inicijalizacija

 movwf DISP ; displeja movlw b'00100000' ; Inicijalizacija movwf DEL ; delitelja

; ****** Čekanje na prekoračenje tajmera ******Taj bcf INTCON,T0IF ; Resetovanje flaga tajmeraCek btfss INTCON,T0IF ; Čekanje na setovanje flaga tajmera,

goto Cek ; odnosno prekoračenje tajmera

; ****** Deljenje sa 6 ******rrf DEL ; Rotiraj DEL registar nadesno. Kada se Carry

 btfss STATUS,C ; flag setuje, nastavi dalje. Ukoliko i dalje nijegoto Taj ; setovan, čekaj na još jedan ciklus tajmera.

; ****** Prikaz cifre na displeju ******call Tabl ; Uzmi obrazac iz tabele,

 movwf PORTB ; i prikaži cifru na displeju.

; ****** Testiranje prekoračenja vrednosti cifre na displeju ****** movlw 0x01 ; .1 u Waddwf DISP,F ; Saberi DISP sa W. Rezultat u DISP

 btfsc STATUS,DC ; Da li je došlo do prekoračenja vrednosti 0x0F?goto Ini ; Jeste, počni brojanje od početka (cifre 0)goto Taj ; Nije, nastavi dalje sa brojanjem.

; ****** Tabela ******Tabl movf DISP,W ; U promenljivoj DISP nalazi se vrednost od

addwf PCL,F ; 0x00 do 0x0F. Ta vrednost se dodaje na PCL.retlw b'01111110' ; Obrazac za crtanje cifre 0 - 0

retlw b'00001100' ; Obrazac za crtanje cifre 1 - 1

retlw b'10110110' ; Obrazac za crtanje cifre 2 - 2

retlw b'10011110' ; Obrazac za crtanje cifre 3 - 3

retlw b'11001100' ; Obrazac za crtanje cifre 4 - 4

retlw b'11011010' ; Obrazac za crtanje cifre 5 - 5

retlw b'11111010' ; Obrazac za crtanje cifre 6 - 6

retlw b'00001110' ; Obrazac za crtanje cifre 7 -7

retlw b'11111110' ; Obrazac za crtanje cifre 8 - 8

retlw b'11011110' ; Obrazac za crtanje cifre 9 - 9

retlw b'11101110' ; Obrazac za crtanje cifre A- A

retlw b'11111000' ; Obrazac za crtanje cifre B - Bretlw b'01110010' ; Obrazac za crtanje cifre C - Cretlw b'10111100' ; Obrazac za crtanje cifre D - Dretlw b'11110010' ; Obrazac za crtanje cifre E - Eretlw b'11100010' ; Obrazac za crtanje cifre F - F

; ****** Kraj programa ******

end ; Kraj programa

58

Page 59: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 59/209

Možda Vam izgleda čudno upotreba sabiranja umesto inkrementovanja registra DISP.Svakako da se njegovo uvećanje moglo izvršiti i inkrementacijom, ali na ovaj načinlakše je nakon povećanja testirati njegovo prekoračenje. Jedino instrukcije sabiranja ioduzimanja menjaju stanje DC flaga, i jedino pri prekoračenjima donjih niblova(tačnije vrednosti 0x0F donjeg nibla).

Za kraće periode moguće je nakon svakog prekoračenja postaviti inicijalnu vrednosttajmera na npr. .100. U tom slučaju tajmer će brojati od .100 do .255, kada će sesetovati njegov flag. Isto tako moguće je primeniti drugačiji pristup, pa inicijalizovatiTMR0 na .0, i testirati ga na vrednost npr. .100. Povedite računa o instrukcijama kojekoristite za podešavanje tajmera, jer će većina instrukcija čije je odredište TMR0registar obrisati preskaler.

59

Page 60: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 60/209

20. Interapti - pojam

Pojam interapta će vam verovatno biti najteži za razumevanje. Ne postoji lak način zanjihovo objašnjavanje, ali nadam se da ćete pri kraju ove sekcije moći da ih uspešno

 primenjujete u svojim programima.

Interapt je proces ili signal koji prekida izvršavanje glavnog mikrokontrolerskog programa i prebacuje njegovo izvršavanje na potprogram koji je zadužen za obraduinterapta. Po povratku iz potprograma glavni program nastavlja sa radom kao da seništa nije ni dogodilo. Ilustrovaću ovo na svakodnevnom primeru. Pretpostavimo dasedite kući i čitate ovo uputstvo. Odjednom vam mobilni signalizira prijem SMS

 poruke. Prekidate čitanje, pročitate poruku (eventualno i odgovorite), i nastavljatečitanje sa mesta na kome ste stali. Možete zamisliti glavni program kao čitanjeuputstva, zvonjavu mobilnog kao izvor interapta, a proces čitanja poruke (ieventualnog odgovora na nju) kao potprogram za obradu intertapta.

PIC16F84 ima 4 izvora interapta. Dva eksterna i dva interna. Za sada ćete naučiti primenu eksternih izvora, a interni će biti objašnjeni kasnije. Ukoliko pogledateoznake izvoda pinova PIC16F84 videćete da je na pinu 6 oznaka RB0/INT. Očigledno

 je da je RB0 ulazno izlazni pin PORTB registra. INT označava da se on možekonfigurisati i kao pin eksternog interapta. Pri tome se on ponaša kao šmitov okidač,što otežava pojavu lažnih signala okidanja. Takođe se i pinovi RB4 do RB7 mogukoristiti za interapte. Pre nego što se upotrebi bilo koji izvor interapta, trebaju seuraditi dve stvari. Prvo se trebaju dozvoliti interapti, a zatim izabrati željeni izvoriinterapta koji će se koristiti u programu.

Unutar PIC16F84 nalazi se INTCON (eng. Interrupt Controller) registar na adresi0Bh. Njegov MSB nazvan je GIE (eng. Global Interrupt Enable). Setovanjem GIEmikrokontroler dozvoljava upotrebu jednog ili više izvora interapta. Ukoliko je GIEresetovan, korišćenje bilo kog interapta nije moguće. Njega možete uporediti sacentralnom bravom automobila.

Bit 4 INTCON registra nazvan je INTE (eng. RB0/INT Interrupt Enable - uključiinterapt na RB0/INT pinu). Setovanjem INTE bita dozvoljena je upotreba RB0 pinakao izvora interapta. Pre toga je (naravno) potrebno konfigurisati ga kao ulazni pin,kako se ne bi dogodilo da se interapt izazove prilikom menjanja njegovog stanja odstrane samog programa.

Sada se mikrokontroler treba podesiti za željeni signal izazvanja interapta. Pri rastućoj(sa 0V na +5V) ili pri opadajućoj ivici (sa +5V na 0V) signala. Drugim rečima da liželite da se interapt u mikrokontroleru izazove pri prelasku signala na RB0 pinu salogičke 0 na logičku 1, ili sa logičke 1 na logičku 0. Ovo se podešava uOPTION_REG registru na adresi 81h. Setovanje njegovog bita 6 nazvanog INTEDG(eng. Interrupt Edge) prouzrokovaće interapt pri rastućoj ivici, a resetovanje prisilaznoj. Kako je nažalost OPTION_REG registar u BANK1, treba preći iz BANK0 uBANK1, tamo setovati ili resetovati INTEDG bit OPTION_REG registra, i vratiti se uBANK0. Najpraktičnije je ovo podešavanje izvršiti uz ostala u toku inicijalizacijemikrokontrolera. Ovim je PIC16F84 podešen za korišćenje interapta na RB0/INT pina

PORTB registra.

60

Page 61: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 61/209

Ukoliko želite koristiti više eksternih izvora interapta, možete koristiti pinove RB4 doRB7. Oni se razlikuju od RB0/INT pina u tome što se interapt javlja pri promenistanja na pinovima. To znači da će se interapt javiti pri prelasku sa logičke 0 nalogičku 1, ali i sa logičke 1 na logičku 0. Podešavanje ovih pinova za izvore interaptavrši se setovanjem bita 3 INTCON registra nazvanog RBIE (eng. Port B ChangeInterrupt Enable) „uključi interapte pri promeni stanja na portu B“. Kako se kod njih

interapt izvršava pri svakoj promeni stanja pinovi RB4 do RB7 nemaju svoj bit zaodređivanje ivice signala pri kojoj će se izazivati interapt.

 Interapt flag 

Sećate li se kako se vrši setovanje Carry flaga? Pri nailasku na interapt na RB0/INT pinu na sličan način se setuje bit 1 (INTF eng.Interrupt f lag), odnosno bit 0 (RBIFeng. Port B  Interrupt f lag) pri interaptu na RB4 do RB7 pinovima u INTCONregistru. Kada interapta nema, interapt flag je resetovan. To je cela njegova funkcija.Sada se verovatno pitate kakva je njihova svrha. Ukoliko je interapt flag setovan PICne može i neće odgovarati na druge interapte. Pretpostavimo da je izazvan interapt.

Odgovarajući interapt flag će biti setovan, i mikrokontroler će izvršiti potprogram zaobradu interapta. Ukoliko interapt flag nije setovan, PIC će prihvatati nove interaptešto može dovesti do neprestanog vraćanja programa na početak rutine za obraduinterapta koja se usled toga nikada ne može izvršiti do kraja. Ukoliko se setite primerasa mobilnim, to je kao da Vam za vreme odgovora na SMS stigne nova poruka i

 prekine upis odgovora. Daleko je praktičnije završiti sa jednom porukom, i ondadozvoliti prijem novih.

Interapt flagovi imaju još jednu funkciju, a to je omogućavanje interapt rutinidetekciju izvora interapta (RB0/INT pin odnosno RB4 do RB7 pinovi) u slučajukorišćenja više izvora interapta. Iako PIC automatski setuje interapt flagove pri

nailasku interapta, on ih ne resetuje pri povratku iz rutine za obradu interapta. Ovaj posao mora programer sam izvršiti (siguran sam da već znate kako), i treba se odraditinakon završetka rutine za obradu interapta, a neposredno pre izlaska iz nje.

Uprošćen prikaz interne interapt logike

61

Page 62: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 62/209

 Start i interapt vektor programske memorije

U trenutku dovođenja napona napajanja ili prilikom reseta, programski brojač (PC) pokazuje na adresu 0x00, na početak programske memorije. Međutim, pri pojaviinterapta PC će adresu sledeće instrukcije staviti na stek, i skočiće na adresu 0x04.Dakle, kada pišete programe koji će koristiti interapte, pre svega trebate reći

mikrokontroleru da preskoči preko adrese 0x04, i zadrži interapt rutinu koja počinjena adresi 0x04 odvojenu od ostatka programa. Ovo se veoma lako implementira.

 Najpre je potrebno da program standardno započne direktivom ORG 0x00. Dalje je potrebno preskočiti preko adrese 0x04. Ovo se radi postavljanjem GOTO instrukcije,nakon koje sledi labela pozicionirana za start glavnog programa. Nakon ove gotoinstrukcije sledi još jedna ORG direktiva, ovoga puta sa adresom 0x04, a nakon njerutina za obradu interapta. Na kraju programa za obradu interapta potrebno je stavitiRETFIE (eng. Return f rom interrupt) instrukciju. Ova instrukcija označava povratak iz interapt rutine. Kada PIC naiđe na ovu instrukciju PC uzima sa steka lokaciju nakojoj je PIC bio pre nego što se pojavio interapt.

Sledi deo kôda koji ilustruje navedeno.

org 0x00 ; PIC počinje odavde pri uključenju i resetugoto Main ; Idi na glavni programorg 0x04 ; PIC dolazi ovde pri pojavi interapta:: ; Ovde se nalazi rutina za obradu interapta koju: ; PIC izvršava jedino pri nailasku na interapt.: ; Na njenom kraju potrebno je obrisati odgovarajući: ; interapt flag.

:retfie ; Završetak rutine za obradu interapta

Main ; Početak glavnog programa

Postoji par stvari na koje trebate obratiti pažnju prilikom korišćenja interapta.

1. Ukoliko koristite isti registar u glavnom programu i u rutini za obraduinterapta imajte u vidu da će se sadržaj tog registra verovatno promeniti priizvršenju rutine za obradu interapta. Na primer, recimo da koristite W registar da biste poslali podatak na PORTA, i takođe koristite W registar u rutini zaobradu interapta za neku drugu operaciju. Ukoliko ne pazite, W registar će pri

 povratku iz rutine za obradu interapta zadržati vrednost koju je imao u interaptrutini, i pri povratku iz nje, ovaj podatak biće poslat na PORTA umestovrednosti koju je W registar imao ranije. Rešenje ovoga je privremeno čuvanjevrednosti W registra u nekom od slobodnih registara, i vraćanje njegove starevrednosti po završetku interapt rutine. Isto važi i za ostale registre (obično zaSTATUS) čiji sadržaj se menja u interapt rutini.

2. Potrebno je obratiti pažnju na minimalno vreme između dve uzastopne pojaveinterapta. Ukoliko se za takt mikrokontrolera koristi kvarc od 4MHz, PIC ćeizvršavati instrukcije brzinom od 1μS po instrukciji. Ovo vreme naziva se

instrukcijskim ciklusom. U tehničkom uputstvu (eng. Datasheet) za PIC

62

Page 63: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 63/209

navedeno je da se treba ostaviti najmanje 3 do 4 instrukcijska ciklusa (znači bar 3-4μS) između dve uzastopne pojave interapta. Razlog za je vreme koje je potrebno mikokontroleru za skok na rutinu za obradu interapta, setovanjeinterapt flaga i povratak iz potprograma za obradu interapta. Imajte ovo naumu ukoliko koristite eksterne izvore interapta.

3. Na kraju interapt rutine bit GIE INTCON registra se automatski setuje.

Automatsko setovanje GIE bita može da bude i nedostatak u jednom slučaju,tj. moguće je da instrukcija za resetovanje ovog bita (zabranu svih interapta) uglavnom programu uopšte ne bude izvršena. Naime, ukoliko interapt nastupi utrenutku izvršavanja instrukcije koja resetuje GIE bit, prvo će ta instrukcija bitizavršena do kraja (resetovaće se GIE bit), a zatim će početi izvršavanjeinterapt rutine koja će na svom kraju da automatski setuje bit GIE. Tako ćeGIE bit biti setovan iako je neposredno pre interapta bio resetovan. Da bi sezaštitili od ove situacije, Microchip preporučuje da se nakon resetovanja GIE

 bita proveri da li je bit zaista resetovan i da se, ukoliko nije, operacija ponovi.4. Sećate se da se bitovi 4 do 7 na PORTB registru mogu koristiti kao izvori

interapta. Ne možete izabrati pojedinačne pinove na PORTB za interapte.

Dakle, ukoliko uključite ove pinove, svi postaju dostupni. U čemu je svrhakorišćenja 4 bita kao izvora interapta? Primer može biti kućni alarm, čija 4senzora su povezana na pinove na PORTB registru. Bilo koji senzor možeokinuti PIC za uključenje alarma, a rutina za alarm je rutina za obraduinterapta. Ovo štedi neprekidno testiranje portova, i rasterećuje mikrokontroler za druge namene. Nažalost njihovim interapt flagom (RBIF INTCON registra)nije moguće izvršiti detekciju interapta na pojedinačnim pinovima, već jedinona svim.

5. U slučaju korišćenja više izvora interapta moguće je da se za vreme interaptrutine izazvane RB0/INT pinom pojavi i interapt na bitovima 4-7 PORTBregistra. Stoga je potrebno u samoj interapt rutini testirati prvi interapt flag, u

zavisnosti od negovog stanja otići na rutinu za njegovu obradu, i tamoresetovati samo taj interapt flag. Odmah nakon povratka iz potprograma zaobradu interapta, izvršiće se interapt izazvan drugim izvorom.

6. Interapt flagovi setuju se bez obzira na stanje GIE bita, kao i pojedinačnihdozvola za interapte (kao u programu sa tajmerom). To može biti iskorišćenoza detekciju njihovih stanja iz samog programa bez korišćenja interapta.

 Naravno, odgovarajući interapt flag je kao i kod interapta potrebno ručnoresetovati nakon detekcije.

7. Budite oprezni prilikom korišćenja potprograma unutar interapt rutine.Ukoliko je u glavnom programu stek skoro pun (a biće pri pozivanju

 potprograma iz potprograma), još par takvih pozivanja unutar interapt rutinesigurno će izazvati njegovo prekoračenje. Uvek uzmite u obzir najgorumoguću varijantu, tj. da se interapt rutina javlja baš prilikom izvršavanja

 potprograma najveće dubine.8. Ne pozivajte iz rutine za obradu interapta potprograme koje već pozivate iz

glavnog programa. Ukoliko je to neophodno, prilikom ulaska u interapt rutinusnimite sadržaj svih registara modifikovanih u potprogramu, i vratite ih natrag

 prilikom izlaska iz interapt rutine.

U sledećem poglavlju videćete program koji koristi interapte.

63

Page 64: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 64/209

21. Interapti - program

Prešli ste dosta teorije u prošlom poglavlju, i došlo je vreme da se upoznate sa programom koji koristi interapte. Program će pri pritiskanju prekidača brojiti od 0 do7. Rezultat će se prikazivati na 3 LED na PORTA u binarnom obliku. Sam glavni

 program će samo prikazivati rezultat, a brojanje i testiranje prekoračenja bićerealizovani interapt rutinom.

 Najpre se mikrokontroler treba podesiti tako da pri izvršavanju programa preskoči deona koji PC skače pri pojavi interapta.

org 0x00 ; Ovde PC dolazi pri uključenju i resetugoto Main ; Odlazak na glavni program

org 0x04 ; Ovde će početi rutina za obradu interapta;; ; Rutina za obradu interapta. Upisaće se kasnije;retfie ; Ova instrukcija označava kraj rutine za obradu

; interapta, i vraća PC na glavni program.

Main ; Početak glavnog programa

Onda je potrebno podesiti PIC za korišćenje interapta na pinu 6:

 bsf INTCON,GIE ; Global interrupt enable (1 – uključi) bsf INTCON,INTE ; RB0 Interrupt enable (1 – uključi)

64

Page 65: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 65/209

Za svaki slučaj potrebno je resetovati interapt flag (nikad ne veruj mikrokontroleru):

 bcf INTCON,INTF ; Obriši interapt flag

Kako su ovde iskorišćene čak 3 instrukcije za menjanje vrednosti samo jednogregistra praktičnije je u pogledu štednje memorije i brzine izvršavanja programa

zameniti ih sa dve.

 movlw b'10010000' ; bit 7 GIE – Global interrupt enable (1 – uključi); bit 4 INTE – RB0 Interrupt enable (1 – uključi); bit 1 INTF – Interrupt flag (0 – obriši)

 movwf INTCON ; Inicijalizuj INTCON registar 

Sada je potrebno podesiti portove. Sećate se da zbog korišćenja RB0 kao interapt pina, on mora biti postavljen kao ulazni;

 bsf STATUS,RP0 ; Prebacuje nas u BANK1 movlw 0x01 ; b'00000001' u TRISB movwf TRISB ; RB0/INT kao ulaz, a ostali kao izlazclrf TRISA ; Svi pinovi na PORTA su izlazni

 bcf OPTION_REG,INTEDG ; Interapt se izaziva pri; opadajućoj ivici signala

 bcf OPTION_REG,NOT_RBPU ; Uključeni interni „pull up“; otpornici na PORTB

   bcf STATUS,RP0 ; Povratak u BANK0

Kako interapt želimo izazivati pri opadajućoj ivici signala (sa +5V na 0V) mora se

 podesiti i INTEDG bit OPTION_REG registra. Takođe su resetovanjem NOT_RBPU bita uključeni pulll up otpornici.

Program će koristiti promenljivu TEMPW za privremeno čuvanje W registra dok seizvršava interapt rutina i promenljivu BROJAC za pamćenje broja pritisnutih

 prekidača. BROJAC će u programu imati sledeće vrednosti: bitovi 76543210

00000000 .000000001 .100000010 .200000011 .3

00000100 .400000101 .500000110 .600000111 .7

00001000 .8 - prekoračenje

Stoga je najpre potrebno imenovati registre i inicijalizovati vrednost BROJACregistra.

TEMPW equ 0x0C ; TEMPW na adresi 0x0CBROJAC equ 0x0D ; BROJAC na adresi 0x0D

clrf BROJAC ; Stavi 0x00 u BROJAC

65

Page 66: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 66/209

Dalje je potrebno u glavnom pro gramu napraviti petlju koja će vrednost promenljiveBROJAC neprestano prikazivati na PORTA registru.

Pri comf BROJAC,W ; Invertovani BROJAC u W registar (zbog LED) movwf PORTA ; a odatle u PORTAgoto Pri ; Vrati se na početak petlje

Budući da prva pojava interapta nastaje tek kada se program nađe u glavnoj programskoj petlji (Pri), i da u sama petlja ne reaguje na stanje bitova STATUSregistra, u interapt rutini nema potrebe za privremenim čuvanjem njegove vrednosti.

U interapt rutini potrebno je najpre sačuvati vrednost W registra.

 movwf TEMPW ; Privremeno čuvanje sadržaja W registra

Onda je potrebno inkrementovati sadržaj BROJAC registra.

incf BROJAC,F ; Uvećaj registar BROJAC.

Dalje je potrebno proveriti da li je promenljiva BROJAC prekoračila maksimalnuvrednost .7 (b'00000111') i došla do .8 (b'00001000'). Najpraktičnije je izvršititestiranje trećeg bita BROJAC registra.

 btfsc BROJAC,3 ; Testiraj treći bit 00001000 BROJAC registra.; Ukoliko nije setovan, preskoči sledeću; instrukciju

clrf BROJAC ; Upisi 0x00 u BROJAC

; Ukoliko je BROJAC nakon inkrementacije; prekoračio maksimalnu vrednost (b'00000111'); sada je jednak .0; Ukoliko nije, sada je inkrementovan.

 movf TEMPW,W ; Vrati prethodni sadržaj W registra bcf INTCON,INTF ; Obriši INTF – dozvoli nove interapteretfie ; Kraj interapt rutine.

Pogledajte sada celokupan program:

; ****** Inicijalizacija i imenovanje ******

list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitove

ORG 0x00 ; Definiše start programaTEMPW equ 0x0C ; Čuvanje sadržaja W registra na adresi 0x0CBROJAC equ 0x0D ; BROJAC na adresi 0x0D

66

Page 67: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 67/209

; ****** Interapt rutina ******

org 0x00 ; Ovde PC dolazi pri uključenju i resetugoto Main ; Odlazak na glavni program

org 0x04 ; Ovde će početi rutina za obradu interapta

 movwf TEMPW ; Privremeno čuvanje sadržaja W registraincf BROJAC,F ; Inkrementuj BROJAC.

 btfsc BROJAC,3 ; Testiraj treći bit b'00001000' BROJAC registra.; Ukoliko nije setovan, preskoči sledeću; instrukciju

clrf BROJAC ; Upisi .0 u BROJAC; Ukoliko je BROJAC nakon inkrementacije; prekoračio maksimalnu vrednost (.7); sada je .0; Ukoliko nije, sada je inkrementovan.

 movf TEMPW,W ; Vrati prethodni sadržaj W registra bcf INTCON,INTF ; Obriši INTF – dozvoli nove interapteretfie ; Kraj interapt rutine.

; ****** Glavni program – inicijalizacija ******

Main movlw b'10010000' ; bit 7 GIE – Global interrupt enable (1 – uključi); bit 4 INTE – RB0 Interrupt enable (1 – uključi); bit 1 INTF – Interrupt flag (0 – obriši)

 movwf INTCON ; Inicijalizuj INTCON registar  bsf STATUS,RP0 ; Prebacuje program u BANK1

 movlw 0x01 ; b'00000001' u TRISB movwf TRISB ; RB0/INT kao ulaz, a ostali kao izlazclrf TRISA ; Svi pinovi na PORTA su izlazni

 bcf OPTION_REG,INTEDG ; Interapt se izaziva pri; opadajućoj ivici signala

 bcf OPTION_REG,NOT_RBPU ; Uključeni interni „pull up“; otpornici na PORTB

 bcf STATUS,RP0 ; Povratak u BANK0clrf BROJAC ; Stavi .0 u BROJAC

; ****** Glavni program – petlja ******

Pri comf BROJAC,W ; Invertovani BROJAC u W registar (zbog LED) movwf PORTA ; a odatle u PORTAgoto Pri ; Vrati se na početak petlje

; ****** Kraj programa ******

end ; Kraj programa.

Kao što je ranije rečeno RA4 pin ne može na svom izlazu dati logičku jed inicu . U

slučaju da se na njega pošalje logička 0, ponašaće se isto kao i ostali pinovi, a u

67

Page 68: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 68/209

slučaju jedinice, preći će u stanje visoke impedanse (kao da nije ni povezan). Pin RA4razlikuje se od ostalih i po svom ulazu. Ulaz mu je sa Šmitovim okidačem. Toomogućava bolji prijem signala sa prisustvom šuma (npr. sa udaljenog senzora).

Kako je ovaj program dat samo ilustrativno, njim nije realizovana debouncing rutina.Prilikom pritiskanja prekidača možete primetiti da se umesto jednog ponekad javi

 preskok brojeva.

Do sada ste naučili 32 instrukcije. Verovatno i sami uočavate da Vam sada veći problem od učenja novih instrukcija predstavlja učenje funkcija registara specijalnenamene.

U registare koje ste u potpunosti naučili spadaju PORTA, TRISA, PORTB, TRISB,PCL, PCLATH, TMR0 i OPTION_REG. To je osam potpuno i dva delimično(STATUS i INTCON) naučena registra.

Sledi još jedan deo sa interaptima, a onda nešto novo.

68

Page 69: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 69/209

22. Tajmerom izazvani interapti

Sećate li se tajmera. Malo je nepraktično sve vreme čekati na promenu njegovogflaga. Praktičnije bi bilo da mikrokontroler za vreme brojanja tajmera obavlja nekudrugu operaciju a da se pri setovanju njegovog flaga izvrši interapt rutina. Pogađate,moguće je.

Pre nego što naučite kako se to može ostvariti, upoznaćete se sa internom strukturomINTCON registra.

bit7 bit0

GIE EEIE T0IE INTE RBIE T0IF INTF RBIF

● GIE (eng. Global Interrupt Enable) omogućava ili zabranjuje upotrebu svihinterapta. Njegovim setovanjem, dozvoljena je upotreba interapta.

● Setovanjem EEIE (EEPROM Interrupt Enable) omogućen je završetak snimanja u EEPROM kao izvor interapta.

● Setovanjem T0IE (eng. Timer 0  Interrupt Enable) bita tajmer je upotrebljenkao izvor interapta.

● INTE (eng. RB0/INT INTerrupt Enable) bit setovanjem dozvoljava korišćenjeRB0 pina mikrokontrolera kao izvora interapta.

● Setovanjem RBIE (eng. Port B Change Interrupt Enable) bita, omogućena je

upotreba PORTB registra kao izvora interapta pri promeni logičkog stanja naRB4 do RB7 pinovima.

● T0IF (eng. Timer 0 Interrupt Flag) bit setuje se pri prekoračenju tajmera.

● INTF (eng. Interrupt Flag) bit setuje se pri dolasku odgovarajućeg logičkognivoa (odabranog INTEDG bitom OPTION_REG registra) na RB0 pinmikrokontrolera.

● RBIF (eng. Port B  Interrupt Flag) setuje se pri promeni logičkog stanja na pinovima RB4 do RB7.

Interapt flagovi se ne resetuju automatski nakon očitavanja. Da bi se dozvolili noviinterapti, neophodno je resetovati željeni flag pre izlaska iz interapt rutine.

Da bi se tajmer upotrebio kao izvor interapta, dovoljno je dozvoliti njegovo korišćenjesetovanjem GIE i T0IE bitova, i resetovanjem njegovog flaga. Sva podešavanjavezana za običan tajmer (preskaler, eksterni takt) važe i u ovom slučaju.

Kako je u interapt potprogramima uglavnom neophodno čuvati stanje STATUSregistra posebna pažnja mora se obratiti na instrukcije koje prilikom njegovog

vraćanja ne utiču (iznova) na promenu njegovog stanja kao što npr. MOVF instrukcija

69

Page 70: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 70/209

može uticati na izmenu Zero flaga. Zbog toga se preporučuje upotreba SWAPFinstrukcije.

Swapf (eng. Swap F -  zameni) instrukcija menja mesta gornjem i donjem niblu uregistru.

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

bit3 bit2 bit1 bit0 bit7 bit6 bit5 bit4

Sintaksa instrukcije je swapf f,d pri čemu je f registar nad kojim se izvršava operacija,a sa d je određeno odredište rezultata operacije.

Sledi program koji ilustruje upotrebu 3 nezavisna dela. Električna šema ista je kao u prethodnom poglavlju. Prvim delom će LED1 treperiti. To će biti glavni program.Drugim delom će se pri pritisku tastera izazvati interapt koji će menjati stanje LED2.Trećim delom će se tajmerom izazivati interapt koji će menjati stanje LED3.

Ova tri dela su samo uslovno nezavisna. Interapt potprogram troši vreme potrebno zaizvršavanje svojih instrukcija, pa će u zavisnosti od brzine izvršavanja interapt

 potprograma (i brzine njenog pojavljivanja) glavni program raditi sporije. Međutim,interapt rutina se uglavnom pravi tako da njeno trajanje bude što kraće, pa tako njenoizvršavanje ne utiče u velikoj meri na brzinu glavnog programa.

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitoveORG 0x00 ; Definiše start programacblock 0x0C

TEMPW ; Čuvanje sadržaja W registraTEMPSTATUS ; Čuvanje sadržaja STATUS registraBROJAC1 ; BROJAC1. Inicijalno 0xFF

BROJAC2 ; BROJAC2. Inicijalno 0xFFBROJAC3 ; BROJAC3. Inicijalno 0xFFSPORTA ; Shaddow registar za PORTA

endc

; ****** Interapt rutina ******

org 0x00 ; Ovde PC dolazi pri uključenju i resetugoto Main ; Odlazak na glavni programorg 0x04 ; Ovde će početi rutina za obradu interapta

 movwf TEMPW ; Čuvanje sadržaja W registra u TEMPW

70

Page 71: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 71/209

swapf STATUS,W ; STATUS sa okrenutim niblovima u W movwf TEMPSTATUS ; i zatim u TEMPSTATUS registar  movf SPORTA,W ; Shaddow registar u W

; ****** Test interapta izazvanog prekidačem ****** btfss INTCON,INTF ; Interapt izazvan prekidačem?

goto Taj ; Nije, idi na deo za tajmerski interapt.

; ****** Rutina za obradu interapta izazvanog prekidačem ******xorlw b'00000010' ; Promeni stanje bita za LED2 u W

; ****** Izlazak iz interapt rutine izazvane prekidačem ******call Vrat ; Updatuj PORTA i SHADDOW i

; Vrati stanja W i STATUS registra bcf INTCON,INTF ; Dozvoli nove interapte prekidačaretfie ; Povratak iz interapt rutine.

; ****** Update PORTA i SHADDOW i vraćanje ******; ****** originalnog stanja W i STATUS registra ******Vrat movwf PORTA ; Kopiraj W u PORTA

 movwf SPORTA ; Kopiraj W u Shaddow registar swapf TEMPSTATUS,W ; TEMPSTATUS sa okrenutim niblovima

; u W. Dva puta okrenuti niblovi daju movwf STATUS ; prvobitno stanje koje ide u STATUSswapf TEMPW,F ; Jednom okreni niblove u samom

; TEMPW registru,swapf TEMPW,W ; a drugi put sa W kao odredištem.

return ; Kraj potprograma.

; ****** Rutina za obradu interapta izazvanog tajmerom ******Taj decfsz BROJAC3,f ; Smanji BROJAC3.

xorlw b'00000100' ; Promeni stanje bita za LED3 u W; Gornja instrukcija izvršava se u svim slučajevima kada je vrednost BROJAC3; registra od .1 do .255. Kako je i naredna instrukcija ista, dva puta XOR-ovana; vrednost daje originalno stanje W registra (kao pre XOR operacije).; Kada je BROJAC3 = 0 gornja instrukcija ona se preskače i izvršava se samo; jedna (naredna) XOR operacija, koja prouzrokuje željenu promenu stanja bita.

xorlw b'00000100' ; Promeni stanje bita za LED3 u W.; Ova instrukcija se uvek izvršava.

; ****** Izlazak iz interapt rutine izazvane tajmerom ******call Vrat ; Updatuj PORTA i SHADDOW i

; vrati stanja W i STATUS registra bcf INTCON,T0IF ; Dozvoli nove interapte tajmeraretfie ; Povratak iz interapt rutine.

71

Page 72: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 72/209

; ****** Glavni program – inicijalizacija ******

Main bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw 0x01 ; b'00000001' u TRISB movwf TRISB ; RB0/INT kao ulaz, a ostali kao izlazclrf TRISA ; b'00000' u TRISA, svi pinovi PORTA su izlazni

 movlw b'00000111' ; T0CS=0 - Tajmer je sinhronizovan sa; instrukcijskim ciklusom; Preskaler - PSA=111 je podešen za odnos 1:256; INTEDG=0 - Interapt se izaziva pri; opadajućoj ivici signala (sa 1 na 0); NOT_RBPU=0 - Uključeni interni „pull up“; otpornici na PORTB

 movwf OPTION_REG ; bcf STATUS,RP0 ; Povratak u BANK0clrf TMR0 ; Inicijalizacija tajmeraclrf SPORTA ; Inicijalizacija Shaddow registra

 movlw b'10110000' ; bit 7 GIE – Global interrupt enable (1 – uključi); bit 4 INTE – RB0 Interrupt enable (1 – uključi); bit 1 INTF – Interrupt flag (0 – obriši); bit 5 T0IE – Timer interrupt enable (1 – uključi); bit 2 T0IF – Timer interrupt flag (0 – obriši)

 movwf INTCON ; Inicijalizuj INTCON registar 

; ****** Glavni program – treptanje LED1 ******Poc bcf INTCON,GIE ; Zabrani nove interapre

 btfsc INTCON,GIE ; Proveri jesu li interapti zaista zabranjeni

goto Poc ; Nisu, zabrani ih opet. movf SPORTA,W ; SHADDOW u Wxorlw b'00000001' ; Promeni stanje bita za LED1 u W

 movwf PORTA ; Kopiraj W u PORTA movwf SPORTA ; Kopiraj W u Shaddow registar  bsf INTCON,GIE ; Dozvoli nove ineraptecall Pet ; Ubaci kašnjenjegoto Poc ; Vrati se na početak 

; ****** Potprogram za kašnjenje od oko 0,2S ******Pet decfsz BROJAC1,F ; Ove dve petlje služe za brojanje nadole od

goto Pet ; 255 do 0, 255 puta, omogućavajući nam dadecfsz BROJAC2,F ; možemo videti kako LED1 treperigoto Pet

return ; Povratak iz potprograma

; ****** Kraj programa ******end ; Kraj programa

Možete se zapitati zašto su upotrebljene dve swapf instrukcije pri vraćanju TEMPW uW, kada se isto moglo realizovati i movf TEMPW,W instrukcijom. Razlog je taj što

će mowf instrukcija setovati Zero flag u slučaju da je u W bila vrednost 0x00, dok je

72

Page 73: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 73/209

swapf instrukcija neutralna prema svim flagovima. Slično važi i za STATUS registar.Ukoliko je odredište instrukcije koja menja stanje flagova STATUS registra samSTATUS registar, njegovi flagovi postaviće se u zavisnosti od rezultata instrukcije,

 bez obzira na stanje bajta koji želimo poslati u njega.

U delu sa testiranjem interapta možete primetiti da je testiran samo interapt flag

 prekidača. To je sasvim normalno, jer nešto mora da je izazvalo interapt kada se većušlo u interapt rutinu. Ukoliko to nije bio prekidač, onda je sigurno bio tajmer Ukoliko su oba interapta nastupila istovremeno (setovana oba interapt flaga), najpreće se izvršiti interapt rutina prekidača, ali po povratku iz interapt potprograma odmahće se izazvati novi interapt jer je interapt flag tajmera i dalje setovan.

Sigurno ste u delu za obradu tajmerskog interapta uočili neobičnu realizacijukašnjenja. Ono se moralo izvesti na taj način (u prolazu) jer se ne sme dozvoliti da

 preveliko kašnjenje interapt potprograma koči izvršenje glavnog programa.

U glavnom programu interapti su privremeno zabranjeni da se stanje SPORTA

registra ne bi promenilo interapt rutinom za vreme njegove promene od straneglavnog programa. Testiranje zabrane svih interapta takođe je neophodno (pogledajtenapomene uz interapte).

Dosta je bilo interapta. Sledi nešto sasvim drugačije.

73

Page 74: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 74/209

23. Indirektno adresiranje

Sećate li se tabele? Kod nje je skok na željenu lokaciju izvršen sabiranjem PCL sa W. Nešto slično ali u odnosu na registre, moguće je postići korišćenjem FSR i INDFregistra.

INDF registar nije fizički registar. Njegovo adresiranje u stvari adresira registar čijaadresa je sadržana u FSR registru (FSR je pointer adrese željenog registra). Takav

 postupak naziva se indirektno adresiranje.

Pretpostavite da PORTA sadrži vrednost 0x03, a PORTB 0x2B. Ukoliko u FSR ubacite adresu PORTA registra (0x05), i pročitate sadržaj registra INDF, dobićetevrednost 0x03. Ukoliko sada inkrementujete FSR, on će ukazivati na PORTB (0x06).Sada će očitavanje vrednosti iz INDF registra vratiti vrednost 0x2B.

Isto tako je moguće i upisivanje podataka u željene registre.Sledeći program ilustruje upisivanje vrednosti 0x00 u registre od 0x20 do 0x2F.

 movlw b'00100000' ; Inicijalizacija pointera movwf FSR ; na registar 0x20

Pet clrf INDF ; Indirektno brisanje željenog registraincf FSR,F ; Pozicioniranje pointera na sledeći registar 

 btfss FSR,4 ; Prekoračenje? 0x30 = b'00110000'goto Pet ; Nije, nastavi sa brisanjem

; Jeste, nastavak programa.

Za razliku od tabele, zbog malog broja registara kod upotrebe indirektnog adresiranjanema ograničenja u smislu blokova podataka (bar kod PIC16F84 mikrokontrolera – kod mikrokontrolera sa većim brojem registara ovo nije slučaj).

Indirektno adresiranje se u programima najčešće upotrebljava jedino u slučaju većekoličine podataka.

Do sada ste naučili 33 od 35 instrukcija, potpunu upotrebu deset registra i delimičnuupotrebu dva registra od ukupno 15. Prešli ste najveći (i najteži – interapti) deogradiva, međutim ima se još mnogo toga naučiti.

74

Page 75: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 75/209

24. EEPROM memorija

Zamislite da imate PIC koji preko sistema fotoćelija broji posetioce koji su ušli krozulazna vrata banke, kao i one koji su izašli kroz izlazna vrata, i na osnovu broja lica u

 banci reguliše rad senzora pokreta, osvetljenja i klima uređaja.

Kako ne biste želeli da išta prepustite slučaju, mikrokontroler radi sa uključenimWDT. Međutim, elektrodistribucija se postara da ne bude sve tako idealno i odjednomnestane struje. Kako banka ne bi bila banka ukoliko nema neku rezervu, 2 sekundenakon nestanka struje uključuje se elektroagregat (što ne sprečava reset kompjutera izabrinuto „Jao dođite kasnije, ne rade nam terminali“), i PIC (koji se takođeresetovao) kreće sa radom inicijalizujući u svom brojaču 1 osobu (u normalnom raduonoga ko prvi dolazi na posao). Nakon što se broj osoba u banci smanji za 1 osobu(što može nastati i mnogo kasnije, jer su klijenti banke čuli da je legla plata), prestajuda rade klima uređaji i osvetljenje, a senzori pokreta uključuju alarm i dojavljuju

 pljačku banke policiji.Znam znam. Jedan manji akumulator ili UPS rešio bi problem. Ali direktor banke nida čuje. To direktno poskupljuje projekat. Pa nije valjda džabe kupio agregat!

U ovom slučaju potrebno je da PIC i nakon nestanka napona napajanja zapamtivrednost promenljive BROJAC (ili više promenljivih ukoliko je broj osoba koje mogustati u prostoriju veći od 255). Po dolasku napona napajanja ove vrednosti trebaju se

 pročitati, i prebaciti u odgovarajuće registre.

Unutar PIC16F84 nalazi se 64 bajta EEPROM memorije (0x00–0x3F). Za razliku od

registara koji su obična RAM memorija, ova memorija zadržava svoje stanje i nakonnestanka napona napajanja mikrokontrolera.

 Nažalost zbog fizičkih osobina EEPROM memorije rad sa njom nije ni izdaleka tako jednostavan kao rad sa običnim RAM registrima. Pored indirektnog adresiranja (za štase koriste registri EEADR (eng. EEPROM Adress) i EEDATA (eng. EEPROMData)) potrebno je inicirati proces čitanja ili snimanja bajta, što se vrši prekoEECON1 (eng. EEPROM Controller 1) i EECON2 (eng. EEPROM Controller 2)registra.

Pre nego što naučite čitanje i snimanje u EEPROM, upoznajte internu strukturu

EECON1 registra.

bit7 bit0

/ / / EEIF WRERR WREN WR RD

● Bitovi 5 do 7 se ne koriste u EECON1 registru. Trebaju biti na logičkoj nuli.

● EEIF (eng. EEPROM Interrupt Flag) bit predstavlja flag interapta izazvanogzavršetkom procesa snimanja bajta. Ovaj interapt može se dozvolitisetovanjem EEIE (eng. EEPROM Interrupt Enable) bita INTCON registra.

Potrebno ga je ručno obrisati pre povratka iz interapt rutine.

75

Page 76: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 76/209

● WRERR (eng. Write Error) bit indikuje prekid snimanja bajta u EEPROM,usled isteka vremena WDT ili eksternog reseta mikrokontrolera. Programmože nakon reseta testirati ovaj bit (uz to mora otkriti i da li je reset nastaousled nestanka napona napajanja ili ne), i na osnovu njegovog stanja dovršiti

 proces snimanja (sadržaj EEADR i EEDATA registra ne menja se nakonreseta).

● WREN (eng. Write Enable) bit mora biti setovan, da bi bio moguć upis uEEPROM.

● WR (eng. Write) bit koristi se za iniciranje upisa u EEPROM memoriju.

● RD (eng. R ead) bit koristi se za iniciranje čitanja iz EEPROM memorije.

Pogledajte najpre primer čitanja memorijske adrese 0x10 iz EEPROM memorije.

 bcf STATUS,RP0 ; Prebacuje nas u BANK0 zbog EEADR  movlw 0x10 ; Želimo pročitati sadržaj EEPROM movwf EEADR ; memorije sa adrese 0x10 bsf STATUS,PR0 ; Prebacuje nas u BANK1 bsf EECON1,RD ; Inicira proces čitanja

; EEPROM memorije   bcf STATUS,RP0 ; Prebacuje nas u BANK0

 movf EEDATA,W ; Sadržaj bajta sa adrese 0x10; iz EEPROM memorije je u EEDATA,; odakle se može prebaciti u W

Ovaj program trebao bi da Vam je u potpunosti jasan. Setovanjem RD bita iniciran je proces čitanja, a zatim se RD bit automatski nakon čitanja vraća na 0. Podatak izEEPROM memorije dostupan je u EEDATA registru odmah u narednominstrukcijskom ciklusu, odakle je premešten u W registar. Pogledajte sada kako jerealizovano snimanje bajta 0x24 u EEPROM adresu 0x10.

 bcf STATUS,RP0 ; Prebacuje nas u BANK0 movlw 0x24 ; Bajt za snimanje movwf EEDATA ; u EEDATA movlw 0x10 ; na adresu movwf EEADR ; 0x10

 bsf STATUS,RP0 ; Prelaz u BANK1 zbog EECON1 bcf INTCON,GIE ; Zabrana svih interapta (ukoliko ih ima) bsf EECON1,WREN ; Dozvola pisanja u EEPROM

 movlw 0x55 ; movwf EECON2 ; movlw 0xAA ; Inicijalizacija upisa u EEPROM movwf EECON2 ; bsf EECON1,WR ; bsf INTCON,GIE ; Dozvola interapta (ukoliko se koriste)

 bcf EECON1,WREN ; Zabrana daljeg pisanja u EEPROM

76

Page 77: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 77/209

Snimanje u EEPROM neće se inicirati ukoliko nije tačno ispoštovana procedura (0x55u EECON2, 0xAA u EECON2, setovan WR) i to bez pauza (otud zabrana interapta)za svaki pojedinačni bajt. Microchip navodi da je ta procedura uvedena kako bi sesprečio nehotičan upis u EEPROM zbog mogućih grešaka u programu. Iz istograzloga WREN bit je potrebno držati setovanim jedino za vreme upisa u EEPROM.

WR bit se automatski resetuje po završetku upisa. U slučaju serijskog snimanja podataka u EEPROM, potrebno je pre sledećeg snimanja proveriti stanje ovog bita,kako se ne bi desilo iniciranje novog upisa u EEPROM a da prethodno snimanje jošnije završeno. To je obavezno, jer snimanje u EEPROM nije sinhronizovano sainstrukcijskim ciklusom, već se za upis u EEPROM koristi poseban interni oscilator,koji određuje vreme upisa od oko 10mS. Kod čitanja podataka iz EEPROM memorijenema ovakvih problema. Umesto testiranja flaga moguće je i jednostavno sačekatidovoljno dugo (npr. 12mS).

Možda Vam se mere inicijalne procedure i WRERR bita čine preteranim. Ali zapitajtese šta bi se desilo ukoliko bi u EEPROM memoriji čuvali npr. obrasce za prikaz broja

na LED displeju. U slučaju korupcije EEPROM memorije PIC ni nakon reseta ne bimogao nastaviti sa normalnim radom. Morao bi se odlemiti sa štampane pločice i

 ponovo programirati (u mikrokontroler se sa programom snima i sadržaj EEPROMmemorije).

U sledećem poglavlju upoznaćete se sa programom koji koristi EEPROM memoriju inaučićete upotrebu EEIF bita i proces upisa podataka u EEPROM iz samogasemblera. Na taj način se sadržaj EEPROM memorije može čuvati zajedno sa

 programom u jednom .asm ili .hex fajlu.

77

Page 78: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 78/209

25. EEPROM i interapti

Sećate li se onog teškog? Da, interapta. U njihovim osnovnim podacima navedeno jeda se mogu koristiti 4 izvora interapta. Dva hardverska (željena promena stanja naINT pinu i promena stanja na pinovima RB4-RB7) i dva softverska (prekoračenjetajmera i završetak slanja podatka u EEPROM).

Ima li svrhe koristiti završetak slanja podatka u EEPROM kao izvor interapta? Teško.Sav proces može se završiti linijskim kôdom. Opravdanje njenog korišćenja može senaći u vremenski kritičnim programima kod kojih je potrebno za vreme snimanja uEEPROM izvršavati druge operacije, kako mikrokontroler ne bi gubio vreme čekajući(čak 10mS) na završetak snimanja. Bolje je da program umesto čekanja na završetak upisa u EEPROM radi nešto korisno.

Sada ćete se upoznati sa programom koji po pritisku na taster menja stanje na LED

displeju od 9 do 0, i snima ga u EEPROM. Po isključenju napona napajanja injegovom ponovnom dovođenju, na LED displeju naći će se poslednja zapamćenavrednost (to je i bio cilj u primeru sa bankom). Glavni program imaće jedino funkcijuučitavanja i snimanja trenutnih vrednosti u EEPROM, a interapt rutinom će serealizovati sve ostalo (test prekidača, smanjenje broja, prikaz na displeju). Kodovakvog programa očigledno je da interapt rutina traje daleko duže od samog glavnog

 programa. To se ovde može tolerisati. Električna šema je ista kao u delu sa tabelama.

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC; Podešava konfiguracione bitove

cblock 0x0CTEMPW ; Privremeno čuvanje W registraTEMPSTATUS ; Privremeno čuvanje STATUS registraBROJAC ; Brojač za bebouncing pauzu. Inicijalno 0xFFDISP ; Broj koji se prikazuje na

endc ; displeju i snima (0x09 – 0x00)

; ****** Inicijalizacija vrednosti u EEPROM memoriji ******org 21x00 ; Početak EEPROM memorije

de 0x00 ; Inicijalizacija početne vrednosti na; displeju

; ****** Interapt rutina – čuvanje sadržaja registra ******

org 0x00 ; Ovde PC dolazi pri uključenju i resetugoto Main ; Odlazak na glavni programorg 0x04 ; Ovde će početi interapt rutina

 movwf TEMPW ; Čuvanje sadržaja W registra u TEMPWswapf STATUS,W ; STATUS sa okrenutim niblovima u W

 movwf TEMPSTATUS ; i zatim u TEMPSTATUS registar 

78

Page 79: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 79/209

; ****** Test prekidača ****** bcf STATUS,RP0 ; Povratak u BANK0 – u glavnom

; programu pre skoka na interapt rutinu; program se izvršavao u BANK1

Cek1 btfss PORTB,0 ; Testiranje otpuštenosti prekidačagoto Cek1 ; Nije otpušten

goto Pau ; Jeste otpušten. Idi na pauzu. btfss PORTB,0 ; Još jedno testiranje zbog imunosti nagoto Cek1 ; eventualna varničenja kontakta.

Cek2 btfsc PORTB,0 ; Testiranje pritisnutosti prekidačagoto Cek2 ; Nije pritisnutgoto Pau ; Jeste pritisnut. Idi na pauzu.

 btfsc PORTB,0 ; Još jedno testiranje zbog imunosti nagoto Cek2 ; eventualna varničenja kontakta.

; ****** Prikaz cifre na displeju ******

 movf DISP,W ; DISP u Wcall Tabl ; Uzmi obrazac iz tabele, movwf PORTB ; i prikaži cifru na displeju.

; ****** Testiranje prekoračenja vrednosti cifre na displeju ******decf DISP,F ; Smanji DISP za 1. Rezultat u DISP

 btfss DISP,7 ; Testiraj MSB. On će biti 1 jedino ukoliko je; došlo do prekoračenja sa 0x00 na 0xFF

goto Povr ; Nije, izađi iz interapt rutine movlw 0x09 ; Jeste, inicijalizuj brojac na movwf DISP ; vrednost 0x09

Povr swapf TEMPSTATUS,W ; TEMPSTATUS sa okrenutim niblovima; u W. Dva puta okrenuti niblovi daju

 movwf STATUS ; prvobitno stanje koje ide u STATUSswapf TEMPW,F ; Jednom okreni niblove u samom

; TEMPW registru,swapf TEMPW,W ; a drugi put sa W kao odredištem.

 bcf EECON1,EEIF ; Dozvola novih interaptaretfie ; Kraj interapt rutine.

; ****** Glavni program – inicijalizacija ******Main bsf STATUS,RP0 ; Prebacuje program u BANK1 bcf EECON1,EEIF ; Reset interapt flaga movlw b'11000000' ; GIE=1 – Global interrupt enable movwf INTCON ; EEIE=1 – EEPROM interrupt enable movlw b'00000000' ; NOT_RBPU=0 - Uključeni interni movwf OPTION_REG ; pull up otpornici na PORTB movlw 0x01 ; b'00000001' u TRISB movwf TRISB ; RB0/INT kao ulaz, a ostali kao izlazclrf TRISA ; Svi pinovi na PORTA su izlazni

 bcf STATUS,RP0 ; Povratak u BANK0

79

Page 80: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 80/209

; ****** Čitanje iz EEPROM memorije ****** movlw 0x00 ; Želimo pročitati sadržaj EEPROM movwf EEADR ; memorije sa adrese 0x00 bsf STATUS,PR0 ; Prebacuje program u BANK1 bsf EECON1,RD ; Inicira proces čitanja

; EEPROM memorije

   bcf STATUS,RP0 ; Prebacuje program u BANK0 movf EEDATA,W ; Sadržaj bajta sa adrese 0x00 iz

; EEPROM memorije u W

; ****** Inicijalizacija brojača i LED displeja ****** movwf DISP ; Inicijalizacija brojačacall Tabl ; Uzmi obrazac iz tabele i

 movwf PORTB ; Prikaži cifru na displeju

; ****** Snimanje u EEPROM ******Gla movf DISP,W ; DISP u W

 movwf EEDATA ; pa u EEDATA movlw 0x00 ; na adresu movwf EEADR ; 0x00 bsf STATUS,RP0 ; Prebacuje nas u BANK1 zbog EECON1 bsf EECON1,WREN ; Dozvola pisanja u EEPROM movlw 0x55 ; movwf EECON2 ; movlw 0xAA ; Otključavanje upisa u EEPROM movwf EECON2 ; bsf EECON1,WR ;

Kraj btfss EECON1,WR ; Test završetka snimanjagoto Kraj

; U ovom trenutku snimanje je završeno pa se interapt flag setuje i nastaje interapt. Uinterapt rutini čekaće se na pritisak prekidača, smanjiće se vrednost na displeju i tek onda će se izaći iz nje i nastaviti dalji program.

 bcf EECON1,WREN ; Zabrana pisanja u EEPROM bcf STATUS,RP0 ; Povratak u BANK0goto

Gla; Povratak na početak programa

; ****** Tabela ******Tabl movf DISP,W ; U promenljivoj DISP nalazi se vrednost od

addwf PCL,f ; .0 do .9. Ta vrednost se dodaje na PCL.retlw b'01111110' ; Obrazac za crtanje cifre 0 - 0

retlw b'00001100' ; Obrazac za crtanje cifre 1 - 1

retlw b'10110110' ; Obrazac za crtanje cifre 2 - 2

retlw b'10011110' ; Obrazac za crtanje cifre 3 - 3

retlw b'11001100' ; Obrazac za crtanje cifre 4 - 4

retlw b'11011010' ; Obrazac za crtanje cifre 5 - 5

retlw b'11111010' ; Obrazac za crtanje cifre 6 - 6

80

Page 81: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 81/209

retlw b'00001110' ; Obrazac za crtanje cifre 7 - 7

retlw b'11111110' ; Obrazac za crtanje cifre 8 - 8

retlw b'11011110' ; Obrazac za crtanje cifre 9 - 9

; ****** Pauza zbog debouncing rutine ******Pau decfsz BROJAC,F ; Pauza zbog debouncing

goto Pau ; rutinereturn ; Povratak iz potprograma

; ****** Kraj programa ******end ; Kraj programa

Prilikom snimanja kôda u PIC16F84 mora se sadržaj memorijske adrese 0x00 uEEPROM memoriji podesiti na proizvoljan broj između 0x00 i 0x09. U protivnom ćemikrokontroler uzeti inicijalno stanje iz EEPROM memorije (0xFF) i pri nailasku natabelu izvršavanje programa će se nastaviti za 245 bajtova iza same tabele, što ćeizazvati nepravilan rad (tačnije resetovanje) mikrokontrolera. To je u programuučinjeno upotrebom DE (eng. Define EEPROM) direktive. Njom se jedan (ili više)

 bajtova smeštaju u EEPROM. Budući da je za nju potrebno prethodno definisati početak upisa u EEPROM memoriju (org direktivom i adresama od 21x00 do 21x3h),najpraktičnije je staviti je ispred ili iza programa, kako se ne bi desilo da se i programgreškom upiše u EEPROM.

Pri smeštanju više bajtova u EEPROM, možete bajt po bajt iza DE direktive odvojitizarezom, ovako: de 0x05, 0xA8, 0x79...

Iako izgleda da je EEPROM na neki način produžetak programske memorije, razlikasvakako postoji. U EEPROM memoriji nije moguće izvršavati programe, isto kao štose ni iz programa ne može čitati (a ni menjati) sadržaj programske memorije (bar kodPIC16 serije).

Možda ste primetili da u rutini za snimanje u EEPROM nije izvršena zabranakorišćenja svih interapta resetovanjem GIE bita. Ukoliko bi se interapti zabranili,

 program ne bi skočio na interapt rutinu, i neprestano bi se vrteo u petlji snimajući jedan isti bajt u EEPROM adresu 0x00. Ukoliko bi se ovo dovoljno dugo ponavljalo,ova EEPROM adresa bi se usled starenja pokvarila (kao ogrebotina na DVD disku).Jedna EEPROM memorijska lokacija može se menjati do 1 milion puta. Sve prekoove vrednosti povećava verovatnoću nastupa kvara adrese.

 Naravno, ukoliko se koristi više izvora interapta, ostali bi se morali privremenozabraniti.

Budući da ćete se u idućem poglavlju upoznati sa uspavanim stanjemmikrokontrolera, vreme je da naučite jednu lenju instrukciju. To je NOP (eng. NoOperation). Ova instrukcija, osim što traje jedan instrukcijski ciklus ne radi ništakorisno. Kada program mikrokontrolera naiđe na nju, utrošiće jedan instrukcijskiciklus nizašta. Preći će preko nje, kao da je nema. Uglavnom se koristi u situacijamakada je potrebno realizovati tačno određeno, ili kratko kašnjenje (npr. u petljamakašnjenja ili debouncing rutini).

81

Page 82: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 82/209

26. Sleep mod - pojam

Pretpostavimo da želite napraviti hidroelektranu. Da biste proverili da li reka imadovoljan protok vode tokom cele godine, odlučili ste da merite njen nivomikrokontrolerom, i da prikupljene podatke povremeno (po popuni EEPROMmemorije) prebacujete u laptop. Kako na reci nema električne mreže, mikrokontroler se napaja iz akumulatora. Negativni pol akumulatora (masa) spojen je sa rekom, aočitavanje nivoa vode se vrši interaptom pri promeni stanja na pinovima RB4 do RB7,koji su povezani sa odgovarajućim sondama na po 5cm dubine. Kada je nivo vodeispod najniže sonde, na svim pinovima je logička 1 (uključeni su interni pull upotpornici). Kada je nivo vode iznad najvišlje, voda se ponaša kao provodnik izmeđumase i sondi, tako da je na svim pinovima logička 0. Mikrokontroler je povezan sadigitalnim časovnikom i dodatnom EEPROM memorijom, koji mu omogućavajumemorisanje tačnog trenutka rasta ili opadanja nivoa vode.

Očigledno je da u aktivnom stanju mikrokontroler radi samo povremeno (u trenutku povećanja ili smanjenja nivoa vode), i veoma kratko (vreme potrebno za čitanjetačnog vremena iz sata, i upis vremena i nivoa vode u EEPROM memoriju). Kako ćetokom 24h najverovatnije nastupiti jedan period plime i oseke, to iznosi samo oko 8merenja dnevno. Preostalo vreme mikrokontroler će se vrteti u praznoj petlji čekajućina interapt, i bespotrebno trošeći struju iz akumulatora.

SLEEP „spavajući“ mod predstavlja stanje u kojem se mikrokontroler nalazi u režimusmanjene potrošnje energije. U SLEEP modu blokira se rad glavnog oscilatora.Instrukcije se prestaju izvršavati, tajmer prestaje sa radom, a WDT se (ukoliko jeuključen) resetuje (ali nastavlja sa radom zbog sopstvenog oscilatora). Portovi

zadržavaju svoja stanja (izlaz – 0, izlaz – 1 ili ulaz – stanje visoke impedanse). Zanajmanju moguću potrošnju potrebno je projektovati spoljna elektronska kola tako dane vuku struju iz izlaznih pinova portova, i da ulazne pinove postave na stabilanlogički nivo (0 ili 1). RA4/T0CKI pin bi takođe trebao biti na stabilnom nivou (ne bismeo biti izlazni sa logičkom 1 jer je ne može dati).

 Napon napajanja mikrokontrolera može se spustiti i do 1,5V bez gubitka podataka.Potrošnja mikrokontrolera pada sa oko 2mA na oko 5 μ A .

Ukoliko Vam je potrošnja struje izuzetno bitna, možete kupiti verzujumikrokontrolera specijalno napravljenu za rad sa što manjom potrošnjom struje.

U SLEEP mod ulazi se SLEEP instrukcijom, a iz njega se mikrokontroler može„probuditi“ na tri načina.

1. Dovođenjem logičke nule na MCLR pin mikrokontrolera, što prouzrokujereset mikrokontrolera. Više o resetu, u idućim poglavljima.

2. Resetom preko isteka vremena WDT.

3. Interaptom na RB0/INT pinu, interaptom pri promeni stanja na PORTBregistru, bitovima 4 do 7, ili interaptom izazvanim završetkom upisa u

EEPROM.

82

Page 83: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 83/209

Interapt izazvan tajmerom ne može se koristiti za buđenje iz SLEEP moda, jer je uSLEEP modu i tajmer uspavan.

Ulaskom u SLEEP mod, menja se stanje određenih bitova STATUS registra. Vreme jeda napokon proučite i njegovu unutrašnju strukturu.

bit7 bit0/ / RP0 TO PD Z DC C

● Bitovi 7 i 6 ne koriste se u PIC16F84. Trebaju biti u stanju logičke 0.

● Bit 5 (RP0) koristi se kod direktnog adresiranja za izbor banke podataka posledećem :0 - BANK0 – 0x00-0x7F1 - BANK1 – 0x80-0xFF

● TO (eng. Time-Out) „prekoračenje vremena“ bit je na stanju logičke 0 nakonisteka WDT, a u stanju logičke 1 po dolasku napona napajanja, i izvršenjuCLRWDT ili SLEEP instrukcije. Na osnovu stanja ovog bita program možedetektovati da je reset mikrokontrolera nastao usled prekoračenja WDT.

● PD (eng. Power-Down) bit postavlja se na 1 po dolasku napona napajanja iliizvršenju CLRWDT instrukcije, a na 0 po izvršenju SLEEP instrukcije.

● Logička jedinica na Zero “nultom” bitu pokazuje da je rezultat zadnjearitmetičke ili logičke operacije jednak 0. Logička nula na ovom bitu ukazujeda je rezultat različit od 0.

● DC (eng. Digit Carry/borrow) bit „bit prekoračenja/pozajmice cifre“ indikuje prekoračenje ili pozajmicu donjem niblu nastalu zbog izvršavanja instrukcijasabiranja ili oduzimanja.

● Logička jedinica na C (eng. Carry/borrow) bitu „bitu prekoračenja/pozajmice“ukazuje da je došlo do prekoračenja ili pozajmice u bajtu nad kojim su seizvršile operacije sabiranja, oduzimanja ili rotacije.

 Kao što vidite iz samog STATUS registra, izvršenje SLEEP instrukcije prouzrokujeresetovanje PD bita i setovanje TO bita.

Možda vam čudno izgleda buđenje iz SLEEP moda istekom WDT. On se umikrokontroleru koristi za povremeno buđenje iz SLEEP moda, obavljanje određeneoperacije, i ponovni ulazak u SLEEP mod. Tako mikrokontroler može povremenoizvršiti poneku operaciju, a opet će većinu vremena provesti spavajući (i trošeći manjestruje). Kako istek WDT prouzrokuje softverski reset mikrokontrolera program mora

 po resetu testirati TO bit, i na osnovu njegovog stanja zaključiti da li se radi o prvomuključenju mikrokontrolera, ili o prekidu nastalom istekom WDT, kako bi se mogaonastaviti započeti program.

U praksi se mnogo češće sreće buđenje interaptima. U sledećem poglavlju upoznaćete

se sa specifičnostima upotrebe interapta u SLEEP modu.

83

Page 84: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 84/209

27. Buđenje iz Sleep moda

Buđenje iz SLEEP moda interaptima razlikuje se od običnih interapta po tome što jemoguće da se umesto skoka na interapt rutinu, izvršavanje programa nastavi izaSLEEP instrukcije. Naime, ukoliko je u SLEEP modu GIE setovan, pri interaptu će semikrokontroler probuditi i skočiti na interapt rutinu, kao u običnom programu. Ali,ukoliko je GIE resetovan, pri interaptu (dozvoljenim odgovarajućim interapt flagom)će se probuditi i nastaviti dalje izvršenje programa, bez skoka na interapt rutinu.

U zavisnosti od trenutka sticanja uslova za pojavu interapta moguće je da se interaptdogodi neposredno pre SLEEP instrukcije. U tom slučaju, SLEEP instrukcija se nećeizvršiti, pa neće biti resetovan WDT i njegov preskaler, resetovan PD bit i setovan TO

 bit. Zbog toga je potrebno ručno resetovati WDT (ukoliko se koristi) neposredno preSLEEP instrukcije. U slučaju da je potrebno saznati da li se izvršila SLEEPinstrukcija, to se može proveriti testiranjem PD bita STATUS registra.

Sada ćete se upoznati sa programom koji ilustruje upotrebu SLEEP moda i buđenje iznjega na oba načina (sa setovanim i resetovanim GIE). Program se sastoji iz dva dela.U prvom delu, program ulazi u SLEEP mod, i od korisnika se zahteva da postavikombinaciju tastera T1 do T4. Prilikom svake promene stanja tastera izaziva seinterapt (tasteri su povezani na pinove RB4 do RB7) i odabrana kombinacija se

 prikazuje na LED displeju u heksadecimalnom formatu. Nakon postavljenog željenog broja pritisne se T5 izazivajući novi interapt (RB0). Stanje postavljeno na displejusnima se u memoriju mikrokontrolera primenom indirektnog adresiranja. Postupak se

 ponavlja sve dok se ne snimi 5 kombinacija. U drugom delu, mikrokontroler se ponovo uspavljuje ali tako da interapt prouzrokuje njegovo buđenje i nastavak 

 programa bez skoka na interapt rutinu. Po izazivanju interapta (T5) snimljenekombinacije se čitaju i prikazuju na displeju sa uključenom decimalnom tačkom(segment dp na displeju). Nakon 5 prikazanih kombinacija, program se ponavlja iz

 početka.

Kako je zbog interapta i internih pull up otpornika potrebno da prekidači budu na portu B, slika će se na displeju prikazivati kombinacijom pinova PORTA i PORTBregistra (tačnije pinovima RA0 do RA4 i RB1 do RB3).

; ****** Inicijalizacija i imenovanje ******list p=16F84 ; Definiše upotrebljeni mikrokontroler 

#include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; Podešava konfiguracione bitovecblock 0x0C

TEMPW ; Promenljiva za W registar TEMPSTATUS ; Promenljiva za STATUS registar TEMP ; Promenljiva za rotaciju

endc; .32 – .36 RAM memorija za snimanje stanja prekidača

org 0x00 ; Ovde PC dolazi pri uključenju i resetugoto Main ; Odlazak na glavni program

84

Page 85: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 85/209

; ****** Interapt rutina za prvi deo programa – normalne interapte ******org 0x04 ; Ovde će početi interapt rutina movwf TEMPW ; Čuvanje sadržaja W registra u TEMPWswapf STATUS,W ; STATUS sa okrenutim niblovima u W

 movwf TEMPSTATUS ; i zatim u TEMPSTATUS registar 

swapf PORTB,W ; Uzmi stanje sa porta i zameni stanje niblova.andlw b'00001111' ; Maskiraj neželjene bitove

; ****** Test interapta izazvanog prekidačem ****** btfss INTCON,INTF ; Interapt izazvan prekidačem T5?goto T14 ; Nije, idi na deo za prekidače T1 do T4.

; ****** Interapti izazvani prekidačem T5 ****** movwf INDF ; Indirektno snimanje u željeni registar incf FSR,F ; Pozicioniranje pointera na sledeći registar call Vrat ; Vrati sadržaj W i STATUS registra

 bcf INTCON,INTF ; Obriši interapt flag prekidača T5retfie ; Vrati se iz interapt potprograma

; ****** Interapti izazvani prekidačima T1 do T4 ******

call Tabl ; Uzmi sliku za displej iz tabele.

85

Page 86: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 86/209

call Nacr ; Nacrtaj sliku.call Vrat ; Vrati sadržaj W i STATUS registra

 bcf INTCON,RBIF ; Obriši interapt flag prekidača T1 do T4retfie ; Vrati se iz interapt potprograma

Vrat swapf TEMPSTATUS,W ; TEMPSTATUS sa okrenutim niblovima

; u W. Dva puta okrenuti niblovi daju movwf STATUS ; prvobitno stanje koje ide u STATUSswapf TEMPW,F ; Jednom okreni niblove u samom

; TEMPW registru,swapf TEMPW,W ; a drugi put sa W kao odredištem.return ; Povratak iz potprograma.

; ****** Tabela ******Tabl addwf PCL,F ; Vrednost u W od b'00000000' do b'00001111'

; (0x00 do 0x0F) se dodaje na PCL

; bez decimalne tačkeretlw b'00011000' ; Obrazac za crtanje cifre 0 - 0

retlw b'00111111' ; Obrazac za crtanje cifre 1 - 1

retlw b'10010100' ; Obrazac za crtanje cifre 2 - 2

retlw b'00010110' ; Obrazac za crtanje cifre 3 - 3

retlw b'00110011' ; Obrazac za crtanje cifre 4 - 4

retlw b'01010010' ; Obrazac za crtanje cifre 5 - 5

retlw b'01010000' ; Obrazac za crtanje cifre 6 - 6

retlw b'00011111' ; Obrazac za crtanje cifre 7 - 7

retlw b'00010000' ; Obrazac za crtanje cifre 8 - 8

retlw b'00010010' ; Obrazac za crtanje cifre 9 - 9

retlw b'00010001' ; Obrazac za crtanje cifre A- Aretlw b'01110000' ; Obrazac za crtanje cifre B - Bretlw b'11010000' ; Obrazac za crtanje cifre C - Cretlw b'00110100' ; Obrazac za crtanje cifre D - Dretlw b'11010000' ; Obrazac za crtanje cifre E - Eretlw b'11010001' ; Obrazac za crtanje cifre F - F

; ****** Potprogram za crtanje slike na displeju ******Nacr movwf PORTA ; Pošalji u PORTA bitove RA0 do RA4

 movwf TEMP ; Pošalji u TEMP registar zbog zamene niblova

swapf TEMP,W ; Zameni mesta niblovima tako da RB1 bit dodje; na mesto bita 1 (isto se moglo realizovati; i sa 4 RRF instrukcije)

 movwf PORTB ; Pošalji u PORTB bitove RB1 do RB3return ; Povratak iz potprograma.

; ****** Glavni program – inicijalizacija ******Main bsf STATUS,RP0 ; Prebacuje program u BANK1

 movlw b'11110001' ; pinovi RB0 i RB4 do RB7 ulazni, movwf TRISB ; a RB1, RB2 i RB3 izlazni.clrf TRISA ; Svi pinovi porta A izlazni

 movlw b'00000000' ; INTEDG=0 - Interapt se izaziva pri

86

Page 87: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 87/209

; opadajućoj ivici signala (sa 1 na 0); NOT_RBPU=0 - Uključeni interni

 movwf OPTION_REG ; pull up otpornici na PORTB bcf STATUS,RP0 ; Povratak u BANK0

Opet movlw .32 ; Inicijalizacija pointera RAM memorije

 movwf FSR ; na registar .32

; ******* Postavi sliku na displeju pre uključenja interapta ******swapf PORTB,W ; Uzmi stanje sa porta i zameni stanje niblova.andlw b'00001111' ; Maskiraj neželjene bitovecall Tabl ; Uzmi sliku za displej iz tabele.call Nacr ; Nacrtaj sliku.

; ****** Uključi interapte ******   bsf STATUS,RP0 ; Prebacuje program u BANK1

 movlw b'10011000' ; GIE – Global interrupt enable (1 – uključi); INTE – RB0 Interrupt enable (1 – uključi); RBIE – RB Interrupt enable (1 – uključi); INTF – Interapt flag za T5 (0 – obriši)

 movwf INTCON ; RBIF – Interapt flag za T1-T4 (0 – obriši) bcf STATUS,RP0 ; Povratak u BANK0

; ****** Prvi deo programa – setovan GIE, normalni interapti ******Poc sleep ; Uključi SLEEP mod

; U ovom trenutku program se vratio iz interapt rutine. Sada je potrebno proveriti da li

; je snimljeno svih 5 vrednosti. Međutim, bolje je ovde proveriti vrednost FSR ; registra sabiranjem, jer je moguće da se (npr. usled debouncinga na T5) izazove više; uzastopnih interapta i tako snime vrednosti u još par narednih RAM adresa. Čak i; da se to dogodi, testom Carry flaga može se detektovati taj slučaj za razliku od; testa Zero flaga.

 movf FSR,W ; FSR u Waddlw .219 ; Test prekoračenja. FSR treba biti od .32 do .36

 btfss STATUS,C ; .37 i više + .219 = setovan Carrygoto Poc ; Još nema prekoračenja. Spavaj i dalje.

; U ovom trenutku snimljeno je svih 5 vrednosti u RAM adrese od .32 do .36; Sada se treba zabraniti odlazak na interapt potprogram.

Zabr bcf INTCON,GIE ; Jeste. Zabrani nove interapre btfsc INTCON,GIE ; Proveri jesu li interapti zaista zabranjenigoto Zabr ; Nisu, zabrani ih opet.

; ** Drugi deo programa – resetovan GIE, interaptima se nastavlja glavni program ** movlw 0xFF ; movwf PORTA ; Obriši LED displej (segmenti na PORTA). movwf

PORTB; Obriši LED displej (segmenti na PORTB)

87

Page 88: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 88/209

 bcf PORTA,4 ; Uključi segment decimalne tačke. movlw .32 ; Inicijalizacija pointera RAM memorije movwf FSR ; na registar .32

; ****** Zabrani buđenje iz sleep moda prekidačima T1 do T4 ******   bsf STATUS,RP0 ; Prebacuje program u BANK1

 movlw b'00010000' ; GIE – Global interrupt enable (0 – isključi); INTE – RB0 Interrupt enable (1 – uključi); RBIE – RB Interrupt enable (0 – isključi); INTF – Interapt flag za T5 (0 – obriši)

 movwf INTCON ; RBIF – Interapt flag za T1-T4 (0 – obriši) bcf STATUS,RP0 ; Povratak u BANK0

; ****** Ponovo uspavaj mikrokontroler ******Spa sleep ; Uspavaj mikrokontroler do pojave interapta.

; Po njegovoj pojavi, nastavi program bez skoka; na interapt potprogram

nop ; Utroši jedan instrukcijski ciklus; Preporučljivo nakon buđenja

; U ovom trenutku pritisnut je prekidač T5.

 movf INDF,W ; Indirektno čitanje željenog registracall Tabl ; Uzmi sliku za displej iz tabele.call Nacr ; Nacrtaj sliku.

 bcf PORTA,4 ; Uključi segment decimalne tačke.

incf FSR,F ; Pozicioniranje pointera na sledeći registar 

; Test prekoračenja je isti kao i ranije, iako bi sada slobodno mogao biti sa XOR ; operacijom

 movf FSR,W ; FSR u Waddlw .219 ; Test prekoračenja. FSR treba biti od .32 do .36

 btfss STATUS,C ; .37 i više + .219 = setovan Carrygoto Spa ; Još nema prekoračenja. Spavaj i dalje.goto Opet ; Ima prekoračenja. Počni program iz početka.

; ****** Kraj programa ******end ; Kraj programa

U Sleep modu oscilator je nestabilan prilikom buđenja. Naime, pošto je oscilator zavreme spavanja blokiran, nije mu baš lako da odjednom počne proizvoditi čistetaktove. Buđenje neće biti moguće dok se oscilator ne stabilizuje. Zato se prikorišćenju SLEEP moda ne može vršiti merenje vremena brojanjem instrukcijskihciklusa instrukcija u programu, čak iako se buđenje interaptom dešava tačno određenovreme nakon ulaska u Sleep mod. Kako RC oscilator najlakše počinje sa oscilacijama,vreme za njegovu stabilizaciju je skoro trenutno, dok je kod upotrebe ostalih vrstaoscilatora potrebno 1024 takta oscilatora za kompletnu stabilizaciju. Sve dok sestabilizacija takta ne završi, mikrokontroler se neće moći probuditi iz SLEEP moda.

88

Page 89: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 89/209

28. Brojač

Kako možete brojali spoljne signale? Jedan od mogućih načina predstavlja neprekidnotestiranje pina na logičku 0 pa na logičku 1 iz glavnog programa (eng. pooling).Očigledno je da bi ovakaj princip brojanja zauzeo najviše resursa mikrokontrolera.Drugi način je interaptima. Njima je mikrokontroleru ostavljeno dovoljno vremena zaglavni program, a ipak može pravovremeno odgovoriti na spoljne impulse.

U praksi se često javlja potreba za brojanjem većih vrednosti, pri čemu se rezolucija brojača zaokružuje na dovoljan broj decimala. Da li Vam je toliko bitna razlika u brzini od 0,0025km/h ukoliko već vozite biciklu preko 30km/h? Teško da će bitiukoliko ne idete na „Tour de France“ (poznata biciklistička trka u Francuskoj).

Dakle, kako brojati sa zaokruženjem? Potrebno je podesiti tajmer tako da umestoinstrukcijskih ciklusa broji impulse sa RA4/T0CKI pina, setovanjem T0CS bita

OPTION_REG registra. U slučaju odnosa preskalera 1:1, trajanje logičke 0 i 1eksternog takta mora biti duže od 3 takta oscilatora PIC16F84 (tačnije oko 2 takta +20nS), a u slučaju bilo kog drugog odnosa duže od 5 takova (tačnije 4 takta + 40nS).

Osim promene izvora takta tajmera, sve je ostalo isto. Preskaler se podešava kao kodtajmera, interapt se izaziva kao kod tajmera, čak se i upisivanjem u TMR0 registar inicijalizuje tajmer i preskaler. Na taj način Timer0 ima funkciju brojača (eng.Counter).

Šta se dobija upotrebom ovakvog brojača? Umesto da se interapt izaziva prilikomsvakog impulsa, izazivaće se tek prilikom prekoračenja brojača. Za odnos preskalera

od 1:1 to znači da će se interapt izazivati nakon svakog 255-og impulsa. Tako zaglavni program ostaje mnogo više resursa.

Ograničenjem minimalnog trajanja logičke 0 i logičke 1 ograničen je i maksimalnitakt koji može meriti mikrokontroler. Međutim, ovo se može efikasno rešitikorišćenjem eksternih integrisanih delitelja signala (npr. 74390 ili 4040), koji dodatnohardverski dele ulazni signal.

Ovde su moćniji mikrokontroleri u prednosti zbog postojanja više tajmera. Na primer, jedan bi se iskoristio za brojanje eksternih impulsa, a drugi za to vreme možegenerisati stabilnu vremensku bazu. Poređenjem ove dve vrednosti može se lako

dobiti frekvencija eksternog signala.

Za više detalja pogledajte AN689 Voje Antonića i AN592.

89

Page 90: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 90/209

29. Reset

 Najjednostavnije rečeno, reset služi da izvršavanje programa počne iz početka.

PIC16F84 ima 3 izvora reseta. Prvi je svakako reset prilikom dovođenja naponanapajanja (eng. POR –  Power-on R eset). Unutar mikrokontrolera nalazi se maloelektrično kolo koje detektuje porast napona napajanja do napona dovoljnog za radmikrokontrolera. U trenutku dostizanja nominalnog napona, mikrokontroler seresetuje. Ovim se sprečava rad mikrokontrolera pri preniskom naponu napajanja.Ukoliko je potrebno, može se uključiti PWRTE (eng. Power-up Timer  Enable)konfiguracioni bit koji drži mikrokontroler u stanju reseta oko 72mS od dovođenjanapona napajanja. Ovo kašnjenje realizovano je internim RC oscilatorom nezavisnimod takta oscilatora. To je dovoljno da se napon napajanja podigne na nominalnuvrednost i da oscilator mikrokontrolera počne proizvoditi čiste neprigušene oscilacije.

 Nakon što se ovo kašnjenje završi, mikrokontroler (za svaki slučaj) čeka još 1024

takta oscilatora pre nego što počne izvršavati program.

Drugi izvor reseta je MCLR pin mikrokontrolera. On mora uvek biti držan na logičkoj jedinici. Obično se to realizuje povezivanjem sa naponom napajanja preko otpornikaod 10kΩ. U šemama u ovom uputstvu on je spojen direktno zbog veće preglednostišeme, i jer se ne koristi. Pri dovođenju logičke 0 na ovaj pin (spajanje sa masom),mikrokontroler se resetuje. Za svaki slučaj u ulaznom stepenu ovog pina postavljen jeŠmitov okidač koji ima ulogu filtriranja slabih impulsa, koji bi mogli prouzrokovatinehotični reset mikrokontrolera.

Poslednji izvor reseta naučili ste u delu sa WDT. Možete izvršiti softverski reset

namernim izostavljanjem CLRWDT instrukcije u željenom delu programa.

Iako reset prvenstveno služi za ponovni start programa, testiranjem stanja TO i PD bitova STATUS registra, moguće je utvrditi na koji način je izazvan reset, i na osnovutoga nastaviti rad programa.

TO PD Stanje

1 1 Stanje nakon izvršenja CLRWDT instrukcije

1 0 Stanje nakon izvršenja SLEEP instrukcije

0 0 WDT reset za vreme SLEEP moda

0 1 WDT reset za vreme normalnog izvršavanja programa

1 0 MCLR reset za vreme SLEEP moda ili buđenje interaptom

1 1 MCLR reset za vreme normalnog izvršavanja programa

1 1 POR reset pri dolasku napona napajanja

U prilogu ovog uputstva možete videti inicijalno stanje svih registara nakon reseta.

90

Page 91: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 91/209

30. Srce mikrokontrolera

Isto kao što Vaše srce pumpa krv određenim ritmom, mikrokontroler za svoj pravilanrad mora imati tačno podešene taktne impulse. Oni se dobijaju iz oscilatora. U ovom

 poglavlju biće prikazane šeme hardverskog povezivanja raznih vrsta oscilatora, i biće bliže objašnjene njihove specifičnosti.

 Najjeftiniji je svakako RC oscilator, korišćenu dosadašnjim šemama. Sastoji se samo odkondenzatora i otpornika. U tablici su datevrednosti otpornosti i kapacitivnosti zadobijanje željenih frekvencija.

Frekv.

(Khz)

 Kapac.

(pF)

Otpornost 

(kΩ)

26 300 100

83 100 100

243 300 10

311 20 100

428 300 5

756 100 10

1340 100 5

3500 33 5

2660 20 10

4610 20 5

Ovaj tip oscilatora može se koristiti za pun opseg frekvencija mikrokontrolera (DC do4MHz, odnosno do 20MHz za brže verzije PIC16F84 mikrokontrolera). Mana mu jeloša stabilnost frekvencije i „šetanje“ frekvencije usled promene temperature.Preporučene vrednosti otpornosti su od 3kΩ do 100kΩ, a kapacitivnosti preko 20pF.Gornja granica kapacitivnosti zavisi isključivo od željene maksimalne frekvencije. Štose tiče mikrokontrolera, on će bez problema raditi čak i sa taktom oscilatora manjimod 1Hz. Kao lenjivac.

U nekim PIC mikrokontrolerima (nažalost ne u PIC16F84) nalazi se integrisanihardverski RC oscilator. Zbog preciznijeg takta, Microchip kalibracioni niz snima udeo programske memorije. Kasnije se ovaj niz može pročitati i softverski podesiti.

 Na OSC2 pinu pri radu RC oscilatora dobija se četvrtina takta oscilatora, što se može

iskoristiti za sinhronizaciju dodatnih eksternih uređaja sa mikrokontrolerom. USLEEP modu oscilator se blokira, pa ni ovaj signal više nije dostupan.

Iako je oscilator mikrokontrolera nezavistan od ostatka hardvera, moguće je primenjujući male softversko hardverske trikove indirektno uticati na njegovufrekvenciju. Dovoljno je npr. jednim pinom mikrokontrolera uključivati paralelno

 povezivanje otpornika u RC članu. Postavljanjem pina na logičku 0 ili 1, dodatniotpornik će se paralelno spojiti sa već postojećim otpornikom, smanjujući rezultujućuvrednost otpornosti. Tako se može grubo menjati frekvencija oscilatora. Ovaj principmože biti iskorišćen za smanjenje frekvencije oscilatora u periodima kadamikrokontroleru nije potrebna puna brzina čime bi se istovremeno smanjila potrošnja

mikrokontrolera. Međutim, zbog preporučenih vrednosti otpornosti (do 100kΩ) nije

91

Page 92: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 92/209

 preporučljivo ovim načinom menjati frekvenciju u većim opsezima. Zbog toga semože umesto samo otpornika uključivati dodatni RC član. Više o ovom principuimate na sajtu http://www.romanblack.com/ u delu PIC with 2 clock speeds!

Ukoliko je potrebno rad mikrokontrolera sinhronizovati saeksternim uređajima, može mu se spolja obezbediti spoljni

takt. Konfiguracioni bitovi trebaju u tom slučaju biti podešeni na LP, XT ili HS.

OSC2 pin je poželjno povezati na masu mikrokontrolera preko otpornika veće vrednosti (10kΩ), zbog smanjenjainterferencije, iako to povećava potrošnju mikrokontrolera.

Ukoliko nije potrebna velika brzina izvršavanja instrukcija, a bitna je potrošnja istabilnost frekvencije, (npr. sat na baterije) PIC treba raditi sa 32KHz-200KHzkristalom. Na manjem taktu zbog manjeg pojačanja integrisanog oscilatornog kolaPIC troši manje struje nego inače. Za ovakvu vrstu oscilatora treba podesiti

konfiguracioni bit oscilatora na – OSC LP.

Ukoliko je bitna stabilna frekvencija a i cena PIC16f84, dobar izbor bi bio kristalnioscilator do 4MHz. Za njega je potrebno konfiguracioni bit podesiti kao - OSC XT.

A ukoliko je brzina imperativ, mogu se kupiti verzije PIC16F84 mikrokontrolera kojemogu bez problema raditi na taktu većem od 4MHz. Nažalost, one su i skuplje.

 Njihov konfiguracioni bit potrebno je podesiti kao – OSC HS. U ovom modu zbognajvećeg pojačanja integrisanog oscilatornog kola PIC16F84 troši najviše električneenergije.

Za ova 3 načina sa kristalnim oscilatorom primenjuje se sledeća šema:

Otpornik je potreban samo za retke tipovekristala. U najvećem broju slučajeva može seizostaviti. HS mod mogu koristiti jedinotipovi PIC16F84 mikrokontrolera predviđeniza rad na visokim frekvencijama.

Frekv.

(Khz)

 Kapac.

(pF)

 Konfig.

bitovi 

32 68-100 LP

200 15-30 LP

100 68-150 XT

455 22-100 XT

2000 15-68 XT4000 15-68 XT

8000 10-68 HS

16000 10-22 HS

20000 5-10 HS

Dizajn internog oscilatora zahteva upotrebu paralelno rezanog kristala. Međutim, iredno rezani kristali mogu se koristiti kao izvor takta, ali jedino uz eksternooscilatorno kolo. Njihova upotreba u šemi kristalnog oscilatora dovešće do

frekvencije koja odstupa od specifikacija u karakteristikama proizvođača kristala.

92

Page 93: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 93/209

Ukoliko želite imati izuzetno stabilnu frekvenciju možete umesto običnih koristitiOCXO (eng. Oven Controlled Xtal Oscillator) kristale koji u istom kućištu imajukristal, grejač i termostat. Za napajanje grejača potrebno je dovesti spoljni izvor napajanja koji nažalost dodatno povećava potrošnju kola. Grejačem i termostatomreguliše se konstantna temperatura kristala iznad sobne temperature, tako da jetemperaturni drift frekvencije kristala minimalan.

Kako su takvi kristali (i takva kućišta) dosta skuplji od običnih, možete ih saminapraviti sledeći uputstva sa sajta  http://www.romanblack.com/ u delu Simple xtaloven for accurate clocks.

Keramički oscilator obično je zajedno sa kondenzatorimaspakovan u zajedničko tropinsko kućište. Takvi elementinazivaju se keramički rezonatori.

Veća kapacitivnost kondenzatora povećava stabilnostoscilatora, ali takođe povećava i vreme potrebno za

stabilizaciju oscilatornog kola pri uključenju mikrokontroleraili buđenju iz SLEEP moda.

U principu, ova 3 stanja konfiguracionih bitova (LP, XT i HS) razlikuju se jedino u pojačanju internog invertora oscilatornog kola što omogućava različit opsegfrekvencija. Ukoliko Vam se desi da neki kristal ne može proraditi u jednom modu,

 probajte promeniti konfiguracione bitove oscilatora. Najbolje je koristiti oscilator sanajmanjim mogućim pojačanjem, uz uslov da se njime može postići željena brzinaoscilatora.

Za detalje o tipovima oscilatora, pogledajte AN588 sa http://www.microchip.com/.

Čestitam! Sada znate funkcije svih pinova mikrokontrolera, upotrebu svih 35instrukcija i svih 15 registara. Međutim, tek ste počeli sa učenjem.

Skoro svaki softverski problem može se rešiti na više načina. Ukoliko želite da seodređeni deo programa izvršava 5 puta, potrebno brojanje možete implementovatisabiranjem, oduzimanjem, inkrementacijom, dekrementacijom pa čak i rotacijom. Usledećim poglavljima upoznaćete se sa najčešće korišćenim softversko hardverskimtehnikama za realizaciju određenih zadataka.

93

Page 94: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 94/209

31. MPASM direktive i makroi

Ranije ste naučili par najkorišćenijih mogućnosti MPLAB asemblera. One su dovoljneza analizu bilo kog asemblerskog (pa čak i disasembliranog) programa. U ovom

 poglavlju naučićete par asemblerskih specifičnosti kojim će Vaš program biti čitljivijii kojim ćete smanjiti mogućnost pojave grešaka prilikom njegovog pisanja.

Da li Vam je zamoran prelazak iz banke u banku? Ko bi pamtio treba li se RP0 bitsetovati ili resetovati! Ne morate. Koristite banksel direktivu. Dovoljno je iza njenavesti naziv registra kome pristupate, i ona će na svom mestu ubaciti odgovarajućuinstrukciju prelaska (bcf STATUS,RP0 ili bsf STATUS,RP0).

Već znate kako deluje equ direktiva. Pretpostavimo da ste imenu PAUZA pridružilidecimalnu vrednost 100. Unutar potprograma tu vrednost koristite kao brojmilisekundi. Pretpostavimo da vam u programu zatreba pauza duplo dužeg trajanja.

Umesto imenovanja još jednog broja, možete napisati sledeće: movlw PAUZA * 2 ; PAUZA * 2 = .200call Cekaj ; Idi na potprogram

 Na isti način za duplo kraću pauzu možete napisati:

 movlw PAUZA / 2 ; PAUZA / 2 = .50call Cekaj ; Idi na potprogram

Asembler u oba slučaja za vreme asembliranja računa vrednosti koje se trebaju naći na

određenim mestima. One u svakom slučaju moraju biti poznate pre računanja. Nekeod aritmetičkih operacija koje može izvršiti asembler su sledeće:

 – - negacija (po drugom komplementu) – * množenje – / deljenje – % moduo (ostatak pri deljenju) – + sabiranje – - oduzimanje

Željeni prioritet operacija može se definisati zagradama. Npr. (8-6)*5.Osim matematičkih, asembler može izračunati i vrednosti određenih logičkihoperacija. Na primer:

 – ~ komplement – << rotacija ulevo (bez Carry Flaga) – >> rotacija udesno (bez Carry Flaga) – & AND – ^ XOR  – | IOR 

I kod njih se prioriteti definišu zagradama. Npr. ~((BROJ1&BROJ2)^BROJ3).

94

Page 95: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 95/209

Prilikom ovakvih vrednosti morate biti sigurni da parametar ne može izaći izvandozvoljenih granica. Isto tako, morate obratiti pažnju na moguće zaokruživanje broja(na primer prilikom deljenja).Sledeća pogodnost koju pruža MPLAB asembler je zamena teksta. Ukoliko u

 programu imate ovakav deo:

TASTER equ 3 ; Taster je povezan na RA3 pin btfsc PORTA,TASTER ; Da li je taster pritisnut?goto Prit ; Jestegoto Otpu ; Nije

i dalje je potrebno pamtiti na kom je portu povezan taster. Zamenom dela teksta zatim nema potrebe.

#define TASTER PORTA,3 ; Zameni izraz; PORTA,3 rečju TASTER 

 btfsc TASTER ; Da li je taster pritisnut?goto Prit ; Jestegoto Otpu ; Nije

#define direktivom nije moguće zameniti veći deo koda (2 ili više instrukcija). Za tose koriste makroi. Čak je moguće u makro preneti određene parametre ranijedefinisane.

#define TASTER PORTA,3 ; Imenuje naziveTest macro port,pin ; Određuje ulazne parametre

extern Prit,Otpu ; Označava da su labele ili registri

; definisani izvan makroa btfsc port,pin ; Da li je taster pritisnut?goto Prit ; Jestegoto Otpu ; Nijeendm ; Direktiva za oznaku kraja makroa

Kad god je unutar programa potrebno na osnovu pritisnutog tastera otići na Prit iliOtpu delove, dovoljno je kasnije umesto gornjeg koda napisati samo oznaku labelemakroa i parametra „Test TASTER“. Kako je imenom TASTER zamenjena oznakaodgovarajućeg porta i pina, vrednosti port i pin unutar makroa uzeće ove vrednosti.

 Na taj način se u makro ubacuju željeni parametri.

Unutar makroa moguće je koristiti sve instrukcije kao i u glavnom programu.Međutim, kako se makro poziva iz spoljnog programa, poželjno je da labele i registriunutar makroa ne dođu u konflikt sa delovima programa izvan makroa. Zbog toga je

 potrebno unutar makroa definisati korišćene unutrašnje i spoljne labele i registre. Nataj način moguće je i unutar glavnog programa i unutar makroa imati labelu istognaziva. U makrou ona mora biti definisana kao interna, što znači da joj program spoljane može pristupiti. Labele definisane kao eksterne mogu se pozivati i iz makroa.

Za kompletno uputstvo o upotrebi makroa, direktiva i aritmetičko logičkih operacija pogledajte DS33014J sa http://www.microchip.com/.

95

Page 96: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 96/209

32. Komentari

 Na početku ovog uputstva, malo se pričalo o komentarima. U ovom poglavljuupoznaćete se sa modifikacijama zaglavlja tako da Vam bude prilagođenije, i sanačinima komentarisanja registara koji imaju bitove različitih funkcija.

Sećate se zaglavlja koje ste do sada koristili. Prepravite ga po sledećem:

;**********************************************************; Autor :; Datum :; Verzija :; Naslov :;; Opis hardvera :

; Opis softvera :; Potrebni fajlovi : p16F84.inc;

;**********************************************************

list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; CP - zaštita od čitanja; WDT - watchdog tajmer ; PWRTE - kašnjenje po uključivanju

; XT OSC - kristalni oscilator ; LP OSC - oscilator male potrošnje; HS OSC -  brzi oscilator ; RC OSC - otpornik i kondenzator 

; ****** Inicijalizacija registara ******cblock 0x0C

TEMPW ; Privremeno čuvanje W registraTEMPSTATUS ; Privremeno čuvanje STATUS registraSPORTA ; Shaddow registar za PORTASPORTB ; Shaddow registar za PORTB

endc

; ****** Inicijalizacija vrednosti u EEPROM memoriji ******org 21x00 ; Početak EEPROM memorije

; de 0x00 ; Inicijalizacija prvog bajta

; ****** Start programa ******ORG 0x00 ; Start programagoto Main ;

96

Page 97: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 97/209

; ****** Interapt potprogram ******ORG 0x04

 movwf TEMPW ; Čuvanje sadržaja W registraswapf STATUS,W ; STATUS sa okrenutim niblovima u W

 movwf TEMPSTATUS ; i zatim u TEMPSTATUS registar 

; Prostor za interapt potprogram.

Back bcf INTCON,T0IF ; Dozvoli nove interapte tajmera bcf INTCON,INTF ; Dozvoli nove interapte prekidača bcf INTCON,RBIF ; Dozvoli nove interapte po promeni stanja bcf INTCON,EEIF ; Dozvoli nove interapte EEPROM-a

swapf TEMPSTATUS,W ; TEMPSTATUS sa okrenutim niblovima; u W. Dva puta okrenuti niblovi daju

 movwf STATUS ; prvobitno stanje koje ide u STATUSswapf TEMPW,F ; Jednom okreni niblove u samom

; TEMPW registru,swapf TEMPW,W ; a drugi put sa W kao odredištem.retfie ; Povratak iz interapt rutine.

; ****** Početak programa ******Main

banksel TRISA ; BANK 1

 movlw b'00000000' ; movwf TRISA ; Konfigurisanje pinova movlw b'00000000' ; movwf TRISB ; Konfigurisanje pinova

 movlw b'00000000' ;; !!!!! +------ PS0-PS2 - 000=1:2 001=1:4...; !!!!+-------- PSA - 1=WDT 0=tajmer  ; !!!+--------- T0SE eksterni takt 1=\ 0=/; !!+---------- T0CS - 1= eksterni takt 0=takt tajmera; !+----------- INTEDG - 1=/ 0=\

; +------------ RBPU - 0=uklj. 1=isključeni otpornici movwf OPTION_REG ;

banksel PORTA ; BANK0

 movlw b'00000000' ; movwf PORTA ; Inicijalizacija stanja portova i movwf SPORTA ; Shaddow registara movlw b'00000000' ; movwf PORTB ;

 movwf SPORTB ;

97

Page 98: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 98/209

 movlw b'00000000' ;; !!!!!!!+----- RBIF – 0=obriši; !!!!!!+------ INTF – 0=obriši ; !!!!!+------- T0IF – 0=obriši ; !!!!+-------- RBIE – 1=uključi; !!!+--------- INTE – 1=uključi

; !!+---------- T0IE – 1=uključi; !+----------- EEIE – 1=uključi; +------------ GIE – 1=uključi

 movwf INTCON ;

Start

; Prostor za programe.

end ; Kraj programa

 Na ovaj način program je pregledniji nego ranije, razumljivije je značenje bitova uOPTION_REG i INTCON registru, a najčešće korišćeni registri su unapredinicijalizovani pravilnim redosledom, što smanjuje mogućnost nepravilneinicijalizacije. Delove koji se ne koriste lakše je odjednom obrisati, nego ih po potrebiiznova pisati za svaki novi program.

Po potrebi u zaglavlje se mogu dodati i najkorišćeniji delovi programa (npr. za pauzu,za korišćenje EEPROM memorije ili RS232 veze), ali je praktičnije odvojiti ih uzasebne celine u sklopu potprograma, na primer ovako:

;***********************************************; Tabela za ispis cifre na LED displeju; Mora se nalaziti u bloku od 256 bajtova.Tabl movf CIFRA,W  

addwf PCL,F  retlw b'01111110' ; 0retlw b'00001100' ; 1retlw b'10110110' ; 2retlw b'10011110' ; 3retlw b'11001100' ; 4

retlw b'11011010' ; 5retlw b'11111010' ; 6retlw b'00001110' ; 7retlw b'11111110' ; 8retlw b'11011110' ; 9

Možete ih takođe ubaciti i u formi makroa, što listing programa čini preglednijim.

Prilikom pisanja programa neki put ćete koristiti TAB a neki put par razmaka.MPLAB za razliku od ostalih tekst editora za TAB postavlja 4 (umesto 8) razmaka.Zato je dobro pre štampanja listinga programa dodatno „srediti“ .asm fajl. Za tomožete koristiti ASPIC_FIX program sa http://www.embedinc.com/ .

98

Page 99: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 99/209

33. Maskiranje

Pod maskiranjem se podrazumeva izdvajanje željenog bita prepisivanjem niza nula ili jedinica u ostale. Pretpostavimo da je potrebno dovesti treći bit registra PRIKAZ natreći bit PORTA registra, ali tako da se ne promeni stanje ostalih bitova PORTAregistra.

 movf PORTA,W ; PORTA u W, movwf SPORTA ; a odatle u Shaddow registar  movlw b'00001000' ; Maskiranje svih osim trećeg bitaandwf PRIKAZ,W ; Rezultat b'00001000' ili b'00000000' u W,

; u zavisnosti od stanja trećeg bita; PRIKAZ registra

 bcf SPORTA,3 ; Resetovanje ranijeg stanja trećeg bitaiorwf SPORTA,W ; Postavljanje samo trećeg bita na novu vrednost

; Rezultat u W, movwf PORTA ; a odatle u PORTA registar i movwf SPORTA ; u SHADDOW registar.

 Rezultat AND operacije nad bitovima, biće 1 samo ako je na oba bita prisutna logička1. Ukoliko se ostali bitovi maskiraju, u W će se naći jedino stanje trećeg bita PRIKAZregistra.

 Nasuprot AND operaciji, rezultat IOR operacije daje 1 ukoliko je bar 1 bit na logičkoj1. U tom slučaju (budući da je treći bit resetovan BCF instrukcijom), stanje trećeg bitaSPORTA registra zavisiće jedino od stanja trećeg bita W registra, koje je preuzeto iz

PRIKAZ registra. Ostali bitovi u SPORTA registru zadržaće svoja stanja, jer IOR operacija sa bilo kojom vrednošću bita i nulom, daje sam taj bit.

99

Page 100: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 100/209

34. Kompresija

Kompresija je postupak kojim se troši manje memorije za čuvanje većeg broja podataka efikasnijim smeštanjem podataka u memoriji.

Osnovni preduslov je da se u podatcima nalaze prazni (neiskorišćeni) bitovi. Na primer, ukoliko je potrebno u EEPROM snimati grupe od dva bita (kao u primeru sa buđenjem iz SLEEP moda), šteta je ne iskoristiti i ostatak bitova u bajtu. A ukolikonije poznata konačna veličina (kraj) memorisanih podataka, mogu se brojati ciklusisnimanja i po završetku snimanja snimiti u npr. zadnjoj EEPROM adresi (0x3F).

Ukoliko se snimaju samo 2 bita, onda je raspoloživa memorija u kompresovanomstanju 4 puta (8 bita / 2 bita) veća od maksimalne. Za EEPROM to znači da umesto 64osmobitna, postaje dostupno 128 četvorobitna (128 nibla) ili 256 dvobitna dela.

Kompresija, nije ograničena samo na EEPROM memoriju. Može se bez problemakoristiti u običnoj kao i u programskoj memoriji u tabelama. Normalno, u slučaju programske memorije podatke u tabeli nije moguće menjati, već samo čitati.

Pretpostavimo da je potrebno prva dva bita iz registara STANJE1, STANJE2,STANJE3 i STANJE4 kompresovati u registar STANJE.

 movlw 00000011b ; Maskiranje nepotrebnih bitovaandwf STANJE1,W ; Prva dva bita iz STANJE1 registra u W

 movwf STANJE ; a odatle u STANJE registar rlf STANJE2,F ; Rotacija bitova tako da

rlf STANJE2,F ; dođu na pravo mesto movlw 00001100b ; Maskiranje nepotrebnih bitovaandwf STANJE2,W ; Sledeća dva bita iz STANJE2 registra u Wiorwf STANJE,F ; a odatle u STANJE registar rlf STANJE3,F ; Rotacija bitova tako darlf STANJE3,F ; dođu narlf STANJE3,F ; pravorlf STANJE3,F ; mesto

 movlw 00110000b ; Maskiranje nepotrebnih bitovaandwf STANJE3,W ; Sledeća dva bita iz STANJE3 registra u W

iorwf STANJE,F ; a odatle u STANJE registar rrf STANJE4 ; Rotacija bitovarrf STANJE4 ; tako da dođurrf STANJE4 ; na pravo mesto

 movlw 11000000b ; Maskiranje nepotrebnih bitovaandwf STANJE4,W ; Zadnja dva bita iz STANJE4 registra u Wiorwf STANJE,F ; a odatle u STANJE registar 

bit7 STANJE bit0

ST4.1 ST4.0 ST3.1 ST3.0 ST2.1 ST2.0 ST1.1 ST1.0

100

Page 101: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 101/209

Proces vraćanja u prvobitno stanje (iz STANJE u STANJE1, STANJE2, STANJE3 iSTANJE4) naziva se dekompresija.

 movf STANJE,W ; STANJE u W movwf STANJE1 ; Prva dva bita u STANJE1rlf STANJE,F ; Rotacija bajtova tako da

rlf STANJE,F ; dođu na pravo mesto movf STANJE,W ; STANJE u W movwf STANJE2 ; Sledeća dva bita u STANJE2rlf STANJE,F ; Rotacija bajtova tako darlf STANJE,F ; dođu na pravo mesto

 movf STANJE,W ; STANJE u W movwf STANJE3 ; Sledeća dva bita u STANJE3rlf STANJE,F ; Rotacija bajtova tako darlf STANJE,W ; dođu na pravo mesto

 movwf STANJE4 ; Zadnja dva bita u STANJE4

U ovoj dekompresiji na tačnu vrednost postavljeni su samo nulti i prvi bit u svakomregistru, a stanje ostalih bitova zavisi od stanja bitova u ostalim registrima. Ukoliko jeto nepoželjno, ostali bitovi mogu se setovati ili resetovati maskiranjem.

 Bitova zakompresiju

 Potrebanbroj 

delova

 Bitova za punebajtove

1 8 8 (1)

2 4 8 (1)

3 8 24 (3)4 2 8 (1)

5 8 40 (5)

6 4 24 (3)

7 8 56 (7)

8 1 8 (1)

Sa kompresijom broja bitova sa kojimaosmobitni bajt nije deljiv, postupak je maloteži. Potrebno je odrediti minimalan broj

 punih bajtova, kompresovati bitove u njih, azatim ih redom snimati u memoriju.

 Na isti način moguće je izvršiti kompresiju idekompresiju podataka koji sadrže više od 8 bitova, sa tim što se onda podatci uvek snimaju u više od jednog bajta.

Osim ovog, postoje i mnogo komplikovanijinačini kompresije (npr. ZIP algoritam).Budući da oni prevazilaze okvire ovoguputstva, ovde neće biti razmatrani.

Imajte na umu da se EEPROM memorija „troši“ za vreme snimanja. Zbog toga nije

 poželjno snimati svaki dvobitni deo posebno. Sigurnije je sačekati da broj delovadostigne celobrojni broj bajtova, i tek onda snimiti ceo bajt u EEPROM.

101

Page 102: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 102/209

35. If ... Then ... Else ...

Iznova i iznova upotreba instrukcija grananja zbunjuje početnike. U ovom poglavlju biće dodatno objašnjena njihova primena. Pogledajte sledeći primer, zajedno saodgovarajućim algoritmom:

 movlw .5 ; Broj 5?xorwf BROJ,W ; Uporedi

Da btfsc STATUS,Z ; If Z = 0goto Isti ; else goto Istigoto Razliciti ; then goto Razliciti Ne

Kao što primećujete, u programu se ne testira realno stanje registara, već jedino

logičko stanje odgovarajućeg flaga (odnosno bita) unutar registra. Kako će stanje flagadirektno zavisiti od rezultata prethodne instrukcije (5 XOR 5 = 0 pa je Z setovan) kojautiče na njegovo stanje, upravo je njegovim testiranjem omogućeno grananje.

Probleme može izazvati i razumevanje preskoka naredne instrukcije. Naime, prilikomizvršenja btfsc ili btfss instrukcije, nema realne potrebe (osim lakše čitljivosti takvog

 programa) za dve goto instrukcije, jer će program u slučaju da je odgovarajući uslovispunjen (setovan ili resetovan flag) preskočiti narednu instrukciju.

 movlw .12 ; Broj 12?xorwf BROJ,W ; Uporedi

Da btfss STATUS,Z ; If Z = 1goto Razliciti ; else goto Razliciti

Isti ... ; then Isti Ne

Razliciti ... ; Razliciti

Iako je jednostavnije algoritme testiranja moguće napraviti bez dve goto instrukcije,dok ne usavršite programiranje upotrebljavajte prvi oblik (sa dve GOTO instrukcije).Pored btfsc i btfss instrukcija, teško je razumeti i incfsz i decfsz instrukcije.Pogledajte ilustraciju njihove primene u algoritmu koji broji od 25 do 0:

 movlw .25 ; .25 Da movwf BROJ ; u BROJ

Sman decfsz BROJ,F ; BROJ=0? Negoto Sman ; Nije, vrati se

Broj0 ; Jeste.

102

Z = 0 ?

Isti Različiti

Z = 1 ?

Isti

Različiti

Smanji BROJBROJ=0?

Vrati se

Page 103: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 103/209

36. Uslovno asembliranje

Pretpostavimo da imate program koji kontroliše LED displej. Ništa čudno. Već ste tonaučili. Jedini je problem u tome što jednom nabavite displej sa zajedničkom anodom,a drugi put ga nema u prodavnicama, pa morate kupiti displej sa zajedničkomkatodom. Na sreću, pogodilo se da su priključci isti, da možete lako prebaciti katodusa napajanja na masu, jedini je problem tabela.

Šta možete uraditi? Zameniti tabelu! U redu. Ali šta ukoliko i drugi put promenitedisplej? Da li da čuvate dve verzije programa? Mora da postoji bolji način!

MPLAB asembler sadrži par uslovnih direktiva. Njima se u zavisnosti od datih uslovamože izabrati koji deo programa će se asemblirati, a koji ne.

Pogledajte na primer sledeći deo:

 Nastavak sledi!

103

Page 104: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 104/209

37. Jednakost dva broja

U programima se često javlja potreba za testiranjem određenih vrednosti. Kao što steveć naučili, lako je porediti jednakost dva broja korišćenjem XOR operacije, iodgovarajućim skokom u zavisnosti od stanja Zero flaga. U slučaju testa viševrednosti, moguće je testirati ih na sledeći način:

 movlw 'G' ; Slovo “G”?xorwf SLOVO,W ; Uporedi

 btfsc STATUS,Z ; Da li su isti?goto Label1 ; Jesu, idi na Label1

 movlw 'R' ; Nisu. Slovo “R”?xorwf SLOVO,W ; Uporedi

 btfsc STATUS,Z ; Da li su isti?

goto Label2 ; Jesu, idi na Label2

 movlw 'Z' ; Nije. Da li je to slovo “Z”xorwf SLOVO,W ; Uporedi

 btfsc STATUS,Z ; Da li su isti?goto Label3 ; Jesu, idi na Label2

goto Label4 ; Nije nađena odgovarajuća vrednost.; Idi na Label4

Postupak je moguće skratiti poređenjem višestruko XOR-ovanih vrednosti:

 movf SLOVO,W ; Broj u Wxorlw 'G' ; Da li je to slovo “G”?

 btfsc STATUS,Z ; Da li su isti?goto Label1 ; Jesu, idi na Label1

xorlw 'G' ^ 'R' ; Da li je to slovo “R” (G XOR (G XOR R) = R) btfsc STATUS,Z ; Da li su isti?goto Label2 ; Jesu, idi na Label2

xorlw 'R' ^ 'Z' ; Da li je to slovo “Z” (R XOR (R XOR Z) = Z) btfsc STATUS,Z ; Da li su isti?goto Label3 ; Jesu, idi na Label3

goto Label4 ; Nije nijedna vrednost od ponuđenih.; Idi na Label4

U ovom slučaju asembler će prilikom asembliranja programa izračunati vrednost “G”XOR “R” (oznaka ^ označava XOR logičku operaciju) i postaviće dobijenu vrednostna rezultat. Na taj način ušteđeno je vreme potrebno za ručno XOR-ovanje. JednomXOR-ovana vrednost ponovo se XOR-uje i takva se upoređuje sa ostalim.

104

Page 105: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 105/209

Osim XOR operacije testiranje jednakosti može se izvršiti i oduzimanjem dva broja itestiranjem Zero flaga.

 movlw 'G' ; Slovo “G”?subwf SLOVO,W ; W = SLOVO - 30

 btfss STATUS,Z ; Da li je W = 0 (biće kada su vrednosti iste)?

goto Razliciti ; Vrednosti se razlikujugoto Isti ; Vrednosti su iste

Testiranje oduzimanjem više se sreće u programima. Verovatno jer je jednostavnije zarazumevanje.

Ukoliko imate čestu promenu vrednosti registra koji testirate bez mogućnostitestiranja njene jednakosti sa zadatom vrednošću neposredno nakon promene (npr. testTMR0 registra), pouzdanije je testirati prekoračenje vrednosti testom Carry (umestoZero) flaga. Ovo je bolji način jer je moguće da između dve uzastopne provere(pogotovu ukoliko koristite duže interapte ili retko testirate jednakost) registar dođe a

zatim i pređe preko zadate vrednosti pre provere. Carry flag bi (za razliku od Zeroflaga) bio setovan i pri dostizanju vrednosti .0, a i pri prekoračenju. Detaljniji

 postupak prekoračenja naučićete u narednom poglavlju.

105

Page 106: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 106/209

38. Manji ili veći

Isto kao i poređenje jednakosti PIC16F84 može uz par instrukcija testirati da li jeodređeni broj A manji ili veći od broja B. Za to je najpraktičnije koristiti oduzimanje itestiranje Carry flaga.

Pogledajte sledeći primer. U njemu se testiraju vrednosti W registra i registra BROJ.

 movlw .2 ; 2subwf BROJ,W ; W = BROJ - 2

 btfss STATUS,C ; Testiraj prekoračenjegoto Manji ; W<0; BROJ < 2goto Veci ; W>=0; BROJ >= 2

Prilikom oduzimanja broj 2 se menja u svoj drugi komplement (0xFE) i ova vrednost

se sabira sa vrednošću iz registra BROJ. Stoga, ukoliko je BROJ manji od 2 neće bitisetovan Carry flag, pa će se dalje izvršavanje nastaviti od labele Manji. Kako se Carryflag setuje i kada su brojevi jednaki, ukoliko je BROJ veći ili jednak broju 2 programće se nastaviti od labele Veci.

Ukoliko se okrene formula W = BROJ - 2 u W = 2 - BROJ moguće je testirati malodrugačija stanja. Na primer:

 movf BROJ, W ; BROJ u Wsublw .2 ; W = 2 - BROJ

 btfss STATUS,C ; Testiraj prekoračenjegoto Veci ; W<0; BROJ > 2goto Manji ; W>=0; BROJ <= 2

I u ovom slučaju Carry flag će biti setovan kada su brojevi jednaki. Da bi eliminisali jednakost moguće je kombinovati jedan od ovih algoritama sa proverom jednakosti:

 movlw .2 ; 2 u Wxorwf BROJ,W ; Uporedi

 btfsc STATUS,Z ; Da li su isti?goto Isti ; BROJ = 2

xorwf BROJ,W ; Vrati inicijalnu vrednost (2) u W duplim XOR ; Umesto ovoga moglo se pisati i movlw .2

subwf BROJ,W ; W = BROJ - 2 btfss STATUS,C ; Testiraj prekoračenjegoto Manji ; BROJ < 2goto Veci ; BROJ > 2

Dupla XOR operacija upotrebljena je da bi vrednost sa kojom se testira BROJ mogla biti uneta u samo jednoj instrukciji, što omogućava lakšu izmenu testirane vrednosti.

106

Page 107: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 107/209

Testiranjem jednakosti oduzimanjem umesto XOR-ovanjem, postignuta je ušteda dveinstrukcije.

 movlw .2 ;subwf BROJ,W ; W = BROJ - 2

 btfsc STATUS,Z ; Da li je rezultat 0?

goto Isti ; BROJ = 2 btfss STATUS,C ; Nije. Testiraj Carry flag.goto Veci ; BROJ < 2goto Manji ; BROJ > 2

107

Page 108: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 108/209

39. Zamena sadržaja dva registra

Ponekad (npr. pri sortiranju podataka) se javlja potreba za zamenom sadržaja dvaregistra. Obično se za to koristi dodatni privremeni (eng. temp) registar.

 movf BROJ1,W ; BROJ1 u W movwf TEMP ; W u TEMP movf BROJ2,W ; BROJ2 u W movwf BROJ1 ; BROJ1 dobija početnu vrednost registra BROJ2 movf TEMP,W ; TEMP u W movwf BROJ2 ; BROJ2 dobija početnu vrednost registra BROJ1

 Na sledeći način možete direktno izvršiti njihovu zamenu bez upotrebe dodatnogregistra.

 movf BROJ1,W ; BROJ1 u Wxorwf BROJ2,W ; BROJ1 ^ BROJ2 u Wxorwf BROJ1,F ; W ^ BROJ1 u BROJ1, W se ne menjaxorwf BROJ2,F ; W ^ BROJ2 u BROJ2

Ovaj algoritam moguć je jer se duplo XOR-ovana vrednost bilo kojim brojem nemenja. Potpuno istim načinom moguće je promeniti sadfržaj BROJ i W registra.

xorwf BROJ,F ;xorwf BROJ,W ;xorwf BROJ,F ;

108

Page 109: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 109/209

40. On W goto ...

Slično kao kod tabele, sabiranjem PCL sa određenim brojim možemo otići na proizvoljne memorijske lokacije.

Pretpostavimo da je se registar OFSET uvećava pri svakom prolasku kroz program ida se na osnovu njegovog trenutnog stanja izvršavaju dalji programi jedan za drugim.

 Na kraju svog izvrsavanja svaki program izvršava goto Poc instrukciju kojim senastavlja iz početka. Isto kao u tabelama i ovde je potrebno proveriti da li program

 prelazi granicu od 256 instrukcija.

Poc incf OFSET,F ; Uvećaj OFSET movlw .8 ; Broj prekoračenjaxorwf OFSET,W ;

 btfsc STATUS,Z ; Da li je nastupilo prekoračenje?

clrf OFSET ; Jeste, inicijalizuj OFSET

 movf OFSET,W ; OFSET u W

Skok addwf PCL,F ; U W se nalazi broj od 0 do 7goto Program1 ; W=0goto Program2 ; W=1goto Program3 ; W=2goto Program4 ; W=3goto Program5 ; W=4goto Program6 ; W=5goto Program7 ; W=6goto Program8 ; W=7

Svakako možete zapaziti da se ovaj postupak ne razlikuje mnogo od tabele.Ograničenja vezana za njih važe i u ovom slučaju.

U gornjem programu umesto zadnje intrukcije (goto Program8) moglo se odmahnastaviti sa izvršavanjem osmog programa. Ipak, ovako program izgleda preglednije ilakši je za analizu. Iako je time utrošena jedna instrukcija više, analiza ovakvog

 programa je prilično jednostavnija. Morate imati u vidu da će se u programu

verovatno javljati greške. Razumljiv i dobro komentarisan program olakšava njegovunaknadnu ispravku. U protivnom, naći ćete se u gomili naizgled besmislenihinstrukcija. Česta je pojava da se prilikom kasnijeg razvoja programa više vremenautroši na njegovu analizu, nego na pisanje novog programa iz početka. Nije ni čudošto se kod nerazumljivih programa naziva špageti kod.

109

Page 110: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 110/209

41. Kašnjenje u petlji

U dosta slučajeva potrebno je da program jednostavno čeka u petlji određeno vreme.Kako (za 4MHz kristalni oscilator) instrukcijski ciklus traje samo 1μS, potrebno jesoftverski realizovati duža kašnjenja.

Kašnjenje je najpraktičnije implementirati unutar potprograma. Pri proračunu tačnogvremena kašnjenja mora se uzeti u obzir i vreme potrebno za skok na potprogram, kaoi za povratak iz njega (2 * 2 instrukcijska ciklusa).

Ovde je dat potprogram kojim će se (pri 4MHz) realizovati kašnjenje od tačno 1mS.

Pau movlw 0xF9 ; Inicijalna vrednost u W. Tu nisu uračunata 2nop ; instrukcijska ciklusa za skok na potprogram

Pau4 addlw 0xFF ; Oduzmi 1 od W sabirajući W sa 0xFF

 btfss STATUS,Z ; Da li je rezultat 0?goto Pau4 ; Nije, nastavi sa petljomreturn ; Jeste, vrati se iz potprograma.

Svaki prolazak kroz petlju troši 4μS. Addlw traje 1, btfss 1 i goto 2μS. I u trenutkuizlaska iz petlje (W=0) kašnjenje je takođe 4μS.

Potprogram za svoj rad ne koristi registre. Jedino W.

U slučaju da je to potebno, moguće je u W zadati željenu dužinu pauze (4μS * W) iskočiti direktno na Pau4. Imajte na umu da je i Call instrukciji potrebno 2μS.

Za duže pauze, mora se koristiti registar (u ovom slučaju PAUZA). Pre poziva potprograma je u W potrebno zadati željeni broj milisekundi kašnjenja. Njim jemoguće realizovati pauze od 1 do 255mS (¼ S).

Kas movwf PAUZA ; W u PAUZA registar Pet1 movlw 0xF8 ; Inicijalizacija vrednosti

call Pau4 ; 248 * 4 + 2 = 994 ovdenop ; Ostatak,nop ; za još 6μS

decfsz PAUZA,F ; Smanji vrednost u registrugoto Pet1 ; Još petlji.return ; Povratak iz potprograma

Ukoliko Vam se ovaj način čini previše težak, možete isprobati PicLoops programkoji generiše deo potrebnog kôda u zavisnosti od unetog vremena kašnjenja i brzineoscilatora. Autor tog programa prestao je da programira mikokontrolere, izbrisao jePicLoops sa svog sajta i sada kolekcionira stare video igrice. Program sam postavio nasvom sajtu čiji link mođete naći na kraju ovog uputstva.

Ukoliko ne želite išta instalirati online generator kašnjenja imate na linku

http://www.piclist.com/cgi-bin/delay.exe. Iako izgleda kao program, radi se o linku.

110

Page 111: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 111/209

42. Semplovanje

Pretpostavimo da je potrebno određeno vreme pratiti promene na ulaznim pinovima, idobijene podatke snimati redom (bit po bit) u RAM registre ili EEPROM memoriju.Takav postupak naziva se semplovanje, a pojedinačni dobijeni podaci (logička stanja

 pinova u određenom trenutku) semplovi.

Kod semplovanja se javljaju četiri problema. Prvi se odnosi na maksimalan brojsemplova, drugi na dužinu pauze između semplova, treći na rezoluciju semplova, ačetvrti na preciznost pauze.

Pretpostavimo da je potrebno promenom logičkog stanja na jednom pinu pratiti nivoreke (periode plime i oseke). Iako se semplovi mogu uzimati svake milisekunde,tolika preciznost jednostavno nije potrebna. Biće sasvim dovoljno ukoliko se izmeđusemplova ubaci pauza od 10 minuta, tako da za 1 sat mikrokontroler dobije 6 sempla,

odnosno 6*24 = 144 sempla dnevno.Ovde se javlja prvi problem. Maksimalna raspoloživa količina memorije. Pogledajtekako se ona može odrediti.

Kako su semplovi jednobitni, oni se mogu kompresovati i tako zauzeti samo 144/8 =18 EEPROM adresa. Kako EEPROM PIC16F84 mikrokontrolera ima 64 adresa, toznači da bi u njega bilo moguće snimati semplove maksimalno (64*8)/144 = 3,5 dana!

Ukoliko Vam je ovaj period previše kratak (idete na odmor u Egipat), morate neštožrtvovati. Ili ćete kupiti dodatnu EEPROM memoriju, ili ćete povećati pauzu između

semplova. Pogledajte šta se događa ukoliko izaberete drugo rešenje.

U zavisnosti od raspoloživog vremena (i dubine novčanika), odmor u Egiptu možetrajati i do 15 dana (nakon toga postaje dosadno). Znači, za 15 dana možete uEEPROM snimiti maksimalno (64*8)/15 = 34 sempla dnevno. Semplovi bi se uzimali(otprilike) svakih (24*60)/34 = 42 minuta. Ovo je i dalje sasvim dovoljno.

Ovde se javlja drugi problem. Dokle će biti dovoljno? Objašnjenje daje teorijasemplova. Po njoj je bilo koji signal moguće predstaviti semplovima uzetih nafrekvenciji koja je bar duplo veća od maksimalne frekvencije originalnog signala. Štato znači? Ukoliko je za period od 24 časa moguća pojava maksimalno dve plime i dve

oseke, to predstavlja maksimalno 4 promene logičkog stanja na pinu. Da bi se svaka promena sigurno detektovala, semplovanje mora biti bar duplo brže od tih promena,odnosno biće potrebno bar 8 sempla dnevno.

Ovo je minimalni dovoljan broj semplova, ali više semplova će svakako vernije prikazati signal. Na primer, po istoj teoriji svaki analogni audio signal (20Hz – 20kHz) može se predstaviti digitalnim signalom semplovanim na (dovoljnih) 40kHz,međutim tako malim brojem semplova je teško razlikovati violinu od bas gitare.Dovoljan kvalitet postiže se tek pri desetostruko većoj frekvenciji (200kHz).

Postoji li još neki način? Postoji i odnosi se na povećanje rezolucije semplova. To je

treći problem.

111

Page 112: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 112/209

Do sada je rezolucija semplova bila jednobitna, odnosno omogućavala je samo dvalogička stanja (ima/nema vode). Sećate se da je pri učenju interapta predlagan metodmerenja nivoa reke preko više ulaznih pinova. Ukoliko se za merenje koriste 3 pina,moguće je dobiti sledeća stanja: 000, 001, 011 i 111. Ona se mogu konvertovati u

 binarni oblik, i tada se dobija 00, 01, 10 i 11. Vidite da je dvobitnom rezolucijommoguće predstaviti 4 nivoa reke. Znači, ukoliko se za merenje nivoa vode koriste tri

ulazna pina (umesto jednog), moguće je prikazati četiri nivoa reke uz dva bita unutar sempla.

Duplo više bitova donosi i duplo povećanje memorije. Uglavnom je potrebno odabratikompromis između dovoljnog broja semplova i njihove rezolucije, a to opet zavisi odkonkretnih potreba merenja.

 Na primer za početni slučaj (merenje na svakih 10 minuta) uz tri sonde biće potrebno(6*24)*2 = 288 sempla, odnosno 288/8 = 36 bajtova dnevno. Međutim, sada će bitimoguće dosta (četiri puta) preciznije pratiti povećanje i smanjenje nivoa.

Pauzu između semplova treba što preciznije odrediti. To je četvrti problem. Greška od jedne sekunde unutar jednog sata za petnaest dana narasla bi na grešku od 6 minuta. Nekada to može biti zanemarljivo, ali nekada ne. Zbog što preciznijeg vremenasemplovanje se uglavnom izvršava nakon prekoračenja tajmera (ili unutar interaptaizazvanih tajmerom).

Semplovanje nije ograničeno samo na merenje „egzotičnih“ signala kao što je nivoreke. U idućem poglavlju naučićete kako se semplovanje može efektno iskoristitiunutar debouncinga.

112

Page 113: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 113/209

43. Debouncing

Ranije ste videli da se debouncing može realizovati testiranjem tastera, pa kratkimčekanjem, i onda ponovnim testiranjem. Bolji način predstavlja testiranje tastera više

 puta, i izmenu jedino ukoliko je u svim slučajevima testiranja dobijeno novo stanje.

Za testiranje se bez problema može iskoristiti semplovanje, sa tom pogodnošću štotada ranije opisanih problema nema.

Dovoljno je napraviti petlju (ili petlju unutar petlje), uzeti sempl i resetovati petljuukoliko se sempl promenio, kako bi testiranje ponovo počelo iz početka. Ukoliko se

 petlja završi, to znači da se stanje prekidača nije promenilo svo vreme trajanja petlje, pa tako zadnji sempl može biti uzet kao stabilno stanje prekidača.

Ovako jednostavan princip ima naravno i par mana. Program se treba bar 20mS vrteti

u petlji, i za to vreme neće moći da izvršava ostale operacije. Ukoliko kontakti prekidača neprestano varniče, program neće moći da izađe iz petlje. Osim togainterapti mogu izazvati privremen prestanak ili duže vreme testiranja prekidača.Dobar je jedino za programe gde se može dozvoliti čekanje na pritisnutost (iliotpuštenost) tastera. U ostalim situacijama trebalo bi koristiti testiranje prekidačaunutar interapta izazvanih tajmerom.

Kako se interapti izazvani tajmerom pozivaju prilično retko, potrebno je dasemplovanje traje što kraće, odnosno da se u jednom prolazu uzme samo jedan sempl,uporedi sa prethodnim i smanji (uveća) unapred zadat brojač semplova. Ukoliko jesadašnje stanje sempla drugačije od prethodnog, brojač bi se ponovo inicijalizovao.

Kada brojač (napokon) istekne, potrebno je saopštiti glavnom programu da je prekidač pritisnut (otpušten).

Komunikacija između glavnog programa i interapta nije baš jednostavna. Uglavnomse primenjuje komunikacija preko par registara opšte namene.

 Na primer setovan bit 0 registra TASTERI značio bi da je pritisnut taster „LEVO“, asetovan bit 1 da je pritisnut taster „DESNO“. Glavni program trebao bi periodičnotestirati ove bitove, i u zavisnosti od njihovog stanja preduzimati određene akcije.

U sledećim poglavljima upoznaćete se sa par komunikacionih protokola. Jedan deo je

hardverski integrisan u savremenijim PIC mikrokontrolerima. Sigurno ćete primetitikompromis između broja pinova koji se koriste za komunikaciju i brzinekomunikacije.

113

Page 114: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 114/209

44. Malo teorije oko memorije

U početku beše DRAM. Klasičan predstavnik DRAM memorije je 4164 integrisanokolo. Njime je moguće adresirati ukupno 64Kbita (65536 bitova) podataka.

Bitska matrica je unutar memorije organizovana u obliku redova i kolona. Da bi se pristupilo određenom bitu (bilo za čitanje ili upis podataka), potrebno je preko adresnemagistrale pristupiti ćeliji u kojoj se taj bit nalazi. Zamislite mrežu zgrada u kojojredovi imaju nazive ulica, a kolone brojeve zgrada.

Kroz takvu mrežu probija se naš glavni junak – nervozni poštar. On sa koverte čitadve informacije. Naziv (broj) ulice i broj zgrade. Za očitavanje kompletne adresememorija bi morala imati čak 16 ulaznih pinova (8 za ulicu i 8 za broj). Ovo seuglavnom rešava multipleksom adresne magistrale (više o principu multipleksanaučićete kasnije), tako da se u memoriju najpre šalje broj reda, a za njim i brojkolone. Neophodna sinhronizacija obezbeđuje se preko dva (ovo je svakako manje odosam) dodatna pina.

Poštar kao što sigurno već znate može obavljati dve operacije. Može doneti penziju,ili (doneti račun i) odneti penziju. Da li poštar doneti ili odneti penziju (čitati iliupisivati podatke u memoriju) zavisi od logičkog stanja WE (eng. Write Enable) pina.

I na kraju memorija ima ulazni DIN (eng. Data In) i izlazni DOUT (eng. Data Out) pin. Njih je moguće povezati direktno na dva U/I pina mikrokontrolera. Međutim,kako je samo jedan od njih trenutno u funkciji u zavisnosti od stanja WE pina, oni se

 bez problema mogu spojiti jedan za drugi. Ukoliko se spoje, dobija se jedan U/I pin preko koga je moguće upisati ili pročitati jedan bit podataka sa predate adrese. Takose jedan pin koristi i za ulaz i za izlaz (isto kao i pinovi mikrokontrolera). Naravno,

 prilikom čitanja podatka U/I pin mikrokontrolera povezan za magistralu podataka(spojeni DIN i DOUT pin) morao bi biti definisan kao ulazni (preko TRISA ili TRISBregistra), a prilikom upisivanja kao izlazni.

114

Page 115: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 115/209

To bi bilo to za čitanje i pisanje jednog bita. Za čitanje i pisanje jednog bajta moguće je redom čitati (ili pisati) u grupama od 8 bitova, ili kao kod Commodore 64kompjutera paralelno adresnoj magistrali dodati još sedam 4164 DRAM memorija. Utom slučaju veličina adresne magistrale ostaje ista, a magistrala podataka umesto

 jednog zauzima čak 8 provodnika (ili 16 ukoliko se ulazni i izlazni pinovi memorijene spoje jedan za drugi). Mogu se koristiti i 4464 memorije koje imaju u sebi 64Kbita

* 4 (65536 * 4 bitova), odnosno uz istu adresnu magistralu imaju 4 pina na magistrali podataka (spojeni DIN i DOUT formiraju D1, D2, D3 i D4).

Sada ono teško. Svaka bitska DRAM ćelija sastoji se od jednog kondenzatora i jednogtranzistora. Kako bi se kondenzator posle par mS potpuno ispraznio, ne bi više bio ustanju čuvati podatak, pa se morao povremeno (npr. svake druge milisekunde)osvežavati. Tako unutar Spectrum kompjutera Z80 mikroprocesor paralelno saizvršavanjem instrukcija povremeno osvežava DRAM memoriju, dok kod C64 videokontroler osvežava memoriju za vreme dela instrukcijskog ciklusa u komemikroprocesor ne pristupa memoriji. Mikrokontroler bi znači morao povremeno

 pročitati sadržaj celokupne memorije (ili bar onih memorijskih lokacija koje koristi), a

zatim ih ponovo upisati.

Teoretski, DRAM memoriju kapaciteta jednog bita možete dobiti povezivanjemkondenzatora direktno na U/I pin mikrokontrolera. Ukoliko mu se najpre određenovreme dovede logička 1, kondenzator će se napuniti, i ukoliko se kasnije očitanjegovo stanje taj pin će davati logičku 1. Ukoliko mu se pak dovede logička 0,kondenzator će se isprazniti, i kasnije će pri očitavanju davati logičku 0. Da se ne bivremenom ispraznio, mora se povremeno očitati i osvežiti.

DRAM memorija ima više mana nego prednosti. Punjenje i pražnjenje kondenzatorazahteva određeno vreme, tako da je vreme pristupa (eng. access time) ćelijama sporije

od ostalih vrsta memorija. Memorija neće raditi u slučaju pokušaja očitavanja ili upisavećom brzinom od dozvoljene. Osvežavanje memorije troši dosta mikrokontrolerskogvremena. Zbog toga se DRAM memorija sve ređe koristi i pored niske cene.

Razvojem elektronike pojavljuje se SRAM (statička RAM memorija) po pristupačnojceni. U njoj se memorijske ćelije sastoje od nekoliko tranzistora povezanih u formiFlip Flopa, tako da im osvežavanje nije potrebno, a jednom upisan podatak ostaje uSRAM memoriji sve do upisa sledećeg ili do gubitka napona napajanja.

Za razliku od DRAM, u SRAM memoriji je napušten princip multipleksa adresnemagistrale (zbog veće brzine), tako da se adresa željenog bita može zadati u jednomkoraku. Klasičan njen predstavnik bila bi npr. 5564 memorija (SRAM 8Kbita * 8).

 Nezaobilazna je i EPROM memorija. Ona na sebi ima mali stakleni „prozor“ prekokoga se može brisati. Naime, podaci se u EPROM mogu snimati preko odgovarajućih

 programatora specijalnom procedurom (kao snimanje koda u PIC). Taj proces običnozahteva više napone od radnih (+12V umesto +5V). Kada se podaci jednom snime uEPROM memoriju, ne mogu se snimiti naredni sve dok se EPROM određeno vremene izloži ultraljubičastoj svetlosti. Taj proces ubrzava „curenje“ naelektrisanjaisprogramirane EPROM memorije, i na taj način se EPROM obriše. Tek onda jemoguće ponovno programiranje. Većinu EPROM memorija moguće je postaviti usleep mod, dovođenjem logičke 1 na njen CE (eng. Chip Enable) pin.

115

Page 116: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 116/209

Ukoliko je na OE (eng. Output Enable) pinu EPROM memorije prisutna logička 1,svi pinovi magistrale podataka (D0 pa nadalje) naći će se u stanju visoke impedanse.To omogućava multipleks magistrale podataka, i njeno deljenje između EPROM iRAM memorije (Commodore 64 koristi isti princip sa svojom ROM memorijom).

Pri radu sa bilo kojim eksternim memorijama morate obratiti pažnju na brzinu

 pristupa podacima (obično od 45nS do 450nS). Iako je uglavnom moguće donekle„overklokovati“ memoriju, to ne predstavlja dobru praksu. Jednom će svakakostradati. Bolje da to bude što kasnije.

Kao što uočavate za upotrebu adresne i magistrale podataka potreban je veliki broj pinova, ali joj je i brzina maksimalna. Zbog toga se najviše koristi u kompjuterima.Mikrokontroleri se zbog velikog broja potrebnih pinova uglavnom uopšte ne povezujusa eksternim hardverom adresnom magistralom, već se sve više razvija specifičanhardver, kojim se određenim komunikacionim protokolima može upravljati manjim

 brojem pinova, uz manju brzinu pristupa.

Za više detalja pogledajte TB011 sa http://www.microchip.com/.

116

Page 117: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 117/209

45. RS232 i RS423

Kako poslati podatak iz PIC mikrokontrolera u Vaš kompjuter? Postoje dva načina.Povezati potreban broj pinova porta B direktno za adresnu magistralu (npr. paralelni

 port kompjutera), i postaviti pinove porta B u određeno stanje, ili povezati samo 2 pina (jedan za slanje, a drugi za prijem podataka) na kompjuter (npr. serijski port) islati podatke kroz njih bit po bit određenom brzinom.

Očigledno je da bi paralelni prenos podataka trebao biti mnogo brži od serijskog.Međutim, brzina kojom kompjuter može pročitati ove podatke je (u odnosu na PIC)toliko mala, da se ne dobija nikakvo značajno povećanje brzine, a za prenos podataka

 je zauzeto više pinova mikrokontrolera. Osim toga, paralelni port ima priličnonestandardan interfejs, a ni komercijalno nisu dostupni programi za njegovu upotrebu.

Sledećim programom prenosi se poruka u kompjuter, preko serijskog (RS-232) porta.

 Najpre je potrebno uneti poruku koja će se poslati. Najlakše je uneti je u PIC u oblikutabele. MPLAB asembler može sam vršiti konverziju ASCII koda, što olakšava unos

 poruke. ASCII kod za slovo T, označava se sa a'T' ili 'T'.

; ****** Tabela sa tekstom ******Text addwf PCL,F ; dodaj W na PCL

dt 'Zdravo!', 0x0D, 0x0A, 0x00 ; Vraća karaktere,; 0x0D Vraća znak Return; 0x0A Vraća oznaku za novi red; 0x00 Označava kraj teksta

Da bi se na serijski port poslao karakter, potrebno je u jednom registru čuvati redni broj slova koje se prikazuje (broj koji se dodaje na PCL) i pozvati rutinu za slanjekaraktera, povećavajući svaki put vrednost u pointer registru. Kada se dodje dozadnjeg karaktera, iz tabele se vraća 0x00, na osnovu čega potprogram detektuje krajniza karaktera. U rutinu se ulazi sa rednim brojem prvog karaktera (ofsetom) u W.

Uzmi movwf POINTER ; Postavi vrednost iz W u pointer porukePet movf POINTER,W ; Stavi pointer u W

call Text ; Vraća ASCII karakter u Waddlw 0x00 ; Setuje Zero flag ako je W = 0

 btfsc STATUS,Z ; Preskače ako Zero flag nije setovanreturn ; Završava potprogram ako je W = 0call Slan ; Šalje karakter na serijski portincf POINTER,F ; Pozicioniraj pointer na sledeći karakter goto Pet ; Još karaktera

Serijski prenos podataka sastoji se od postavljanja odgovarajućeg pina na logičku 0 ilogičku 1 u tačno određenim trenutcima. Njegovo uobičajeno stanje je visok logičkinivo (1), a nizak nivo (0) pri tome označava startni bit. Pri brzini prenosa podataka od4800 boda, vreme koje bit provede u stanju logičke 0 treba biti 1/4800 = 208μS. 8 bita

 podataka svaki trajanja jednog perioda slede za ovim startnim bitom. Visok logički

117

Page 118: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 118/209

nivo duži od perioda jednog bita označava stop bit. Bitovi se šalju sa prvim bitomnajmanje težine (LSB). Podatci se u kompjuteru čitaju na polovini bitskog perioda, da

 bi se pouzdanije detektovalo da li je odgovarajući bit na logičkoj 0 ili 1. Prilikomslanja ASCII koda slova A (b'0100 0001') u kompjuter bi se poslala ovakva sekvenca:

START 0123 4567 STOP

0 1000 0010 1

Start i stop bit neophodni su radi sinhronizacije prijemnika sa predajnikom.

 Naponski nivoi RS232 porta su -3V ili niže za logičku jedinicu, i +3V i više zalogičku 0. Ovo se uglavnom može zaobići, tako što se koriste nivoi od +5V za logičku0 i 0V za logičku 1, ukoliko je kabl za povezivanje dovoljno kratak. Primećujete da jeovo obrnuto od onoga što biste mogli očekivati!

Za tačno određivanje potrebnih pauza može se koristiti ranije opisan potprogram zakašnjenje sa 52 * 4μS petljom za jednu bitsku periodu pri 4800 boda. Kako sam

 program za slanje traje 12μS, u W će se naći broj 49. U potprogram se ulazi saželjenim karakterom u W. Izlaz za kompjuter je na PORTA registru, bit 2 (pin 1).

Izl movwf TXREG ; Stavi W u registar predaje movlw 0x08 ; 8 bitova podataka movwf BITOVI ; Brojac za bitove bsf PORTA,2 ; Startni bit (invertovan, sećate se) +5V na RA2

Pet movlw .49 ; 49 decimalno, vreme za kasnjenjecall Pau4 ; U potprogramu za pauzu cekaj 49*4=196μSrrf

TXREG,F; Prebaci zadnji desni bit u Carry flag.

 btfsc STATUS,C ; Ako je Carry flag = 0, želi se setovanje bita; (nizak naponski nivo)

goto Obr ; u protivnom je bit = 0 (visok nivo) bsf PORTA,2 ; +5V na pinu 1 (RA2)goto Kraj ; Je li gotovo?

Obr bcf PORTA,2 ; 0V na pinu 1 (RA2)nop ; da bi obe opcije trajale tačno 12μS

Kraj decfsz BITOVI,F ; 1 bit manje. Preskoči kada dođe do 0

goto Pet ; ima još bitova. Kašnjenje za slanje ovog. movlw .52 ; 52 decimalo, vreme za kašnjenje 208μScall Pau4 ; Kašnjenje za zadnji bit podataka

 bcf PORTA,2 ; 0V (visoko stanje) za stop bitove movlw .104 ; 104 decimalnocall Pau4 ; za dva puta duži stop bitreturn ; Povratak 

U ovim potprogramima prikazane su skoro sve potrebne rutine potrebne da bi PIC poslao poruku „Zdravo!“ u kompjuter preko serijskog porta. Ostalo je još njihovo

 povezivanje. Program koji sve to povezuje, mogao bi izgledati ovako:

118

Page 119: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 119/209

Slan bsf STATUS,RP0 ; Prebacuje u BANK1 movlw 0x00 ; Postavlja sve pinove kao izlazne movwf TRISA ; na PORTA bcf STATUS,RP0 ; Vraća u BANK0clrf PORTA ; RA2 = 0 (RS232 visoko stanje)

 movlw .50 ; Kasnjenje od 50 mScall Kas ; preko potprograma za duže pauze

 movlw 0x00 ; Ofset za prvi karakter porukecall Izl ; Slanje poruke u kompjuter 

Blok goto Blok ; Kraj u beskonačnoj petlji

Malo komentara o programu:

Svi bitovi na PORTA registru su postavljeni kao izlazi. Kako program koristi tabelu, potrebno je testirati njeno prekoračenje. Redosled potprograma, naravno, nije bitan.Bitno je jedino da glavni program (Slan) bude prvi.

Za ispravan rad programa, potrebno je osigurati dovoljnu preciznost takta oscilatora, pa se ovaj program može upotrebiti jedino uz kristalni oscilator od 4MHz. Za povezivanje sa kompjuterom dovoljno je pin 1 mikrokontrolera (RA2) povezati sa pinom 2 (RX) devetopinskog ženskog SUB D konektora, i masu (GND) na pin 5konektora. Kabl ne bi trebao biti duži od 1,5m. U protivnom, morali bi se koristitiodgovarajući drajveri (obično se to radi integrisanim kolom MAX232) namenjeni

 pretvaranju logičkih nivoa sa pinova mikrokontrolera u nivoe pogodne za RS232komunikaciju.

 Na strani kompjutera uključite Vaš terminalski program. U samom Windowsu imate

Hyper terminal. Izaberite odgovarajući COM port i u podešavanjima izaberite 4800 bita u sekundi, 8 bita podataka, bez provere parnosti i jedan stop bit. Spojite konektor sa kompjuterom i uključite mikrokontroler. Svaki put kada ga uključite (ili resetujete),

 poruka „Zdravo!“ će se prikazati na ekranu.

U programu nije korišćen Shaddow registar zbog jasnije ilustracije. Međutim, urealnoj situaciji bilo bi ga korisno implementirati.

Iako je za serijsku komunikaciju neophodan tačno određen takt oscilatora, postojesoftverske tehnike koje omogućavaju RS232 komunikaciju merenjem signala sakompjutera, i kalibrisanjem sopstvenog vremena signala i pauze po ovom signalu.

Time je omogućena upotreba jeftinijeg RC oscilatora dovoljne brzine. Za detalje pogledajte tehnička uputstva AN510, AN555, AN593 i AN712 sahttp://www.microchip.com/.

Savremeniji PIC mikrokontroleri imaju hardverski rešenu RS-232 komunikaciju.

Kod RS423 drajvera prijemnik i predajnik su (kao kod RS232) polarizovani u odnosuna masu. Međutim, naponski nivoi su mu od -4 do -6 za logičku 1 i +4 do +6V zalogičku 0. To omogućava da je (uz korišćenje istog komunikacionog protokola)RS423 kompatibilan sa RS232 drajverom, ali da može postići brzinu prenosa

 podataka do 100kB/S, kao i da signal sa jednog predajnika mogu istovremeno primati

10 prijemnika.

119

Page 120: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 120/209

46. Algoritmi za detekciju grešaka 

Prilikom prenosa podataka moguće je da se na spojnim putevima jave određenesmetnje. Na primer, ukoliko se mobilni telefon uključi u blizini kablova kojim su

 povezani PIC i kompjuter. Prilikom slanja podataka infracrvenom vezom moguće jeda svetlost sunca ili sijalice ometa ispravan prijem. Pri radio vezi smetnje bi moglaizazvati grmljavina ili aktivnost lokalnog radio predajnika.

Kako bi mikrokontroler mogao ispravno primati signale i u slučaju smetnji, poželjno je softverski detektovati smetnje i (ukoliko je to moguće) ukloniti ih iz korisnogsignala. To ne znači da se sa time treba preterivati (u primeru u prošlom poglavlju

 pretpostavlja se da se mikrokontroler nalazi u neposrednoj blizini kompjutera pa jeuticaj smetnji zanemarljiv), pogotovu što algoritmimi zauzimaju deo brzine imemorije mikrokontrolera i što su njima preneti podaci veći od originalnih, pa jeslanje sporije.

U vašem terminalskom programu primetili ste podešavanje provere parnosti. Kod nje bit nakon MSB sadrži informaciju o ispravno primljenih ranijih 7 bita.

Kako funkcioniše provera parnosti? Najpre se bitovi 0-7 koda željenog karakteraredom sabiraju, i proverava se da li je njihov zbir paran broj (deljiv sa 2 bez ostatka).Ukoliko jeste MSB se setuje (parna parnost) ili resetuje (neparna parnost). Za slovo A(b'0100 0001') i neparnu parnost poslati bitovi bi izgledali ovako:

START 0123 4567 BIT PARNOSTI STOP0 1000 0010 0 1

Terminalski program u kompjuteru nakon prijema sabira redom bitove 0-7 iuporedjuje njihovu parnost sa primljenim bitom parnosti. U slučaju neslaganja

 prijaviće grešku ili će jednostavno ignorisati primljeni karakter.

Ovaj princip je dovoljno pouzdan za detekciju greške nad jednim bitom poslatog podatka. Međutim, u slučaju pojave greške nad više bitova bit parnosti nije dovoljan.

Umesto provere bita parnosti može se određeni broj primljenih bajtova sabrati iuporediti njihov zbir. Na primer ukoliko se u kompjuter šalju sledeći podatci: 3, 8, 15,4, 26, 87 u mikrokontroleru bi se izračunao njihov zbir 3+8+15+4+26+87=143 koji bi

se poslao nakon podataka unutar par dodatnih bajtova. Kompjuter bi nakon prijemasabrao sve podatke i uporedio dobijeni rezultat sa primljenim. Taj princip naziva se

 provera ukupnog zbira (eng. checksum). Nažalost sa njim su prenešeni podatci duži, ani on nije pouzdan u slučaju pogrešno primljena 2 (ili više) bita (ukoliko na primer nije primljen nijedan bit podataka niti kontrolne vrednosti, svi “primljeni“ bajtovi kaoi njihov zbir biće jednaki 0, što pogrešno indikuje ispravno primljene podatke). Ovo jeipak mnogo pouzdanije od provere parnosti. Više o checksumu imate u TB026.

 Najpraktičniji način detekcije grešaka u prenosu postiže se primenom CRC (eng.Cyclic Redundancy Check) algoritma, koji pruža najbolji kompromis između brzinealgoritma, pouzdanosti detekcije greške i veličine dodatno prenetih podataka. Više o

njegovom principu imate u AN730.

120

Page 121: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 121/209

U slučaju dvosmerne komunikacije (mikrokontroler ka kompjuteru i kompjuter kamikrokontroleru) moguće je nakon detektovane greške u suprotnom smeru poslati

 podatak o rednom broju neispravnog podatka, i na taj način zatražiti jedino njegovo ponovno slanje, ili pak ponovno slanje cele grupe podataka (tačnije za signalizacijugreške pri RS232 vezi koriste se dodatni provodnici, ali se oni uglavnom izbegavaju).Svakako da je ovaj način prilično vremenski zahtevan, a nije ni moguć u slučaju

 jednosmerne komunikacije. Da ti problemi prevazišli primenjuju se algoritmi zakorekciju grešaka. Oni će biti detaljnije objašnjeni u narednom poglavlju.

Uglavnom je potrebno pronaći kompromis između najčešćih vrsta grešaka i količine prenetih podataka za spojni put (provodnici, optička veza, audio veza, radio talasi...)koji se koristi. Pri tome mnogo može pomoći odgovarajući izbor modulacije signala.

Prilikom RS232 komunikacije signali se modulišu preko odgovarajućeg drajvera(MAX232) koji pretvara naponske nivoe od +5V i 0V u +15V i -15V, i dalje se onitako modulisani prenose kroz provodnike. Kod USB ili I2C veze naponski nivoi su 0Vi +5V. Kod ostalih vrsta spojnih puteva uglavnom je neophodno eliminisati

 jednosmernu komponentu napona (dužu pojavu logičke 0 i logičke 1). Zbog toga se zamodulaciju sporijih (npr. audio) veza mogu primenjivati RTTY, DTMF, FSK, PSK irazni drugi načini. Za modulaciju bržih (npr. optičkih) veza najčešće vrste modulacijesu Manchesster, CMI, Miller, MCMI i 5B6B. Iako je radio, audio ili optičkakomunikacija nesumnjivo interesantna, prevazilazi okvire ovog uputstva, tako da ćenadalje biti objašnjena jedino veza žičanim provodnicima.

Uz neodgovarajući izbor modulacije neće Vam pomoći ni najbolji korektivnialgoritam. Pogledajte samo kolike su razlike u brzini prenosa podataka preko RS232 iSPI veze, ili u daljini preko I2C i RS485 veze!

121

Page 122: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 122/209

47. Algoritmi za korekciju grešaka

 Najjednostavniji algoritam za korekciju poslatih podataka zahtevao bi prenos podataka 3 puta, pri čemu bi se za ispravno primljene podatke uzeli samo oni koji su bar u dva slučaja ista. Na taj način istovremeno je realizovana i detekcija i korekcijagrešaka. Međutim, taj princip je prilično neefikasan, jer su preneti podaci tri puta dužiod originalnih, pa i prenos podataka traje tri puta duže.

Algoritam za korekciju jednog bita u tri poslata bajta mogao bi se realizovati posledećem principu.

Pretpostavimo da je potrebno RS232 vezom preneti dva bajta (nazovimo ih A i B).Radi detekcije grešaka šalje se i bit parnosti. Neposredno nakon njih pošalje se i bajtC koji predstavlja rezultat XOR operacije nad bajtovima A i B. Ispravna situacijaizgledala bi ovako:

A P B P C P1011 1001 1 0110 1011 1 1101 0010 0

Međutim ukoliko bi u prenosu podataka došlo do greške u bajtu A, događa se sledeće:

A P B P C P1010 1001 1 0110 1011 1 1101 0010 0

Prijemnik bi najpre na osnovu bita parnosti detektovao da je pogrešno primljen bajt A.Da bi ga regenerisao primenjuje XOR nad ispravno primljenim bajtovima B i C. Ovo

 je slično zakonima u matematici: Ukoliko je A*B=C, onda važi i A=C/B i B=C/A.

0110 1011 BXOR 1101 0010 C= 1011 1001 A

Da je pogrešno primljen bajt B izvršila bi se XOR operacija nad bajtovima C i A, a da je pogrešno primljen bajt C, ne bi se ni izvršavala korekcija, jer su nam bitni jedino Ai B. Specijalan slučaj predstavljao bi pogrešno primljen bit parnosti A ili B bajta.Onda bi se regenerisani bajt uporedio sa originalnim, i u slučaju da su oba bajta istazaključio da je pogrešno primljen upravo bit parnosti.

Kako je proverom bita parnosti moguće ispravno detektovati korupciju samo jednog bita unutar bajta, ovaj princip pogodan je jedino za regeneraciju jednog bita unutar 3 poslata bajta (A, B i C). U slučaju korupcije više bitova, potrebno je koristiti drugačijealgoritme.

122

Page 123: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 123/209

48. I2C

RS232 komunikacija pogodna je jedino za direktno povezivanje dva uređaja. Njom jeteško povezati PIC sa više uređaja istovremeno (npr. sa A/D konvertorom, dodatnomEEPROM memorijom i još jednim mikrokontrolerom). Svakako da je takvukomunikaciju moguće ostvariti direktnim povezivanjem pinova mikrokontrolera, alito troši njihove dragocene pinove, i komplikuje softver zbog različitihkomunikacionih algoritama. I2C (eng. Inter Integrated Circuit bus) veza omogućava

 povezivanje mikrokontrolera sa jednim ili više dodatnih uređaja koristeći za to samodva pina, i I2C komunikacioni protokol. Naravno, i ti uređaji moraju imati mogućnost(softversku ili hardversku) I2C komunikacije. Zadnjih godina pojavljuje se sve višehardverskih dodataka koji proširuju upotrebu mikrokontrolera, a za komunikacijukoriste upravo I2C vezu (umesto ranije adresne i magistrale podataka).

U I2C vezi moguće je imati jedan glavni mikrokontroler (eng. Master) koji upravlja

dodatnim I2

C hardverom (eng. Slave), ili pak više glavnih mikrokontrolera (eng.Multimaster) od kojih svaki može upravljati dodatnim Slave I2C hardverom. Unastavku će biti opisan jedino prvi slučaj.

I2C veza je specifična po tome što se logička 1 ne šalje na uobičajeni način, već predajnik prilikom predaje logičke 1 prelazi u stanje ulaza (visoke impedanse), alogička 1 se javlja pod uticajem (eksternog ili internog) pull up otpornika. Prijemnik 

 je za to vreme takođe u stanju ulaza, ali on (za razliku od predajnika) vodi računa osignalu koji prima. Na taj način omogućena je komunikacija preko jedne linije, uznemogućnost kratkog spoja. Preko druge linije Master obezbeđuje takt neophodan zasinhronizaciju prijemnika signala. Takt mora biti strogo sinhronizovan sa slanjem

signala. Postoji ograničenje njegove maksimalne brzine, ali ne i minimalne, tako da ćeSlave prilikom slanja podataka po potrebi čekati dok Master ne bude slobodan zanjihov prijem (tj. dok Master ne pošalje takt).

Kako je algoritam I2C protokola razvijen tako da je nemoguće da dva uređajaistovremeno šalju podatke, svaki Slave ima svoju jedinstvenu adresu preko koje mu se

 pristupa. Jedan deo adrese mu fabrički dodeljen na osnovu funkcije, a drugi deo birase fizičkim prespajanjem pinova. Svakom Slave hardveru povezanom sa Masteromtreba inicirati slanje ili prijem podataka. U slučaju da je potrebno neprekidnotestiranje Slave hardvera, neprestano bi se izvršavala njihova prozivka (kao u Vojsci).

Prilikom prijema bajta za adresiranje Slave hardvera svaki od priključenih Slavedetektuje da li se radi o njemu, i preduzima traženu akciju (obično slanje ili prijem par 

 bajtova). Svaki Slave hardver ima svoje specifičnosti tako da se moraju proučitinjegovi tehnički podatci. Na primer prilikom snimanja bajta u I2C EEPROMmemoriju potrebno je poslati 7 bita za adresiranje baš tog Slave hardvera (resetovanLSB u njemu inicira upis), 2 bajta za adresu (za memorije do 64Kb) i 1 bajt podatka.Za čitanje se šalje 7 bita za adresiranje Slave hardvera (setovan LSB inicira čitanje), 2

 bajta za adresu i čita se 1 bajt. Početak, kraj kao i razdvajanje bajtova realizovani suslično kao u RS232 komunikaciji preko START, STOP i još par kontrolnih bitova.

Isto kao RS232 i I2C protokol je hardverski implementovan u moćnijim PIC

mikrokontrolerima. Za više detalja pogledajte AN515, AN541, AN554 i AN578.

123

Page 124: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 124/209

49. RS485, RS422

RS232 zahteva napone od -3V i niže, i +3V i više. RS423 napone od -4 i niže, i +4 iviše. I2C napone od +5V i 0V. Međutim, njihovi drajveri koriste zajedničku masu,tako da i pored tolike razlike napona nisu pogodni za veće daljine zbog mogućihsmetnji. Smetnje koje mogu biti indukovane (u odnosu na masu) mogu na strani

 prijemnika uticati na pogrešnu detekciju napona. Zbog toga je za veće daljine praktičnije koristiti diferencijalni predajnik i prijemnik.

Kod diferencijalnog primopredajnika umesto linije za signal i mase koriste se dvelinije (A i B) za signal, i zajednička masa. Kada je na liniji A +5V na B je 0V i to

 predstavlja logičku 1. Logičku 0 predstavlja 0V na A i +5V na B liniji. U prijemnikuse detektuje razlika napona na ove dve linije. Zbog uspešne detekcije razlika naponamora biti bar 0,2V, ali drajveri će po RS485 standardu raditi i sa bilo kojim naponimaod -7V do +12V. Kako se indukovane smetnje javljaju na svim provodnicima, one se

 potiru, omogućavajući brzinu prenosa od 10Mb/S do 10m daljine, ili 100kb/S do1,2km.

U slučaju da brzina nije bitna, softver se podešava za najmanju (a ipak dovoljnu) brzinu. U protivnom, postepeno se povećava brzina do pojave grešaka. Onda se brzinamalo smanji, i ostavi na toj vrednosti. Za detekciju grešaka mogu se koristiti ranijeopisani algoritmi. Početni i krajnji drajver trebaju na svojim ulaznim / izlaznim

 pinovima imati „terminatorske“ otpornike kojima se eliminiše refleksija signala sakrajeva linija.

Budući da je preko PIC mikrokontrolera moguće jedino predati, a ne i primiti signale

sa RS485 veze (Ovo nije sasvim tačno. Za detekciju bi se mogli koristiti integrisanikomparatori napona ili A/D konvertori prisutni u moćnijim mikrokontrolerima, ali salošijim rezultatima), za detekciju signala moraju se koristiti MAX485, TI 75175,DS1487 ili SN75176 drajveri. Iako je sasvim moguće direktno sa pinovamikrokontrolera proizvoditi potrebne predajne napone, poželjno je i za to koristiti ovakola, jer su ona projektovana tako da smanjuju električne smetnje, čak i u slučajunepostojanja terminatorskih otpornika.

Iako je primenom RS485 komunikacionog protokola moguće postići velike daljinekoristeći jeftine linije (npr. telefonske parice), radi boljih rezultata i većih daljina

 poželjno je izabrati provodnike čija je impedansa približno jednaka ulaznoj impedansi

 prijemnika. Za manje brzine i daljine ovo ne bi trebalo predstavljati problem.

Pre projektovanja kola, proučite tehničke podatke odgovarajućih kola, jer se njihovekarakteristike prilično razlikuju. Na primer uz MAX481, MAX483, MAX485,MAX487 i MAX1487 moguće je ostvariti dvosmernu naizmeničnu komunikaciju(simpleks) preko samo dve linije, dok je MAX488 i MAX490 kolom mogućistovremen prijem i predaja, ali preko četiri linije (dupleks). MAX488 ili MAX491drajverom moguće je realizovati repetitor signala koji postavljen na polovini linijeregeneriše signal i tako omogućava duplo duže linije. Postoje i galvanski izolovanidrajveri (pogodni za područja sa jakim smetnjama – grmljavinom), npr. MAX253 iMAX1480. Ipak, najbolje je u tim slučajevima ukopati linije ili koristiti koaksijalne ili

optičke kablove (još kada bi i Telekom Srbije to shvatio).

124

Page 125: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 125/209

Kako je RS485 protokolom moguće da se pinovi predajnika isključe (tako što pređu uvisokoimpedansno stanje – slično ulazima mikrokontrolera), moguće je na taj načinkao u I2C protokolu preko istih linija paralelno povezati više mikrokontrolera.

 Naravno, mora se povesti računa o sprečavanju istovremene predaje (npr. pojedinačnim asdresiranjem kao u I2C protokolu).

Ovo je moguće jer RS485 standardom nije propisan komunikacioni softver, već jedino hardver. To znači da možete napisati sopstveni komunikacioni protokol (ilikoristiti gotovi RS232 – pogotovu ukoliko je hardverski implementovan umikrokontroleru) koji će zadovoljiti vaše konkretne potrebe. To pruža slobodu

 programeru da unutar protokola ugradi sopstvene algoritme „prozivke“ više dodatnihmikrokontrolera (do 32 ili uz više drajvera u jednom integrisanom kolu do 256),algoritme detekcije i korekcije grešaka, jednom rečju da koristeći standardan stabilankomunikacioni hardver softverom komunicira na koji god način želi.

Korišćenjem repetitora moguće je realizovati virtuelno beskonačne mreže. Međutimuz veće daljine i više povezanih mikrokontrolera (pogotovu uz repetitore) kašnjenje

signala može biti preveliko. Što duže linije, to veće kašnjenje, samim tim i manja brzina.

 Najveća razlika između RS485 i RS422 protokola je u predajniku. RS422 predajnik ne može se naći u stanju visoke impedanse, tako da mikrokontroler može jedino slatisignal preko dve linije, dok bi taj signal moglo istovremeno primati do 10 prijemnika.

Za više detalja pogledajte AN1076.

Osim ovih, postoji još par RS (eng. R ecommended Standard) protokola poput RS449i RS530, međutim budući da oni predstavljaju varijaciju već opisanih principa, kao i

da se retko kada koriste, ovde neće biti razmatrani.

125

Page 126: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 126/209

50. DMX512

Ponekad je dovoljno slati informacije samo u jednom smeru. DMX512 (eng. DigitalMultipleX) predstavlja komunikacioni protokol sposoban za adresiranje do 512

 prijemnika i koji se uglavnom koristi za upravljanje rasvetom. Za povezivanje sekoriste RS485 drajveri, a protokol predstavlja softver za upravljanje tim drajverima.

Kako se DMX512 protokolom povezuje jedan predajnik sa više prijemnika samo u jednom smeru, prijemnici nemaju način signalizacije neispravno primljenog podatka.Konkretno za slučaj rasvete, to im nije ni potrebno. Čak i da dođe do greške, ionakoće naredni podatak sadržati ispravnu vrednost jačine svetla. DMX512 protokolnapravljen je tako da se podaci neprestano (tačnije bar jednom u sekundi) šalju

 prijemnicima.

Pošto je RS232 komunikacioni protokol integrisan u novijim mikrokontrolerima,

DMX512 predstavlja modifikaciju RS232 protokola kako bi se njim preko RS485drajvera moglo adresirati do 512 prijemnika. Modifikacija se sastoji u drugačijemobliku START bita (dosta duža logička 0 pa 1), STOP bita (dve logičke 1) i rednomslanju svih 512 bajtova sa STOP bitovima između njih. Broj poslatih bajtova mogao

 bi se smanjiti za slučaj manjeg broja prijemnika.

Prijemnici bi morali redom brojati primljene bajtove kako bi videli koji je bajt za njih.Više detalja imate u AN1076 i na www.esta.org.

126

Page 127: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 127/209

51. LIN

LIN komunikacioni protokol podržava dvosmernu komunikaciju preko jednog provodnika (+ masa). Protokol je nastao ukrštanjem I2C i RS232 protokola. Napon naliniji je u neaktivnom stanju na nivou logičke 1 generisane (kao kod I2C) pull upotpornikom. Bilo koji član mreže (eng. nod) može na liniju poslati logičku 0, koja nataj način prelazi u dominantno stanje i briše postojeću logičku 1.

Za razliku od I2C veze umesto linije za takt, podaci se kroz provodnik prenoseasinhrono, kao kod RS232 veze.

 Napon na liniji (generisan pull-up otpornikom) iznosi od 9 do 18V u odnosu na masu.

LIN protokol je zbog većeg broja nodova napravljen tako da mikrokontrolerimaomogući što jeftiniji hardver, pa je zato moguće koristiti RC oscilatore, pri čemu se

svi slave nodovi softverski sinhronizuju sa masterom po prijemu njegovog signala.Zbog toga kao sinhronizacioni impuls pre svake poruke master šalje bajt b'01010101'.Tako je svakom slave nodu omogućena sinhronizacija korekcijom sopstvenihvremenskih rutina u skladu sa primljenim bitskim vremenima logičke 0 i 1.

 Nakon sinhronizacionog bajta sledi jednobajtno zaglavlje, u kome se saopštava kakvi podaci slede. U njemu 4 bita (bit 0 do bit 3) adresiraju nodove na liniji, 2 bita (bitovi 4i 5) određuju dužinu informacija (2, 4 ili 8 bajtova), i zadnja 2 bita (6 i 7) služe za

 proveru parnosti zaglavlja.

LIN protokolom nije specifiran format narednih informacija, osim SLEEP komande i

checksuma informacija.Kako nakon pojave greške LIN protokolom nije omogućena njena prijava, master može u delu sa informacijama zatražiti prijemni status od pojedinačnih nodova.

Svi nodovi mogu primati poruke od ostalih nodova direktno, tako da dodatnaintervencija mastera u tom slučaju nije potrebna. Ipak, master mora obezbediti

 povremenu prozivku nodova u slučaju da su njihovi podaci potrebni ostalimnodovima.

Master može poslati sve nodove u sleep mod, slanjem identifikacionog bajta 0x80.

Ostali nodovi po prijemu ove komande trebaju podesiti interapt po promeni stanja na pinu na liniji, tako da i oni mogu otići u sleep mod.

Bilo koji nod može probuditi ostale slanjem 0x80 koda. Po njegovom prijemu svinodovi se bude i čekaju dalje informacije od mastera.

LIN protokol nije stekao veliku popularnost zbog kašnjenja u proizvodnjiodgovarajućih integrisanih drajvera, male daljine i podložnosti smetnjama usleddirektno polarisane linije. Za više detalja pogledajte AN729, AN235 i AN237.

127

Page 128: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 128/209

52. DALI

DMX512 komunikacija je jednosmerna. Zato joj je primena ograničena na upravljanjerasvetom. Međutim, njen princip je nepraktičan u slučaju kvara sijalice (reflektora).Zgodnije bi bilo kada bi bilo moguće da drajver za sijalicu detektuje da li ona zaistaradi, i da po potrebi obavesti master o kvaru.

DALI (eng. Digitally Addressable Lighting Interface) protokol je namenjenupravljanju pre svega fluo cevima. Zbog čega baš njima? Zbog toga za istu potrošnjuelektrične energije jaču svetlost od njih (Lm/W) daju jedino metal-halidne,sodijumske (i niskog i visokog pritiska) sijalice, kriogenske i retki Luxeoneksperimentalni tipovi LED. Što se tiče početnih investicija, od svih ovih tipova

 jedino fluo cevi se mogu nabaviti po povoljnoj ceni. Iako jedna fluo cev košta oko1,3€ (u odnosu na sijalicu sa užarenim vlaknom koja je oko 0,2€), vremenom će seisplatiti kroz manji račun za električnu energiju. Verujte mi na reč. Imam ih u svim

 prostorijama osim kupatila (zbog vlage).Iako se regulacija svetlosti sijalica sa užarenim vlaknom lako implementira faznomregulacijom, kod fluo cevi sa prigušnicama je to mnogo teže izvesti. Tek su se oko2000-te godine pojavili tranzistori dovoljno jeftini i dovoljno velikog probojnognapona da mogu poslužiti kao konvertori mrežnog napona u napon potreban za radfluo cevi. Taj princip koristi DALI za funkciju dimera (eng. DALI dimming ballast).Dimerom je omogućeno da se potrošnja električne energije još više smanji.

 Na DALI interfejs moguće je povezati do 64 nodova. Regulacija svetlosti postignuta je u 255 koraka, ali logaritamskog odnosa. On pruža prirodniji odnos pojačanja i

smanjenja svetlosti. Takođe je moguće proizvesti i moćne efekte postepenog pojačanja ili smanjenja svetla, podešavalje svetla po grupama i slično.

DALI protokol nema posebne integrisane drajvere. Umesto njih, implementirani sudiskretnom tehnologijom. Tačnije, za prijem i predaju signala koriste se optokapleri,čime je pored niske cene drajvera omogućeno i galvansko odvajanje linije od mrežnognapona.

Kako je DALI protokol rezultat saradnje Microchipa i International Rectifiera,dodatne informacije o DALI protokolu mogu se jedino naručiti na CD-u sa sajta http://www.irf.com/product-info/lighting/. Za više detalja pogledajte AN809 i AN811.

128

Page 129: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 129/209

53. SPI

SPI (eng. Serial Peripheral Interface) predstavlja komunikacioni protokol namenjen brzom prenosu signala, na kratkim odstojanjima. Iako SPI protokol nema ograničenjenajmanje brzine, zbog bržeg prenosa veće količine podataka se mikrokontroleruobično zabranjuje izvršavanje ostalih operacija. Upravo zbog toga Vaš digitalni fotoaparat ne možete istovremeno koristiti kao web kameru, niti na MP3 plejeru nemožete slušati muziku dok je povezan sa kompjuterom.

Obično se koristi prilikom komunikacije sa serijskim EEPROM memorijama, kao imemorijskim karticama (MMC, SD, xD, CF...). Iako memorijske kartice u osnovi

 predstavljaju veliku EEPROM memoriju, imajte u vidu da je proces formiranjasistema za podršku fajlova (eng. Filesystem npr. FAT16, FAT32 ili NTFS) umemorijskim karticama kao i sistem snimanja i čitanja fajlova iz takvog fajl sistema

 prilično komplikovan, tako da PIC16 serija mikrokontrolera obično nema dovoljno

resursa za njeno efektno korišćenje.SPI protokol sličan je I2C protokolu, sa glavnom razlikom adresiranja raznih slaveuređaja preko posebnog pina, a ne prozivkom njihove adrese. Na taj način slavehardver ne mora imati dodatne pinove za formiranje svoje adrese, ali mikrokontroler mora obezbediti po jedan pin za adresiranje svakog slave hardvera ponaosob.

Za jedan SPI slave hardver dovoljne su tri linije, a svaki naredni mora imati svoj CS(eng. Chip Select) pin. Ukoliko je na CS pinu povezanom na odgovarajući slave SPIhardver prisutna logička 0, onda će on reagovati na signale sa ostale dve linije. U

 protivnom, ignorisaće ih i njegovi pinovi biće neprestano u stanju visoke impedanse,

omogućavajući adresiranje ostalih slave SPI hardvera. Interesantna je mogućnostistovremenog slanja podataka svim Slave hardverima ukoliko su sve CS linije nalogičkoj 0 (svi slave očekuju podatke).

Isto kao kod I2C protokola, mikrokontroler (master) je uvek zadužen za generisanjetakta preko SCK linije. Preko druge (SI) linije sinhronizovano sa taktom šalju se

 podatci u ili iz mikrokontrolera.

Za više detalja pogledajte AN248, AN648 i AN909.

Isto kao i RS232 i I2C kod moćnijih mikrokontrolera je SPI hardverski

implementovan.

129

Page 130: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 130/209

54. INKnet

RS485 standardom propisan je jedino hardver. INKnet predstavlja softver razijen odstrane Ed Nisley-ja, a čiji su principi opisani u Circuit Cellar časopisu. Za razliku odDMX512 protokola, INKnet protokolom moguća je dvosmerna komunikacija.

Iako je INKnet protokol prvenstveno razvijen za 8052 mikroprocesor (tih godina sumikrokontroleri bili retki i skupi), protokol se može iskoristiti ili prilagoditi bilo komdanašnjem mikrokontroleru.

Komunikaciju inicira centralni mikrokontroler (master), šaljući zahtev zainformacijama pojedinačnim ćelijama (nodovima - eng. node). Oblik poruke je takavda se u njoj pre informacije šalje desetobajtno zaglavlje, a nakon njega informacijesve do maksimalne veličine poruke od 255 bajtova.

 bajt 0 – rezervisano, mora biti 0 bajt 1 – dužina poruke sa zaglavljem (9 do 255) bajt 2 – adresa noda primaoca informacije bajt 3 – komanda primaocu bajt 4 – adresa noda pošaljioca informacije bajt 5 – adresa rezervisanog noda bajt 6 – MSB bajt status flagova noda bajt 7 – LSB bajt status flagova noda bajt 8 – LSB bajt checksuma bajt 9 – MSB bajt checksuma bajtovi 10 do 255 – informacije

Uočavate da je ovim načinom moguće poslati maksimalno 245 bajtova informacija.Više informacija moralo bi se poslati unutar više poruka (kao SMS poruke). Iako svinodovi mogu istovremeno primiti informacije, master je taj koji će na osnovuzaglavlja (i informacija) regulisati rad i komunikaciju između nodova.

Slično kao adresa noda primaoca i pošaljioca, rezervisani nod će nadalje odgovarati na poruke pošaljioca koji ga je rezervisao.

Komanda primaocu ukazuje šta nod primaoc poruke treba uraditi sa informacijom.Ovde su prikazane standardne komande, ali mogu se po potrebi proširiti, što zavisi od

konkretnih zahteva mreže.

80 - POLL Poll from master to node81 - STATUS Status response from node to master 82 - UNBUSY Force node "unbusy" regardless of actual status (use with caution!)88 - RESERVE Reserve node for exclusive use of "from" node (except for polls &responses)89 - RELEASE Release node for general use (may be sent by any node)90 - CONSOUT Console output (to display)91 - CONSIN Console input (from keyboard)92 - CONSECHO Echo of console input message

93 - CONSFILE Console input (from file)

130

Page 131: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 131/209

Unutar status bajta noda, takođe (kao kod STATUS registra mikrokontrolera)određeni flagovi opisuju funkcije noda. Flagovi su sledeći:

15 - BUSY Node is busy handling previous message14 - OVERRUN At least one previous message was lost13 - ECHO Node will echo all CONSIN messages

12 - LFSTRIP Node strips LF after CR on CONSIN msgs11 - CSUM Node detected a checksum error 10 - reserved09 - reserved08 - MASTER Node is network master 

Flagovi od 0 do 7 su rezervisani.

Ovakav princip omogućava efikasnu integraciju standardnog RS485 drajvera inamenskog softvera za pravljenje sopstvene mreže mikrokontrolera. Detekcija grešakaimplementirana je checksumom, a korekcija ponovnim slanjem informacije ukoliko

 prijemni nod pošalje zaglavlje sa setovanim CSUM bitom njegovog status bajta.

Za više detalja pogledajte časopise Circuit Cellar broj 10 (avg/sep 1989), 11 i 12. Unjima možete pronaći i objašnjenja interesantnih principa komunikacija bez mastera(detekcijom kolizije ili rednim transferom dozvole predaje od jednog ka drugomnodu). Unutar istih časopisa možete videti i organizacionu strukturu složenijihkomunikacionih protokola, formiranu po slojevima (eng. Layers) u CEBus protokolu.

Za jednostavniji komunikacioni protokol preko RS485 drajvera pogledajte časopisCircuit Cellar broj 21.

131

Page 132: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 132/209

55. S-ARTnet

INKnet protokol sa RS485 drajverima pored očiglednih prednosti ima i par mana.Pored signala, svakom nodu potrebno je dovesti i napon napajanja (+5V i 0V). Bilo bisvakako jeftinije ako bi se broj provodnika mogao na neki način smanjiti. S-ARTnet(eng. Serial, Addressable, Receive/Transmitter) protokol rešava ovaj problem, tako štose kroz dva provodnika prenosi i napon napajanja i koristan signal. Ovo je omogućenotako što izlazni napon drajvera može biti 15V, 7,5V ili 0V. Prijemnik na osnovu ovihnapona detektuje da li je poslata logička 0 ili logička 1. Kako napon od 0V traje

 prilično kratko, nodovima će za to vreme napajanje obezbeđivati kondenzator.

S-ARTnet protokolom moguće je adresirati do 30 slave nodova.

S-ARTnet protokol kao i INKnet ima master koji za komunicira sa pojedinim slavenodovima. Međutim, njegovi slave nodovi nisu dodatni mikrokontroleri, već ih

 predstavlja specijalizovano integrisano kolo CS212. Ono u sebi ima objedinjenkomunikacioni protokol, dva ulazna i dva izlazna pina i ulazno izlazni drajver.

Adresa odgovarajućeg slave noda hardverski se postavlja povezujući pinove CS212kola ka masi ili naponu napajanja (slično kao kod I2C). Master i slave nodovikomuniciraju preko 10-bitnih poruka. Poruka može biti jedna od 3 sledeća tipa:

1. Sinhronizacija – Master šalje poruku 0111111110. Na osnovu nje svi slave nodovisinhronizuju svoj takt.

2. Piši – Master šalje poruku tipa A0 A1 A2 A3 A4 Pa Wr D0 D1 Pd gde A0 do A4

 bitovi sadrže adresu željenog noda, D0 i D1 logičko stanje koje se treba postaviti naizlaznim pinovima CS212 kola, Wr bit (1 za indikaciju upisa) i Pa i Pd bitove za proveru parnosti adrese i ostatka poruke

3. Čitaj – Master šalje poruku A0 A1 A2 A3 A4 Pa Rd gde su A0 – A4 bitovi adrese,Pa bit za proveru parnosti adrese i Rd bit (0 za indikaciju čitanja). Po prijemu, CS212šalje poruku I0 I1 Pd gde su I0 i I1 logička stanja na njegovim ulaznim pinovima, a Pd

 je bit provere parnosti.

S-ARTnet kao ni DALI ne sadrži integrisane drajvere za master, ali ih ima u CS212kolima. Neophodna konverzija logičkih nivoa se za master obezbeđuje odgovarajućim

konvertorima signala. Preko ovog protokola master može adresirati do 30 slavenodova, odnosno očitavati 60 udaljenih ulaznih pinova, i postavljati do 60 udaljenihizlaznih pinova slave nodova.

Po potrebi, master može periodično vršiti prozivku svih nodova. Zbog male dužine poruka i trostepenog stanja na liniji, moguće je prozivati svih 30 nodova 6 do 7 puta usekundi. Više o ovom protokolu imate u časopisu Circuit Cellar broj 21.

132

Page 133: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 133/209

56. CAN

Svi raniji principi zahtevaju softversku detekciju i/ili korekciju grešaka u okruženju podložnom smetnjama. Naravno da je to moguće uraditi (kao u INKnet protokolu), aliMicrochip se potrudio pa je softver koji bi inače opterećivao mikrokontroler prebaciou hardver. Tako jedno integrisano kolo (MCP2510 ili MCP2515) obavljakomunikacionu funciju (u kojoj je implementirana CRC detekcija grešaka, korekcijagrešaka, izazivanje interapta po prijemu signala...), a drugo predstavlja drajver zaspojni put (MCP2550 ili MCP2551). Drajverom upravlja komunikacioni čip, akomunikacionim čipom mikrokontroler preko SPI protokola.

Isto kao RS485, i CAN standard koristi diferencijalne signale. Međutim, za razliku odRS485, CAN standardom propisan je i komunikacioni protokol. U njemu jemikrokontroler rasterećen od komunikacionih algoritama, i može svu svoju snaguupotrebiti za ono za šta je i namenjen.

Po CAN protokolu ne vrši se (kao kod I2C ili INKnet) prozivka svakog pojedinačnognoda. Ne. Nodovi se ne adresiraju ni posebnim pinovima kao kod SPI protokola.Umesto toga, nodovi su ravnopravni. Svi oni moraju određeno vreme „osluškivati“stanje na liniji pre nego što počnu sa predajom, kako ne bi upali u već postojeću vezu.Ukoliko se ipak dogodi da dva ili više nodova istovremeno započnu predaju podataka,na scenu stupa kolo za detekciju kolizije (eng. Collision Detection).

Po detekciji kolizije nod koji je prvi predao logičku 0 unutar podatka nastavlja sa predajom, dok ostali (čim detektuju 0 dok u stvari šalju 1) momentalno prestaju sa predajom, čekaju dok se ne završi sa slanjem kao i neko vreme nakon toga (da se ne bi

 javilo novo preplitanje), i tek onda pokušavaju novu predaju. Kako je logička 0„dominantna“, ona će uvek prebrisati logičku 1 (slično kao u I2C). Na taj način podatak će stići do prijemnika neizmenjen i bez ikakvog kašnjenja ili korekcije, a zakomunikaciju se (zbog iste linije za slanje i prijem podataka) koriste samo dva

 provodnika (i zajednička masa).

U CAN mreži pojedinačni nodovi nemaju adrese. CAN protokol nije adresno većkomandno orjentisan sistem. Zbog toga nodovi obično komuniciraju između sebe

 periodično šaljući poruke po liniji. Ako je nekome potrebna, eto mu je. Ukoliko nije,ignorisaće se.

Struktura CAN protokola omogućava upotrebu hardverskih CAN ekspandera (kao kodS-ARTnet veze). Microchip je zaključio da se veliki broj nodova sastoji jedino ododgovarajućeg U/I hardvera (U/I pinova, A/D konvertora ili PWM modulatora), pa je

 proizveo seriju U/I ekspandera koji se mogu direktno povezati na CAN mrežu, i čijim je hardverom moguća direktna manipulacija od strane ostalih (inteligentnijih) nodova.

Za više detalja pogledajte datasheetove drajvera, komunikacionog čipa, CAN I/Oekspandera, AN215, AN228 i AN754.

Razvitkom CAN mreže originalni protokol pretrpeo je izmene softvera, pa je mogućesresti verzije CAN 1.2, CAN 2.0A, CAN 2.0B i ECAN. Na sreću, novije verzije

 podržavaju starije (eng. backward compatibile). Za više detalja pogledajte AN916.

133

Page 134: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 134/209

Jedan deo do sada opisanih komunikacionih protokola je hardverski integrisan u jačimserijama mikrokontrolera. To ipak ne znači da se slabiji mikrokontroleri (čitajPIC16F84) ne mogu koristiti za određene vrste komunikacija. Uvek je moguće (uslučaju da je mikrokontroler dovoljno brz) pravovremeno direktno manipulisatiulazno izlaznim pinovima, i na taj način ostvariti softversku implementacijuhardverskih komunikacionih rutina (eng. bit-banging) kao što je ilustrovano u RS232

vezi. Taj način nekada može biti i neophodan (na primer prilikom istovremeneupotrebe 3 RS232 veze jednim mikrokontrolerom).

Komunikacioni protokoli ne prestaju da se razvijaju. I sami verovatno znate da senekada mogao koristiti jedino dial-up, zatim ISDN, a onda ADSL. Brzina i dalje raste.Mikrokontroleri su u potpuno istoj situaciji.

134

Page 135: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 135/209

57. Koju vezu odabrati?

 Ne postoji univerzalan odgovor na ovo pitanje. Sve zavisi od toga za šta Vam je potrebna. Dobar uporedni prikaz imate u časopisu Circuit Cellar broj26. U sledećoj tabeli dat je uporedni pregled ovde opisanih vrsta komunikacije sa svojim specifičnostima:

 Paralelna RS232 RS485 DMX512 SPI I 2C LIN DALI S-ARTnet CAN  

drajver  ne MAX232 MAX485 MAX485 ne ne da PC357NT da MCP2551

softver nije potreban implement. ne ne implement. implement. implement. ne hardverski MCP2510

max. brojčlanova

zavisi od adr.magistrale

1 pred., 1 prij.

32 pred., 32 prij.

1 pred., 512 prij.

1 pred., malo prij.

zavisi odkapaciteta linije

1 master +16 slave

1 master + 64slave

1 master + 30slave

112 pred.,112 prij.

max. brzina ograničenahardverom

20kbita/S 100kbita/Sdo 3Mbita/S

100kbita/S 5Mbita/S 100, 400kbita/Sili 3,2Mbita/S

20kbita/S ? ? 1Mbit/S

max daljina mala,oko0.5m

15m 1,2km 1,2km mala,oko0.5m

mala,oko 20cm 40m ? ? 40m pri1Mbit/S

detek. gresaka ne bit parnosti zav. od soft. ne ne ne parnost +checksum

? dva bita parnosti

hardverska

korek.gresaka ne zav. od soft. zav. od soft. ne ne ne zav. od soft. ? ne hardverskamax. napondrajvera

0V, +5V -25V, +25V -7V, +12V -7V, +12V 0V, +5V 0V, +5V 0V, +18V ? 0V, 7.5V, 15V -40V, +40V

osetljivost prijemnika

zavisi odhardvera

+-3V, prema masi

+-0.2Vdiferencijalni

+-0.2Vdiferencijalni

zavisi odhardvera

zavisi odhardvera

zav. od drajv. +-?Vdiferencijalni

trostepena +-0,5Vdiferencijalni

neaktivnostanje

0V preko +3V zavisi odsoftvera

 preko 0,4Vrazlike u +

nema takta visoka imp. beztakta

Preko 9Vrazlike u +

 preko ?Vrazlike

15V nema signala

način pren. zav.od hard. asinhroni zav. od soft. asinhroni sinhroni sinhroni asinhroni asinhroni asinhroni asinhronisimpl.br.prov zav. od mag. 1 + masa 2 + masa 2 + masa 4 + masa 2 + masa 1 + masa 2 1+masa 2 + masadupl.br.prov. zav. od mag. 2 + masa 4 + masa / / / / / / /

repetitor / / da da / / / / /

ul. impedansa zav.od hardv. 3k do 7k >=12k >=12k zav.od hardv. zav.od hardv. zav. od drajv. zav. od optok. zav. od hardv. 100k  

160

Page 136: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 136/209

58. Paralelna D/A konverzija 

Ovde će biti prikazana dva hardverska načina realizacije paralelnog D/A konvertora.Paralelna D/A konverzija za razliku od serijske zauzima više pinova, ali daje stabilnijigenerisani napon i ne opterećuje mikrokontroler.

Pogledajte najpre hardversku realizaciju paralelnog D/A konvertora principom binarne težinske otporne mreže (eng. binary weighted DAC).

Ovde je primenjena binarna otporna mrežakod koje je otpornost povezana na pinove bitaveće težine dva puta manja. Na PORTBdovoljno je dovesti željenu binarnukombinaciju, i na izlazu će se odmah javitistabilno analogno stanje. Zbog karakteristikaove mreže, bitovi veće težine više utiču na

stanje izlaznog napona od bitova manjetežine. Tako setovanje RB3 pina podiženapon za 2,51V, a RB0 za samo 0,48V.

Zbog bolje linearnosti idealno bi biloupotrebiti otpornike sa dupliranom vrednošću

 prethodnih. Međutim, to zbog standardnihvrednosti otpornika poskupljuje realizaciju.

 Decimalni broj 

 Bitovi  RB3 RB0

 Izlazni  Napon

0 0000 0V

1 0001 0,48V

2 0010 0,87V

3 0011 1,21V

4 0100 1,55V

5 0101 1,79V

6 0110 1,99V

7 0111 2,17V

8 1000 2,51V

9 1001 2,63V

10 1010 2,75V11 1011 2,85V

12 1100 2,96V

13 1101 3,05V

14 1110 3,12V

15 1111 3,20V

Kako je impedansa izlaznih pinova (pri oba logička stanja) PIC mikrokontrolera prilično niska (manja od 75Ω pri naponu napajanja od 5V) daljim širenjem otporne

mreže ne bi se postigli zadovoljavajući rezultati, pre svega u pogledu linearnostiizlaznog napona. Osim toga, preciznost ovog kola u velikoj meri zavisi od tačnihvrednosti i tolerancije upotrebljenih otpornika.

Po potrebi binarna težinska mreža može se napraviti sa logaritamskom a ne linearnomkarakteristikom izlaznog signala. To može biti od koristi kod povećanja dinamičkogopsega govora u sistemima za digitalizaciju zvuka, jer po Laplacianovoj distribucijioblast oko napona bliskog 0 nosi više informacija od oblasti sa većim amplitudama.

Za više detalja ovakve težinske mreže pogledajte http://www.ke4nyv.com/index2.htm.U situacijama kada je neophodna veća rezolucija D/A konvertora može se koristiti D/

A konvertor sa R-2R otpornim nizom (eng. R-2R ladder DAC).

136

Page 137: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 137/209

Kod ove šeme, umesto dupliranja vrednosti otpornostikoriste se otpornici istih vrednosti. Korišćenjemintegrisanog otpornog niza, kolo sa ovakvom šemommože čak imati manje dimenzije. Rezolucija ovog kola

 je osmobitna. To znači da se ovim kolom može (zarazliku od prethodnog) dobiti čak 255 stabilnih

analognih stanja. U tablici možete videti neke tipičnevrednosti izlaznog napona u zavisnosti od postavljenog binarnog stanja na PORTB.

 Decimalni broj RB7 RB0 Izlazni napon

0 00000000 0V

27 00011011 0,5V

53 00110101 1V

79 01001111 1,5V

105 01101001 2V157 10011101 3V

209 11010001 4V

235 11101011 4,5V

255 11111111 5

Linearnost ovog kola je skoro idealna, a zavisi jedino od tolerancije upotrebljenihotpornika. Za kompletnu tablicu izlaznih napona i detalje pogledajte AN655 sa http://

www.microchip.com/.

Za generisanje složenijih talasnih oblika izlaznih napona, najpraktičnije je uzimati bajtove za POTRB iz tabele. Tako se mogu sa lakoćom realizovati testerasti,trouglasti, sinusoidni oblici napona, pa čak i DTMF tonovi. Ukoliko mikrokontroler treba izvršavati i druge operacije za vreme generisanja signala, možete jednostavnijefunkcije realizovati i softverski. Na primer, u interapt rutini možete neprekidno

 povećavati stanje PORTB registra. Tako dobijate testerasti signal. Naizmeničnim povećavanjem i smanjivanjem stanja PORTB registra dobijate testerasti signal. Isinusni signal možete dobiti korišćenjem matematičkih funkcija.

137

Page 138: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 138/209

59. Serijska D/A konverzija 

Serijska D/A konverzija koristi drugačiji princip. Kod nje se kondenzator na izlazunaizmenično puni i prazni tačno određenim odnosom, održavajući tako napon nanjemu u željenim granicama. Postupak kojim se puni i prazni kondenzator naziva semodulacijom širine impulsa (eng. PWM –  Pulse Width Modulation). Iako jehardverski realizovana u nekim savremenijim PIC mikrokontrolerima, u PIC16F84može se implementirati softverski.

Ova tehnika često se koristi za uključenja i isključenja prekidačkog tranistoraodređeno vreme. Na primer ukoliko je napon +12V a tranzistor provodi 25, 50 ili 75%vremena, efektivni napon biće 3, 6 i 9V. Minimum napona postojaće kada je na pinuneprekidno prisutna logička 0, maksimum kada je neprekidno prisutna logička 1, a

 polovina kada se na 50% periode naizmenično menja logičko stanje pina. Ovaj načinD/A konverzije uglavnom se upotrebljava za regulaciju brzine motora jednosmerne

struje. Nije pogodan za primene u kojima je potrebna veća stabilnost izlaznog signalazbog generisanja smetnji i harmonika.

 Nastavak sledi

Pored ovih, postoji još mnogo, mnogo principa po kojima se može implementovati D/A konverzija. Pogledajte http://en.wikipedia.org/wiki/Analog-to-digital_converter zaviše detalja. Za PIC16F84 od značaja bi mogao biti interesantan način modulacije tonasa download sekcije sajta www.elektronika.ba (picsound).

Gornja granična frekvencija koju možete dobiti bilo kojim od prikazanih načinina D/A konverzije zavisi isključivo od brzine oscilatora mikrokontrolera. Svakako da je

možete povećati manjim brojem različitih semplova koje koristite za generisanježeljenog talasnog oblika, ali u tom slučaju gubite na preciznosti generisanog signala.Sve zavisi od toga kakav signal želite generisati. Na primer četvorobitna rezolucija D/A konvertora sasvim je dovoljna za generisanje prilično čistog sinusoidnog signala, ali

 je za generisanje DTMF tonova neophodna bar osmobitna rezolucija.

Ukoliko se mikrokontrolerom generišu sinusoidalni naponi stalne frekvencije, poželjno je na izlazu D/A konvertora staviti analogni filter, propusnik željenog opsegafrekvencije. Posebno je to poželjno kod serijskih D/A konvertora zbog harmonika ismetnji koje oni generišu.

138

Page 139: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 139/209

60. Flash A/D konvertor

Verovatno Vam je već poznato da PIC16F84 nema u sebi integrisan A/D konvertor zarazliku od nekih savremenijih mikrokontrolera. Međutim, uz jednostavan interfejs sanjim je moguće meriti odgovarajuće vrednosti napona. U narednim poglavljima biće

 prikazano par principa A/D konverzije. Da biste shvatili rad raznih vrsta A/Dkonvertora morate se najpre upoznati sa principom rada naponskog komparatora.

 Naponski komparator nalazi se integrisan u savremenijim verzijama PICmikrokontrolera. Međutim, iako ga PIC16F84 nema, može mu se dodati spolja. 4naponska komparatora u sebi sadrži popularno analogno integrisano kolo LM339. Sa

 jednim kolom moguće je detektovati 5 decimalnih stanja, a sa dva 9 stanja. Kako jeLM339 potpuno analogno kolo, da biste na njegovom izlazu dobili naponske nivoelogičke 0 i logičke 1, morate ga napajati istim naponom napajanja kao i PIC (+5V).

Šta u stvari radi naponski komparator? On poredi (eng. Compare) napone svoja dvaulaza, i ukoliko je jedan veći od drugog, menja stanje svog izlaza. Na primer, ukolikose na jedan njegov ulaz dovede se referentni napon od 3V, a na drugom ulazu senapon polako povećava od 0 do 5V, izlaz komparatora biće u stanju logičke 0 sve dok napon na drugom ulazu ne pređe zadatih 3V.

 Najteže će se naponski komparator snaći ukoliko se pogodi da je napon na oba ulaza potpuno isti (3V). Ka kom će izlazu (logička 0 ili logička 1) tada biti naklonjenuglavnom zavisi od stanja izlaza neposredno pre jednakih napona.

Jedini predstavnik potpuno paralelnog A/D konvertora je

Flash A/D convertor. On je realizovan pomoću višenaponskih komparatora. Na jedan ulaz svih komparatoradoveden je mereni napon, a na drugi su dovedenireferentni naponski nivoi koji se redom smanjuju odnajvećeg do najmanjeg.

Pri tom smanjivanju može se (menjanjem vrednostiotpornika) koristiti logaritamski ili linearni odnos napona.

Glavna prednost Flash konvertora je kako mu ime kaže(eng. munja) njegova brzina. Kako on nije vezan za takt

mikrokontrolera, kompletnu A/D konverziju može obavititrenutno. Međutim, ima on svoje mane. Broj upotrebljenihnaponskih komparatora direktno određuje broj stanjaizlaza. Ako želite flash A/D konvertorom realizovatičetvorobitnu konverziju, biće Vam potrebno 16 ulaza (i 16ulaznih pinova mikrokontrolera). Za osmobitnu konverziju

 potrebno je 255 ulaza.

Pinovi RB4 do RB7 upotrebljeni su jer se njima može izazvati interapt pri promeniulaznog napona. Iako je problem velikog broja ulaznih pinova moguće prevazićiupotrebom određenih digitalnih konvertora u binarni format, ovoliki broj naponskih

komparatora nije baš najjeftiniji. Zato se ovaj tip A/D konvertora retko koristi.

139

Page 140: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 140/209

61. Brojački A/D konvertor

Ovaj tip A/D konvertora u stranoj literaturi (eng.) se još sreće sreće pod nazivimaCounting ili Digital ramp.

Zamolite svog prijatelja da zamisli broj između 0 i 1000. Zamislio je. Krenite redomsa pitanjima:

Da li je to broj 0? Nije.Da li je to broj 1? Nije.Da li je to broj 2? Nije.

...

Verovatno će mu dosaditi mnogo pre nego što se uopšte približite zamišljenom broju. Njemu će dosaditi. Mikrokontroleru neće.

Ovaj A/D konvertor specifičan je po tome štomu je za rad potreban D/A konvertor. Taj D/A konvertor u šemi je realizovan R/2R otpornim nizom.

Izlaz D/A konvertora vodi se na jedan ulazeksternog naponskog komparatora, a na drugiulaz dovodi se mereni napon. Izlazni naponD/A konvertora se povećava korak po korak (od 0V do 5V). U trenutku kada naponski

komparator promeni stanje, očita se trenutnostanje na izlaznim pinovima D/A konvertora.To stanje odgovara merenom analognomnaponu. Sasmim tim preciznost A/Dkonvertora u najvećoj meri zavisi od

 preciznosti D/A konvertora.

Verovatno i sami uviđate manu ovog principa. Ukoliko je mereni napon blizu svojemaksimalne vrednosti, mikrokontroler moraD/A konvertorom povećavati napon od 0V pa

sve do merenog napona. To može potrajati.Da bi se vreme merenja što više skratilo,

 primenjuje se princip opisan u narednom poglavlju.

Glavna rutina programa sa ovakvim principom izgledala bi ovako:Pet incf SPORTB,F ; Povećaj Shaddow registar.

 movf SPORTB,W ; Prebaci u W, movwf PORTB ; pa u PORTB – tako povećaj izlazni napon. btfsc PORTA,RA0 ; Jesu li se ovi naponi sada izjednačili?goto Pet ; Nisu, povećavaj i dalje.... ; Jesu, W sadrži vrednost A/D konverzije.

140

Page 141: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 141/209

62. Sukcesivno aproksimativniA/D konvertor

Da bih Vam ilustrovao princip rada ove A/D konverzije obrazložiću Vam princip

algoritma binarne pretrage unutar sortiranog niza podataka.

Opet zamolite svog prijatelja da zamisli broj između 0 i 1000. Zamislio je.Sada ga pitajte je li njegov broj veći od [0+((1000-0)/2) = 500] 500. Nije. Značinjegov broj je između 0 i 500.Da li je veći od [0+((500-0)/2) = 250] 250? Nije. Znači broj je između 0 i 250.Da li je veći od [0+((250-0)/2) = 125] 125? Nije. Broj je između 0 i 125.Da li je veći od [0+((125-0)/2) = 62,5] 63? Jeste. Broj je između 63 i 125.Da li je veći od [63+((125-63)/2) = 94] 94? Jeste. Broj je između 94 i 125.

Da li je veći od [94+((125-94)/2) = 109,5] 110? Jeste. Broj je između 110 i 125.Da li je veći od [110+((125-110)/2) = 117,5] 118? Nije. Broj je između 110 i 118.Da li je veći od [110+((118-110)/2) = 114] 114? Nije. Broj je između 110 i 114.Da li je veći od [110+((114-110)/2) = 112] 112? Jeste. Broj je između 112 i 114.Da li je veći od [112+((114-112)/2) = 113] 113? Jeste. Onda je to broj 114.

Ovaj princip možete zamisliti kao sečenje pice. Iseče se na pola, zatim na četvrtine, pana osmine, i tako sve do najmanjeg parčeta.

Vidite da ste za razliku od prethodnog slučaja sa samo 10 pitanja uspeli da dođete dotačnog rezultata. E sada. Ukoliko ovaj princip primenite umesto (kao u brojačkom A/D konvertoru) postepenog povećanja napona korak po korak, vreme utrošeno namerenje biće mnogo, mnogo kraće, uz potpuno istu električnu šemu.

Program je prilično jednostavan. Najpre se setuje bit najveće težine (MSB - RB7) naPORTB registru. U zavisnosti od stanja naponskog komparatora, ovaj pin ostavi sesetovan ili se resetuje. Onda se prelazi na RB6, RB5, RB4...

clrf PORTB ; Inicijalizuj PORTB bsf PORTB,7 ; Setuj MSB btfss PORTA,0 ; Ukoliko je napon preveliki, bcf PORTB,7 ; resetuj ga. bsf PORTB,6 ; Setuj naredni btfss PORTA,0 ; Ukoliko je napon preveliki, bcf PORTB,6 ; resetuj ga. bsf PORTB,5 ; Setuj naredni

. . .I tako sve do RB0 pina. Na kraju će PORTB sadržati izmerenu vrednost napona. Kod

 je dat ilustrativno, a u pravim programima bi se koristio i Shaddow registar.

141

Page 142: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 142/209

63. Wilkinsonov A/D konvertor

Ranije šeme zbog upotrebe D/A konvertora zauzimaju previše dragocenih pinovamikrokontrolera. Osim toga, one zahtevaju upotrebu naponskog komparatora za svojrad. Očigledno je da se PIC16F84 takav kakav je ne snalazi najbolje sa merenjem i

 poređenjem napona. Sa njegove strane mnogo je zgodnije mereni napon konvertovatiu neku drugu fizičku veličinu. Na primer u vreme. Taj princip primenjen je u sledećimšemama. One Vam mogu poslužiti za merenje otpornosti, temperature (upotrebom

 NTC ili PTC otpornika), intenziteta svetlosti (upotrebom fotootpornika) ilikapacitivnosti (upotrebom kapacitivnih senzora).

Kako radi ovaj interfejs? Najpre drži RB0 na logičkoj 1dovoljno dugo da bi se kondenzator napunio. Ovo vreme je5*R*C, odnosno za maksimalnu vrednost testiranogotpornika od 10kΩ oko 5mS. Čim se kondenzator u

 potpunosti napuni, naizmenično se vrši postavljanje pina nalogičku 0 (pražnjenje kondenzatora), konfigurisanje pina kaoulaz i testiranje da li se kondenzator dovoljno ispraznio(prazan je kada na pinu mikrokontrolera javi logicka 0). Brojciklusa pražnjenja / testiranja ili proteklo vreme direktnoodređuje vrednost merene otpornosti.

Prekid programa interaptima za vreme merenja dovešće do nepreciznog očitavanjavrednosti. Zato se oni moraju isključiti dok se merenje ne završi.

Ukoliko Vam je potrebno brže merenje, možete umesto naizmeničnog menjanja stanja pina (ulaz/izlaz) možete koristiti neku od sledećih šema:

Ovo kolo najpre drži RB0 na logičkoj 0 dovoljno dugo da sekondenzator isprazni, odnosno da mu oba pola budu na

 potencijalu od 0V. Zatim se pin RB0 postavlja u stanje ulaza, imeri se vreme za koje će se na pinu javiti logička jedinica. Kakose kondenzator sada puni preko otpornika, ovo vreme direktnoće zavisiti od trenutne vrednosti otpornosti. Prednost ove šemenad prethodnom je mogućnost pojave interapta po promenistanja na RB0/INT pinu, što rasterećuje mikrokontroler za ostale

 potrebe.

Sa ovim kolom se uglavnom dobijaju najbolji rezultati. RB0se postavi na logičku 1, kondenzator se napuni, a zatim semeri vreme koje je potrebno da se na pinu javi logička 0. I saovom šemom moguće je po završenom merenju otići nainterapt rutinu.

Možda Vam čudno deluje taj skok na interapt rutinu. Kakoće onda program meriti vreme? Jednostavno. Još jedniminteraptom izazvanim tajmerom.

Ove tehnike mogu se primeniti za bilo koju vrednost otpornika i kondenzatora.

Međutim, ukoliko se koristi kondenzator kapacitivnosti veće od 100nF između

142

Page 143: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 143/209

kondenzatora i pina potrebno je postaviti zaštitni otpornik od oko 220Ω. On sprečava preveliku struju na pinu mikrokontrolera u trenutku naglog punjenja ili pražnjenjakondenzatora. Microchip čak navodi da se usled prevelike struje na pinovima portovamože promeniti stanje TRISA ili TRISB registra, pa ga je stoga poželjno povremenosoftverski „osvežiti”. Donja granica kapacitivnosti kondenzatora zavisi jedino od

 brzine vašeg mikrokontrolera. Pri kristalu od 4MHz sasvim je moguće koristiti

vrednosti od 33pF. Što manji kondenzator upotrebljavate, merenje će biti kraće.

Kako vreme za koje se kondenzator napunio ili isprzanio nema direktne veze sacelzijusovim stepenima ili svetlosnim luksom, vrednosti ovih veličinanajjednostavnije je dobiti iz odgovarajuce tabele. Bilo koja izobličenja pri merenju(poput nelinearne karakteristike upotrebljenog senzora) mogu se odmah kompenzovatiu samoj tabeli.

Još jedna mogućnost gornjih šema ogleda se u mogućnošću merenja kapacitivnostiumesto otpornosti. Na taj način može se na primer izmeriti položaj osovine

 promenljivog kondenzatora. Naravno, u tom slučaju umesto promenljivog, u šemu je

 potrebno postaviti običan otpornik što manjeg stepena tolerancije.

Ove šeme zbog svoje jednostavnosti imaju jedan veliki nedostatak. Sa njima nijemoguće dobiti veću preciznost zbog promene radnih karakteristika upotrebljenogkondenzatora usled promene radne temperature. Zbog toga se može koristitikompenzacija ovih nedostataka koristeći kalibracioni otpornik i merenjem njegovevrednosti neposredno pre merenja otpornosti senzora. Za detalje pogledajte AN512,AN513 i AN863 sa http://www.microchip.com/.

Možda smatrate da ovo nije prava A/D konverzija zbog ograničenja na merenjeotpornosti i kapacitivnosti, a ne napona! U pravu ste. Međutim, uz male izmene

električne šeme moguće je realizovati pravu desetobitnu A/D konverziju. Za principrada i detalje pogledajte http://www.ele.uva.es/~jesus/adsd.pdf .

Ovakav princip merenja u literaturi se naziva još i Single Slope A/D konvertor.

143

Page 144: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 144/209

64. Konverzija otpornosti ikapacitivnosti u frekvenciju

Raniji principi A/D konverzije bili su pogodni za merenje raznih fizičkih veličina

 jedino u slučaju da senzori nisu previše udaljeni od mikrokontrolera. Ukoliko bisteželeli da merite npr. temperaturu na terasi, morali bi razvući bar oko 5m provodnika.Ti provodnici otpornosti senzora dodaju svoju otpornost koja zavisi od njihovog

 poprečnog preseka i dužine. Osim toga usled svojih fizičkih veličina uvode povećanjemogućnosti pogrešnog merenja. Na primer usled sopstvene zavisnosti otpornosti odtemperature (ponašaju se kao mini senzor temperature), usled povećanjakapacitivnosti na vodovima (provodnici su uglavnom bliski jedan drugom, pa se

 ponašaju kao kondenzator) ili usled indukovanih električnih smetnji (što duži kablovi,to bolja antena). U industriji se upravo iz tih razloga udaljeni senzori umesto sa

 promenljivim naponom prave sa promenljivom strujom (4-20mA).

PIC16F84 je prilično mali potrošač električne energije. Nema svrhe napraviti kolo zamerenje spoljne temperature, ubaciti mu čak i SLEEP mod, a onda mu dodati senzor čija je prosečna potrošnja 12mA. Nije li upravo to rasipništvo u efikasnomiskorišćenju datih nam resursa dovelo do opšteg povećanja zagađenja planete Zemlje!

Kao što ste ranije videli PIC16F84 se ne snalazi najbolje sa direktnim merenjemnapona. Šta najlakše radi? Meri vreme i broji.

U ovoj šemi upotrebljeno je popularno integrisanokolo NE555 povezano kao astabilni multivibrator.Tako povezano, ono će u zavisnosti odkapacitivnosti elektrolitskog kondenzatora od 1μF iotpornosti merenog otpornika od 10kΩ umikrokontroler slati impulse, tačno određenomfrekvencijom. Što je otpornost promenljivogotpornika manja, ova frekvencija će biti veća.

Algoritam programa trebao bi u fiksnomvremenskom intervalu (npr. 0,5S – što duži intervalto veća preciznost) brojati impulse.

Kako je za eliminaciju smetnji poželjno koristiti ulaz sa šmitovim okidačem, impulse je najpraktičnije dovesti na RA4 (ukoliko se ne koriste interapti za brojanje) ili RB0(ukoliko se koriste interapti za brojanje) pin. RB0 pin se ponaša kao ulaz sa šmitovimokidačem jedino kada je podešen za interapte. Ukoliko je daljina od mikrokontrolerado NE555 previše velika, možete povećati napon napajanja NE555. Za još većedaljine može se kombinovati NE555 sa RS485 drajverom. U stvari kako je ovde

 potreban jedino predajnik, deo integrisanog invertora signala (7406) biće dovoljan.Ukoliko umesto promenljivog otpornika postavite stalan otpornik malog stepenatolerancije dobijate odličan merač kapacitivnosti upotrebljenog kondenzatora.

Detalje o ovom principu imate na http://www.globu.net/pp/english/PP/ne555.htm. Tu

se nalaze podaci o frekvencijama u zavisnosti od kapacitivnosti i otpornosti.

144

Page 145: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 145/209

65. Konverzija napona u frekvenciju

Konvertor napona u frekvenciju (eng. VCO - Voltage Controlled Oscilator – naponskikontrolisani oscilator) u frekvenciju pretvara mereni napon.

 Nastavak sledi!

145

Page 146: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 146/209

66. Integrisani A/D konvertori

Pretpostavimo da Vam je potreban A/D konvertor koji bi brzo merio željeni napon, nezahtevajući pri tome intervenciju mikrokontrolera (npr. prilikom snimanja ikompresije zvuka). U tom slučaju najpraktičnije je koristiti integrisane A/Dkonvertore žrtvujući određen broj pinova za očitavanje podataka iz njih. Tipični

 predstavnici integrisanih A/D konvertora su ADC0831, LTC1298, MAX 190 ili MAX191.

Ponekad je potrebno meriti veliki dinamički opseg napona. Većina integrisanih A/Dkonvertora sposobna je meriti jedino napone od 0 do +5V. MAX134 je specijalnonamenjen za ugradnju u mernim instrumentima, pa se njegov opseg merenja možemenjati u širokim granicama, omogućavajući na taj način merenje napona u opsezimaod 0 do 399,9mV rezolucijom od 0,1mV, pa sve do 0 do 399,9V rezolucijom od 0,1V.

146

Page 147: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 147/209

67. Kompenzacija nelinearnihkarakteristika

Senzori koje upotrebljavate pri merenju obično nemaju linearnu karakteristiku. Na

 primer NTC otpornik će pri 10oC imati otpornost od 1kΩ, pri 20oC 2kΩ, pri 30oC4kΩ i pri 40oC 8kΩ. Očigledno je da on umesto linearne ima logaritamskukarakteristiku. Iako se matematičkim formulama (npr.  Steinhart-Hart ili metodomlinearizacije kao u AN942) može ispraviti njegov opseg, često razni drugi faktoriutiču na pogoršanje linearnosti. Te faktore izaziva princip A/D konverzije, promenatemperature oscilatora, kablova do senzora ili upotrebljenog VCO konvertora. Da bise dobila što tačnija merenja potrebno je na odgovarajući način kompenzovatinelinearna izobličenja kako upotrebljenog senzora tako i svih ostalih činilaca.

Jedan od načina kompenzacije nelinearnosti je crtanje grafika izmerenih vrednosti. NaX osi postavlja se redni broj merenja koji će na odgovarajući način biti prikazanmikrokontrolerom (npr. 0 do 50 rezolucijom od 1oC ili 0 do 100 rezolucijom od ½oCza temperaturni opseg od 0oC do 50oC), a na Y osi vrednost fizičke veličine izmerenemikrokontrolerom i kalibrisane instrumentom veće klase preciznosti. Dalje je

 potrebno softverski svakoj vrednosti sa X ose pridružiti (najčešće preko tabele)odgovarajuću vrednost sa Y ose. Očigledno je da je radi bolje preciznosti grafikaneophodno da merenja budu što preciznija, i sa što više mernih tačaka.

Kako bi smanjili broj potrebnih merenja, dipl. ing. Lazar Pančić i dipl. ing. BojanMitić su Vam pripremili program za interpolaciju merenih vrednosti. On na osnovu

 par zadatih tačaka računa vrednosti preostalog broja potrebnih tačaka. Izlazni .txt fajl programa možete editovati prema svojim potrebama i iskopirati ga u sopstveni program. Pri tome niste ograničeni samo na upotrebu PIC mikrokontrolera.

Program je ispitan pod Win98 i Win2000, a dostupna je i njegova Linux verzija.Besplatan je (dat je čak i izvorni kod) i nalazi se na mom sajtu čiji link možete naći na

kraju ovog uputstva.

147

Page 148: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 148/209

68. Datalodger

Datalodger predstavlja uređaj koji snima semplovane podatke (obično u eksterniEEPROM) i iz koga je potrebno povremeno spolja iščitavati podatke. U ranijim

 primerima videli ste kako se može meriti nivo reke. U međuvremenu ste naučili iupotrebu A/D konvertora, I2C i RS232 komunikacionog protokola.

Sada i nije teško zamisliti meteorološku stanicu sa anemometrom (meračem brzinevetra), hidrometrom (meraćem vlažnosti vazduha), termometrom i meračem smeravetra. U slučaju da se sve ove veličine dobijaju u analognom obliku, dovoljno jedovesti ih u A/D konvertor i nakon toga u PIC. Semplovi svih konvertovanih napona

 povremeno se snimaju u eksternu EEPROM memoriju preko I2C veze, a ona se periodično prazni preko RS232 veze u kompjuter.

Kompjuter bi onda mogao analizirati dobijene podatke i predvideti na primer pojavu

suše ili kiše. Uz više istovremeno povezanih sistema (više udaljenih merača) mogla bise sa priličnom tačnošću predvideti mikroklima određenih područja.

148

Page 149: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 149/209

69. Kontrola temperature

 Ništa lakše. Dovoljno je povezati senzor na A/D kontroler, i zadati mikrokontrolerugraničnu vrednost rezultata A/D konverzije. Ukoliko na primer senzor kao rezultat A/D konverzije broj manji od .175 uključiće se relej grejača, a za broj .175 (ili veći) kojiodgovara temperaturi od 25oC isključiće se relej. Ilustracija ovoga mogla bi ovakoizgledati:

 movlw .175 ; Zadata vrednost temperaturesubwf AD,W ; W = AD - .175

 btfss STATUS,C ; Testiraj prekoračenjegoto Ukljuci ; AD < .175goto Iskljuci ; AD >= .175

Da li je ovo dobar način kontrole? Nije!

Svi senzori podložni su smetnjama. Šta može izazvati te smetnje? Za početak, tu jesam mikrokontroler. Njegov takt oscilatora proizvešće malo smanjenje i povećanjenapona napajanja. Dalje, tu su uređaji koji se kontrolišu mikrokontrolerom. Primultipleksu LED displeja najviše struje trošiće displej na kome se prikazuje broj 8(tada su sve pojedinačne LED uključene), a najmanje onaj sa brojem 1 (uključenasamo dve LED). Ne mora to obavezno biti LED displej. Isti efekat prouzrokovaće irelej grejača. Sledeća je vaša komšinica sa svojim (made in China) usisivačem. Iakoće dekapling kondenzator u dobroj meri eliminisati ove smetnje, jedan deo će sesvakako preneti i do senzora, i tu će proizveti šum.

Upravo je taj šum poguban za uspešnu kontrolu temperature. Sa njim će pri istojtemperaturi rezultat A/D konverzije jednom biti 170, a drugi put 180, što ćemikrokontroler shvatiti kao odgovarajuću promenu temperature, i brzo će uključivati iisključivati relej. Kontakti običnih releja jednostavno nisu namenjeni za takav rad, irelej će posle par nedelja stradati.

Šta je rešenje? Reći mikrokontroleru da promeni stanje jedino ukoliko se izmerenatemperatura dovoljno (npr. za .10) udaljila od zadate vrednosti (.175), slično kao štoto šmitov okidač radi hardverski. Znači, da uključi grejač ukoliko je očitana vrednost165 i manja, i da ga isključi ukoliko je očitana vrednost 185 i veća. Ovde je najboljeradi što manjeg variranja temperature podesiti granične vrednostzi, tako da se postigne

kompromis između češćeg rada releja i spoljnih smetnji.

Da li je sada sve u redu? I dalje ne mora da bude.

Ukoliko je senzor temperature postavljen u blizini grejača, umesto merenjatemperature prostorije, meriće se temperatura grejača. Tako će pri uključenju grejačarezultat A/D konverzije veoma brzo postati .255, odnosno, i dalje će se relej previše

 brzo uključivati i isključivati. Ovo se može rešiti udaljavanjem senzora na mesto gdeneće direktno osećati temperaturu grejača.

Ovo bi moglo biti dovoljno dobro rešenje za ON/OFF (uključi/isključi) kontrolugrejača (relejom). Međutim, nekada ON/OFF kontrola jednostavno nije dovoljna. U

149

Page 150: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 150/209

tim situacijama koristi se kontinualna regulacija snage, faznim pomakom triaka(slično kao PWM za jednosmerni napon).

Uzmimo za primer da želite u dvorištu napraviti inkubator za jaja. Ovde je radi štomanjih oscilacija temperature poželjno koristiti kontinualnu regulaciju. Međutim, štasa situacijom kada napolju počne da pada kiša (odjednom zahladni)?

Uz dovoljno dobro toplotno izolovan inkubator, neće biti nikakvih problema. Alinekada jednostavno nemamo dovoljno stiropora (i opet je sneg iznenadio naše putare).U ovom slučaju potrebno je mikrokontroleru dodati još malo logike.

Osim temperature potpuno isti principi primenjuju se za kontrolu bilo koje fizičkeveličine. Više o ovim kontrolnim procesima imate u časopisima Circuit Cellar br. 17 i19.

150

Page 151: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 151/209

70. Rotacioni enkoder

Verovatno Vam je poznata uloga potenciometra u analognoj elektronici. On menjasvoju otpornost u zavinosti od položaja osovine, pomeranjem kontakta klizača prekootporne površine. Na taj način realizovano je na primer pojačanje zvuka nakasetofonu.

Analogni potenciometri imaju par mana. Kao prvo njihovi kontakti nisu večni. Oni sukao i kontakti mehaničkih prekidača podložni varničenju (eng. Bouncing). Otudakrčanje pri pojačavanju i smanjenju zvuka. Još gore, ukoliko upotrebite A/Dkonvertor da prevedete stanje analognog potenciometra u digitalni oblik, moguće je dakontakti potenciometra baš u trenutku merenja usled lošeg spoja budu odvojeni odotporne površine, što će prouzrokovati očitavanje maksimalne otpornosti.

Sledeća mana analognog potenciometra odnosi se na položaj njegove osovine pri

graničnim vrednostima. Koliko puta ste morali menjati gumicu na slavini jer je neko previše zavrnuo? Isto je i sa analognim potenciometrom. Ne možete očekivati odkorisnika da će biti „nežan“ prema svojim uređajima. Bolje stavite manju kapicu naosovini. Neće se moći previše jako pritisnuti.

Postoji više vrsta rotacionih enkodera. Po načinu konstrukcije mogu biti mehanički,optički i magnetski. Mehanički imaju najviše nedostataka zbog varničenja svojihkontakata i manje rezolucije.

Po obliku signala koji se može dobiti na izlazu digitalnih potenciometra postojeenkoderi sa apsolutnim adresiranjem koji na svom izlazu direktno daju binarni kod (4-

 bitni, 6-bitni, 8-bitni), ili koji koriste malo drugačiji format brojanja (tzv. sivi eng.Grey code) i enkoderi sa relativnim adresiranjem. U daljem opisu biće opisana jedinoupotreba rotacionih enkodera sa relativnim adresiranjem (eng. relative rotary encoder,incremental rotary encoder ili quadrature encoder). Za detaljniji opis posetitehttp://en.wikipedia.org/wiki/Rotary_encoder .

Relativni rotacioni enkoder treba sprovesti odgovarajuće obrtno kretanje osovine umikrokontroler. Međutim, za razliku od apsolutnog enkodera PIC ne mora znatikolika je njegova trenutna vrednost u svakom trenutku. Čemu to. Ionako će jeinicijalizovati po uključenju (npr. čitanjem iz EEPROM-a). Dovoljno je dati mu

 podatak u kom smeru se okreće osovina enkodera (kao kod običnih taster prekidača – 

levo-desno), a mikrokontroler će to stanje softverski uporediti sa prethodnim i naosnovu rezultata izvršiti predviđenu operaciju. Ovo uvodi značajnu prednostrotacionih enkodera u tome što kod njih nema graničnih položaja. Drugim rečima,možete okretati njihovu osovinu koliko god želite, kao kod Nautilus slavina.

Signal dobijen sa relativnog rotacionog enkodera u jednom trenutku može imati stanja prikazana usledećoj tabeli:

--> Rotacija u smeru kazaljke na satu -->

00 01 11 10 00

<-- Rotacija suprotno od smera kazaljke <--

151

Page 152: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 152/209

Kao što vidite, ukoliko se signal menja u smeru 00, 01, 11, 10 to znači da se osovinaokreće u smeru kazaljke na satu. U suprotnom (10, 11, 01, 00) osovina enkodera seokreće u suprotnom smeru. Takvo stanje signala omogućava da poređenjem

 prethodnog i sadašnjeg stanja lako otkrijemo u kojem se smeru okreće osovina. Na primer, ukoliko je prethodno stanje bilo 11 a sadašnje je 01, osovina se okrećesuprotno od kazaljke na satu.

Iako Vam može izgledati da su rotacioni enkoderi spori, to nije slučaj. Oni mogu imatii preko 255 položaja za samo 1 okretaj osovine. Može se desiti da zbog sporostimikrokontrolera (ukoliko izvršava i druge operacije za vreme okretanja

 potenciometra) PIC nakon stanja 10 detektuje stanje 01 što je očigledno greška. Jošgore, pri previše brzom okretanju npr. u smeru kazaljke na satu moguće je da nakonstanja 01 ne očita (zbog sporoti) sledeća 2 stanja (11 i 10), već tek treće (00), pa naosnovu toga može zaključiti da je osovina okrenuta u suprotnom smeru.

Kod mehaničkih rotacionih enkodera situacija je još složenija, jer se mora izvršavati idebouncing rutina. Ona se uglavnom može uprostiti tako što se umesto nje za jednu

 promenu stanja enkodera traži uzastopan sled 2 ili više ispravnih stanja. Na taj način je postignuta ispravna detekcija žtrvovanjem rezolucije enkodera.

Ukoliko ne želite izgubiti na rezoluciji možete između mehaničkog enkodera imikrokontrolera postaviti hardverski debouncing (sa rednim otpornikom između pinamikrokontrolera i enkodera i kondenzatorom između izlaza enkodera i mase). Što jeveća kapacitivnost kondenzatora, veća će biti imunost na smetnje varničenja, ali ćemaksimalna brzina okretanja osovine enkodera biti srazmerno manja. Obično jedovoljna vrednost od 10nF. Upotrebljeni kondenzatori moraju biti odabrani premamaksimalnoj rezoluciji i maksimalnoj procenjenoj brzini okretanja osovine enkodera.

Kako će se stanje osovine enkodera najverovatnije retko kada menjati, najpraktičnije je povezati izlaze rotacionog enkodera na interapt ulaze mikrokontrolera. U slučaju da je potrebno snimanje trenutne (apsolutne) vrednosti položaja osovine rotacionogenkodera u EEPROM, praktičnije je snimiti je tek nakon što se osovina prestane

 pomerati (na primer 6S nakon zadnjeg signala). Na taj način štiti se EEPROM.

Više detalja o upotrebi relativnih rotacionih enkodera imate na sajtuhttp://www.mcmanis.com/chuck/robotics/projects/lab-x3/quadratrak.html.

Trebate shvatiti da rotacioni enkoderi ne mogu zameniti analogne potenciometre u pravom smislu te reči. Oni nemaju nikakvu vezu sa promenom otpornosti. To su samodigitalni davači položaja osovine. Međutim, to ne znači da se (u kombinaciji samikrokontrolerom) ne mogu upotrebiti kao potenciometar. Dovoljno je očitanuvrednost dovesti na D/A konvertor i imate izlazni napon proporcionalan položajuosovine enkodera. Taj analogni izlazni napon možete koristiti kao izvor napajanja za

 predpojačavač kasetofona, čime ste dobili odličan regulator jačine zvuka. Postojeintegrisana kola koja izvršavaju upravo tu operaciju bez upotrebe D/A konvertora(DS1669, TDA8551). A ukoliko ste baš rešeni da dobijete promenljivu otpornost

 povežite na PIC bilo koji pretvarač digitalnog signala u otpornost. Na primer DF1704.

152

Page 153: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 153/209

71. Regulacija smera i brzinekolektorskih DC motora

Pod kolektorskim DC motorima podrazumjevaju se motori jednosmerne struje sa

četkicama. Velikom broju kolektorskih motora jednosmerne struje moguće je menjatismer i brzinu. Na primer malim motorima iz vokmena ili kasetofona, motorimaventilatora za hladnjak automobila, pa sve do motora za viljuškare. Princip njihovograda je isti, a razlikuju se jedino po svojoj potrošnji i dimenzijama.

Kako motori najbolje iskorišćenje imaju pri svom nominalnom naponu napajanja, da bi im se promenio (smanjio) broj obrtaja nije baš praktično koristiti D/A konvertor zasmanjenje tog napona. Umesto toga koristi se PWM princip D/A konverzije, ali bezintegratora (otpornika i kondenzatora). Na taj način motoru neće biti smanjena snagaobrtanja osovine (usled smanjenog napona napajanja), već će se snaga regulisatiPWM odnosom punog napona napajanja.

Za promenu smera okretanja osovine motora koristi se poznata osobina kolektorskihmotora da im se rotor može okretati u suprotnom smeru prilikom promene polaritetanapona napajanja (oprez – neki motori pri tome imaju smanjenu snagu). Iz tog razloga

 potrebno je promeniti smer napona napajanja motoru. Stoga se izlazi mikrokontrkora povezuju sa drajverom u obliku tzv. H-mosta (eng. H-bridge), koji obezbeđujeneophodnu promenu polariteta. Više o ovome imate na sajtu:www.mcmanis.com/chuck/Robotics/tutorial/h-bridge/index.html 

Kako kolektorski motor može u trenutku uključenja povući mnogo veću struju odnominalne, poželjno je galvanski ga odvojiti od mikrokontrolera. Takođe, potrebno jeosigurati se da kvar mikrokontrolera ili nepravilna sekvenca na njegovim izlazima nemože dovesti do kratkog spoja kroz tranzistore zaobilazeći motor. Oba problemauspešno su rešena električnom šemom sa sajta:www.mcmanis.com/chuck/Robotics/tutorial/h-bridge/bjt-circuit.html 

Radi manjeg opterećenja motora, drajvera i mehaničkih elemenata, prilikom promenesmera potrebno je postepeno usporiti motor (smanjivanjem PWM odnosa), zatim gazakočiti, a tek onda polako ubrzavati (povećanjem PWM odnosa) u suprotnom smeru.Ukoliko ovo ne ispoštujete (pri maksimalnoj brzini u jednom smeru dovedete signalza maksimalnu brzinu u suprotnom smeru) efekat će biti isti kao kod automobila koji

iz četvrte brzine ubacite u rikverc.Pre testiranja na hardveru simulirajte program i proverite da li ste motoru ostavilidovoljno vremena za zaustavljanje. Usporavanje, kočenje i ubrzavanje neće imatisvoju funkciju ukoliko se završe za samo 0,1S.

153

Page 154: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 154/209

72. Potrošač kao senzor 

Znate li zašto nova, tek kupljena sijalica po prvom uključenju pregori? Nemojte semučiti. Miki, profesor električnih mašina Elektrotehničke škole u Aleksincu postavio

 je nama učenicima to pitanje. Posle pola školskog časa, morao je sam odgovoriti nanjega. Nijedan ponuđeni odgovor nije bio tačan.

Volframova sijalica ima pozitivni temperaturni koeficijent otpornosti (eng. PTC). Toznači da joj je otpornost dok kroz nju ne protiče struja niska, reda oma. U trenutkuuključenja (dok je još hladna), kroz nju prođe i do 10 puta veća struja. Međutim, pri

 propuštanju ove struje volframovo vlakno se zagreje i poveća svoju otpornost na višedesetina oma, što ograničava dalje povećanje struje. Ukoliko u proizvodnom procesuvolframovo vlakno nije pravilno dimenzionisano (npr. prekratko je), njegovaotpornost neće se po prvom uključenju dovoljno povećati, struja se neće dovoljnoograničiti i ono će se zato istopiti. Iz tog razloga se kod skupljih halogenih sijalica

 ponekad primenjuje elektronsko kolo sa ograničenjem maksimalne struje (eng. currentlimiter) ili postepenim povećanjem struje (eng. soft start).

Pretpostavimo da želite izmeriti električnu otpornost sijalice dok je volframovovlakno još usijano. Jasno je da to možete uraditi primenom omovog zakona imerenjem napona i struje, ali možete li to uraditi direktno? Uz mikrokontroler i ovo jemoguće. Pretpostavimo da se sijalica napaja sa 5V jednosmerne struje (ne pokušavajteovo uraditi sijalicom od 220V iz bezbednosnih razloga). Pinom RA0 se preko

 prekidačkog tranzistora uključuje i isključuje relej. Sijalica je povezana direktno na+5V i na relej, njegov mirni kontakt (isključen relej) povezan je na paralelni A/Dkonvertor na PORTB, a radni kontakt (uključen relej) na masu.

Setovanjem RA0 pina, uključuje se relej, i sačeka se da sijalica zasvetli.Resetovanjem RA0 pina isključuje se relej i sijalica se (i dalje vruća) prebacuje na A/D konvertor. Struja koja prolazi kroz interne otpornosti A/D konvertora je toliko malada ne može u velikoj meri uticati na dalje zagrevanje sijalice. Brzim nizom merenjamože se u registre mikrokontrolera primenom indirektnog adresiranja snimiti grafik opadanja otpornosti usled hladjenja sijalice. Čak se može merenjem proteklogvremena do minimalne otpornosti sijalice grubo izmeriti spoljna temperatura (sijalicaće se brže hladiti ukoliko je spoljna temperatura niža)! Zazmislite bojler, kome jesenzor temperature njegov sopstveni grejač. Samo kad ne bi imao toliko kamenca!

Ovaj princip nije ograničen samo na sijalicu. Električni motori jednosmerne struje prilikom isključenja inercijom nastavljaju svoj rad, pri tome radeći u generatorskomrežimu. Na njihovim kontaktima može se A/D konvertorom izmeriti generisani napon,i na osnovu njega, po potrebi, D/A konvertorom kalibrisati brzina motora. Po istom

 principu vetrenjači se može fino regulisati ugao zakretanja krila u zavisnosti odgenerisanog napona (čime bi se sprečio njihov lom pri prejakom vetru), a akumulatoruomogućiti naizmenično punjenje i testiranje napunjenosti.

Iako nema direktne veze sa potrošačima, verovatno će Vas zanimati kako možeteobičnu LED upotrebiti za senzor osvetljenosti. Detalje imate na sajtuhttp://free-vz.t-com.hr/Ivica-Novakovic/index.html. 

154

Page 155: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 155/209

73. Servo motori 

Servo motori predstavljaju obične kolektorske DC motore kojima je dodatodgovarajući davač položaja, odnosno brzine. Na taj način možete biti sigurni da jemotor napravio tačno toliko i toliko obrtaja. Ovo bi Vam moglo biti potrebno prilikomregulacije protoka vode ili vazduha pomičnim pregradama, konstrukcije CNC mašine,ili precizne regulacije brzine motora. Servo motori obično imaju reduktore prekokojih im se smanjuje brzina (a povećava snaga) u određenom opsegu.

Kako se osovina motora okreće prilično brzo, najpraktičnije je uzimati signal saosovine reduktora. On je tu i precizniji zbog zazora koji može eventualno postojati(npr. prilikom redukcije kaiševima kao kod starijih veš mašina). Signal se sa osovinemože dovesti u PIC na više načina. Ukoliko osovina reduktora ne zatvara pun krug(npr. za pozicioniranje antene), moguće je osovinu reduktora povezati na običananalogni potenciometar. Taj princip objašnjen je u AN531.

Za ostale primene možda bi pogodniji bio način sa rotacionim enkoderom. On jeobjašnjen u AN718.

Motori koji se i pored reduktora ne mogu dovoljno brzo zaustaviti (imaju velikizamajac) moraju pored rotacionog enkodera primenjivati usporavanje, kočenje paubrzanje. To je objasnjeno u AN532

Ponekad se rotacioni enkoder ne može upotrebiti zbog prevelike maksimalne brzinemotora. Na sreću, odgovarajuće davače položaja osovine motora nije teško napravitiuz par odgovarajućih senzora. Više o tome imate u AN569 i AN894.

155

Page 156: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 156/209

74. Step motori

Step motori predstavljaju specijalan oblik motora prilagođenih preciznoj regulaciji položaja osovine. Nisu namenjeni za rad sa većim brzinama već im se osovina usvakom trenutku može naći u jednom od tačno definisanih položaja (koraka eng.step). Ukupnim brojem koraka određen je ugao pomeranja osovine. Uz 200 koraka,ugao između dva koraka je 360o / 200 = 1,8o.

Za svoje upravljanje koriste odgovarajuće sekvence slične onima iz rotacionihenkodera.

Po samom principu njihovog rada očigledno je da im za razliku od servo motora nije potreban ikakav oblik povratne informacije o položaju. Dovoljno je prilikominicijalizacije vratiti osovinu step motora do početnog položaja, a zatim je okrenuti zaželjeni broj koraka.

156

Page 157: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 157/209

75. Detekcija prolaska napona kroz 0

Često se javlja potreba da se mikrokontrolerom treba detektovati prolazak naizmeničnog napona kroz 0. Na primer pri konstrukciji dimera volframske sijalice ili

 pri konstrukciji sata taktovanog mrežnom frekvencijom od 50Hz. Ukoliko je u pitanjunizak napon, nema nikakvih problema. Dovoljan će Vam biti jedan tranzistor, dioda i

 par otpornika.

Slika

Međutim, ukoliko mikrokontroler treba detektovati prolazak kroz 0 za 220V, ovajnačin nije moguće koristiti zbog prevelikog napona na bazi tranzistora i iz

 bezbednosnih razloga. Da bi se ovaj problem prevazišao, može se koristiti sledećaelektrična šema:

Slika

Možda se pitate zbog čega je ovoliko gradiva posvećeno upravo analognoj elektronici.PIC16F84 sam po sebi ne ne može mnogo toga. Da bi radio išta korisno potrebno jedovesti mu spolja neke signale. Da li će to biti signal sa termometra, tahometra,aeromerta, hidrometra, barometra ili termopara u ovom trenutku nije bitno. Bitno je dasenzori ove signale uglavnom daju u analognom obliku. Ukoliko ne postoji način dase oni očitaju i da se na osnovu dobijenih informacija preduzme određena akcija (npr.navodnjavanje povrća u plasteniku ili aktiviranje alarma), džabe ste kupovali PIC.

157

Page 158: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 158/209

76. Integrisana kola 4000 i 7400 serije

U digitalnoj elektronici se za realizaciju jednostavnih zadataka uglavnomupotrebljavaju popularna integrisana kola serije 4000 ili 7400 (poznatija kao CD4000i SN7400). Njihova glavna prednost je niska cena i laka dostupnost. PIC16F84 semože bez problema povezivati sa obe serije integrisanih kola. U ovim kolima su nahardverskom nivou implementirane jednostavne logičke operacije, brojači,multiplekseri, pomerački registri, displej drajveri i dr. tako da su mnogo brža odmikrokontrolera.

Ukoliko Vam iz bilo kog razloga zatreba neka funkcija koja nije implementirana uPIC16F84, možete ga direktno povezati sa odgovarajućim integrisanim kolom, kojerealizuje pomenutu funkciju.

Uputstvo koje detaljno objašnjava funkcije osnovnih logičkih kola možete naći na

http://www.ibiblio.org/obp/electricCircuits/Digital/index.html sajtu.Knjiga koja isto tako detaljno obrađuje ovu temu je „Elektronika digitalnih računara“Alberta Paula Malvina. Iako je izdata još 1981, toliko postupno izlaže gradivo, da jenjen sadržaj i dalje aktuelan. Jedini zastareli deo u knjizi jeste opis odavno

 prevaziđenih magnetskih memorija.

 Neki od programa koji Vam mogu pomoći u simuliranju osnovnih logičkih kola su:

● Logisim

● Dig ital Simulator 

● Dig ital Works

Kako obe serije za povezivanje sa mikrokontrolerom koriste adresnu magistralu, brzina komunikacije će biti ograničena jedino hardverom, ali će se i zanajjednostavnije operacije morati utrošiti veći broj pinova.

158

Page 159: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 159/209

77. Multipleksiranje izlaza

PIC16F84 ima 13 ulazno izlaznih pinova. Samim tim izgleda nemoguće spojitidirektno na mikrokontroler više od 13 LED. Međutim, primenom multipleksiranjamoguće je direktno na mikrokontroler spojiti mnogo veći broj LED.

Kako radi multipleksiranje. Znate i sami da je televizijski prikaz moguć jedino zbogtromosti ljudskog oka. Ovde je primenjen sličan pristup.

Pogledajte sledeću šemu. Anode LED spojene su na PORTB, a katode na tranzistore.

Sa ovom šemom omogućeno je upravljanje matricom od 32 LED.

RA4 pin PORTA registra se ovde ne koristi, jer ne može dati na svom izlazu logičku jedinicu. Međutim uz malo trikova (zamenom polariteta LED i povezivanjemtranzistora na naponu napajanja) i on može biti u funkciji. U praksi se uglavnom sreće

 potreba za bar jednim ulazom, tako da se taj način ne praktikuje. Najpre je potrebno isključiti sve prekidačke tranzistore dovođenjem logičke 0 uPORTA. Zatim je potrebno na PORTB registru postaviti stanje 8 LED u prvoj koloni,i na kratko (obično oko 20mS da se prosečan intenzitet svetlosti ne bi previšesmanjio) uključiti prekidački tranzistor na RA0 pinu. Diode na koje je dovedenalogička 1 će na trenutak zasvetleti. Onda se postavlja stanje LED druge kolone, i nakratko uključuje tranzistor na RA1 pinu. Postupak se ponavlja dok se ne prikažestanje i na zadnjoj (četvrtoj) koloni, kada se celokupan proces ponavlja.

Zbog tromosti oka, izgledaće kao da LED neprekidno svetle. LED će svetleti manjim

intenzitetom nego inače, ali to se može nadoknaditi propuštanjem veće struje kroz njih(smanjivanjem vrednosti otpornika na pinovima PORTB registra), ili podešavanjemdužine uključenog stanja, tako da se postigne kompromis između jačine svetla dioda injihovog treperenja.

Rutinu za ispis stanja na displeju, najpraktičnije je realizovati u interapt rutiniizazvanoj tajmerom. Na taj način prikaz stanja LED ne utiče (previše) na rad glavnog

 programa.

 Na isti način moguće je prikazati odgovarajuće cifre na više sedmosegmentnihdispleja.

159

Page 160: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 160/209

Svi izvodi svih zajedničkih segmenata (a, b, c, d, e, f, g, i dp – ukupno 8 izvoda)spojeni su preko otpornika za PORTB mikrokontrolera. Zajedničke katode displejaspajaju se preko prekidačkog tranzistora na PORTA.

 Najpre se isključuju svi prekidački tranzistori dovođenjem logičke 0 u PORTA. Zatim je potrebno na PORTB registru postaviti sliku cifre prvog displeja, i kratko uključiti prekidački tranzistor na RA0 pinu. Onda se postavlja slika cifre drugog displeja, i nakratko uključuje tranzistor na RA1 pinu. Postupak se ponavlja dok se ne prikaže cifrai na zadnjem (četvrtom) displeju, kada se celokupan proces ponavlja.

U praksi se može videti ovakav princip realizovan bez ikakvih opornika i prekidačkihtranzistora, odnosno direktnim povezivanjem displeja na PIC. Njegova mana je

 povećana potrošnja, samim tim i grejanje mikrokontrolera kao i nejednakost svetla pojedinih cifara. Ovo stoga što pin za prekidanje displeja mora kroz sebe propustitistruju svih segmenata displeja, pa samim tim intenzitet svetla nije isti kada je nadispleju prikazan broj 8 (uključeni svi segmenti) i broj 1 (uključeni segmenti b i c).

Broj pinova može se smanjiti upotrebom LED drajvera 4000 ili 7400 serije.

4511 integrisano kolo predstavlja drajver za sedmosegmentni LED displej. Kada muse na ulaz dovode binarni brojevi od 0 do 9, na izlazu uključuje određene segmenteLED displeja. Umesto 4511, može se koristiti 7447.

Postupak je isti kao i ranije, sa tim što umesto odgovarajućeg obrasca za prikaz nadispleju, na ulaze 4511 treba dovesti binarni broj od 0 do 9. Segment decimalne tačke(dp), morao je biti doveden direktno na mikrokontroler, jer 4511 (i 7447) imamogućnost prikaza samo jedne cifre. Ukoliko se decimalna tačka ne koristi, dobićete

 još jedan slobodan pin.

Za detaljni opis povezivanja 4511 ili 7447 integrisanih kola, skinite sa interneta

njihove tehničke podatke.

160

Page 161: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 161/209

78. Komplementarno povezivanje LED

Poznato vam je da pin može biti postavljen kao izlaz na visokom logičkom nivou, kaoizlaz na niskom logičkom nivou, i kao ulaz kada je u stanju visoke impedanse.Sledeće kolo koristi sva tri stanja jednog pina, za pogon 2 LED.

Da bi se ovo kolo moglo primenjivati, potrebno je izmeriti određene parametre.Voff1 – maksimalni napon pri kome LED1 ne emituje svetloVoff2 – maksimalni napon pri kome LED2 ne emituje svetloVon1 – miniminalni napon pri kome LED1 emituje svetloVon2 – miniminalni napon pri kome LED2 emituje svetloIon1 – željena struja kroz LED1 pri uključenom stanjuIon2 – željena struja kroz LED2 pri uključenom stanjuVcc – napon napajanja

Potrebni proračuni su sledeći:Ion1 = [ (Vcc-Von1)/R1 ] - [ Von1/(R2+R3) ]Ion2 = [ (Vcc-Von2)/R2 ] - [ Von2/(R1+R3) ](Voff1+Voff2)/R3=Vcc-Voff1-Voff2/(R1+R2)

Da bi se smanjila nepotrebna potrošnja struje potrebno je za R3 izabrati što većuvrednost, bez uključivanja LED pri ulaznom stanju pina. Približne vrednosti otpornika(za struju od 8mA po uključenoj LED) su sledeće: R1=300Ω, R2=300Ω, R3=1,2kΩ.

Uključenje LED1 postiže se postavljanjem pina na logičku 0, LED2 na logičku 1,isključenje obe LED prelaskom pina u visokoimpedansno stanje (postavljen kao ulaz),a uključenje obe LED neprestanim naizmeničnim dovođenjem logičke 0 i 1 na pin (zato je najpraktičnije koristiti interapt izazvan tajmerom).

Za razliku od standardnih multipleksa, ovo kolo troši čak 2,5mA u stanju isključenihLED, pa nije pogodno za baterijsko napajanje. Praktičnije je koristiti multipleks. Ovde

 je ilustrovano samo kao primer onoga što trebate izbegavati u svojim aplikacijama.

 Na sličan način možete povezivati i mnogo veći broj LED. Za detalje pogledajteTB029 sa http://www.microchip.com/.

U literaturi se ovaj princip može naći i pod nazivom Charlieplexing.

161

Page 162: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 162/209

79. LCD - pojam

Pre svega trebate znati da postoji više vrsta LCD (Liquid Crystal Display). LCD usvom najosnovnijem obliku možete videti na digitalnom satu, digitronu ili videoigricama. Cifre na LCD-u sastoje se (kao i kod LED displeja) od segmenata. Međutim,njima se za razliku od LED segmenata ne sme dovesti jednosmeran napon da bi

 postali vidljivi. Štaviše. Jednosmerni napon će ih uništiti. To znači da se određenomsegmentu da bi postao vidljiv mora neprekidno dovoditi naizmenični napon (kao kodmultipleksa pojedinih LED). Na sreću, i LCD može raditi u multipleksu, ali u dostadrugačijem obliku. Pri tome broj pinova za uključenje pojedinih displeja ostaje isti, ali

 jedan osmobitni port može kontrolisati maksimalno dva sedmosegmentna LCDdispleja (zajedno sa decimalnom tačkom). PIC16F84 bi prema tome mogao dadirektno kontroliše jednu do dve cifre displeja vašeg digitrona. Više o principudirektnog pogona LCD-a imate u AN563 sa http://www.microchip.com/.

Da bi se ovo ograničenje prevazišlo izmišljeni su tzv. inteligentni LCD. Oni poreddispleja imaju integrisano kolo koje služi da se preko manjeg broja pinova možeupravljati većim brojem segmenata LCD-a. Postoje dve opšte vrste ovih displeja.Alfanumerički i grafički. Na alfanumeričkim se mogu prikazati jedino slova i brojevi(videli ste ih na halo govornicama), a na grafičkim šta god želite (imate ih namobilnim telefonima). U ostatku teksta biće opisani alfanumerički inteligentnidispleji.

Integrisani kontroler alfanumeričkih inteligentnih displeja zadužen je za generisanjenaizmeničnog napona neophodnog za rad dispeja, za multipleks, za ispis skraćenogseta ASCII ili generisanje sopstvenog seta karaktera, pa čak i za treperenje i rotaciju

teksta na displeju. Uglavnom se kao kontroler koristi integrisano kolo HitachiHD48770 ili neki od njegovih kompatibilnih klonova.

Šta predstavlja ASCII set karaktera? U rano doba informatike svaki kompjuter (Commodore, Spectrum, Atari, Amstrad, Oric Nova, Pacom, Galaksija) imao jesopstveni format predstavljanja teksta. Kod nekih je veliko slovo A u memoriji bilo

 predstavljano brojem 0x00, kod nekih 0x21 a kod nekih 0x41. Mala slova takođe suimala nesuglasica. U nekim kompjuterima nisu ni postojala. Predstavljanje cifara

 brojeva i znakova interpunkcije je opet poseban slučaj. Svakako da je bilo potrebno naneki način standardizovati elektronski oblik zapisa teksta u računarima, kako bi se

 podatci sa jednih računara mogli bez konverzije koristiti na drugim. Tako je nastao

ASCII kod. Po njemu svaki karakter (slovo, broj ili znak interpunkcije) ima svoj jedinstven redni broj.

Ukoliko pažljivo zagledate alfanumerički LCD možete videti da mu se mesta zakaraktere (ćelije) sastoje od sitnih tačkica (piksela). Zatamnjivanjem određenih

 piksela dobija se slika (eng. pattern) karaktera u svakoj pojedinačnoj ćeliji. Obično seinteligentni LCD proizvode sa 8*2, 16*1, 16*2 20*2, 20*4, 24*2 ili 40*1 ćelija.

 Nema baš mnogo smisla koristiti PIC16F84 za ispis teksta na LCD-u ukoliko unjegovoj (ionako maloj) memoriji trebamo čuvati sliku (kao u tabeli za LED displeje)svakog pojedinačnog karaktera. Tu obavezu na sebe preuzima integrisani kontroler inteligentnog displeja. On ima ROM memoriju u kojoj se nalaze slike svakog

karaktera. Na taj način PIC treba poslati jedino ASCII kod odgovarajhućeg karaktera,

162

Page 163: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 163/209

a displej će se sam pobrinuti za sve ostalo. To može biti nedostatak ukoliko želite nadispleju prikazati naša slova (npr. ŠĐŽČ). Iz tog razloga predviđena je mogućnost da

 programer promeni sliku par specijalnih karaktera. Kako integrisani kontroler LCD-anema EEPROM memoriju, sliku ovih karaktera je neophodno čuvati u memorijimikrokontrolera i inicijalizovati u LCD-u po svakom uključenju.

Slika karaktera u ROM-u LCD-a obično se čuva u matrici od 5*7ili 5*8 piksela, ali na displeju je kod ponekih LCD-a moguće prikazati i proširenu matricu od npr. 5*10 piksela. Isključeni gornji

i donji pikseli jednostavno se neće videti. Nama ti dodatni pikseli mogu biti od koristiradi prikaza npr. slova Š.

Iako se displeji mogu razlikovati po broju i rasporedu ćelija, upotrebljenim fontovimaza karaktere, vrsti, načinu i boji pozadinskog osvetljenja, njihovo povezivanje namikrokontroler je prilično standardizovano. 14 pina koristi se za upravljanje LCD-om,a još 2 pina za pozadinsko osvetljenje. Ona mogu biti u istom redu sa ostalim

 pinovima, ili posebno izdvojena. Moguće je naći i LCD bez pozadinskog osvetljenja,

ali sa 16 pinova. Pri tome zadnja dva pina (15. i 16.) nisu povezana.

Pinovi LCD-a mogu biti postavljeni u jednom (16*1) ili u dva (8*2) reda.Obično su brojevima obeleženi bar krajnji

 pinovi. Na LCD-u na slici vidite jedan red pinova. Pinovi 15 i 16 povezani su(odozdo) na LED kao izvor pozadinskogsvetla (beli pravougaonik sa desne strane).

Funkcija pinova je sledeća:

 Pin Simbol Opis

1 VSS Masa

2 VDD Napajanje za kontroler  

3 VO Napajanje za LCD displej

4 RS (eng. Register selection)

5 R/W (eng. Read/write Selection)

6 E Enable pin Signal for LCM

7-14 DB0-DB7 Linije za podatke (0-7)

15 A Napajanje za LED (+)

16 K Napajanje za LED (-)

Kako LCD zahteva čak 8 pinova za prenos bajtova u LCD (DB0–DB7), kontroleromLCD-a je predviđena mogućnost upotrebe samo 4 pina (DB4-DB7) a osmobitni bajtse u LCD šalje u 2 grupe niblova. Ušteda 4 pina se svakako isplati.

Kako je kontroler LCD displeja u stvari jedan mali mikrokontroler, PIC16F84 treba

određenim protokolom (kao RS-232) u njega slati podatke. Dobro je što (sa izuzetkom

163

Page 164: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 164/209

startnog pulsa) ne postoji maksimalno vreme za koje se ovi podatci trebaju poslati. Nataj način mikrokontroleru ostaje prilično vremena za ostale operacije koje trebaobavljati. Ipak, podatci se na LCD ne smeju slati previše velikom brzinom, jer ih utom slučaju kontroler LCD-a neće moći ispravno primiti.

Enable (startni) pin možete smatrati pinom za isključenje LCD-a. Dok je na njemu

 prisutna logička 1, LCD neće reagovati na ostale signale. Na taj način moguće jeostale pinove LCD-a (kao u multipleksu) koristiti za neke druge operacije. Impuls zainicijalizaciju integrisanog kontrolera LCD-a mora trajati bar 450nS. Dok je startni

 Nastavak sledi

164

Page 165: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 165/209

80. Multipleksiranje ulaza

 Na sličan način kao u prethodnom poglavlju, moguće je realizovati više od 13 ulazamikrokontrolera.

Izvodi pinova mikrokontrolera spajaju se u matricu tako da su taster prekidači spojeniizmeđu čvorova. U ovom primeru na PORTB registar spojeni su pinovi RB0, RB1,RB2 i RB3, a na PORTA RA0, RA1 i RA2. Na taj način realizovana je matrica sa 12ulaza. Ona se inače najčešće koristi, jer npr. telefonske tastature (sa 12 tastera) koristeisti princip.

Radi lakšeg razumevanja pretpostavimo da su prekidači obeleženi brojevima od 1 do12. Najpre se PORTA registar postavi na b'00000111'. Zatim se RA0 pin postavi nalogičku 0, čime se u prvu kolonu dovodi nivo logičke 0. Redom se testiraju bitoviRB0 do RB3 PORTB registra. Ukoliko nijedan nije resetovan, nisu pritisnuti

 prekidači označeni sa 1, 4, 7 i 10. Onda se RA0 setuje, a RA1 resetuje. Ponovo setestiraju bitovi PORTB registra, ali ovoga puta za grupu prekidača 2, 5, 8 i 11. U

zadnjem prolazu setuje se RA1, a resetuje RA2, i testiraju bitovi koji odgovaraju prekidačima 3, 6, 9 i 12. Pull up otpornici moraju biti uključeni kako se na ulaznim pinovima ne bi javilo nedefinisano stanje. Zbog njih se testiranje obavlja za logičku 0.

Ukoliko je potrebno obaviti određenu operaciju po otpuštanju tastera, program mora pamtiti zadnje stanje odgovarajućeg tastera. U tom slučaju praktičnije bi bilo povezati pinove RB4 do RB7 u matricu, i po promeni stanja izazvati interapt. Interapt rutinatreba detektovati stanje pinova PORTA i PORTB registra, utvrditi koji bit je izazvaointerapt, i izvršiti zadatu operaciju. Otpornici od 100Ω su povezani radi zaštite odlažnog okidanja usled elektrostatičkih smetnji. Ukoliko se tastarura nalazi blizu (<2m)mikrokontrolera, mogu se izostaviti.

A ukoliko želite postići još više ulaza uz minimalni broj upotrebljenih pinova, možetekoristiti sledeću šemu.

165

Page 166: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 166/209

Pretpostavimo da su upotrebljeni pinovi RB0 do RB3, i da su prekidači obeleženidecimalno (1 – 12), kao u prošlom primeru. Pre svega, potrebno je uključiti pull-upotpornike. Onda treba definisati pin RB0 kao izlazni, a RB1, RB2 i RB3 kao ulazne i

 postaviti RB0 na logičku 0. Redom se testiraju stanja na RB1 (za pritisnut broj 6),RB2 (za broj 9) i RB3 (za broj 12). Zatim se RB0, RB2 i RB3 definišu kao ulazni, aRB1 kao izlazni sa logičkom 0, i testiraju se stanja na RB0 (za broj 3), RB2 (za broj

8) i RB3 (za broj 11). Postupak se ponavlja za pinove RB2 i RB3.

Ovaj način je softverski malo teži za implementaciju, jer se u istom registru moravršiti manipulacija između ulaznih i izlaznih stanja pinova (što povlači za sobom

 prelazak između banki). Međutim, njim je moguće testirati 12 prekidača sa samo 4 pina.

I u ovom slučaju mora se pamtiti zadnje stanje odgovarajućeg tastera ukoliko je potrebno obaviti određenu operaciju po njegovom otpuštanju.

Ovakvi načini testiranja tastera mogući su jer je (kao tromost oka kod multipleksa sa

LED) ovde primenjena tromost prsta kojim se pritiska prekidač. Naime, prosečnominimalno vreme za koje korisnik drži taster prekidač pritisnutim je oko 50 do100mS.

Lično sam imao zadovoljstvo da na kratko popričam sa prvakom Srbije u kucanju nateleprinteru (sprava poput električne pisaće mašine). Kuca 600 slova za 1 minut,odnosno 10 slova za 1S. Kod njega je ovo prosečno vreme sigurno nešto kraće.

Može li se još smanjiti broj potrebnih pinova? Naravno da može. Više o tome unarednim poglavljima.

166

Page 167: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 167/209

81. Dupli multipleks

Sledećom šemom realizovana je kombinacija multipleksa ulaza sa multipleksomizlaza. Na taj način pinovi PORTB registra imaju duplu funkciju.

Setite se multipleksa izlaza. Pic periodično postavlja stanje na LED segmentima i preko zajedničke katode uključuje kompletan displej. Zatim ga isključuje, pa postavljastanje na sledećem. Duplim multipleksom bi se u trenutku dok je su svi displejiisključeni testirali taster prekidači povezani paralelno sa displejima po principumultipleksa ulaza. Otpornici od 220Ω postavljeni su zbog ograničavanja struje krozLED segmente i smanjenja uticaja indukovanih napona na ulazima mikrokontrolera(samo 4 gornja), a otpornici od 2,2kΩ da ostali segmenti displeja ne bi zasvetleli pri

 pritiskanju prekidača dok je uključen neki od displeja.

 Najpre je da se ne bi javilo nedefinisano stanje na ulazima potrebno uključiti pull upotpornike. To se može uraditi prilikom inicijalizacije, na početku programa. Kako suLED displeji aktivni samo kada je PORTB definisan kao izlazni, ovo im neće smetati.

U multipleks rutini se u pauzi između uključenja displeja (dok su svi displeji prekoPORTA registra isključeni) RB0 do RB3 definišu kao ulazni, a RB4-RB7 kao izlazni

 pinovi. Redom se na RB4 do RB7 postavlja logička 0, i testiraju stanja na RB0, RB1,

RB2 i RB3 pinovima. Ukoliko je na nekom od njih prisutna logička 0, to indikuje pritisnut odgovarajući prekidač.

Po testiranju svih prekidača, pinovi PORTB registra definišu se kao izlazni, naPORTB se postavlja slika koja će se pojaviti na LED displeju i uključuje seodgovarajući displej.

Testiranje se može obavljati između cifara pojedinih displeja ili nakon što je prikazana slika na svim displejima. Koji ćete način odabrati zavisi od željene brzinetestiranja prekidača.

Za detalje pogledajte AN529 i AN557 sa http://www.microchip.com/.

167

Page 168: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 168/209

82. Kapacitivni prekidači

U ovom poglavlju naučićete kako se unutar PIC mikrokontrolera može implementiratidetekcija prisustva prsta korisnika u blizini određenog polja. Sećate se principa radawilkinsonovog A/D konvertora? On (pored otpornosti) može biti iskorišćen i zamerenje kapacitivnosti. Dovoljno je umesto promenljivog postaviti otpornik stalnevrednosti i što manje tolerancije. Kao jedna obloga kondenzatora koristi se veća

 površina pločice pertinaksa, a kao druga približen prst korisnika. Promena izmerenekapacitivnosti ukazuje na prisustvo druge obloge ovakvog kondenzatora (prsta) u

 blizini prve obloge. Kako je promena kapacitivnosti previše mala (5pF-15pF) da bi semogla dovoljno uspešno detektovati A/D konvertorom, obično se umesto jednogkoristi 255 ciklusa merenja, pri čemu se za njihovo brojanje može koristiti T0CKI pin.Frekvencija ovakvog oscilatornog kola direktno zavisi od kapacitivnostu izmeđuobloge i prsta. Njena promena iznosi od 1% do 5%. Za merenje ovako malih promenasu napredniji mikrokontroleri u prednosti zbog postojanja dva tajmera. Jedan se

koristi za brojanje impulsa, a drugi za generisanje vremenske baze.Ovaj efekat moguć je jer se ljudsko telo ponaša kao provodnik. Uz dovoljnu veliku

 površinu obloge i dovoljno malo rastojanje između obloge i prsta korisnika detekcija je prilično pouzdana. Naravno da je zbog svog principa rada podložnija smetnjama, alieliminacija mehaničkih prekidača utiče na smanjenje cene i lepši izgled projekta.Željeni oblik tastature može se odštampati na hartiji ili termootpornoj foliji (može senabaviti u knjižarama), i takva slika može se postaviti između stakla i obloge.

Kako se u ovom slučaju trebaju detektovati samo dva stanja (mala kapacitivnost – nema prsta i velika kapacitivnost – ima prsta) softver treba detektovati samo ova dva

stanja. Uz dovoljno tanak izolator (staklo, pleksiglas, termootporna folija...) moguće je detektovati približavanje i odaljavanje prsta od obloge, naravno u dostaograničenom dometu.

I sami možete zaključiti da najveći efekat na da ispravnu detekciju ima upravo oblik i površina oplate. Zato se njenoj konstrukciji mora posvetiti posebna pažnja. Za detalje pogledajte AN1101, AN1102 , AN1103 i AN1104 sa http://www.microchip.com/  iwww.microchip.com/mTouch.

Kapacitivni prekidači imaju i par mana. Oni imaju malo veću potrošnju energije,odašilju elektromagnetne talase (zbog veće površine obloge se ponaša kao antena) na

maloj daljini, jaki elektromagnetni talasi mogu izazvati pogrešnu detekciju (http://www.youtube.com/watch?v=_gL2VhAPEbA&amp;watch_response )

 pritisnutosti tastera, za svaki prekidač zahtevaju najmanje jedan U/I pin i zbog pouzdanog merenja traže da PIC radi na što većoj frekvenciji. Sleep mod nimultipleks jednostavno nisu mogući.

168

Page 169: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 169/209

83. Do 16 ulaza na 1 pinu

Odmah da napomenem da Vam ne preporučujem upotrebu ovog kola. Dovoljno je daupotrebljene komponente usled starenja malo promene svoje vrednosti i detekcija višeneće biti uspešna. Osim toga, skoro svaka elektronska komponenta menja svoje

 parametre pri promeni temperature. Moguće da će sa ovim kolom ispravna detekcijavremenom biti moguća jedino pri niskoj temperaturi. Zato je za ovu šemu neophodnokoristiti komponente male tolerancije.

Princip rada je sledeći. Pin RB0 povezan je kao wilkinsonov A/D konvertor, aliumesto merene otpornosti, ovde se pojavljuje otporna mreža. Rezultujuća otpornostna pinu zavisi od toga koji taster je pritisnut u određenom trenutku. Najmanja je(1kΩ) kada je pritisnut taster 1, povećava se do tastera 16 (1kΩ + 4k7 + 4k7 + 4k7 +1kΩ + 1kΩ + 1kΩ = 18,1KΩ), a najveća je (teorijski beskonačna) kada nije pritisnut

ijedan taster.Softver treba po izmeriti vrednost otpornosti po principu A/D konvertora i na osnovudobijene vrednosti pronaći koji taster je pritisnut.

Za razliku od ostalih šema sa više ulaza, ovom šemom je skoro nemoguće realizovatidetekciju više istovremeno pritisnutih tastera zbog većeg broja rednih i paralelnihspojeva otpornika.

Više o ovom principu imate na http://www.josepino.com/  i nahttp://www.romanblack.com/keypad.htm.

169

Page 170: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 170/209

84. Buđenje iz sleep moda popritisnutom tasteru

Ako je potreban 1 taster prekidač, nema problema. Koristite buđenje interaptom na

RB0 pinu. Ukoliko vam je potrebno buđenje uz do 4 prekidača, dovoljno je postaviti prekidače na RB4 do RB7 pinovima, dozvoliti interapt po promeni stanja na RB4 doRB7 pinovima sa setovanim GIE bitom i otići u sleep mod. Zajednički interapt flag

 prekidača će se po pritisku bilo kog prekidača setovati, ali mikrokontroler u trenutkuinterapta ne zna koji prekidač ga je probudio. Nakon buđenja moguće je testirati RB4-RB7 pinove kako da bi se utvrdilo na kom pinu je i dalje pritisnut taster.

Izgleda da je nemoguće buđenje iz sleep moda izazvati korišćenjem većeg broja prekidača. Kako onda napraviti daljinski upravljač? Postoji kao i uvek više rešenja.Jedno koristi interapte a drugo reset mikrokontrolera. Šta ćete koristiti zavisi od vašihkonkretnih potreba.

Ovde se najpre uključe pull up otpornici, a zatim se RB0 do RB3 pinovi deklarišu kaoizlazni sa logičkom 0, a RB4 do RB7 kao ulazni, podesi se intarapt i ode se u sleepmod. Pritiskom na bilo koji prekidač PIC će se probuditi iz sleep moda, i onda je

 potrebno redom postavljati RB0 do RB4 pinove na logičku 0 (držeći ostale nalogičkoj 1), i skenirati RB4 do RB7 pinove da bi se utvrdilo koji je taster i dalje

 pritisnut. Za više detalja pogledajte AN552 sa http://www.microchip.com/.

Drugim načinom mikrokontroler se resetuje po pritisku prekidača.

170

Page 171: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 171/209

 Na ovoj šemi svi izlazi (RB0 do RB3) postavljeni su na logičku 0. Kondenzator C senapunio preko otpornika od 47kΩ i dovodi logičku 1 na MCLR pin mikrokontrolera.Čim se bilo koji taster pritisne, C se isprazni kroz jedan od 4k7 otpornika (zavisi odtoga koji se taster pritisnuo), napon na kondenzatoru opada (oko 1mS) sve dok se PICzbog pojavljivanja logičke 0 na MCLR pinu ne resetuje. Po resetu se svi U/I pinovi uhardverskoj inicijalizaciji mikrokontrolera definišu kao ulazi, što sprečava dalje

 pražnjenje kondenzatora. Vrednosti otpornika i kondenzatora izabrane su tako da jetrajanje ciklusa pražnjenja i punjenja kondenzatora manje od vremena resetamikrokontrolera (oko 18mS).

Čim se reset završi, potrebno je uključiti Pull up otpornike, na RB0 do RB3 pinovimaredom na kratko postaviti logičku 0 (držeći ostale izlaze na logičkoj 1), što bržetestirati stanje prekidača na RA0 do RA3 pinovima, i vratiti pinove RB0 do RB4 nalogičku 1. Prebacivanje izlaza na logičku 0 ne može prouzrokovati ponovni resetmikrokontrolera ukoliko je vreme testiranja previše brzo (reda 10μS).

Za više detalja o ovome pogledajte AN528 sa http://www.microchip.com/.

171

Page 172: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 172/209

85. Može li još manje?

Može, ali uz upotrebu specijalizovanih integrisanih kola koja u sebi već imajuintegrisanu multipleks rutinu, i dovoljan broj pinova za povezivanje na LED displeje,odnosno prekidačku matricu.

Tipični predstavnici ovih integrisanih kola su:

EDE702   – LCD displej drajver. Upravljanje preko 1 pina.

EDE707   – LED displej drajver za 8 sedmosegmentnih displeja (bez decimalnetačke). Prikaz cifara 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E i F.Upravljanje preko 4 pina.

EDE1144  - Dekoder za 16 tastera. Serijska detekcija preko 2 pina, ili paralelna

 preko 4 pina (+1 za signalizaciju ispravno primljenog stanja prekidača)EDE1188  - Dekoder za 64 tastera. Serijska detekcija preko 2 pina.

ICM7218A – LED displej drajver za 8 sedmosegmentnih displeja sa zajedničkomanodom (bez decimalne tačke). Prikaz cifara 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,A, b, C, d, E i F sa mogućnošću direktnog adresiranja pojedinih LED

ICM7218B – LED displej drajver za 8 sedmosegmentnih displeja sa zajedničkomkatodom (bez decimalne tačke). Prikaz cifara 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,A, b, C, d, E i F sa mogućnošću direktnog adresiranja pojedinih LED

Uz njih je za razliku od multipleksa izazivanog mikrokontrolerom bez problemamoguće otići u SLEEP mod. EDE707 integrisano kolo će nastaviti sa prikazom po

 jednom dovedenom stanju, bez ikakve naknadne intervencije mikrokontrolera, aEDE1144 i EDE1188 se mogu povezati tako da po pritisnutom tasteru preko jednog

 pina izazovu interapt (ovo se može upotrebiti za buđenje iz SLEEP moda), i (45mSnakon interapta – dovoljno za stabilizaciju oscilatora mikrokontrolera) serijski prekodrugog pina u mikrokontroler pošalju kôd tastera.

172

Page 173: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 173/209

86. Povećanje broja U/I pinova

Ponekad nije moguće koristiti multipleks zbog potrebe za stalnim (neisprekidanim)logičkim nivoima. Očigledno je da bi u tom slučaju trebali na odgovarajući načinizvršiti povećanje broja ulazno izlaznih pinova.

Za to se može koristiti standardno integrisano kolo 74138 u kombinaciji sa 74259 ili4099 kao ulaznim kolima, i u kombinaciji sa 74251 ili 4512 kao izlaznim kolima.

 Na taj način možete koristeći samo PORTB dobiti do 64 ulaznih ili izlaznih pinova.Ukoliko Vam je ovo preskupo, možete koristiti pomeračke (šift) registre 74595 za 8izlaza, ili 74597 za 8 ulaza. Ovi registri imaju još po jedan serijski izlaz (74595) i ulaz(74597), tako da se njihovim rednim vezivanjem i povezivanjem preko samo 3 pina

mikrokontrolera može realizovati proizvoljno veliki broj ulaza / izlaza. Softver mikrokontrolera morao bi regulisati pomeranje i serijske ulazno / izlazne rutine.

Multipleks korišćenjem ovako proširenog broja ulazno / izlaznih pinova je moguć jedino u slučaju da nije potrebno menjati stanje pinova od ulaznog u izlazni i obrnuto,ali uz dosta komplikovaniji program. U SLEEP mod je moguće otići, jedino ukolikose istovremeno ne primenjuje multipleks.

Ukoliko Vam je potrebno 8 ulaza ili izlaza, možete koristiti PCF8574. Sa njim jemultipleks teže ostvariti, ali je moguć SLEEP mod.

U praksi se ovi načini veoma retko koriste. Jednostavnije (i jeftinije) je uzetimikrokontroler sa većim brojem ulazno izlaznih pinova.

173

Page 174: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 174/209

87. Odabir i konverzija brojnih sistema

Binarni brojni sistem ne mora uvek biti najpoželjniji. Ukoliko Vam je na primer  potrebno prikazivanje 2 cifre na LED displeju, najpoželjniji je BCD oblik. U BCDobliku čak možete gornji nibl koristiti za prikaz jedne, a donji nibl tog istog registraza prikaz druge cifre. Za prikaz na LCD-u pogodniji Vam je ASCII oblik brojeva. Istotako, za komplikovane matematičke operacije praktičnije bi bilo korišćenje operacijasa pokretnim zarezom (eng. Floating Point ili skraćeno float).

U zavisnosti od konkretne primene možda Vam je lakše sve operacije izvršavati uobliku koji vama odgovara, a zatim na kraju proračuna konvertovati rezultat u oblik 

 pogodan za prikazivanje preko konverzionih algoritama.

 Na sajtu http://www.microchip.com/ dat je određeni broj konverzionih rutina. To su:

AN526 - BCD (Binary Coded Decimal) to binary conversion routines- Binary to BCD conversion routines

AN554 - 8-bit binary to 2 digit BCD conversion- 16-bit binary to 5 digit BCD conversion- 5-bit BCD to 16-bit binary conversion

AN575 - float to integer conversion- integer to float conversion

AN670 - Floating Point to ASCII Conversion

Za manji broj vrednosti promene brojnih sistema možete ručno izvršiti koristećiintegrisan Linuxov ili Windowsov digitron. Prilikom promene bez digitrona, moguće

 je konverziju obavljati po sledećim principima:

 Binarni u heksadecimalni oblik 

 Najpre se binarni broj podeli u niblove: 1 1100 0100 1000 1000 0100, a onda se pronađe odgovarajuća cifra za svaki nibl : 1 C 4 8 8 4 = 1C48x84.

 Heksadecimalni u binarni oblik 

Moguće je promeniti svaku cifru u nibl: 5 F 3 7 B = 5F3x7B

 po sledećem: 101 1111 0011 0111 1011

 Binarni u decimalni oblik Ovo je malo problematično. Najpre napišite decimalnu vrednost iznad svakog bita:1024 512 256 128 64 32 16 8 4 2 1, a onda saberite vrednosti za svaku 1  1 0 1 1 0 1 0 1 1 0 0 = 1024+256+128+32+8+4 = .1452

 Decimalni u binarni oblik Ovo je takođe komplikovano. Oduzmite od decimalnog broja maksimalni umnožak 

 broja 2 (1,2,4,8,16,32,64,128,256,512,1024,...) koji može biti oduzeti od njega, bez prelaska u negativnu vrednost. Bitovi čiji umnožak broja 2 se koristi, biće na logičkoj

1, dok će ostali biti na logičkoj 0. Za broj .582 to izgleda ovako:

174

Page 175: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 175/209

582 - 512 = 70 512 256 128 64 32 16 8 4 2 170 - 64 = 6 1 0 0 1 0 0 0 1 1 0 = b'10 0100 0110'6 - 4 = 22 - 2 = 0

 Decimalni u heksadecimalni oblik 

 Najpre konvertujte decimalni oblik u binarni, a zatim binarni u heksadecimalni. Zagornji slučaj to bi izgledalo ovako: .582 = b'10 0100 0110' = 2x46

Postoji i način direktne konverzije deljenjem umnošcima maksimalne vrednosti jednog nibla.582 / 256 = 2 sa ostatkom 70

70 / 16 = 4 sa ostatkom 66 / 1 = 6 sa ostatkom 0

Rezultat je 2x46.

 Heksadecimalni u decimalni oblik 

Konvertujte iz heksadecimalnog u binarni oblik, a zatim iz binarnog u decimalni.Za raniji slučaj to bi izgledalo ovako: 5F3x7B = b'1011111001101111011'=.390011

Postoji i način direktne konverzije množenjem umnožaka maksimalne vrednosti jednog nibla. Na primer za broj 3x8D to je:3 x 256 = 7688 x 16 = 128Dx 1 = 13Rezultat je 768 + 128 + (ostatak koji nije mogao biti pomnožen) 13 = .909.

Ipak, i dalje je jednostavnije koristiti digitron.

175

Page 176: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 176/209

88. Šesnaestobitna aritmetika

Ranije ste naučili upotrebu instrukcija sabiranja i oduzimanja. Moguce je daosmobitne operacije nisu dovoljne za određene primene. Iako PIC16F84 nemahardverske instrukcije za rad sa šesnaestobitnim brojevima, nije ih previše teškoimplementovati softverski.

Pre svega, brojeve kao i rezultat operacije morate držati u dva bajta. Od ta dva bajta jedan će biti bajt veće težine (eng. MSB – Most Significant Byte), a drugi manje (eng.LSB – Least Significant Byte). Brojevi se sabiraju tako što se najpre saberu LSB, uzavisnosti od stanja Carry flaga doda se 0x01 na jedan od MSB, a onda se saberu obaMSB.

Sledećim potprogramom ilustrovano je sabiranje šesnaestobitnih brojeva.

cblock 0x1CLSB1 ; Promenljiva 1, bajt manje težineMSB1 ; Promenljiva 1, bajt veće težineLSB2 ; Promenljiva 2, bajt manje težineMSB2 ; Promenljiva 2, bajt veće težineLSBRES ; Rezultat, bajt manje težineMSBRES ; Rezultat, bajt veće težineendc

Sab movf LSB1,W ; Uzmi bajt manje težine prvog operandaaddwf LSB2,W ; saberi sa bajtom manje težine drugog operanda.

 movwf LSBRES ; Rezultat u bajt manje težine rezultata. movf MSB1,W ; Uzmi bajt veće težine prvog operanda btfsc STATUS,C ; Da li je došlo do prekoračenja?addlw 0x01 ; Jeste, dodaj Carry flag.addwf MSB2,W ; saberi sa bajtom veće težine drugog operanda.

 movwf MSBRES ; Rezultat u bajt veće težine rezultata.return

Rezultat će biti tačan jedino u slučaju da da se zbir može predstaviti sa 16 bita (0 do65535 u slučaju neoznačenih ili -32768 do 32767 u slučaju označenih brojeva). U

 protivnom, biće obavezan još jedan registar za čuvanje stanja Carry flaga.

 Na sličan način može se realizovati i oduzimanje dva šesnaestobitna broja.

Pored ovih operacija, unutar PIC16F84 mikrokontrolera moguće je realizovatimnoženje, deljenje, kvadratni koren, generisanje pseudoslučajnog niza brojeva pa čak i mnogo, mnogo komplikovanije operacije. Po potrebi, ove funkcije mogu se proširitiza veću rezoluciju, kao i za rad sa pokretnim zarezom (eng. floating point).

Za detalje pogledajte AN526, AN544, AN575, AN617, AN660 sahttp://www.microchip.com/ i http://www.piclist.com/cgi-bin/constdivmul.exe link.

176

Page 177: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 177/209

89. Brze matematičke operacije

Pretpostavimo da želite izračunati kvadratni koren. Unutar AN526, AN544 i AN660datasheeta tvrdi se da će se za njegovo računanje utrošiti oko 3000 instrukcijskihciklusa (3mS pri 4MHz taktu), kao i da će za njegovo računanje biti utrošeno skorosvih 8 nivoa steka. U ovom poglavlju naučićete par trikova koji Vam mogu poslužitiza brzo računanje.

Pretpostavimo da želite izračunati kvadratni koren nad osmobitnim brojem (.0 do .255). Ništa lakše. Koristićete tabelu.

Tab1 addwf PCL,F ; U W se nalazi broj od .0 do .255.retlw .0 ; 0 – 0retlw .1 ; 1 – 1retlw .1 ; 2 – 1

retlw .1 ; 3 – 1 retlw .2 ; 4 – 2retlw .2 ; 5 – 2. . .retlw .15 ; 254 – 15 retlw .15 ; 255 – 15 

Tabelom koja Vam vraća celobrojnu vrednost možete dobiti tačan celobrojni rezultatu samo 5-6 instrukcijskih ciklusa. I sami uočavate da je preciznost rezultata previšemala za ikakav ozbiljniji rad. Nema problema. Vrednost prve decimale rezultata naćiće se u sledećoj tabeli.

Tab2 addwf PCL,F ; U W se nalazi broj od .0 do .255.retlw .0 ; 0 – 0,0retlw .0 ; 1 – 1,0retlw .4 ; 2 – 1,4retlw .7 ; 3 – 1,7retlw .0 ; 4 – 2,0retlw .2 ; 5 – 2,2. . .retlw .9 ; 254 – 15,9retlw .9 ; 255 – 15,9

Za drugu decimalu koristila bi se naredna tabela, i tako dalje.

Iako su ovi načini izuzetno brzi, nisu ekonomični u pogledu utroška programskememorije. Dobar kompromis između brzine i veličine programa predstavljao bičuvanje decimala u binarnom ili BCD obliku. Na taj način gornje dve tabele mogle bise kompresovati u jednu, tako što bi gornji nibl sadržao celobrojnu vrednost (0 do 15),a donji vrednost prve decimale. Za prikaz celobrojne vrednosti na LED displeju

 pozvala bi se odgovarajuća konverziona rutina za gornji nibl, a donji nibl (decimalnavrednost) bi se ionako nalazila u BCD formatu. Tabela bi mogla izgledati ovako:

177

Page 178: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 178/209

Tabl addwf PCL,F ; U W se nalazi broj od .0 do .255.retlw 0x00 ; 0 – 0,0retlw 0x10 ; 1 – 1,0retlw 0x14 ; 2 – 1,4retlw 0x17 ; 3 – 1,7retlw 0x20 ; 4 – 2,0retlw 0x22 ; 5 – 2,2. . .retlw 0xF9 ; 254 – 15,9retlw 0xF9 ; 255 – 15,9

Za veći broj decimala pogodnije bi bilo koristiti binarni oblik zapisa (makar samo zadecimale) i odgovarajuće konverzione rutine. Sve zavisi od toga kolika Vam je brzinaračunanja potrebna.

Dobro poznavanje oblika signala odgovarajuće matematičke operacije može Vam

 pomoći prilikom kompresije njene tabele. Kompresija opisana ranije ne bi bilamoguća da je celobrojni rezultat operacije nad brojem 255 veći od 15, jer se broj većiod 15 ne može naći u jednom niblu. Pogledajte na primer sinusnu funkciju.

Slika

Umesto čuvanja vrednosti cele periode unutar više tabela, mogli biste koristitioznačene brojeve i naknadno dodatim MSB bitom pokazivali pripadnost gornjoj,odnosno donjoj poluperiodi. Na taj način prepolovili biste broj potrebnih tabela za isti

 broj decimala.

Slika

Još veću kompresiju dobili biste ukoliko se ograničite samo na četvrtinu periode, jer zbog simertičnosti poluperiode drugi deo možete regenerisati oduzimanjem indeksatabele od maksimalne vrednosti. Tako je broj potrebnih tabela smanjen na četvrtinu.

Jedan način računanja sinusne (i kosinusne) funkcije za uglove od 0 do 45 stepeni i sa

tačnošću od 6 decimala dobiti obrascima:

SIN(X) = 1.7453293 * X * (1 – 0.50758 * X * X * (1 – 0.149 * X * X))

COS(X) = l – 1.523087 * X * X * (1 – 0.25382 * X * X * (1 – 0.1 * X * X))

Za uglove od 45 do 90 stepeni, setite se da je SIN(X) = COS(90 – X).

Sledeći način brzog računanja podrazumeva upotrebu eksterne EEPROM memorije. Na primer uz odgovarajuću I2C EEPROM memoriju moguće je unutar EEPROM-ačuvati rezultate svih potrebnih matematičkih operacija. Brzina računanja bila bi

 jednaka brzini I2C veze, a program ne imao duge tabele. Maksimalnu brzinu dobili bi

178

Page 179: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 179/209

upotrebom eksterne EPROM memorije, ali ona troši najveći broj pinova. Budući da jenjena cena danas izuzetno niska, to bi ipak moglo predstavljati dobro rešenje.

Ukoliko Vam ni ovaj princip ne može zadovoljiti apetit, razmislite o eksternomkooprocesoru. Integrisano kolo uM-FPU V3.1 predstavlja 32-bitni kooprocesor sa

 pokretnim zarezom i integrisanom I2C i SPI vezom. Za razliku od mikrokontrolera on

 je specijalno razvijen za brzo izvršavanje složenih matematičkih operacija, tako da ćena primer rezultat kvadratnog korena zavisiti jedino od brzine komunikacije.

U praksi se matematički proračuni uz eksterni hardver retko kada koriste. Isto kao kod povećanja broja U/I pinova, daleko je jednostavnije (i jeftinije) koristiti moćnijimikrokontroler.

179

Page 180: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 180/209

90. Merenje vremena

Već znate kako možete meriti vreme. Obavezan je kristalni oscilator, i deljenjenjegovih taktova. Međutim uz kristalni oscilator od 4MHz morali bi se malo pomučitidok dođete do vremena od tačno 1S. Ne verujete? Zato što razmišljate decimalno, a ne

 binarno!

Sećate se da se jedna instrukcija izvrši za 4 takta mikrokontrolera. Uz kristal od 4MHzinstrukcija se izvrši za 1 mikrosekundu, odnosno (ukoliko se zbog lakšeg razumevanja

 pretpostavi da se jedna instrukcija izvrši za vreme jednog takta oscilatora) kao da jekorišćen kristal od 1MHz. Možda smatrate da je to idealno!

1Hz – 10Hz – 100Hz – 1MHz.

I bilo bi tako, samo kada bi PIC mogao lako deliti sa 10. Kako je mikrokontroleru

osnova za deljenje 2 a ne 10, evo šta bi se desilo u tom slučaju:1Hz – 2Hz – 4Hz – 8Hz – 16Hz – 32Hz – 64Hz – 128Hz – 256Hz – 512Hz – 1,024kHz – 2,048kHz – 4,096kHz – 8,192kHz – 16,384kHz – 32,768kHz...

Mnogo je praktičnije uzeti kristal (kakav se i inače koristi u digitalnim časovnicima)od 32,768kHz, ili kristal sa nekom od frekvencija iz niza. Njegov takt može sevišestrukim uzastopnim deljenjem sa dva smanjiti na ravno 1Hz. Još bolje, za procesdeljenja može se koristiti integrisani preskaler tajmera sa skokom na interapt podostignutom odnosu deljenja. Interapt bi Vam ionako bio potreban zbog multipleksaLED displeja. Osim toga kvarcni kristali ove frekvencije fabrički imaju manje

odstupanje frekvenije od ostalih, upravo zbog njihove primene u generatorima preciznih vremenskih intervala.

Ukoliko mikrokontroler treba (pored sata) obavljati i neke druge operacije, praktičnije je na T0CKI ulaz dovesti signale sa 32,768kHz kristala i podesiti postskaler daimpulse za brojanje uzima sa ovog pina umesto sa takta oscilatora. Tako PIC možeraditi svojom maksimalnom brzinom, uz isto tako maksimalnu preciznost vremena.

 Naravno, ovo malo komplikuje hardver zbog potrebe za eksternim kristalnimoscilatorom. Tu su napredniji mikrokontroleri u prednosti nad PIC16F84 zbog

 postojanja šesnaestobitnog TIMER1 modula. Sa njim je moguće direktno na pinovemikrokontrolera povezati kristal (sa pripadajućim kondenzatorima), i tako dobiti takt

nezavisan od frekvencije mikrokontrolera. Još bolje, ovaj tajmer aktivan je i u SLEEPmodu.

Ukoliko planirate u sat (eng. RTC – R eal Time Clock) ubaciti i kalendar, morate presvega odlučiti da li ćete mu implementirati korekciju 29. februara za slučaj prestupnegodine (Leap year) i automatsko ažuriranje prilikom promene vremena (eng. Daylightsavings). Zbog toga Vas vaš kompjuter pita za prelazak na letnji ili zimski načinračunanja vremena.

Da li ste ikada podesili sat na svom kompjuteru, ali nakog 6 meseci primećujete da onžuri 5 minuta. Iako se fabrike trude da im kristali budu sa što preciznijom

frekvencijom, ne uspevaju uvek u tome. Srećom, možete softverski kalibrisati vreme

180

Page 181: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 181/209

tako što satu dodate (ili oduzmete) 1 sekundu svakih par sati, dana, nedelja ili meseci.Verovatno će Vam biti potrebno par meseci za tačnu kalibraciju upotrebljenogkristala. Najbolje je svakako ovu korekciju ubaciti za određeni (fiksni) broj sekundi,ali to dosta komplikuje program i samim tim nameće potrebu za njegovim sporijimizvršavanjem. Drugačiji način (hardverski) kalibracije vremena sastojao bi se umenjanju kapacitivnosti jednog od kondenzatora pored kristala od 32KHz. Najlakše

štelovanje postiže se trimer kondenzatorom.

Dodatnu preciznost možete postići temperaturno kontrolisanim oscilatorom.

Gotove softverske rutine za sat možete naći širom interneta. Već imate asemblerskurutinu u Microchip Maestro programu. Verovatno ste ga već instalirali uz MPLAB

 paket. Još neke su na adresama http://www.iki.fi/jap ihttp://ourworld.compuserve.com/homepages/Bill_Bowden/homepage.htm#menu.

Pravljenje najobičnijeg digitalnog časovnika mikrokontrolerom nije baš praktično.Digitalni časovnici imaju svoja specijalizovana integrisana kola. Nema svrhe trošiti

novac na skuplji mikrokontroler. Isplati se to raditi jedino u slučaju da je potrebnonapraviti sat specifičnih osobina (više alarma, povezivanje sa kompjuterom), kao na

 primer sa sajta http://www.bobblick.com/techref/projects/propclock/propclock.html.

A ukoliko je mala potrošnja imperativ, mogu se specijalizovana integrisana kola povezati sa mikrokontrolerom. Tipični predstavnici ovakvih integrisanih kola suDS1307, PCF8593 i  NJU6355. Zbog njihove minimalne potrošnje direktno naštampanu pločicu može se zalemiti mala litijumska baterija preko koje bi se satnapajao električnom energijom u slučaju nestanka struje (isto kao kod matičnih pločakompjutera). Pored toga ova kola (isto kao i gore pomenuti Maestro softver) u sebisadrže kalendar, zajedno sa proračunima prestupnih godina. Nemojte misliti da bi

upotrebom tih kola dobili veću preciznost. Preciznost takta direktno zavisi odupotrebljenog kristala (i njegove kalibracije), a potpuno isti kristal se koristi i u timkolima.

181

Page 182: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 182/209

91. Drajveri

Iako Vam može tako izgledati, ovo nije šala. Ovde se doduše ne radi o drajverima zaskener, štampač ili grafičku karticu, već o drajverima za LED, LCD displej, prekidačeili step motor.

Pogledajte najjednostavniji primer. Pretpostavljam da Vam je lakše i razumljivije datestirate prekidače tako da pri njihovoj pritisnutosti očekujete pojavu logičke 1, a nelogičke 0 (što bi se sigurno desilo pri upotrebi pull-up otpornika). Najjednostavnije jeu tom slučaju invertovati sve ulaze.

Drajver_za_prekidace ; Stanje prekidača u bitovima 0 i 1 u Wcomf PORTB,W ; Invertovani PORTB u Wandlw b'00000011' ; Maskiranje bitova 2 do 7 (izlazni)return ; Povratak iz potprograma

Drajver bi se mogao dodatno kombinovati sa glavnim programom tako da se vrednost b'00000011' zadaje jednom pre inicijalizacije (npr. sa B_ULAZI equ b'00000011'), azatim da se inicijalno podešavanje TRISB registra kao i andlw instrukcije unutar drajvera podesi ovako imenovanom vrednošću.

Pogledajte sada sledeći primer. Jedan LED displej na portu B. Drajver bi se sastojaood već ranije naučene tabele i potprograma za ispis. To bi moglo izgledati ovako:

Drajver_za_led ; Drajver za ispis W broja na LED displejcall Tabl ; Poziv za sliku LED displeja

 movf SPORTB ; Slika cifre u shaddow registar za port B.call Update ; Poziv potprograma za ispisreturn ; Povratak iz potprograma

Tabl ; U W se nalazi se vrednost odaddwf PCL,f ; .1 do .6. Ta vrednost se dodaje na PCL.retlw b'00001100' ; Obrazac za crtanje cifre 1 - 1

retlw b'10110110' ; Obrazac za crtanje cifre 2 - 2

retlw b'10011110' ; Obrazac za crtanje cifre 3 - 3

retlw b'11001100' ; Obrazac za crtanje cifre 4 - 4

retlw b'11011010' ; Obrazac za crtanje cifre 5 -5

retlw b'11111010' ; Obrazac za crtanje cifre 6 - 6

Update movf SPORTA,W ; Shaddow registar porta A movwf PORTA ; u PORTA movf SPORTB,W ; Shaddow registar porta B movwf PORTB ; u PORTBreturn ; Povratak iz potprograma

Potprogram Update može se ovako pozivati i za port A, odnosno može služiti kao

 posebna celina.

182

Page 183: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 183/209

Kad god je moguće standardizujte softver za uobičajeni hardver drajverima. Potruditese da određene standardne vrednosti (ulazi u prvom drajveru) imenujete i podesitesamo jednom u programu. Tako će pri kasnijoj izmeni softvera (npr. pri dodavanju još

 jednog ulaznog pina) biti dovoljno izmeniti samo jedan jedini red programa. Manjeizmena, manje grešaka.

Drajveri koji su vremenski kritični (npr. za osvežavanje više LED displeja,debouncing ili kontrolu step motora) mogu se pozivati u određenim trenutcima izinterapta. Ipak, rad sa više ovakvih vremenski kritičnih delova unutar jednog

 programa dodatno komplikuje osnovni algoritam programa. Da bi se takvi delovimogli izvršavati bez dodatnih usložnjavanja, glavni program treba periodično, pozadatim kriterijumima pozivati ove delove. Više o takvom principu naučićete unarednom poglavlju.

183

Page 184: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 184/209

92. Operativni Sistem

Da li je mikrokontroleru potreban operativni sistem? Uglavnom nije. Međutim, ima primera kada je jednostavnije podeliti program u više nezavisnih celina od kojih sesvaka treba izvršavati nezavisno od drugih. Program na taj način može biti sastavljenod mnogo nezavisnih (tačnije uslovno nezavisnih) delova (eng. task) pri čemu su

 pojedinačni taskovi u osnovi jednostavni. Na primer kod duplog multipleksa jedantask brinuo bi se o osvežavanju LED displeja preko njegovog drajvera, drugi odebouncingu prekidača, a treći bi u stvari radio ono za šta je mikrokontroler inamenjen. Taskovi mogu efektno međusobno komunicirati preko namenskih registaraopšte namene i flegova unutar njih (npr. registar DISPLEJ1 i DISPLEJ2 za prikaz naLED displejima i registar TASTERI sa flagovima bit 0-taster1, bit 1-taster2...). Na tajnačin dobija se jedan pravi mali multitasking sistem. Svakako da je u ovom slučaju

 poželjno napraviti mali OS koji bi regulisao pozivanje pojedinih celina po unapredzadatim parametrima (npr. u tačno određeno vreme). U nastavku teksta biće opisani

osnovni principi takvih sistema. Najjednostavniji multitasking OS bio bi redom pozivao taskove po prekoračenjutajmera. Pojedinačni taskovi redom bi se mogli pozivati on W goto principomopisanim ranije. Preskaler treba biti tako podešen da omogući i najzahtevnijem taskusiguran završetak pre novog prekoračenja tajmera.

Svakako da tako jednostavan OS ima dosta mana. Mikrokontroler će sve taskovemorati da izvršava malo dužim vremenom od taska najdužeg trajanja. To je priličnoneekonomično rasipanje resursa. Taskovi uglavnom zahtevaju pozivanje u različitimintervalima (npr. task za osvežavanje LED displeja treba češće pozivati od taska za

testiranje prekidača). Interapti moraju trajati što kraće kako ne bi previše kočilitaskove.

Složeniji princip davao bi određeno fiksno vreme za svakom pojedinačnom tasku. To je najlakše postići interaptima izazvanim tajmerom. Iako to vreme ne mora bitidovoljno za završetak taska, po isteku vremena njegovo izvršavanje bi se prekinulo, i

 počeo bi sledeći task. Sadržaj W i STATUS registra bi se morao snimati (kao kodinterapta) za svaki pojedinačni task. Redni broj taska koji se trenutni izvršava kao istatus pojedinačnih taskova (npr. zauzet ili završio) mogao bi se snimiti u par kontrolnih registara.

Taskovi se mogu razlikovati po zahtevima za opsluživanjem. Na primer osvežavanjedispleja mora imati prioritet nad ostalim taskovima, i mora biti pozivano u tačnimvremenskim intervalima. Za razliku od njega task za izračunavanje kvadratnog korenanema zahteva za određenim vremenom, tako da se može izvršavati kad god se neizvršava task većeg prioriteta. U kompjuterskim operativnim sistemima, na primer,najviše procesorske snage troši trenutno aktivan prozor.

Za više detalja pogledajte AN514, AN585, AN777 i časopis Elektor Electronics broj5/98.

184

Page 185: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 185/209

93. Elektronika, matematika, fizika...

Programiranje mikrokontrolera se (za razliku od programiranja kompjutera) ne može posmatrati kao usamljen, izdvojen proces. U najčešćem broju slučajevamikrokontroler će obrađivati spoljne signale. Ranije pomenute metode (multipleks idupli multipleks, povećanje broja U/I pinova, principi A/D i D/A konverzije,konverzija otpornosti i kapacitivnosti, princip rada kapacitivnih prekidača...)zahtevaju poznavanje osnovnih principa elektronike. Matematički principi su takođe

 bitni (npr. zbog interpolacije, komplementa dvojke, sortiranja podataka, CRCalgoritma, operacija sa negativnim ili brojevima sa pokretnim zarezom...). Međutim,iako se to uglavnom ne spominje u literaturi poznavanje fizičkih zakona može Vamitekako pomoći u pravilnom dizajniranju uređaja.

 Na primer primenom doplerovog efekta omogućeno je (zvučno ili optičko za bržemikrokontrolere) merenje brzine pokretnog objekta. Svest o nejednakoj propustljivosti

atmosfere za različite talasne dužine svetlosti omogućiće vam pravilan izbor talasnedužine predajne i prijemne fotodiode. Fazna modulacija (eng. Phase Shift K eying)tona omogućava uzak audio frekventni opseg, a samim tim veću izlaznu snagu radio

 predajnika. Takođe je i najosetljivija sa strane prijemnika. Poznavanje karakteristikaljudskog oka omogućava multipleks izlaza a ljudskog uva kompresiju muzike iligovora (npr. ADPCM ili Speex algoritmom) bez značajnijeg gubitka kvaliteta.

Poznavanje informatike, može Vam itekako pomoći prilikom povezivanja kompjuterai mikrokontrolera. Mikrokontroler bi mogao skupljati podatke na terenu, a kompjuter 

 bi ih mogao na miru svom svojom snagom analizirati.

185

Page 186: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 186/209

94. Straničenje memorije

U poglavlju sa tabelama upoznali ste se sa problemom straničenja programskememorije u blokovima od po 256 bajtova. Ukoliko želite jednom preći i nasavremenije (ili starije a jeftinije) mikrokontrolere, morate shvatiti princip i potrebu zastraničenjem memorije.

Tabelama je kao što ste već naučili neophodno straničenje u programskoj (ROM)memoriji. Ukoliko deo tabele izađe iz bloka od 256 bajtova, program će verovatnokrahirati. U potpuno istoj situaciji nalaze se mikrokontroleri PIC16 serije sa više od2Kb memorije.

Kod mikrokontrolera iz PIC16 serije koji imaju više od 2Kb programske memorije(PIC16F84 ima 1Kb) instrukcije CALL i GOTO mogu adresirati maksimalno 2Kbmemorije. Ovo ograničenje proističe iz sintakse samih instrukcija. Naime, sve

instrukcije su četrnaestobitne. Kako je PC trinaestobitan, on može direktno adresirati programske adrese od 0 do 8191 (1FxFF), odnosno maksimalno 8Kb programskememorije. Međutim, unutar jedne četrnaestobitne instrukcije nalazi se i kodinstrukcije i operand. Kod CALL instrukcije to izgleda ovako:

kod adresa100 xxxxxxxxxxx

Kao što vidite, unutar četrnaestobitne instrukcije za adresu preostaje maksimalno 11 bitova. Sa tih 11 bitova mogu se direktno adresirati jedino memorijske adrese od 0 do2047 (7xFF), odnosno maksimalno 2Kb. Ista situacija je i sa GOTO instrukcijom. Iz

tog razloga ni GOTO ni CALL instrukcija ne mogu kao odredište koristiti adrese većeod strane (eng. Page) od 2Kb unutar programske memorije. Da bi se ovo prevazišlo, potrebno je kao kod tabele pre skoka podesiti odgovarajuće bitove PCLATH registra.

RAM memorija takođe pati od sličnog problema. Evo kako izgleda kod ANDWFinstrukcije:

kod odredište adresa000101 d fffffff

Sa 7 bita dostupnih za adresu moguće je adresirati maksimalno 128 registra unutar  jedne banke. Kod mikrokontrolera PIC16 serije sa više od 128 registara (uključujući i

specijalne registre - PIC16F84 ima 68 opštih i 12 specijalnih registara u BANK0)koriste se registri na drugim stranicama RAM memorije (BANK1, BANK2 iBANK3). Prelazak sa banke na banku obavlja se preko RP0 i RP1 bitova. To opetrađa nove probleme. Većina registara dostupna je samo iz pojedinih banki. Toonemogućava efektno korišćenje celokupne RAM memorije. Da bi se problem bar donekle ublažio, postoji par registara koji su zajednički za sve banke.

Još komplikacija može izazvati indirektno adresiranje preko INDF i FSR registara. Sa8 bitova koji se mogu naći u njima moguće je adresirati do 256 registara. Zato seunutar STATUS registra nalazi IRP bit kojim se omogućava indirektno adresiranjeostatka RAM memorije.

186

Page 187: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 187/209

Iz svih ovih razloga PIC16 familija mikrokontrolera je prilično nezahvalna za pravljenje programa većih od 2Kb. Mora se voditi računa o previše sitnica. KodPIC18 serije na primer ukinuto je straničenje programske memorije, dok je prostor zaregistare u bankama povećan na 256.

187

Page 188: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 188/209

95. Disasembler

Sigurno Vam se desilo da ste na internetu naišli na program koji radi upravo ono što jeVama potrebno, ali biste mu dodali još par mogućnosti. Nažalost autor ga je napisao uPIC Basic ili C jeziku umesto u asembleru, ali je na sajtu ostavio i .hex kôd.

Disasemblerom je moguće .hex kôd pretvoriti u asemblerski listing, koji se kasnijemože editovati. U tome je jedna od prednosti asemblera nad višim programskim

 jezicima. Ne postoji disasembler koji može .hex fajl prebaciti u PIC Basic ili C.

 Neki od najpoznatijih disasemblera za PIC16F84 su

Mikado 

PIC DIS LITE 

DISASM 84

Već ranije pominjani PIC Simulator IDE.

Ovde je potrebno napomenuti da MPLAB asembler omogućuje korišćenje dodatnogseta instrukcija. Te instrukcije mikrokontroler ne razume, pa su stoga implementovaneupotrebom dve ili više običnih instrukcija. Ovaj set instrukcija moguće je naći unekim (retkim) .asm fajlovima. Ukoliko želite saznati na koji način mikrokontroler izvršava takav program, možete disasemblirati njegov .hex fajl i videti načinrealizacije iz asemblerskog listinga.

Analiza disasembliranih programa uopšte nije laka. Komentara nema (osim onih kojedisasembler eventualno postavi), registri i bitovi nisu uvek imenovani, a oni koji jesu,imaće imena iz banke 0 (iako se možda realno nalaze u banci 1). Labelamadisasembler dodeljuje onake redom, a registrima adresom (tipa Label4 i Reg2A).Binarni brojevi ili ASCII karakteri uvek su prikazani u heksadecimalnom formatu.

 Neuobičajeno rešene operacije (npr. skok upotrebom PCL registra) mogu biti izuzetnokomplikovane za analizu. Zato je preporučljivo u disasemblirani listing ubacitiodgovarajuće komentare, i podeliti ih u logičke celine (blokove). Isto tako, ukoliko stesigurni u funkciju određenih registra ili labela, možete im izmeniti naziv u svimmestima u kojima se pojavljuju u programu (preko Edit, Replace opcije).

Analiza tuđih programa pomoći će Vam u razvijanju sopstvenog stila programiranja, iu učenju novih softverskih tehnika. Osim toga, nema svrhe ponovo izmišljati topluvodu. Veliki broj mikrokontrolerskih projekata sa interneta je dat kao potpuno

 besplatan. Onaj ko želi naplatiti svoj trud, ne ostavlja program na internetu, već prodaje programirane i zaštićene mikrokontrolere (uključen CP konfiguracioni bit).Budući da je ovaj način zaštite programa mikrokontrolera sasvim dovoljan zasprečavanje piraterije, i Vi možete biti sigurni da Vam se dugo pisani program nećeodjednom pojaviti na internetu.

188

Page 189: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 189/209

96. Preprocesor

U programima se često javlja potreba za standardnim programskim strukturama tipaif...then...else... ili do...while... (primeri su iz Paskal jezika, iako se ista struktura srećeu svim višim programskim jezicima). Svakako da se ove strukture mogu realizovatiručno u asembleru, ali u većim programima njihov kod je teško pratiti, čak i uzkomentare.

Preprocesor predstavlja program kojim je moguće ubrzati razvojh programa,zadržavajući pri tome svu snagu asemblera. Kako je to moguće? Pretpostavimo daimate već razvijene drajvere za standardne periferije. Utoliko bolje po Vas. Međutim,nije baš lako povezati ih u celinu. Za najobičnije testiranje dvobajtnog broja iizvršavanje različitog koda u zavisnosti od rezultata, morali bi napisati dosta koda. Štoviše ručno pisanog koda, to veća mogućnost pojave grešaka. Nije li lakše pisati:

if GODINA > .2008thenincf BROJ,F

elsedecf BROJ,F

endif

nego: movf HI_GODINA,Wsublw 0x07

 btfsc STATUS,Zgoto Test

 btfsc STATUS,Cgoto Smanji

Uvecaj incf BROJ,Fgoto Kraj

Test movf LO_GODINA,Wsublw 0xD8

 btfss STATUS,Cgoto Uvecaj

Smanji decf BROJ,F

Kraj ...

Prvi slučaj je razumljiviji (opet su komentari namerno izostavljeni), i njime je preprocesoru prepuštena briga oko računanja konkretnih vrednosti (0x07 i 0xD8) za poređenje, realizovanje odgovarajuće programske strukture i izmišljanje naziva labela.Potrebno je naravno prethodno definisati da je GODINA dvobajtna vrednost.

 Nakon što se preprocesorom dobije odgovarajući asemblerski kod, tako dobijen .asmfajl standardno bi se kompajlirao MPLAB asemblerom.

189

Page 190: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 190/209

Možda smatrate da je lakše koristiti C ili PIC Basic. Delimično ste u pravu. Problem je što viši programski jezici ne ostavljaju programeru mogućnost simuliranja programa instrukciju po instrukciju (bar ne na način kojim bi programer mogao uticatina program na instrukcijskom nivou), njihov kod je duži i sporije se izvršava.Preprocesor pak dodaje samom asembleru (osnovne) mogućnosti viših programskih

 jezika, tako da se asemblerske instrukcije slobodno mogu nalaziti u okviru koda koji

izvršava preprocesor. Preprocesor će ih jednostavno ignorisati. Nakon što preprocesor generiše osnovni asemblerski kod, lako je naknadno ga izmeniti direktno u MPLAB-u,ukoliko Vam dobijeni kod iz bilo kojih razloga ne odgovara.

Prepic preprocesor možete skinuti sa http://www.embedinc.com/pic/dload.htm. Kakoon nema GUI (Graphical User Interface) problem će Vam verovatno predstavljati

 prenošenje parametara unutar komandne linije.

SASM (Jessica Meremonte's Structural PIC Assembler preprocessor) preprocesor nalazi se na http://www.picbook.com/downloads.html. On je skromnijih mogućnosti, ine ostavlja programeru mogućnost naknadne izmene dobijenog koda (dobija se

samo .hex fajl).

Čista je šteta što se mogućnosti preprocesora nedovoljno iskorišćavaju. Uz preprocesor je razvoj programa skoro isto toliko brz kao kod viših programskih jezika,a opet je korisniku omogućena maksimalna moguća kontrola programa.

190

Page 191: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 191/209

97. Grafički orjentisani programski jezici

Za razliku od asemblera i viših programskih jezika grafički orjentisani programski jezici sastoje se iz blokova (logičkih celina), kojima je moguće definisatiodgovarajuća stanja. Proizvode najduži (i najsporiji) mogući kod, i uopšteneracionalno rasipaju resurse mikrokontrolera. Osim toga nemaju dovoljno kontrole uodnosu na bilo koji drugi programski jezik. Zašto su onda uopšte navedeni ovde? Zatošto omogućavaju veoma brzu izradu jednostavnijih programa.

Jedan od najboljih grafički orjentisanih programskih jezika je LDmicro sa http://cq.cx/ladder.pl. Iako se u njemu ne može izabrati PIC16F84, može se koristiti PIC16F628koji mu je najsličniji. Kako ni on ne proizvodi .asm već jedino .hex fajl, kasnije će bitineophodno i njegovo disasembliranje radi prevođenja koda za PIC16F84.

191

Page 192: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 192/209

98. A koliko to košta?

Kao programer morate odabrati najoptimalnije softversko / hardversko rešenje za Vaš projekat. Obično se rešenje nalazi u raznim kompromisima. Pre svega u ceni finalnog proizvoda.

 Nemojte misliti da su digitalne stvari one najbolje. One mogu odlično poslužiti ukontroli procesa ili u upravljanju raznim analognim uređajima, ali analognaelektronika i dalje drži veliko vođstvo. Iako je sasvim moguće koristiti digitalnesenzore temperature (npr. DS1820), pogledajte koliko koštaju pre nego što ih kupite.

 Nije li mnogo jeftinije koristiti NTC otpornik i A/D konvertor? Preciznost koju bistesa njim mogli dobiti možda Vam neće biti dovoljna za inkubator ili razvijanjefilmova, ali za regulaciju temperature prostorije svakako hoće. Ionako Vammikrokontroler u većini slučajeva bespotrebno troši dragocene taktove. Neka bar radinešto korisno, pogotovu ukoliko se time može uštedeti.

Kristalni oscilator daje mnogo precizniju frekvenciju od RC oscilatora, ali pitanje jekoliko Vam je ona u stvari potrebna. Uglavnom se može bez nje. Uporedite cenu XTsa cenom RC oscilatora. Ukoliko je to moguće, probajte mikrokontroleru što višesmanjiti takt, bez uticaja na pravovremeno izvršavanje programa. Radiće stabilnije,manje će se grejati, trošiće manje struje i duže će trajati. Mala brzina takta oscilatora uvećini slučajeva uopšte ne predstavlja nedostatak. Uostalom, zapitajte se šta pokrećeindustriju kompjutera. Video igrice! DVD možete gledati i na kompjuteru sa manje od800MHz.

Digitalna kola sa integrisanim satom i kalendarom sigurno Vam deluju primamljivo.

Ali pogledajte njihovu cenu! Uporedite je sa cenom 32,768kHz kristala!

Posebna situacija je LCD displej. Uglavnom je toliko malih dimenzija i toliko slaboosvetljen da se u praksi prilično malo koristi. Nemojte misliti da će Vam sa njimizgrađeni uređaji izgledati profesionalnije. Nema svrhe na LCD displeju prikazati 2 ili3 cifre, koje bi upotrebom LED displeja mogli mnogo jeftinije realizovati. Osim togaLED displej se može posmatrati pod svim uglovima i odlično se vidi po mraku.

Još jedna moderna novotarija je USB konekcija. Bila bi sasvim u redu, kada bi prosečan PIC mikrokontroler imao koji megabajt memorije. Ovako, jedina prednost joj je kompatibilnost između svih PC konfiguracija. Ne kažem da je to mala prednost,

ali zapitajte se po kojoj ceni Vam je potrebna.

192

Page 193: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 193/209

99. Marfijev zakon

U raznim projektima sa mikrokontrolerima mnogo šta može poći naopako. Na Vama je da predupredite što više verovatnih grešaka. Imajte u vidu da iako mikrokontroler može bez problema obavljati jako komplikovane operacije, ni on nije svemoguć. Vimu trebate obezbediti optimalne uslove za rad. Tu se pre svega misli na spoljnefizičke veličine koje mogu ometati rad mikrokontrolera, ili njegovih dodatnihsklopova. Svakako Vam je jasno da mikrokontroler ne smete koristiti u uslovimavlage, temperature, mehaničkih vibracija ili elektromagnetnog zračenja koje izlazi izgranica postavljenih u njegovom tehničkom uputstvu. Jedna od najčešćih grešaka jedirektno uključenje većih potrošača.

Ukoliko već imate neki potrošač (2-3kW) koji želite uključivati i isključivatimikrokontrolerom, morate znati da bi prevelika struja koju povuče taj potrošač utrenutku uključenja mogla izazvati pad napona u mreži, što bi uzrokovalo reset

mikrokontrolera usled spuštanja njegovog napona napajanja ispod određene granice.Isti slučaj može uzrokovati i običan relej zbog induktivne komponente njegovihnamotaja. O stabilnosti oscilatora u ovakvim slučajevima, da ni ne govorim.

Druga tipična greška je napon indukovan na štampanoj pločici i priključnimkablovima. Ne verujete da može toliko uticati? Uključite mobilni u blizini radio

 prijemnika. U praksi se čak javljaju i slučajevi korupcije programske memorije(moćnijim mikrokontrolera) zbog njihove mogućnosti programiranja niskim )+5Vumesto +12V) naponom.

Ovi problemi mogu se efektno rešiti upotrebom oklopljenih (koaksijalnih) kablova i

galvanskim odvajanjem mikrokontrolera od izvora smetnji optokaplerima.

Mnogo teže greške nastaju usled loše napisanog softvera. Nemojte se zavaravati.Ukoliko nešto može poći po zlu, budite uvereni da će poći. U nastavku teksta će bitiopisane situacije koje (ukoliko se na njih ne obrati pažnja) mogu dovesti donepravilnog rada programa.

Pinovi koji se ne koriste trebaju biti konfigurisani kao izlazi da ne bi prešli uvisokoimpedansno stanje. Ukoliko se pin RA4 ne koristi potrebno je pored toga

 postaviti ga na logičku 0 jer u stanju logičke 1 prelazi u visokoimpedansno stanje. Uvisokoimpedansnom stanju napon na pinovima može zaoscilovati.

Pinovi PORTA i PORTB registra su nakon uključenja preko TRISA i TRISB registradefinisani kao ulazni. Ukoliko na spoljni hardver želite odmah po uključenjumikrokontrolera dovesti logičku 1, morate pre podešavanja TRISA i TRISB registra

 podesiti PORTA i PORTB. Ukoliko to ne uradite, podesićete TRISA i TRISB, i na pinovima PORTA i PORTB registra javiće se nepoznato stanje. Vrednosti u PORTA iPORTB registrima po uključenju mikrokontrolera nisu inicijalizovane, što znači dastanje bitova u njima može biti bilo kakvo.

Definisanje pinova kao izlaza pre nego što se promeni nepoznata vrednost u PORTA iPORTB registru može dovesti do kratkog neželjenog pojavljivanja logičke 0 ili 1 na

 pinovima mikrokontrolera. Da biste se osigurali od ovoga, poželjno je da u .asm

193

Page 194: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 194/209

zaglavlju koje koristite za razvoj novih programa unapred inicijalizujete stanje naPORTA i PORTB registrima pre promene TRISA registra. U stvari poželjno je ubacitiinicijalizaciju u zaglavlje za sve najkorišćenije registre (npr. INTCON iOPTION_REG) zajedno sa njihovim kratkim objašnjenjima, da se njihovainicijalizacija ne bi previdela.

Ukoliko su direktno na mikrokontroler povezani prekidači, morate na ulaznim pinovima postaviti pull up ili pull down otpornike. Najpraktičnije je koristitiintegrisane pull up otpornike na PORTB. U protivnom, zračenje vašeg mobilnogtelefona, pojačana aktivnost sunčevih pega pa čak i komšničin upravo uključenusisivač mogu dovesti do prelaska ulaznog pina u nedefinisano stanje i lažnu detekciju

 pritisnutog tastera.

Program bez debouncing rutine radiće bez problema dok su kontakti prekidača novi.Čim se oni iskrzaju, program će detektovati više uzastopnih pritisaka prekidača.

Korisnici uvek mogu pritisnuti 2, 3 ili više tastera istovremeno. Budite sigurni da će

 bar neko od njih to i učiniti. Program mora biti napisan tako da predvidi i tumogućnost.

Poseban slučaj predstavljaju greške izazvane internim ciklusom čitanja i upisa stanjasa porta (eng. RMW –  R ead, Modify Write). Prilikom izmene stanja portainstrukcijom bcf PORTA,2 mikrokontroler će očitati trenutno stanje svih pinovaPORTA registra, resetovati bit 2 i postaviti dobijeno stanje u PORTA. Međutim,ukoliko je na primer pin RA0 definisan kao izlazni sa logičkom 1, ali se iz bilo kograzloga (previše mala impedansa na liniji) pin RA0 trenutno nalazi u stanju u komenije postavljen, moguće je da mikrokontroler pri RMW ciklusu sa njega očita logičku0 umesto logičku 1, i da mu na taj način greškom prilikom upisa promeni stanje. Da bi

se ovo izbeglo, poželjno je ne izvršavati operacije direktno nad portovima, već sveoperacije obavljati nad shaddow registrom, a tek kasnije, kada je to neophodnokopirati rezultat u odgovarajući port.

Umesto čekanja na setovanje flaga kraja upisa u EEPROM možete (ukoliko vam brzina nije imperativ) jednostavno sačekati dovoljno dugo da se upis sigurno završi.Takođe dobra je praksa testiranje maksimalnog vremena snimanja i nastavak 

 programa ukoliko je ono mnogo duže od normalnog ignorišući pri tome stanje flaga. Na taj način sigurni ste da će program ispravno raditi čak i da mikrokontroler (iz bilokog razloga) ne setuje pravovremeno flag.

EEPROM memorija mikrokontrolera ima svoj radni vek. Ne bi smeli dozvoliti programu snimanje preko vrednosti specificirane u tehničkom uputstvu. Bolje poinicijalizaciji mikrokontrolera obavite sve potrebne operacije u običnoj (RAM)memoriji, a snimajte u EEPROM, samo kada je to neophodno. Ipak, sam PIC je

 prilično izdržljiv. Evo dobrog primera sa jedne mailing liste.

From: "nepe_yu" To: [email protected]: [mikroelektronika] Re: Pouzdanost PIC-ova (WDT)

A evo i mog skromnog iskustva :) Naime greškom sam u jednom projektu upis, uinterni EEPROM PIC18F452 mikrokontrolera, vršio na 100mS neprekidno, i nakon

194

Page 195: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 195/209

više meseci rada ta lokacija EEPROMa je stradala. "Obdukcijom" je utvrđeno da jeviše od 12000000 (12 miliona) puta izvršen upis pre nego što se javio problem :) Eto,ima i pozitivnih iskustava :)))

Dobru praksu predstavlja kratko uključenje svih LED za vreme inicijalizacijemikrokontrolera. Na taj način odmah po uključenju mikrokontrolera možete primetiti

da li su svi segmenti LED displeja kao i pojedinačne LED ispravne.

Ukoliko je moguće, u toku inicijalizacije testirajte i eksterne komponente. Na primer digitalni senzor temperature je očigledno neispravan ukoliko prijavljuje temperaturuapsolutne nule (-273oC). Detekciju bilo kakvog kvara mikrokontroler možesignalizirati treperenjem displeja ili pojedinačnih LED uz eventualni opis greške (npr trepereća oznaka E1 na LED displeju signalizira prekid veza do senzora osvetljenostiutvrđenu njegovom prevelikom otpornošću, a trepereća oznaka E2 neispravnostdigitalnog senzora temperature utvrđenu izlaskom merene temperature iz njenoguobičajenog - radnog opsega). Na taj način bliže određujete mesto kvara, što vammože pomoći prilikom opravke.

Microchip je takođe imao Marfija na umu kada je projektovao mikrokontrolere paasembler u sve neiskorišćene adrese programske memorije snima kod NOPinstrukcije. Nakon maksimalne programske adrese 3xFF program se nastavlja od

 početka (0x00). Ipak, problem može izazvati adresiranje memorije koja nijeimplementovana u PIC16F84 mikrokontroleru (4x00 – 1FxFF), jer će se ona ponašatikao da je u njoj mapirana obična (radna) programska memorija. Potpuno je istoadresiranje lokacija 0x20, 4x20, 8x20, Cx20, 10x20, 14x20, 18x20 i 1Cx20. Ovo suipak ekstremni slučajevi i ne bi Vas trebali brinuti.

195

Page 196: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 196/209

100. Dobar (user frendly) dizajn

Pogledajte Vaš daljinski za TV! Trebaju li vam svi ti dugmići? Da li ste ikada uspelida programirate svoj klima uređaj tako da se automatski uključuje svakoga dana u6:00? Jeste li se iznervirali što vam instaliran Office paket zauzima cak 1Gb harddiska, iako je poznato da prosečan korisnik iskoristi jedva 2% mogućnosti programaza obradu teksta? Pogledajte tastaturu Vašeg kompjutera. Možete li (kao kod pisaćemašine) odgovarajućim prstom pritisnuti bilo koje dugme na njoj, ne pomerajući celušaku?

U osnovi svakog dobrog dizajna leži jednostavnost i maksimalno prilagođenjemotorici i intelektualnim sposobnostima krajnjeg korisnika. Moj otac i dalje koristimehaničku „Unix“ pisaću mašinu, jer ne uspeva napraviti dupli klik, a majci sammorao kupiti pravu „ciglu“ od mobilnog, da bi uspela pritiskati jedan po jedan taster, ane više njih istovremeno. Pogledajte broj 5 na vašem mobilnom telefonu i

numeričkom delu tastature kompjutera. Primećujete li da se razlikuje od ostalih? Nama to nije potrebno. Ali jeste osobama sa oštećenim vidom.

Pogledajte sledeći primer. Potrebno je na LED displeju prikazati broj od 00 do 99.Željeni broj trebate podesiti preko ulaznog interfejsa. Postoji mali milion načina nakoje možete realizovati ovakav zadatak. Ovde je prikazano par primera, a Vi sami

 procenite koji bi spadali u dobar dizajn.

1. Dva prekidača (+ za povećanje broja i – za smanjenje) vezani su kao ulazi sasvojim pull-up otpornicima. Detekcija pritisnutosti se obavlja softverski, bezdebouncing rutine, jedino sa pauzom od trećine sekunde po pritisnutom

tasteru, nakon čega se izvršava nova detekcija. Za prebacivanje sa 00 na 99 naovakav način potrebno je čekati čak 30 sekundi.

2. Softver je prepravljen tako da se i za vreme pauze testira prekidač. Ukoliko se pritisne a da još nije istekla trećina sekunde, ponaša se kao da je protekla.Tako se može bržim uzastopnim pritiskanjem prekidača smanjiti vreme

 podešavanja. Zbog nepostojanja debouncing rutine, i dalje je moguće je da se jednim pritiskom preskoči koji broj.

3. Dodata je debouncing rutina.

4. Rutina za pauzu prepravljena je tako da pauza nakon prvog pritiska iznosi0,75S, a da se zatim (ukoliko je prekidač i dalje pritisnut) u sledećih par 

 pozivanja smanjuje do npr. 0,15S, i nadalje ostaje na toj vrednosti. Pootpuštanju i ponovnom pritiskanju prekidača, pauza bi opet počela odmaksimalne vrednosti. Ovim je podešavanje olakšano (zbog smanjenja brzineinicijalnog ponavljanja), a vreme za podešavanje smanjeno je (zbog veće

 brzine ponavljanja) na oko 19S.

5. Umesto dva prekidača postavljen je rotacioni enkoder. Na taj način se jednim jedinim pokretom ruke može fino podesiti željeno vreme. Vreme potrebno za podešavanje smanjeno je na oko 5S. Ovo je za korisnika najlogičniji način

 podešavanja vremena. Zato se i koristi kod npr. mikrotalasnih pećnica.

196

Page 197: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 197/209

6. Umesto rotacionog enkodera postavljena je tastatura sa ciframa „0“ do „9“ itasterom „DALJE“ bez debouncing rutine, ali sa pauzom od trećine sekunde

 po pritisnutom tasteru. Vreme potrebno za podešavanje iznosi oko 3S.

7. Dodata je debouncing rutina. Vreme za podešavanje iznosi samo 2S.

Sigurno ste i Vi došli do zaključka da bi jedino načini pod tačkom 4, 5 i 7 bilinajprilagođeniji korisniku. Koji način će se koristiti zavisi jedino od broja slobodnih pinova i cene odgovarajućeg interfejsa.

Osim ulaznih, nije teško ostvariti poboljšanja ni na izlaznom hardveru. Šta mislite oLED displeju koji menja jačinu svog svetla u zavisnosti od spoljnog osvetljenja?

 Noću bi svetleo slabo, a danju jako. Osim što lepše izgleda (ne blješti), displej će Vamduže trajati.

Ukoliko imate česte nestašice struje, pa ste zbog toga za sat predvideli dodatnonapajanje baterijom, nema potrebe da LED displej bude svo vreme uključen. Ako ga

već morate uključivati kada nema napajanja iz mreže, neka to bude po pritisku taster  prekidača i na kratko.

197

Page 198: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 198/209

101. Servisni mod

Pogledajte svoj mobilni telefon. Da li ste znali da kombinacijom određenih tasteramožete proveriti tačno stanje brojača minuta i prenešenih GPRS podataka? Prilikom

 blokade auto radia, dovoljno je na njegovoj tastaturi otkucati sigurnosni kod da bi seodblokirao. Ove stvari realizovane su upravo upotrebom tzv. servisnog moda.

Servisni mod nije (bar kod PIC16F84) poput SLEEP moda integrisan u sammikrokontroler. Potrebno je da ga sami osmislite. Zove se servisni jer mu pristupimaju jedino programeri i serviseri (tačnije svi oni koji znaju tajni postupak ulaska).Ukoliko vaš program koristi multitasking operativni sistem, najpraktičnije je

 predvideti ulaz u program preko njega.

Servisni mod namenjen je pre svega Vama, kako bi vam olakšao testiranjemikrokontrolera u praksi. U njega se ulazi postupcima koji nisu uobičajeni za običnog

korisnika. To može biti držanje određenog tastera pritisnutog 10S, brza kombinacijaodređenih tastera (kao upis šifre) ili pritiskanjem (za korisnika nedostupnog) prekidača kojim bi se izazvao interapt na RB0/INT pinu.

Šta raditi u servisnom modu? To zavisi jedino od Vas. Ukoliko Vam je to bitno,možete stanje određenih registra ili flagova prikazati na već postojećim LED. Amožete i poslati stanje svih registara u kompjuter preko RS232 veze (eng. in-circuitdebugging). Čak to možete raditi po pojavi interapta ili iz samog programa

 postavljajući na željenim mestima tačke prekida (eng. break points) sa pozivom potprograma za servisni mod. Ne zaboravite jedino da pre povratka na glavni programvratite ranija stanja registra (obično STATUS i W) kao u interaptima.

Sa strane programiranja, servisni mod Vam može odlično poslužiti za testiranje kraćih potprograma ili rutina pre njihove implementacije u glavni program, ili za „spoljno“ podešavanje stanja određenih registra sa snimanjem u EEPROM. Na taj način možete podesiti mikrokontroler direktno na završenom projektu, čime izbegavate češće premeštanje i programiranje mikrokontrolera. Ono što (zbog spoljnih interfejsa) nijemoguće testirati u simulatoru, upotrebom servisnog moda postaje moguće.

Ukoliko već imate gotov i proveren program, možda bi Vam bila interesantnamogućnost njegove kasnije nadogradnje. Uz par jeftinih elemenata na štampanoj

 pločici i odgovarajućeg konektora možete projektovati svoj proizvod tako da mu

omogućite lakšu zamenu programa (eng. In Circuit Serial Programming) kasnije, ili utoku samog ispitivanja programa. Naravno, eksterni hardver programatora je i daljeneophodan.

198

Page 199: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 199/209

102. To je to. Šta sada?

Sada imate odlične polazne osnove za dalji rad sa mikrokontrolerima. Ukoliko vam idanje nešto nije jasno, pitajte. Internet je pun entuzijasta voljnih da vam pomognu,samo ako se lepo zamole. Naravno, ne možete očekivati da će vam besplatno napraviti

 program koji vam je potreban, ali ukoliko zapnete negde, tu su. Možete ih naći naforumima  www .elitesecurity.org, www.elektronika.ba, www.microchip.com,www.kazus.ru  i raznim drugim sajtovima. Da biste uopšte mogli očekivati odgovor,

 budite strpljivi (niko ne dežura pored kompjutera da bi eto baš vama momentalnoodgovorio) i iscrpni u opisu svog problema. X puta mi se dogodilo (x teži

 beskonačnosti) da jednostavno nemam ni najmanju predstavu o tome šta je neko hteoda me pita. Najbolje je opisati šta želite da vaš program radi, dokle ste do sada stigli ina koji način se mogu reprodukovati greške koje dobijate u radu programa. Poželjno

 je da ukoliko je to potrebno postavite svoj program (ili njegove delove za koje tražitesavet) na sajt. Radi bolje čitljivosti programa pre objavljivanja podesite labele i

operande razmacima umesto tabulatorom i postavite listing između [code] i [/code]tagova. Nije na odmet ni postaviti sliku ili opis električne šeme.

 Nažalost, trenutna situacija u našoj zemlji je takva da malo ko želi da podeli svojeznanje (makar i fragmente znanja) sa drugima. Ukoliko i Vi spadate u takve osobe, pasmatrate da će Vam vaš program doneti milione, ali eto zapeli ste kod neke greške inikako da je otklonite, bolje se nemojte ni javljati po forumima. Ukoliko ne podelitesa ostalima detaljan opis problema koji Vas muči (sa primerom koda i električnomšemom) svakako da se ne možete nadati pravom, možda mnogo konstruktivnijemodgovoru.

Mikrokontroleri se neprestano razvijaju. PIC16F84 je već zastareo. Dobro je što vamuz naučeno gradivo prelazak na jače (ili slabije) familije neće teško pasti.

PIC10 i PIC12 serija ima dosta ograničenja u primeni. Imaju samo dva nivoa steka,malu memoriju i komplikovano straničenje memorije. Ipak, zbog minijaturnih kućištai male cene mogu predstavljati dobar izbor za manje zahtevne aplikacije.

U celoj PIC16 seriji mikrokontrolera imate iste instrukcije objašnjene u ovomuputstvu. Naravno, hardverske razlike su svakako prisutne i samim tim registri imajurazličite adrese i namene, ali Vam uz postojeće .inc fajlove to nije preterano bitno.

PIC17 serija uvodi 16 nivoa steka, olakšano čitanje tabela i dodatni set instrukcija.Ona nije stekla popularnost među programerima, tako da možete imati problema

 prilikom njene nabavke.

PIC18 serije su još naprednije (uz 42 nove instrukcije u odnosu na PIC16 seriju),imaju 31 nivo steka, nemaju straničenje programske (ne i RAM) memorije, i nudenove hardverske dodatke (npr. integrisani USB2 kontroler).

U PIC24 i dsPIC seriji stek je umesto hardverski, implementovan softverski, a umesto jednog radnog (W) registra uvedeno je čak 16. Instrukcijski set je dosta izmenjen.Zbog namenskog hardvera PIC24 serija prilagođena je upravljanju motorima a dsPIC

digitalnom procesiranju signala (eng. DSP - Digital Signal Processing).

199

Page 200: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 200/209

 Najnovija Microchip familija mikrokontrolera PIC32mx omogućuje rad satridesetdvobitnim instrukcijama, ali nažalost instrukcije su joj potpuno različite odranijih serija. Izgleda da je Microchip rešio da prilagodi svoje proizvode i za

 programski jezik C koji u ranijim serijama nije bio efektno zastupljen.

Umesto PIC16F84 mikrokontrolera možete uz odgovarajuće izmene softvera koristiti

PIC16F628 koji ima duplo više memorije, integrisani PWM i RS232 i još dva tajmerauz duplo manju cenu. Ukoliko su Vam bitni A/D konvertori idealno rešenje predstavljaju 18-pinski PIC16F88 i 40-pinski PIC16F877.

Uz ovakve osnove možete isprobati i druge familije mikrokontrolera. Trenutno suaktuelne serije AVR i Motorola. Nažalost motorolini mikrokontroleri (iako odlični i

 jeftini) imaju prilično skup softver, a i dostava im može biti problematična za našuzemlju.

Ono što čini mikrokontrolere toliko moćnim nije njihova brzina, memorija niintegrisani hardver, već ideja o njihovoj mogućoj upotrebi u svakodnevnom životu, i

 poboljšanja koja bi se njihovom upotrebom mogla ostvariti. Ukoliko već nemateuslova da mikrokontrolerima poboljšate industrijske mašine, počnite od svogdomaćinstva. Stepenični automat za svetlo, elektronska brava, zvono, tajmer zaosvetljenje akvarijuma, tajmer za prehranu pčela zimi, automatska hranilica za kućneljubimce, digitalni podsetnik, brzinomer za biciklu, sve su to mali projekti koji Vammogu pomoći u svakodnevnom životu.

Deluje jednostavno? Setite se svog prvog programa. Mogućnost za nadogradnju uvek  postoji.

200

Page 201: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 201/209

103. Prilozi

Priloge na narednim stranama poželjno je štampati posebno, kako bi Vam uvek bili nadohvatu ruke. Možete ih koristiti kako bi se brzo podsetili tačnog naziva instrukcija ili

 banke registara.

 XOR

0 0 0

0 1 1

1 0 1

1 1 0

00101110XOR 10010110= 10111000

Rezultat XOR operacije će biti logička 1 samo ukoliko su muoba operanda različita. Ukoliko su ista (obe 0 ili obe 1), rezultatće biti logička 0.

 AND

0 0 00 1 0

1 0 0

1 1 1

01101011AND 10100101= 00100001

Rezultat AND operacije biće logička 1 samo ukoliko su obaoperanda na logičkoj 1. Ukoliko bar jedan nije, rezultat će bitilogička 0.

 IOR

0 0 0

0 1 1

1 0 1

1 1 1

01101011IOR 10100101= 11101111

Rezultat IOR operacije biće logička 1 ukoliko je bar na jednom

operandu prisutna logička 1. Ukoliko su oba na logičkoj 0, irezultat će biti jednak logičkoj 0.

COM 

0 1

1 0

COM 01101011= 10010100

Komplement ili invertovanje predstavlja logičku operaciju ukojoj svaki bit u bajtu menja svoju vrednost.

201

Page 202: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 202/209

 Dec Hex Bin BCD Ozn

.0 0x00 b'0000 0000' 00 0

.1 0x01 b'0000 0001' 01 +.1

.2 0x02 b'0000 0010' 02 +.2

.3 0x03 b'0000 0011' 03 +.3.4 0x04 b'0000 0100' 04 +.4

.5 0x05 b'0000 0101' 05 +.5

.6 0x06 b'0000 0110' 06 +.6

.7 0x07 b'0000 0111' 07 +.7

.8 0x08 b'0000 1000' 08 +.8

.9 0x09 b'0000 1001' 09 +.9

.10 0x0A b'0000 1010' 0x +.10

.11 0x0B b'0000 1011' 0x +.11

.12 0x0C b'0000 1100' 0x +.12

.13 0x0D b'0000 1101' 0x +.13

.14 0x0E b'0000 1110' 0x +.14

.15 0x0F b'0000 1111' 0x +.15

 Dec Hex Bin BCD Ozn

.16 0x10 b'0001 0000' 10 +.16

.17 0x11 b'0001 0001' 11 +.17

.18 0x12 b'0001 0010' 12 +.18

.19 0x13 b'0001 0011' 13 +.19.20 0x14 b'0001 0100' 14 +.20

.21 0x15 b'0001 0101' 15 +.21

.22 0x16 b'0001 0110' 16 +.22

.23 0x17 b'0001 0111' 17 +.23

.24 0x18 b'0001 1000' 18 +.24

.25 0x19 b'0001 1001' 19 +.25

.26 0x1A b'0001 1010' 1x +.26

.27 0x1B b'0001 1011' 1x +.27

.28 0x1C b'0001 1100' 1x +.28

.29 0x1D b'0001 1101' 1x +.29

.30 0x1E b'0001 1110' 1x +.30

.31 0x1F b'0001 1111' 1x +.31

 Dec Hex Bin BCD Ozn

.32 0x20 b'0010 0000' 20 +.32

.33 0x21 b'0010 0001' 21 +.33

.34 0x22 b'0010 0010' 22 +.34

.35 0x23 b'0010 0011' 23 +.35

.36 0x24 b'0010 0100' 24 +.36

.37 0x25 b'0010 0101' 25 +.37

.38 0x26 b'0010 0110' 26 +.38

.39 0x27 b'0010 0111' 27 +.39

.40 0x28 b'0010 1000' 28 +.40

.41 0x29 b'0010 1001' 29 +.41

.42 0x2A b'0010 1010' 2x +.42

.43 0x2B b'0010 1011' 2x +.43

.44 0x2C b'0010 1100' 2x +.44

.45 0x2D b'0010 1101' 2x +.45

.46 0x2E b'0010 1110' 2x +.46

.47 0x2F b'0010 1111' 2x +.47

 Dec Hex Bin BCD Ozn

.48 0x30 b'0011 0000' 30 +.48

.49 0x31 b'0011 0001' 31 +.49

.50 0x32 b'0011 0010' 32 +.50

.51 0x33 b'0011 0011' 33 +.51

.52 0x34 b'0011 0100' 34 +.52

.53 0x35 b'0011 0101' 35 +.53

.54 0x36 b'0011 0110' 36 +.54

.55 0x37 b'0011 0111' 37 +.55

.56 0x38 b'0011 1000' 38 +.56

.57 0x39 b'0011 1001' 39 +.57

.58 0x3A b'0011 1010' 3x +.58

.59 0x3B b'0011 1011' 3x +.59

.60 0x3C b'0011 1100' 3x +.60

.61 0x3D b'0011 1101' 3x +.61

.62 0x3E b'0011 1110' 3x +.62

.63 0x3F b'0011 1111' 3x +.63

202

Page 203: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 203/209

 Dec Hex Bin BCD Ozn

.64 0x40 b'0100 0000' 40 +.64

.65 0x41 b'0100 0001' 41 +.65

.66 0x42 b'0100 0010' 42 +.66

.67 0x43 b'0100 0011' 43 +.67.68 0x44 b'0100 0100' 44 +.68

.69 0x45 b'0100 0101' 45 +.69

.70 0x46 b'0100 0110' 46 +.70

.71 0x47 b'0100 0111' 47 +.71

.72 0x48 b'0100 1000' 48 +.72

.73 0x49 b'0100 1001' 49 +.73

.74 0x4A b'0100 1010' 4x +.74

.75 0x4B b'0100 1011' 4x +.75

.76 0x4C b'0100 1100' 4x +.76

.77 0x4D b'0100 1101' 4x +.77

.78 0x4E b'0100 1110' 4x +.78

.79 0x4F b'0100 1111' 4x +.79

 Dec Hex Bin BCD Ozn

.80 0x50 b'0101 0000' 50 +.80

.81 0x51 b'0101 0001' 51 +.81

.82 0x52 b'0101 0010' 52 +.82

.83 0x53 b'0101 0011' 53 +.83.84 0x54 b'0101 0100' 54 +.84

.85 0x55 b'0101 0101' 55 +.85

.86 0x56 b'0101 0110' 56 +.86

.87 0x57 b'0101 0111' 57 +.87

.88 0x58 b'0101 1000' 58 +.88

.89 0x59 b'0101 1001' 59 +.89

.90 0x5A b'0101 1010' 5x +.90

.91 0x5B b'0101 1011' 5x +.91

.92 0x5C b'0101 1100' 5x +.92

.93 0x5D b'0101 1101' 5x +.93

.94 0x5E b'0101 1110' 5x +.94

.95 0x5F b'0101 1111' 5x +.95

 Dec Hex Bin BCD Ozn

.96 0x60 b'0110 0000' 60 +.96

.97 0x61 b'0110 0001' 61 +.97

.98 0x62 b'0110 0010' 62 +.98

.99 0x63 b'0110 0011' 63 +.99

.100 0x64 b'0110 0100' 64 +.100

.101 0x65 b'0110 0101' 65 +.101

.102 0x66 b'0110 0110' 66 +.102

.103 0x67 b'0110 0111' 67 +.103

.104 0x68 b'0110 1000' 68 +.104

.105 0x69 b'0110 1001' 69 +.105

.106 0x6A b'0110 1010' 6x +.106

.107 0x6B b'0110 1011' 6x +.107

.108 0x6C b'0110 1100' 6x +.108

.109 0x6D b'0110 1101' 6x +.109

.110 0x6E b'0110 1110' 6x +.110

.111 0x6F b'0110 1111' 6x +.111

 Dec Hex Bin BCD Ozn

.112 0x70 b'0111 0000' 70 +.112

.113 0x71 b'0111 0001' 71 +.113

.114 0x72 b'0111 0010' 72 +.114

.115 0x73 b'0111 0011' 73 +.115

.116 0x74 b'0111 0100' 74 +.116

.117 0x75 b'0111 0101' 75 +.117

.118 0x76 b'0111 0110' 76 +.118

.119 0x77 b'0111 0111' 77 +.119

.120 0x78 b'0111 1000' 78 +.120

.121 0x79 b'0111 1001' 79 +.121

.122 0x7A b'0111 1010' 7x +.122

.123 0x7B b'0111 1011' 7x +.123

.124 0x7C b'0111 1100' 7x +.124

.125 0x7D b'0111 1101' 7x +.125

.126 0x7E b'0111 1110' 7x +.126

.127 0x7F b'0111 1111' 7x +.127

203

Page 204: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 204/209

 Dec Hex Bin BCD Ozn

.128 0x80 b'1000 0000' 80 -.1

.129 0x81 b'1000 0001' 81 -.2

.130 0x82 b'1000 0010' 82 -.3

.131 0x83 b'1000 0011' 83 -.4.132 0x84 b'1000 0100' 84 -.5

.133 0x85 b'1000 0101' 85 -.6

.134 0x86 b'1000 0110' 86 -.7

.135 0x87 b'1000 0111' 87 -.8

.136 0x88 b'1000 1000' 88 -.9

.137 0x89 b'1000 1001' 89 -.10

.138 0x8A b'1000 1010' 8x -.11

.139 0x8B b'1000 1011' 8x -.12

.140 0x8C b'1000 1100' 8x -.13

.141 0x8D b'1000 1101' 8x -.14

.142 0x8E b'1000 1110' 8x -.15

.143 0x8F b'1000 1111' 8x -.16

 Dec Hex Bin BCD Ozn

.144 0x90 b'1001 0000' 90 -.17

.145 0x91 b'1001 0001' 91 -.18

.146 0x92 b'1001 0010' 92 -.19

.147 0x93 b'1001 0011' 93 -.20.148 0x94 b'1001 0100' 94 -.21

.149 0x95 b'1001 0101' 95 -.22

.150 0x96 b'1001 0110' 96 -.23

.151 0x97 b'1001 0111' 97 -.24

.152 0x98 b'1001 1000' 98 -.25

.153 0x99 b'1001 1001' 99 -.26

.154 0x9A b'1001 1010' 9x -.27

.155 0x9B b'1001 1011' 9x -.28

.156 0x9C b'1001 1100' 9x -.29

.157 0x9D b'1001 1101' 9x -.30

.158 0x9E b'1001 1110' 9x -.31

.159 0x9F b'1001 1111' 9x -.32

 Dec Hex Bin BCD Ozn

.160 0xA0 b'1010 0000' x0 -.33

.161 0xA1 b'1010 0001' x1 -.34

.162 0xA2 b'1010 0010' x2 -.35

.163 0xA3 b'1010 0011' x3 -.36

.164 0xA4 b'1010 0100' x4 -.37

.165 0xA5 b'1010 0101' x5 -.38

.166 0xA6 b'1010 0110' x6 -.39

.167 0xA7 b'1010 0111' x7 -.40

.168 0xA8 b'1010 1000' x8 -.41

.169 0xA9 b'1010 1001' x9 -.42

.170 0xAA b'1010 1010' xx -.43

.171 0xAB b'1010 1011' xx -.44

.172 0xAC b'1010 1100' xx -.45

.173 0xAD b'1010 1101' xx -.46

.174 0xAE b'1010 1110' xx -.47

.175 0x2F b'1010 1111' xx -.48

 Dec Hex Bin BCD Ozn

.176 0xB0 b'1011 0000' x0 -.49

.177 0xB1 b'1011 0001' x1 -.50

.178 0xB2 b'1011 0010' x2 -.51

.179 0xB3 b'1011 0011' x3 -.52

.180 0xB4 b'1011 0100' x4 -.53

.181 0xB5 b'1011 0101' x5 -.54

.182 0xB6 b'1011 0110' x6 -.55

.183 0xB7 b'1011 0111' x7 -.56

.184 0xB8 b'1011 1000' x8 -.57

.185 0xB9 b'1011 1001' x9 -.58

.186 0xBA b'1011 1010' xx -.59

.187 0xBB b'1011 1011' xx -.60

.188 0xBC b'1011 1100' xx -.61

.189 0xBD b'1011 1101' xx -.62

.190 0xBE b'1011 1110' xx -.63

.191 0xBF b'1011 1111' xx -.64

204

Page 205: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 205/209

 Dec Hex Bin BCD Ozn

.192 0xC0 b'1100 0000' x0 -.65

.193 0xC1 b'1100 0001' x1 -.66

.194 0xC2 b'1100 0010' x2 -.67

.195 0xC3 b'1100 0011' x3 -.68.196 0xC4 b'1100 0100' x4 -.69

.197 0xC5 b'1100 0101' x5 -.70

.198 0xC6 b'1100 0110' x6 -.71

.199 0xC7 b'1100 0111' x7 -.72

.200 0xC8 b'1100 1010' x8 -.73

.201 0xC9 b'1100 1001' x9 -.74

.202 0xCA b'1100 1010' xx -.75

.203 0xCB b'1100 1011' xx -.76

.204 0xCC b'1100 1100' xx -.77

.205 0xCD b'1100 1101' xx -.78

.206 0xCE b'1100 1110' xx -.79

.207 0xCF b'1100 1111' xx -.80

 Dec Hex Bin BCD Ozn

.208 0xD0 b'1101 0000' x0 -.81

.209 0xD1 b'1101 0001' x1 -.82

.210 0xD2 b'1101 0010' x2 -.83

.211 0xD3 b'1101 0011' x3 -.84.212 0xD4 b'1101 0100' x4 -.85

.213 0xD5 b'1101 0101' x5 -.86

.214 0xD6 b'1101 0110' x6 -.87

.215 0xD7 b'1101 0111' x7 -.88

.216 0xD8 b'1101 1000' x8 -.89

.217 0xD9 b'1101 1001' x9 -.90

.218 0xDA b'1101 1010' xx -.91

.219 0xDB b'1101 1011' xx -.92

.220 0xDC b'1101 1100' xx -.93

.221 0xDD b'1101 1101' xx -.94

.222 0xDE b'1101 1110' xx -.95

.223 0xDF b'1101 1111' xx -.96

 Dec Hex Bin BCD Ozn

.224 0xE0 b'1110 0000' x0 -.97

.225 0xE1 b'1110 0001' x1 -.98

.226 0xE2 b'1110 0010' x2 -.99

.227 0xE3 b'1110 0011' x3 -.100

.228 0xE4 b'1110 0100' x4 -.101

.229 0xE5 b'1110 0101' x5 -.102

.230 0xE6 b'1110 0110' x6 -.103

.231 0xE7 b'1110 0111' x7 -.104

.232 0xE8 b'1110 1000' x8 -.105

.233 0xE9 b'1110 1001' x9 -.106

.234 0xEA b'1110 1010' xx -.107

.235 0xEB b'1110 1011' xx -.108

.236 0xEC b'1110 1100' xx -.109

.237 0xED b'1110 1101' xx -.110

.238 0xEE b'1110 1110' xx -.111

.239 0xEF b'1110 1111' xx -.112

 Dec Hex Bin BCD Ozn

.240 0xF0 b'1111 0000' x0 -.113

.241 0xF1 b'1111 0001' x1 -.114

.242 0xF2 b'1111 0010' x2 -.115

.243 0xF3 b'1111 0011' x3 -.116

.244 0xF4 b'1111 0100' x4 -.117

.245 0xF5 b'1111 0101' x5 -.118

.246 0xF6 b'1111 0110' x6 -.119

.247 0xF7 b'1111 0111' x7 -.120

.248 0xF8 b'1111 1000' x8 -.121

.249 0xF9 b'1111 1001' x9 -.122

.250 0xFA b'1111 1010' xx -.123

.251 0xFB b'1111 1011' xx -.124

.252 0xFC b'1111 1100' xx -.125

.253 0xFD b'1111 1111' xx -.126

.254 0xFE b'1111 1110' xx -.127

.255 0xFF b'1111 1111' xx -.128

205

Page 206: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 206/209

 Instrukcija Opis Cik. Kod Flagovi Nap.

Prepis podataka

MOVF f,d Prepiši f u d 1 001000 dfffffff Z 1 2

MOVWF f Prepiši W u f 1 000000 1fffffff

MOVLW k Upiši konstantu u W 1 1100xx kkkkkkkk

CLRF f Upiši 0 u f 1 000001 1fffffff Z 2CLRW Upiši 0 u W 1 000001 0xxxxxxx Z

SWAPF f,d Prepiši unakrsno niblove iz f u d 1 001110 dfffffff 1 2

Aritmetičko logičke operacije

ADDWF f,d Saberi W i f 1 000111 dfffffff C DC Z 1 2

ADDLW k Saberi W sa konstantom 1 11111x kkkkkkkk C DC Z

SUBWF f,d Oduzmi W od f 1 000010 dfffffff C DC Z 1 2

SUBLW k Oduzmi W od konstante 1 11110x kkkkkkkk C DC Z

INCF f,d Uvećaj f 1 001010 dfffffff Z 1 2

DECF f,d Smanji f 1 001011 dfffffff Z 1 2IORWF f,d Logičko ILI W sa f 1 000100 dfffffff Z 1 2

IORLW k Logičko ILI W sa konstantom 1 111000 kkkkkkkk Z

ANDWF f,d Logičko I W sa f 1 000101 dfffffff Z 1 2

ANDLW k Logičko I W sa konstantom 1 11111x kkkkkkkk Z

XORWF f,d Logičko ISKLJUČUVO ILI W sa f 1 000110 dfffffff Z 1 2

XORLW k Logičko ISKLJUČUVO ILI W sa kon. 1 111010 kkkkkkkk Z

COMF f,d Invertuj f 1 001001 dfffffff Z 1 2

Operacije sa bitovima

BCF f,b Resetuj bit b u f 1 0100bb bfffffff 1 2BSF f,b Setuj bit b u f 1 0101bb bfffffff 1 2

RLF f,d Rotiraj nalevo kroz CARRY 1 001101 dfffffff C 1 2

RRF f,d Rotiraj nadesno kroz CARRY 1 001100 dfffffff C 1 2

Upravljanje tokom programa

BTFSC f,b Test bita b u f, preskoči ako je bit = 0 1 (2) 0110bb bfffffff 3

BTFSS f,b Test bita b u f, preskoči ako je bit = 1 1 (2) 0111bb bfffffff 3

INCFSZ f,d Uvećaj f, preskoči ako je = 0 1 (2) 001111 dfffffff 1 2 3

DECFSZ f,d Smanji f, preskoči ako je = 0 1 (2) 001011 dfffffff 1 2 3

GOTO k Idi na adresu 2 101kkk kkkkkkkkCALL k Pozovi potprogram 2 100kkk kkkkkkkk

RETURN Vrati se iz potprograma 2 000000 00001000

RETLW k Vrati se sa konstantom u W 2 1101xx kkkkkkkk

RETFIE Vrati se iz interapta 2 000000 00001001

Ostalo

 NOP Bez operacije 1 000000 0xx00000

CLRWDT Inicijalizuj watchdog tajmer 1 000000 01100100 TO PD

SLEEP Prelazak u sleep mod 1 000000 01100011 TO PD

206

Page 207: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 207/209

Legenda:

f – adresa registraW – W registar b – adresa bita unutar osmobitnog registrak – konstantna (nepromenljiva) vrednost ili labela

x – nebitan bit (njegova vrednost se ignoriše. Asembler ga automatski resetuje)d – odredište: d=0 rezultat u W, d=1 rezultat u f C – Carry flag STATUS registraDC – Digit Carry flag STATUS registraZ – Zero flag STATUS registraTO – Time out bit STATUS registraPD – Power down bit STATUS registra

 Napomene:

1 – Ukoliko je izlazni pin očitan pa modifikovan od strane jedne instrukcije (npr.

movf PORTB,f), vrednost koja je uzeta za početnu biće vrednost koja je očitana sasamih pinova. Ovo može izazvati probleme zbog RMW ciklusa.

2 – Ukoliko se ova instrukcija izvršava nad TMR0 registrom (i ukoliko je odredište d= 1 ako se koristi), stanje preskalera će biti obrisano ukoliko je pridruženo tajmeru.

3 – Ukoliko je test ispravan, instrukcija će se izvršiti za 2 instrukcijska ciklusa.

Za detaljnija objašnjenja pogledajte DS33023A sa www.microchip.com.

207

Page 208: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 208/209

 Adresa Naziv Opis Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Reset Bank 

0x00 INDF Sadržaj željenog RAM registra u indirektnom adresiranju ---- ---- obe

0x01 TMR0 Tajmer 0. Povećava se od .0 do .255 xxxx xxxx 0

0x02 PCL Nižih 8 bitova programskog brojača PCLATH + PCL = PC PC PC PC PC PC PC PC PC 0000 0000 obe

0x03 STATUS Registar stanja mikrokontrolera - - RP0 TO PD Z DC C 0001 1xxx obe

0x04 FSR Pointer indirektnog adresiranja xxxx xxxx obe

0x05 PORTA Ulazno izlazni port A - - - RA4/T0CKI RA3 RA2 RA1 RA0 ---x xxxx 0

0x06 PORTB Ulazno izlazni port B RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx 0

0x07 / - - - - - - - - 0000 0000 /0x08 EEDATA Sadržaj željene EEPROM memorije xxxx xxxx 0

0x09 EEADR Adresa unutar EEPROM memorije xxxx xxxx 0

0x0A PCLATH Viših 5 bitova programskog brojača PCLATH + PCL = PC - - - PC PC PC PC PC ---0 0000 obe

0x0B INTCON Interapt kontroler GIE EEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x obe

0x80 INDF Sadržaj željenog RAM registra u indirektnom adresiranju ---- ---- obe

0x81 OPTION Konfigurisanje hardverskog stanja mikrokontrolera RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1

0x82 PCL Nižih 8 bitova programskog brojača PCLATH + PCL = PC PC PC PC PC PC PC PC PC 0000 0000 obe

0x83 STATUS Registar stanja mikrokontrolera - - RP0 TO PD Z DC C 0001 1xxx obe

0x84 FSR Pointer indirektnog adresiranja xxxx xxxx obe

0x85 TRISA Registar smera podataka za PORTA - - - ---1 1111 1

0x86 TRISB Registar smera podataka za PORTB 1111 1111 1

0x87 / - - - - - - - - 0000 0000 /

0x88 EECON1 EEPROM kontroler - - - EEIF WRERR WREN WR RD ---0 x000 1

0x89 EECON2 Otključavanje upisa u EEPROM ---- ---- 1

0x8A PCLATH Viših 5 bitova programskog brojača PCLATH + PCL = PC - - - PC PC PC PC PC ---0 0000 obe

0x8B INTCON Interapt kontroler GIE EEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x obe

166

Page 209: PIC16F84

7/16/2019 PIC16F84

http://slidepdf.com/reader/full/pic16f84-5634fb1484d33 209/209

Molio bih prodavce PIC mikrokontrolera da mi se jave radi objavljivanja njihovihkontakt podataka (adresa, tel, mob, mail, sajt, baner...) u ovom uputstvu po njegovomzavršetku. Zbog zaštite od spama, e-mail će biti prikazan u obliku slike.

U uputstvu ima izvesnih nedorečenosti u pogledu funkcija pojedinih registara, pinova,

tajminga i sličnih stvari. Kako je ovo prvenstveno početničko uputstvo, ne smatram da je bitno opterećivati čitaoca znanjem koje mu verovatno nikada neće ni koristiti. Za profesionalan rad sa PIC mikrokontrolerima, naučite engleski i čitajte Microchipovatehnička uputstva (Datasheet). Ne krivite me zbog upotrebe stranih reči. Šta mislite,kako bi kardiovaskularni hirurg mogao objasniti svoju profesiju laiku bez upotrebelatinskih izraza?

Primetili ste grešku? Nepostojeći link? Prvo proverite da li je to ispravljeno unajnovijem uputstvu (na sajtu kao i u uputstvu uvek objavljujem i datum izlaska noveverzije), i ukoliko nije kontaktirajte me preko knjige utisaka ili mailom objavljenim nasajtu.