Professional Documents
Culture Documents
UPUTSTVO ZA RUKOVANJE
1
1. Predgovor
Međutim da li je baš sve tako. Star? Pa šta. Nijedan moj kompjuter nije (u trenutku
kupovine) bio mlađi od 4 godina. Prvi put sam na internet izašao mašinom sa
100MHz 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!
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.
● Pojam multipleksa
Nemojte dozvoliti da Vas ovaj spisak obeshrabri. Veliki deo ovoga je objašnjen u
uputstvu.
2
2. Dobar stil programiranja
Pre nego što uđete u finese programiranja, mislim da bi trebalo objasniti stilove
programiranja.
;*********************************************************
; 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
;*********************************************************
3
3. Registri
4
Primećujete da su registri podeljeni u dve grupe, označene sa BANK0 i BANK1.
BANK1 se uglavnom koristi za konfigurisanje trenutnog hardverskog stanja
mikrokontrolera. Uglavnom mu je (za jednostavnije programe) dovoljno pristupiti
samo prilikom početne inicijalizacije mikrokontrolera. Kako se najbitniji registri
(PORTA i PORTB) nalaze u BANK0, program će uglavnom biti u njoj. Sledeću
specifičnost predstavljaju prvih 12 registara u bankama (0x00 – 0x0B). Njima se
direktno upravlja radom mikrokontrolera što ih čini povlašćenim (eng. Special
Function Registers - registri specijalne namene), dok je obična RAM memorija (eng.
General Purpose Registers - registri opšte namene) dostupna u registrima od 0x0C do
0x4F, a istovremeno joj se može pristupiti i preko 0x8C do 0xCF adresa.
stanje 0 0 1 0 1 1 1 1
Ulaz / Izlaz I I U I U U U U
5
Čemu konfigurisanje pinova? Ukoliko je odgovarajući pin konfigurisan (preko svog
TRIS registra) kao izlazni, na njega se iz mikrokontrolera mogu poslati naponski nivoi
od 0V i +5V, odnosno na njemu će se u svakom trenutku nalaziti jedan od ovih
napona. Pri tome se naponski nivo od 0V predstavlja kao logička 0, a napon od +5V
kao logička 1. Ukoliko je pak pin konfigurisan kao ulazni, mikrokontroler će u
svakom 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.
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 je
isti kao i za TRIS registre. Slično tome, da biste pročitali da li se neki pin (ranije
konfigurisan kao ulazni) nalazi na logičkoj 0 ili 1, treba da proverite da li je
odgovarajuć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š jednog
registra: W.
W (eng. Working - radni) registar je registar opšte namene u koji možete smestiti bilo
koju 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 ostalih
registara on nema svoju adresu, već je integrisan u sklopu samog mikrokontrolera. U
opisima instrukcija se mogu sresti oznake f, k, b i d. Pri tome je sa f (eng. file)
označena adresa jednog od registra iz tabele sa početka ovog poglavlja, k označava
konstantnu 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 bez
ikakvih formatiranja. Na primer odličan Notepad++ (ugradio sam mu prepoznavanje i
naglaš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 5
STATUS 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 adresa
STATUS 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
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 mogli
ste 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 sledi
direktno u registar W” (eng. Move Literal to W).
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 STATUS
registra. 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 adresa
registra 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. Za
registre koji su zajednički za obe banke, ovo je potpuno svejedno.
Nakon što snimite fajl, promenite mu txt ekstenziju u asm. Za ovo će vam u
Windowsu trebati Total Commander, a u Linuxu npr. Gnome Commander.
7
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ći
logič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 koji
slede, jer su oni dati samo kao ilustracija.
Najpre treba podesiti drugi bit PORTA registra tako da bude izlazni:
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 TRISA
registar.
Zatim treba uključiti LED. Zato treba na jedan od pinova (onaj na kome je povezana
LED) poslati logičku 1. Evo kako se to radi. (Obratite pažnju na komentare kôda):
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ći
izvršenje programa na početak. Postavite “labelu” (oznaku) na početak programa, i
zatim 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šite
sledeći kôd:
8
; Pošto je LED uključena, treba je isključiti.
Kao što primećujete, najpre je ispred instrukcije na početku reda stavljena labela
“Poc”. Na samom kraju programa je “goto Poc” instrukcijom nastavljeno dalje
izvršavanje programa od labele. Instrukcija GOTO k znači “idi na” (eng. Go-idi, To-
na) adresu (k) ili labelu.
bsf 0x03,5
movlw b'00000000'
movwf 0x85
bcf 0x03,5
Poc movlw b'00000100'
movwf 0x05
movlw b'00000000'
movwf 0x05
goto 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 da
ispravite 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 dodali
komentare, program bi i dalje delovao nejasno. Zbog toga treba svim brojevima dati
imena. Ovo može da se uradi naredbom “equ”, koja jednostavno znači “jednako
nečemu drugom” (eng. Equal – jednak). Važno je da primetite da ovo nije instrukcija
za 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ôd
PIC-a, biti identičan programu bez “equ” direktive. Ovom direktivom samo
zamenjujete željeni broj imenom.
Postupite ovako: izbacite sve komentare ali imenujte registre u Vašem programu, a
zatim 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
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 njihova
imena i u aktivni deo programa. Ukoliko sada prepišete program bez komentara, ali sa
imenovanim registrima, moći ćete da uporedite preglednost i čitljivost takvog listinga
sa prethodnim:
bsf STATUS,RP0
movlw b'00000000'
movwf TRISA
bcf STATUS,RP0
Poc
movlw b'00000100'
movwf PORTA
movlw b'00000000'
movwf PORTA
goto 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 razlikuju
od labele po tome što su im sva slova velika. Na taj način ne možete doći u situaciju
da 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 istu
vrednost (0x05). Međutim, razlika je očigledna. PORTA predstavlja adresu registra, a
RP0 bit 5 STATUS registra. Asembler ne pravi razliku između njih jer im je vrednost
ista (čak se mogu i zameniti), ali vodi računa o njihovom redosledu unutar instrukcije.
10
5. Prazne petlje
U prethodnom programu postoji mala greška. Skoro svaka instrukcija zahteva jedan
instrukcijki ciklus da bi se izvršila. Instrukcijski ciklus je 4 puta veći od takta
oscilatora. Ukoliko kao oscilator za takt za PIC16F84 koristite kvarcni kristal od
4MHz trajanje svake instrukcije će biti 4MHz/4ciklusa, ili 1μS. Kako se koristi samo
5 instrukcija, LED će se uključiti i isključiti u samo 6μS. Zbog čega 6 a ne 5? Zbog
toga š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 oka
delovaće Vam kao da LED svetli konstantno, ali sa pola snage. Dakle potrebno je
napraviti adekvatno kašnjenje između trenutka uključenja i isključenja LED.
Ali, kako onda podesiti BROJAC na drugu vrednost? Sve što trebate uraditi je da
ubacite željenu vrednost u taj registar. Na primer, ukoliko želite da BROJAC sadrži
vrednost 0x85, ne možete napisati BROJAC equ 0x85, jer će onda BROJAC sadržati
adresu TRISA registra. Zato trebate uraditi sledeće:
Sada možete slobodno napisati BROJAC equ 0x0C. Vrednost unutar imenovanog
registra BROJAC koji se nalazi na adresi 0x0C će biti 0x85.
11
Znači, najpre je potrebno imenovati registar:
Dalje se treba smanjivati vrednost registra BROJAC sve dok ne dostigne vrednost
0x00. 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 vrednost
registra 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 .0
F equ .1
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 mestu
tač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 od
3μS * 256 = 768μS, biće Vam potrebne bar dve petlje (jedna unutar druge) ukupnog
kašnjenja od 3μS * 256 * 256 = 0,2S da biste mogli primetiti kako LED treperi.
ORG 0x00
12
; ****** Imenovanje registra ******
STATUS equ 0x03 ; Adresa STATUS registra
TRISA equ 0x85 ; Adresa TRISA registra
PORTA equ 0x05 ; Adresa PORTA registra
BROJAC1 equ 0x0C ; Prvi brojač za praznu petlju. Inicijalno 0xFF
BROJAC2 equ 0x0D ; Drugi brojač za praznu petlju. Inicijalno 0xFF
RP0 equ 0x05 ; Oznaka bita 5 STATUS registra
F equ .1 ; Oznaka odredišta rezultata instrukcije
; ****** Prva petlja aktivna pri uključenoj LED oko 0,2S ******
; ****** Druga petlja aktivna pri isključenoj LED oko 0,2S ******
13
Naravno, želećete da isprobate program da bi videli da li zaista radi. Evo električne
šeme koju trebate napraviti za test ovog programa.
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 po
dovođenju logičke 0 na pin. Ovo je moguće jer pin pri logičkoj 0 može upijati struju
do 25mA, a i poželjno zbog manjeg grejanja i potrošnje mikrokontrolera.
Čestitamo. Upravo ste napravili svoj prvi program, i napravili kolo kojim se LED
uključuje i isključuje. Za sada ste sledeći ova uputstva naučili 7 od ukupno 35
instrukcija, i već kontrolišete ulazno izlazni port.
14
6. MPLAB Asembler
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ôd
110000 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 sva
ova imena. Još bolje, u sebi ima i predefinisane obrasce (eng. standard code template)
za upis asemblerskog programa sa zaglavljem, uobičajenim direktivama, posebnim
delom za interapte (više o njima kasnije)...
MPLAB ima jedan poznat bag koji se ogleda u nemogućnosti rada sa putanjom do
foldera dužom od 51 karaktera. Zato direktno u C: napravite folder „Moji programi“.
U njega kopirajte sledeći fajl:
;**********************************************************
; Autor :
; Datum :
; Verzija :
; Naslov :
;
; Opis hardvera :
; Opis softvera :
; Potrebni fajlovi : p16F84.inc
;
;**********************************************************
15
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC
; Podešava konfiguracione bitove.
; Više o njima kasnije.
Ovo zaglavlje možete koristiti za svaki novi program koji pravite, međutim uvek ga
možete promeniti, tako da odgovara Vašim specifičnim potrebama.
Sada uključite MPLAB IDE. Ne obazirite se na prozore koje je otvorio, već sledite
sledeću proceduru: Project, Project Wizard, Next, izaberite PIC16F84, Next
Next, Upišite ime projekta (npr. Proba) i izaberite putanju do ranije napravljenog
foldera C:\Moji programi\Proba
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
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
;**********************************************************
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
; ****** Prve petlja aktivna pri uključenoj LED oko 0,2S ******
17
; ****** Kašnjenje završeno. Sada isključi LED ******
; ****** Druga petlja aktivna pri isključenoj LED oko 0,2S ******
Kao što ste i sami pretpostavili direktiva #include <p16F84.inc> ubacuje fajl
p16F84.inc ispred vašeg asemblerskog programa. Sam asembler će pri konverziji
instrukcija u mašinski kôd uzeti iz fajla nazive samo onih imenovanih registra koji se
koriste 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.
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 pri
asembliranju programa.
18
7. Programatori
Za snimanje .hex fajla u PIC neophodan vam je programator kao hardverski deo i
određeni softver u kompjuteru preko koga se vrši programiranje.
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 ste
utrošili 3 meseca rada, obavezno ga uključite. U ovom uputstvu, neka bude isključen -
CP OFF.
19
Vrste oscilatora naučićete kasnije. Za sada je bitno da znate da ovde koristite RC
(Resistor – Capacitor) oscilator.
20
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 iste
funkcije, 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, nego
npr. deset puta kroz glavni program, i u smanjenju količine memorije koju program
zauzima unutar PIC.
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 RETURN
instrukcijom. Da biste pozvali potprogram iz glavnog programa, jednostavno upišite
CALL 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 na
kojem 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šavanje
od instrukcije koja se nalazi iza CALL instrukcije. Možete pozvati potprogram koliko
god 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 su
svi na istom mestu. Drugo, morate biti sigurni da će izvršavanje glavnog programa
zaobići potprogram. Ukoliko stavite potprogram na kraj Vašeg programa i zaboravite
da 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 pravi
razliku između potprograma i glavnog programa.
Ukoliko u programu imate dve promenljive, trebate ih pamtiti u dva registra opšte
namene. 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čnih
registara (određujete mu samo prvu), i poboljšavate portabilnost programa za moćnije
serije mikrokontrolera. Očigledno da ovo nije velika ušteda pri korišćenju samo dva
registra. Međutim, pri više registara ovo može biti od pomoći.
21
Prepravite program za treperenje LED tako da koristi potprogram.
22
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 iz
njega, izvršava se sledeća instrukcija, odnosno “goto Poc”.
Ovako se može ići samo do osmog nivoa dubine na šta se mora obratiti pažnja. Za one
koje 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 da
memorija PIC16F84 mikrokontrolera iznosi samo 1024 bajta. Svaki bajt je bitan.
23
9. Ulazi
Kao što Vam je poznato, da bi konfigurisali U/I pinove treba prebaciti program iz
banke 0 u banku 1. Najpre to uradite:
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 kada
testirate željeni bit. Na primer, ukoliko čekate da se na ulaznom pinu javi nivo logičke
1, možete iskoristiti instrukciju BTFSS ovako:
Početak programa
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
; ****** 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 0xFF
BROJAC2 equ 0x0D ; Drugi brojač petlje. Inicijalno 0xFF
org 0x00
25
; ****** 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
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 kako
možete menjati brzinu treptanja LED prekidačem, a oni za to pokažu veoma malo
interesovanja.
Ukoliko ste iz početka pratili ova uputstva, onda biste možda voleli da znate da ste do
sada naučili 10 od ukupno 35 instrukcija za PIC16F84! Sve su naučene uključivanjem
i isključivanjem LED i testiranjem prekidača.
26
10. Simulator
MPLAB IDE ima u sebi odličan a besplatan simulator. U ovom poglavlju biće opisane
njegove 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 strelice
nadesno) i pratite izvršavanje programa u prozoru sa .asm fajlom. Vidite kako je
doš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šava
maksimalnom 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 da
se 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 ekrana
označ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 registra
unutar Watch prozora i izborom opcije Properties dobijate mogućnost podešavanja
željenog formata brojeva. Za BROJAC1 i BROJAC2 najpregledniji bi bio decimalni
format. Duplim klikom na vrednosti pored registara, možete ih nasilno promeniti.
27
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 date
vrednosti 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 će
Vam 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 odredili
vreme za koje je LED aktivna, dovoljno je postaviti jednu tačku prekida na call
instrukciju. Onda se program izvrši (Run - bez animiranja) do prve tačke prekida, i tu
se 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 se
definisati određeni stimulans (eng. Stimulus) po kome će se odvijati promene. Željeni
scenario promena definišete sa Debugger, Stimulus Controller, New Scenario. Na
primer, ukoliko je prekidač na RA0 pinu svo vreme pritisnut (a pin je definisan kao
ulazni), potrebno je izabrati asinhroni (Asynch) tab, a zatim u jednom od redova
ubaciti 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 na
Fire 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.
Clock Stimulus tabom definišu se logička stanja pinova koja će se javljati u tačno
određ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 akcije
koje će se odvijati po promeni ili dostizanju unapred zadatog stanja bita ili registra.
28
11. Efikasno korišćenje memorije
Do sada ste programirali PIC da uključuje i isključuje LED. Onda ste upravljali
njegovim 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.
movlw b'00000100'
movwf PORTA
movlw b'00000000'
movwf PORTA
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” na
registru koji odredite, sa vrednošću koju mu date. Trebalo bi ovo malo bolje objasniti.
XOR 00101110
XOR 10010110
0 0 0 = 10111000
0 1 1
Rezultat XOR operacije će biti logička 1 samo ukoliko su mu
1 0 1 oba operanda različita. Ukoliko su ista (obe 0 ili obe 1), rezultat
1 1 0 ć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će
rezultat XOR operacije nad LSB bitovima prvog i drugog operanda.
29
Uočavate li da XOR operacijom nad bitom koji je stalno na logičkoj 1 i prethodnim
stanjem bita menja stanje rezultata sa 0 na 1 i sa 1 na 0?
I II
00000000 00000001
XOR 00000001 XOR 00000001
= 00000001 = 00000000
Još jedna interesantna osobina XOR operacije je da bilo koja vrednost dva puta XOR-
ovana istim brojem vraća originalnu vrednost.
I II
00101110 10111000
XOR 10010110 XOR 10010110
= 10111000 = 00101110
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 rezultat
XOR operacije. Ukoliko je d=0, rezultat će biti u W registru, a ukoliko je d=1,
rezultat će biti smešten u f registru.
30
Zamislite da je korisnik rešio da izvuče LED na neko udaljenije mesto (kao što mnogi
izvlače signalizaciju jeftine struje sa strujomera). Kablovi preko kojih je povezana
LED ponašaju se usled svoje velike dužine i male daljine jedan od drugog kao
kondenzator male kapacitivnosti. Zato je ukoliko želite brzo uključiti i isključiti LED
moguće da ona neposredno nakon uključenja ne zasvetli zbog previše male otpornosti
na 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 nije
uključena. PORTB (i PORTA) se pri očitavanju stanja ponašaju kao da su povezani
kao ulazi, bez obzira na ranije konfigurisano stanje pinova. To može dovesti do
očitavanja pogrešnog stanja, a samim tim i nepravilnog rada programa. PIC je
hardverski konstruisan tako da je moguće čak i da se očitavanje stanja sa portova
može završiti i pre ranije zadate promene njihovih stanja. Zbog toga je pouzdanije sve
operacije 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 neophodno
kopirati rezultat iz njega u odgovarajući port. Više o shaddow registrima možete
naučiti na http://www.piclist.com/tecHREF/readmodwrite.htm sajtu.
Pogledajte sada novi asemblerski kôd. Prvi je originalni program za treperenje LED, a
u drugom je dodat prekidač. U oba programa kao shaddow registar upotrebljen je W
registar, 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
31
; ****** 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 se
decfsz BROJAC2,F ; može primetiti kako LED treperi
goto Pet
return ; Povratak iz potprograma
32
; ****** 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 se
decfsz BROJAC2,F ; može primetiti kako LED treperi
goto Pet
return ; Povratak iz potprograma
Vidite da ste ne samo naučili nove instrukcije, već ste i smanjili veličinu programa.
33
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 oba
ulaza dovedene logičke 1. Ovde je njena tablica istinitosti.
AND 01101011
AND 10100101
0 0 0 = 00100001
0 1 0
Rezultat AND operacije biće logička 1 samo ukoliko su oba
1 0 0 operanda na logičkoj 1. Ukoliko bar jedan nije, rezultat će biti
1 1 1 logička 0.
IOR 01101011
IOR 10100101
0 0 0 = 11101111
0 1 1
Rezultat IOR operacije biće logička 1 ukoliko je bar na jednom
1 0 1 operandu prisutna logička 1. Ukoliko su oba na logičkoj 0, i
1 1 1 rezultat će biti jednak logičkoj 0.
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 u
f registru.
34
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 programu
umesto XOR. Jedina razlika je u tome što bi se onda invertovali svi bitovi PORTA
registra, a ne samo onaj koji je potreban.
I II
COM 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čan
on ima svoju posebnu oznaku „nulti bit“ (eng. Zero flag). Termin „flag“ koristi se za
označavanje bitova koje mikrokontroler sam setuje ili resetuje u zavisnosti od svog
trenutnog stanja (u ovom slučaju rezultata prethodne logičke instrukcije).
00011010
XOR 00011010
= 00000000
Zero flag STATUS registra će biti setovan. Ovo se može iskoristiti za brzo poređenje
vrednosti u registru tako što se u W registar postavite željeni oblik bitova a onda izvrši
XOR 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 operacijom
komplementovanja.
COM 11111111
= 00000000
35
13. Rotacija
RLF (Rotate Left f Through Carry) instrukcija rotira ulevo bitove unutar zadatog
registra. 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 ova
instrukcija rotira sadržaj registra ulevo. A šta kada 1 dođe do kraja – pitate se vi. Neće
se 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.
Ukoliko vam je to potrebno možete ubaciti 0 ili 1 u Carry flag pre rotacije
instrukcijama bsf STATUS,C i bcf STATUS,C (C je imenovani bit 0 STATUS
registra). 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.
C 76543210
0 01011001 = 89
0 10110010 = 178
1 01100100 = 356 (računajući i Carry flag)
Kada već postoji instrukcija za rotaciju ulevo, logično bi bilo da postoji i instrukcija
za rotaciju bitova udesno. Postoji!
36
RRF (Rotate Right f Through Carry)
Instrukcije RLF i RRF mogu se upotrebiti za simulaciju trčećeg svetla. U tom slučaju
mogući algoritam bi bio:
Instrukcija movf f,d. (eng. Move f) vrednost iz registra f prebacuje u W (pri d=0) ili u
taj isti registar f (pri d=1). Zbog čega bi iko želeo da sadržaj registra upiše u taj isti
registar? U praksi se ta mogućnost koristi jedino pri testiranju sadržaja registra na
vrednost 0x00, jer movf instrukcija utiče na Zero flag.
37
Upotreba logičkih i instrukcija rotacije
PIC uzima vrednost iz PORTA. Kako su oba tastera pritisnuta ona je b'00011'. Ta
vrednost se rotira, i postaje b'00110'. Rezultat se smešta u W registar. Dalje se
izvršava ekskluzivno ili nad tom vrednošću i trenutnom vrednošću PORTA koji je i
dalje b'00011'.
38
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 na
PORTA bit 0 i bit 1 ulazni, vrednost koja će doći na njih biće ignorisana, a bit 3 nas
ionako ne interesuje i njegova vrednost se može ignorisati. Kao što vidite na kraju
svega bit 2 sadrži vrednost XOR operacije (u ovom slučaju 0). Kako je ovaj bit
izlazni, LED neće svetleti. Možete proveriti rezultat funkcije pritiskanjem prekidača
po tablici XOR operacije. Program je napisan tako da inicijalna vrednost Carry flaga
nema uticaja na njegovo izvršavanje, pa njegovo brisanje ovde nije potebno.
bitovi 43210
PORTA 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 za
ograničenjem setovanja bita 3 PORTA registra. U praksi taj pin ne bi bio povezan, ili
bi se bit 3 „maskirao“.
Program radi isto što i ranije, s tom razlikom što umesto XOR primenjuje AND
operaciju. 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).
39
14. Brojanje i sabiranje
Već ste videli kako PIC16F84 može množiti i deliti sa dva u binarnom brojnom
sistemu. Sada ćete naučiti kako može brojati unapred i unazad kao i sabirati.
INCF f,d pri čemu d određuje gde će ići rezultat (u W ili F).
A šta će biti kada se dođe do 0xFF - pitate se vi. Odmah ćete videti.
Bitovi STATUS
76543210 Zero flag
11111110 0
incf 0x0C,F 11111111 0
incf 0x0C,F 00000000 1
incf 0x0C,F 00000001 0
Instrukcija suprotna ovoj je DECF f,d (eng. Decrement f). Ova instrukcija smanjuje
vrednost registra f za 1, odnosno dekrementuje ga. Sintaksa joj je ista kao kod INCF
instrukcije. U slučaju da brojač dođe do 0 desiće se sledeće:
Bitovi STATUS
76543210 Zero flag
00000001 0
decf 0x0C,F 00000000 1
decf 0x0C,F 11111111 0
decf 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 po
istom principu kao INCF instrukcija, i koja preskače sledeću instrukciju u slučaju da
je rezultat operacije jednak 0.
40
ADD (eng. saberi) operacija sabira dva broja.
Kod ovakvih slučajeva bit prekoračenja smešta se u Carry flag. Ukoliko je potrebno
sabirati 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.
Aritmetičke operacije sabiranja (i oduzimanja) pored Carry i Zero flaga utiču još i na
tzv. 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.
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 do
5, a donji od 0 do 9). Uvećanje samo gornjeg nibla rešava se sabiranjem sa
b'00010000'.
41
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.
Kao što vidite, ovako postoji samo jednostruko predstavljanje broja 0. Takav postupak
naziva se drugi komplement ili komplement dvojke.
Kao što vidite, MSB ima ulogu znaka (0-pozitivan, 1-negativan). Za prikazivanje
rezultata 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 se
označenim, za razliku od običnih neoznačenih (0-255) brojeva. Zato je bitno unapred
odrediti 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 i
neoznačenih brojeva, pa može doći do netačnog rezultata operacije.
Za razliku od sabiranja, kod koga se Carry flag setuje pri prekoračenju, kod
oduzimanja je primenjena negativna logika, tako da je Carry flag setovan ukoliko
nema 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
+.100 C 01100100 +.55 00110111
-.55 11001001
+(-.55) 11001001
= +.45 1 00101101
Ukoliko Vam je oduzimanje i testiranje Carry flaga naporno, uradite isto što i
mikrokontroler. Saberite jedan broj sa drugim komplementom dvojke drugog broja.
U praksi se retko kada sreće potreba za primenom označenih brojeva. Skoro sve
operacije 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
16. Dekapling, debouncing,
šmitov okidač, pull up otpornici...
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 pre
konač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 je
taster na njegovom ulaznom pinu umesto jednom pritisnut više puta. Da bi se ova
pojava neutralisala potrebno je u mikrokontroleru realizovati smanjenje šuma na
ulaznom signalu, odnosno debouncing.
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 biti
digitalni. U tehničkom uputstvu preporučeno je da ulazni logički nivoi (pri naponu
napajanja od 5V) budu u intervalu od 0 do 0,8V za logičku 0, i od 2,4V do 5V za
logič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
Kod mikrokontrolera nema „sivog“ stanja. Stanje na njegovom pinu mora biti ili
crveno ili belo (navijam za Zvezdu). Ukoliko se ulaznom pinu mikrokontrolera
dovede 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 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.
45
17. Još malo o hardveru
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 je
omogućen skok preko sledeće instrukcije. Međutim ukoliko je tekuća instrukcija
GOTO, 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čin
upamtiti 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 njoj
kasnije). Njega možete zamisliti kao cev zatvorenu sa jedne strane u koju redom
ubacujete klikere. Crveni, zeleni, žuti i plavi. Očigledno, ne možete izvući zeleni
kliker ukoliko prethodno ne izvučete plavi pa žuti.
Pri nailasku na CALL instrukciju, adresa naredne instrukcije se stavlja na stek, i vrši
se 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 upisati
maksimalno 8 adresa za povratak (još manje ukoliko se koriste interapti). Nakon toga
nove adrese povratka prebrisaće početne (crveni pa zeleni kliker...), što će
prouzrokovati nepravilan rad programa. Ovo ograničenje ne bi trebalo preterano da
Vas brine. U praksi uglavnom nema potrebe za potprogramima koji idu više od druge
ili 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.
46
; ****** 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
47
; ****** Testiranje prekidača ******
Cek1 btfss PORTB,0 ; Testiranje otpuštenosti prekidača
goto Cek1 ; Nije otpušten
call Pau ; Jeste otpušten. Pozovi pauzu.
btfss PORTB,0 ; Još jedno testiranje zbog imunosti na
goto Cek1 ; eventualna varničenja kontakta.
Cek2 btfsc PORTB,0 ; Testiranje pritisnutosti prekidača
goto Cek2 ; Nije pritisnut
call Pau ; Jeste pritisnut. Pozovi pauzu.
btfsc PORTB,0 ; Još jedno testiranje zbog imunosti na
goto Cek2 ; eventualna varničenja kontakta.
48
Duplim testiranjem pritisnutosti taster prekidača sa pauzom između testiranja
realizovana je debouncing rutina. Testiranje na otpuštenost, a zatim na pritisnutost
sprečava nastavak brojanja ukoliko se prekidač neprekidno drži pritisnut, i omogućava
promenu stanja prilikom pritiska, a ne prilikom otpusta tastera.
MPLAB asembler ima direktivu DT (eng. Define Table) kojom se mogu brže unositi
željene vrednosti u tabelu. Njen oblik je sledeći:
Iako na prvi pogled deluje da se na ovaj način štedi memorija mikrokontrolera, to nije
slučaj. Asembler će dt direktivom naredne memorijske lokacije napuniti retlw
instrukcijama 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:
49
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 sa
već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 prilikom
asembliranja. Za postavljanje početka tabele na željeno mesto (početak bloka)
možete koristiti ORG direktivu.
50
18. Watchdog tajmer
Da biste mogli uspešno koristiti WDT potrebno je da znate tri stvari. Prvo za koliko
vremena ć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 od
nekoliko spoljnih faktora kao što su napon napajanja, temperatura mikrokontrolera
i.t.d. Zbog lakšeg objašnjavanja zaokružiću ovo vreme na tačno 18mS. Ipak, ono se
može i produžiti.
51
Upamtite da su ova vremena nezavisna od takta oscilatora mikrokontrolera. Mislite o
ovim vremenima kao stvarnim (eng. real time), nasuprot taktu mikrokontrolera koji
možete menjati fizičkom zamenom par delova u oscilatoru. Pretpostavimo da želite da
WDT resetuje PIC nakon pola sekunde. Najbliža standardna vrednost je 576mS,
odnosno 0,576S, pa je dovoljno poslati vrednost b101 u OPTION_REG registar.
Međutim nije baš sve tako jednostavno. Po inicijalizaciji PIC-a postskaler je pridružen
internom 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 bitove
OPTION_REG registra Microchip preporučuje sledeću proceduru kako ne bi došlo do
nehotičnog reseta PIC.
U slučaju željenog odnosa različitog od 1:1 (vrednost preskalera 000) mogu se izbaciti
instrukcije označene zvezdicom.
1 – postskaler WDT
0 – preskaler internog tajmera.
52
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 iznova
setovan, a naći će se u resetovanom stanju jedino prilikom WDT reseta. Više o tome
naučićete u poglavlju sa reset funkcijom.
Kao što se sećate, PIC deli takt oscilatora sa 4. Ovo vreme naziva se instrukcijski
ciklus. Ukoliko je kao izvor takta upotrebljen kristal od 4MHz, PIC će izvršavati
instrukcije brzinom od 4MHz/4=1MHz, odnosno za jednu instrukciju koja traje 1
instrukcijski ciklus će mu trebati 1μS, dok će mu za instrukciju koja traje 2
instrukcijska ciklusa trebati 2μS. Način da zapamtite broj instrukcijskih ciklusa za sve
instrukcije 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 jednog
na 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 na
glavni program. Međutim, postoje 4 instrukcije koje mogu trajati 1 ili 2 instrukcijska
ciklusa. To su DECFSZ, INCFSZ, BTFSC i BTFSS. One će preskočiti sledeću
instrukciju u slučaju da je određeni uslov ispunjen i onda će trajati 2 ciklusa. Ukoliko
taj uslov nije ispunjen, izvršiće se naredna instrukcija kao da se ništa nije ni desilo, i
onda će trajati 1 ciklus. Pogledajte sada sledeći program.
movlw 0x02
movwf BROJAC
Pet decfsz BROJAC,F
goto Pet
end
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
53
Sledećim programom namerno se
dozvoljava prekoračenje WDT. Njegov
takt koristi se za treptanje LED.
Za pin RA4 ovo je i jedino moguće rešenje, jer on na svom izlazu ne može dati
logičku 1.
54
clrwdt ; Obriši WDT
movlw b'10001110' ; Izaberi WDT, i postavi odnos
; preskalera od 1,1S
movwf OPTION_REG
bcf STATUS,RP0 ; BANK0
Nakon početne inicijalizacije program će se vrteti u prvoj mrtvoj petlji. Kako u njoj
nema CLRWDT instrukcije, nakon 1,1S nastupiće WDT reset. Po resetu program će
se izvršiti od početka, ali će deo sa testiranjem TO bita detektovati je li nastupio WDT
reset ili ne, i ukoliko jeste dalje izvršavanje programa nastaviće se od labele Led gde
će se izmeniti stanje RA2 pina.
55
19. Tajmer
U slučaju da pišete program koji mora imati veliku ali tačno definisanu pauzu sigurno
vam 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 biti
sinhronizovan sa taktom izvršavanja instrukcija mikrokontrolera ili sa taktom
eksternog oscilatora čiji impulsi se dovode na pin 3 (RA4/T0CKI). Glavna funkcija
tajmera je brojanje (.0-.255) koje je za razliku od WDT sinhronizovano sa ovim
taktom. 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 flaga
tajmera, 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že
koristiti preskaler.
bit7 bit0
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
● T0CS (eng. Timer0 Clock Select) bit omogućava izbor takta tajmera. Ukoliko
je resetovan, brojanje će se odvijati sinhronizovano sa taktom izvršavanja
instrukcija koji je četiri puta manji od takta oscilatora. Ovaj takt se može
dobiti sa CLKOUT pina mikrokontrolera.
● T0SE (eng. Timer0 Source Edge) bit ima smisla jedino pri upotrebi eksternog
takta. 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).
56
Bit TMR0 WDT Primećujete da se i ovde pominje WDT
2, 1, 0 odnos odnos odnos. On je tu jer se odnos tajmera od 1:1
može dobiti jedino pridruživanjem preskalera
0, 0, 0 1:2 1:1 WDT, setovanjem PSA bita. Za takvo
0, 0, 1 1:4 1:2 podešavanje primenjuje se kôd opisan u
0, 1, 0 1:8 1:4 prošlom poglavlju sa instrukcijama
označenim zvezdicama.
0, 1, 1 1:16 1:8
1, 0, 0 1:32 1:16 Budući da se pri samom programiranju
PIC16F84 vrši uključenje ili isključenje WDT
1, 0, 1 1:64 1:32 (podešavanjem konfiguracionih bitova), ne
1, 0, 1 1:128 1:64 može se doći u situaciju da se WDT sam
1, 1, 1 1:256 1:128 uključ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. Timer0 Overflow Interrupt Flag) nalazi se u INTCON registru. Više o ovom
registru naučićete u delu sa interaptima.
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.
57
; ****** Inicijalizacija brojača ******
Ini movlw 0x00 ; Inicijalizacija
movwf DISP ; displeja
movlw b'00100000' ; Inicijalizacija
movwf DEL ; delitelja
58
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čin
lakše je nakon povećanja testirati njegovo prekoračenje. Jedino instrukcije sabiranja i
oduzimanja menjaju stanje DC flaga, i jedino pri prekoračenjima donjih niblova
(tačnije vrednosti 0x0F donjeg nibla).
59
20. Interapti - pojam
Pojam interapta će vam verovatno biti najteži za razumevanje. Ne postoji lak način za
njihovo objašnjavanje, ali nadam se da ćete pri kraju ove sekcije moći da ih uspešno
primenjujete u svojim programima.
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 pogledate
oznake 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že
konfigurisati 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 mogu
koristiti za interapte. Pre nego što se upotrebi bilo koji izvor interapta, trebaju se
uraditi dve stvari. Prvo se trebaju dozvoliti interapti, a zatim izabrati željeni izvori
interapta koji će se koristiti u programu.
Bit 4 INTCON registra nazvan je INTE (eng. RB0/INT Interrupt Enable - uključi
interapt na RB0/INT pinu). Setovanjem INTE bita dozvoljena je upotreba RB0 pina
kao 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 od
strane 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 sa
logičke 0 na logičku 1, ili sa logičke 1 na logičku 0. Ovo se podešava u
OPTION_REG registru na adresi 81h. Setovanje njegovog bita 6 nazvanog INTEDG
(eng. Interrupt Edge) prouzrokovaće interapt pri rastućoj ivici, a resetovanje pri
silaznoj. Kako je nažalost OPTION_REG registar u BANK1, treba preći iz BANK0 u
BANK1, tamo setovati ili resetovati INTEDG bit OPTION_REG registra, i vratiti se u
BANK0. Najpraktičnije je ovo podešavanje izvršiti uz ostala u toku inicijalizacije
mikrokontrolera. Ovim je PIC16F84 podešen za korišćenje interapta na RB0/INT pina
PORTB registra.
60
Ukoliko želite koristiti više eksternih izvora interapta, možete koristiti pinove RB4 do
RB7. Oni se razlikuju od RB0/INT pina u tome što se interapt javlja pri promeni
stanja na pinovima. To znači da će se interapt javiti pri prelasku sa logičke 0 na
logičku 1, ali i sa logičke 1 na logičku 0. Podešavanje ovih pinova za izvore interapta
vrši se setovanjem bita 3 INTCON registra nazvanog RBIE (eng. Port B Change
Interrupt 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 za
određ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 flag), odnosno bit 0 (RBIF
eng. Port B Interrupt flag) pri interaptu na RB4 do RB7 pinovima u INTCON
registru. 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 PIC
ne 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 za
obradu 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 obradu
interapta koja se usled toga nikada ne može izvršiti do kraja. Ukoliko se setite primera
sa 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 onda
dozvoliti prijem novih.
61
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 pojavi
interapta 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činje
na adresi 0x04 odvojenu od ostatka programa. Ovo se veoma lako implementira.
Postoji par stvari na koje trebate obratiti pažnju prilikom korišćenja interapta.
62
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, setovanje
interapt flaga i povratak iz potprograma za obradu interapta. Imajte ovo na
umu 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) u
glavnom programu uopšte ne bude izvršena. Naime, ukoliko interapt nastupi u
trenutku izvršavanja instrukcije koja resetuje GIE bit, prvo će ta instrukcija biti
završena do kraja (resetovaće se GIE bit), a zatim će početi izvršavanje
interapt rutine koja će na svom kraju da automatski setuje bit GIE. Tako će
GIE bit biti setovan iako je neposredno pre interapta bio resetovan. Da bi se
zaš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 svrha
korišćenja 4 bita kao izvora interapta? Primer može biti kućni alarm, čija 4
senzora su povezana na pinove na PORTB registru. Bilo koji senzor može
okinuti PIC za uključenje alarma, a rutina za alarm je rutina za obradu
interapta. 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ć jedino
na svim.
5. U slučaju korišćenja više izvora interapta moguće je da se za vreme interapt
rutine izazvane RB0/INT pinom pojavi i interapt na bitovima 4-7 PORTB
registra. Stoga je potrebno u samoj interapt rutini testirati prvi interapt flag, u
zavisnosti od negovog stanja otići na rutinu za njegovu obradu, i tamo
resetovati samo taj interapt flag. Odmah nakon povratka iz potprograma za
obradu interapta, izvršiće se interapt izazvan drugim izvorom.
6. Interapt flagovi setuju se bez obzira na stanje GIE bita, kao i pojedinačnih
dozvola za interapte (kao u programu sa tajmerom). To može biti iskorišćeno
za detekciju njihovih stanja iz samog programa bez korišćenja interapta.
Naravno, odgovarajući interapt flag je kao i kod interapta potrebno ručno
resetovati 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 rutine
sigurno će izazvati njegovo prekoračenje. Uvek uzmite u obzir najgoru
moguć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 rutinu
snimite sadržaj svih registara modifikovanih u potprogramu, i vratite ih natrag
prilikom izlaska iz interapt rutine.
63
21. Interapti - program
Najpre se mikrokontroler treba podesiti tako da pri izvršavanju programa preskoči deo
na koji PC skače pri pojavi interapta.
64
Za svaki slučaj potrebno je resetovati interapt flag (nikad ne veruj mikrokontroleru):
Sada je potrebno podesiti portove. Sećate se da zbog korišćenja RB0 kao interapt
pina, on mora biti postavljen kao ulazni;
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.
65
Dalje je potrebno u glavnom programu napraviti petlju koja će vrednost promenljive
BROJAC neprestano prikazivati na PORTA registru.
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 STATUS
registra, u interapt rutini nema potrebe za privremenim čuvanjem njegove vrednosti.
66
; ****** Interapt rutina ******
Kao što je ranije rečeno RA4 pin ne može na svom izlazu dati logičku jedinicu. U
slučaju da se na njega pošalje logička 0, ponašaće se isto kao i ostali pinovi, a u
67
slučaju jedinice, preći će u stanje visoke impedanse (kao da nije ni povezan). Pin RA4
razlikuje se od ostalih i po svom ulazu. Ulaz mu je sa Šmitovim okidačem. To
omoguć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 specijalne
namene.
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.
68
22. Tajmerom izazvani interapti
Pre nego što naučite kako se to može ostvariti, upoznaćete se sa internom strukturom
INTCON registra.
bit7 bit0
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
● GIE (eng. Global Interrupt Enable) omogućava ili zabranjuje upotrebu svih
interapta. Njegovim setovanjem, dozvoljena je upotreba interapta.
● T0IF (eng. Timer0 Interrupt Flag) bit setuje se pri prekoračenju tajmera.
● INTF (eng. Interrupt Flag) bit setuje se pri dolasku odgovarajućeg logičkog
nivoa (odabranog INTEDG bitom OPTION_REG registra) na RB0 pin
mikrokontrolera.
● RBIF (eng. Port B Interrupt Flag) setuje se pri promeni logičkog stanja na
pinovima RB4 do RB7.
69
može uticati na izmenu Zero flaga. Zbog toga se preporučuje upotreba SWAPF
instrukcije.
Swapf (eng. Swap F - zameni) instrukcija menja mesta gornjem i donjem niblu u
registru.
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 za
izvrš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 njeno
izvršavanje ne utiče u velikoj meri na brzinu glavnog programa.
70
swapf STATUS,W ; STATUS sa okrenutim niblovima u W
movwf TEMPSTATUS ; i zatim u TEMPSTATUS registar
movf SPORTA,W ; Shaddow registar u W
71
; ****** Glavni program – inicijalizacija ******
Možete se zapitati zašto su upotrebljene dve swapf instrukcije pri vraćanju TEMPW u
W, 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
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 sam
STATUS registar, njegovi flagovi postaviće se u zavisnosti od rezultata instrukcije,
bez obzira na stanje bajta koji želimo poslati u njega.
73
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 INDF
registra.
INDF registar nije fizički registar. Njegovo adresiranje u stvari adresira registar čija
adresa je sadržana u FSR registru (FSR je pointer adrese željenog registra). Takav
postupak naziva se indirektno adresiranje.
Za razliku od tabele, zbog malog broja registara kod upotrebe indirektnog adresiranja
nema ograničenja u smislu blokova podataka (bar kod PIC16F84 mikrokontrolera –
kod mikrokontrolera sa većim brojem registara ovo nije slučaj).
74
24. EEPROM memorija
Zamislite da imate PIC koji preko sistema fotoćelija broji posetioce koji su ušli kroz
ulazna 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.
Znam znam. Jedan manji akumulator ili UPS rešio bi problem. Ali direktor banke ni
da čuje. To direktno poskupljuje projekat. Pa nije valjda džabe kupio agregat!
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 šta
se koriste registri EEADR (eng. EEPROM Adress) i EEDATA (eng. EEPROM
Data)) potrebno je inicirati proces čitanja ili snimanja bajta, što se vrši preko
EECON1 (eng. EEPROM Controller1) i EECON2 (eng. EEPROM Controller2)
registra.
Pre nego što naučite čitanje i snimanje u EEPROM, upoznajte internu strukturu
EECON1 registra.
bit7 bit0
/ / / EEIF WRERR WREN WR RD
● EEIF (eng. EEPROM Interrupt Flag) bit predstavlja flag interapta izazvanog
završetkom procesa snimanja bajta. Ovaj interapt može se dozvoliti
setovanjem EEIE (eng. EEPROM Interrupt Enable) bita INTCON registra.
Potrebno ga je ručno obrisati pre povratka iz interapt rutine.
75
● WRERR (eng. Write Error) bit indikuje prekid snimanja bajta u EEPROM,
usled isteka vremena WDT ili eksternog reseta mikrokontrolera. Program
može nakon reseta testirati ovaj bit (uz to mora otkriti i da li je reset nastao
usled nestanka napona napajanja ili ne), i na osnovu njegovog stanja dovršiti
proces snimanja (sadržaj EEADR i EEDATA registra ne menja se nakon
reseta).
● WREN (eng. Write Enable) bit mora biti setovan, da bi bio moguć upis 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
Snimanje u EEPROM neće se inicirati ukoliko nije tačno ispoštovana procedura (0x55
u 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 se
sprečio nehotičan upis u EEPROM zbog mogućih grešaka u programu. Iz istog
razloga WREN bit je potrebno držati setovanim jedino za vreme upisa u EEPROM.
Možda Vam se mere inicijalne procedure i WRERR bita čine preteranim. Ali zapitajte
se š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 bi
mogao nastaviti sa normalnim radom. Morao bi se odlemiti sa štampane pločice i
ponovo programirati (u mikrokontroler se sa programom snima i sadržaj EEPROM
memorije).
77
25. EEPROM i interapti
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 se
naći u vremenski kritičnim programima kod kojih je potrebno za vreme snimanja u
EEPROM 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 i
njegovom ponovnom dovođenju, na LED displeju naći će se poslednja zapamćena
vrednost (to je i bio cilj u primeru sa bankom). Glavni program imaće jedino funkciju
učitavanja i snimanja trenutnih vrednosti u EEPROM, a interapt rutinom će se
realizovati sve ostalo (test prekidača, smanjenje broja, prikaz na displeju). Kod
ovakvog 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.
78
; ****** 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ča
goto Cek1 ; Nije otpušten
goto Pau ; Jeste otpušten. Idi na pauzu.
btfss PORTB,0 ; Još jedno testiranje zbog imunosti na
goto Cek1 ; eventualna varničenja kontakta.
Cek2 btfsc PORTB,0 ; Testiranje pritisnutosti prekidača
goto Cek2 ; Nije pritisnut
goto Pau ; Jeste pritisnut. Idi na pauzu.
btfsc PORTB,0 ; Još jedno testiranje zbog imunosti na
goto Cek2 ; eventualna varničenja kontakta.
79
; ****** Č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
80
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 ; rutine
return ; Povratak iz potprograma
Pri smeštanju više bajtova u EEPROM, možete bajt po bajt iza DE direktive odvojiti
zarezom, ovako: de 0x05, 0xA8, 0x79...
81
26. Sleep mod - pojam
82
Interapt izazvan tajmerom ne može se koristiti za buđenje iz SLEEP moda, jer je u
SLEEP modu i tajmer uspavan.
Ulaskom u SLEEP mod, menja se stanje određenih bitova STATUS registra. Vreme je
da napokon proučite i njegovu unutrašnju strukturu.
bit7 bit0
/ / RP0 TO PD Z DC C
Kao što vidite iz samog STATUS registra, izvršenje SLEEP instrukcije prouzrokuje
resetovanje PD bita i setovanje TO bita.
83
27. Buđenje iz Sleep moda
Sada ćete se upoznati sa programom koji ilustruje upotrebu SLEEP moda i buđenje iz
njega 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 postavi
kombinaciju tastera T1 do T4. Prilikom svake promene stanja tastera izaziva se
interapt (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 displeju
snima 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) snimljene
kombinacije 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.
84
; ****** Interapt rutina za prvi deo programa – normalne interapte ******
org 0x04 ; Ovde će početi interapt rutina
movwf TEMPW ; Čuvanje sadržaja W registra u TEMPW
swapf STATUS,W ; STATUS sa okrenutim niblovima u W
movwf TEMPSTATUS ; i zatim u TEMPSTATUS registar
85
call Nacr ; Nacrtaj sliku.
call Vrat ; Vrati sadržaj W i STATUS registra
bcf INTCON,RBIF ; Obriši interapt flag prekidača T1 do T4
retfie ; Vrati se iz interapt potprograma
86
; 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
87
bcf PORTA,4 ; Uključi segment decimalne tačke.
movlw .32 ; Inicijalizacija pointera RAM memorije
movwf FSR ; na registar .32
; Test prekoračenja je isti kao i ranije, iako bi sada slobodno mogao biti sa XOR
; operacijom
88
28. Brojač
Kako možete brojali spoljne signale? Jedan od mogućih načina predstavlja neprekidno
testiranje 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 za
glavni 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 biti
ukoliko ne idete na „Tour de France“ (poznata biciklistička trka u Francuskoj).
Osim promene izvora takta tajmera, sve je ostalo isto. Preskaler se podešava kao kod
tajmera, 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).
89
29. Reset
PIC16F84 ima 3 izvora reseta. Prvi je svakako reset prilikom dovođenja napona
napajanja (eng. POR – Power-on Reset). Unutar mikrokontrolera nalazi se malo
električno kolo koje detektuje porast napona napajanja do napona dovoljnog za rad
mikrokontrolera. U trenutku dostizanja nominalnog napona, mikrokontroler se
resetuje. 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đenja
napona napajanja. Ovo kašnjenje realizovano je internim RC oscilatorom nezavisnim
od takta oscilatora. To je dovoljno da se napon napajanja podigne na nominalnu
vrednost 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 otpornika
od 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 prouzrokovati
nehotič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.
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
30. Srce mikrokontrolera
Isto kao što Vaše srce pumpa krv određenim ritmom, mikrokontroler za svoj pravilan
rad 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.
Ovaj tip oscilatora može se koristiti za pun opseg frekvencija mikrokontrolera (DC do
4MHz, odnosno do 20MHz za brže verzije PIC16F84 mikrokontrolera). Mana mu je
loš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. Što
se tiče mikrokontrolera, on će bez problema raditi čak i sa taktom oscilatora manjim
od 1Hz. Kao lenjivac.
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. U
SLEEP modu oscilator se blokira, pa ni ovaj signal više nije dostupan.
91
preporučljivo ovim načinom menjati frekvenciju u većim opsezima. Zbog toga se
može umesto samo otpornika uključivati dodatni RC član. Više o ovom principu
imate na sajtu http://www.romanblack.com/ u delu PIC with 2 clock speeds!
Ukoliko je bitna stabilna frekvencija a i cena PIC16f84, dobar izbor bi bio kristalni
oscilator do 4MHz. Za njega je potrebno konfiguracioni bit podesiti kao - OSC XT.
92
Ukoliko želite imati izuzetno stabilnu frekvenciju možete umesto običnih koristiti
OCXO (eng. Oven Controlled Xtal Oscillator) kristale koji u istom kućištu imaju
kristal, 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 termostatom
reguliše se konstantna temperatura kristala iznad sobne temperature, tako da je
temperaturni drift frekvencije kristala minimalan.
Kako su takvi kristali (i takva kućišta) dosta skuplji od običnih, možete ih sami
napraviti sledeći uputstva sa sajta http://www.romanblack.com/ u delu Simple xtal
oven for accurate clocks.
Skoro svaki softverski problem može se rešiti na više načina. Ukoliko želite da se
određeni deo programa izvršava 5 puta, potrebno brojanje možete implementovati
sabiranjem, oduzimanjem, inkrementacijom, dekrementacijom pa čak i rotacijom. U
sledećim poglavljima upoznaćete se sa najčešće korišćenim softversko hardverskim
tehnikama za realizaciju određenih zadataka.
93
31. MPASM direktive i makroi
Ranije ste naučili par najkorišćenijih mogućnosti MPLAB asemblera. One su dovoljne
za analizu bilo kog asemblerskog (pa čak i disasembliranog) programa. U ovom
poglavlju naučićete par asemblerskih specifičnosti kojim će Vaš program biti čitljiviji
i kojim ćete smanjiti mogućnost pojave grešaka prilikom njegovog pisanja.
Već znate kako deluje equ direktiva. Pretpostavimo da ste imenu PAUZA pridružili
decimalnu vrednost 100. Unutar potprograma tu vrednost koristite kao broj
milisekundi. Pretpostavimo da vam u programu zatreba pauza duplo dužeg trajanja.
Umesto imenovanja još jednog broja, možete napisati sledeće:
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. Neke
od aritmetičkih operacija koje može izvršiti asembler su sledeće:
– ~ komplement
– << rotacija ulevo (bez Carry Flaga)
– >> rotacija udesno (bez Carry Flaga)
– & AND
– ^ XOR
– | IOR
94
Prilikom ovakvih vrednosti morate biti sigurni da parametar ne može izaći izvan
dozvoljenih 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:
i dalje je potrebno pamtiti na kom je portu povezan taster. Zamenom dela teksta za
tim nema potrebe.
#define direktivom nije moguće zameniti veći deo koda (2 ili više instrukcija). Za to
se koriste makroi. Čak je moguće u makro preneti određene parametre ranije
definisane.
Kad god je unutar programa potrebno na osnovu pritisnutog tastera otići na Prit ili
Otpu delove, dovoljno je kasnije umesto gornjeg koda napisati samo oznaku labele
makroa i parametra „Test TASTER“. Kako je imenom TASTER zamenjena oznaka
odgovarajućeg porta i pina, vrednosti port i pin unutar makroa uzeće ove vrednosti.
Na taj način se u makro ubacuju željeni parametri.
95
32. Komentari
;**********************************************************
; Autor :
; Datum :
; Verzija :
; Naslov :
;
; Opis hardvera :
; Opis softvera :
; Potrebni fajlovi : p16F84.inc
;
;**********************************************************
96
; ****** Interapt potprogram ******
ORG 0x04
movwf TEMPW ; Čuvanje sadržaja W registra
swapf STATUS,W ; STATUS sa okrenutim niblovima u W
movwf TEMPSTATUS ; i zatim u TEMPSTATUS registar
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
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 ;
movlw b'00000000' ;
movwf PORTA ; Inicijalizacija stanja portova i
movwf SPORTA ; Shaddow registara
movlw b'00000000' ;
movwf PORTB ;
movwf SPORTB ;
97
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.
;***********************************************
; 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' ;0
retlw b'00001100' ;1
retlw b'10110110' ;2
retlw b'10011110' ;3
retlw b'11001100' ;4
retlw b'11011010' ;5
retlw b'11111010' ;6
retlw b'00001110' ;7
retlw b'11111110' ;8
retlw 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 to
možete koristiti ASPIC_FIX program sa http://www.embedinc.com/ .
98
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 na
treći bit PORTA registra, ali tako da se ne promeni stanje ostalih bitova PORTA
registra.
Rezultat AND operacije nad bitovima, biće 1 samo ako je na oba bita prisutna logička
1. Ukoliko se ostali bitovi maskiraju, u W će se naći jedino stanje trećeg bita PRIKAZ
registra.
Nasuprot AND operaciji, rezultat IOR operacije daje 1 ukoliko je bar 1 bit na logičkoj
1. U tom slučaju (budući da je treći bit resetovan BCF instrukcijom), stanje trećeg bita
SPORTA 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
34. Kompresija
100
Proces vraćanja u prvobitno stanje (iz STANJE u STANJE1, STANJE2, STANJE3 i
STANJE4) naziva se dekompresija.
U ovoj dekompresiji na tačnu vrednost postavljeni su samo nulti i prvi bit u svakom
registru, a stanje ostalih bitova zavisi od stanja bitova u ostalim registrima. Ukoliko je
to nepoželjno, ostali bitovi mogu se setovati ili resetovati maskiranjem.
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 delova
dostigne celobrojni broj bajtova, i tek onda snimiti ceo bajt u EEPROM.
101
35. If ... Then ... Else ...
movlw .5 ; Broj 5?
xorwf BROJ,W ; Uporedi
Da
btfsc STATUS,Z ; If Z = 0 Z=0?
goto Isti ; else goto Isti
goto Razliciti ; then goto Razliciti Ne
Isti Različiti
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 flaga
direktno zavisiti od rezultata prethodne instrukcije (5 XOR 5 = 0 pa je Z setovan) koja
utiče na njegovo stanje, upravo je njegovim testiranjem omogućeno grananje.
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:
102
36. Uslovno asembliranje
Pretpostavimo da imate program koji kontroliše LED displej. Ništa čudno. Već ste to
nauč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čkom
katodom. Na sreću, pogodilo se da su priključci isti, da možete lako prebaciti katodu
sa napajanja na masu, jedini je problem tabela.
Šta možete uraditi? Zameniti tabelu! U redu. Ali šta ukoliko i drugi put promenite
displej? 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 uslova
može izabrati koji deo programa će se asemblirati, a koji ne.
Nastavak sledi!
103
37. Jednakost dva broja
U programima se često javlja potreba za testiranjem određenih vrednosti. Kao što ste
već naučili, lako je porediti jednakost dva broja korišćenjem XOR operacije, i
odgovarajućim skokom u zavisnosti od stanja Zero flaga. U slučaju testa više
vrednosti, moguće je testirati ih na sledeći način:
104
Osim XOR operacije testiranje jednakosti može se izvršiti i oduzimanjem dva broja i
testiranjem Zero flaga.
Ukoliko imate čestu promenu vrednosti registra koji testirate bez mogućnosti
testiranja njene jednakosti sa zadatom vrednošću neposredno nakon promene (npr. test
TMR0 registra), pouzdanije je testirati prekoračenje vrednosti testom Carry (umesto
Zero) 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 Zero
flaga) bio setovan i pri dostizanju vrednosti .0, a i pri prekoračenju. Detaljniji
postupak prekoračenja naučićete u narednom poglavlju.
105
38. Manji ili veći
movlw .2 ;2
subwf BROJ,W ; W = BROJ - 2
btfss STATUS,C ; Testiraj prekoračenje
goto Manji ; W<0; BROJ < 2
goto 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 biti
setovan Carry flag, pa će se dalje izvršavanje nastaviti od labele Manji. Kako se Carry
flag setuje i kada su brojevi jednaki, ukoliko je BROJ veći ili jednak broju 2 program
će se nastaviti od labele Veci.
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 ;2uW
xorwf BROJ,W ; Uporedi
btfsc STATUS,Z ; Da li su isti?
goto Isti ; BROJ = 2
106
Testiranjem jednakosti oduzimanjem umesto XOR-ovanjem, postignuta je ušteda dve
instrukcije.
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 < 2
goto Manji ; BROJ > 2
107
39. Zamena sadržaja dva registra
Ponekad (npr. pri sortiranju podataka) se javlja potreba za zamenom sadržaja dva
registra. Obično se za to koristi dodatni privremeni (eng. temp) registar.
Na sledeći način možete direktno izvršiti njihovu zamenu bez upotrebe dodatnog
registra.
Ovaj algoritam moguć je jer se duplo XOR-ovana vrednost bilo kojim brojem ne
menja. Potpuno istim načinom moguće je promeniti sadfržaj BROJ i W registra.
xorwf BROJ,F ;
xorwf BROJ,W ;
xorwf BROJ,F ;
108
40. On W goto ...
Slično kao kod tabele, sabiranjem PCL sa određenim brojim možemo otići na
proizvoljne memorijske lokacije.
109
41. Kašnjenje u petlji
Ovde je dat potprogram kojim će se (pri 4MHz) realizovati kašnjenje od tačno 1mS.
Svaki prolazak kroz petlju troši 4μS. Addlw traje 1, btfss 1 i goto 2μS. I u trenutku
izlaska iz petlje (W=0) kašnjenje je takođe 4μ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 je
moguće realizovati pauze od 1 do 255mS (¼ S).
Ukoliko Vam se ovaj način čini previše težak, možete isprobati PicLoops program
koji generiše deo potrebnog kôda u zavisnosti od unetog vremena kašnjenja i brzine
oscilatora. Autor tog programa prestao je da programira mikokontrolere, izbrisao je
PicLoops sa svog sajta i sada kolekcionira stare video igrice. Program sam postavio na
svom sajtu čiji link mođete naći na kraju ovog uputstva.
110
42. Semplovanje
Kako su semplovi jednobitni, oni se mogu kompresovati i tako zauzeti samo 144/8 =
18 EEPROM adresa. Kako EEPROM PIC16F84 mikrokontrolera ima 64 adresa, to
znač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.
Ovde se javlja drugi problem. Dokle će biti dovoljno? Objašnjenje daje teorija
semplova. Po njoj je bilo koji signal moguće predstaviti semplovima uzetih na
frekvenciji koja je bar duplo veća od maksimalne frekvencije originalnog signala. Šta
to 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 – 20
kHz) 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).
111
Do sada je rezolucija semplova bila jednobitna, odnosno omogućavala je samo dva
logička stanja (ima/nema vode). Sećate se da je pri učenju interapta predlagan metod
merenja 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 rezolucijom
moguć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 odabrati
kompromis između dovoljnog broja semplova i njihove rezolucije, a to opet zavisi od
konkretnih 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 biti
moguć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 vremena
semplovanje se uglavnom izvršava nakon prekoračenja tajmera (ili unutar interapta
izazvanih tajmerom).
Semplovanje nije ograničeno samo na merenje „egzotičnih“ signala kao što je nivo
reke. U idućem poglavlju naučićete kako se semplovanje može efektno iskoristiti
unutar debouncinga.
112
43. Debouncing
Dovoljno je napraviti petlju (ili petlju unutar petlje), uzeti sempl i resetovati petlju
ukoliko 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 toga
interapti mogu izazvati privremen prestanak ili duže vreme testiranja prekidača.
Dobar je jedino za programe gde se može dozvoliti čekanje na pritisnutost (ili
otpuštenost) tastera. U ostalim situacijama trebalo bi koristiti testiranje prekidača
unutar interapta izazvanih tajmerom.
113
44. Malo teorije oko memorije
Kroz takvu mrežu probija se naš glavni junak – nervozni poštar. On sa koverte čita
dve informacije. Naziv (broj) ulice i broj zgrade. Za očitavanje kompletne adrese
memorija bi morala imati čak 16 ulaznih pinova (8 za ulicu i 8 za broj). Ovo se
uglavnom rešava multipleksom adresne magistrale (više o principu multipleksa
naučićete kasnije), tako da se u memoriju najpre šalje broj reda, a za njim i broj
kolone. Neophodna sinhronizacija obezbeđuje se preko dva (ovo je svakako manje od
osam) 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 ili
upisivati 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. Tako
se 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 TRISB
registra), a prilikom upisivanja kao izlazni.
114
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 64
kompjutera paralelno adresnoj magistrali dodati još sedam 4164 DRAM memorija. U
tom 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 memorije
ne 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 jednog
tranzistora. Kako bi se kondenzator posle par mS potpuno ispraznio, ne bi više bio u
stanju čuvati podatak, pa se morao povremeno (npr. svake druge milisekunde)
osvežavati. Tako unutar Spectrum kompjutera Z80 mikroprocesor paralelno sa
izvršavanjem instrukcija povremeno osvežava DRAM memoriju, dok kod C64 video
kontroler osvežava memoriju za vreme dela instrukcijskog ciklusa u kome
mikroprocesor 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.
DRAM memorija ima više mana nego prednosti. Punjenje i pražnjenje kondenzatora
zahteva 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 upisa
većom brzinom od dozvoljene. Osvežavanje memorije troši dosta mikrokontrolerskog
vremena. Zbog toga se DRAM memorija sve ređe koristi i pored niske cene.
Nezaobilazna je i EPROM memorija. Ona na sebi ima mali stakleni „prozor“ preko
koga 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čno
zahteva više napone od radnih (+12V umesto +5V). Kada se podaci jednom snime u
EPROM memoriju, ne mogu se snimiti naredni sve dok se EPROM određeno vreme
ne izloži ultraljubičastoj svetlosti. Taj proces ubrzava „curenje“ naelektrisanja
isprogramirane EPROM memorije, i na taj način se EPROM obriše. Tek onda je
moguće ponovno programiranje. Većinu EPROM memorija moguće je postaviti u
sleep mod, dovođenjem logičke 1 na njen CE (eng. Chip Enable) pin.
115
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 i
RAM 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 svakako
stradati. 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 povezuju
sa eksternim hardverom adresnom magistralom, već se sve više razvija specifičan
hardver, kojim se određenim komunikacionim protokolima može upravljati manjim
brojem pinova, uz manju brzinu pristupa.
116
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) i
slati podatke kroz njih bit po bit određenom brzinom.
Najpre je potrebno uneti poruku koja će se poslati. Najlakše je uneti je u PIC u obliku
tabele. 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'.
117
nivo duži od perioda jednog bita označava stop bit. Bitovi se šalju sa prvim bitom
najmanje 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. Prilikom
slanja ASCII koda slova A (b'0100 0001') u kompjuter bi se poslala ovakva sekvenca:
Naponski nivoi RS232 porta su -3V ili niže za logičku jedinicu, i +3V i više za
logičku 0. Ovo se uglavnom može zaobići, tako što se koriste nivoi od +5V za logičku
0 i 0V za logičku 1, ukoliko je kabl za povezivanje dovoljno kratak. Primećujete da je
ovo obrnuto od onoga što biste mogli očekivati!
118
Slan bsf STATUS,RP0 ; Prebacuje u BANK1
movlw 0x00 ; Postavlja sve pinove kao izlazne
movwf TRISA ; na PORTA
bcf STATUS,RP0 ; Vraća u BANK0
clrf PORTA ; RA2 = 0 (RS232 visoko stanje)
movlw .50 ; Kasnjenje od 50 mS
call Kas ; preko potprograma za duže pauze
movlw 0x00 ; Ofset za prvi karakter poruke
call Izl ; Slanje poruke u kompjuter
Blok goto Blok ; Kraj u beskonačnoj petlji
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.
Kod RS423 drajvera prijemnik i predajnik su (kao kod RS232) polarizovani u odnosu
na masu. Međutim, naponski nivoi su mu od -4 do -6 za logičku 1 i +4 do +6V za
logič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
46. Algoritmi za detekciju grešaka
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 karaktera
redom 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:
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 i
uporediti 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 prijema
sabrao 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, a
ni 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 kao
i njihov zbir biće jednaki 0, što pogrešno indikuje ispravno primljene podatke). Ovo je
ipak mnogo pouzdanije od provere parnosti. Više o checksumu imate u TB026.
120
U slučaju dvosmerne komunikacije (mikrokontroler ka kompjuteru i kompjuter ka
mikrokontroleru) 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 signalizaciju
greš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 za
korekciju grešaka. Oni će biti detaljnije objašnjeni u narednom poglavlju.
121
47. Algoritmi za korekciju grešaka
A P B P C P
1011 1001 1 0110 1011 1 1101 0010 0
A P B P C P
1010 1001 1 0110 1011 1 1101 0010 0
0110 1011 B
XOR 1101 0010 C
= 1011 1001 A
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čije
algoritme.
122
48. I2C
U I2C vezi moguće je imati jedan glavni mikrokontroler (eng. Master) koji upravlja
dodatnim I2C hardverom (eng. Slave), ili pak više glavnih mikrokontrolera (eng.
Multimaster) od kojih svaki može upravljati dodatnim Slave I2C hardverom. U
nastavku ć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), a
logič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 o
signalu koji prima. Na taj način omogućena je komunikacija preko jedne linije, uz
nemogućnost kratkog spoja. Preko druge linije Master obezbeđuje takt neophodan za
sinhronizaciju prijemnika signala. Takt mora biti strogo sinhronizovan sa slanjem
signala. Postoji ograničenje njegove maksimalne brzine, ali ne i minimalne, tako da će
Slave prilikom slanja podataka po potrebi čekati dok Master ne bude slobodan za
njihov prijem (tj. dok Master ne pošalje takt).
123
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 i
viš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ćih
smetnji. 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.
Pre projektovanja kola, proučite tehničke podatke odgovarajućih kola, jer se njihove
karakteristike 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 MAX491
drajverom moguće je realizovati repetitor signala koji postavljen na polovini linije
regeneriše signal i tako omogućava duplo duže linije. Postoje i galvanski izolovani
drajveri (pogodni za područja sa jakim smetnjama – grmljavinom), npr. MAX253 i
MAX1480. 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
Kako je RS485 protokolom moguće da se pinovi predajnika isključe (tako što pređu u
visokoimpedansno stanje – slično ulazima mikrokontrolera), moguće je na taj način
kao 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 (ili
koristiti gotovi RS232 – pogotovu ukoliko je hardverski implementovan u
mikrokontroleru) koji će zadovoljiti vaše konkretne potrebe. To pruža slobodu
programeru da unutar protokola ugradi sopstvene algoritme „prozivke“ više dodatnih
mikrokontrolera (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 stabilan
komunikacioni hardver softverom komunicira na koji god način želi.
Osim ovih, postoji još par RS (eng. Recommended Standard) protokola poput RS449
i 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
50. DMX512
Ponekad je dovoljno slati informacije samo u jednom smeru. DMX512 (eng. Digital
MultipleX) predstavlja komunikacioni protokol sposoban za adresiranje do 512
prijemnika i koji se uglavnom koristi za upravljanje rasvetom. Za povezivanje se
koriste RS485 drajveri, a protokol predstavlja softver za upravljanje tim drajverima.
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
51. LIN
Za razliku od I2C veze umesto linije za takt, podaci se kroz provodnik prenose
asinhrono, kao kod RS232 veze.
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 dodatna
intervencija mastera u tom slučaju nije potrebna. Ipak, master mora obezbediti
povremenu prozivku nodova u slučaju da su njihovi podaci potrebni ostalim
nodovima.
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 svi
nodovi se bude i čekaju dalje informacije od mastera.
127
52. DALI
128
53. SPI
SPI protokol sličan je I2C protokolu, sa glavnom razlikom adresiranja raznih slave
uređaja preko posebnog pina, a ne prozivkom njihove adrese. Na taj način slave
hardver 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 SPI
hardver 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ćnost
istovremenog slanja podataka svim Slave hardverima ukoliko su sve CS linije na
logičkoj 0 (svi slave očekuju podatke).
Isto kao kod I2C protokola, mikrokontroler (master) je uvek zadužen za generisanje
takta preko SCK linije. Preko druge (SI) linije sinhronizovano sa taktom šalju se
podatci u ili iz mikrokontrolera.
129
54. INKnet
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.
130
Unutar status bajta noda, takođe (kao kod STATUS registra mikrokontrolera)
određeni flagovi opisuju funkcije noda. Flagovi su sledeći:
Flagovi od 0 do 7 su rezervisani.
Za više detalja pogledajte časopise Circuit Cellar broj 10 (avg/sep 1989), 11 i 12. U
njima možete pronaći i objašnjenja interesantnih principa komunikacija bez mastera
(detekcijom kolizije ili rednim transferom dozvole predaje od jednog ka drugom
nodu). Unutar istih časopisa možete videti i organizacionu strukturu složenijih
komunikacionih protokola, formiranu po slojevima (eng. Layers) u CEBus protokolu.
131
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 bi
svakako 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 što
se kroz dva provodnika prenosi i napon napajanja i koristan signal. Ovo je omogućeno
tako što izlazni napon drajvera može biti 15V, 7,5V ili 0V. Prijemnik na osnovu ovih
napona 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 protokol kao i INKnet ima master koji za komunicira sa pojedinim slave
nodovima. Međutim, njegovi slave nodovi nisu dodatni mikrokontroleri, već ih
predstavlja specijalizovano integrisano kolo CS212. Ono u sebi ima objedinjen
komunikacioni protokol, dva ulazna i dva izlazna pina i ulazno izlazni drajver.
1. Sinhronizacija – Master šalje poruku 0111111110. Na osnovu nje svi slave nodovi
sinhronizuju svoj takt.
S-ARTnet kao ni DALI ne sadrži integrisane drajvere za master, ali ih ima u CS212
kolima. Neophodna konverzija logičkih nivoa se za master obezbeđuje odgovarajućim
konvertorima signala. Preko ovog protokola master može adresirati do 30 slave
nodova, odnosno očitavati 60 udaljenih ulaznih pinova, i postavljati do 60 udaljenih
izlaznih 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 u
sekundi. Više o ovom protokolu imate u časopisu Circuit Cellar broj 21.
132
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), ali
Microchip se potrudio pa je softver koji bi inače opterećivao mikrokontroler prebacio
u hardver. Tako jedno integrisano kolo (MCP2510 ili MCP2515) obavlja
komunikacionu funciju (u kojoj je implementirana CRC detekcija grešaka, korekcija
grešaka, izazivanje interapta po prijemu signala...), a drugo predstavlja drajver za
spojni put (MCP2550 ili MCP2551). Drajverom upravlja komunikacioni čip, a
komunikacionim čipom mikrokontroler preko SPI protokola.
Isto kao RS485, i CAN standard koristi diferencijalne signale. Međutim, za razliku od
RS485, CAN standardom propisan je i komunikacioni protokol. U njemu je
mikrokontroler rasterećen od komunikacionih algoritama, i može svu svoju snagu
upotrebiti za ono za šta je i namenjen.
Po CAN protokolu ne vrši se (kao kod I2C ili INKnet) prozivka svakog pojedinačnog
noda. 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 za
komunikaciju 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 kod
S-ARTnet veze). Microchip je zaključio da se veliki broj nodova sastoji jedino od
odgovarajuć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.
133
Jedan deo do sada opisanih komunikacionih protokola je hardverski integrisan u jačim
serijama mikrokontrolera. To ipak ne znači da se slabiji mikrokontroleri (čitaj
PIC16F84) ne mogu koristiti za određene vrste komunikacija. Uvek je moguće (u
slučaju da je mikrokontroler dovoljno brz) pravovremeno direktno manipulisati
ulazno izlaznim pinovima, i na taj način ostvariti softversku implementaciju
hardverskih komunikacionih rutina (eng. bit-banging) kao što je ilustrovano u RS232
vezi. Taj način nekada može biti i neophodan (na primer prilikom istovremene
upotrebe 3 RS232 veze jednim mikrokontrolerom).
134
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 broj
26. U sledećoj tabeli dat je uporedni pregled ovde opisanih vrsta komunikacije sa svojim specifičnostima:
Paralelna RS232 RS485 DMX512 SPI I2C 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 zavisi od adr. 1 pred., 1 32 pred., 32 1 pred., 512 1 pred., malo zavisi od 1 master + 1 master + 64 1 master + 30 112 pred.,
članova magistrale prij. prij. prij. prij. kapaciteta linije 16 slave slave slave 112 prij.
max. brzina ograničena 20kbita/S 100kbita/S 100kbita/S 5Mbita/S 100, 400kbita/S 20kbita/S ? ? 1Mbit/S
hardverom do 3Mbita/S ili 3,2Mbita/S
max daljina mala,oko 15m 1,2km 1,2km mala,oko mala,oko 20cm 40m ? ? 40m pri
0.5m 0.5m 1Mbit/S
detek. gresaka ne bit parnosti zav. od soft. ne ne ne parnost +? dva bita hardverska
checksum parnosti
korek.gresaka ne zav. od soft. zav. od soft. ne ne ne zav. od soft. ? ne hardverska
max. napon 0V, +5V -25V, +25V -7V, +12V -7V, +12V 0V, +5V 0V, +5V 0V, +18V ? 0V, 7.5V, 15V -40V, +40V
drajvera
osetljivost zavisi od +-3V, +-0.2V +-0.2V zavisi od zavisi od zav. od drajv. +-?V trostepena +-0,5V
prijemnika hardvera prema masi diferencijalni diferencijalni hardvera hardvera diferencijalni diferencijalni
neaktivno 0V preko +3V zavisi od preko 0,4V nema takta visoka imp. bez Preko 9V preko ?V 15V nema signala
stanje softvera razlike u + takta razlike u + razlike
način pren. zav.od hard. asinhroni zav. od soft. asinhroni sinhroni sinhroni asinhroni asinhroni asinhroni asinhroni
simpl.br.prov zav. od mag. 1 + masa 2 + masa 2 + masa 4 + masa 2 + masa 1 + masa 2 1+masa 2 + masa
dupl.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
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 stabilniji
generisani napon i ne opterećuje mikrokontroler.
136
Kod ove šeme, umesto dupliranja vrednosti otpornosti
koriste se otpornici istih vrednosti. Korišćenjem
integrisanog otpornog niza, kolo sa ovakvom šemom
može čak imati manje dimenzije. Rezolucija ovog kola
je osmobitna. To znači da se ovim kolom može (za
razliku od prethodnog) dobiti čak 255 stabilnih
analognih stanja. U tablici možete videti neke tipične
vrednosti izlaznog napona u zavisnosti od postavljenog
binarnog stanja na PORTB.
137
59. Serijska D/A konverzija
Serijska D/A konverzija koristi drugačiji princip. Kod nje se kondenzator na izlazu
naizmenično puni i prazni tačno određenim odnosom, održavajući tako napon na
njemu u željenim granicama. Postupak kojim se puni i prazni kondenzator naziva se
modulacijom širine impulsa (eng. PWM – Pulse Width Modulation). Iako je
hardverski realizovana u nekim savremenijim PIC mikrokontrolerima, u PIC16F84
može se implementirati softverski.
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 za
više detalja. Za PIC16F84 od značaja bi mogao biti interesantan način modulacije tona
sa 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.
138
60. Flash A/D konvertor
Verovatno Vam je već poznato da PIC16F84 nema u sebi integrisan A/D konvertor za
razliku od nekih savremenijih mikrokontrolera. Međutim, uz jednostavan interfejs sa
njim 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/D
konvertora morate se najpre upoznati sa principom rada naponskog komparatora.
Šta u stvari radi naponski komparator? On poredi (eng. Compare) napone svoja dva
ulaza, i ukoliko je jedan veći od drugog, menja stanje svog izlaza. Na primer, ukoliko
se na jedan njegov ulaz dovede se referentni napon od 3V, a na drugom ulazu se
napon 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.
Pinovi RB4 do RB7 upotrebljeni su jer se njima može izazvati interapt pri promeni
ulaznog napona. Iako je problem velikog broja ulaznih pinova moguće prevazići
upotrebom određenih digitalnih konvertora u binarni format, ovoliki broj naponskih
komparatora nije baš najjeftiniji. Zato se ovaj tip A/D konvertora retko koristi.
139
61. Brojački A/D konvertor
Ovaj tip A/D konvertora u stranoj literaturi (eng.) se još sreće sreće pod nazivima
Counting ili Digital ramp.
Zamolite svog prijatelja da zamisli broj između 0 i 1000. Zamislio je. Krenite redom
sa 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.
140
62. Sukcesivno aproksimativni
A/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či
njegov 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.
Ovaj princip možete zamisliti kao sečenje pice. Iseče se na pola, zatim na četvrtine, pa
na osmine, i tako sve do najmanjeg parčeta.
Program je prilično jednostavan. Najpre se setuje bit najveće težine (MSB - RB7) na
PORTB registru. U zavisnosti od stanja naponskog komparatora, ovaj pin ostavi se
setovan ili se resetuje. Onda se prelazi na RB6, RB5, RB4...
141
63. Wilkinsonov A/D konvertor
Ranije šeme zbog upotrebe D/A konvertora zauzimaju previše dragocenih pinova
mikrokontrolera. Osim toga, one zahtevaju upotrebu naponskog komparatora za svoj
rad. 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 konvertovati
u 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) ili
kapacitivnosti (upotrebom kapacitivnih senzora).
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:
142
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žnjenja
kondenzatora. Microchip čak navodi da se usled prevelike struje na pinovima portova
može promeniti stanje TRISA ili TRISB registra, pa ga je stoga poželjno povremeno
softverski „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 sa
celzijusovim stepenima ili svetlosnim luksom, vrednosti ovih veličina
najjednostavnije je dobiti iz odgovarajuce tabele. Bilo koja izobličenja pri merenju
(poput nelinearne karakteristike upotrebljenog senzora) mogu se odmah kompenzovati
u samoj tabeli.
Ove šeme zbog svoje jednostavnosti imaju jedan veliki nedostatak. Sa njima nije
moguće dobiti veću preciznost zbog promene radnih karakteristika upotrebljenog
kondenzatora usled promene radne temperature. Zbog toga se može koristiti
kompenzacija ovih nedostataka koristeći kalibracioni otpornik i merenjem njegove
vrednosti 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 merenje
otpornosti 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 princip
rada 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
64. Konverzija otpornosti i
kapacitivnosti 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ćanje
mogućnosti pogrešnog merenja. Na primer usled sopstvene zavisnosti otpornosti od
temperature (ponašaju se kao mini senzor temperature), usled povećanja
kapacitivnosti 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 za
merenje 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 efikasnom
iskorišć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 merenjem
napona. Šta najlakše radi? Meri vreme i broji.
144
65. Konverzija napona u frekvenciju
Nastavak sledi!
145
66. Integrisani A/D konvertori
Pretpostavimo da Vam je potreban A/D konvertor koji bi brzo merio željeni napon, ne
zahtevajući pri tome intervenciju mikrokontrolera (npr. prilikom snimanja i
kompresije zvuka). U tom slučaju najpraktičnije je koristiti integrisane A/D
konvertore ž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 MAX
191.
Ponekad je potrebno meriti veliki dinamički opseg napona. Većina integrisanih A/D
konvertora sposobna je meriti jedino napone od 0 do +5V. MAX134 je specijalno
namenjen za ugradnju u mernim instrumentima, pa se njegov opseg merenja može
menjati u širokim granicama, omogućavajući na taj način merenje napona u opsezima
od 0 do 399,9mV rezolucijom od 0,1mV, pa sve do 0 do 399,9V rezolucijom od 0,1V.
146
67. Kompenzacija nelinearnih
karakteristika
Kako bi smanjili broj potrebnih merenja, dipl. ing. Lazar Pančić i dipl. ing. Bojan
Mitić 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.
147
68. Datalodger
148
69. Kontrola temperature
Upravo je taj šum poguban za uspešnu kontrolu temperature. Sa njim će pri istoj
temperaturi rezultat A/D konverzije jednom biti 170, a drugi put 180, što će
mikrokontroler shvatiti kao odgovarajuću promenu temperature, i brzo će uključivati i
isključivati relej. Kontakti običnih releja jednostavno nisu namenjeni za takav rad, i
relej će posle par nedelja stradati.
149
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 što
manjih oscilacija temperature poželjno koristiti kontinualnu regulaciju. Međutim, šta
sa situacijom kada napolju počne da pada kiša (odjednom zahladni)?
Uz dovoljno dobro toplotno izolovan inkubator, neće biti nikakvih problema. Ali
nekada 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čke
veličine. Više o ovim kontrolnim procesima imate u časopisima Circuit Cellar br. 17 i
19.
150
70. Rotacioni enkoder
Analogni potenciometri imaju par mana. Kao prvo njihovi kontakti nisu večni. Oni su
kao i kontakti mehaničkih prekidača podložni varničenju (eng. Bouncing). Otuda
krčanje pri pojačavanju i smanjenju zvuka. Još gore, ukoliko upotrebite A/D
konvertor da prevedete stanje analognog potenciometra u digitalni oblik, moguće je da
kontakti potenciometra baš u trenutku merenja usled lošeg spoja budu odvojeni od
otporne površine, što će prouzrokovati očitavanje maksimalne otpornosti.
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 svojih
kontakata i manje rezolucije.
151
Kao što vidite, ukoliko se signal menja u smeru 00, 01, 11, 10 to znači da se osovina
okreće u smeru kazaljke na satu. U suprotnom (10, 11, 01, 00) osovina enkodera se
okreć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će
suprotno od kazaljke na satu.
Iako Vam može izgledati da su rotacioni enkoderi spori, to nije slučaj. Oni mogu imati
i preko 255 položaja za samo 1 okretaj osovine. Može se desiti da zbog sporosti
mikrokontrolera (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 nakon
stanja 01 ne očita (zbog sporoti) sledeća 2 stanja (11 i 10), već tek treće (00), pa na
osnovu 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 i
debouncing 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.
152
71. Regulacija smera i brzine
kolektorskih DC motora
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 za
smanjenje tog napona. Umesto toga koristi se PWM princip D/A konverzije, ali bez
integratora (otpornika i kondenzatora). Na taj način motoru neće biti smanjena snaga
obrtanja osovine (usled smanjenog napona napajanja), već će se snaga regulisati
PWM odnosom punog napona napajanja.
Kako kolektorski motor može u trenutku uključenja povući mnogo veću struju od
nominalne, poželjno je galvanski ga odvojiti od mikrokontrolera. Takođe, potrebno je
osigurati se da kvar mikrokontrolera ili nepravilna sekvenca na njegovim izlazima ne
može dovesti do kratkog spoja kroz tranzistore zaobilazeći motor. Oba problema
uspešno su rešena električnom šemom sa sajta:
www.mcmanis.com/chuck/Robotics/tutorial/h-bridge/bjt-circuit.html
153
72. Potrošač kao senzor
Znate li zašto nova, tek kupljena sijalica po prvom uključenju pregori? Nemojte se
muč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 na
njega. Nijedan ponuđeni odgovor nije bio tačan.
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 generatorskom
rež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 od
generisanog napona (čime bi se sprečio njihov lom pri prejakom vetru), a akumulatoru
omogućiti naizmenično punjenje i testiranje napunjenosti.
Iako nema direktne veze sa potrošačima, verovatno će Vas zanimati kako možete
običnu LED upotrebiti za senzor osvetljenosti. Detalje imate na sajtu
http://free-vz.t-com.hr/Ivica-Novakovic/index.html.
154
73. Servo motori
Motori koji se i pored reduktora ne mogu dovoljno brzo zaustaviti (imaju veliki
zamajac) moraju pored rotacionog enkodera primenjivati usporavanje, kočenje pa
ubrzanje. To je objasnjeno u AN532
155
74. Step motori
156
75. Detekcija prolaska napona kroz 0
Slika
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 je
dovesti 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 da
senzori ove signale uglavnom daju u analognom obliku. Ukoliko ne postoji način da
se 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
76. Integrisana kola 4000 i 7400 serije
Ukoliko Vam iz bilo kog razloga zatreba neka funkcija koja nije implementirana u
PIC16F84, možete ga direktno povezati sa odgovarajućim integrisanim kolom, koje
realizuje 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 je
njen 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
● Digital Simulator
● Digital Works
158
77. Multipleksiranje izlaza
PIC16F84 ima 13 ulazno izlaznih pinova. Samim tim izgleda nemoguće spojiti
direktno na mikrokontroler više od 13 LED. Međutim, primenom multipleksiranja
moguće je direktno na mikrokontroler spojiti mnogo veći broj LED.
Kako radi multipleksiranje. Znate i sami da je televizijski prikaz moguć jedino zbog
tromosti ljudskog oka. Ovde je primenjen sličan pristup.
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 povezivanjem
tranzistora 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.
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šavanjem
dužine uključenog stanja, tako da se postigne kompromis između jačine svetla dioda i
njihovog treperenja.
159
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 displeja
spajaju se preko prekidačkog tranzistora na PORTA.
U praksi se može videti ovakav princip realizovan bez ikakvih opornika i prekidačkih
tranzistora, 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 propustiti
struju svih segmenata displeja, pa samim tim intenzitet svetla nije isti kada je na
displeju 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.
Postupak je isti kao i ranije, sa tim što umesto odgovarajućeg obrasca za prikaz na
displeju, 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) ima
moguć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
78. Komplementarno povezivanje LED
Poznato vam je da pin može biti postavljen kao izlaz na visokom logičkom nivou, kao
izlaz 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.
Za razliku od standardnih multipleksa, ovo kolo troši čak 2,5mA u stanju isključenih
LED, 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 pogledajte
TB029 sa http://www.microchip.com/.
161
79. LCD - pojam
Pre svega trebate znati da postoji više vrsta LCD (Liquid Crystal Display). LCD u
svom najosnovnijem obliku možete videti na digitalnom satu, digitronu ili video
igricama. 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đenom
segmentu da bi postao vidljiv mora neprekidno dovoditi naizmenični napon (kao kod
multipleksa pojedinih LED). Na sreću, i LCD može raditi u multipleksu, ali u dosta
drugačijem obliku. Pri tome broj pinova za uključenje pojedinih displeja ostaje isti, ali
jedan osmobitni port može kontrolisati maksimalno dva sedmosegmentna LCD
displeja (zajedno sa decimalnom tačkom). PIC16F84 bi prema tome mogao da
direktno kontroliše jednu do dve cifre displeja vašeg digitrona. Više o principu
direktnog pogona LCD-a imate u AN563 sa http://www.microchip.com/.
Šta predstavlja ASCII set karaktera? U rano doba informatike svaki kompjuter
(Commodore, Spectrum, Atari, Amstrad, Oric Nova, Pacom, Galaksija) imao je
sopstveni 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 su
imala nesuglasica. U nekim kompjuterima nisu ni postojala. Predstavljanje cifara
brojeva i znakova interpunkcije je opet poseban slučaj. Svakako da je bilo potrebno na
neki 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.
162
a displej će se sam pobrinuti za sve ostalo. To može biti nedostatak ukoliko želite na
displeju prikazati naša slova (npr. ŠĐŽČ). Iz tog razloga predviđena je mogućnost da
programer promeni sliku par specijalnih karaktera. Kako integrisani kontroler LCD-a
nema EEPROM memoriju, sliku ovih karaktera je neophodno čuvati u memoriji
mikrokontrolera i inicijalizovati u LCD-u po svakom uključenju.
Kako LCD zahteva čak 8 pinova za prenos bajtova u LCD (DB0–DB7), kontrolerom
LCD-a je predviđena mogućnost upotrebe samo 4 pina (DB4-DB7) a osmobitni bajt
se 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
startnog pulsa) ne postoji maksimalno vreme za koje se ovi podatci trebaju poslati. Na
taj način mikrokontroleru ostaje prilično vremena za ostale operacije koje treba
obavljati. Ipak, podatci se na LCD ne smeju slati previše velikom brzinom, jer ih u
tom 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 je
ostale pinove LCD-a (kao u multipleksu) koristiti za neke druge operacije. Impuls za
inicijalizaciju integrisanog kontrolera LCD-a mora trajati bar 450nS. Dok je startni
Nastavak sledi
164
80. Multipleksiranje ulaza
A ukoliko želite postići još više ulaza uz minimalni broj upotrebljenih pinova, možete
koristiti sledeću šemu.
165
Pretpostavimo da su upotrebljeni pinovi RB0 do RB3, i da su prekidači obeleženi
decimalno (1 – 12), kao u prošlom primeru. Pre svega, potrebno je uključiti pull-up
otpornike. 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, a
RB1 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 mora
vrš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.
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čno
minimalno vreme za koje korisnik drži taster prekidač pritisnutim je oko 50 do
100mS.
Može li se još smanjiti broj potrebnih pinova? Naravno da može. Više o tome u
narednim poglavljima.
166
81. Dupli multipleks
U multipleks rutini se u pauzi između uključenja displeja (dok su svi displeji preko
PORTA 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č.
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 brzine
testiranja prekidača.
167
82. Kapacitivni prekidači
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, ali
eliminacija 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 se
nabaviti 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 dosta
ogranič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/ i
www.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&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 ni
multipleks jednostavno nisu mogući.
168
83. Do 16 ulaza na 1 pinu
Princip rada je sledeći. Pin RB0 povezan je kao wilkinsonov A/D konvertor, ali
umesto merene otpornosti, ovde se pojavljuje otporna mreža. Rezultujuća otpornost
na 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.
Za razliku od ostalih šema sa više ulaza, ovom šemom je skoro nemoguće realizovati
detekciju više istovremeno pritisnutih tastera zbog većeg broja rednih i paralelnih
spojeva otpornika.
169
84. Buđenje iz sleep moda po
pritisnutom tasteru
Ovde se najpre uključe pull up otpornici, a zatim se RB0 do RB3 pinovi deklarišu kao
izlazni sa logičkom 0, a RB4 do RB7 kao ulazni, podesi se intarapt i ode se u sleep
mod. 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 na
logič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/.
170
Na ovoj šemi svi izlazi (RB0 do RB3) postavljeni su na logičku 0. Kondenzator C se
napunio 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 od
toga koji se taster pritisnuo), napon na kondenzatoru opada (oko 1mS) sve dok se PIC
zbog pojavljivanja logičke 0 na MCLR pinu ne resetuje. Po resetu se svi U/I pinovi u
hardverskoj inicijalizaciji mikrokontrolera definišu kao ulazi, što sprečava dalje
pražnjenje kondenzatora. Vrednosti otpornika i kondenzatora izabrane su tako da je
trajanje ciklusa pražnjenja i punjenja kondenzatora manje od vremena reseta
mikrokontrolera (oko 18mS).
Čim se reset završi, potrebno je uključiti Pull up otpornike, na RB0 do RB3 pinovima
redom na kratko postaviti logičku 0 (držeći ostale izlaze na logičkoj 1), što brže
testirati stanje prekidača na RA0 do RA3 pinovima, i vratiti pinove RB0 do RB4 na
logičku 1. Prebacivanje izlaza na logičku 0 ne može prouzrokovati ponovni reset
mikrokontrolera ukoliko je vreme testiranja previše brzo (reda 10μS).
171
85. Može li još manje?
Može, ali uz upotrebu specijalizovanih integrisanih kola koja u sebi već imaju
integrisanu multipleks rutinu, i dovoljan broj pinova za povezivanje na LED displeje,
odnosno prekidačku matricu.
172
86. Povećanje broja U/I pinova
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 8
izlaza, 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.
Ukoliko Vam je potrebno 8 ulaza ili izlaza, možete koristiti PCF8574. Sa njim je
multipleks teže ostvariti, ali je moguć SLEEP mod.
173
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 BCD
obliku čak možete gornji nibl koristiti za prikaz jedne, a donji nibl tog istog registra
za prikaz druge cifre. Za prikaz na LCD-u pogodniji Vam je ASCII oblik brojeva. Isto
tako, za komplikovane matematičke operacije praktičnije bi bilo korišćenje operacija
sa pokretnim zarezom (eng. Floating Point ili skraćeno float).
Za manji broj vrednosti promene brojnih sistema možete ručno izvršiti koristeći
integrisan Linuxov ili Windowsov digitron. Prilikom promene bez digitrona, moguće
je konverziju obavljati po sledećim principima:
174
582 - 512 = 70 512 256 128 64 32 16 8 4 2 1
70 - 64 = 6 1 0 0 1 0 0 0 1 1 0 = b'10 0100 0110'
6- 4= 2
2- 2= 0
175
88. Šesnaestobitna aritmetika
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, u
zavisnosti od stanja Carry flaga doda se 0x01 na jedan od MSB, a onda se saberu oba
MSB.
cblock 0x1C
LSB1 ; Promenljiva 1, bajt manje težine
MSB1 ; Promenljiva 1, bajt veće težine
LSB2 ; Promenljiva 2, bajt manje težine
MSB2 ; Promenljiva 2, bajt veće težine
LSBRES ; Rezultat, bajt manje težine
MSBRES ; Rezultat, bajt veće težine
endc
176
89. Brze matematičke operacije
Tabelom koja Vam vraća celobrojnu vrednost možete dobiti tačan celobrojni rezultat
u samo 5-6 instrukcijskih ciklusa. I sami uočavate da je preciznost rezultata previše
mala za ikakav ozbiljniji rad. Nema problema. Vrednost prve decimale rezultata naći
će se u sledećoj tabeli.
Iako su ovi načini izuzetno brzi, nisu ekonomični u pogledu utroška programske
memorije. 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 bi
se 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 (decimalna
vrednost) bi se ionako nalazila u BCD formatu. Tabela bi mogla izgledati ovako:
177
Tabl addwf PCL,F ; U W se nalazi broj od .0 do .255.
retlw 0x00 ; 0 – 0,0
retlw 0x10 ; 1 – 1,0
retlw 0x14 ; 2 – 1,4
retlw 0x17 ; 3 – 1,7
retlw 0x20 ; 4 – 2,0
retlw 0x22 ; 5 – 2,2
. . .
retlw 0xF9 ; 254 – 15,9
retlw 0xF9 ; 255 – 15,9
Za veći broj decimala pogodnije bi bilo koristiti binarni oblik zapisa (makar samo za
decimale) i odgovarajuće konverzione rutine. Sve zavisi od toga kolika Vam je brzina
računanja potrebna.
Slika
Umesto čuvanja vrednosti cele periode unutar više tabela, mogli biste koristiti
označ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 indeksa
tabele od maksimalne vrednosti. Tako je broj potrebnih tabela smanjen na četvrtinu.
178
upotrebom eksterne EPROM memorije, ali ona troši najveći broj pinova. Budući da je
njena cena danas izuzetno niska, to bi ipak moglo predstavljati dobro rešenje.
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ćniji
mikrokontroler.
179
90. Merenje vremena
Već znate kako možete meriti vreme. Obavezan je kristalni oscilator, i deljenje
njegovih taktova. Međutim uz kristalni oscilator od 4MHz morali bi se malo pomučiti
dok dođete do vremena od tačno 1S. Ne verujete? Zato što razmišljate decimalno, a ne
binarno!
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...
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 da
impulse za brojanje uzima sa ovog pina umesto sa takta oscilatora. Tako PIC može
raditi svojom maksimalnom brzinom, uz isto tako maksimalnu preciznost vremena.
Naravno, ovo malo komplikuje hardver zbog potrebe za eksternim kristalnim
oscilatorom. Tu su napredniji mikrokontroleri u prednosti nad PIC16F84 zbog
postojanja šesnaestobitnog TIMER1 modula. Sa njim je moguće direktno na pinove
mikrokontrolera povezati kristal (sa pripadajućim kondenzatorima), i tako dobiti takt
nezavisan od frekvencije mikrokontrolera. Još bolje, ovaj tajmer aktivan je i u SLEEP
modu.
Ukoliko planirate u sat (eng. RTC – Real Time Clock) ubaciti i kalendar, morate pre
svega odlučiti da li ćete mu implementirati korekciju 29. februara za slučaj prestupne
godine (Leap year) i automatsko ažuriranje prilikom promene vremena (eng. Daylight
savings). Zbog toga Vas vaš kompjuter pita za prelazak na letnji ili zimski način
rač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
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 upotrebljenog
kristala. 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 sporijim
izvršavanjem. Drugačiji način (hardverski) kalibracije vremena sastojao bi se u
menjanju kapacitivnosti jednog od kondenzatora pored kristala od 32KHz. Najlakše
štelovanje postiže se trimer kondenzatorom.
Gotove softverske rutine za sat možete naći širom interneta. Već imate asemblersku
rutinu u Microchip Maestro programu. Verovatno ste ga već instalirali uz MPLAB
paket. Još neke su na adresama http://www.iki.fi/jap i
http://ourworld.compuserve.com/homepages/Bill_Bowden/homepage.htm#menu.
181
91. Drajveri
Iako Vam može tako izgledati, ovo nije šala. Ovde se doduše ne radi o drajverima za
skener, štampač ili grafičku karticu, već o drajverima za LED, LCD displej, prekidače
ili step motor.
Pogledajte sada sledeći primer. Jedan LED displej na portu B. Drajver bi se sastojao
od već ranije naučene tabele i potprograma za ispis. To bi moglo izgledati ovako:
Update
movf SPORTA,W ; Shaddow registar porta A
movwf PORTA ; u PORTA
movf SPORTB,W ; Shaddow registar porta B
movwf PORTB ; u PORTB
return ; Povratak iz potprograma
Potprogram Update može se ovako pozivati i za port A, odnosno može služiti kao
posebna celina.
182
Kad god je moguće standardizujte softver za uobičajeni hardver drajverima. Potrudite
se da određene standardne vrednosti (ulazi u prvom drajveru) imenujete i podesite
samo jednom u programu. Tako će pri kasnijoj izmeni softvera (npr. pri dodavanju još
jednog ulaznog pina) biti dovoljno izmeniti samo jedan jedini red programa. Manje
izmena, manje grešaka.
183
92. Operativni Sistem
Za više detalja pogledajte AN514, AN585, AN777 i časopis Elektor Electronics broj
5/98.
184
93. Elektronika, matematika, fizika...
185
94. Straničenje 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 verovatno
krahirati. U potpuno istoj situaciji nalaze se mikrokontroleri PIC16 serije sa više od
2Kb memorije.
Kod mikrokontrolera iz PIC16 serije koji imaju više od 2Kb programske memorije
(PIC16F84 ima 1Kb) instrukcije CALL i GOTO mogu adresirati maksimalno 2Kb
memorije. 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 programske
memorije. Međutim, unutar jedne četrnaestobitne instrukcije nalazi se i kod
instrukcije i operand. Kod CALL instrukcije to izgleda ovako:
kod adresa
100 xxxxxxxxxxx
RAM memorija takođe pati od sličnog problema. Evo kako izgleda kod ANDWF
instrukcije:
kod odredište adresa
000101 d fffffff
Još komplikacija može izazvati indirektno adresiranje preko INDF i FSR registara. Sa
8 bitova koji se mogu naći u njima moguće je adresirati do 256 registara. Zato se
unutar STATUS registra nalazi IRP bit kojim se omogućava indirektno adresiranje
ostatka RAM memorije.
186
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. Kod
PIC18 serije na primer ukinuto je straničenje programske memorije, dok je prostor za
registare u bankama povećan na 256.
187
95. Disasembler
Sigurno Vam se desilo da ste na internetu naišli na program koji radi upravo ono što je
Vama potrebno, ali biste mu dodali još par mogućnosti. Nažalost autor ga je napisao u
PIC Basic ili C jeziku umesto u asembleru, ali je na sajtu ostavio i .hex kôd.
Mikado
DISASM84
Analiza disasembliranih programa uopšte nije laka. Komentara nema (osim onih koje
disasembler 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). Labelama
disasembler 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 izuzetno
komplikovane za analizu. Zato je preporučljivo u disasemblirani listing ubaciti
odgovarajuće komentare, i podeliti ih u logičke celine (blokove). Isto tako, ukoliko ste
sigurni u funkciju određenih registra ili labela, možete im izmeniti naziv u svim
mestima u kojima se pojavljuju u programu (preko Edit, Replace opcije).
188
96. Preprocesor
nego:
movf HI_GODINA,W
sublw 0x07
btfsc STATUS,Z
goto Test
btfsc STATUS,C
goto Smanji
Kraj ...
Nakon što se preprocesorom dobije odgovarajući asemblerski kod, tako dobijen .asm
fajl standardno bi se kompajlirao MPLAB asemblerom.
189
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 uticati
na 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.
190
97. Grafički orjentisani programski jezici
191
98. A koliko to košta?
Nemojte misliti da su digitalne stvari one najbolje. One mogu odlično poslužiti u
kontroli procesa ili u upravljanju raznim analognim uređajima, ali analogna
elektronika i dalje drži veliko vođstvo. Iako je sasvim moguće koristiti digitalne
senzore 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 biste
sa njim mogli dobiti možda Vam neće biti dovoljna za inkubator ili razvijanje
filmova, ali za regulaciju temperature prostorije svakako hoće. Ionako Vam
mikrokontroler u većini slučajeva bespotrebno troši dragocene taktove. Neka bar radi
nešto korisno, pogotovu ukoliko se time može uštedeti.
Posebna situacija je LCD displej. Uglavnom je toliko malih dimenzija i toliko slabo
osvetljen da se u praksi prilično malo koristi. Nemojte misliti da će Vam sa njim
izgrađeni uređaji izgledati profesionalnije. Nema svrhe na LCD displeju prikazati 2 ili
3 cifre, koje bi upotrebom LED displeja mogli mnogo jeftinije realizovati. Osim toga
LED 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
99. Marfijev zakon
Ukoliko već imate neki potrošač (2-3kW) koji želite uključivati i isključivati
mikrokontrolerom, morate znati da bi prevelika struja koju povuče taj potrošač u
trenutku 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 njegovih
namotaja. O stabilnosti oscilatora u ovakvim slučajevima, da ni ne govorim.
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 biti
opisane situacije koje (ukoliko se na njih ne obrati pažnja) mogu dovesti do
nepravilnog rada programa.
Pinovi PORTA i PORTB registra su nakon uključenja preko TRISA i TRISB registra
definisani kao ulazni. Ukoliko na spoljni hardver želite odmah po uključenju
mikrokontrolera 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 i
PORTB registrima po uključenju mikrokontrolera nisu inicijalizovane, što znači da
stanje bitova u njima može biti bilo kakvo.
Definisanje pinova kao izlaza pre nego što se promeni nepoznata vrednost u PORTA i
PORTB 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
zaglavlju koje koristite za razvoj novih programa unapred inicijalizujete stanje na
PORTA i PORTB registrima pre promene TRISA registra. U stvari poželjno je ubaciti
inicijalizaciju u zaglavlje za sve najkorišćenije registre (npr. INTCON i
OPTION_REG) zajedno sa njihovim kratkim objašnjenjima, da se njihova
inicijalizacija ne bi previdela.
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 tu
mogućnost.
Poseban slučaj predstavljaju greške izazvane internim ciklusom čitanja i upisa stanja
sa porta (eng. RMW – Read, Modify Write). Prilikom izmene stanja porta
instrukcijom bcf PORTA,2 mikrokontroler će očitati trenutno stanje svih pinova
PORTA 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 kog
razloga (previše mala impedansa na liniji) pin RA0 trenutno nalazi u stanju u kome
nije postavljen, moguće je da mikrokontroler pri RMW ciklusu sa njega očita logičku
0 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ć sve
operacije obavljati nad shaddow registrom, a tek kasnije, kada je to neophodno
kopirati 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 bilo
kog razloga) ne setuje pravovremeno flag.
A evo i mog skromnog iskustva :) Naime greškom sam u jednom projektu upis, u
interni EEPROM PIC18F452 mikrokontrolera, vršio na 100mS neprekidno, i nakon
194
više meseci rada ta lokacija EEPROMa je stradala. "Obdukcijom" je utvrđeno da je
više od 12000000 (12 miliona) puta izvršen upis pre nego što se javio problem :) Eto,
ima i pozitivnih iskustava :)))
195
100. Dobar (user frendly) dizajn
Pogledajte Vaš daljinski za TV! Trebaju li vam svi ti dugmići? Da li ste ikada uspeli
da programirate svoj klima uređaj tako da se automatski uključuje svakoga dana u
6:00? Jeste li se iznervirali što vam instaliran Office paket zauzima cak 1Gb hard
diska, iako je poznato da prosečan korisnik iskoristi jedva 2% mogućnosti programa
za obradu teksta? Pogledajte tastaturu Vašeg kompjutera. Možete li (kao kod pisaće
mašine) odgovarajućim prstom pritisnuti bilo koje dugme na njoj, ne pomerajući celu
šaku?
196
6. Umesto rotacionog enkodera postavljena je tastatura sa ciframa „0“ do „9“ i
tasterom „DALJE“ bez debouncing rutine, ali sa pauzom od trećine sekunde
po pritisnutom tasteru. Vreme potrebno za podešavanje iznosi oko 3S.
Osim ulaznih, nije teško ostvariti poboljšanja ni na izlaznom hardveru. Šta mislite o
LED 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 Vam
duže trajati.
Ukoliko imate česte nestašice struje, pa ste zbog toga za sat predvideli dodatno
napajanje 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
101. Servisni mod
Servisni mod nije (bar kod PIC16F84) poput SLEEP moda integrisan u sam
mikrokontroler. Potrebno je da ga sami osmislite. Zove se servisni jer mu pristup
imaju 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 testiranje
mikrokontrolera 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 kombinacija
određ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. A
možete i poslati stanje svih registara u kompjuter preko RS232 veze (eng. in-circuit
debugging). Č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 program
vratite 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) nije
moguće testirati u simulatoru, upotrebom servisnog moda postaje moguće.
Ukoliko već imate gotov i proveren program, možda bi Vam bila interesantna
moguć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 u
toku samog ispitivanja programa. Naravno, eksterni hardver programatora je i dalje
neophodan.
198
102. To je to. Šta sada?
Sada imate odlične polazne osnove za dalji rad sa mikrokontrolerima. Ukoliko vam i
danje 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 na
forumima 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 momentalno
odgovorio) 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 hteo
da me pita. Najbolje je opisati šta želite da vaš program radi, dokle ste do sada stigli i
na 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žite
savet) 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 svoje
znanje (makar i fragmente znanja) sa drugima. Ukoliko i Vi spadate u takve osobe, pa
smatrate da će Vam vaš program doneti milione, ali eto zapeli ste kod neke greške i
nikako da je otklonite, bolje se nemojte ni javljati po forumima. Ukoliko ne podelite
sa 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 konstruktivnijem
odgovoru.
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šta
i male cene mogu predstavljati dobar izbor za manje zahtevne aplikacije.
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 nude
nove hardverske dodatke (npr. integrisani USB2 kontroler).
199
Najnovija Microchip familija mikrokontrolera PIC32mx omogućuje rad sa
tridesetdvobitnim instrukcijama, ali nažalost instrukcije su joj potpuno različite od
ranijih serija. Izgleda da je Microchip rešio da prilagodi svoje proizvode i za
programski jezik C koji u ranijim serijama nije bio efektno zastupljen.
Ono što čini mikrokontrolere toliko moćnim nije njihova brzina, memorija ni
integrisani hardver, već ideja o njihovoj mogućoj upotrebi u svakodnevnom životu, i
poboljšanja koja bi se njihovom upotrebom mogla ostvariti. Ukoliko već nemate
uslova da mikrokontrolerima poboljšate industrijske mašine, počnite od svog
domaćinstva. Stepenični automat za svetlo, elektronska brava, zvono, tajmer za
osvetljenje akvarijuma, tajmer za prehranu pčela zimi, automatska hranilica za kućne
ljubimce, digitalni podsetnik, brzinomer za biciklu, sve su to mali projekti koji Vam
mogu pomoći u svakodnevnom životu.
200
103. Prilozi
Priloge na narednim stranama poželjno je štampati posebno, kako bi Vam uvek bili na
dohvatu ruke. Možete ih koristiti kako bi se brzo podsetili tačnog naziva instrukcija ili
banke registara.
XOR 00101110
XOR 10010110
0 0 0
= 10111000
0 1 1
1 0 1 Rezultat XOR operacije će biti logička 1 samo ukoliko su mu
1 1 0 oba operanda različita. Ukoliko su ista (obe 0 ili obe 1), rezultat
će biti logička 0.
AND 01101011
AND 10100101
0 0 0
= 00100001
0 1 0
1 0 0 Rezultat AND operacije biće logička 1 samo ukoliko su oba
1 1 1 operanda na logičkoj 1. Ukoliko bar jedan nije, rezultat će biti
logička 0.
IOR 01101011
IOR 10100101
0 0 0
= 11101111
0 1 1
1 0 1 Rezultat IOR operacije biće logička 1 ukoliko je bar na jednom
1 1 1 operandu prisutna logička 1. Ukoliko su oba na logičkoj 0, i
rezultat će biti jednak logičkoj 0.
201
Dec Hex Bin BCD Ozn Dec Hex Bin BCD Ozn
.0 0x00 b'0000 0000' 00 0 .16 0x10 b'0001 0000' 10 +.16
.1 0x01 b'0000 0001' 01 +.1 .17 0x11 b'0001 0001' 11 +.17
.2 0x02 b'0000 0010' 02 +.2 .18 0x12 b'0001 0010' 12 +.18
.3 0x03 b'0000 0011' 03 +.3 .19 0x13 b'0001 0011' 13 +.19
.4 0x04 b'0000 0100' 04 +.4 .20 0x14 b'0001 0100' 14 +.20
.5 0x05 b'0000 0101' 05 +.5 .21 0x15 b'0001 0101' 15 +.21
.6 0x06 b'0000 0110' 06 +.6 .22 0x16 b'0001 0110' 16 +.22
.7 0x07 b'0000 0111' 07 +.7 .23 0x17 b'0001 0111' 17 +.23
.8 0x08 b'0000 1000' 08 +.8 .24 0x18 b'0001 1000' 18 +.24
.9 0x09 b'0000 1001' 09 +.9 .25 0x19 b'0001 1001' 19 +.25
.10 0x0A b'0000 1010' 0x +.10 .26 0x1A b'0001 1010' 1x +.26
.11 0x0B b'0000 1011' 0x +.11 .27 0x1B b'0001 1011' 1x +.27
.12 0x0C b'0000 1100' 0x +.12 .28 0x1C b'0001 1100' 1x +.28
.13 0x0D b'0000 1101' 0x +.13 .29 0x1D b'0001 1101' 1x +.29
.14 0x0E b'0000 1110' 0x +.14 .30 0x1E b'0001 1110' 1x +.30
.15 0x0F b'0000 1111' 0x +.15 .31 0x1F b'0001 1111' 1x +.31
Dec Hex Bin BCD Ozn Dec Hex Bin BCD Ozn
.32 0x20 b'0010 0000' 20 +.32 .48 0x30 b'0011 0000' 30 +.48
.33 0x21 b'0010 0001' 21 +.33 .49 0x31 b'0011 0001' 31 +.49
.34 0x22 b'0010 0010' 22 +.34 .50 0x32 b'0011 0010' 32 +.50
.35 0x23 b'0010 0011' 23 +.35 .51 0x33 b'0011 0011' 33 +.51
.36 0x24 b'0010 0100' 24 +.36 .52 0x34 b'0011 0100' 34 +.52
.37 0x25 b'0010 0101' 25 +.37 .53 0x35 b'0011 0101' 35 +.53
.38 0x26 b'0010 0110' 26 +.38 .54 0x36 b'0011 0110' 36 +.54
.39 0x27 b'0010 0111' 27 +.39 .55 0x37 b'0011 0111' 37 +.55
.40 0x28 b'0010 1000' 28 +.40 .56 0x38 b'0011 1000' 38 +.56
.41 0x29 b'0010 1001' 29 +.41 .57 0x39 b'0011 1001' 39 +.57
.42 0x2A b'0010 1010' 2x +.42 .58 0x3A b'0011 1010' 3x +.58
.43 0x2B b'0010 1011' 2x +.43 .59 0x3B b'0011 1011' 3x +.59
.44 0x2C b'0010 1100' 2x +.44 .60 0x3C b'0011 1100' 3x +.60
.45 0x2D b'0010 1101' 2x +.45 .61 0x3D b'0011 1101' 3x +.61
.46 0x2E b'0010 1110' 2x +.46 .62 0x3E b'0011 1110' 3x +.62
.47 0x2F b'0010 1111' 2x +.47 .63 0x3F b'0011 1111' 3x +.63
202
Dec Hex Bin BCD Ozn Dec Hex Bin BCD Ozn
.64 0x40 b'0100 0000' 40 +.64 .80 0x50 b'0101 0000' 50 +.80
.65 0x41 b'0100 0001' 41 +.65 .81 0x51 b'0101 0001' 51 +.81
.66 0x42 b'0100 0010' 42 +.66 .82 0x52 b'0101 0010' 52 +.82
.67 0x43 b'0100 0011' 43 +.67 .83 0x53 b'0101 0011' 53 +.83
.68 0x44 b'0100 0100' 44 +.68 .84 0x54 b'0101 0100' 54 +.84
.69 0x45 b'0100 0101' 45 +.69 .85 0x55 b'0101 0101' 55 +.85
.70 0x46 b'0100 0110' 46 +.70 .86 0x56 b'0101 0110' 56 +.86
.71 0x47 b'0100 0111' 47 +.71 .87 0x57 b'0101 0111' 57 +.87
.72 0x48 b'0100 1000' 48 +.72 .88 0x58 b'0101 1000' 58 +.88
.73 0x49 b'0100 1001' 49 +.73 .89 0x59 b'0101 1001' 59 +.89
.74 0x4A b'0100 1010' 4x +.74 .90 0x5A b'0101 1010' 5x +.90
.75 0x4B b'0100 1011' 4x +.75 .91 0x5B b'0101 1011' 5x +.91
.76 0x4C b'0100 1100' 4x +.76 .92 0x5C b'0101 1100' 5x +.92
.77 0x4D b'0100 1101' 4x +.77 .93 0x5D b'0101 1101' 5x +.93
.78 0x4E b'0100 1110' 4x +.78 .94 0x5E b'0101 1110' 5x +.94
.79 0x4F b'0100 1111' 4x +.79 .95 0x5F b'0101 1111' 5x +.95
Dec Hex Bin BCD Ozn Dec Hex Bin BCD Ozn
.96 0x60 b'0110 0000' 60 +.96 .112 0x70 b'0111 0000' 70 +.112
.97 0x61 b'0110 0001' 61 +.97 .113 0x71 b'0111 0001' 71 +.113
.98 0x62 b'0110 0010' 62 +.98 .114 0x72 b'0111 0010' 72 +.114
.99 0x63 b'0110 0011' 63 +.99 .115 0x73 b'0111 0011' 73 +.115
.100 0x64 b'0110 0100' 64 +.100 .116 0x74 b'0111 0100' 74 +.116
.101 0x65 b'0110 0101' 65 +.101 .117 0x75 b'0111 0101' 75 +.117
.102 0x66 b'0110 0110' 66 +.102 .118 0x76 b'0111 0110' 76 +.118
.103 0x67 b'0110 0111' 67 +.103 .119 0x77 b'0111 0111' 77 +.119
.104 0x68 b'0110 1000' 68 +.104 .120 0x78 b'0111 1000' 78 +.120
.105 0x69 b'0110 1001' 69 +.105 .121 0x79 b'0111 1001' 79 +.121
.106 0x6A b'0110 1010' 6x +.106 .122 0x7A b'0111 1010' 7x +.122
.107 0x6B b'0110 1011' 6x +.107 .123 0x7B b'0111 1011' 7x +.123
.108 0x6C b'0110 1100' 6x +.108 .124 0x7C b'0111 1100' 7x +.124
.109 0x6D b'0110 1101' 6x +.109 .125 0x7D b'0111 1101' 7x +.125
.110 0x6E b'0110 1110' 6x +.110 .126 0x7E b'0111 1110' 7x +.126
.111 0x6F b'0110 1111' 6x +.111 .127 0x7F b'0111 1111' 7x +.127
203
Dec Hex Bin BCD Ozn Dec Hex Bin BCD Ozn
.128 0x80 b'1000 0000' 80 -.1 .144 0x90 b'1001 0000' 90 -.17
.129 0x81 b'1000 0001' 81 -.2 .145 0x91 b'1001 0001' 91 -.18
.130 0x82 b'1000 0010' 82 -.3 .146 0x92 b'1001 0010' 92 -.19
.131 0x83 b'1000 0011' 83 -.4 .147 0x93 b'1001 0011' 93 -.20
.132 0x84 b'1000 0100' 84 -.5 .148 0x94 b'1001 0100' 94 -.21
.133 0x85 b'1000 0101' 85 -.6 .149 0x95 b'1001 0101' 95 -.22
.134 0x86 b'1000 0110' 86 -.7 .150 0x96 b'1001 0110' 96 -.23
.135 0x87 b'1000 0111' 87 -.8 .151 0x97 b'1001 0111' 97 -.24
.136 0x88 b'1000 1000' 88 -.9 .152 0x98 b'1001 1000' 98 -.25
.137 0x89 b'1000 1001' 89 -.10 .153 0x99 b'1001 1001' 99 -.26
.138 0x8A b'1000 1010' 8x -.11 .154 0x9A b'1001 1010' 9x -.27
.139 0x8B b'1000 1011' 8x -.12 .155 0x9B b'1001 1011' 9x -.28
.140 0x8C b'1000 1100' 8x -.13 .156 0x9C b'1001 1100' 9x -.29
.141 0x8D b'1000 1101' 8x -.14 .157 0x9D b'1001 1101' 9x -.30
.142 0x8E b'1000 1110' 8x -.15 .158 0x9E b'1001 1110' 9x -.31
.143 0x8F b'1000 1111' 8x -.16 .159 0x9F b'1001 1111' 9x -.32
Dec Hex Bin BCD Ozn Dec Hex Bin BCD Ozn
.160 0xA0 b'1010 0000' x0 -.33 .176 0xB0 b'1011 0000' x0 -.49
.161 0xA1 b'1010 0001' x1 -.34 .177 0xB1 b'1011 0001' x1 -.50
.162 0xA2 b'1010 0010' x2 -.35 .178 0xB2 b'1011 0010' x2 -.51
.163 0xA3 b'1010 0011' x3 -.36 .179 0xB3 b'1011 0011' x3 -.52
.164 0xA4 b'1010 0100' x4 -.37 .180 0xB4 b'1011 0100' x4 -.53
.165 0xA5 b'1010 0101' x5 -.38 .181 0xB5 b'1011 0101' x5 -.54
.166 0xA6 b'1010 0110' x6 -.39 .182 0xB6 b'1011 0110' x6 -.55
.167 0xA7 b'1010 0111' x7 -.40 .183 0xB7 b'1011 0111' x7 -.56
.168 0xA8 b'1010 1000' x8 -.41 .184 0xB8 b'1011 1000' x8 -.57
.169 0xA9 b'1010 1001' x9 -.42 .185 0xB9 b'1011 1001' x9 -.58
.170 0xAA b'1010 1010' xx -.43 .186 0xBA b'1011 1010' xx -.59
.171 0xAB b'1010 1011' xx -.44 .187 0xBB b'1011 1011' xx -.60
.172 0xAC b'1010 1100' xx -.45 .188 0xBC b'1011 1100' xx -.61
.173 0xAD b'1010 1101' xx -.46 .189 0xBD b'1011 1101' xx -.62
.174 0xAE b'1010 1110' xx -.47 .190 0xBE b'1011 1110' xx -.63
.175 0x2F b'1010 1111' xx -.48 .191 0xBF b'1011 1111' xx -.64
204
Dec Hex Bin BCD Ozn Dec Hex Bin BCD Ozn
.192 0xC0 b'1100 0000' x0 -.65 .208 0xD0 b'1101 0000' x0 -.81
.193 0xC1 b'1100 0001' x1 -.66 .209 0xD1 b'1101 0001' x1 -.82
.194 0xC2 b'1100 0010' x2 -.67 .210 0xD2 b'1101 0010' x2 -.83
.195 0xC3 b'1100 0011' x3 -.68 .211 0xD3 b'1101 0011' x3 -.84
.196 0xC4 b'1100 0100' x4 -.69 .212 0xD4 b'1101 0100' x4 -.85
.197 0xC5 b'1100 0101' x5 -.70 .213 0xD5 b'1101 0101' x5 -.86
.198 0xC6 b'1100 0110' x6 -.71 .214 0xD6 b'1101 0110' x6 -.87
.199 0xC7 b'1100 0111' x7 -.72 .215 0xD7 b'1101 0111' x7 -.88
.200 0xC8 b'1100 1010' x8 -.73 .216 0xD8 b'1101 1000' x8 -.89
.201 0xC9 b'1100 1001' x9 -.74 .217 0xD9 b'1101 1001' x9 -.90
.202 0xCA b'1100 1010' xx -.75 .218 0xDA b'1101 1010' xx -.91
.203 0xCB b'1100 1011' xx -.76 .219 0xDB b'1101 1011' xx -.92
.204 0xCC b'1100 1100' xx -.77 .220 0xDC b'1101 1100' xx -.93
.205 0xCD b'1100 1101' xx -.78 .221 0xDD b'1101 1101' xx -.94
.206 0xCE b'1100 1110' xx -.79 .222 0xDE b'1101 1110' xx -.95
.207 0xCF b'1100 1111' xx -.80 .223 0xDF b'1101 1111' xx -.96
Dec Hex Bin BCD Ozn Dec Hex Bin BCD Ozn
.224 0xE0 b'1110 0000' x0 -.97 .240 0xF0 b'1111 0000' x0 -.113
.225 0xE1 b'1110 0001' x1 -.98 .241 0xF1 b'1111 0001' x1 -.114
.226 0xE2 b'1110 0010' x2 -.99 .242 0xF2 b'1111 0010' x2 -.115
.227 0xE3 b'1110 0011' x3 -.100 .243 0xF3 b'1111 0011' x3 -.116
.228 0xE4 b'1110 0100' x4 -.101 .244 0xF4 b'1111 0100' x4 -.117
.229 0xE5 b'1110 0101' x5 -.102 .245 0xF5 b'1111 0101' x5 -.118
.230 0xE6 b'1110 0110' x6 -.103 .246 0xF6 b'1111 0110' x6 -.119
.231 0xE7 b'1110 0111' x7 -.104 .247 0xF7 b'1111 0111' x7 -.120
.232 0xE8 b'1110 1000' x8 -.105 .248 0xF8 b'1111 1000' x8 -.121
.233 0xE9 b'1110 1001' x9 -.106 .249 0xF9 b'1111 1001' x9 -.122
.234 0xEA b'1110 1010' xx -.107 .250 0xFA b'1111 1010' xx -.123
.235 0xEB b'1110 1011' xx -.108 .251 0xFB b'1111 1011' xx -.124
.236 0xEC b'1110 1100' xx -.109 .252 0xFC b'1111 1100' xx -.125
.237 0xED b'1110 1101' xx -.110 .253 0xFD b'1111 1111' xx -.126
.238 0xEE b'1110 1110' xx -.111 .254 0xFE b'1111 1110' xx -.127
.239 0xEF b'1110 1111' xx -.112 .255 0xFF b'1111 1111' xx -.128
205
Instrukcija Opis Cik. Kod Flagovi Nap.
Prepis podataka
MOVF f,d Prepiši f u d 1 001000 dfffffff Z 12
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 2
CLRW Upiši 0 u W 1 000001 0xxxxxxx Z
SWAPF f,d Prepiši unakrsno niblove iz f u d 1 001110 dfffffff 12
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 12
DECF f,d Smanji f 1 001011 dfffffff Z 12
IORWF f,d Logičko ILI W sa f 1 000100 dfffffff Z 12
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 12
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 12
XORLW k Logičko ISKLJUČUVO ILI W sa kon. 1 111010 kkkkkkkk Z
COMF f,d Invertuj f 1 001001 dfffffff Z 12
Operacije sa bitovima
BCF f,b Resetuj bit b u f 1 0100bb bfffffff 12
BSF f,b Setuj bit b u f 1 0101bb bfffffff 12
RLF f,d Rotiraj nalevo kroz CARRY 1 001101 dfffffff C 12
RRF f,d Rotiraj nadesno kroz CARRY 1 001100 dfffffff C 12
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 123
DECFSZ f,d Smanji f, preskoči ako je = 0 1 (2) 001011 dfffffff 123
GOTO k Idi na adresu 2 101kkk kkkkkkkk
CALL 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
Legenda:
f – adresa registra
W – W registar
b – adresa bita unutar osmobitnog registra
k – 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 registra
DC – Digit Carry flag STATUS registra
Z – Zero flag STATUS registra
TO – Time out bit STATUS registra
PD – Power down bit STATUS registra
Napomene:
207
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
Molio bih prodavce PIC mikrokontrolera da mi se jave radi objavljivanja njihovih
kontakt podataka (adresa, tel, mob, mail, sajt, baner...) u ovom uputstvu po njegovom
završetku. Zbog zaštite od spama, e-mail će biti prikazan u obliku slike.
209