You are on page 1of 209

PIC16F84

UPUTSTVO ZA RUKOVANJE

Staza za plau 6 kaca na Moravici u Sokobanji 1

1. Predgovor
Zato ba PIC16F84? Taj mikrokontroler je zastareo, veliki, spor, skup... Meutim da li je ba sve tako. Star? Pa ta. Nijedan moj kompjuter nije (u trenutku kupovine) bio mlai od 4 godina. Prvi put sam na internet izaao mainom sa 100MHz i 16Mb. Ukoliko i dalje moe posluiti, godine mu nisu bitne. ak zato ima i jednu prednost: ima ga na svakom oku! Njegova veliina za poetnike moe predstavljati samo pogodnost. Poetniku je daleko lake lemljenje osamnaestopinskog DIP nego ezdesetetvoropinskog TQFP kuita, naravno na jednoslojnoj tampanoj ploici. Brzina mikrokontrolera pri uenju ne igra nikakvu ulogu. tavie, na vie mesta u programima datim u uputstvu namerno se moralo izazivati kanjenje. Cena mikrokontrolera! Jeste skup. Danas se mogu kupiti mnogo moniji mikrokontroleri po manjoj ceni. Ali ukoliko se uzme u obzir i cena odgovarajueg programatora (pogotovu mogunost samogradnje), PIC16F84 je i dalje najjeftiniji mikrokontroler. Poetniku u svetu mikrokontrolera najtee je napraviti onaj prvi korak. Nadam se da e mu ovo uputstvo e pomoi u tom putu. A posle? Lako e se sa steenim znanjem nauiti i mnogo komplikovaniji i savremeniji mikrokontroleri. Iako se hardverske mogunosti mikrokontrolera neprekidno usavravaju, softver uglavnom ostaje isti. Za lake razumevanje ovog uputstva poeljan je pristup internetu i potrebna su odreena predznanja:

Osnovno poznavanje elektronskih kola (anoda i katoda LED, povezivanje LED displeja, funkcija taster prekidaa, obeleavanje izvoda integrisanih kola, pojam pina, funkcija diode u logikim kolima, naponski nivoi logike 0 i 1, visokoimpedansno stanje, mitov okida) Osnovno poznavanje binarnih sistema (bit, bajt, binarno, decimalno, heksadecimalno, BCD i oznaavanje negativnih brojeva) Osnovne logike operacije (Bulova algebra) Pojam multipleksa Princip serijskog prenosa podataka

Nemojte dozvoliti da Vas ovaj spisak obeshrabri. Veliki deo ovoga je objanjen u uputstvu. Gradivo u uputstvu izloeno je od poznatih ka nepoznatim i od lakih ka teim lekcijama. Za dosta specifinosti dati su primeri programa u kojima se upotrebljavaju. Trudio sam se da gradivo to interesantnije izloim. Nadam se da sam uspeo. 2

2. Dobar stil programiranja


Pre nego to uete u finese programiranja, mislim da bi trebalo objasniti stilove programiranja.

Ukoliko stavite ; (taku-zarez) bilo gde u Vaem programu, kompajler e ignorisati sve karaktere iza njega sve dok ne doe do znaka za novi red. Ovo znai da moete staviti komentar unutar programa kako bi Vas podsetio ta se uopte u njemu radi. Ovo je dobra praksa, ak i za najjednostavnije programe. Moda sada u potpunosti razumete ta program radi, ali za par meseci, samo ete se ekati po glavi. Zbog toga, komentariite to vie. Nema ogranienja. Moete pridruiti imena konstantama i registrima (vie o ovome kasnije). Dosta je lake itati na srpskom u ta upisujete, ili ta oznaava broj, nego da pokuavate da se setite ta znae svi ti brojevi. Zbog toga, koristite opisna imena kao npr. ZBIR. Primetili ste da sam napisao ime velikim slovima. Ono se tako istie. Napravite zaglavlje programa koristei taku-zarez. Primer je dat ispod. ;********************************************************* ; Autor : Pera dera Datum : 12.4.2008. ; Verzija : 0.5 Naslov : Test ; ; Opis hardvera : ; - RC oscilator 200KHz. ; - Svi tasteri su povezani od pinova ka masi. ; T1 na RB0, T2 na RB1. Ukljueni 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 ;********************************************************* Uoili ste da je napravljena neka vrsta kocke. Ovako izgleda preglednije.

Izdvojite instrukcije od poetka reda i labela sa par razmaka ili Tab dugmetom. Na taj nain asembler prepoznaje da li je re o instrukciji ili labeli, a program izgleda preglednije. Najzad, isprobajte i dokumentujte Va program i na papiru. Moete koristiti grafike, algoritme ili ta god elite. To e vam pomoi u pisanju programa, korak po korak, kao i u njegovoj kasnijoj analizi.

A sada prelazimo na pravu stvar. 3

3. Registri
Registar je RAM memorijska lokacija unutar mikrokontrolera u koju se moe upisivati, sa koje se moe itati, ili obavljati obe ove funkcije. Najlake je da svaki od njih zamislite kao kutiju u koju moe stati do 255 klikera (razliitih stanja). Sledea skica prikazuje raspored registara unutar PIC16F84 mikrokontrolera. Slika prikazuje adrese na kojima je smetema RAM memorija (u obliku osmobitnih registara) unutar mikrokontrolera, to e Vam pomoi pri razumevanju njihovog adresiranja. Adresa 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C . . . . . 0x4F 0x50 . . . 0x7F / / 68 Registra opte namene (statika RAM memorija) Mapirani u BANK0 BANK0 INDF(1) TMR0 PCL STATUS FSR PORTA PORTB / EEDATA EEADR PCLATH INTCON BANK1 INDF(1) OPTION_REG PCL STATUS FSR TRISA TRISB / EECON1 EECON2
(1)

Adresa 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B 0x8C . . . . . 0xCF 0xD0 . . . 0xFF

PCLATH INTCON

(1)

/ - Neimplementovana memorijska lokacija (ita se kao 0) - Nije fiziki registar 4

Primeujete da su registri podeljeni u dve grupe, oznaene sa BANK0 i BANK1. BANK1 se uglavnom koristi za konfigurisanje trenutnog hardverskog stanja mikrokontrolera. Uglavnom mu je (za jednostavnije programe) dovoljno pristupiti samo prilikom poetne inicijalizacije mikrokontrolera. Kako se najbitniji registri (PORTA i PORTB) nalaze u BANK0, program e uglavnom biti u njoj. Sledeu specifinost predstavljaju prvih 12 registara u bankama (0x00 0x0B). Njima se direktno upravlja radom mikrokontrolera to ih ini povlaenim (eng. Special Function Registers - registri specijalne namene), dok je obina RAM memorija (eng. General Purpose Registers - registri opte namene) dostupna u registrima od 0x0C do 0x4F, a istovremeno joj se moe pristupiti i preko 0x8C do 0xCF adresa. Sigurno ste ve videli rampe za prolaznike po supermarketima ili autobuskim stanicama. One proputaju prolaznike samo u jednom smeru. Unutar mikrokontrolera TRIS (TRISA i TRISB) registri izvravaju ovu funkciju. Oni se nalaze na adresama 0x85 i 0x86, respektivno. Da biste programirali eljeni pin tako da bude ulazni ili izlazni (proputa prolaznike unutra ili napolje), poaljete 1 ili 0 na njegov bit u odgovarajuem TRIS registru. Pri tome moete koristiti bilo koji (binarni, decimalni ili heksadecimalni) format brojeva, meutim binarnim se slikovitije predstavlja stanje eljenog pina. Ukoliko niste vini pretvaranju binarnih u decimalne ili heksadecimalne brojeve i obratno, koristite bilo koji napredniji kalkulator. Svi RA (RA0 do RA4) i RB (RB0 do RB7) pinovi mikrokontrolera imaju dvojaku fuknciju. Oni mogu biti ulazni ili izlazni. Da li e biti ulazni ili izlazni podeava se u odgovarajuem TRIS registru. Na primer ukoliko se u TRISB nalazi sledea binarna vrednost: b'00101111' pinovi e biti konfigurisani kao na slici. Primeujete da bit 7 (eng. MSB Most Single Bit - bit najvee teine ) odgovara pinu RB7 i da se on prilikom binarnog oznaavanja nalazi sa leve strane. Nasuprot njemu bit 0, bit najmanje teine (eng LSB Low Single Bit) odgovara pinu RB0. Potpuno ista situacija je i sa TRISA registrom, sa tom razlikom to su njemu gornji bitovi neiskorieni (jer nemaju pripadajuih pinova). Na gornjoj slici pinovi su konfigurisani po sledeem: pin RB7 RB6 6 0 I RB5 5 1 U RB4 4 0 I RB3 3 1 U RB2 2 1 U RB1 1 1 U RB0 0(LSB) 1 U

bit broj (MSB)7 stanje Ulaz / Izlaz 0 I

Kako se TRISB nalazi u banci 1 (BANK1) potrebno je prebaciti se tamo. Da bi se prebacili iz banke u banku koristi se bit 5 STATUS registra. Za prebacivanje iz banke 0 u banku 1 potrebno ga je setovati, a za vraanje u banku 0, resetovati. STATUS registar se nalazi na adresi 0x03 (0x03 ili h'03' oznaava brojeve u heksadecimalnom formatu. Binarni format se pie kao b'00000011', a decimalni kao .03 ili d'03'). 5

emu konfigurisanje pinova? Ukoliko je odgovarajui 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 logika 0, a napon od +5V kao logika 1. Ukoliko je pak pin konfigurisan kao ulazni, mikrokontroler e u svakom trenutku moi da oita gore pomenute vrednosti napona na pinu, i u zavisnosti od logikog nivoa na pinu preduzme odgovarajuu akciju. Pinove koji se ne upotrebljavaju u elektrinoj emi potrebno je konfigurisati kao izlazne. U protivnom varijacije napona na njima prouzrokuju poveanu potronju i grejanje mikrokontrolera, a eventualno i njegovu neispravnost. Da biste postavili jedan od izlaznih pinova na visoki logiki nivo, jednostavno treba poslati 1 na njemu odgovarajui bit u PORTA ili PORTB registru. Format zapisa je isti kao i za TRIS registre. Slino tome, da biste proitali da li se neki pin (ranije konfigurisan kao ulazni) nalazi na logikoj 0 ili 1, treba da proverite da li je odgovarajui bit u PORTA ili PORTB registru u setovanom ili resetovanom stanju. Pre nego to prouite primer asemblerskog kda, treba objasniti funkciju jo jednog registra: W. W (eng. Working - radni) registar je registar opte namene u koji moete smestiti bilo koju brojanu vrednost (u opsegu od .0 do .255) sa kojom elite raditi. Nakon to ste pridruili odreenu vrednost registru W, moete mu pridruiti neku drugu vrednost (oprez time biste automatski obrisali prethodnu) ili zapamenu 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) oznaena adresa jednog od registra iz tabele sa poetka ovog poglavlja, k oznaava konstantnu vrednost, b je redni broj bita u registru a d oznaava odredite (eng. destination) rezultata operacije. Ilustrovaemo sve do sada naueno. Nemojte jo uvek isprobavati ni kompajlirati kd - to ete uraditi kada doete do prvog celovitog programa. Za sada pokuajte da prepoznate nain na koji se konfiguriu portovi, i pripremite se da nauite par asemblerskih instrukcija. Za pisanje kda moete koristriti bilo koji tekst editor koji snima ist .txt fajl bez ikakvih formatiranja. Na primer odlian Notepad++ (ugradio sam mu prepoznavanje i naglaavanje asemblerskih instrukcija), Code Edit Pro (sam naglaava instrukcije), Windowsov Notepad ili Linuxov Leafpad. U jednom od narednih poglavlja, upoznaete se sa MPLAB razvojnim okruenjem, i njegovim editorom. Najpre je potrebno prebaciti program iz banke 0 u banku 1. Ovo se radi setujui bit 5 STATUS registra, ija je adresa 0x03. bsf 0x03,5 BSF f,b znai 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 oznaava redni broj bita u STATUS registru. Dakle ovim je reeno setuj bit 5 na adresi 0x03. 6

Sada se, dakle, program nalazi u banci 1. movlw b'00101111' Ovom instrukcijom smeta 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 znai ubaci vrednost koja sledi direktno u registar W (eng. Move Literal to W). Sada treba premestiti ovu vrednost u TRISB registar, da bi se konfigurisali pinovi PORTB registra. movwf 0x86 Instrukcija MOVWF f znai: premesti vrednost registra W u f registar (eng. Move W to f). U ovom sluaju adresa f je adresa registra TRISB (vidite u tabeli). Bitno je primetiti da ovo nije premetanje u svom bukvalnom znaenju, jer je W registar nakon instrukcije ostao nepromenjen. Pre bi joj odgovarao prevod kopiraj (eng. copy). TRISB registar sada sadri eljenu vrednost, ime su konfigurisani ulazno/izlazni (skraeno U/I) pinovi. Sada je potrebno prebaciti program u banku 0, kako bi se dalje moglo manipulisati signalima na U/I pinovima. bcf 0x03,5 Ova instrukcija je suprotna od BSF. BCF f,b znai resetuj bit b u registru f (eng. Bit Clear f). Brojevi koji slede su adresa registra (f), u ovom sluaju STATUS registra i broj bita (b), u ovom sluaju bit 5. Dakle ovim je u stvari resetovan bit 5 STATUS registra. Posledica poslednje instrukcije je da se program ponovo nalazi u BANK0. Primeujete da je adresa STATUS registra ista, iako bi u BANK1 trebala biti 0x83. Nemoj da vas to buni. Svim registrima u BANK1 moe 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 zajedniki za obe banke, ovo je potpuno svejedno. Ceo prethodni kd zapisan u jednom bloku izgleda ovako: bsf movlw movwf bcf 0x03,5 b'00101111' 0x86 0x03,5 ; Idi u BANK1 ; Stavi b'00101111' u W ; Prebaci b'00101111' u TRISB ; Vrati se u BANK0

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. Prouite prethodni primer nekoliko puta, sve dok ne budete u stanju da ga u potpunosti razumete. Za sada ste nauili 4 instrukcije. Jo samo 31! 7

4. Izlazi
U prethodnom poglavlju ste nauili kako da konfiguriete U/I pinove porta tako da budu ulazni ili izlazni. U ovom poglavlju ete nauiti kako da poaljete odgovarajui logiki nivo na portove. U primeru koji sledi cilj e Vam biti da omoguite 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: bsf movlw movwf bcf 0x03,5 ; Idi u banku 1 b'00000000' ; Stavi 00000 u W 0x85 ; Prebaci 00000 u TRISA svi pinovi su izlazni 0x03,5 ; Vrati se u BANK0

Ovo bi trebalo da Vam bude poznato iz prethodnog primera. Jedina razlika je u tome to ste sada podesili sve pinove PORTA registra kao izlazne, aljui 0x00 u TRISA registar. Zatim treba ukljuiti LED. Zato treba na jedan od pinova (onaj na kome je povezana LED) poslati logiku 1. Evo kako se to radi. (Obratite panju na komentare kda): movlw movwf b'00000100' ; Upii .4 u W registar.

0x05 ; Prebaci sadraj iz W (.4) u PORTA, ija adresa je ; 0x05. To postavlja logiku 1 samo na pinu RA2.

; Poto je LED ukljuena, treba je iskljuiti. movlw movwf b'00000000' ; Upii .0 u W registar.

0x05 ; Prebaci sadraj iz W (.0) u PORTA, ija adresa je 0x05

Ovim ste postigli da jednom ukljuite, i zatim iskljuite LED. Ono to elite da postignete jeste da LED neprekidno treperi. To se moe implementirati vraajui izvrenje programa na poetak. Postavite labelu (oznaku) na poetak programa, i zatim recite programu da nastavi svoje izvravanje sa tako oznaene pozicije. Labela se postavlja veoma jednostavno: upiite ime, recimo Poc, i zatim prepiite sledei kd: Poc movlw movwf b'00000100' ; Upii .4 u W registar.

0x05 ; Prebaci sadraj iz W (.4) u PORTA, ija adresa je ; 0x05. To postavlja logiku 1 samo na pinu RA2.

; Poto je LED ukljuena, treba je iskljuiti. movlw movwf goto b'00000000' ; Upii .0 u W registar.

0x05 ; Prebaci sadraj iz W (.0) u PORTA, ija adresa je 0x05 ; To postavlja logiku 0 na sve pinove (RA0 do RA4) Poc ; Nastavi dalje izvravanje programa od labele Poc

Kao to primeujete, najpre je ispred instrukcije na poetku reda stavljena labela Poc. Na samom kraju programa je goto Poc instrukcijom nastavljeno dalje izvravanje programa od labele. Instrukcija GOTO k znai idi na (eng. Go-idi, Tona) adresu (k) ili labelu. Program e sada neprekidno ukljuivati i iskljuivati LED od trenutka dovoenja napona napajanja, a prestae po njegovom nestanku. Pogledajte jo jednom isti program: bsf movlw movwf bcf movlw movwf movlw movwf goto 0x03,5 b'00000000' 0x85 0x03,5 b'00000100' 0x05 b'00000000' 0x05 Poc

Poc

Komentari su namerno izostavljeni i sve to moete videti jesu nizovi instrukcija i brojeva. Ovo moe da bude krajnje zbunjujue ukoliko kasnije pokuavate da ispravite eventualno otkrivenu greku u programu, ali ve i tokom prvobitnog pisanja programa, kada treba zapamtiti sve te pojedinane adrese. ak i kada biste dodali komentare, program bi i dalje delovao nejasno. Zbog toga treba svim brojevima dati imena. Ovo moe da se uradi naredbom equ, koja jednostavno znai jednako neemu drugom (eng. Equal jednak). Vano je da primetite da ovo nije instrukcija za PIC ve tzv. direktiva koja ima uticaj na sam asembler (vie o njemu kasnije). Program koji sadri equ direktivu e, dakle, nakon asembliranja u mainski kd PIC-a, biti identian programu bez equ direktive. Ovom direktivom samo zamenjujete eljeni broj imenom. Postupite ovako: izbacite sve komentare ali imenujte registre u Vaem programu, a zatim ocenite itljivost takvog programa. STATUS TRISA equ equ 0x03 ; Ovo pridruuje naziv STATUS broju 0x03, koji ; predstavlja adresu STATUS registra 0x85 ; Ovo pridruuje naziv TRISA broju 0x85, koji ; predstavlja adresu TRISA registra

PORTA RP0

equ equ

0x05 ; Ovo pridruuje naziv PORTA broju 0x05, koji ; predstavlja adresu PORTA registra 0x05 ; Ovo pridruuje 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 definiite na poetku svakog programa. Nakon imenovanja registara, unesite njihova imena i u aktivni deo programa. Ukoliko sada prepiete program bez komentara, ali sa imenovanim registrima, moi ete da uporedite preglednost i itljivost takvog listinga sa prethodnim: STATUS TRISA PORTA RP0 equ equ equ equ 0x03 0x85 0x05 0x05 STATUS,RP0 b'00000000' TRISA STATUS,RP0 b'00000100' PORTA b'00000000' PORTA Poc

Poc

bsf movlw movwf bcf movlw movwf movlw movwf goto

Sigurno ste primetili da imenovani registri ine praenje programa znatno lakim, ak i bez ikakvih komentara. Takoe moete primetiti da se imenovani registri razlikuju od labele po tome to su im sva slova velika. Na taj nain ne moete doi u situaciju da kasnije razmiljate da li je neka takva oznaka labela ili imenovani registar. Moda vam deluje udno to PORTA registar i RP0 bit STATUS registra imaju istu vrednost (0x05). Meutim, razlika je oigledna. PORTA predstavlja adresu registra, a RP0 bit 5 STATUS registra. Asembler ne pravi razliku izmeu njih jer im je vrednost ista (ak se mogu i zameniti), ali vodi rauna o njihovom redosledu unutar instrukcije. Takoe moete videti da su instrukcije odvojene od poetka reda. To je obavezno, da ih asembler ne bi preveo kao labele.

10

5. Prazne petlje
U prethodnom programu postoji mala greka. Skoro svaka instrukcija zahteva jedan instrukcijki ciklus da bi se izvrila. Instrukcijski ciklus je 4 puta vei od takta oscilatora. Ukoliko kao oscilator za takt za PIC16F84 koristite kvarcni kristal od 4MHz trajanje svake instrukcije e biti 4MHz/4ciklusa, ili 1S. Kako se koristi samo 5 instrukcija, LED e se ukljuiti i iskljuiti u samo 6S. Zbog ega 6 a ne 5? Zbog toga to instrukcije koje menjaju stanje programskog brojaa (eng. Program Counter vie o njemu kasnije) poput GOTO za svoje izvrenje troe 2 instrukcijska ciklusa. Kako je to treptanje previe brzo da biste ga uopte mogli primetiti, zbog sporosti oka delovae Vam kao da LED svetli konstantno, ali sa pola snage. Dakle potrebno je napraviti adekvatno kanjenje izmeu trenutka ukljuenja i iskljuenja LED. Uobiajeni princip po kome se implementira kanjenje jeste da mikrokontroleru zadate da odbrojava od prethodno postavljenog broja do nule, i da u trenutku dostizanja nule prekine odbrojavanje. Nulta vrednost, dakle, predstavlja kraj i izlazak iz petlje, nakon ega PIC nastavlja sa izvravanjem daljeg programa. Najpre treba definisati konstantnu vrednost koja e predstavljati inicijalnu vrednost brojaa. Nazovite je BROJAC. Zatim treba odluiti kolika e biti stvarna vrednost ovog broja. Najvei broj koji se moe zadati je d'255' odnosno 0xFF. Meutim, kao to je napomenuto u prethodnom poglavlju, naredba equ pridruuje imena obinim brojevima, ne pravei razliku izmeu adresa registra i bitova. Zato ete, ukoliko probate njom pridruiti vrednost 0xFF, dobiti greku pri kompajliranju programa. Ovo se deava jer memorijska adresa 0xFF nije implementovana u PIC16F84, i zbog toga joj ne moete pristupiti. Pa kako onda pridruiti eljeni broj? Za to je potrebno da sa strane sagledate situaciju. Ukoliko imenu BROJAC pridruite, na primer adresu 0x0C, ona e ukazivati na adresu registra opte namene (RAM memoriju koju moete slobodno koristiti). Prilikom dobijanja napona napajanja, svi neiskorieni registri u mikrokontroleru (osim registara specijalne namene) postavljaju se na vrednost 0xFF. Zato e BROJAC imati vrednost 0xFF. Ali, kako onda podesiti BROJAC na drugu vrednost? Sve to trebate uraditi je da ubacite eljenu vrednost u taj registar. Na primer, ukoliko elite da BROJAC sadri vrednost 0x85, ne moete napisati BROJAC equ 0x85, jer e onda BROJAC sadrati adresu TRISA registra. Zato trebate uraditi sledee: movlw movwf 0x85 0x0C ; Najpre stavite broj 0x85 u W registar, ; a onda ga prebacite u 0x0C registar

Sada moete slobodno napisati BROJAC equ 0x0C. Vrednost unutar imenovanog registra BROJAC koji se nalazi na adresi 0x0C e biti 0x85. Korienje neinicijalizovanih (0xFF) vrednosti moe dovesti do zabune prilikom kasnije analize programa. Verovatno ete se pitati kako ste mogli smanjiti vrednost u registru bez njegove prethodne inicijalizacije. U primerima u ovom uputstvu one su koriene iskljuivo zbog tednje prostora. Ukoliko ih Vi budete koristili u svojim programima obavezno to naglasite odgovarajuim komentarima. 11

Znai, najpre je potrebno imenovati registar: BROJAC equ 0x0C

Dalje se treba smanjivati vrednost registra BROJAC sve dok ne dostigne vrednost 0x00. Unutar PIC postoji instrukcija kojom se moe ovo uraditi, uz malu pomo instrukcije goto i labele. Ta instrukcija ima sledei oblik: decfsz BROJAC,1

Instrukcija DECFSZ f,d (eng. Decrement f, Skip if zero) znai Smanji vrednost registra f (u ovom sluaju 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 preskoi sledeu instrukciju. Kako se odredite rezultata koristi u dosta instrukcija, a kao to ste ve nauili lake je pamtiti imena umesto brojeva, mogue je i bitu odredita dati ime, na sledei nain: W F equ .0 equ .1

Mnogo rei, za jednu instrukciju. Pogledajte njenu primenu u praksi. BROJAC Pet equ 0x0C decfsz BROJAC,F goto Pet Nastavi odavde

Ovde je najpre (inicijalno) postavljena konstanta BROJAC na 0xFF. U sledeem redu definisana je labela nazvana Pet, i zadana je decfsz instrukcija. Decfsz BROJAC,F smanjuje vrednost registra BROJAC za 1, i rezultat vraa u registar BROJAC. Ona istovremeno proverava da li je nova vrednost registra BROJAC jednaka 0. Ukoliko nije, program se nastavlja od sledee linije. U sledeoj liniji imamo instrukciju goto, koja vraa izvrenje programa na decfsz instrukciju. To se ponavlja sve dok vrednost registra BROJAC ne bude jednaka nuli. Onda program preskae sledeu instrukciju (u ovom primeru goto) i nastavlja od mesta gde je napisano Nastavi odavde. Kao to vidite, ovim se program vrti u jednom mestu tano odreeno vreme (kao brojanje u murkama), pre nego to nastavi dalje. To se naziva prazna petlja. Kako bi se jednom petljom postiglo maksimalno kanjenje od 3S * 256 = 768S, bie Vam potrebne bar dve petlje (jedna unutar druge) ukupnog kanjenja od 3S * 256 * 256 = 0,2S da biste mogli primetiti kako LED treperi. U prolom poglavlju to nije naglaeno, ali svakom programu potrebno je definisati poetak (adresu unutar PIC16F84 sa koje poinje snimanje kda) i kraj (posle koga nema vie instrukcija). Poetak programa se definie sledeom direktivom ORG 0x00 Sada ubacite ove petlje u program, i dovrite ga pravei pravi program sa komentarima: 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 odredita rezultata instrukcije ; ****** Podeavanje porta ****** org 0x00 bsf STATUS,RP0 movlw b'00000000' movwf TRISA movwf TRISB bcf STATUS,RP0 ; ****** Ukljui LED ****** Poc movlw movwf b'00000100' ; Ukljuuje LED stavljajui vrednost PORTA ; b'00000100' u W, a zatim i u PORTA

; Prebacuje program u banku 1 ; Postavlja sve pinove ; kao izlazne ; ; Vraa program u banku 0

; ****** Prva petlja aktivna pri ukljuenoj LED oko 0,2S ****** Pet1 decfsz goto decfsz goto BROJAC1,F Pet1 BROJAC2,F Pet1 ; Smanji BROJAC1 za 1 ; Ukoliko je BROJAC1 jednak 0, nastavi dalje ; Smanji BROJAC2 za 1 ; Ukoliko je BROJAC2 jednak 0, nastavi dalje, ; u suprotnom vrati se na poetak petlje. ; Ovaj broja broji nadole od 255 do 0, 255 puta ; To je tzv. petlja unutar petlje.

; ****** Kanjenje zavreno. Sada iskljui LED ****** movlw movwf b'00000000' ; Iskljui LED stavljajui 0 u W registar, PORTA ; a zatim u PORTA

; ****** Druga petlja aktivna pri iskljuenoj LED oko 0,2S ****** Pet2 decfsz goto decfsz goto BROJAC1,F Pet2 BROJAC2,F Pet2 ; Druga petlja dri LED iskljuenom ; dovoljno dugo da bi se to moglo primetiti ; ;

; ****** Sada se program vraa na poetak ****** goto Poc ; Vraanje na poetak programa ; ****** Kraj programa ****** end ; Direktiva za oznaavanje kraja programa. 13

Naravno, eleete da isprobate program da bi videli da li zaista radi. Evo elektrine eme koju trebate napraviti za test ovog programa. Takt mikrokontrolera odreen je upotrebljenim RC oscilatornim kolom (otpornik od 10k i kondenzator od 33pF). Iako za dati primer nije potrebno konfigurisati pinove oba porta, to je poeljno ukoliko su pinovi na PORTB nepovezani. Bolje je utroiti instrukciju vie nego rizikovati nepouzdan rad ili oteenje mikrokontrolera. Isto tako LED je mogue povezati direktno na pin (bez otpornika), poto PIC16F84 ima interno ogranienje izlazne struje na max. 25mA. Meutim to nije poeljno. Cena otpornika je zanemarljiva u odnosu na cenu mikrokontrolera. U praksi se ee sree inverzna logika za povezivanje LED tako to se anoda LED povee na +5V, a katoda (preko otpornika) na pin. Pri tome e LED svetleti po dovoenju logike 0 na pin. Ovo je mogue jer pin pri logikoj 0 moe upijati struju do 25mA, a i poeljno zbog manjeg grejanja i potronje mikrokontrolera. estitamo. Upravo ste napravili svoj prvi program, i napravili kolo kojim se LED ukljuuje i iskljuuje. Za sada ste sledei ova uputstva nauili 7 od ukupno 35 instrukcija, i ve kontroliete ulazno izlazni port. U sledeem poglavlju nauiete kako da svoj kd kompajlirate i snimite u PIC.

14

6. MPLAB Asembler
U ovom poglavlju upoznaete se sa MPLAB razvojnim okruenjem, i specijalnim funkcijama njegovog editora. Sa sajta http://www.microchip.com/ trebate skinuti programski paket MPLAB. On ima integrisan editor (umesto Windows Notepada), asembler, simulator i drajvere za svoje programatore. Na alost nas sa dial-up vezom, sam paket tei oko 65Mb. Funkcija editora bi trebalo da vam je jasna. Generisanje istog .asm fajla. Asembler slui da tekstualne instrukcije iz .asm fajla pretvori u mainski kd koji PIC razume. U protivnom, umesto instrukcije movlw 0x01 trebali bi pisati binarni mainski kd 110000 00000001. Verovatno Vam je ve dosadilo da iznova i iznova piete STATUS equ 0x03 i ostala standardna imena. MPLAB asembler ima mogunost uitavanja fajla koji sadri sva ova imena. Jo bolje, u sebi ima i predefinisane obrasce (eng. standard code template) za upis asemblerskog programa sa zaglavljem, uobiajenim direktivama, posebnim delom za interapte (vie o njima kasnije)... MPLAB ima jedan poznat bag koji se ogleda u nemogunosti rada sa putanjom do foldera duom od 51 karaktera. Zato direktno u C: napravite folder Moji programi. U njega kopirajte sledei fajl: P16f84.inc - sadri sve standardne labele

Ovaj fajl trebalo bi da se nalazi u folderu C:\Program Files\Microchip\MPASM Suite\P16f84.inc Onda u Vaem tekst editoru napravite sledee zaglavlje, ;********************************************************** ; Autor : ; Datum : ; Verzija : ; Naslov : ; ; Opis hardvera : ; Opis softvera : ; Potrebni fajlovi : p16F84.inc ; ;********************************************************** list #include p=16F84 <p16F84.inc> ; Definie upotrebljeni mikrokontroler ; Ubacuje nazive registra u program

15

__CONFIG

_CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. ; Vie o njima kasnije. ; Definie start programa

ORG

0x00

; Prostor za vae programe. end ; Kraj programa

i snimite ga u folder C:\Moji programi sa nazivom Zagl.asm. Unutar foldera C:\Moji programi napravite folder Proba. Ovo zaglavlje moete koristiti za svaki novi program koji pravite, meutim uvek ga moete promeniti, tako da odgovara Vaim specifinim potrebama. Ukoliko zavirite u strukturu p16F84.inc fajla (F3 iz Total Commandera), moete primeriti da su u njemu imenovani svi registri, pa ak i bitovi pojedinih registra. Ukoliko Vam njegova trenutna struktura iz bilo kog razloga ne odgovara, i ovaj fajl moete editovati po sopstvenim potrebama. U tom sluaju uvek ga uvajte zajedno sa .asm programom. Sada ukljuite MPLAB IDE. Ne obazirite se na prozore koje je otvorio, ve sledite sledeu proceduru: Project, Project Wizard, Next, izaberite PIC16F84, Next Izaberite (ukoliko ve nije) Microchip MPASM Toolsuite. Kliknite na MPASM Assebmler (Mpasmwin.exe), i proverite da li se nalazi u folderu C:\Program Files\Microchip\MPASM Suite. Ukoliko ga nema, locirajte ga runo klikom na Browse. Ostala dva fajla Vam (za sada) nisu bitna. Next, Upiite ime projekta (npr. Proba) i izaberite putanju do ranije napravljenog foldera C:\Moji programi\Proba Next, Uite u C:\Moji programi. Kliknite naizmenicno na P16f84.inc, Zagl.asm, i na Add, tako da se oba fajla pojave u desnom prozoru. Kliknite na slova A pored njih dok se ne promene u C (Copy). Na taj nain se odabrani fajlovi kopiraju u trenutni projekat (u folderu Proba), tako da originali ostaju nepromenjeni za idui put. Ostale mogue opcije su U (User) relativna putanja do fajlova, S (System) apsolutna putanja i A (Auto) MPLAB sam odluuje. Next i kliknite na Finish. U novootvorenom prozoru Proba.mcw duplo kliknite na Zagl.asm. Otvara se prozor editora u kome moete pisati Va program. Moda vam ovaj postupak trenutno izgleda komplikovano, ali u praksi je potrebno ponoviti ga 2 do 3 puta da bi postao to to i jeste. Obina rutina.

16

Sa svim ovim podeavanjima 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 omogueno je treptanje LED ; ; Potrebni fajlovi : p16F84.inc ;********************************************************** ; ****** Inicijalizacija asemblera ****** list #include __CONFIG p=16F84 ; Definie upotrebljeni mikrokontroler <p16F84.inc> ; Ubacuje nazive registra u program _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove.

; ****** Imenovanje registra ****** BROJAC1 BROJAC2 equ equ 0x0C ; Prvi broja za praznu petlju. Inicijalno 0xFF 0x0D ; Drugi broja za praznu petlju. Inicijalno 0xFF

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

; ****** Ukljui LED ****** Poc movlw movwf b'00000100' PORTA ; Ukljui LED stavljajui b'00100' ; u W registar, a zatim i u PORTA

; ****** Prve petlja aktivna pri ukljuenoj LED oko 0,2S ****** Pet1 decfsz goto decfsz goto BROJAC1,F Pet1 BROJAC2,F Pet1 ; Smanji BROJAC1 ; Ukoliko je BROJAC1 jednak 0, nastavi dalje ; Smanji BROJAC2 ; Ukoliko je BROJAC2 jednak 0, nastavi dalje, ; u suprotnom vrati se na poetak petlje. ; Ovaj broja broji nadole od 255 do 0, 255 puta ; To je tzv. petlja unutar petlje.

17

; ****** Kanjenje zavreno. Sada iskljui LED ****** movlw movwf b'00000000' PORTA ; Iskljui LED stavljajui 0 u W registar, ; a zatim u PORTA

; ****** Druga petlja aktivna pri iskljuenoj LED oko 0,2S ****** Pet2 decfsz goto decfsz goto BROJAC1,F Pet2 BROJAC2,F Pet2 ; Druga petlja dri LED iskljuenom ; dovoljno dugo da bi se to moglo primetiti ; ;

; ****** Vraanje programa na poetak ****** goto Poc ; Vraanje na poetak programa

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

Kao to ste i sami pretpostavili direktiva #include <p16F84.inc> ubacuje fajl p16F84.inc ispred vaeg asemblerskog programa. Sam asembler e pri konverziji instrukcija u mainski kd uzeti iz fajla nazive samo onih imenovanih registra koji se koriste u programu. Na taj nain program je pregledniji, Vama je skraeno vreme pisanja programa (za imenovanje registra), a program nije nita dui nego inae. Sada moete kompajlirati program. Za kompajliranje pritisnite taster F10 na tastaturi. U novootvorenom prozoru Output videete kratak opis uspenosti operacije. Moete slobodno ignorisati Message [302]. Ona Vas podsea da upotrebljeni registri (npr. TRISA) nisu u BANK0. Ukoliko Vas ova poruka nervira, moete pre prve instrukcije napisati "ERRORLEVEL -302". U Output prozoru najbitnija je zadnja poruka. Ona mora biti BUILD SUCCEEDED. U folderu Proba sada se nalazi par fajlova. Bitni su vam jedino oni sa ekstenzijom .err, .lst i .hex. U fajlu sa .err ekstenzijom, moete videti spisak greaka i upozorenja nastalih pri asembliranju programa. Fajl sa .lst ekstenzijom predstavlja detaljan pregled svih upotrebljenih instrukcija, komentara... Iz njega moete videti u kom trenutku je tano nastupila greka u asembliranju. Fajl sa .hex ekstenzijom predstavlja fajl spreman za snimanje u PIC. Postupak snimanja, nauiete u narednim poglavljima.

18

7. Programatori
Za snimanje .hex fajla u PIC neophodan vam je programator kao hardverski deo i odreeni softver u kompjuteru preko koga se vri programiranje. Nemojte se zaleteti pa odmah kupiti najskuplji Microchipov programator. Funkcija programatora je programiranje PIC mikrokontrolera moda 5-6 puta dnevno. Da li e on biti na USB ili paralelnom portu uopte Vam nije bitno. Ionako ete uglavnom snimati manje od 1KB programa. Jedino bih preporuio izbegavanje programatora sa serijskim portom, zbog nejednakosti njegovih karakteristika na raznim matinim ploama (uglavnom na laptopovima). Ukoliko imate iskustva u pravljenju elektronskih kola, moete napraviti jedan od programatora sa sajta http://www.icprog.com/. Na istom sajtu nalazi se i pripadajui softver za programiranje. Proguglajte malo. Moda naiete i na neto lake. Ukoliko elite kupiti programator, moete pogledati sledee sajtove:

AllPic programator

Oko 15 Oko 100

Programator i razvojni sistem u jednom

I opet pre kupovine pretraite internet. Va novac je u pitanju. Unutar mikrokontrolera nalaze se takozvani konfiguracioni bitovi. Njima se odreuju hardverske specifinosti mikrokontrolera. Iako su inicijalno ubaeni u __CONFIG diirektivu, neki programatori je ignoriu i postupaju po sopstvenim setovanjima. Za PIC16F84 konfiguracioni bitovi su: Watchdog Timer dozvoljava odnosno zabranjuje upotrebu WDT u programu Power Up Timer Enable prouzrokuje kanjenje pri dovoenju napona napajanja da bi se oscilator mikrokontrolera stabilizovao Code Protection onemoguava iitavanje kda iz PIC kopiranje programa Oscillator omoguuje izbor jednog od 4 standardna tipa oscilatora, odnosno RC (eng. Resistor Condensator) 1 otpornik i 1 kondenzator LP (eng. Low Power) Za kristalne oscilatore male potronje 32KHz-200KHz XT Za klasine kristalne oscilatore 100KHz-4MHz HS (eng. High Speed) Za kristalne oscilatore vee brzine 4MHz-10MHz Upotrebu Watchdog Timera nauiete kasnije. Za skoro sve primere u ovom uputstvu, on treba biti iskljuen WDT OFF. Power Up Timer Enable bit je (osim kada imate kvalitetan oscilator i kada vam je potreban brz start mikrokontrolera) preporuljivo ostaviti ukljuenim PWRTE ON. Code Protection je poeljno iskljuiti, kako biste mogli verifikovati program nakon programiranja. Meutim, ukoliko trebate prodati PIC sa Vaim programom na koji ste utroili 3 meseca rada, obavezno ga ukljuite. U ovom uputstvu, neka bude iskljuen CP OFF. 19

Vrste oscilatora nauiete kasnije. Za sada je bitno da znate da ovde koristite RC (Resistor Capacitor) oscilator. Dosta je toga o asembleru i hardveru. Vreme je za uenje novih instrukcija. U sledeem poglavlju nauiete upotrebu potprograma koji e Vam pomoi da program bude manji i jednostavniji.

20

8. Potprogrami
Potprogram je deo kda, ili program, koji moemo pozvati kao takav kad god je potreban. Potprogrami se koriste u sluajevima viestrukog izvravanja jedne iste funkcije, kao na primer rutine sa praznom petljom za kanjenje. Prednosti korienja potprograma su u lakoi menjanja vrednosti brojaa jednom unutar potprograma, nego npr. deset puta kroz glavni program, i u smanjenju koliine memorije koju program zauzima unutar PIC. Pogledajte strukturu jednostavnog potprograma: BROJAC Pet equ 0x0C decfsz goto return ; Uzima inicijalnu vrednost 0xFF BROJAC,F Pet ; Smanjuje i proverava ; sve do 0 ; Povratak iz potprograma

Prvo trebate labelom dati potprogramu ime, i u ovom sluaju izabrano je da to bude Pet. Onda se upisuje kd koji se izvrava u okviru potprograma. U ovom sluaju, to je kanjenje za program sa LED. Na kraju se potprogram zavrava RETURN instrukcijom. Da biste pozvali potprogram iz glavnog programa, jednostavno upiite CALL instrukciju i labelu poetka potprograma. Kada glavni program doe do dela sa instrukcijom CALL k (eng. Call Subroutine) pozovi potprogram, gde je k adresa ili labela potprograma, on skae na mesto na kojem se nalazi potprogram. Tamo nastavlja sa izvravanjem komandi unutar potprograma sve do nailaska na instrukciju RETURN (eng. Return from Subroutine) povratak iz potprograma. Po nailasku na RETURN program nastavlja izvravanje od instrukcije koja se nalazi iza CALL instrukcije. Moete pozvati potprogram koliko god puta elite, i zbog toga se korienjem potprograma smanjuje ukupna duina programa. Ipak postoje dve stvari na koje morate obratiti panju. 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 poetku glavnog programa. Najpraktinije je imenovati ih na poetku programa. Na taj nain ete znati da su su svi na istom mestu. Drugo, morate biti sigurni da e izvravanje glavnog programa zaobii potprogram. Ukoliko stavite potprogram na kraj Vaeg programa i zaboravite da stavite instrukciju goto koja bi nastavila izvravanje dalje od potprograma, program e nastaviti sa izvravanjem i izvriti i potprogram eleli Vi to ili ne. PIC ne pravi razliku izmeu potprograma i glavnog programa. Ovde treba napomenuti i mogunost istovremenog imenovanja vie registara. To se izvodi cblock i endc direktivama. Ukoliko u programu imate dve promenljive, trebate ih pamtiti u dva registra opte namene. Meutim, za vei broj registara, praktinije je definisati ih unutar jednog bloka. Na taj nain mikrokontroler preuzima obavezu odreivanja adresa pojedinanih registara (odreujete mu samo prvu), i poboljavate portabilnost programa za monije serije mikrokontrolera. Oigledno da ovo nije velika uteda pri korienju samo dva registra. Meutim, pri vie registara ovo moe biti od pomoi. 21

Prepravite program za treperenje LED tako da koristi potprogram. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. cblock 0x0C ; Poetak slobodnih registara BROJAC1 ; Prvi broja za petlju. Inicijalno 0xFF BROJAC2 ; Drugi broja za petlju. Inicijalno 0xFF endc ; Kraj bloka registara ; ****** Podeavanje porta ****** org 0x00 bsf STATUS,RP0 movlw b'00000000' movwf TRISA movwf TRISB bcf STATUS,RP0 ; ****** Ukljui LED ****** Poc movlw b'00000100' movwf PORTA ; ****** Dodaj kanjenje ****** call Pet ; ****** Kanjenje zavreno, sada iskljui LED ****** movlw b'00000000' ; Iskljui LED stavljajui b'00000' movwf PORTA ; u W registar, a zatim i u PORTA ; ****** Dodaj jo jedno kanjenje ****** call Pet ; ****** Sada se vrati na poetak programa ****** goto Poc ; ****** Potprogram za kanjenje od oko 0,2S ****** Pet decfsz BROJAC1,F ; Ove dve petlje slue za brojanje nadole od goto Pet ; 255 do 0, 255 puta, omoguavajui da decfsz BROJAC2,F ; se moe primetiti kako LED treperi goto Pet return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa.

; Prebacuje program u BANK1 ; Postavlja sve pinove ; kao izlazne ; Vraa program u BANK0 ; Ukljui LED stavljajui b'00100' ; u W registar, a zatim i u PORTA

Moete videti da je korienjem potprograma smanjena veliina programa. Svaki put kada je potrebno napraviti pauzu, bez obzira svetli li LED ili ne, pozove se potprogram. Na kraju potprograma program se vraa na red iza CALL instrukcije. 22

U primeru se najpre ukljuuje LED. Onda se poziva potprogram. Nakon povratka iz potprograma moe se iskljuiti LED. Opet se poziva potprogram, i po povratku iz njega, izvrava se sledea instrukcija, odnosno goto Poc. Bitno je napomenuti i to da je mogue pozivanje drugog potprograma unutar prvog. Na primer ovo je potpuno mogue: Pocetak Prog1 Prog2 call Prog1 goto Pocetak call Prog2 return return ; Pozivanje prvog potprograma ; Neprekidno vraanje na poetak u mrtvoj petlji ; Pozivanje drugog potprograma ; Povratak iz prvog potprograma ; Povratak iz drugog potprograma

Ovako se moe ii samo do osmog nivoa dubine na ta se mora obratiti panja. Za one koje interesuje, originalan program bio je dug 121 bajtova. Korienjem potprograma, smanjen je na 104 bajta. Ovo moda i ne izgleda mnogo, ali imajte u vidu da memorija PIC16F84 mikrokontrolera iznosi samo 1024 bajta. Svaki bajt je bitan. U sledeem poglavlju nauiete kako da PIC oita spoljne signale.

23

9. Ulazi
Do sada ste samo pisali po portu A da bi se ukljuivala i iskljuivala LED. U ovom poglavlju nauiete upotrebu ulaznih pinova. Na taj nain mogue je na pinove mikrokontrolera povezati spoljno elektronsko kolo, i programirati PIC da razliito reaguje u zavisnosti od spoljnih signala. Kao to Vam je poznato, da bi konfigurisali U/I pinove treba prebaciti program iz banke 0 u banku 1. Najpre to uradite: bsf STATUS,RP0 ; Banka 1

Da bi se konfigurisao odgovarajui pin na portu A kao izlazni, treba poslati 0 na njemu odgovarajue mesto u TRISA registru. Da bi se konfigurisao kao ulazni, treba poslati 1. movlw movwf bcf b'00000001' ; Stavi b'00001' u W, a zatim u TRISA ; TRISA registar. Tako je pin RA0 ulazni. STATUS,RP0 ; Banka 0

Ovim je RA0 pin konfigurisan kao ulazni. Sada je potrebno proveriti da li je na njemu prisutan nivo logike jedinice ili nule. Za ovo se koristi instrukcija BTFSC ili BTFSS. BTFSC f,b (eng. Bit Test f, Skip if Clear) instrukcija znai Testiraj bit b registra f. Ako je bit jednak 0, preskoi sledeu instrukciju. BTFSS f,b (eng. Bit Test f, Skip if Set) znai Testiraj bit b registra f. Ako je bit jednak 1, preskoi sledeu 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 logike 1, moete iskoristiti instrukciju BTFSS ovako: Poetak programa Test btfss PORTA,0 goto Test Nastavi odavde

Program e nastaviti izvravanje od Nastavi odavde samo ukoliko je bit 0 PORTA registra setovan, odnosno ukoliko je na pinu RA0 prisutan nivo logike 1 (+5V). Napiite sada program kojim e LED treptati jednom brzinom, a ukoliko se pritisne prekida, ona e treptati duplo sporije. Moete probati da sami napiete ceo program, da biste videli da li ste shvatili postupak.

24

; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. BROJAC1 equ 0x0C ; Prvi broja petlje. Inicijalno 0xFF BROJAC2 equ 0x0D ; Drugi broja petlje. Inicijalno 0xFF org 0x00 ; ****** Podeavanje porta ****** bsf STATUS,RP0 movlw b'00000001' movwf TRISA movlw b'00000000' movwf TRISB bcf STATUS,RP0 ; ****** Ukljuenje LED ****** Poc movlw b'00000100' movwf PORTA ; Banka 1 ; Stavi b'00001' u TRISA. Tako je pin ; RA0 ulazni, a RA2 izlazni. ; Stavi b'00000000' u TRISB. Tako su ; svi pinovi izlazni. ; Banka 0 ; Ukljui LED stavljajui b'00100' u ; W registar, a zatim i u port A

; ****** Proveri da li je prekida zatvoren ****** btfsc PORTA,0 ; Testiraj stanje bita 0 porta A. Ako je 0 ; preskoi prvu pauzu. Ako je 1 proi kroz call Pet ; obe pauze, kao da se nita ne dogaa ; ****** Dodavanje jo jedne pauze ****** call Pet ; Ova pauza se uvek izvrava

25

; ****** Pauza zavrena. Sada iskljui LED ****** movlw b'00000000' ; Iskljui LED stavljajui b'00000' movwf PORTA ; u W registar, a zatim i u port A ; ****** Proveri da li je prekida i dalje zatvoren ****** btfsc PORTA,0 ; Testiraj stanje RA0 pina. Ako je na logikoj 0 ; preskoi prvu pauzu. Ako je na 1 proi kroz call Pet ; obe pauze, kao da se nita ne dogaa ; ****** Dodavanje jo jedne pauze ****** call Pet ; Ova pauza se uvek izvrava ; ****** Pauza zavrena. Sada se vrati na poetak ****** goto Poc ; Vrati se na poetak ; ****** Potprogram za kanjenje od oko 0,2S ****** Pet decfsz BROJAC1,F ; Ove dve petlje slue za brojanje nadole od goto Pet ; 255 do 0, 255 puta, omoguavajui da decfsz BROJAC2,F ; se moe primetiti da LED treperi goto Pet return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa.

Otpornik od 4k7 obavezan je da bi pin RA0 i pri otvorenom prekidau bio u stabilnom logikom stanju (logika 0). U protivnom, pin bi zbog svoje visoke ulazne impedanse postao previe osetljiv na spoljnje smetnje (npr. grmljavinu), ili bi pak neprestano bio u logikoj 1 bez obzira na stanje prekidaa. U praksi se umesto otpornika prema masi, ee sree otpornik prema naponu napajanja. Vie o potrebi za ovim (pull-up i pull-down) otpornicima nauiete u narednim poglavljima. Program najpre ukljuuje LED. Onda proverava da li je prekida zatvoren. Ukoliko nije (na ulazu je logicka 0), program se izvrava kao da se nita nije desilo, i prolazi kroz oba poziva za potprogram. Ukoliko jeste (na ulazu je nivo logike 1), prvi poziv za potprogram se preskae, pa je pauza u tom sluaju ista kao kod ranije napisanih programa. Isto se deava i nakon to se iskljui LED. Moete kompajlirati i isprobati ovaj program. Ipak da Vas odmah upozorim. Kolo i program nee impresionirati nekog koga ne interesuje programiranje mikrokontrolera. Zato se nemojte uznemiravati kada svojoj porodici i prijateljima pokaete kako moete menjati brzinu treptanja LED prekidaem, a oni za to pokau veoma malo interesovanja. Ukoliko ste iz poetka pratili ova uputstva, onda biste moda voleli da znate da ste do sada nauili 10 od ukupno 35 instrukcija za PIC16F84! Sve su nauene ukljuivanjem i iskljuivanjem LED i testiranjem prekidaa.

26

10. Simulator
Simulacija je proces virtuelnog simuliranja izvravanja instrukcija iako jo nita konkretno nije hardverski napravljeno. Jedan od najpopularnijih (i najjednostavnijih) simulatora je svakako PIC Simulator IDE. U njemu je dovoljno kliknuti na eljeni pin mikrokontrolera da bi se logiko stanje na njemu promenilo. Naalost, moe se koristiti samo 30 dana pre isteka probnog perioda. Jo jedan odlian simulator je Proteus. On prua mogunost integracije mikrokontrolera sa eksternim hardverom. Ni on nije besplatan. Besplatan je jedino Misim, ali nije dovoljno upotrebljiv. MPLAB IDE ima u sebi odlian a besplatan simulator. U ovom poglavlju bie opisane njegove specifinosti. Da biste ukljuili simulator idite na Debugger, Select Tool, MPLAB SIM. U toolbaru e se pojaviti nekoliko novih ikonica. Kliknite na treu (Animate - dve strelice nadesno) i pratite izvravanje programa u prozoru sa .asm fajlom. Vidite kako je doao do petlje i kako neprestano izvrava dve iste instrukcije. Na drugoj ikoni (Halt) pauzirate program. Na prvoj (Run - jedna strelica nadesno) se program izvrava maksimalnom brzinom, ali bez animiranosti njegovog izvravanja. etvrtom ikonom (Step Into) se kada je program u pauziranom stanju vri prelaz na sledeu instrukciju, korak po korak. Petom (Step Over) se maksimalnom brzinom izvrava potprogram ili naredna instrukcija. estom ikonom (Step Out) nasilno se izlazi iz potprograma. Zadnjom ikonom se vri reset programa, i tako njegovo izvravanje moe poeti iz poetka. Registri opte namene pri tome zadravaju svoje vrednosti. Da biste videli aktuelni sadraj registara BROJAC1 i BROJAC2 moete zadrati mi iznad njih, ili ii na View, File Registers. U prozoru koji se otvorio moete 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 laki biti prikaz labela, a ne adresa. Promenite prikaz klikom na Symbolic tab. Donji deo MPLAB prozora prua Vam korisne informacije o trenutnom stanju banke, W registra i pojedinih bitova STATUS registra. Velika slova Z, DC i C pri dnu ekrana oznaavaju da su ti bitovi setovani. Upotrebu ovih bitova nauiete kasnije. Detaljnije praenje promena registara, moete ukljuiti preko View, Watch opcije. Osenite eljeni registar, i prevucite ga u Watch prozor. Desnim klikom preko registra unutar Watch prozora i izborom opcije Properties dobijate mogunost podeavanja eljenog formata brojeva. Za BROJAC1 i BROJAC2 najpregledniji bi bio decimalni format. Duplim klikom na vrednosti pored registara, moete ih nasilno promeniti. Moda vam je animacija brzine izvravanja programa previe spora? Poveajte je na Debugger, Settings, Animation / Realtime Updates pod Animate step time. Umesto 500mS stavite npr. 50. Brzina simuliranja ograniena je brzinom vaeg kompjutera. 27

Ukoliko Vas interesuje realna brzina (eng. Real Time) kojom bi program radio, moete 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 zavri odreeni proces (npr. prazna petlja). MPLAB simulator Vam omoguava da u programu postavite take prekida (eng. Breakpoint) duplim klikom na eljenu instrukciju. Crvena oznaka B pojavljuje se leve strane prozora editora. im simulator naie na taj deo, zaustavie dalju simulaciju to e Vam omoguiti pregled stanja registara ili proraun vremena (preko toperice) potrebnog za izvravanje instrukcija. Upotreba toperice moe biti izuzetno korisna. Na primer da biste tano odredili vreme za koje je LED aktivna, dovoljno je postaviti jednu taku prekida na call instrukciju. Onda se program izvri (Run - bez animiranja) do prve take prekida, i tu se resetuje toperica i klikne na Step Over. Potprogram se izvrava maksimalnom brzinom (bez animiranja) i nakon to se zavri iita 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 mogue mora se definisati odreeni stimulans (eng. Stimulus) po kome e se odvijati promene. eljeni scenario promena definiete 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 odreenog pina potrebno je izabrati eljeni pin (npr. isto RA0) i Toggle akciju. Pri njoj se klikom na Fire polje pored eljenog pina menja njegovo logiko stanje, to moete pratiti u File Registers ili Watch prozoru. Ukoliko je potrebno da pin u odreenom logikom stanju bude tano odreeno vreme, moete izabrati Pulse High ili Pulse Low akciju. U tom sluaju trebate odrediti i eljenu duinu impulsa datu u vremenu ili broju instrukcijskih ciklusa. Poetak impulsa se takoe odreuje klikom na Fire polje pored eljenog pina. U asinhronom tabu potrebno je u eljenom trenutku fiziki kliknuti na polje za pokretanje odreenih opcija. U Register Injection tabu eljeni trenutci promene stanja pinova (bitova) mogu se definisati eksternim fajlom, a u Register Trace tabu moe se definisati eksterni fajl koji e snimati stanje odreenih bitova po unapred zadatim kriterijumima. Clock Stimulus tabom definiu se logika stanja pinova koja e se javljati u tano odreenim trenutcima. Za sloenija stanja, morao bi se koristiti Register Injection tab. Pin / Register Actions i Advanced Pin / Register tabovima definiu se sloenije akcije koje e se odvijati po promeni ili dostizanju unapred zadatog stanja bita ili registra. Za poetak, koristite jedino asinhroni tab. U sledeem poglavlju nauiete kako se programska memorija mikrokontrolera moe efikasnije iskoristiti.

28

11. Efikasno korienje memorije


Do sada ste programirali PIC da ukljuuje i iskljuuje LED. Onda ste upravljali njegovim radom dodavi mu prekida, i menjajui brzinu treptanja diode. Jedini problem je u tome to je program bio dugaak, i bespotrebno je troio memoriju. Da bi ga skratili trebate nauiti jo par instrukcija. CLRW instrukcija postavlja vrednost 0x00 u W, a CLRF f u eljeni registar. Tako umesto movlw b'00000000' movwf TRISB moete pisati clrw movwf TRISB ili clrf TRISB Hajde da vidimo kako ste do sada ukljuivali i iskljuivali LED. movlw movwf movlw movwf b'00000100' PORTA b'00000000' PORTA

Najpre je ubaena vrednost 0x04 u W registar, zatim je prosleena na PORTA da bi se ukljuila LED. Da bi se iskljuila obrisan je W registar, i ponovo je njegova vrednost prosleena na PORTA. Izmeu ovih rutina pozivan je potprogram za kanjenje da bi se moglo primetiti da LED treperi. Znai dva puta su prebacivana 2 seta podataka (jednom u W registar, a onda u PORTA) i dva puta je pozivan potprogram (jednom nakon ukljuenja i jednom nakon iskljuenja LED). Kako se ovo moe efektnije reiti? Koristei logiku operaciju zvanu XOR. XOR (eng. Exclusive Or) operacija izvrava logiku operaciju ekskluzivno ili na registru koji odredite, sa vrednou koju mu date. Trebalo bi ovo malo bolje objasniti. XOR 0 0 1 1 0 1 0 1 0 1 1 0 00101110 XOR 10010110 = 10111000 Rezultat XOR operacije e biti logika 1 samo ukoliko su mu oba operanda razliita. Ukoliko su ista (obe 0 ili obe 1), rezultat e biti logika 0.

XOR (kao i sve ostale logike instrukcije) se moe izvriti jedino nad celim bajtovima, pri emu se vodi rauna o njihovom poloaju. LSB bit rezultata sadrae rezultat XOR operacije nad LSB bitovima prvog i drugog operanda.

29

Uoavate li da XOR operacijom nad bitom koji je stalno na logikoj 1 i prethodnim stanjem bita menja stanje rezultata sa 0 na 1 i sa 1 na 0? I 00000000 XOR 00000001 = 00000001 II 00000001 XOR 00000001 = 00000000

Ta specifinost XOR operacije moe biti iskoriena za naizmenino ukljuivanje i iskljuivanje LED. Jo jedna interesantna osobina XOR operacije je da bilo koja vrednost dva puta XORovana istim brojem vraa originalnu vrednost. I 00101110 XOR 10010110 = 10111000 II 10111000 XOR 10010110 = 00101110

XOR operacija moe se nai u instrukcijama PIC16F84 u dva oblika. 1. XORLW k gde se XOR operacija izvrava nad W i konstantnom vrednou k. Vrednost k mora biti u opsegu od 0 do 255 (0x00 0xFF). Rezultat operacije e biti u W registru. 2. XORWF f,d gde se XOR operacija izvrava nad W i vrednosti unutar registra ija je adresa oznaena sa f. Sa d je oznaeno gde e biti smeten rezultat XOR operacije. Ukoliko je d=0, rezultat e biti u W registru, a ukoliko je d=1, rezultat e biti smeten u f registru. Upotrebom ove instrukcije su za naizmenino ukljuenje i iskljuenje LED dovoljne samo dve linije kda: movlw xorwf b'00000100' PORTA,F ; b'00000100' u W ; Promeni stanje bita 2 u PORTA registru

Ovde je vrednost 0x04 (b'00100') XOR-ovana sa ranijim sadrajem porta A. Ukoliko je bit 2 u portu A bio 1, postae 0, a ukoliko je bio 0 postae 1. ak nema ni potrebe za inicijalizacijom vrednosti u portu A. Zbog ega? Pa ukoliko je njegov bit 2 bio 0, promenie se. Ukoliko je bio 1, opet e se promeniti. Meutim, nedostatak inicijalizacije porta A moe uticati na stanje ostalih pinova, tako da je ona svakako preporuljiva. Iako je direktna manipulacija nad portovima sasvim mogua, direktno menjanje PORTA (ili PORTB) registra ne spada u dobru programersku praksu. Zbog ega? Zbog internog RMW (eng. Read Modify Write) ciklusa mikrokontrolera. RMW ciklus znai da mikrokontroler prilikom promene stanja nekog od bitova odgovarajueg registra najpre oita ceo registar (svih 8 bitova), zatim izvri eljenu operaciju nad njim, i na kraju vrati rezultat u taj isti registar. 30

Zamislite da je korisnik reio da izvue LED na neko udaljenije mesto (kao to mnogi izvlae signalizaciju jeftine struje sa strujomera). Kablovi preko kojih je povezana LED ponaaju se usled svoje velike duine i male daljine jedan od drugog kao kondenzator male kapacitivnosti. Zato je ukoliko elite brzo ukljuiti i iskljuiti LED mogue da ona neposredno nakon ukljuenja ne zasvetli zbog previe male otpornosti na njenim vodovima (dok se takav virtuelni kondenzator ne napuni). Ukoliko odmah po ukljuenju oitate stanje sa PORTB registra, videete da LED i dalje nije ukljuena. PORTB (i PORTA) se pri oitavanju stanja ponaaju kao da su povezani kao ulazi, bez obzira na ranije konfigurisano stanje pinova. To moe dovesti do oitavanja pogrenog stanja, a samim tim i nepravilnog rada programa. PIC je hardverski konstruisan tako da je mogue ak i da se oitavanje stanja sa portova moe zavriti i pre ranije zadate promene njihovih stanja. Zbog toga je pouzdanije sve operacije izvravati nad odreenim registrom opte namene (obino se taj registar naziva shaddow registar (eng. Shaddow senka)), a tek onda kada je to neophodno kopirati rezultat iz njega u odgovarajui port. Vie o shaddow registrima moete nauiti na http://www.piclist.com/tecHREF/readmodwrite.htm sajtu. Pogledajte sada novi asemblerski kd. 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 opte namene. Treptua LED ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. BROJAC1 equ 0x0C ; Prvi broja petlje. Inicijalno 0xFF BROJAC2 equ 0x0D ; Drugi broja petlje. Inicijalno 0xFF org 0x00 ; ****** Inicijalizacija i podeavanje porta ****** bsf STATUS,RP0 ; Banka 1 clrf TRISA ; Postavlja sve pinove clrf TRISB ; kao izlazne. bcf STATUS,RP0 ; Banka 0 clrw ; W je inicijalizovan na 0x00 ; ****** Ukljuenje i iskljuenje LED ****** Poc xorlw b'00000100' ; Promeni stanje bita 2 u W registru movwf PORTA ; Kopiraj W u PORTA ; ****** Pauza ****** call Pet ; ****** Pauza zavrena. Vrati se na poetak programa ****** goto Poc ; Vrati se na poetak

31

; ****** Potprogram za kanjenje od oko 0,2S ****** Pet decfsz BROJAC1,F ; Ove dve petlje slue za brojanje nadole od goto Pet ; 255 do 0, 255 puta, omoguavajui da se decfsz BROJAC2,F ; moe primetiti kako LED treperi goto Pet return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa

Treptua LED sa prekidaem ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. BROJAC1 equ 0x0C ; Prvi broja petlje. Inicijalno 0xFF BROJAC2 equ 0x0D ; Drugi broja petlje. Inicijalno 0xFF org 0x00 ; ****** Podeavanje porta ****** bsf STATUS,RP0 movlw b'00000001' movwf TRISA clrf TRISB bcf STATUS,RP0 clrw ; Banka 1 ; Stavi b'00001' u TRISA. Tako je bit 0 ; porta A ulazni, a bit 2 izlazni. ; Svi pinovi na portu B su izlazni. ; Banka 0 ; W je inicijalizovan na 0x00

; ****** Ukljuenje i iskljuenje LED ****** Poc xorlw b'00000100' ; Promeni stanje bita 2 u W registru movwf PORTA ; Kopiraj W u port A ; ****** Proveri da li je prekida zatvoren ****** btfsc PORTA,0 ; Uzmi vrednost sa pina RA0. Ukoliko je 0 ; preskoi prvu pauzu. Ukoliko je 1 proi kroz call Pet ; obe pauze, kao da se nita ne dogaa ; ****** Dodavanje jo jedne pauze ****** call Pet ; Ova pauza se uvek izvrava ; ****** Pauza zavrena. Vrati se na poetak programa ****** goto Poc ; Vrati se na poetak

32

; ****** Potprogram za kanjenje od oko 0,2S ****** Pet decfsz BROJAC1,F ; Ove dve petlje slue za brojanje nadole od goto Pet ; 255 do 0, 255 puta, omoguavajui da se decfsz BROJAC2,F ; moe primetiti kako LED treperi goto Pet return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa

Nadam se da ste uoili da je upotrebom novih instrukcija prilino smanjena veliina programa. Da biste lake uoili ovu razliku, ispod su prikazni nazivi programa, izmene koje su izvrene, i njihove veliine. Program Treptua LED Treptua LED Treptua LED LED sa prekidaem LED sa prekidaem Izmena Veliina (instrukcija) 18 17 14 22 17

Original Dodat potprogram Dodata ekskluzivno ili funkcija Original Dodata ekskluzivno ili funkcija

Vidite da ste ne samo nauili nove instrukcije, ve ste i smanjili veliinu programa.

33

12. Logike operacije


Jednu logiku operaciju (XOR) ste ve nauili. Sada ete se upoznati sa jo tri. AND logiko I operacija dae na svom izlazu logiku 1 samo ukoliko su joj na oba ulaza dovedene logike 1. Ovde je njena tablica istinitosti. AND 0 0 1 1 0 1 0 1 0 0 0 1 01101011 AND 10100101 = 00100001 Rezultat AND operacije bie logika 1 samo ukoliko su oba operanda na logikoj 1. Ukoliko bar jedan nije, rezultat e biti logika 0.

Kao i XOR i AND operacija se moe nai u dva oblika. 1. ANDLW k koja izvrava AND operaciju nad registrom W i konstantnom vrednou k. Rezultat operacije e biti u W registru. 2. ANDWF f,d koja izvrava AND operaciju nad vrednou W i vrednou f registra. Sa d je oznaeno gde e biti smeten rezultat operacije. Ukoliko je d=0, rezultat e biti u W registru, a ukoliko je d=1, rezultat e biti u f registru. Sledi IOR operacija: IOR 0 0 1 1 0 1 0 1 0 1 1 1 01101011 IOR 10100101 = 11101111 Rezultat IOR operacije bie logika 1 ukoliko je bar na jednom operandu prisutna logika 1. Ukoliko su oba na logikoj 0, i rezultat e biti jednak logikoj 0.

I ona se javlja u dva oblika. 1. IORLW k koja izvrava IOR operaciju nad registrom W i konstantnom vrednou k. Rezultat operacije e biti u W registru. 2. IORWF f,d koja izvrava IOR operaciju nad vrednou 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. Zadnja logika operacija koju podrava PIC16F84 je komplement. COM 0 1 1 0 COM 01101011 = 10010100 Komplement, negacija ili invertovanje je logika operacija u kojoj svaki bit unutar bajta menja svoje stanje. 34

Za razliku od ostalih logikih operacija komplemen se izvrava 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 uoavate da ste ovu logiku 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. Slino kao XOR operacija, duplo komplementovana vrednost vraa originalnu: I COM 01101011 = 10010100 II COM 10010100 = 01101011

Sve do sada nauene logike operacije menjaju vrednost bita 2 STATUS registra u sluaju da je rezultat njihove operacije jednak nuli. Kako je bit 2 po tome specifian on ima svoju posebnu oznaku nulti bit (eng. Zero flag). Termin flag koristi se za oznaavanje bitova koje mikrokontroler sam setuje ili resetuje u zavisnosti od svog trenutnog stanja (u ovom sluaju rezultata prethodne logike instrukcije). Dakle ukoliko je rezultat XOR operacije sledei: XOR = 00011010 00011010 00000000

Zero flag STATUS registra e biti setovan. Ovo se moe iskoristiti za brzo poreenje vrednosti u registru tako to se u W registar postavite eljeni oblik bitova a onda izvri 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 moete setovati ak i operacijom komplementovanja. COM = 11111111 00000000

U prilogu ovog uputstva moete videti uporedni prikaz instrukcija u kome je navedeno koje sve instrukcije menjaju stanje Zero flaga.

35

13. Rotacija
RLF (Rotate Left f Through Carry) instrukcija rotira ulevo bitove unutar zadatog registra. Sintaksa instrukcije je sledea: RLF f,d pri emu je f registar nad ijim sadrajem 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 sadraj registra ulevo. A ta kada 1 doe do kraja pitate se vi. Nee se izgubiti. Za vreme rotacije ulevo MSB se smeta se u tzv. bit prekoraenja (eng. Carry flag). On se nalazi na mestu bita 0 STATUS registra.

Dakle kada jedinica doe do kraja, dogaa se sledee: Carry flag 0 0 1 0 0 Bitovi 0x0C registra 76543210 01000000 10000000 00000000 00000001 00000010 .

rlf rlf rlf rlf rlf .

0x0C,F 0x0C,F 0x0C,F 0x0C,F 0x0C,F .

Vidite da je Carry flag ovde iskorien kao osmi bit registra. Ukoliko vam je to potrebno moete 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. Preporuljivo je ovo uraditi neposredno pre rotacije kako na bitu 0 nakon rotacije ne bi dobili nepoznatu vrednost. Ne utie samo RLF instrukcija na Carry flag. Interensantno je da se rotacijom ulevo (sa prethodno resetovanim Carry flagom) broj unutar registra mnoi sa 2. C 0 0 1 76543210 01011001 10110010 01100100 = = = 89 178 356 (raunajui i Carry flag)

Ukoliko vam je potrebno mnoenje sa 2 veih brojeva moete koristiti uzastopnu rotaciju dva ili vie registra. Carry flag iz prvog registra prenee se na poetak drugog. Kada ve postoji instrukcija za rotaciju ulevo, logino bi bilo da postoji i instrukcija za rotaciju bitova udesno. Postoji! 36

RRF (Rotate Right f Through Carry) Sintaksa instrukcije je ista kao i kod RLF. Kako se rlf instrukcijom sadraj u registru mnoi sa 2, rrf instrukcijom (i resetovanim Carry flagom) se sadraj registra deli sa 2. LSB se premeta u Carry flag po sledeem: Carry flag 0 0 1 0 Bitovi 0x0Ch registra 76543210 00000010 00000001 00000000 10000000

rrf rrf rrf rrf

0x0C,F 0x0C,F 0x0C,F 0x0C,F

Instrukcije RLF i RRF mogu se upotrebiti za simulaciju treeg svetla. U tom sluaju mogui algoritam bi bio: SPORTB equ rlf movf movwf 0x0C SPORTB,F SPORTB,W PORTB ; Rotacija u SHADDOW registru ; Kopiranje iz SHADDOW u W ; Kopiranje iz W u PORTB.

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 sadraj registra upie u taj isti registar? U praksi se ta mogunost koristi jedino pri testiranju sadraja registra na vrednost 0x00, jer movf instrukcija utie na Zero flag. Sledeom emom ilustrovana je upotreba logikih i instrukcija rotacije:

37

Upotreba logikih i instrukcija rotacije ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. DATA equ 0x0C ; Registar za privremene podatke org 0x00 ; ****** Podeavanje porta ****** bsf STATUS,RP0 movlw b'00000011' movwf TRISA clrf TRISB bcf STATUS,RP0 ; Prebacuje program u BANK1 ; Stavi b'00011' u TRISA. Tako su bit 0 i ; bit 1 ulazni, a bit 2 izlazni. ; Svi pinovi na PORTB su izlazni. ; Vraa program u BANK0

; ****** Testiranje prekidaa ****** Poc rlf PORTA,W ; Rotiraj sadraj PORTA i stavi rezultat u W ; registar, Tako je bit 0 doao na mesto bita 1 xorwf PORTA,W ; Izvri XOR nad PORTA i W registrom, ; i stavi rezultat u W (interesuje nas ; XOR nad bitom 1 ova dva registra). ; ****** Prebacivanje rezultata na izlaz ****** movwf DATA ; Premesti sadraj iz W u DATA jer se rotacija ; ne moe izvriti direktno nad W registrom rlf DATA,W ; Rotiraj sadraj. Tako je bit 1 doao na mesto ; bita 2 (na mesto izlaznog bita) i vrati rezultat ; u W registar. movwf PORTA ; Stavi rezultat u PORTA. Kako su bit 0 i bit 1 ; ulazni, nee reagovati, a na bitu 2 e se ; pojaviti rezultat XOR operacije nad ; postavljenim stanjem prekidaa. goto Poc ; Povratak na poetak. ; ****** Kraj ****** end ; Kraj programa.

Kompajlirajte program, programirajte PIC i isprobajte njegov rad. Iz komentara se moe lako zakljuiti ta program radi. Evo ta e se dogoditi u programu u sluaju da su oba prekidaa zatvorena: PIC uzima vrednost iz PORTA. Kako su oba tastera pritisnuta ona je b'00011'. Ta vrednost se rotira, i postaje b'00110'. Rezultat se smeta u W registar. Dalje se izvrava ekskluzivno ili nad tom vrednou i trenutnom vrednou 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 smeta u PORTA. Kako su na PORTA bit 0 i bit 1 ulazni, vrednost koja e doi na njih bie ignorisana, a bit 3 nas ionako ne interesuje i njegova vrednost se moe ignorisati. Kao to vidite na kraju svega bit 2 sadri vrednost XOR operacije (u ovom sluaju 0). Kako je ovaj bit izlazni, LED nee svetleti. Moete proveriti rezultat funkcije pritiskanjem prekidaa po tablici XOR operacije. Program je napisan tako da inicijalna vrednost Carry flaga nema uticaja na njegovo izvravanje, pa njegovo brisanje ovde nije potebno. bitovi PORTA W posle rotacije PORTA W posle XOR PORTA posle rotacije 43210 00011 00110 00011 00101 01011

Kako je ovaj program dat kao ilustracija korienja instrukcija nema potrebe za ogranienjem setovanja bita 3 PORTA registra. U praksi taj pin ne bi bio povezan, ili bi se bit 3 maskirao. Prepravite sada program po sledeem: Umesto napiite xorwf andwf PORTA,W PORTA,W ; Izvri XOR nad PORTA i W ; Izvri AND nad PORTA i W

Program radi isto to i ranije, s tom razlikom to umesto XOR primenjuje AND operaciju. Pritiskanjem prekidaa moete videti da e LED svetleti jedino ukoliko su oba prekidaa (T1 i T2) zatvorena (na oba ulaza dovedena logika jedinica). Ukoliko u programu zamenite instrukciju ANDWF instrukcijom IORWF moete isprobati rad ove operacije. LED1 e svetleti ukoliko je ukljuen bar jedan prekida. A ukoliko upotrebite COMF instrukciju, LED e svetleti suprotno od stanja prekidaa T1 ignoriui stanje prekidaa T2. Do sada ste nauili 22 od 35 instrukcija. estitamo. To je vie od polovine.

39

14. Brojanje i sabiranje


Ve ste videli kako PIC16F84 moe mnoiti i deliti sa dva u binarnom brojnom sistemu. Sada ete nauiti kako moe brojati unapred i unazad kao i sabirati. INCF (eng. Increment f) instrukcija slui za inkrementaciju. Njen oblik je: INCF f,d pri emu d odreuje gde e ii rezultat (u W ili F). Ovom instrukcijom se vri poveanje sadraja registra f za 1. Ukoliko je npr. vrednost registra opte namene 0x0Ch bila 0x00, nakon instrukcije inc 0x0C,F njegova vrednost e postati 0x01, a nakon sledee iste instrukcije 0x02. A ta e biti kada se doe do 0xFF - pitate se vi. Odmah ete videti. Bitovi 76543210 11111110 11111111 00000000 00000001 STATUS Zero flag 0 0 1 0

incf 0x0C,F incf 0x0C,F incf 0x0C,F

Ukoliko vam je potrebna inkrementacija do veih vrednosti moete detektovati stanje Zero flaga, i onda pokrenuti sledei registar za inkrementaciju. Ili za jo vee brojeve moete kao u primeru sa praznom petljom staviti petlju unutar petlje. 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 sluaju da broja doe do 0 desie se sledee: Bitovi 76543210 00000001 00000000 11111111 11111110 STATUS Zero flag 0 1 0 0

decf 0x0C,F decf 0x0C,F decf 0x0C,F

Dva specijalna oblika ovih instrukcija su: DECFSZ f,d koju ste ve nauili u praznoj petlji i INCFSZ f,d (Increment f, Skip if zero) koja poveava sadraj registra f za 1 po istom principu kao INCF instrukcija, i koja preskae sledeu instrukciju u sluaju da je rezultat operacije jednak 0. Poc incfsz 0x0C,F goto Poc Nastavi odavde Ove instrukcije za razliku od obinih INCF i DECF ne utiu na Zero flag. ; Poveaj vrednost u registru 0x0C za 1, ; i vrati se na poetak. Ukoliko se nakon poveanja ; dobije 0, preskoi goto instrukciju i nastavi dalje.

40

ADD (eng. saberi) operacija sabira dva broja. Pogledajte kako se izvrava operacija sabiranja u binarnom brojnom sistemu: ADD 0 0 1 1 0 1 0 1 0 1 1 10 ADD = C 1 11001101 10111000 10000101 .205 .184 .389

Prilikom sabiranja dve logike 1 javlja se prenos u bit vee teine. Ukoliko ni MSB nije dovoljan za prenos, setovae se Carry flag.

Kod ovakvih sluajeva bit prekoraenja smeta se u Carry flag. Ukoliko je potrebno sabirati brojeve iji zbir moe biti vei od 255, Carry flag mora se uzeti u obzir pri prenosu u bajt vee teine. U instrukcijama za PIC operacija sabiranja ima dva oblika: ADDLW k sabira sadraj W registra i konstantne vrednosti k. Rezultat e se nai u W registru. ADDWF f,d sabira sadraj W registra i registra f. Sa d se odreuje gde e se nai rezultat. Aritmetike operacije sabiranja (i oduzimanja) pored Carry i Zero flaga utiu jo i na tzv. DC flag (eng. Digit Carry), odnosno bit 1 STATUS registra. On e biti setovan pri prekoraenju donjeg etvorobitnog dela bajta (tzv. nibla). Menja se po istom principu kao i Carry flag. C DC ADD = 1 1 1111 1111 0000 0001 0000 0000 ADD = C DC 0000 1111 0000 0001 0 1 0001 0000

Deljenje bajta na niblove ima smisla ukoliko je potrebno jednim niblom prikazivati jednu cifru, a drugim drugu (npr u digitalnom asovniku za minute gornji nibl od 0 do 5, a donji od 0 do 9). Uveanje samo gornjeg nibla reava se sabiranjem sa b'00010000'.

41

15. Negativni brojevi i oduzimanje


Kod negativnih brojeva uzeto je pravilo da bit najvee teine (eng. Most Signle Bit kod osmobitnih brojeva bit 7) predstavlja znak minus. Ukoliko je MSB setovan, broj je negativan. Poto mikrokontroler koristi jedino 0 i 1 za predstavljanje brojeva, postavlja se logino pitanje kako predstaviti negativne brojeve. Osnovna ideja je invertovanje svih bitova unutar bajta. (to bi bio obini, odnosno prvi komplement). Meutim, ovaj princip ima tu manu to se nula moe predstaviti dvojako (00000000 i 11111111). Stoga je praktiniji nain invertovanje svih bitova i dodavanje broja 1. +1 = 00000001 +0 = 00000000 -1 = 11111110+1 = 11111111 -0 = 11111111+1 = 00000000

Kao to vidite, ovako postoji samo jednostruko predstavljanje broja 0. Takav postupak naziva se drugi komplement ili komplement dvojke. Raunanje drugog komplementa broja moe se izvriti sledeim algoritmom: comf BROJ,F incf BROJ,F ; Prvi komplement ; Dodaj broj 1

Runo pretvaranje pozitivnih u negativne brojeve najlake moete izvriti raunajui drugi komplement broja. Raunanje e vam biti utoliko lake ukoliko se prisetite obinog komplementovanja (ili invertovanja ako vam je tako lake). Drugi komplement predstavlja obian komplement kome je dodat broj 1. COM 01011011 10010000 + 1 = 10100101 +.91 -.91

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 nai pozitivni (0 do 127) i negativni (-1 do -128) brojevi. Ovakvi brojevi nazivaju se oznaenim, za razliku od obinih neoznaenih (0-255) brojeva. Zato je bitno unapred odrediti da li ete raditi sa oznaenim ili neoznaenim brojevima. Granice oznaenih brojeva ne smeju se prekoraiti, jer PIC ne pravi razliku izmeu oznaenih i neoznaenih brojeva, pa moe doi do netanog rezultata operacije. Operacija suprotna sabiranju je SUB (eng. Substract) oduzmi. Oduzimanje se unutar mikrokontrolera izvrava upravo sabiranjem prvog broja sa komplementom dvojke drugog broja. Za razliku od sabiranja, kod koga se Carry flag setuje pri prekoraenju, kod oduzimanja je primenjena negativna logika, tako da je Carry flag setovan ukoliko nema prekoraenja (tanije pozajmice). Znai kod oduzimanja manjeg broja od veeg (i u sluaju da su brojevi jednaki), Carry flag e biti setovan. Njegovo stanje se tada treba ignorisati. Pogledajte to na sledeem primeru: 100-55. 42

+.100 +(-.55) = +.45

C 1

01100100 11001001 00101101

+.55 -.55

00110111 11001001

Kod oduzimanja veeg od manjeg broja, prilikom sabiranja sa komplementom dvojke nema prekoraenja, pa se Carry flag ne setuje. Pogledajte to na primeru: 56-87. +.56 +(-.87) = -.31 C 0 00111000 10101001 11100001 +.87 -.87 01010111 10101001

Testiranjem MSB moete utvrditi da li je oznaeni rezultat pozitivan ili negativan, a testiranjem Zero flaga da li je rezultat 0. Isto kao i sabiranje, i instrukcija za oduzimanje moe se javiti u dva oblika. SUBLW k oduzima sadraj W registra od konstantne vrednosti k. Rezultat e se nai u W registru. SUBWF f,d oduzima sadraj W registra od registra f. Sa d se odreuje gde e se nai rezultat. Ukoliko Vam je oduzimanje i testiranje Carry flaga naporno, uradite isto to i mikrokontroler. Saberite jedan broj sa drugim komplementom dvojke drugog broja. Ukoliko se rotacijom izvrava mnoenje ili deljenje sa 2 nad oznaenim brojevima, obavezno se mora obratiti panja na MSB, jer on oznaava pripadnost pozitivnim, odnosno negativnim brojevima. U praksi se retko kada sree potreba za primenom oznaenih brojeva. Skoro sve operacije izvravaju se nad neoznaenim brojevima. Oznaeni 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...


Imate PIC16F84 mikrokontroler. Unutar njega sve je digitalno. On razume jedino logiku 0 i logiku 1, odnosno naponske nivoe od 0V i +5V. Meutim, ponekad se dogodi da mu se umesto ovih napona dovedu naponi koji odstupaju od onih preporuenih u njegovim specifikacijama. Funkcija svih ovih gore nabrojanih termina je da se spree upravo takvi efekti. Dekapling predstavlja zatitu mikrokontrolera od smetnji na vodovima napajanja. Za stabilizaciju ovog napona uglavnom se koristi popularni 78L05 integrisani stabilizator napona. Meutim, da bi se spreile oscilacije napona napajanja na njegovom izlazu, poeljno je zalemiti keramiki kondenzator od 100nF paralelno napojnim pinovima mikrokontrolera (pinovi Vss i Vdd), a to blie njima. Ukoliko u projektu koristite vie integrisanih kola, poeljno je ovo uraditi kod svakog od njih. Na taj nain kondenzator spreava bilo kakve nepoeljne oscilacije napona (obino nastale usled indukcije napona sa izlaznih pinova). U emama u ovom uputstvu nisu nacrtani jedino zbog vee preglednosti. Detalji na http://en.wikipedia.org/wiki/Decoupling_capacitor. Sigurno vam se ve desilo da prilikom ukljuenja ili iskljuenja svetla na prekidau primetite varnienje kontakta. Idealno bi bilo kada bi prekida odjednom mogao prebaciti svoje stanje od ukljuenog u iskljueno i obrnuto. Meutim, kako se kontakti prekidaa fiziki ne mogu previe brzo kretati, neizbeno je javljanje par varnica pre konane promene stanja. Kod ukljuenja ili iskljuenja svetla, ova pojava nije bitna. Ali mikrokontroler zbog svoje velike brzine usled ove pojave moe zakljuiti da je taster na njegovom ulaznom pinu umesto jednom pritisnut vie puta. Da bi se ova pojava neutralisala potrebno je u mikrokontroleru realizovati smanjenje uma na ulaznom signalu, odnosno debouncing. Debouncing rutina testira stanje pina, saeka malo (koliko je potrebno da se stabilizuje stanje prekidaa) i onda ga opet testira. Testiranje se ukoliko je potrebna vea preciznost moe uzastopno izvravati i vie od dva puta. Ukoliko su u svim sluajevima dobijena ista logika stanja na pinu, to znai da je taster sigurno pritinut (otputen), a u protivnom da nije. Ovaj princip standardno koriste kompjuterske tastature. Za vie detalja pogledajte http://www.ganssle.com/debouncing.pdf. Alternativno, mogue je realizovati i hardverski debouncing, ali za njega svaki pin mora imati svoj prekida to onemoguava multipleks ulaza (vie o njemu kasnije) i sa svakim tasterom potrebno je povezati dva otpornika i kondenzator. To direktno poskupljuje proizvodnju, uveava mogunost pojave hardverskih greaka i zahteva poveanje dimenzije i teine hardvera. PIC sam po sebi ne bi mogao mnogo toga uraditi bez par ulaznih elemenata (prekidai, senzori, sonde...). Elementi koje mu dodajemo mogu, ali i ne moraju biti digitalni. U tehnikom uputstvu preporueno je da ulazni logiki nivoi (pri naponu napajanja od 5V) budu u intervalu od 0 do 0,8V za logiku 0, i od 2,4V do 5V za logiku 1. ta e se dogoditi ukoliko ovi elementi umesto precizno definisanih logikih 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 moe proitati 0, a moe i 1. Nema pravila. Ukoliko ulazni pin (u najgorem moguem sluaju) nije povezan na eksterno kolo, napon na njemu moe zaoscilovati, pa ak prouzrokovati unitenje mikrokontrolera. U praksi se nekad javi situacija da je potrebno na mikrokontroler dovesti upravo ovakav sivi napon. U tom sluaju poeljno je koristiti uzlaze sa mitovim okidaem (eng. Schmitt trigger), ili ih dodati eksterno (npr. preko 7414 estostrukog invertora). U PIC16F84 mitov okida nalazi se na RA4 pinu. Na RB0 pinu nalazi se samo kada je ovaj definisan kao izvor interapta (vie o njima kasnije). Kod ulaza sa mitovim okidaem nema nedefinisanih stanja ulaznog pina. Stanje na pinu promenie se tek kada se signal dovoljno priblii njegovoj definisanoj oblasti. Ako se nakon toga vrati ka srednjoj (sivoj) oblasti, ulaz e i dalje javljati njegovo poslednje stabilno definisano stanje. Vie o ovome imate na sajtu http://en.wikipedia.org/wiki/Schmitt_trigger. Oigledno je da e pri povezivanju taster prekidaa na ulaze PIC16F84 mikrokontrolera biti potrebno da njegovi ulazi budu u svakom trenutku na tano definisanom logikom nivou. Ovo se hardverski realizuje Pull-up (povui nagore) ili Pull-down (povui nadole) otpornicima. Pull up otpornik je otpornik povezan izmeu napona napajanja mikrokontrolera i ulaznog pina, pri emu se taster prekida vezuje izmeu pina i mase. Kada je taster otputen, pull up otpornik dovodi napon napajanja direktno na pin, postavljajui ga tako u stanje logike jedinice, sve dok se ne pritisne taster. Bez njega bi napon na pinu verovatno zaao u nedefinisano stanje. Ovaj otpornik ne treba biti previe male vrednosti zbog manje potronje struje pri pritisnutom taster prekidau. Preporuene vrednosti su od 4,7k do 10k. Na isti nain na eljeni pin mikrokontrolera moe se postaviti pull down otpornik prema masi, kada bi se prekida postavio prema naponu napajanja, to je ilustrovano u ranijim emama. Vie o pull-up otpornicima moete saznati na http://en.wikipedia.org/wiki/Pull-up_resistor. Postavljanje eksternih pull up otpornika komplikuje izradu tampane ploice. Stoga su na pinovima PORTB registra oni hardverski implementirani, a ukljuuju se resetovanjem bita 7 (Port B Pull Up) OPTION_REG registra. Primeujete da je ovo suprotno od onoga to biste mogli oekivati! Zato se takvi nelogini bitovi oznaavaju sa crticom iznad njih ili NOT_ predznakom. To oznaava da je logika 0 njihovo aktivno stanje. Resetovanjem NOT_RBPU bita povezuju se interni otpornici mikrokontrolera na svaki od ulaza PORTB registra prema naponu napajanja mikrokontrolera. Interni otpornici spajaju se na sve ulazne pinove porta B. Pored te, OPTION_REG registar ima i razne druge funkcije, pa je stoga najpraktinije ne menjati sadraj njegovih ostalih bitova. Jo jedna stvar vredna panje je elekrtomagnetna interferencija. Da bi se zatitili od nje, poeljno je na svaki pin pre bilo kakvog hardvera povezati redni otpornik. 45

17. Jo malo o hardveru


Do sada ste pisali i pisali programe. Vreme je da se malo pozabavite unutranjom strukturom mikrokontrolera. Nakon toga neke stvari e vam biti jasnije. Sve instrukcije sa kojima radi PIC16F84 su etrnaestobitne. Meutim, unutar samih instrukcija nalazi se kd instrukcije (po kome se npr. instrukcija CALL razlikuje od MOVLW) i operand, koji predstavlja podatak sa kojim radimo (bit, bajt ili oba u npr. bsf PORTA,2 instrukciji). Postoje i instrukcije koje nemaju operand (npr. CLRW). Pre izvrenja svake instrukcije PIC gleda sadreaj registra PCL i PCLATH. Oni (tanije bitovi 0-5 PCLATH + 0-8 PCL) ine jedinstven trinaestobitni PC (eng. Program Counter) registar. U njemu je smetena adresa izvravanja tekue instrukcije. Po izvravanju instrukcije, PC se uveava za 1, i prelazi na sledeu instrukciju. Ukoliko je tekua instrukcija instrukcija uslovnog skoka (DECFSZ, INCFSZ, BTFSC ili BTFSS), rezultat instrukcije (tano ili netano 1 ili 0) dodaje se na PC, ime je omoguen skok preko sledee instrukcije. Meutim ukoliko je tekua instrukcija GOTO, ona e u PC postaviti novi adresu, i izvrenje programa nastavie se odatle. Specijalan sluaj predstavlja korienje CALL instrukcije. PIC mora na neki nain upamtiti mesto sa koga je skoio 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 (vie o njoj kasnije). Njega moete zamisliti kao cev zatvorenu sa jedne strane u koju redom ubacujete klikere. Crveni, zeleni, uti i plavi. Oigledno, ne moete izvui zeleni kliker ukoliko prethodno ne izvuete plavi pa uti. Pri nailasku na CALL instrukciju, adresa naredne instrukcije se stavlja na stek, i vri se izmena PC. Mikrokontroler skae na potprogram, i tamo nastavlja izvrenje programa sve do instrukcije povratka. Po nailasku na instrukciju povratka, mikrokontroler preuzima adresu povratka sa steka, i smeta je u PC. Dalje izvrenje programa nastavlja se odatle. Meutim, stek nije beskonaan. U njega se moe upisati maksimalno 8 adresa za povratak (jo manje ukoliko se koriste interapti). Nakon toga nove adrese povratka prebrisae poetne (crveni pa zeleni kliker...), to e prouzrokovati nepravilan rad programa. Ovo ogranienje ne bi trebalo preterano da Vas brine. U praksi uglavnom nema potrebe za potprogramima koji idu vie od druge ili tree dubine. Ukoliko u programu imate vie pozivanja potprograma, prilikom simulacije programa proverite sadraj steka opcijom View, Hardware stack. Iako PIC nema set instrukcija kojima bi se mogle koristiti tabele u programu, mogue je implementirati ih upotrebom PCL i PCLATH registra i instrukcije RETLW k. Retlw k (Return with Literal in W) instrukcija omoguava povratak iz potprograma (isto kao i RETURN instrukcija), pri emu se nakon povratka bajt k nalazi u W registru. Za obine potprograme to i nije neka velika pogodnost, ali je za tabele neophodno. Tabele se koriste pozicionirajui PCL registar na odovarajuu instrukciju. U primeru koji sledi tabela se koristi za odabir odgovarajueg ablona za crtanje brojeva od 0 do 9 na sedmosegmentnom LED displeju.

46

; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. BROJ equ 0x0C ; Promenljiva za broj koji se prikazuje (0x00-0x09) BROJAC equ 0x0D ; Broja za pauzu. Inicijalno 0xFF org 0x00 ; ****** Podeavanje porta ****** bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw 0x01 ; Konfigurie pinove tako da su RB1 do movwf TRISB ; RB7 izlazni, a da je RB0 ulazni. clrf TRISA ; Svi pinovi na PORTA su izlazni. bcf OPTION_REG,NOT_RBPU ; Ukljueni interni pull up ; otpornici na PORTB bcf STATUS,RP0 ; Vraa program u BANK0 ; ****** Inicijalizacija ****** Ini clrf BROJ call Disp ; Postavljanje na 0 ; Prikaz broja na displeju

47

; ****** Testiranje prekidaa ****** Cek1 btfss PORTB,0 ; Testiranje otputenosti prekidaa goto Cek1 ; Nije otputen call Pau ; Jeste otputen. Pozovi pauzu. btfss PORTB,0 ; Jo jedno testiranje zbog imunosti na goto Cek1 ; eventualna varnienja kontakta. Cek2 btfsc PORTB,0 ; Testiranje pritisnutosti prekidaa goto Cek2 ; Nije pritisnut call Pau ; Jeste pritisnut. Pozovi pauzu. btfsc PORTB,0 ; Jo jedno testiranje zbog imunosti na goto Cek2 ; eventualna varnienja kontakta. ; ****** Brojanje ****** movlw 0xF6 addwf BROJ,W btfsc STATUS,C goto Ini incf BROJ,F call Disp goto Cek1 ; .246 u W (.246+.9+.1 = setovan Carry flag) ; Saberi sa BROJ, rezultat u W ; Da li je dolo do prekoraenja (Carry flag)? ; Jeste, resetuj broja ; Nije, uveaj broja, ; prikai rezultat i. ; nastavi sa testiranjem i brojanjem

; ****** Potprogram za prikaz na LED displeju ****** Disp call Tabl ; Obrazac za prikaz u W movwf PORTB ; Prikai na displeju return ; Povratak iz potprograma ; ****** Tabela ****** Tabl movf BROJ,W ; U promenljivoj BROJ nalazi se vrednost od addwf PCL,F ; .0 do .9. Ta vrednost se dodaje na PCL. retlw b'01111110' ; Obrazac za crtanje cifre 0 - 0 retlw b'00001100' ; Obrazac za crtanje cifre 1 - 1 retlw b'10110110' ; Obrazac za crtanje cifre 2 - 2 retlw b'10011110' ; Obrazac za crtanje cifre 3 - 3 retlw b'11001100' ; Obrazac za crtanje cifre 4 - 4 retlw b'11011010' ; Obrazac za crtanje cifre 5 - 5 retlw b'11111010' ; Obrazac za crtanje cifre 6 - 6 retlw b'00001110' ; Obrazac za crtanje cifre 7 - 7 retlw b'11111110' ; Obrazac za crtanje cifre 8 - 8 retlw b'11011110' ; Obrazac za crtanje cifre 9 - 9 ; ****** Pauza ****** Pau decfsz BROJAC,F goto Pau return ; ****** Kraj programa ****** end ; Pauza zbog debouncing ; rutine ; Povratak iz potprograma ; Kraj programa.

48

Duplim testiranjem pritisnutosti taster prekidaa sa pauzom izmeu testiranja realizovana je debouncing rutina. Testiranje na otputenost, a zatim na pritisnutost spreava nastavak brojanja ukoliko se prekida neprekidno dri pritisnut, i omoguava promenu stanja prilikom pritiska, a ne prilikom otpusta tastera. Testiranje prekoraenja realizovano je sabiranjem vrednosti sa brojem 246 i testiranjem Carry flaga. Za vrednosti od 0 do 9 sabrane sa .249 Carry flag nee biti setovan, ali hoe za vrednosti vee od njih (.10). One e prouzrokovati ponovnu inicijalizaciju brojaa, i ciklus brojanja e ponovo poeti od 0. Prikaz dekadnog broja realizovan je direktnim dovoenjem napona na pojedine segmente LED displeja. Ovi segmenti su na LED displeju oznaeni su slovima a, b, c, d, e, f i g. Segment dp (eng. decimal point) decimalna taka ovde nije iskorien. Iako je program je napravljen za rad sa displejem sa zajednikom katodom, moe moe se prepraviti za rad sa displejem sa zajednikom anodom prepravkom tabele na taj nain to se svi bitovi u tabeli (LSB nema uticaja na rad programa jer je pin RB0 povezan na taster) invertuju: retlw retlw retlw b'01111110' b'00001100' b'10110110' ; 0 promeniti u b'10000001' ; 1 promeniti u b'11110011' ; 2 promeniti u b'01001001'

U tom sluaju potrebno je prepraviti elektrinu emu tako da se zajednika anoda povee na +5V. U potprogramu za prikaz moete videti klasian primer pozivanja drugog potprograma iz prvog. MPLAB asembler ima direktivu DT (eng. Define Table) kojom se mogu bre unositi eljene vrednosti u tabelu. Njen oblik je sledei: addwf PCL,F ; Saberi sa PCL dt d'10', d'18', d'0', d'253', d'84', d'5' ; Vrednosti Iako na prvi pogled deluje da se na ovaj nain tedi memorija mikrokontrolera, to nije sluaj. Asembler e dt direktivom naredne memorijske lokacije napuniti retlw instrukcijama koje sadre vrednosti navedene iza direktive. Pri tome se mogu primenjivati svi naini oznaavanja brojeva (decimalni, heksadecimalni...). Ova pogodnost najvie dolazi do izraaja pri upisivanju ASCII karaktera: addwf PCL,F ; Saberi sa PCL dt Proba ispisa teksta ; ASCII karakteri u tabeli U radu sa tabelama morate obratiti panju na dve stvari. 1. Morate biti sigurni da je broj koji sabirate sa PCL u tano odreenim granicama. U sluaju prekoraenja izvravanje programa e se nastaviti sa sluajne memorijske adrese to e prouzrokovati nepravilan rad ili blokadu programa.

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 izae 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 veom koliinom podataka, reenje bi moglo biti u postavljanju vie tabela. Veliinu bloka najjednostavnije moete proveriti brojanjem upotrebljenih instrukcija (bez direktiva), ili analizom .lst fajla generisanog prilikom asembliranja. Za postavljanje poetka tabele na eljeno mesto (poetak bloka) moete koristiti ORG direktivu. Umesto tabele mogue je napraviti skok na proraunate memorijske lokacije addwf PCL,F instrukcijom, pri emu se adresa na koju se treba skoiti uva u W registru u obliku broja instrukcija koje se trebaju preskoiti da bi se dolo do eljene. Ogranenja vezana za tabele vae i u ovom sluaju. Da biste ih prevazili, pogledajte AN548 sa http://www.microchip.com/.

50

18. Watchdog tajmer


Pretpostavimo da ste napisali program koji se neprekidno izvrava na mikrokontroleru. Normalno, eleli bi da se osigurate da e program uvek nastaviti sa izvravanjem bez obzira na to ta se sa njim dogaa. Uzmite u obzir sledei sluaj. Pretpostavimo da PIC nadgleda odreeni ulazni pin. Kada se na ovaj pin dovede logika 1, program skae na naredni deo i eka da sledei pin dobije logiku 1. Ukoliko se to ne desi, PIC e se vrteti u petlji i ekati. Izai e iz petlje tek kada se na pinu pojavi 1. Pogledajte sada malo drugaiji primer. Pretpostavimo da ste napisali program, kompajlirali ga, ak i simulirali njegov rad u simulatoru. Meutim posle dugo vremena program se zaglavi u nekoj petlji (koliko ste samo puta Vi pritisnuli Ctrl Alt Delete kombinaciju na Windowsu). U oba sluaja potrebna Vam je neka vrsta reseta ukoliko se program zaglavi. To je svrha Watchdog (eng. pas uvar) tajmera. Watchdog tajmer (skraeno WDT) nije nita novo. Mnogi mikrokontroleri i mikroprocesori imaju ga u sebi. Ali kako on radi? Unutar mikrokontrolera nalazi se interni RC oscilator koji obezbeuje jedinstven takt, nezavistan od takta mikrokontrolera. Kada se WDT ukljui, njegov broja poinje sa 0x00, i redom se inkrementuje sve dok ne dostigne maksimalnu vrednost 0xFF. U trenutku prelaska sa 0xFF na 0x00 (to je 0xFF+1) PIC e se resetovati bez obzira na njegovo stanje. Jedini nain na koji se moe spreiti ovaj reset, je periodino resetovanje WDT na 0 kroz program. Sada moete i sami uvideti da u sluaju zaglavljivanja mikrokontrolera u petlji WDT nee biti resetovan, to e prouzrokovati reset mikrokontrolera. Da biste mogli uspeno koristiti WDT potrebno je da znate tri stvari. Prvo za koliko vremena e WDT prei sa 0x00 na 0xFF, drugo kada ga trebate resetovati i tree kako podesiti softver programatora za njegovo ukljuenje. 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 lakeg objanjavanja zaokruiu ovo vreme na tano 18mS. Ipak, ono se moe i produiti. bit 2,1,0 0, 0, 0 0, 0, 1 0, 1, 0 0, 1, 1 1, 0, 0 1, 0, 1 1, 1, 0 1, 1, 1 Odnos 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128 Vreme 18mS 36mS 72mS 144mS 288mS 576mS 1,1S 2,3S Unutar mikrokontrolera nalazi se tzv. preskaler (eng. pre podeliti). On se moe programirati za deljenje WDT takta generisanog internim RC oscilatorom. to se vei odnos deljenja koristi, takt WDT e biti sporiji. Preskaler se nalazi u OPTION_REG registru (0x81) na mestu od nultog do drugog bita. U tabeli je prikazan odnos bitova, odnos deljenja takta i vreme prekoraenja vrednosti WDT.

51

Upamtite da su ova vremena nezavisna od takta oscilatora mikrokontrolera. Mislite o ovim vremenima kao stvarnim (eng. real time), nasuprot taktu mikrokontrolera koji moete menjati fizikom zamenom par delova u oscilatoru. Pretpostavimo da elite da WDT resetuje PIC nakon pola sekunde. Najblia standardna vrednost je 576mS, odnosno 0,576S, pa je dovoljno poslati vrednost b101 u OPTION_REG registar. movlw movwf b'101' 0x81 ; Ovo je 0x05 ; Adresa OPTION_REG registra.

Meutim nije ba sve tako jednostavno. Po inicijalizaciji PIC-a postskaler je pridruen internom tajmeru mikrokontrolera (vie o njemu kasnije). To znai da je potrebno prebaciti ga na WDT. Kako i interni i watchdog tajmer koriste iste bitove OPTION_REG registra Microchip preporuuje sledeu proceduru kako ne bi dolo do nehotinog reseta PIC. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC org 0x00 ; Podeava konfiguracione bitove. ; ****** Podeavanje WDT ****** * bsf STATUS,RP0 * movlw b'xx0x0111' * movwf OPTION_REG * bcf STATUS,RP0 clrf TMR0 bsf movlw movwf clrwdt movlw movwf bcf STATUS,RP0 b'xxxx1111' OPTION_REG b'xxxx1xxx' OPTION_REG STATUS,RP0 ; Obrii WDT ; Izaberi WDT, i postavi zeljeni odnos ; preskalera xxx. ; Za 0,576S to je b'xxxx1101' ; BANK0 ; BANK1 ; Izaberi tajmer i preskaler razliit od 000 ; BANK0 ; Brisanje vrednosti internog tajmera i ; preskalera pri upisu u tajmer, ; BANK1 ; Izaberi WDT, bez menjanja odnosa ; preskalera

U sluaju eljenog odnosa razliitog od 1:1 (vrednost preskalera 000) mogu se izbaciti instrukcije oznaene zvezdicom. Vrednosti u OPTION_REG registru levo od preskalera oznaene sa x imaju specijalne funkcije (poput ukljuenja Pull-Up otpornika) koje ete nauiti u delu sa tajmerom i interaptima. Iz tog razloga im ovde nisu dodeljene konkretne vrednosti. Za sada je dovoljno da znate da se bitom 3 OPTION_REG registra vri selekcija tajmera kome e biti pridruen delitelj po sledeem: 1 postskaler WDT 0 preskaler internog tajmera. 52

U primeru ste nauili upotrebu CLRWDT (eng. Clear Watchdog timer) instrukcije. Nakon nje, TO bit (eng. Time Out isteklo vreme) STATUS registra bie iznova setovan, a nai e se u resetovanom stanju jedino prilikom WDT reseta. Vie o tome nauiete u poglavlju sa reset funkcijom. Vreme izvravanja instrukcija Kao to se seate, PIC deli takt oscilatora sa 4. Ovo vreme naziva se instrukcijski ciklus. Ukoliko je kao izvor takta upotrebljen kristal od 4MHz, PIC e izvravati instrukcije brzinom od 4MHz/4=1MHz, odnosno za jednu instrukciju koja traje 1 instrukcijski ciklus e mu trebati 1S, dok e mu za instrukciju koja traje 2 instrukcijska ciklusa trebati 2S. Nain da zapamtite broj instrukcijskih ciklusa za sve instrukcije je prilino lak. Pretpostavite da sve instrukcije traju 1 instrukcijski ciklus. Ali, ukoliko instrukcija prouzrokuje nastavak programa sa neke druge adrese (promenjen je sadraj PC), onda e ona trajati 2 instrukcijska ciklusa. Na primer MOVWF instrukcija traje 1 instrukcijski ciklus, jer samo premeta podatak sa jednog na drugo mesto. GOTO instrukcija traje 2 ciklusa jer prouzrokuje da PC skoi na neko drugo mesto u programu. RETURN instrukcija traje 2 ciklusa, jer se PC vraa na glavni program. Meutim, postoje 4 instrukcije koje mogu trajati 1 ili 2 instrukcijska ciklusa. To su DECFSZ, INCFSZ, BTFSC i BTFSS. One e preskoiti sledeu instrukciju u sluaju da je odreeni uslov ispunjen i onda e trajati 2 ciklusa. Ukoliko taj uslov nije ispunjen, izvrie se naredna instrukcija kao da se nita nije ni desilo, i onda e trajati 1 ciklus. Pogledajte sada sledei program. movlw movwf decfsz goto end 0x02 BROJAC BROJAC,F Pet

Pet

Prva instrukcija postavlja vrednost 0x02 u W. Ovo ne prouzrokuje menjanje PC, pa ona traje 1 instrukcijski ciklus. Sledea instrukcija je slina. Ona takoe ne menja stanje PC, pa i ona traje 1 ciklus. Sada e sledea instrukcija izvriti prvo smanjenje registra BROJAC za 1 i rezultat testa na vrednost 0 = 0 pridruiti PC. Na ovaj nain PC se ne menja, pa instrukcija traje 1 ciklus. Sledea instrukcija je GOTO, i ona traje 2 ciklusa. Onda se ponovo vri smanjenje registra BROJAC za 1, ali kako je sada rezultat testa na vrednost 0 = 1, PC e promeniti svoju vrednost na PC+1, to troi 2 instrukcijska ciklusa. Znai ovaj program zauzee ukupno 7 instrukcijskih ciklusa. Uz kristal od 4MHz program e trajati 4MHz / 4takta = 1S po instrukcijskom ciklusu, to za 7 ciklusa iznosi 7 * 1S = 7S. Vidite koliko zbunjujui moe biti instrukcijski ciklus instrukcija uslovnog skoka. Softver programatora Seate se __CONFIG direktive? Za korienje WDT, on se mora preko nje ukljuiti sa WDT ON. A poto je neki programatori ignoriu, potrebno je i unutar njihovog softvera podesiti konfiguracione bitove. Postupak njihovog podeavanja razlikuje se od programatora, do programatora (softvera). Uglavnom se trai njihov upis neposredno pre programiranja mikrokontrolera. 53

Sledeim programom namerno se dozvoljava prekoraenje WDT. Njegov takt koristi se za treptanje LED. Primeujete da je LED povezana tako da svetli pri dovoenju logike 0 na pin, a da joj se napon dovodi direktno sa napajanja! To je bolje zbog manjeg grejanja i potronje. Osim toga PIC pored ogranienja struje po pojedinanim pinovima (20mA) ima i ogranienje struje koju moe dati ceo port (do 50mA za PORTA i do 100mA za PORTB), kao i ogranienje ukupne struje koju prima i kojom moe napajati eksterne potroae (150mA). PIC pri ovakvom povezivanju podnosi do 25mA po pinu, do 80mA za PORTA i do 150mA za PORTB. Za pin RA4 ovo je i jedino mogue reenje, jer on na svom izlazu ne moe dati logiku 1. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. org 0x00 ; ****** Test WDT reseta ****** btfss STATUS,TO goto Led ; ****** Podeavanje porta ****** bsf STATUS,RP0 clrf TRISA clrf TRISA clrf TMR0 ; ****** Podeavanje WDT ****** bcf STATUS,RP0 clrf TMR0 bsf movlw movwf STATUS,RP0 b'10001111' OPTION_REG 54 ; Testiraj stanje TO bita ; Resetovan je, znai WDT reset ; Prebacuje program u BANK1 ; Svi pinovi ; su izlazni. ; Brisanje vrednosti internog tajmera i ; preskalera pri upisu u tajmer, ; Vraa program u BANK0 ; Brisanje vrednosti internog tajmera i ; preskalera pri upisu u tajmer, ; Prebacuje program u BANK1 ; Iskljui Pull-up otpornike i ; izaberi WDT, sa maksimalnim ; vremenom preskalera

clrwdt movlw movwf bcf

b'10001110' OPTION_REG STATUS,RP0

; Obrii WDT ; Izaberi WDT, i postavi odnos ; preskalera od 1,1S ; BANK0

; ****** Inicijalizacija W i prvo prekoraenje WDT ****** clrw ; Obrii W Pet goto Pet ; Mrtva petlja. Vrti se ovde do ; prvog WDT reseta ; ****** Naredna prekoraenja WDT ****** Led xorlw b'00000100' ; Izmeni stanje bita 2 u W movwf PORTA ; Prebaci stanje iz W u PORTA Pet2 goto Pet2 ; Mrtva petlja. Vrti se ovde do ; sledeeg WDT reseta ; ****** Kraj programa ****** end ; Kraj programa. Nakon poetne inicijalizacije program e se vrteti u prvoj mrtvoj petlji. Kako u njoj nema CLRWDT instrukcije, nakon 1,1S nastupie WDT reset. Po resetu program e se izvriti od poetka, ali e deo sa testiranjem TO bita detektovati je li nastupio WDT reset ili ne, i ukoliko jeste dalje izvravanje programa nastavie se od labele Led gde e se izmeniti stanje RA2 pina. Nestabilnost WDT oscilatora usled promene temperature moe biti efektno iskoriena za merenje temperature mikrokontrolera (samim tim i spoljne temperature) bez ikakvih eksternih senzora. Za detalje pogledajte AN828.

55

19. Tajmer
U sluaju da piete program koji mora imati veliku ali tano definisanu pauzu sigurno vam se nee svideti mogunost postavljanja jedne petlje unutar druge i proraunavanja broja ciklusa za eljenu duinu pauze. Postoji elegantniji nain reavanja ovog problema. PIC16F84 ima u sebi integrisan tajmer. Impulsi ovog tajmera mogu biti sinhronizovan sa taktom izvravanja 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 prekoraenja maksimalne vrednosti, flag tajmera se setuje, i ciklus brojanja opet poinje od nule. Prednost tajmera nad obinom petljom za kanjenje je u injenici da je brojanje interni proces mikrokontrolera, i da ni na koji nain ne utie na brzinu izvravanja glavnog programa. Dovoljno je povremeno proveriti stanje flaga tajmera, kako bi program znao da je ciklus brojanja zavren. Kako na ovaj nain nije mogue dobiti vee periode, tajmer isto kao i WDT moe koristiti preskaler. Budui da se za korienje i WDT i internog tajmera preteno vri manipulacija nad OPTION_REG registrom, vreme je da se blie upoznate sa njegovom unutranjom strukturom. bit7 RBPU

INTEDG

T0CS

T0SE

PSA

PS2

PS1

bit0 PS0

NOT_RBPU (eng. Port B Pull Up) bit OPTION_REG registra slui za povezivanje internih otpornika PORTB registra na napon napajanja. Upotrebu INTEDG (eng. Interrupt edge) bita nauiete u sledeem poglavlju. T0CS (eng. Timer0 Clock Select) bit omoguava izbor takta tajmera. Ukoliko je resetovan, brojanje e se odvijati sinhronizovano sa taktom izvravanja instrukcija koji je etiri puta manji od takta oscilatora. Ovaj takt se moe dobiti sa CLKOUT pina mikrokontrolera. Ukoliko je T0CS bit setovan, brojanje e biti sinhronizovano sa eksternim taktom koji se treba dovesti na pin 3 (RA4/T0CKI).

T0SE (eng. Timer0 Source Edge) bit ima smisla jedino pri upotrebi eksternog takta. Njime se bira hoe li se brojanje vriti pri prelasku sa logike 0 na 1 (resetovan T0SE) ili sa logike 1 na 0 (setovan T0SE). PSA (eng. Prescaller Assigment) bit se koristi za selekciju pridruenosti preskalera. Ukoliko je setovan, postskaler e biti pridruen WDT, a ukoliko je resetovan preskaler e biti pridruen tajmeru. Bitovima PS0 do PS2 bira se odnos deljenja preskalera po sledeoj tablici.

56

Bit 2, 1, 0 0, 0, 0 0, 0, 1 0, 1, 0 0, 1, 1 1, 0, 0 1, 0, 1 1, 0, 1 1, 1, 1

TMR0 odnos 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256

WDT odnos 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

Primeujete da se i ovde pominje WDT odnos. On je tu jer se odnos tajmera od 1:1 moe dobiti jedino pridruivanjem preskalera WDT, setovanjem PSA bita. Za takvo podeavanje primenjuje se kd opisan u prolom poglavlju sa instrukcijama oznaenim zvezdicama. Budui da se pri samom programiranju PIC16F84 vri ukljuenje ili iskljuenje WDT (podeavanjem konfiguracionih bitova), ne moe se doi u situaciju da se WDT sam ukljui, i tako izazove reset mikrokontrolera, iako mu je pridruen 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. Vie o ovom registru nauiete u delu sa interaptima. Sledi program koji ilustuje upotrebu tajmera. On e instrukcijski ciklus preskalerom deliti sa 256, zatim softverski jo sa 6, a onda e heksadecimalne brojeve (0x00 do 0x0F) prikazivati na LED displeju. Deljenje sa dva se kao to se seate moe realizovati rotacijom bitova unutar registra. U programu e biti upotrebljen ranije ilustrovani princip prikaza na LED displeju. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove DISP equ 0x0C ; Promenljiva za broj koji se prikazuje ; na displeju (0x00-0x0F) DEL equ 0x0D ; Promenljiva za rotaciju ORG 0x00 ; Definie start programa ; ****** Inicijalizacija tajmera i displeja ****** clrf TMR0 ; Inicijalizacija tajmera clrf INTCON ; Brisanje flaga tajmera bsf STATUS,RP0 ; Prelazak u BANK1 clrf PORTA ; Postavlja sve pinove clrf TRISB ; kao izlazne movlw b'10000111' ; Tajmer je sinhronizovan sa ; instrukcijskim ciklusom, i preskaler je movwf OPTION_REG ; podeen za odnos 1:256 ; Pull up otpornici su iskljueni bcf STATUS,RP0 ; Povratak u BANK0

57

; ****** Inicijalizacija brojaa ****** Ini movlw 0x00 movwf DISP movlw b'00100000' movwf DEL

; Inicijalizacija ; displeja ; Inicijalizacija ; delitelja

; ****** ekanje na prekoraenje tajmera ****** Taj bcf INTCON,T0IF ; Resetovanje flaga tajmera Cek btfss INTCON,T0IF ; ekanje na setovanje flaga tajmera, goto Cek ; odnosno prekoraenje tajmera ; ****** Deljenje sa 6 ****** rrf DEL btfss STATUS,C goto Taj ; Rotiraj DEL registar nadesno. Kada se Carry ; flag setuje, nastavi dalje. Ukoliko i dalje nije ; setovan, ekaj na jo jedan ciklus tajmera.

; ****** Prikaz cifre na displeju ****** call Tabl ; Uzmi obrazac iz tabele, movwf PORTB ; i prikai cifru na displeju. ; ****** Testiranje prekoraenja vrednosti cifre na displeju ****** movlw 0x01 ; .1 u W addwf DISP,F ; Saberi DISP sa W. Rezultat u DISP btfsc STATUS,DC ; Da li je dolo do prekoraenja vrednosti 0x0F? goto Ini ; Jeste, poni brojanje od poetka (cifre 0) goto Taj ; Nije, nastavi dalje sa brojanjem. ; ****** Tabela ****** Tabl movf DISP,W ; U promenljivoj DISP nalazi se vrednost od addwf PCL,F ; 0x00 do 0x0F. Ta vrednost se dodaje na PCL. retlw b'01111110' ; Obrazac za crtanje cifre 0 - 0 retlw b'00001100' ; Obrazac za crtanje cifre 1 - 1 retlw b'10110110' ; Obrazac za crtanje cifre 2 - 2 retlw b'10011110' ; Obrazac za crtanje cifre 3 - 3 retlw b'11001100' ; Obrazac za crtanje cifre 4 - 4 retlw b'11011010' ; Obrazac za crtanje cifre 5 - 5 retlw b'11111010' ; Obrazac za crtanje cifre 6 - 6 retlw b'00001110' ; Obrazac za crtanje cifre 7 - 7 retlw b'11111110' ; Obrazac za crtanje cifre 8 - 8 retlw b'11011110' ; Obrazac za crtanje cifre 9 - 9 retlw b'11101110' ; Obrazac za crtanje cifre A- A retlw b'11111000' ; Obrazac za crtanje cifre B - B retlw b'01110010' ; Obrazac za crtanje cifre C - C retlw b'10111100' ; Obrazac za crtanje cifre D - D retlw b'11110010' ; Obrazac za crtanje cifre E - E retlw b'11100010' ; Obrazac za crtanje cifre F - F ; ****** Kraj programa ****** end ; Kraj programa 58

Moda Vam izgleda udno upotreba sabiranja umesto inkrementovanja registra DISP. Svakako da se njegovo uveanje moglo izvriti i inkrementacijom, ali na ovaj nain lake je nakon poveanja testirati njegovo prekoraenje. Jedino instrukcije sabiranja i oduzimanja menjaju stanje DC flaga, i jedino pri prekoraenjima donjih niblova (tanije vrednosti 0x0F donjeg nibla). Za krae periode mogue je nakon svakog prekoraenja postaviti inicijalnu vrednost tajmera na npr. .100. U tom sluaju tajmer e brojati od .100 do .255, kada e se setovati njegov flag. Isto tako mogue je primeniti drugaiji pristup, pa inicijalizovati TMR0 na .0, i testirati ga na vrednost npr. .100. Povedite rauna o instrukcijama koje koristite za podeavanje tajmera, jer e veina instrukcija ije je odredite TMR0 registar obrisati preskaler.

59

20. Interapti - pojam


Pojam interapta e vam verovatno biti najtei za razumevanje. Ne postoji lak nain za njihovo objanjavanje, ali nadam se da ete pri kraju ove sekcije moi da ih uspeno primenjujete u svojim programima. Interapt je proces ili signal koji prekida izvravanje glavnog mikrokontrolerskog programa i prebacuje njegovo izvravanje na potprogram koji je zaduen za obradu interapta. Po povratku iz potprograma glavni program nastavlja sa radom kao da se nita nije ni dogodilo. Ilustrovau ovo na svakodnevnom primeru. Pretpostavimo da sedite kui i itate ovo uputstvo. Odjednom vam mobilni signalizira prijem SMS poruke. Prekidate itanje, proitate poruku (eventualno i odgovorite), i nastavljate itanje sa mesta na kome ste stali. Moete zamisliti glavni program kao itanje uputstva, zvonjavu mobilnog kao izvor interapta, a proces itanja poruke (i eventualnog odgovora na nju) kao potprogram za obradu intertapta. PIC16F84 ima 4 izvora interapta. Dva eksterna i dva interna. Za sada ete nauiti primenu eksternih izvora, a interni e biti objanjeni kasnije. Ukoliko pogledate oznake izvoda pinova PIC16F84 videete da je na pinu 6 oznaka RB0/INT. Oigledno je da je RB0 ulazno izlazni pin PORTB registra. INT oznaava da se on moe konfigurisati i kao pin eksternog interapta. Pri tome se on ponaa kao mitov okida, to oteava pojavu lanih signala okidanja. Takoe 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. Unutar PIC16F84 nalazi se INTCON (eng. Interrupt Controller) registar na adresi 0Bh. Njegov MSB nazvan je GIE (eng. Global Interrupt Enable). Setovanjem GIE mikrokontroler dozvoljava upotrebu jednog ili vie izvora interapta. Ukoliko je GIE resetovan, korienje bilo kog interapta nije mogue. Njega moete uporediti sa centralnom bravom automobila. Bit 4 INTCON registra nazvan je INTE (eng. RB0/INT Interrupt Enable - ukljui 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 rastuoj (sa 0V na +5V) ili pri opadajuoj ivici (sa +5V na 0V) signala. Drugim reima da li elite da se interapt u mikrokontroleru izazove pri prelasku signala na RB0 pinu sa logike 0 na logiku 1, ili sa logike 1 na logiku 0. Ovo se podeava u OPTION_REG registru na adresi 81h. Setovanje njegovog bita 6 nazvanog INTEDG (eng. Interrupt Edge) prouzrokovae interapt pri rastuoj ivici, a resetovanje pri silaznoj. Kako je naalost OPTION_REG registar u BANK1, treba prei iz BANK0 u BANK1, tamo setovati ili resetovati INTEDG bit OPTION_REG registra, i vratiti se u BANK0. Najpraktinije je ovo podeavanje izvriti uz ostala u toku inicijalizacije mikrokontrolera. Ovim je PIC16F84 podeen za korienje interapta na RB0/INT pina PORTB registra. 60

Ukoliko elite koristiti vie eksternih izvora interapta, moete koristiti pinove RB4 do RB7. Oni se razlikuju od RB0/INT pina u tome to se interapt javlja pri promeni stanja na pinovima. To znai da e se interapt javiti pri prelasku sa logike 0 na logiku 1, ali i sa logike 1 na logiku 0. Podeavanje ovih pinova za izvore interapta vri se setovanjem bita 3 INTCON registra nazvanog RBIE (eng. Po rt B Change Interrupt Enable) ukljui interapte pri promeni stanja na portu B. Kako se kod njih interapt izvrava pri svakoj promeni stanja pinovi RB4 do RB7 nemaju svoj bit za odreivanje ivice signala pri kojoj e se izazivati interapt. Interapt flag Seate li se kako se vri setovanje Carry flaga? Pri nailasku na interapt na RB0/INT pinu na slian nain 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 moe i nee odgovarati na druge interapte. Pretpostavimo da je izazvan interapt. Odgovarajui interapt flag e biti setovan, i mikrokontroler e izvriti potprogram za obradu interapta. Ukoliko interapt flag nije setovan, PIC e prihvatati nove interapte to moe dovesti do neprestanog vraanja programa na poetak rutine za obradu interapta koja se usled toga nikada ne moe izvriti 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 praktinije zavriti sa jednom porukom, i onda dozvoliti prijem novih. Interapt flagovi imaju jo jednu funkciju, a to je omoguavanje interapt rutini detekciju izvora interapta (RB0/INT pin odnosno RB4 do RB7 pinovi) u sluaju korienja vie izvora interapta. Iako PIC automatski setuje interapt flagove pri nailasku interapta, on ih ne resetuje pri povratku iz rutine za obradu interapta. Ovaj posao mora programer sam izvriti (siguran sam da ve znate kako), i treba se odraditi nakon zavretka rutine za obradu interapta, a neposredno pre izlaska iz nje.

Uproen prikaz interne interapt logike 61

Start i interapt vektor programske memorije U trenutku dovoenja napona napajanja ili prilikom reseta, programski broja (PC) pokazuje na adresu 0x00, na poetak programske memorije. Meutim, pri pojavi interapta PC e adresu sledee instrukcije staviti na stek, i skoie na adresu 0x04. Dakle, kada piete programe koji e koristiti interapte, pre svega trebate rei mikrokontroleru da preskoi preko adrese 0x04, i zadri interapt rutinu koja poinje na adresi 0x04 odvojenu od ostatka programa. Ovo se veoma lako implementira. Najpre je potrebno da program standardno zapone direktivom ORG 0x00. Dalje je potrebno preskoiti preko adrese 0x04. Ovo se radi postavljanjem GOTO instrukcije, nakon koje sledi labela pozicionirana za start glavnog programa. Nakon ove goto instrukcije sledi jo jedna ORG direktiva, ovoga puta sa adresom 0x04, a nakon nje rutina za obradu interapta. Na kraju programa za obradu interapta potrebno je staviti RETFIE (eng. Return from interrupt) instrukciju. Ova instrukcija oznaava povratak iz interapt rutine. Kada PIC naie na ovu instrukciju PC uzima sa steka lokaciju na kojoj je PIC bio pre nego to se pojavio interapt. Sledi deo kda koji ilustruje navedeno. org 0x00 goto Main org 0x04 : : : : : : retfie Main ; PIC poinje odavde pri ukljuenju i resetu ; Idi na glavni program ; PIC dolazi ovde pri pojavi interapta ; Ovde se nalazi rutina za obradu interapta koju ; PIC izvrava jedino pri nailasku na interapt. ; Na njenom kraju potrebno je obrisati odgovarajui ; interapt flag. ; Zavretak rutine za obradu interapta ; Poetak glavnog programa

Postoji par stvari na koje trebate obratiti panju prilikom korienja interapta. 1. Ukoliko koristite isti registar u glavnom programu i u rutini za obradu interapta imajte u vidu da e se sadraj tog registra verovatno promeniti pri izvrenju rutine za obradu interapta. Na primer, recimo da koristite W registar da biste poslali podatak na PORTA, i takoe koristite W registar u rutini za obradu interapta za neku drugu operaciju. Ukoliko ne pazite, W registar e pri povratku iz rutine za obradu interapta zadrati vrednost koju je imao u interapt rutini, i pri povratku iz nje, ovaj podatak bie poslat na PORTA umesto vrednosti koju je W registar imao ranije. Reenje ovoga je privremeno uvanje vrednosti W registra u nekom od slobodnih registara, i vraanje njegove stare vrednosti po zavretku interapt rutine. Isto vai i za ostale registre (obino za STATUS) iji sadraj se menja u interapt rutini. 2. Potrebno je obratiti panju na minimalno vreme izmeu dve uzastopne pojave interapta. Ukoliko se za takt mikrokontrolera koristi kvarc od 4MHz, PIC e izvravati instrukcije brzinom od 1S po instrukciji. Ovo vreme naziva se instrukcijskim ciklusom. U tehnikom uputstvu (eng. Datasheet) za PIC 62

3.

4.

5.

6.

7.

8.

navedeno je da se treba ostaviti najmanje 3 do 4 instrukcijska ciklusa (znai bar 3-4S) izmeu 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. Na kraju interapt rutine bit GIE INTCON registra se automatski setuje. Automatsko setovanje GIE bita moe da bude i nedostatak u jednom sluaju, tj. mogue je da instrukcija za resetovanje ovog bita (zabranu svih interapta) u glavnom programu uopte ne bude izvrena. Naime, ukoliko interapt nastupi u trenutku izvravanja instrukcije koja resetuje GIE bit, prvo e ta instrukcija biti zavrena do kraja (resetovae se GIE bit), a zatim e poeti izvravanje 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 zatitili od ove situacije, Microchip preporuuje da se nakon resetovanja GIE bita proveri da li je bit zaista resetovan i da se, ukoliko nije, operacija ponovi. Seate se da se bitovi 4 do 7 na PORTB registru mogu koristiti kao izvori interapta. Ne moete izabrati pojedinane pinove na PORTB za interapte. Dakle, ukoliko ukljuite ove pinove, svi postaju dostupni. U emu je svrha korienja 4 bita kao izvora interapta? Primer moe biti kuni alarm, ija 4 senzora su povezana na pinove na PORTB registru. Bilo koji senzor moe okinuti PIC za ukljuenje alarma, a rutina za alarm je rutina za obradu interapta. Ovo tedi neprekidno testiranje portova, i rastereuje mikrokontroler za druge namene. Naalost njihovim interapt flagom (RBIF INTCON registra) nije mogue izvriti detekciju interapta na pojedinanim pinovima, ve jedino na svim. U sluaju korienja vie izvora interapta mogue 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 otii na rutinu za njegovu obradu, i tamo resetovati samo taj interapt flag. Odmah nakon povratka iz potprograma za obradu interapta, izvrie se interapt izazvan drugim izvorom. Interapt flagovi setuju se bez obzira na stanje GIE bita, kao i pojedinanih dozvola za interapte (kao u programu sa tajmerom). To moe biti iskorieno za detekciju njihovih stanja iz samog programa bez korienja interapta. Naravno, odgovarajui interapt flag je kao i kod interapta potrebno runo resetovati nakon detekcije. Budite oprezni prilikom korienja potprograma unutar interapt rutine. Ukoliko je u glavnom programu stek skoro pun (a bie pri pozivanju potprograma iz potprograma), jo par takvih pozivanja unutar interapt rutine sigurno e izazvati njegovo prekoraenje. Uvek uzmite u obzir najgoru moguu varijantu, tj. da se interapt rutina javlja ba prilikom izvravanja potprograma najvee dubine. Ne pozivajte iz rutine za obradu interapta potprograme koje ve pozivate iz glavnog programa. Ukoliko je to neophodno, prilikom ulaska u interapt rutinu snimite sadraj svih registara modifikovanih u potprogramu, i vratite ih natrag prilikom izlaska iz interapt rutine.

U sledeem poglavlju videete program koji koristi interapte.

63

21. Interapti - program


Preli ste dosta teorije u prolom poglavlju, i dolo je vreme da se upoznate sa programom koji koristi interapte. Program e pri pritiskanju prekidaa brojiti od 0 do 7. Rezultat e se prikazivati na 3 LED na PORTA u binarnom obliku. Sam glavni program e samo prikazivati rezultat, a brojanje i testiranje prekoraenja bie realizovani interapt rutinom.

Najpre se mikrokontroler treba podesiti tako da pri izvravanju programa preskoi deo na koji PC skae pri pojavi interapta. org goto org ; ; ; retfie Main 0x00 Main 0x04 ; Ovde PC dolazi pri ukljuenju i resetu ; Odlazak na glavni program ; Ovde e poeti rutina za obradu interapta ; Rutina za obradu interapta. Upisae se kasnije ; Ova instrukcija oznaava kraj rutine za obradu ; interapta, i vraa PC na glavni program. ; Poetak glavnog programa

Onda je potrebno podesiti PIC za korienje interapta na pinu 6: bsf bsf INTCON,GIE INTCON,INTE ; Global interrupt enable (1 ukljui) ; RB0 Interrupt enable (1 ukljui)

64

Za svaki sluaj potrebno je resetovati interapt flag (nikad ne veruj mikrokontroleru): bcf INTCON,INTF ; Obrii interapt flag

Kako su ovde iskoriene ak 3 instrukcije za menjanje vrednosti samo jednog registra praktinije je u pogledu tednje memorije i brzine izvravanja programa zameniti ih sa dve. movlw movwf b'10010000' INTCON ; bit 7 GIE Global interrupt enable (1 ukljui) ; bit 4 INTE RB0 Interrupt enable (1 ukljui) ; bit 1 INTF Interrupt flag (0 obrii) ; Inicijalizuj INTCON registar

Sada je potrebno podesiti portove. Seate se da zbog korienja RB0 kao interapt pina, on mora biti postavljen kao ulazni; bsf movlw movwf clrf bcf bcf bcf STATUS,RP0 ; Prebacuje nas u BANK1 0x01 ; b'00000001' u TRISB TRISB ; RB0/INT kao ulaz, a ostali kao izlaz TRISA ; Svi pinovi na PORTA su izlazni OPTION_REG,INTEDG ; Interapt se izaziva pri ; opadajuoj ivici signala OPTION_REG,NOT_RBPU ; Ukljueni interni pull up ; otpornici na PORTB STATUS,RP0 ; Povratak u BANK0

Kako interapt elimo izazivati pri opadajuoj ivici signala (sa +5V na 0V) mora se podesiti i INTEDG bit OPTION_REG registra. Takoe su resetovanjem NOT_RBPU bita ukljueni pulll up otpornici. Program e koristiti promenljivu TEMPW za privremeno uvanje W registra dok se izvrava interapt rutina i promenljivu BROJAC za pamenje broja pritisnutih prekidaa. BROJAC e u programu imati sledee vrednosti: bitovi 76543210 00000000 .0 00000001 .1 00000010 .2 00000011 .3 00000100 .4 00000101 .5 00000110 .6 00000111 .7 00001000 .8 - prekoraenje Stoga je najpre potrebno imenovati registre i inicijalizovati vrednost BROJAC registra. TEMPW equ BROJAC equ clrf 0x0C 0x0D BROJAC ; TEMPW na adresi 0x0C ; BROJAC na adresi 0x0D ; Stavi 0x00 u BROJAC 65

Dalje je potrebno u glavnom programu napraviti petlju koja e vrednost promenljive BROJAC neprestano prikazivati na PORTA registru. Pri comf movwf goto BROJAC,W PORTA Pri ; Invertovani BROJAC u W registar (zbog LED) ; a odatle u PORTA ; Vrati se na poetak petlje

Budui da prva pojava interapta nastaje tek kada se program nae 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. U interapt rutini potrebno je najpre sauvati vrednost W registra. movwf TEMPW ; Privremeno uvanje sadraja W registra

Onda je potrebno inkrementovati sadraj BROJAC registra. incf BROJAC,F ; Uveaj registar BROJAC.

Dalje je potrebno proveriti da li je promenljiva BROJAC prekoraila maksimalnu vrednost .7 (b'00000111') i dola do .8 (b'00001000'). Najpraktinije je izvriti testiranje treeg bita BROJAC registra. btfsc clrf ; Testiraj trei bit 00001000 BROJAC registra. ; Ukoliko nije setovan, preskoi sledeu ; instrukciju BROJAC ; Upisi 0x00 u BROJAC ; Ukoliko je BROJAC nakon inkrementacije ; prekoraio maksimalnu vrednost (b'00000111') ; sada je jednak .0 ; Ukoliko nije, sada je inkrementovan. TEMPW,W ; Vrati prethodni sadraj W registra INTCON,INTF ; Obrii INTF dozvoli nove interapte ; Kraj interapt rutine. BROJAC,3

movf bcf retfie

Pogledajte sada celokupan program: ; ****** Inicijalizacija i imenovanje ****** list #include __CONFIG ORG TEMPW BROJAC p=16F84 ; Definie upotrebljeni mikrokontroler <p16F84.inc> ; Ubacuje nazive registra u program _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove ; Definie start programa ; uvanje sadraja W registra na adresi 0x0C ; BROJAC na adresi 0x0D

0x00 equ 0x0C equ 0x0D

66

; ****** Interapt rutina ****** org goto org movwf incf btfsc clrf 0x00 Main 0x04 TEMPW BROJAC,F BROJAC,3 ; Ovde PC dolazi pri ukljuenju i resetu ; Odlazak na glavni program

movf bcf retfie

; Ovde e poeti rutina za obradu interapta ; Privremeno uvanje sadraja W registra ; Inkrementuj BROJAC. ; Testiraj trei bit b'00001000' BROJAC registra. ; Ukoliko nije setovan, preskoi sledeu ; instrukciju BROJAC ; Upisi .0 u BROJAC ; Ukoliko je BROJAC nakon inkrementacije ; prekoraio maksimalnu vrednost (.7) ; sada je .0 ; Ukoliko nije, sada je inkrementovan. TEMPW,W ; Vrati prethodni sadraj W registra INTCON,INTF ; Obrii INTF dozvoli nove interapte ; Kraj interapt rutine.

; ****** Glavni program inicijalizacija ****** Main movlw movwf bsf movlw movwf clrf bcf bcf bcf clrf b'10010000' ; bit 7 GIE Global interrupt enable (1 ukljui) ; bit 4 INTE RB0 Interrupt enable (1 ukljui) ; bit 1 INTF Interrupt flag (0 obrii) INTCON ; Inicijalizuj INTCON registar STATUS,RP0 ; Prebacuje program u BANK1 0x01 ; b'00000001' u TRISB TRISB ; RB0/INT kao ulaz, a ostali kao izlaz TRISA ; Svi pinovi na PORTA su izlazni OPTION_REG,INTEDG ; Interapt se izaziva pri ; opadajuoj ivici signala OPTION_REG,NOT_RBPU ; Ukljueni interni pull up ; otpornici na PORTB STATUS,RP0 ; Povratak u BANK0 BROJAC ; Stavi .0 u BROJAC

; ****** Glavni program petlja ****** Pri comf movwf goto BROJAC,W PORTA Pri ; Invertovani BROJAC u W registar (zbog LED) ; a odatle u PORTA ; Vrati se na poetak petlje

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

Kao to je ranije reeno RA4 pin ne moe na svom izlazu dati logiku jedinicu. U sluaju da se na njega poalje logika 0, ponaae se isto kao i ostali pinovi, a u 67

sluaju jedinice, prei 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 okidaem. To omoguava bolji prijem signala sa prisustvom uma (npr. sa udaljenog senzora). Kako je ovaj program dat samo ilustrativno, njim nije realizovana debouncing rutina. Prilikom pritiskanja prekidaa moete primetiti da se umesto jednog ponekad javi preskok brojeva. Do sada ste nauili 32 instrukcije. Verovatno i sami uoavate da Vam sada vei problem od uenja novih instrukcija predstavlja uenje funkcija registara specijalne namene. U registare koje ste u potpunosti nauili spadaju PORTA, TRISA, PORTB, TRISB, PCL, PCLATH, TMR0 i OPTION_REG. To je osam potpuno i dva delimino (STATUS i INTCON) nauena registra. Sledi jo jedan deo sa interaptima, a onda neto novo.

68

22. Tajmerom izazvani interapti


Seate li se tajmera. Malo je nepraktino sve vreme ekati na promenu njegovog flaga. Praktinije bi bilo da mikrokontroler za vreme brojanja tajmera obavlja neku drugu operaciju a da se pri setovanju njegovog flaga izvri interapt rutina. Pogaate, mogue je. Pre nego to nauite kako se to moe ostvariti, upoznaete se sa internom strukturom INTCON registra. bit7 GIE

EEIE

T0IE

INTE

RBIE

T0IF

INTF

bit0 RBIF

GIE (eng. Global Interrupt Enable) omoguava ili zabranjuje upotrebu svih interapta. Njegovim setovanjem, dozvoljena je upotreba interapta. Setovanjem EEIE (EEPROM Interrupt Enable) omoguen je zavretak snimanja u EEPROM kao izvor interapta. Setovanjem T0IE (eng. Timer0 Interrupt Enable) bita tajmer je upotrebljen kao izvor interapta. INTE (eng. RB0/INT INTerrupt Enable) bit setovanjem dozvoljava korienje RB0 pina mikrokontrolera kao izvora interapta. Setovanjem RBIE (eng. Port B Change Interrupt Enable) bita, omoguena je upotreba PORTB registra kao izvora interapta pri promeni logikog stanja na RB4 do RB7 pinovima. T0IF (eng. Timer0 Interrupt Flag) bit setuje se pri prekoraenju tajmera. INTF (eng. Interrupt Flag) bit setuje se pri dolasku odgovarajueg logikog nivoa (odabranog INTEDG bitom OPTION_REG registra) na RB0 pin mikrokontrolera. RBIF (eng. Port B Interrupt Flag) setuje se pri promeni logikog stanja na pinovima RB4 do RB7.

Interapt flagovi se ne resetuju automatski nakon oitavanja. Da bi se dozvolili novi interapti, neophodno je resetovati eljeni flag pre izlaska iz interapt rutine. Da bi se tajmer upotrebio kao izvor interapta, dovoljno je dozvoliti njegovo korienje setovanjem GIE i T0IE bitova, i resetovanjem njegovog flaga. Sva podeavanja vezana za obian tajmer (preskaler, eksterni takt) vae i u ovom sluaju. Kako je u interapt potprogramima uglavnom neophodno uvati stanje STATUS registra posebna panja mora se obratiti na instrukcije koje prilikom njegovog vraanja ne utiu (iznova) na promenu njegovog stanja kao to npr. MOVF instrukcija 69

moe uticati na izmenu Zero flaga. Zbog toga se preporuuje upotreba SWAPF instrukcije. Swapf (eng. Swap F - zameni) instrukcija menja mesta gornjem i donjem niblu u registru. bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

bit3

bit2

bit1

bit0

bit7

bit6

bit5

bit4

Sintaksa instrukcije je swapf f,d pri emu je f registar nad kojim se izvrava operacija, a sa d je odreeno odredite rezultata operacije. Sledi program koji ilustruje upotrebu 3 nezavisna dela. Elektrina 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. Treim delom e se tajmerom izazivati interapt koji e menjati stanje LED3. Ova tri dela su samo uslovno nezavisna. Interapt potprogram troi vreme potrebno za izvravanje svojih instrukcija, pa e u zavisnosti od brzine izvravanja interapt potprograma (i brzine njenog pojavljivanja) glavni program raditi sporije. Meutim, interapt rutina se uglavnom pravi tako da njeno trajanje bude to krae, pa tako njeno izvravanje ne utie u velikoj meri na brzinu glavnog programa. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove ORG 0x00 ; Definie start programa cblock 0x0C TEMPW ; uvanje sadraja W registra TEMPSTATUS ; uvanje sadraja STATUS registra BROJAC1 ; BROJAC1. Inicijalno 0xFF BROJAC2 ; BROJAC2. Inicijalno 0xFF BROJAC3 ; BROJAC3. Inicijalno 0xFF SPORTA ; Shaddow registar za PORTA endc ; ****** Interapt rutina ****** org goto org movwf 0x00 Main 0x04 TEMPW ; Ovde PC dolazi pri ukljuenju i resetu ; Odlazak na glavni program ; Ovde e poeti rutina za obradu interapta ; uvanje sadraja W registra u TEMPW 70

swapf movwf movf

STATUS,W TEMPSTATUS SPORTA,W

; STATUS sa okrenutim niblovima u W ; i zatim u TEMPSTATUS registar ; Shaddow registar u W

; ****** Test interapta izazvanog prekidaem ****** btfss INTCON,INTF ; Interapt izazvan prekidaem? goto Taj ; Nije, idi na deo za tajmerski interapt. ; ****** Rutina za obradu interapta izazvanog prekidaem ****** xorlw b'00000010' ; Promeni stanje bita za LED2 u W ; ****** Izlazak iz interapt rutine izazvane prekidaem ****** call Vrat ; Updatuj PORTA i SHADDOW i ; Vrati stanja W i STATUS registra bcf INTCON,INTF ; Dozvoli nove interapte prekidaa retfie ; Povratak iz interapt rutine. ; ****** Update PORTA i SHADDOW i vraanje ****** ; ****** originalnog stanja W i STATUS registra ****** Vrat movwf PORTA ; Kopiraj W u PORTA movwf SPORTA ; Kopiraj W u Shaddow registar swapf TEMPSTATUS,W ; TEMPSTATUS sa okrenutim niblovima ; u W. Dva puta okrenuti niblovi daju movwf STATUS ; prvobitno stanje koje ide u STATUS swapf TEMPW,F ; Jednom okreni niblove u samom ; TEMPW registru, swapf TEMPW,W ; a drugi put sa W kao odreditem. return ; Kraj potprograma. ; ****** Rutina za obradu interapta izazvanog tajmerom ****** Taj decfsz BROJAC3,f ; Smanji BROJAC3. xorlw b'00000100' ; Promeni stanje bita za LED3 u W ; Gornja instrukcija izvrava se u svim sluajevima kada je vrednost BROJAC3 ; registra od .1 do .255. Kako je i naredna instrukcija ista, dva puta XOR-ovana ; vrednost daje originalno stanje W registra (kao pre XOR operacije). ; Kada je BROJAC3 = 0 gornja instrukcija ona se preskae i izvrava se samo ; jedna (naredna) XOR operacija, koja prouzrokuje eljenu promenu stanja bita. xorlw b'00000100' ; Promeni stanje bita za LED3 u W. ; Ova instrukcija se uvek izvrava.

; ****** Izlazak iz interapt rutine izazvane tajmerom ****** call Vrat ; Updatuj PORTA i SHADDOW i ; vrati stanja W i STATUS registra bcf INTCON,T0IF ; Dozvoli nove interapte tajmera retfie ; Povratak iz interapt rutine.

71

; ****** Glavni program inicijalizacija ****** Main bsf movlw movwf clrf movlw STATUS,RP0 ; Prebacuje program u BANK1 0x01 ; b'00000001' u TRISB TRISB ; RB0/INT kao ulaz, a ostali kao izlaz TRISA ; b'00000' u TRISA, svi pinovi PORTA su izlazni b'00000111' ; T0CS=0 - Tajmer je sinhronizovan sa ; instrukcijskim ciklusom ; Preskaler - PSA=111 je podeen za odnos 1:256 ; INTEDG=0 - Interapt se izaziva pri ; opadajuoj ivici signala (sa 1 na 0) ; NOT_RBPU=0 - Ukljueni interni pull up ; otpornici na PORTB OPTION_REG ; STATUS,RP0 ; Povratak u BANK0 TMR0 ; Inicijalizacija tajmera SPORTA ; Inicijalizacija Shaddow registra b'10110000' ; bit 7 GIE Global interrupt enable (1 ukljui) ; bit 4 INTE RB0 Interrupt enable (1 ukljui) ; bit 1 INTF Interrupt flag (0 obrii) ; bit 5 T0IE Timer interrupt enable (1 ukljui) ; bit 2 T0IF Timer interrupt flag (0 obrii) INTCON ; Inicijalizuj INTCON registar

movwf bcf clrf clrf movlw

movwf

; ****** Glavni program treptanje LED1 ****** Poc bcf INTCON,GIE ; Zabrani nove interapre btfsc INTCON,GIE ; Proveri jesu li interapti zaista zabranjeni goto Poc ; Nisu, zabrani ih opet. movf SPORTA,W ; SHADDOW u W xorlw b'00000001' ; Promeni stanje bita za LED1 u W movwf PORTA ; Kopiraj W u PORTA movwf SPORTA ; Kopiraj W u Shaddow registar bsf INTCON,GIE ; Dozvoli nove inerapte call Pet ; Ubaci kanjenje goto Poc ; Vrati se na poetak ; ****** Potprogram za kanjenje od oko 0,2S ****** Pet decfsz BROJAC1,F ; Ove dve petlje slue za brojanje nadole od goto Pet ; 255 do 0, 255 puta, omoguavajui nam da decfsz BROJAC2,F ; moemo videti kako LED1 treperi goto Pet return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa

Moete se zapitati zato su upotrebljene dve swapf instrukcije pri vraanju TEMPW u W, kada se isto moglo realizovati i movf TEMPW,W instrukcijom. Razlog je taj to e mowf instrukcija setovati Zero flag u sluaju da je u W bila vrednost 0x00, dok je 72

swapf instrukcija neutralna prema svim flagovima. Slino vai i za STATUS registar. Ukoliko je odredite instrukcije koja menja stanje flagova STATUS registra sam STATUS registar, njegovi flagovi postavie se u zavisnosti od rezultata instrukcije, bez obzira na stanje bajta koji elimo poslati u njega. U delu sa testiranjem interapta moete primetiti da je testiran samo interapt flag prekidaa. To je sasvim normalno, jer neto mora da je izazvalo interapt kada se ve ulo u interapt rutinu. Ukoliko to nije bio prekida, onda je sigurno bio tajmer Ukoliko su oba interapta nastupila istovremeno (setovana oba interapt flaga), najpre e se izvriti interapt rutina prekidaa, ali po povratku iz interapt potprograma odmah e se izazvati novi interapt jer je interapt flag tajmera i dalje setovan. Sigurno ste u delu za obradu tajmerskog interapta uoili neobinu realizaciju kanjenja. Ono se moralo izvesti na taj nain (u prolazu) jer se ne sme dozvoliti da preveliko kanjenje interapt potprograma koi izvrenje glavnog programa. U glavnom programu interapti su privremeno zabranjeni da se stanje SPORTA registra ne bi promenilo interapt rutinom za vreme njegove promene od strane glavnog programa. Testiranje zabrane svih interapta takoe je neophodno (pogledajte napomene uz interapte). Dosta je bilo interapta. Sledi neto sasvim drugaije.

73

23. Indirektno adresiranje


Seate li se tabele? Kod nje je skok na eljenu lokaciju izvren sabiranjem PCL sa W. Neto slino ali u odnosu na registre, mogue je postii korienjem FSR i INDF registra. INDF registar nije fiziki registar. Njegovo adresiranje u stvari adresira registar ija adresa je sadrana u FSR registru (FSR je pointer adrese eljenog registra). Takav postupak naziva se indirektno adresiranje. Pretpostavite da PORTA sadri vrednost 0x03, a PORTB 0x2B. Ukoliko u FSR ubacite adresu PORTA registra (0x05), i proitate sadraj registra INDF, dobiete vrednost 0x03. Ukoliko sada inkrementujete FSR, on e ukazivati na PORTB (0x06). Sada e oitavanje vrednosti iz INDF registra vratiti vrednost 0x2B. Isto tako je mogue i upisivanje podataka u eljene registre. Sledei program ilustruje upisivanje vrednosti 0x00 u registre od 0x20 do 0x2F. movlw movwf clrf incf btfss goto b'00100000' ; Inicijalizacija pointera FSR ; na registar 0x20 INDF ; Indirektno brisanje eljenog registra FSR,F ; Pozicioniranje pointera na sledei registar FSR,4 ; Prekoraenje? 0x30 = b'00110000' Pet ; Nije, nastavi sa brisanjem

Pet

; Jeste, nastavak programa. Za razliku od tabele, zbog malog broja registara kod upotrebe indirektnog adresiranja nema ogranienja u smislu blokova podataka (bar kod PIC16F84 mikrokontrolera kod mikrokontrolera sa veim brojem registara ovo nije sluaj). Indirektno adresiranje se u programima najee upotrebljava jedino u sluaju vee koliine podataka. Do sada ste nauili 33 od 35 instrukcija, potpunu upotrebu deset registra i deliminu upotrebu dva registra od ukupno 15. Preli ste najvei (i najtei interapti) deo gradiva, meutim ima se jo mnogo toga nauiti.

74

24. EEPROM memorija


Zamislite da imate PIC koji preko sistema fotoelija broji posetioce koji su uli kroz ulazna vrata banke, kao i one koji su izali kroz izlazna vrata, i na osnovu broja lica u banci regulie rad senzora pokreta, osvetljenja i klima ureaja. Kako ne biste eleli da ita prepustite sluaju, mikrokontroler radi sa ukljuenim WDT. Meutim, elektrodistribucija se postara da ne bude sve tako idealno i odjednom nestane struje. Kako banka ne bi bila banka ukoliko nema neku rezervu, 2 sekunde nakon nestanka struje ukljuuje se elektroagregat (to ne spreava reset kompjutera i zabrinuto Jao doite kasnije, ne rade nam terminali), i PIC (koji se takoe resetovao) kree sa radom inicijalizujui u svom brojau 1 osobu (u normalnom radu onoga ko prvi dolazi na posao). Nakon to se broj osoba u banci smanji za 1 osobu (to moe nastati i mnogo kasnije, jer su klijenti banke uli da je legla plata), prestaju da rade klima ureaji i osvetljenje, a senzori pokreta ukljuuju alarm i dojavljuju pljaku banke policiji. Znam znam. Jedan manji akumulator ili UPS reio bi problem. Ali direktor banke ni da uje. To direktno poskupljuje projekat. Pa nije valjda dabe kupio agregat! U ovom sluaju potrebno je da PIC i nakon nestanka napona napajanja zapamti vrednost promenljive BROJAC (ili vie promenljivih ukoliko je broj osoba koje mogu stati u prostoriju vei od 255). Po dolasku napona napajanja ove vrednosti trebaju se proitati, i prebaciti u odgovarajue registre. Unutar PIC16F84 nalazi se 64 bajta EEPROM memorije (0x000x3F). Za razliku od registara koji su obina RAM memorija, ova memorija zadrava svoje stanje i nakon nestanka napona napajanja mikrokontrolera. Naalost zbog fizikih osobina EEPROM memorije rad sa njom nije ni izdaleka tako jednostavan kao rad sa obinim 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 vri preko EECON1 (eng. EEPROM Controller1) i EECON2 (eng. EEPROM Controller2) registra. Pre nego to nauite itanje i snimanje u EEPROM, upoznajte internu strukturu EECON1 registra. bit7 /

EEIF

WRERR

WREN

WR

bit0 RD

Bitovi 5 do 7 se ne koriste u EECON1 registru. Trebaju biti na logikoj nuli. EEIF (eng. EEPROM Interrupt Flag) bit predstavlja flag interapta izazvanog zavretkom procesa snimanja bajta. Ovaj interapt moe se dozvoliti setovanjem EEIE (eng. EEPROM Interrupt Enable) bita INTCON registra. Potrebno ga je runo 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 moe 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 dovriti proces snimanja (sadraj EEADR i EEDATA registra ne menja se nakon reseta). WREN (eng. Write Enable) bit mora biti setovan, da bi bio mogu upis u EEPROM. WR (eng. Write) bit koristi se za iniciranje upisa u EEPROM memoriju. RD (eng. Read) bit koristi se za iniciranje itanja iz EEPROM memorije.

Pogledajte najpre primer itanja memorijske adrese 0x10 iz EEPROM memorije. bcf movlw movwf bsf bsf bcf movf STATUS,RP0 0x10 EEADR STATUS,PR0 EECON1,RD STATUS,RP0 EEDATA,W ; Prebacuje nas u BANK0 zbog EEADR ; elimo proitati sadraj EEPROM ; memorije sa adrese 0x10 ; Prebacuje nas u BANK1 ; Inicira proces itanja ; EEPROM memorije ; Prebacuje nas u BANK0 ; Sadraj bajta sa adrese 0x10 ; iz EEPROM memorije je u EEDATA, ; odakle se moe prebaciti u W

Ovaj program trebao bi da Vam je u potpunosti jasan. Setovanjem RD bita iniciran je proces itanja, a zatim se RD bit automatski nakon itanja vraa na 0. Podatak iz EEPROM memorije dostupan je u EEDATA registru odmah u narednom instrukcijskom ciklusu, odakle je premeten u W registar. Pogledajte sada kako je realizovano snimanje bajta 0x24 u EEPROM adresu 0x10. bcf movlw movwf movlw movwf bsf bcf bsf movlw movwf movlw movwf bsf bsf bcf STATUS,RP0 0x24 EEDATA 0x10 EEADR STATUS,RP0 INTCON,GIE EECON1,WREN 0x55 EECON2 0xAA EECON2 EECON1,WR INTCON,GIE EECON1,WREN ; Prebacuje nas u BANK0 ; Bajt za snimanje ; u EEDATA ; na adresu ; 0x10 ; Prelaz u BANK1 zbog EECON1 ; Zabrana svih interapta (ukoliko ih ima) ; Dozvola pisanja u EEPROM ; ; ; Inicijalizacija upisa u EEPROM ; ; ; Dozvola interapta (ukoliko se koriste) ; Zabrana daljeg pisanja u EEPROM 76

Snimanje u EEPROM nee se inicirati ukoliko nije tano ispotovana procedura (0x55 u EECON2, 0xAA u EECON2, setovan WR) i to bez pauza (otud zabrana interapta) za svaki pojedinani bajt. Microchip navodi da je ta procedura uvedena kako bi se spreio nehotian upis u EEPROM zbog moguih greaka u programu. Iz istog razloga WREN bit je potrebno drati setovanim jedino za vreme upisa u EEPROM. WR bit se automatski resetuje po zavretku upisa. U sluaju serijskog snimanja podataka u EEPROM, potrebno je pre sledeeg snimanja proveriti stanje ovog bita, kako se ne bi desilo iniciranje novog upisa u EEPROM a da prethodno snimanje jo nije zavreno. To je obavezno, jer snimanje u EEPROM nije sinhronizovano sa instrukcijskim ciklusom, ve se za upis u EEPROM koristi poseban interni oscilator, koji odreuje vreme upisa od oko 10mS. Kod itanja podataka iz EEPROM memorije nema ovakvih problema. Umesto testiranja flaga mogue je i jednostavno saekati dovoljno dugo (npr. 12mS). Moda 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 sluaju korupcije EEPROM memorije PIC ni nakon reseta ne bi mogao nastaviti sa normalnim radom. Morao bi se odlemiti sa tampane ploice i ponovo programirati (u mikrokontroler se sa programom snima i sadraj EEPROM memorije). U sledeem poglavlju upoznaete se sa programom koji koristi EEPROM memoriju i nauiete upotrebu EEIF bita i proces upisa podataka u EEPROM iz samog asemblera. Na taj nain se sadraj EEPROM memorije moe uvati zajedno sa programom u jednom .asm ili .hex fajlu.

77

25. EEPROM i interapti


Seate li se onog tekog? Da, interapta. U njihovim osnovnim podacima navedeno je da se mogu koristiti 4 izvora interapta. Dva hardverska (eljena promena stanja na INT pinu i promena stanja na pinovima RB4-RB7) i dva softverska (prekoraenje tajmera i zavretak slanja podatka u EEPROM). Ima li svrhe koristiti zavretak slanja podatka u EEPROM kao izvor interapta? Teko. Sav proces moe se zavriti linijskim kdom. Opravdanje njenog korienja moe se nai u vremenski kritinim programima kod kojih je potrebno za vreme snimanja u EEPROM izvravati druge operacije, kako mikrokontroler ne bi gubio vreme ekajui (ak 10mS) na zavretak snimanja. Bolje je da program umesto ekanja na zavretak upisa u EEPROM radi neto 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 iskljuenju napona napajanja i njegovom ponovnom dovoenju, na LED displeju nai e se poslednja zapamena vrednost (to je i bio cilj u primeru sa bankom). Glavni program imae jedino funkciju uitavanja i snimanja trenutnih vrednosti u EEPROM, a interapt rutinom e se realizovati sve ostalo (test prekidaa, smanjenje broja, prikaz na displeju). Kod ovakvog programa oigledno je da interapt rutina traje daleko due od samog glavnog programa. To se ovde moe tolerisati. Elektrina ema je ista kao u delu sa tabelama. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove cblock 0x0C TEMPW ; Privremeno uvanje W registra TEMPSTATUS ; Privremeno uvanje STATUS registra BROJAC ; Broja za bebouncing pauzu. Inicijalno 0xFF DISP ; Broj koji se prikazuje na endc ; displeju i snima (0x09 0x00) ; ****** Inicijalizacija vrednosti u EEPROM memoriji ****** org 21x00 ; Poetak EEPROM memorije de 0x00 ; Inicijalizacija poetne vrednosti na ; displeju ; ****** Interapt rutina uvanje sadraja registra ****** org goto org movwf swapf movwf 0x00 Main 0x04 TEMPW STATUS,W TEMPSTATUS ; Ovde PC dolazi pri ukljuenju i resetu ; Odlazak na glavni program ; Ovde e poeti interapt rutina ; uvanje sadraja W registra u TEMPW ; STATUS sa okrenutim niblovima u W ; i zatim u TEMPSTATUS registar 78

; ****** Test prekidaa ****** bcf STATUS,RP0 Cek1 btfss goto goto btfss goto Cek2 btfsc goto goto btfsc goto PORTB,0 Cek1 Pau PORTB,0 Cek1 PORTB,0 Cek2 Pau PORTB,0 Cek2

; Povratak u BANK0 u glavnom ; programu pre skoka na interapt rutinu ; program se izvravao u BANK1 ; Testiranje otputenosti prekidaa ; Nije otputen ; Jeste otputen. Idi na pauzu. ; Jo jedno testiranje zbog imunosti na ; eventualna varnienja kontakta. ; Testiranje pritisnutosti prekidaa ; Nije pritisnut ; Jeste pritisnut. Idi na pauzu. ; Jo jedno testiranje zbog imunosti na ; eventualna varnienja kontakta.

; ****** Prikaz cifre na displeju ****** movf DISP,W ; DISP u W call Tabl ; Uzmi obrazac iz tabele, movwf PORTB ; i prikai cifru na displeju. ; ****** Testiranje prekoraenja vrednosti cifre na displeju ****** decf DISP,F ; Smanji DISP za 1. Rezultat u DISP btfss DISP,7 ; Testiraj MSB. On e biti 1 jedino ukoliko je ; dolo do prekoraenja sa 0x00 na 0xFF goto Povr ; Nije, izai iz interapt rutine movlw 0x09 ; Jeste, inicijalizuj brojac na movwf DISP ; vrednost 0x09 Povr swapf movwf swapf swapf bcf retfie TEMPSTATUS,W STATUS TEMPW,F TEMPW,W EECON1,EEIF ; TEMPSTATUS sa okrenutim niblovima ; u W. Dva puta okrenuti niblovi daju ; prvobitno stanje koje ide u STATUS ; Jednom okreni niblove u samom ; TEMPW registru, ; a drugi put sa W kao odreditem. ; Dozvola novih interapta ; Kraj interapt rutine.

; ****** Glavni program inicijalizacija ****** Main bsf STATUS,RP0 ; Prebacuje program u BANK1 bcf EECON1,EEIF ; Reset interapt flaga movlw b'11000000' ; GIE=1 Global interrupt enable movwf INTCON ; EEIE=1 EEPROM interrupt enable movlw b'00000000' ; NOT_RBPU=0 - Ukljueni interni movwf OPTION_REG ; pull up otpornici na PORTB movlw 0x01 ; b'00000001' u TRISB movwf TRISB ; RB0/INT kao ulaz, a ostali kao izlaz clrf TRISA ; Svi pinovi na PORTA su izlazni bcf STATUS,RP0 ; Povratak u BANK0

79

; ****** itanje iz EEPROM memorije ****** movlw 0x00 ; elimo proitati sadraj 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 ; Sadraj bajta sa adrese 0x00 iz ; EEPROM memorije u W ; ****** Inicijalizacija brojaa i LED displeja ****** movwf DISP ; Inicijalizacija brojaa call Tabl ; Uzmi obrazac iz tabele i movwf PORTB ; Prikai cifru na displeju ; ****** Snimanje u EEPROM ****** Gla movf DISP,W movwf EEDATA movlw 0x00 movwf EEADR bsf STATUS,RP0 bsf EECON1,WREN movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR Kraj btfss goto EECON1,WR Kraj ; DISP u W ; pa u EEDATA ; na adresu ; 0x00 ; Prebacuje nas u BANK1 zbog EECON1 ; Dozvola pisanja u EEPROM ; ; ; Otkljuavanje upisa u EEPROM ; ; ; Test zavretka snimanja

; U ovom trenutku snimanje je zavreno pa se interapt flag setuje i nastaje interapt. U interapt rutini ekae se na pritisak prekidaa, smanjie se vrednost na displeju i tek onda e se izai iz nje i nastaviti dalji program. bcf bcf goto EECON1,WREN STATUS,RP0 Gla ; Zabrana pisanja u EEPROM ; Povratak u BANK0 ; Povratak na poetak programa

; ****** Tabela ****** Tabl movf DISP,W ; U promenljivoj DISP nalazi se vrednost od addwf PCL,f ; .0 do .9. Ta vrednost se dodaje na PCL. retlw b'01111110' ; Obrazac za crtanje cifre 0 - 0 retlw b'00001100' ; Obrazac za crtanje cifre 1 - 1 retlw b'10110110' ; Obrazac za crtanje cifre 2 - 2 retlw b'10011110' ; Obrazac za crtanje cifre 3 - 3 retlw b'11001100' ; Obrazac za crtanje cifre 4 - 4 retlw b'11011010' ; Obrazac za crtanje cifre 5 - 5 retlw b'11111010' ; Obrazac za crtanje cifre 6 - 6 80

retlw retlw retlw

b'00001110' b'11111110' b'11011110'

; Obrazac za crtanje cifre 7 ; Obrazac za crtanje cifre 8 ; Obrazac za crtanje cifre 9 -

7 8 9

; ****** Pauza zbog debouncing rutine ****** Pau decfsz BROJAC,F ; Pauza zbog debouncing goto Pau ; rutine return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa

Prilikom snimanja kda u PIC16F84 mora se sadraj memorijske adrese 0x00 u EEPROM memoriji podesiti na proizvoljan broj izmeu 0x00 i 0x09. U protivnom e mikrokontroler uzeti inicijalno stanje iz EEPROM memorije (0xFF) i pri nailasku na tabelu izvravanje programa e se nastaviti za 245 bajtova iza same tabele, to e izazvati nepravilan rad (tanije resetovanje) mikrokontrolera. To je u programu uinjeno upotrebom DE (eng. Define EEPROM) direktive. Njom se jedan (ili vie) bajtova smetaju u EEPROM. Budui da je za nju potrebno prethodno definisati poetak upisa u EEPROM memoriju (org direktivom i adresama od 21x00 do 21x3h), najpraktinije je staviti je ispred ili iza programa, kako se ne bi desilo da se i program grekom upie u EEPROM. Pri smetanju vie bajtova u EEPROM, moete bajt po bajt iza DE direktive odvojiti zarezom, ovako: de 0x05, 0xA8, 0x79... Iako izgleda da je EEPROM na neki nain produetak programske memorije, razlika svakako postoji. U EEPROM memoriji nije mogue izvravati programe, isto kao to se ni iz programa ne moe itati (a ni menjati) sadraj programske memorije (bar kod PIC16 serije). Moda ste primetili da u rutini za snimanje u EEPROM nije izvrena zabrana korienja svih interapta resetovanjem GIE bita. Ukoliko bi se interapti zabranili, program ne bi skoio na interapt rutinu, i neprestano bi se vrteo u petlji snimajui jedan isti bajt u EEPROM adresu 0x00. Ukoliko bi se ovo dovoljno dugo ponavljalo, ova EEPROM adresa bi se usled starenja pokvarila (kao ogrebotina na DVD disku). Jedna EEPROM memorijska lokacija moe se menjati do 1 milion puta. Sve preko ove vrednosti poveava verovatnou nastupa kvara adrese. Naravno, ukoliko se koristi vie izvora interapta, ostali bi se morali privremeno zabraniti. Budui da ete se u iduem poglavlju upoznati sa uspavanim stanjem mikrokontrolera, vreme je da nauite jednu lenju instrukciju. To je NOP (eng. No Operation). Ova instrukcija, osim to traje jedan instrukcijski ciklus ne radi nita korisno. Kada program mikrokontrolera naie na nju, utroie jedan instrukcijski ciklus nizata. Prei e preko nje, kao da je nema. Uglavnom se koristi u situacijama kada je potrebno realizovati tano odreeno, ili kratko kanjenje (npr. u petljama kanjenja ili debouncing rutini).

81

26. Sleep mod - pojam


Pretpostavimo da elite napraviti hidroelektranu. Da biste proverili da li reka ima dovoljan protok vode tokom cele godine, odluili ste da merite njen nivo mikrokontrolerom, i da prikupljene podatke povremeno (po popuni EEPROM memorije) prebacujete u laptop. Kako na reci nema elektrine mree, mikrokontroler se napaja iz akumulatora. Negativni pol akumulatora (masa) spojen je sa rekom, a oitavanje nivoa vode se vri interaptom pri promeni stanja na pinovima RB4 do RB7, koji su povezani sa odgovarajuim sondama na po 5cm dubine. Kada je nivo vode ispod najnie sonde, na svim pinovima je logika 1 (ukljueni su interni pull up otpornici). Kada je nivo vode iznad najvilje, voda se ponaa kao provodnik izmeu mase i sondi, tako da je na svim pinovima logika 0. Mikrokontroler je povezan sa digitalnim asovnikom i dodatnom EEPROM memorijom, koji mu omoguavaju memorisanje tanog trenutka rasta ili opadanja nivoa vode. Oigledno je da u aktivnom stanju mikrokontroler radi samo povremeno (u trenutku poveanja ili smanjenja nivoa vode), i veoma kratko (vreme potrebno za itanje tanog vremena iz sata, i upis vremena i nivoa vode u EEPROM memoriju). Kako e tokom 24h najverovatnije nastupiti jedan period plime i oseke, to iznosi samo oko 8 merenja dnevno. Preostalo vreme mikrokontroler e se vrteti u praznoj petlji ekajui na interapt, i bespotrebno troei struju iz akumulatora. SLEEP spavajui mod predstavlja stanje u kojem se mikrokontroler nalazi u reimu smanjene potronje energije. U SLEEP modu blokira se rad glavnog oscilatora. Instrukcije se prestaju izvravati, tajmer prestaje sa radom, a WDT se (ukoliko je ukljuen) resetuje (ali nastavlja sa radom zbog sopstvenog oscilatora). Portovi zadravaju svoja stanja (izlaz 0, izlaz 1 ili ulaz stanje visoke impedanse). Za najmanju moguu potronju potrebno je projektovati spoljna elektronska kola tako da ne vuku struju iz izlaznih pinova portova, i da ulazne pinove postave na stabilan logiki nivo (0 ili 1). RA4/T0CKI pin bi takoe trebao biti na stabilnom nivou (ne bi smeo biti izlazni sa logikom 1 jer je ne moe dati). Napon napajanja mikrokontrolera moe se spustiti i do 1,5V bez gubitka podataka. Potronja mikrokontrolera pada sa oko 2mA na oko 5A. Ukoliko Vam je potronja struje izuzetno bitna, moete kupiti verzuju mikrokontrolera specijalno napravljenu za rad sa to manjom potronjom struje. U SLEEP mod ulazi se SLEEP instrukcijom, a iz njega se mikrokontroler moe probuditi na tri naina. 1. Dovoenjem logike nule na MCLR pin mikrokontrolera, to prouzrokuje reset mikrokontrolera. Vie o resetu, u iduim poglavljima. 2. Resetom preko isteka vremena WDT. 3. Interaptom na RB0/INT pinu, interaptom pri promeni stanja na PORTB registru, bitovima 4 do 7, ili interaptom izazvanim zavretkom upisa u EEPROM. 82

Interapt izazvan tajmerom ne moe se koristiti za buenje iz SLEEP moda, jer je u SLEEP modu i tajmer uspavan. Ulaskom u SLEEP mod, menja se stanje odreenih bitova STATUS registra. Vreme je da napokon prouite i njegovu unutranju strukturu. bit7 /

RP0

TO

PD

DC

bit0 C

Bitovi 7 i 6 ne koriste se u PIC16F84. Trebaju biti u stanju logike 0. Bit 5 (RP0) koristi se kod direktnog adresiranja za izbor banke podataka po sledeem : 0 - BANK0 0x00-0x7F 1 - BANK1 0x80-0xFF TO (eng. Time-Out) prekoraenje vremena bit je na stanju logike 0 nakon isteka WDT, a u stanju logike 1 po dolasku napona napajanja, i izvrenju CLRWDT ili SLEEP instrukcije. Na osnovu stanja ovog bita program moe detektovati da je reset mikrokontrolera nastao usled prekoraenja WDT. PD (eng. Power-Down) bit postavlja se na 1 po dolasku napona napajanja ili izvrenju CLRWDT instrukcije, a na 0 po izvrenju SLEEP instrukcije. Logika jedinica na Zero nultom bitu pokazuje da je rezultat zadnje aritmetike ili logike operacije jednak 0. Logika nula na ovom bitu ukazuje da je rezultat razliit od 0. DC (eng. Digit Carry/borrow) bit bit prekoraenja/pozajmice cifre indikuje prekoraenje ili pozajmicu donjem niblu nastalu zbog izvravanja instrukcija sabiranja ili oduzimanja. Logika jedinica na C (eng. Carry/borrow) bitu bitu prekoraenja/pozajmice ukazuje da je dolo do prekoraenja ili pozajmice u bajtu nad kojim su se izvrile operacije sabiranja, oduzimanja ili rotacije.

Kao to vidite iz samog STATUS registra, izvrenje SLEEP instrukcije prouzrokuje resetovanje PD bita i setovanje TO bita. Moda vam udno izgleda buenje iz SLEEP moda istekom WDT. On se u mikrokontroleru koristi za povremeno buenje iz SLEEP moda, obavljanje odreene operacije, i ponovni ulazak u SLEEP mod. Tako mikrokontroler moe povremeno izvriti poneku operaciju, a opet e veinu vremena provesti spavajui (i troei manje struje). Kako istek WDT prouzrokuje softverski reset mikrokontrolera program mora po resetu testirati TO bit, i na osnovu njegovog stanja zakljuiti da li se radi o prvom ukljuenju mikrokontrolera, ili o prekidu nastalom istekom WDT, kako bi se mogao nastaviti zapoeti program. U praksi se mnogo ee sree buenje interaptima. U sledeem poglavlju upoznaete se sa specifinostima upotrebe interapta u SLEEP modu. 83

27. Buenje iz Sleep moda


Buenje iz SLEEP moda interaptima razlikuje se od obinih interapta po tome to je mogue da se umesto skoka na interapt rutinu, izvravanje programa nastavi iza SLEEP instrukcije. Naime, ukoliko je u SLEEP modu GIE setovan, pri interaptu e se mikrokontroler probuditi i skoiti na interapt rutinu, kao u obinom programu. Ali, ukoliko je GIE resetovan, pri interaptu (dozvoljenim odgovarajuim interapt flagom) e se probuditi i nastaviti dalje izvrenje programa, bez skoka na interapt rutinu. U zavisnosti od trenutka sticanja uslova za pojavu interapta mogue je da se interapt dogodi neposredno pre SLEEP instrukcije. U tom sluaju, SLEEP instrukcija se nee izvriti, pa nee biti resetovan WDT i njegov preskaler, resetovan PD bit i setovan TO bit. Zbog toga je potrebno runo resetovati WDT (ukoliko se koristi) neposredno pre SLEEP instrukcije. U sluaju da je potrebno saznati da li se izvrila SLEEP instrukcija, to se moe proveriti testiranjem PD bita STATUS registra. Sada ete se upoznati sa programom koji ilustruje upotrebu SLEEP moda i buenje iz njega na oba naina (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 izazivajui 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 buenje i nastavak programa bez skoka na interapt rutinu. Po izazivanju interapta (T5) snimljene kombinacije se itaju i prikazuju na displeju sa ukljuenom decimalnom takom (segment dp na displeju). Nakon 5 prikazanih kombinacija, program se ponavlja iz poetka. Kako je zbog interapta i internih pull up otpornika potrebno da prekidai budu na portu B, slika e se na displeju prikazivati kombinacijom pinova PORTA i PORTB registra (tanije pinovima RA0 do RA4 i RB1 do RB3). ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove cblock 0x0C TEMPW ; Promenljiva za W registar TEMPSTATUS ; Promenljiva za STATUS registar TEMP ; Promenljiva za rotaciju endc ; .32 .36 RAM memorija za snimanje stanja prekidaa org goto 0x00 Main ; Ovde PC dolazi pri ukljuenju i resetu ; Odlazak na glavni program 84

; ****** Interapt rutina za prvi deo programa normalne interapte ****** org 0x04 ; Ovde e poeti interapt rutina movwf TEMPW ; uvanje sadraja W registra u TEMPW swapf STATUS,W ; STATUS sa okrenutim niblovima u W movwf TEMPSTATUS ; i zatim u TEMPSTATUS registar swapf andlw PORTB,W ; Uzmi stanje sa porta i zameni stanje niblova. b'00001111' ; Maskiraj neeljene bitove

; ****** Test interapta izazvanog prekidaem ****** btfss INTCON,INTF ; Interapt izazvan prekidaem T5? goto T14 ; Nije, idi na deo za prekidae T1 do T4. ; ****** Interapti izazvani prekidaem T5 ****** movwf INDF ; Indirektno snimanje u eljeni registar incf FSR,F ; Pozicioniranje pointera na sledei registar call Vrat ; Vrati sadraj W i STATUS registra bcf INTCON,INTF ; Obrii interapt flag prekidaa T5 retfie ; Vrati se iz interapt potprograma ; ****** Interapti izazvani prekidaima T1 do T4 ****** call Tabl ; Uzmi sliku za displej iz tabele. 85

call call bcf retfie Vrat swapf movwf swapf swapf return

Nacr ; Nacrtaj sliku. Vrat ; Vrati sadraj W i STATUS registra INTCON,RBIF ; Obrii interapt flag prekidaa T1 do T4 ; Vrati se iz interapt potprograma TEMPSTATUS,W STATUS TEMPW,F TEMPW,W ; TEMPSTATUS sa okrenutim niblovima ; u W. Dva puta okrenuti niblovi daju ; prvobitno stanje koje ide u STATUS ; Jednom okreni niblove u samom ; TEMPW registru, ; a drugi put sa W kao odreditem. ; Povratak iz potprograma.

; ****** Tabela ****** Tabl addwf PCL,F retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw

; Vrednost u W od b'00000000' do b'00001111' ; (0x00 do 0x0F) se dodaje na PCL ; bez decimalne take b'00011000' ; Obrazac za crtanje cifre 0 - 0 b'00111111' ; Obrazac za crtanje cifre 1 - 1 b'10010100' ; Obrazac za crtanje cifre 2 - 2 b'00010110' ; Obrazac za crtanje cifre 3 - 3 b'00110011' ; Obrazac za crtanje cifre 4 - 4 b'01010010' ; Obrazac za crtanje cifre 5 - 5 b'01010000' ; Obrazac za crtanje cifre 6 - 6 b'00011111' ; Obrazac za crtanje cifre 7 - 7 b'00010000' ; Obrazac za crtanje cifre 8 - 8 b'00010010' ; Obrazac za crtanje cifre 9 - 9 b'00010001' ; Obrazac za crtanje cifre A- A b'01110000' ; Obrazac za crtanje cifre B - B b'11010000' ; Obrazac za crtanje cifre C - C b'00110100' ; Obrazac za crtanje cifre D - D b'11010000' ; Obrazac za crtanje cifre E - E b'11010001' ; Obrazac za crtanje cifre F - F

; ****** Potprogram za crtanje slike na displeju ****** Nacr movwf PORTA ; Poalji u PORTA bitove RA0 do RA4 movwf TEMP ; Poalji u TEMP registar zbog zamene niblova swapf TEMP,W ; Zameni mesta niblovima tako da RB1 bit dodje ; na mesto bita 1 (isto se moglo realizovati ; i sa 4 RRF instrukcije) movwf PORTB ; Poalji u PORTB bitove RB1 do RB3 return ; Povratak iz potprograma. ; ****** Glavni program inicijalizacija ****** Main bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw b'11110001' ; pinovi RB0 i RB4 do RB7 ulazni, movwf TRISB ; a RB1, RB2 i RB3 izlazni. clrf TRISA ; Svi pinovi porta A izlazni movlw b'00000000' ; INTEDG=0 - Interapt se izaziva pri 86

movwf bcf Opet movlw movwf

OPTION_REG STATUS,RP0 .32 FSR

; opadajuoj ivici signala (sa 1 na 0) ; NOT_RBPU=0 - Ukljueni interni ; pull up otpornici na PORTB ; Povratak u BANK0

; Inicijalizacija pointera RAM memorije ; na registar .32

; ******* Postavi sliku na displeju pre ukljuenja interapta ****** swapf PORTB,W ; Uzmi stanje sa porta i zameni stanje niblova. andlw b'00001111' ; Maskiraj neeljene bitove call Tabl ; Uzmi sliku za displej iz tabele. call Nacr ; Nacrtaj sliku. ; ****** Ukljui interapte ****** bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw b'10011000' ; GIE Global interrupt enable (1 ukljui) ; INTE RB0 Interrupt enable (1 ukljui) ; RBIE RB Interrupt enable (1 ukljui) ; INTF Interapt flag za T5 (0 obrii) movwf INTCON ; RBIF Interapt flag za T1-T4 (0 obrii) bcf STATUS,RP0 ; Povratak u BANK0 ; ****** Prvi deo programa setovan GIE, normalni interapti ****** Poc sleep ; Ukljui SLEEP mod ; U ovom trenutku program se vratio iz interapt rutine. Sada je potrebno proveriti da li ; je snimljeno svih 5 vrednosti. Meutim, bolje je ovde proveriti vrednost FSR ; registra sabiranjem, jer je mogue da se (npr. usled debouncinga na T5) izazove vie ; uzastopnih interapta i tako snime vrednosti u jo par narednih RAM adresa. ak i ; da se to dogodi, testom Carry flaga moe se detektovati taj sluaj za razliku od ; testa Zero flaga. movf addlw btfss goto FSR,W .219 STATUS,C Poc ; FSR u W ; Test prekoraenja. FSR treba biti od .32 do .36 ; .37 i vie + .219 = setovan Carry ; Jo nema prekoraenja. Spavaj i dalje.

; U ovom trenutku snimljeno je svih 5 vrednosti u RAM adrese od .32 do .36 ; Sada se treba zabraniti odlazak na interapt potprogram. Zabr bcf btfsc goto INTCON,GIE INTCON,GIE Zabr ; Jeste. Zabrani nove interapre ; Proveri jesu li interapti zaista zabranjeni ; Nisu, zabrani ih opet.

; ** Drugi deo programa resetovan GIE, interaptima se nastavlja glavni program ** movlw 0xFF ; movwf PORTA ; Obrii LED displej (segmenti na PORTA). movwf PORTB ; Obrii LED displej (segmenti na PORTB) 87

bcf movlw movwf

PORTA,4 .32 FSR

; Ukljui segment decimalne take. ; Inicijalizacija pointera RAM memorije ; na registar .32

; ****** Zabrani buenje iz sleep moda prekidaima T1 do T4 ****** bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw b'00010000' ; GIE Global interrupt enable (0 iskljui) ; INTE RB0 Interrupt enable (1 ukljui) ; RBIE RB Interrupt enable (0 iskljui) ; INTF Interapt flag za T5 (0 obrii) movwf INTCON ; RBIF Interapt flag za T1-T4 (0 obrii) bcf STATUS,RP0 ; Povratak u BANK0 ; ****** Ponovo uspavaj mikrokontroler ****** Spa sleep ; Uspavaj mikrokontroler do pojave interapta. ; Po njegovoj pojavi, nastavi program bez skoka ; na interapt potprogram nop ; Utroi jedan instrukcijski ciklus ; Preporuljivo nakon buenja

; U ovom trenutku pritisnut je prekida T5. movf call call bcf incf INDF,W Tabl Nacr PORTA,4 FSR,F ; Indirektno itanje eljenog registra ; Uzmi sliku za displej iz tabele. ; Nacrtaj sliku. ; Ukljui segment decimalne take. ; Pozicioniranje pointera na sledei registar

; Test prekoraenja je isti kao i ranije, iako bi sada slobodno mogao biti sa XOR ; operacijom movf addlw btfss goto goto FSR,W .219 STATUS,C Spa Opet ; FSR u W ; Test prekoraenja. FSR treba biti od .32 do .36 ; .37 i vie + .219 = setovan Carry ; Jo nema prekoraenja. Spavaj i dalje. ; Ima prekoraenja. Poni program iz poetka. ; Kraj programa

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

U Sleep modu oscilator je nestabilan prilikom buenja. Naime, poto je oscilator za vreme spavanja blokiran, nije mu ba lako da odjednom pone proizvoditi iste taktove. Buenje nee biti mogue dok se oscilator ne stabilizuje. Zato se pri korienju SLEEP moda ne moe vriti merenje vremena brojanjem instrukcijskih ciklusa instrukcija u programu, ak iako se buenje interaptom deava tano odreeno vreme nakon ulaska u Sleep mod. Kako RC oscilator najlake poinje sa oscilacijama, vreme za njegovu stabilizaciju je skoro trenutno, dok je kod upotrebe ostalih vrsta oscilatora potrebno 1024 takta oscilatora za kompletnu stabilizaciju. Sve dok se stabilizacija takta ne zavri, mikrokontroler se nee moi probuditi iz SLEEP moda. 88

28. Broja
Kako moete brojali spoljne signale? Jedan od moguih naina predstavlja neprekidno testiranje pina na logiku 0 pa na logiku 1 iz glavnog programa (eng. pooling). Oigledno je da bi ovakaj princip brojanja zauzeo najvie resursa mikrokontrolera. Drugi nain je interaptima. Njima je mikrokontroleru ostavljeno dovoljno vremena za glavni program, a ipak moe pravovremeno odgovoriti na spoljne impulse. U praksi se esto javlja potreba za brojanjem veih vrednosti, pri emu se rezolucija brojaa zaokruuje na dovoljan broj decimala. Da li Vam je toliko bitna razlika u brzini od 0,0025km/h ukoliko ve vozite biciklu preko 30km/h? Teko da e biti ukoliko ne idete na Tour de France (poznata biciklistika trka u Francuskoj). Dakle, kako brojati sa zaokruenjem? Potrebno je podesiti tajmer tako da umesto instrukcijskih ciklusa broji impulse sa RA4/T0CKI pina, setovanjem T0CS bita OPTION_REG registra. U sluaju odnosa preskalera 1:1, trajanje logike 0 i 1 eksternog takta mora biti due od 3 takta oscilatora PIC16F84 (tanije oko 2 takta + 20nS), a u sluaju bilo kog drugog odnosa due od 5 takova (tanije 4 takta + 40nS). Osim promene izvora takta tajmera, sve je ostalo isto. Preskaler se podeava kao kod tajmera, interapt se izaziva kao kod tajmera, ak se i upisivanjem u TMR0 registar inicijalizuje tajmer i preskaler. Na taj nain Timer0 ima funkciju brojaa (eng. Counter). ta se dobija upotrebom ovakvog brojaa? Umesto da se interapt izaziva prilikom svakog impulsa, izazivae se tek prilikom prekoraenja brojaa. Za odnos preskalera od 1:1 to znai da e se interapt izazivati nakon svakog 255-og impulsa. Tako za glavni program ostaje mnogo vie resursa. Ogranienjem minimalnog trajanja logike 0 i logike 1 ogranien je i maksimalni takt koji moe meriti mikrokontroler. Meutim, ovo se moe efikasno reiti korienjem eksternih integrisanih delitelja signala (npr. 74390 ili 4040), koji dodatno hardverski dele ulazni signal. Ovde su moniji mikrokontroleri u prednosti zbog postojanja vie tajmera. Na primer, jedan bi se iskoristio za brojanje eksternih impulsa, a drugi za to vreme moe generisati stabilnu vremensku bazu. Poreenjem ove dve vrednosti moe se lako dobiti frekvencija eksternog signala. Za vie detalja pogledajte AN689 Voje Antonia i AN592.

89

29. Reset
Najjednostavnije reeno, reset slui da izvravanje programa pone iz poetka. PIC16F84 ima 3 izvora reseta. Prvi je svakako reset prilikom dovoenja napona napajanja (eng. POR Power-on Reset). Unutar mikrokontrolera nalazi se malo elektrino kolo koje detektuje porast napona napajanja do napona dovoljnog za rad mikrokontrolera. U trenutku dostizanja nominalnog napona, mikrokontroler se resetuje. Ovim se spreava rad mikrokontrolera pri preniskom naponu napajanja. Ukoliko je potrebno, moe se ukljuiti PWRTE (eng. Power-up Timer Enable) konfiguracioni bit koji dri mikrokontroler u stanju reseta oko 72mS od dovoenja napona napajanja. Ovo kanjenje realizovano je internim RC oscilatorom nezavisnim od takta oscilatora. To je dovoljno da se napon napajanja podigne na nominalnu vrednost i da oscilator mikrokontrolera pone proizvoditi iste nepriguene oscilacije. Nakon to se ovo kanjenje zavri, mikrokontroler (za svaki sluaj) eka jo 1024 takta oscilatora pre nego to pone izvravati program. Drugi izvor reseta je MCLR pin mikrokontrolera. On mora uvek biti dran na logikoj jedinici. Obino se to realizuje povezivanjem sa naponom napajanja preko otpornika od 10k. U emama u ovom uputstvu on je spojen direktno zbog vee preglednosti eme, i jer se ne koristi. Pri dovoenju logike 0 na ovaj pin (spajanje sa masom), mikrokontroler se resetuje. Za svaki sluaj u ulaznom stepenu ovog pina postavljen je mitov okida koji ima ulogu filtriranja slabih impulsa, koji bi mogli prouzrokovati nehotini reset mikrokontrolera. Poslednji izvor reseta nauili ste u delu sa WDT. Moete izvriti softverski reset namernim izostavljanjem CLRWDT instrukcije u eljenom delu programa. Iako reset prvenstveno slui za ponovni start programa, testiranjem stanja TO i PD bitova STATUS registra, mogue je utvrditi na koji nain je izazvan reset, i na osnovu toga nastaviti rad programa. TO 1 1 0 0 1 1 1 PD 1 0 0 1 0 1 1 Stanje Stanje nakon izvrenja CLRWDT instrukcije Stanje nakon izvrenja SLEEP instrukcije WDT reset za vreme SLEEP moda WDT reset za vreme normalnog izvravanja programa MCLR reset za vreme SLEEP moda ili buenje interaptom MCLR reset za vreme normalnog izvravanja programa POR reset pri dolasku napona napajanja

U prilogu ovog uputstva moete videti inicijalno stanje svih registara nakon reseta.

90

30. Srce mikrokontrolera


Isto kao to Vae srce pumpa krv odreenim ritmom, mikrokontroler za svoj pravilan rad mora imati tano podeene taktne impulse. Oni se dobijaju iz oscilatora. U ovom poglavlju bie prikazane eme hardverskog povezivanja raznih vrsta oscilatora, i bie blie objanjene njihove specifinosti. Frekv. (Khz) 26 83 243 311 428 756 Najjeftiniji je svakako RC oscilator, korien u dosadanjim emama. Sastoji se samo od kondenzatora i otpornika. U tablici su date vrednosti otpornosti i kapacitivnosti za dobijanje eljenih frekvencija. 1340 3500 2660 4610 Kapac. (pF) 300 100 300 20 300 100 100 33 20 20 Otpornost (k) 100 100 10 100 5 10 5 5 10 5

Ovaj tip oscilatora moe se koristiti za pun opseg frekvencija mikrokontrolera (DC do 4MHz, odnosno do 20MHz za bre verzije PIC16F84 mikrokontrolera). Mana mu je loa stabilnost frekvencije i etanje frekvencije usled promene temperature. Preporuene vrednosti otpornosti su od 3k do 100k, a kapacitivnosti preko 20pF. Gornja granica kapacitivnosti zavisi iskljuivo od eljene maksimalne frekvencije. to se tie mikrokontrolera, on e bez problema raditi ak i sa taktom oscilatora manjim od 1Hz. Kao lenjivac. U nekim PIC mikrokontrolerima (naalost ne u PIC16F84) nalazi se integrisani hardverski RC oscilator. Zbog preciznijeg takta, Microchip kalibracioni niz snima u deo programske memorije. Kasnije se ovaj niz moe proitati i softverski podesiti. Na OSC2 pinu pri radu RC oscilatora dobija se etvrtina takta oscilatora, to se moe iskoristiti za sinhronizaciju dodatnih eksternih ureaja sa mikrokontrolerom. U SLEEP modu oscilator se blokira, pa ni ovaj signal vie nije dostupan. Iako je oscilator mikrokontrolera nezavistan od ostatka hardvera, mogue je primenjujui male softversko hardverske trikove indirektno uticati na njegovu frekvenciju. Dovoljno je npr. jednim pinom mikrokontrolera ukljuivati paralelno povezivanje otpornika u RC lanu. Postavljanjem pina na logiku 0 ili 1, dodatni otpornik e se paralelno spojiti sa ve postojeim otpornikom, smanjujui rezultujuu vrednost otpornosti. Tako se moe grubo menjati frekvencija oscilatora. Ovaj princip moe biti iskorien za smanjenje frekvencije oscilatora u periodima kada mikrokontroleru nije potrebna puna brzina ime bi se istovremeno smanjila potronja mikrokontrolera. Meutim, zbog preporuenih vrednosti otpornosti (do 100k) nije 91

preporuljivo ovim nainom menjati frekvenciju u veim opsezima. Zbog toga se moe umesto samo otpornika ukljuivati dodatni RC lan. Vie o ovom principu imate na sajtu http://www.romanblack.com/ u delu PIC with 2 clock speeds! Ukoliko je potrebno rad mikrokontrolera sinhronizovati sa eksternim ureajima, moe mu se spolja obezbediti spoljni takt. Konfiguracioni bitovi trebaju u tom sluaju biti podeeni na LP, XT ili HS. OSC2 pin je poeljno povezati na masu mikrokontrolera preko otpornika vee vrednosti (10k), zbog smanjenja interferencije, iako to poveava potronju mikrokontrolera. Ukoliko nije potrebna velika brzina izvravanja instrukcija, a bitna je potronja i stabilnost frekvencije, (npr. sat na baterije) PIC treba raditi sa 32KHz-200KHz kristalom. Na manjem taktu zbog manjeg pojaanja integrisanog oscilatornog kola PIC troi manje struje nego inae. Za ovakvu vrstu oscilatora treba podesiti konfiguracioni bit oscilatora na OSC LP. Ukoliko je bitna stabilna frekvencija a i cena PIC16f84, dobar izbor bi bio kristalni oscilator do 4MHz. Za njega je potrebno konfiguracioni bit podesiti kao - OSC XT. A ukoliko je brzina imperativ, mogu se kupiti verzije PIC16F84 mikrokontrolera koje mogu bez problema raditi na taktu veem od 4MHz. Naalost, one su i skuplje. Njihov konfiguracioni bit potrebno je podesiti kao OSC HS. U ovom modu zbog najveeg pojaanja integrisanog oscilatornog kola PIC16F84 troi najvie elektrine energije. Za ova 3 naina sa kristalnim oscilatorom primenjuje se sledea ema: Frekv. (Khz) 32 200 100 455 2000 Otpornik je potreban samo za retke tipove kristala. U najveem broju sluajeva moe se izostaviti. HS mod mogu koristiti jedino tipovi PIC16F84 mikrokontrolera predvieni za rad na visokim frekvencijama. 4000 8000 16000 20000 Kapac. (pF) 68-100 15-30 68-150 22-100 15-68 15-68 10-68 10-22 5-10 Konfig. bitovi LP LP XT XT XT XT HS HS HS

Dizajn internog oscilatora zahteva upotrebu paralelno rezanog kristala. Meutim, i redno rezani kristali mogu se koristiti kao izvor takta, ali jedino uz eksterno oscilatorno kolo. Njihova upotreba u emi kristalnog oscilatora dovee do frekvencije koja odstupa od specifikacija u karakteristikama proizvoaa kristala. 92

Ukoliko elite imati izuzetno stabilnu frekvenciju moete umesto obinih koristiti OCXO (eng. Oven Controlled Xtal Oscillator) kristale koji u istom kuitu imaju kristal, greja i termostat. Za napajanje grejaa potrebno je dovesti spoljni izvor napajanja koji naalost dodatno poveava potronju kola. Grejaem i termostatom regulie se konstantna temperatura kristala iznad sobne temperature, tako da je temperaturni drift frekvencije kristala minimalan. Kako su takvi kristali (i takva kuita) dosta skuplji od obinih, moete ih sami napraviti sledei uputstva sa sajta http://www.romanblack.com/ u delu Simple xtal oven for accurate clocks. Keramiki oscilator obino je zajedno sa kondenzatorima spakovan u zajedniko tropinsko kuite. Takvi elementi nazivaju se keramiki rezonatori. Vea kapacitivnost kondenzatora poveava stabilnost oscilatora, ali takoe poveava i vreme potrebno za stabilizaciju oscilatornog kola pri ukljuenju mikrokontrolera ili buenju iz SLEEP moda. U principu, ova 3 stanja konfiguracionih bitova (LP, XT i HS) razlikuju se jedino u pojaanju internog invertora oscilatornog kola to omoguava razliit opseg frekvencija. Ukoliko Vam se desi da neki kristal ne moe proraditi u jednom modu, probajte promeniti konfiguracione bitove oscilatora. Najbolje je koristiti oscilator sa najmanjim moguim pojaanjem, uz uslov da se njime moe postii eljena brzina oscilatora. Za detalje o tipovima oscilatora, pogledajte AN588 sa http://www.microchip.com/. estitam! Sada znate funkcije svih pinova mikrokontrolera, upotrebu svih 35 instrukcija i svih 15 registara. Meutim, tek ste poeli sa uenjem. Skoro svaki softverski problem moe se reiti na vie naina. Ukoliko elite da se odreeni deo programa izvrava 5 puta, potrebno brojanje moete implementovati sabiranjem, oduzimanjem, inkrementacijom, dekrementacijom pa ak i rotacijom. U sledeim poglavljima upoznaete se sa najee korienim softversko hardverskim tehnikama za realizaciju odreenih zadataka.

93

31. MPASM direktive i makroi


Ranije ste nauili par najkorienijih mogunosti MPLAB asemblera. One su dovoljne za analizu bilo kog asemblerskog (pa ak i disasembliranog) programa. U ovom poglavlju nauiete par asemblerskih specifinosti kojim e Va program biti itljiviji i kojim ete smanjiti mogunost pojave greaka prilikom njegovog pisanja. Da li Vam je zamoran prelazak iz banke u banku? Ko bi pamtio treba li se RP0 bit setovati ili resetovati! Ne morate. Koristite banksel direktivu. Dovoljno je iza nje navesti naziv registra kome pristupate, i ona e na svom mestu ubaciti odgovarajuu instrukciju prelaska (bcf STATUS,RP0 ili bsf STATUS,RP0). Ve znate kako deluje equ direktiva. Pretpostavimo da ste imenu PAUZA pridruili decimalnu vrednost 100. Unutar potprograma tu vrednost koristite kao broj milisekundi. Pretpostavimo da vam u programu zatreba pauza duplo dueg trajanja. Umesto imenovanja jo jednog broja, moete napisati sledee: movlw call PAUZA * 2 ; PAUZA * 2 = .200 Cekaj ; Idi na potprogram

Na isti nain za duplo krau pauzu moete napisati: movlw call PAUZA / 2 ; PAUZA / 2 = .50 Cekaj ; Idi na potprogram

Asembler u oba sluaja za vreme asembliranja rauna vrednosti koje se trebaju nai na odreenim mestima. One u svakom sluaju moraju biti poznate pre raunanja. Neke od aritmetikih operacija koje moe izvriti asembler su sledee:

* / % + -

negacija (po drugom komplementu) mnoenje deljenje moduo (ostatak pri deljenju) sabiranje oduzimanje

eljeni prioritet operacija moe se definisati zagradama. Npr. (8-6)*5. Osim matematikih, asembler moe izraunati i vrednosti odreenih logikih operacija. Na primer:

~ komplement << rotacija ulevo (bez Carry Flaga) >> rotacija udesno (bez Carry Flaga) & AND ^ XOR | IOR

I kod njih se prioriteti definiu zagradama. Npr. ~((BROJ1&BROJ2)^BROJ3). 94

Prilikom ovakvih vrednosti morate biti sigurni da parametar ne moe izai izvan dozvoljenih granica. Isto tako, morate obratiti panju na mogue zaokruivanje broja (na primer prilikom deljenja). Sledea pogodnost koju prua MPLAB asembler je zamena teksta. Ukoliko u programu imate ovakav deo: TASTER equ btfsc goto goto 3 PORTA,TASTER Prit Otpu ; Taster je povezan na RA3 pin ; Da li je taster pritisnut? ; Jeste ; Nije

i dalje je potrebno pamtiti na kom je portu povezan taster. Zamenom dela teksta za tim nema potrebe. #define btfsc goto goto TASTER TASTER Prit Otpu PORTA,3 ; Zameni izraz ; PORTA,3 reju TASTER ; Da li je taster pritisnut? ; Jeste ; Nije

#define direktivom nije mogue zameniti vei deo koda (2 ili vie instrukcija). Za to se koriste makroi. ak je mogue u makro preneti odreene parametre ranije definisane. #define Test macro extern btfsc goto goto endm TASTER PORTA,3 ; Imenuje nazive port,pin ; Odreuje ulazne parametre Prit,Otpu ; Oznaava da su labele ili registri ; definisani izvan makroa port,pin ; Da li je taster pritisnut? Prit ; Jeste Otpu ; Nije ; Direktiva za oznaku kraja makroa

Kad god je unutar programa potrebno na osnovu pritisnutog tastera otii 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 odgovarajueg porta i pina, vrednosti port i pin unutar makroa uzee ove vrednosti. Na taj nain se u makro ubacuju eljeni parametri. Unutar makroa mogue je koristiti sve instrukcije kao i u glavnom programu. Meutim, kako se makro poziva iz spoljnog programa, poeljno je da labele i registri unutar makroa ne dou u konflikt sa delovima programa izvan makroa. Zbog toga je potrebno unutar makroa definisati koriene unutranje i spoljne labele i registre. Na taj nain mogue je i unutar glavnog programa i unutar makroa imati labelu istog naziva. U makrou ona mora biti definisana kao interna, to znai da joj program spolja ne moe pristupiti. Labele definisane kao eksterne mogu se pozivati i iz makroa. Za kompletno uputstvo o upotrebi makroa, direktiva i aritmetiko logikih operacija pogledajte DS33014J sa http://www.microchip.com/.

95

32. Komentari
Na poetku ovog uputstva, malo se prialo o komentarima. U ovom poglavlju upoznaete se sa modifikacijama zaglavlja tako da Vam bude prilagoenije, i sa nainima komentarisanja registara koji imaju bitove razliitih funkcija. Seate se zaglavlja koje ste do sada koristili. Prepravite ga po sledeem: ;********************************************************** ; Autor : ; Datum : ; Verzija : ; Naslov : ; ; Opis hardvera : ; Opis softvera : ; Potrebni fajlovi : p16F84.inc ; ;********************************************************** list #include __CONFIG p=16F84 ; Definie upotrebljeni mikrokontroler <p16F84.inc> ; Ubacuje nazive registra u program _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; CP - zatita od itanja ; WDT - watchdog tajmer ; PWRTE - kanjenje po ukljuivanju ; XT OSC - kristalni oscilator ; LP OSC - oscilator male potronje ; HS OSC - brzi oscilator ; RC OSC - otpornik i kondenzator

; ****** Inicijalizacija registara ****** cblock 0x0C TEMPW ; Privremeno uvanje W registra TEMPSTATUS ; Privremeno uvanje STATUS registra SPORTA ; Shaddow registar za PORTA SPORTB ; Shaddow registar za PORTB endc ; ****** Inicijalizacija vrednosti u EEPROM memoriji ****** org 21x00 ; Poetak EEPROM memorije ; de 0x00 ; Inicijalizacija prvog bajta ; ****** Start programa ****** ORG 0x00 goto Main ; Start programa ;

96

; ****** Interapt potprogram ****** ORG 0x04 movwf TEMPW swapf STATUS,W movwf TEMPSTATUS ; Prostor za interapt potprogram. Back bcf bcf bcf bcf INTCON,T0IF INTCON,INTF INTCON,RBIF INTCON,EEIF

; uvanje sadraja W registra ; STATUS sa okrenutim niblovima u W ; i zatim u TEMPSTATUS registar

; Dozvoli nove interapte tajmera ; Dozvoli nove interapte prekidaa ; Dozvoli nove interapte po promeni stanja ; Dozvoli nove interapte EEPROM-a ; TEMPSTATUS sa okrenutim niblovima ; u W. Dva puta okrenuti niblovi daju ; prvobitno stanje koje ide u STATUS ; Jednom okreni niblove u samom ; TEMPW registru, ; a drugi put sa W kao odreditem. ; Povratak iz interapt rutine.

swapf movwf swapf swapf retfie

TEMPSTATUS,W STATUS TEMPW,F TEMPW,W

; ****** Poetak programa ****** Main banksel TRISA movlw movwf movlw movwf movlw b'00000000' TRISA b'00000000' TRISB

; BANK 1 ; ; Konfigurisanje pinova ; ; Konfigurisanje pinova

movwf banksel movlw movwf movwf movlw movwf movwf

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=iskljueni otpornici OPTION_REG ; PORTA b'00000000' PORTA SPORTA b'00000000' PORTB SPORTB ; BANK0 ; ; Inicijalizacija stanja portova i ; Shaddow registara ; ; ; 97

movlw

movwf Start

b'00000000' ; ; !!!!!!!+----- RBIF ; !!!!!!+------ INTF ; !!!!!+------- T0IF ; !!!!+-------- RBIE ; !!!+--------- INTE ; !!+---------- T0IE ; !+----------- EEIE ; +------------ GIE INTCON ;

0=obrii 0=obrii 0=obrii 1=ukljui 1=ukljui 1=ukljui 1=ukljui 1=ukljui

; Prostor za programe. end ; Kraj programa

Na ovaj nain program je pregledniji nego ranije, razumljivije je znaenje bitova u OPTION_REG i INTCON registru, a najee korieni registri su unapred inicijalizovani pravilnim redosledom, to smanjuje mogunost nepravilne inicijalizacije. Delove koji se ne koriste lake je odjednom obrisati, nego ih po potrebi iznova pisati za svaki novi program. Po potrebi u zaglavlje se mogu dodati i najkorieniji delovi programa (npr. za pauzu, za korienje EEPROM memorije ili RS232 veze), ali je praktinije odvojiti ih u zasebne celine u sklopu potprograma, na primer ovako: ;*********************************************** ; Tabela za ispis cifre na LED displeju ; Mora se nalaziti u bloku od 256 bajtova. Tabl movf CIFRA,W addwf PCL,F retlw b'01111110' ;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 Moete ih takoe 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 moete 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 trei bit registra PRIKAZ na trei bit PORTA registra, ali tako da se ne promeni stanje ostalih bitova PORTA registra. movf movwf movlw andwf bcf iorwf movwf movwf PORTA,W ; PORTA u W, SPORTA ; a odatle u Shaddow registar b'00001000' ; Maskiranje svih osim treeg bita PRIKAZ,W ; Rezultat b'00001000' ili b'00000000' u W, ; u zavisnosti od stanja treeg bita ; PRIKAZ registra SPORTA,3 ; Resetovanje ranijeg stanja treeg bita SPORTA,W ; Postavljanje samo treeg bita na novu vrednost ; Rezultat u W, PORTA ; a odatle u PORTA registar i SPORTA ; u SHADDOW registar.

Rezultat AND operacije nad bitovima, bie 1 samo ako je na oba bita prisutna logika 1. Ukoliko se ostali bitovi maskiraju, u W e se nai jedino stanje treeg bita PRIKAZ registra. Nasuprot AND operaciji, rezultat IOR operacije daje 1 ukoliko je bar 1 bit na logikoj 1. U tom sluaju (budui da je trei bit resetovan BCF instrukcijom), stanje treeg bita SPORTA registra zavisie jedino od stanja treeg bita W registra, koje je preuzeto iz PRIKAZ registra. Ostali bitovi u SPORTA registru zadrae svoja stanja, jer IOR operacija sa bilo kojom vrednou bita i nulom, daje sam taj bit.

99

34. Kompresija
Kompresija je postupak kojim se troi manje memorije za uvanje veeg broja podataka efikasnijim smetanjem podataka u memoriji. Osnovni preduslov je da se u podatcima nalaze prazni (neiskorieni) bitovi. Na primer, ukoliko je potrebno u EEPROM snimati grupe od dva bita (kao u primeru sa buenjem iz SLEEP moda), teta je ne iskoristiti i ostatak bitova u bajtu. A ukoliko nije poznata konana veliina (kraj) memorisanih podataka, mogu se brojati ciklusi snimanja i po zavretku snimanja snimiti u npr. zadnjoj EEPROM adresi (0x3F). Ukoliko se snimaju samo 2 bita, onda je raspoloiva memorija u kompresovanom stanju 4 puta (8 bita / 2 bita) vea od maksimalne. Za EEPROM to znai da umesto 64 osmobitna, postaje dostupno 128 etvorobitna (128 nibla) ili 256 dvobitna dela. Kompresija, nije ograniena samo na EEPROM memoriju. Moe se bez problema koristiti u obinoj kao i u programskoj memoriji u tabelama. Normalno, u sluaju programske memorije podatke u tabeli nije mogue menjati, ve samo itati. Pretpostavimo da je potrebno prva dva bita iz registara STANJE1, STANJE2, STANJE3 i STANJE4 kompresovati u registar STANJE. movlw andwf movwf rlf rlf movlw andwf iorwf rlf rlf rlf rlf movlw andwf iorwf rrf rrf rrf movlw andwf iorwf bit7 ST4.1 ST4.0 00000011b STANJE1,W STANJE STANJE2,F STANJE2,F 00001100b STANJE2,W STANJE,F STANJE3,F STANJE3,F STANJE3,F STANJE3,F 00110000b STANJE3,W STANJE,F STANJE4 STANJE4 STANJE4 11000000b STANJE4,W STANJE,F ST3.1 ; Maskiranje nepotrebnih bitova ; Prva dva bita iz STANJE1 registra u W ; a odatle u STANJE registar ; Rotacija bitova tako da ; dou na pravo mesto ; Maskiranje nepotrebnih bitova ; Sledea dva bita iz STANJE2 registra u W ; a odatle u STANJE registar ; Rotacija bitova tako da ; dou na ; pravo ; mesto ; Maskiranje nepotrebnih bitova ; Sledea dva bita iz STANJE3 registra u W ; a odatle u STANJE registar ; Rotacija bitova ; tako da dou ; na pravo mesto ; Maskiranje nepotrebnih bitova ; Zadnja dva bita iz STANJE4 registra u W ; a odatle u STANJE registar bit0 ST1.0

STANJE ST3.0 ST2.1

ST2.0

ST1.1

100

Proces vraanja u prvobitno stanje (iz STANJE u STANJE1, STANJE2, STANJE3 i STANJE4) naziva se dekompresija. movf movwf rlf rlf movf movwf rlf rlf movf movwf rlf rlf movwf STANJE,W STANJE1 STANJE,F STANJE,F STANJE,W STANJE2 STANJE,F STANJE,F STANJE,W STANJE3 STANJE,F STANJE,W STANJE4 ; STANJE u W ; Prva dva bita u STANJE1 ; Rotacija bajtova tako da ; dou na pravo mesto ; STANJE u W ; Sledea dva bita u STANJE2 ; Rotacija bajtova tako da ; dou na pravo mesto ; STANJE u W ; Sledea dva bita u STANJE3 ; Rotacija bajtova tako da ; dou na pravo mesto ; Zadnja dva bita u STANJE4

U ovoj dekompresiji na tanu 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 nepoeljno, ostali bitovi mogu se setovati ili resetovati maskiranjem. Bitova za Potreban kompresiju broj delova 1 2 3 4 5 6 7 8 8 4 8 2 8 4 8 1 Bitova za pune bajtove 8 (1) 8 (1) 24 (3) 8 (1) 40 (5) 24 (3) 56 (7) 8 (1) Na isti nain mogue je izvriti kompresiju i dekompresiju podataka koji sadre vie od 8 bitova, sa tim to se onda podatci uvek snimaju u vie od jednog bajta. Osim ovog, postoje i mnogo komplikovaniji naini kompresije (npr. ZIP algoritam). Budui da oni prevazilaze okvire ovog uputstva, ovde nee biti razmatrani. Sa kompresijom broja bitova sa kojima osmobitni bajt nije deljiv, postupak je malo tei. Potrebno je odrediti minimalan broj punih bajtova, kompresovati bitove u njih, a zatim ih redom snimati u memoriju.

Imajte na umu da se EEPROM memorija troi za vreme snimanja. Zbog toga nije poeljno snimati svaki dvobitni deo posebno. Sigurnije je saekati da broj delova dostigne celobrojni broj bajtova, i tek onda snimiti ceo bajt u EEPROM.

101

35. If ... Then ... Else ...


Iznova i iznova upotreba instrukcija grananja zbunjuje poetnike. U ovom poglavlju bie dodatno objanjena njihova primena. Pogledajte sledei primer, zajedno sa odgovarajuim algoritmom: movlw xorwf btfsc goto goto .5 BROJ,W ; Broj 5? ; Uporedi Da

Z=0? STATUS,Z ; If Z = 0 Isti ; else goto Isti Razliciti ; then goto Razliciti Ne Isti

Razliiti

Kao to primeujete, u programu se ne testira realno stanje registara, ve jedino logiko stanje odgovarajueg flaga (odnosno bita) unutar registra. Kako e stanje flaga direktno zavisiti od rezultata prethodne instrukcije (5 XOR 5 = 0 pa je Z setovan) koja utie na njegovo stanje, upravo je njegovim testiranjem omogueno grananje. Probleme moe izazvati i razumevanje preskoka naredne instrukcije. Naime, prilikom izvrenja btfsc ili btfss instrukcije, nema realne potrebe (osim lake itljivosti takvog programa) za dve goto instrukcije, jer e program u sluaju da je odgovarajui uslov ispunjen (setovan ili resetovan flag) preskoiti narednu instrukciju. movlw xorwf btfss goto Isti ... .12 BROJ,W ; Broj 12? ; Uporedi Da STATUS,Z ; If Z = 1 Razliciti ; else goto Razliciti ; then Isti Z=1? Ne Razliiti

Razliciti ...

; Razliciti

Isti

Iako je jednostavnije algoritme testiranja mogue napraviti bez dve goto instrukcije, dok ne usavrite programiranje upotrebljavajte prvi oblik (sa dve GOTO instrukcije). Pored btfsc i btfss instrukcija, teko je razumeti i incfsz i decfsz instrukcije. Pogledajte ilustraciju njihove primene u algoritmu koji broji od 25 do 0: movlw movwf Sman decfsz goto Broj0 .25 BROJ BROJ,F Sman ; .25 ; u BROJ ; BROJ=0? ; Nije, vrati se ; Jeste. Da

Smanji BROJ BROJ=0? Ne Vrati se

102

36. Uslovno asembliranje


Pretpostavimo da imate program koji kontrolie LED displej. Nita udno. Ve ste to nauili. Jedini je problem u tome to jednom nabavite displej sa zajednikom anodom, a drugi put ga nema u prodavnicama, pa morate kupiti displej sa zajednikom katodom. Na sreu, pogodilo se da su prikljuci isti, da moete lako prebaciti katodu sa napajanja na masu, jedini je problem tabela. ta moete uraditi? Zameniti tabelu! U redu. Ali ta ukoliko i drugi put promenite displej? Da li da uvate dve verzije programa? Mora da postoji bolji nain! MPLAB asembler sadri par uslovnih direktiva. Njima se u zavisnosti od datih uslova moe izabrati koji deo programa e se asemblirati, a koji ne. Pogledajte na primer sledei deo: Nastavak sledi!

103

37. Jednakost dva broja


U programima se esto javlja potreba za testiranjem odreenih vrednosti. Kao to ste ve nauili, lako je porediti jednakost dva broja korienjem XOR operacije, i odgovarajuim skokom u zavisnosti od stanja Zero flaga. U sluaju testa vie vrednosti, mogue je testirati ih na sledei nain: movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto goto 'G' SLOVO,W STATUS,Z Label1 'R' SLOVO,W STATUS,Z Label2 'Z' SLOVO,W STATUS,Z Label3 Label4 ; Slovo G? ; Uporedi ; Da li su isti? ; Jesu, idi na Label1 ; Nisu. Slovo R? ; Uporedi ; Da li su isti? ; Jesu, idi na Label2 ; Nije. Da li je to slovo Z ; Uporedi ; Da li su isti? ; Jesu, idi na Label2 ; Nije naena odgovarajua vrednost. ; Idi na Label4

Postupak je mogue skratiti poreenjem viestruko XOR-ovanih vrednosti: movf xorlw btfsc goto xorlw btfsc goto xorlw btfsc goto goto SLOVO,W 'G' STATUS,Z Label1 ; Broj u W ; Da li je to slovo G? ; Da li su isti? ; Jesu, idi na Label1

'G' ^ 'R' ; Da li je to slovo R (G XOR (G XOR R) = R) STATUS,Z ; Da li su isti? Label2 ; Jesu, idi na Label2 'R' ^ 'Z' ; Da li je to slovo Z (R XOR (R XOR Z) = Z) STATUS,Z ; Da li su isti? Label3 ; Jesu, idi na Label3 Label4 ; Nije nijedna vrednost od ponuenih. ; Idi na Label4

U ovom sluaju asembler e prilikom asembliranja programa izraunati vrednost G XOR R (oznaka ^ oznaava XOR logiku operaciju) i postavie dobijenu vrednost na rezultat. Na taj nain uteeno je vreme potrebno za runo XOR-ovanje. Jednom XOR-ovana vrednost ponovo se XOR-uje i takva se uporeuje sa ostalim. 104

Osim XOR operacije testiranje jednakosti moe se izvriti i oduzimanjem dva broja i testiranjem Zero flaga. movlw subwf btfss goto goto 'G' SLOVO,W STATUS,Z Razliciti Isti ; Slovo G? ; W = SLOVO - 30 ; Da li je W = 0 (bie kada su vrednosti iste)? ; Vrednosti se razlikuju ; Vrednosti su iste

Testiranje oduzimanjem vie se sree u programima. Verovatno jer je jednostavnije za razumevanje. Ukoliko imate estu promenu vrednosti registra koji testirate bez mogunosti testiranja njene jednakosti sa zadatom vrednou neposredno nakon promene (npr. test TMR0 registra), pouzdanije je testirati prekoraenje vrednosti testom Carry (umesto Zero) flaga. Ovo je bolji nain jer je mogue da izmeu dve uzastopne provere (pogotovu ukoliko koristite due interapte ili retko testirate jednakost) registar doe a zatim i pree preko zadate vrednosti pre provere. Carry flag bi (za razliku od Zero flaga) bio setovan i pri dostizanju vrednosti .0, a i pri prekoraenju. Detaljniji postupak prekoraenja nauiete u narednom poglavlju.

105

38. Manji ili vei


Isto kao i poreenje jednakosti PIC16F84 moe uz par instrukcija testirati da li je odreeni broj A manji ili vei od broja B. Za to je najpraktinije koristiti oduzimanje i testiranje Carry flaga. Pogledajte sledei primer. U njemu se testiraju vrednosti W registra i registra BROJ. movlw subwf btfss goto goto .2 BROJ,W STATUS,C Manji Veci ;2 ; W = BROJ - 2 ; Testiraj prekoraenje ; W<0; BROJ < 2 ; W>=0; BROJ >= 2

Prilikom oduzimanja broj 2 se menja u svoj drugi komplement (0xFE) i ova vrednost se sabira sa vrednou iz registra BROJ. Stoga, ukoliko je BROJ manji od 2 nee biti setovan Carry flag, pa e se dalje izvravanje nastaviti od labele Manji. Kako se Carry flag setuje i kada su brojevi jednaki, ukoliko je BROJ vei ili jednak broju 2 program e se nastaviti od labele Veci. Ukoliko se okrene formula W = BROJ - 2 u W = 2 - BROJ mogue je testirati malo drugaija stanja. Na primer: movf sublw btfss goto goto BROJ, W .2 STATUS,C Veci Manji ; BROJ u W ; W = 2 - BROJ ; Testiraj prekoraenje ; W<0; BROJ > 2 ; W>=0; BROJ <= 2

I u ovom sluaju Carry flag e biti setovan kada su brojevi jednaki. Da bi eliminisali jednakost mogue je kombinovati jedan od ovih algoritama sa proverom jednakosti: movlw xorwf btfsc goto xorwf subwf btfss goto goto .2 BROJ,W STATUS,Z Isti BROJ,W BROJ,W STATUS,C Manji Veci ;2uW ; Uporedi ; Da li su isti? ; BROJ = 2 ; Vrati inicijalnu vrednost (2) u W duplim XOR ; Umesto ovoga moglo se pisati i movlw .2 ; W = BROJ - 2 ; Testiraj prekoraenje ; BROJ < 2 ; BROJ > 2

Dupla XOR operacija upotrebljena je da bi vrednost sa kojom se testira BROJ mogla biti uneta u samo jednoj instrukciji, to omoguava laku izmenu testirane vrednosti.

106

Testiranjem jednakosti oduzimanjem umesto XOR-ovanjem, postignuta je uteda dve instrukcije. movlw subwf btfsc goto btfss goto goto .2 BROJ,W STATUS,Z Isti STATUS,C Veci Manji ; ; W = BROJ - 2 ; Da li je rezultat 0? ; BROJ = 2 ; Nije. Testiraj Carry flag. ; BROJ < 2 ; BROJ > 2

107

39. Zamena sadraja dva registra


Ponekad (npr. pri sortiranju podataka) se javlja potreba za zamenom sadraja dva registra. Obino se za to koristi dodatni privremeni (eng. temp) registar. movf movwf movf movwf movf movwf BROJ1,W TEMP BROJ2,W BROJ1 TEMP,W BROJ2 ; BROJ1 u W ; W u TEMP ; BROJ2 u W ; BROJ1 dobija poetnu vrednost registra BROJ2 ; TEMP u W ; BROJ2 dobija poetnu vrednost registra BROJ1

Na sledei nain moete direktno izvriti njihovu zamenu bez upotrebe dodatnog registra. movf xorwf xorwf xorwf BROJ1,W BROJ2,W BROJ1,F BROJ2,F ; BROJ1 u W ; BROJ1 ^ BROJ2 u W ; W ^ BROJ1 u BROJ1, W se ne menja ; W ^ BROJ2 u BROJ2

Ovaj algoritam mogu je jer se duplo XOR-ovana vrednost bilo kojim brojem ne menja. Potpuno istim nainom mogue je promeniti sadfraj BROJ i W registra. xorwf xorwf xorwf BROJ,F BROJ,W BROJ,F ; ; ;

108

40. On W goto ...


Slino kao kod tabele, sabiranjem PCL sa odreenim brojim moemo otii na proizvoljne memorijske lokacije. Pretpostavimo da je se registar OFSET uveava pri svakom prolasku kroz program i da se na osnovu njegovog trenutnog stanja izvravaju dalji programi jedan za drugim. Na kraju svog izvrsavanja svaki program izvrava goto Poc instrukciju kojim se nastavlja iz poetka. Isto kao u tabelama i ovde je potrebno proveriti da li program prelazi granicu od 256 instrukcija. Poc incf movlw xorwf btfsc clrf movf Skok addwf goto goto goto goto goto goto goto goto OFSET,F .8 OFSET,W STATUS,Z OFSET OFSET,W PCL,F Program1 Program2 Program3 Program4 Program5 Program6 Program7 Program8 ; Uveaj OFSET ; Broj prekoraenja ; ; Da li je nastupilo prekoraenje? ; Jeste, inicijalizuj OFSET ; OFSET u W ; U W se nalazi broj od 0 do 7 ; W=0 ; W=1 ; W=2 ; W=3 ; W=4 ; W=5 ; W=6 ; W=7

Svakako moete zapaziti da se ovaj postupak ne razlikuje mnogo od tabele. Ogranienja vezana za njih vae i u ovom sluaju. U gornjem programu umesto zadnje intrukcije (goto Program8) moglo se odmah nastaviti sa izvravanjem osmog programa. Ipak, ovako program izgleda preglednije i laki je za analizu. Iako je time utroena jedna instrukcija vie, analiza ovakvog programa je prilino jednostavnija. Morate imati u vidu da e se u programu verovatno javljati greke. Razumljiv i dobro komentarisan program olakava njegovu naknadnu ispravku. U protivnom, nai ete se u gomili naizgled besmislenih instrukcija. esta je pojava da se prilikom kasnijeg razvoja programa vie vremena utroi na njegovu analizu, nego na pisanje novog programa iz poetka. Nije ni udo to se kod nerazumljivih programa naziva pageti kod.

109

41. Kanjenje u petlji


U dosta sluajeva potrebno je da program jednostavno eka u petlji odreeno vreme. Kako (za 4MHz kristalni oscilator) instrukcijski ciklus traje samo 1S, potrebno je softverski realizovati dua kanjenja. Kanjenje je najpraktinije implementirati unutar potprograma. Pri proraunu tanog vremena kanjenja mora se uzeti u obzir i vreme potrebno za skok na potprogram, kao i za povratak iz njega (2 * 2 instrukcijska ciklusa). Ovde je dat potprogram kojim e se (pri 4MHz) realizovati kanjenje od tano 1mS. Pau movlw nop Pau4 addlw btfss goto return 0xF9 0xFF STATUS,Z Pau4 ; Inicijalna vrednost u W. Tu nisu uraunata 2 ; instrukcijska ciklusa za skok na potprogram ; Oduzmi 1 od W sabirajui W sa 0xFF ; Da li je rezultat 0? ; Nije, nastavi sa petljom ; Jeste, vrati se iz potprograma.

Svaki prolazak kroz petlju troi 4S. Addlw traje 1, btfss 1 i goto 2S. I u trenutku izlaska iz petlje (W=0) kanjenje je takoe 4S. Potprogram za svoj rad ne koristi registre. Jedino W. U sluaju da je to potebno, mogue je u W zadati eljenu duinu pauze (4S * W) i skoiti direktno na Pau4. Imajte na umu da je i Call instrukciji potrebno 2S. Za due pauze, mora se koristiti registar (u ovom sluaju PAUZA). Pre poziva potprograma je u W potrebno zadati eljeni broj milisekundi kanjenja. Njim je mogue realizovati pauze od 1 do 255mS ( S). Kas movwf Pet1 movlw call nop nop decfsz goto return PAUZA 0xF8 Pau4 PAUZA,F Pet1 ; W u PAUZA registar ; Inicijalizacija vrednosti ; 248 * 4 + 2 = 994 ovde ; Ostatak, ; za jo 6S ; Smanji vrednost u registru ; Jo petlji. ; Povratak iz potprograma

Ukoliko Vam se ovaj nain ini previe teak, moete isprobati PicLoops program koji generie deo potrebnog kda u zavisnosti od unetog vremena kanjenja 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 moete nai na kraju ovog uputstva. Ukoliko ne elite ita instalirati online generator kanjenja imate na linku http://www.piclist.com/cgi-bin/delay.exe. Iako izgleda kao program, radi se o linku. 110

42. Semplovanje
Pretpostavimo da je potrebno odreeno vreme pratiti promene na ulaznim pinovima, i dobijene podatke snimati redom (bit po bit) u RAM registre ili EEPROM memoriju. Takav postupak naziva se semplovanje, a pojedinani dobijeni podaci (logika stanja pinova u odreenom trenutku) semplovi. Kod semplovanja se javljaju etiri problema. Prvi se odnosi na maksimalan broj semplova, drugi na duinu pauze izmeu semplova, trei na rezoluciju semplova, a etvrti na preciznost pauze. Pretpostavimo da je potrebno promenom logikog stanja na jednom pinu pratiti nivo reke (periode plime i oseke). Iako se semplovi mogu uzimati svake milisekunde, tolika preciznost jednostavno nije potrebna. Bie sasvim dovoljno ukoliko se izmeu semplova ubaci pauza od 10 minuta, tako da za 1 sat mikrokontroler dobije 6 sempla, odnosno 6*24 = 144 sempla dnevno. Ovde se javlja prvi problem. Maksimalna raspoloiva koliina memorije. Pogledajte kako se ona moe odrediti. Kako su semplovi jednobitni, oni se mogu kompresovati i tako zauzeti samo 144/8 = 18 EEPROM adresa. Kako EEPROM PIC16F84 mikrokontrolera ima 64 adresa, to znai da bi u njega bilo mogue snimati semplove maksimalno (64*8)/144 = 3,5 dana! Ukoliko Vam je ovaj period previe kratak (idete na odmor u Egipat), morate neto rtvovati. Ili ete kupiti dodatnu EEPROM memoriju, ili ete poveati pauzu izmeu semplova. Pogledajte ta se dogaa ukoliko izaberete drugo reenje. U zavisnosti od raspoloivog vremena (i dubine novanika), odmor u Egiptu moe trajati i do 15 dana (nakon toga postaje dosadno). Znai, za 15 dana moete u EEPROM snimiti maksimalno (64*8)/15 = 34 sempla dnevno. Semplovi bi se uzimali (otprilike) svakih (24*60)/34 = 42 minuta. Ovo je i dalje sasvim dovoljno. Ovde se javlja drugi problem. Dokle e biti dovoljno? Objanjenje daje teorija semplova. Po njoj je bilo koji signal mogue predstaviti semplovima uzetih na frekvenciji koja je bar duplo vea od maksimalne frekvencije originalnog signala. ta to znai? Ukoliko je za period od 24 asa mogua pojava maksimalno dve plime i dve oseke, to predstavlja maksimalno 4 promene logikog stanja na pinu. Da bi se svaka promena sigurno detektovala, semplovanje mora biti bar duplo bre od tih promena, odnosno bie potrebno bar 8 sempla dnevno. Ovo je minimalni dovoljan broj semplova, ali vie semplova e svakako vernije prikazati signal. Na primer, po istoj teoriji svaki analogni audio signal (20Hz 20 kHz) moe se predstaviti digitalnim signalom semplovanim na (dovoljnih) 40kHz, meutim tako malim brojem semplova je teko razlikovati violinu od bas gitare. Dovoljan kvalitet postie se tek pri desetostruko veoj frekvenciji (200kHz). Postoji li jo neki nain? Postoji i odnosi se na poveanje rezolucije semplova. To je trei problem. 111

Do sada je rezolucija semplova bila jednobitna, odnosno omoguavala je samo dva logika stanja (ima/nema vode). Seate se da je pri uenju interapta predlagan metod merenja nivoa reke preko vie ulaznih pinova. Ukoliko se za merenje koriste 3 pina, mogue je dobiti sledea 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 mogue predstaviti 4 nivoa reke. Znai, ukoliko se za merenje nivoa vode koriste tri ulazna pina (umesto jednog), mogue je prikazati etiri nivoa reke uz dva bita unutar sempla. Duplo vie bitova donosi i duplo poveanje memorije. Uglavnom je potrebno odabrati kompromis izmeu dovoljnog broja semplova i njihove rezolucije, a to opet zavisi od konkretnih potreba merenja. Na primer za poetni sluaj (merenje na svakih 10 minuta) uz tri sonde bie potrebno (6*24)*2 = 288 sempla, odnosno 288/8 = 36 bajtova dnevno. Meutim, sada e biti mogue dosta (etiri puta) preciznije pratiti poveanje i smanjenje nivoa. Pauzu izmeu semplova treba to preciznije odrediti. To je etvrti problem. Greka od jedne sekunde unutar jednog sata za petnaest dana narasla bi na greku od 6 minuta. Nekada to moe biti zanemarljivo, ali nekada ne. Zbog to preciznijeg vremena semplovanje se uglavnom izvrava nakon prekoraenja tajmera (ili unutar interapta izazvanih tajmerom). Semplovanje nije ogranieno samo na merenje egzotinih signala kao to je nivo reke. U iduem poglavlju nauiete kako se semplovanje moe efektno iskoristiti unutar debouncinga.

112

43. Debouncing
Ranije ste videli da se debouncing moe realizovati testiranjem tastera, pa kratkim ekanjem, i onda ponovnim testiranjem. Bolji nain predstavlja testiranje tastera vie puta, i izmenu jedino ukoliko je u svim sluajevima testiranja dobijeno novo stanje. Za testiranje se bez problema moe iskoristiti semplovanje, sa tom pogodnou to tada ranije opisanih problema nema. Dovoljno je napraviti petlju (ili petlju unutar petlje), uzeti sempl i resetovati petlju ukoliko se sempl promenio, kako bi testiranje ponovo poelo iz poetka. Ukoliko se petlja zavri, to znai da se stanje prekidaa nije promenilo svo vreme trajanja petlje, pa tako zadnji sempl moe biti uzet kao stabilno stanje prekidaa. Ovako jednostavan princip ima naravno i par mana. Program se treba bar 20mS vrteti u petlji, i za to vreme nee moi da izvrava ostale operacije. Ukoliko kontakti prekidaa neprestano varnie, program nee moi da izae iz petlje. Osim toga interapti mogu izazvati privremen prestanak ili due vreme testiranja prekidaa. Dobar je jedino za programe gde se moe dozvoliti ekanje na pritisnutost (ili otputenost) tastera. U ostalim situacijama trebalo bi koristiti testiranje prekidaa unutar interapta izazvanih tajmerom. Kako se interapti izazvani tajmerom pozivaju prilino retko, potrebno je da semplovanje traje to krae, odnosno da se u jednom prolazu uzme samo jedan sempl, uporedi sa prethodnim i smanji (uvea) unapred zadat broja semplova. Ukoliko je sadanje stanje sempla drugaije od prethodnog, broja bi se ponovo inicijalizovao. Kada broja (napokon) istekne, potrebno je saoptiti glavnom programu da je prekida pritisnut (otputen). Komunikacija izmeu glavnog programa i interapta nije ba jednostavna. Uglavnom se primenjuje komunikacija preko par registara opte namene. Na primer setovan bit 0 registra TASTERI znaio bi da je pritisnut taster LEVO, a setovan bit 1 da je pritisnut taster DESNO. Glavni program trebao bi periodino testirati ove bitove, i u zavisnosti od njihovog stanja preduzimati odreene akcije. U sledeim poglavljima upoznaete se sa par komunikacionih protokola. Jedan deo je hardverski integrisan u savremenijim PIC mikrokontrolerima. Sigurno ete primetiti kompromis izmeu broja pinova koji se koriste za komunikaciju i brzine komunikacije.

113

44. Malo teorije oko memorije


U poetku bee DRAM. Klasian predstavnik DRAM memorije je 4164 integrisano kolo. Njime je mogue adresirati ukupno 64Kbita (65536 bitova) podataka. Bitska matrica je unutar memorije organizovana u obliku redova i kolona. Da bi se pristupilo odreenom bitu (bilo za itanje ili upis podataka), potrebno je preko adresne magistrale pristupiti eliji u kojoj se taj bit nalazi. Zamislite mreu zgrada u kojoj redovi imaju nazive ulica, a kolone brojeve zgrada.

Kroz takvu mreu probija se na glavni junak nervozni potar. On sa koverte ita dve informacije. Naziv (broj) ulice i broj zgrade. Za oitavanje kompletne adrese memorija bi morala imati ak 16 ulaznih pinova (8 za ulicu i 8 za broj). Ovo se uglavnom reava multipleksom adresne magistrale (vie o principu multipleksa nauiete kasnije), tako da se u memoriju najpre alje broj reda, a za njim i broj kolone. Neophodna sinhronizacija obezbeuje se preko dva (ovo je svakako manje od osam) dodatna pina. Potar kao to sigurno ve znate moe obavljati dve operacije. Moe doneti penziju, ili (doneti raun i) odneti penziju. Da li potar doneti ili odneti penziju (itati ili upisivati podatke u memoriju) zavisi od logikog 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 mogue povezati direktno na dva U/I pina mikrokontrolera. Meutim, 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 mogue upisati ili proitati 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 mogue 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 sluaju veliina 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 teko. Svaka bitska DRAM elija sastoji se od jednog kondenzatora i jednog tranzistora. Kako bi se kondenzator posle par mS potpuno ispraznio, ne bi vie bio u stanju uvati podatak, pa se morao povremeno (npr. svake druge milisekunde) osveavati. Tako unutar Spectrum kompjutera Z80 mikroprocesor paralelno sa izvravanjem instrukcija povremeno osveava DRAM memoriju, dok kod C64 video kontroler osveava memoriju za vreme dela instrukcijskog ciklusa u kome mikroprocesor ne pristupa memoriji. Mikrokontroler bi znai morao povremeno proitati sadraj celokupne memorije (ili bar onih memorijskih lokacija koje koristi), a zatim ih ponovo upisati. Teoretski, DRAM memoriju kapaciteta jednog bita moete dobiti povezivanjem kondenzatora direktno na U/I pin mikrokontrolera. Ukoliko mu se najpre odreeno vreme dovede logika 1, kondenzator e se napuniti, i ukoliko se kasnije oita njegovo stanje taj pin e davati logiku 1. Ukoliko mu se pak dovede logika 0, kondenzator e se isprazniti, i kasnije e pri oitavanju davati logiku 0. Da se ne bi vremenom ispraznio, mora se povremeno oitati i osveiti. DRAM memorija ima vie mana nego prednosti. Punjenje i pranjenje kondenzatora zahteva odreeno vreme, tako da je vreme pristupa (eng. access time) elijama sporije od ostalih vrsta memorija. Memorija nee raditi u sluaju pokuaja oitavanja ili upisa veom brzinom od dozvoljene. Osveavanje memorije troi dosta mikrokontrolerskog vremena. Zbog toga se DRAM memorija sve ree koristi i pored niske cene. Razvojem elektronike pojavljuje se SRAM (statika RAM memorija) po pristupanoj ceni. U njoj se memorijske elije sastoje od nekoliko tranzistora povezanih u formi Flip Flopa, tako da im osveavanje nije potrebno, a jednom upisan podatak ostaje u SRAM memoriji sve do upisa sledeeg ili do gubitka napona napajanja. Za razliku od DRAM, u SRAM memoriji je naputen princip multipleksa adresne magistrale (zbog vee brzine), tako da se adresa eljenog bita moe zadati u jednom koraku. Klasian njen predstavnik bila bi npr. 5564 memorija (SRAM 8Kbita * 8). Nezaobilazna je i EPROM memorija. Ona na sebi ima mali stakleni prozor preko koga se moe brisati. Naime, podaci se u EPROM mogu snimati preko odgovarajuih programatora specijalnom procedurom (kao snimanje koda u PIC). Taj proces obino zahteva vie napone od radnih (+12V umesto +5V). Kada se podaci jednom snime u EPROM memoriju, ne mogu se snimiti naredni sve dok se EPROM odreeno vreme ne izloi ultraljubiastoj svetlosti. Taj proces ubrzava curenje naelektrisanja isprogramirane EPROM memorije, i na taj nain se EPROM obrie. Tek onda je mogue ponovno programiranje. Veinu EPROM memorija mogue je postaviti u sleep mod, dovoenjem logike 1 na njen CE (eng. Chip Enable) pin. 115

Ukoliko je na OE (eng. Output Enable) pinu EPROM memorije prisutna logika 1, svi pinovi magistrale podataka (D0 pa nadalje) nai e se u stanju visoke impedanse. To omoguava multipleks magistrale podataka, i njeno deljenje izmeu EPROM i RAM memorije (Commodore 64 koristi isti princip sa svojom ROM memorijom). Pri radu sa bilo kojim eksternim memorijama morate obratiti panju na brzinu pristupa podacima (obino od 45nS do 450nS). Iako je uglavnom mogue donekle overklokovati memoriju, to ne predstavlja dobru praksu. Jednom e svakako stradati. Bolje da to bude to kasnije. Kao to uoavate za upotrebu adresne i magistrale podataka potreban je veliki broj pinova, ali joj je i brzina maksimalna. Zbog toga se najvie koristi u kompjuterima. Mikrokontroleri se zbog velikog broja potrebnih pinova uglavnom uopte ne povezuju sa eksternim hardverom adresnom magistralom, ve se sve vie razvija specifian hardver, kojim se odreenim komunikacionim protokolima moe upravljati manjim brojem pinova, uz manju brzinu pristupa. Za vie detalja pogledajte TB011 sa http://www.microchip.com/.

116

45. RS232 i RS423


Kako poslati podatak iz PIC mikrokontrolera u Va kompjuter? Postoje dva naina. Povezati potreban broj pinova porta B direktno za adresnu magistralu (npr. paralelni port kompjutera), i postaviti pinove porta B u odreeno 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 odreenom brzinom. Oigledno je da bi paralelni prenos podataka trebao biti mnogo bri od serijskog. Meutim, brzina kojom kompjuter moe proitati ove podatke je (u odnosu na PIC) toliko mala, da se ne dobija nikakvo znaajno poveanje brzine, a za prenos podataka je zauzeto vie pinova mikrokontrolera. Osim toga, paralelni port ima prilino nestandardan interfejs, a ni komercijalno nisu dostupni programi za njegovu upotrebu. Sledeim programom prenosi se poruka u kompjuter, preko serijskog (RS-232) porta. Najpre je potrebno uneti poruku koja e se poslati. Najlake je uneti je u PIC u obliku tabele. MPLAB asembler moe sam vriti konverziju ASCII koda, to olakava unos poruke. ASCII kod za slovo T, oznaava se sa a'T' ili 'T'. ; ****** Tabela sa tekstom ****** Text addwf PCL,F ; dodaj W na PCL dt 'Zdravo!', 0x0D, 0x0A, 0x00 ; Vraa karaktere, ; 0x0D Vraa znak Return ; 0x0A Vraa oznaku za novi red ; 0x00 Oznaava kraj teksta Da bi se na serijski port poslao karakter, potrebno je u jednom registru uvati redni broj slova koje se prikazuje (broj koji se dodaje na PCL) i pozvati rutinu za slanje karaktera, poveavajui svaki put vrednost u pointer registru. Kada se dodje do zadnjeg karaktera, iz tabele se vraa 0x00, na osnovu ega potprogram detektuje kraj niza karaktera. U rutinu se ulazi sa rednim brojem prvog karaktera (ofsetom) u W. Uzmi movwf Pet movf call addlw btfsc return call incf goto ; Postavi vrednost iz W u pointer poruke ; Stavi pointer u W ; Vraa ASCII karakter u W ; Setuje Zero flag ako je W = 0 ; Preskae ako Zero flag nije setovan ; Zavrava potprogram ako je W = 0 Slan ; alje karakter na serijski port POINTER,F ; Pozicioniraj pointer na sledei karakter Pet ; Jo karaktera POINTER POINTER,W Text 0x00 STATUS,Z

Serijski prenos podataka sastoji se od postavljanja odgovarajueg pina na logiku 0 i logiku 1 u tano odreenim trenutcima. Njegovo uobiajeno stanje je visok logiki nivo (1), a nizak nivo (0) pri tome oznaava startni bit. Pri brzini prenosa podataka od 4800 boda, vreme koje bit provede u stanju logike 0 treba biti 1/4800 = 208S. 8 bita podataka svaki trajanja jednog perioda slede za ovim startnim bitom. Visok logiki 117

nivo dui od perioda jednog bita oznaava stop bit. Bitovi se alju sa prvim bitom najmanje teine (LSB). Podatci se u kompjuteru itaju na polovini bitskog perioda, da bi se pouzdanije detektovalo da li je odgovarajui bit na logikoj 0 ili 1. Prilikom slanja ASCII koda slova A (b'0100 0001') u kompjuter bi se poslala ovakva sekvenca: START 0 0123 4567 1000 0010 STOP 1

Start i stop bit neophodni su radi sinhronizacije prijemnika sa predajnikom. Naponski nivoi RS232 porta su -3V ili nie za logiku jedinicu, i +3V i vie za logiku 0. Ovo se uglavnom moe zaobii, tako to se koriste nivoi od +5V za logiku 0 i 0V za logiku 1, ukoliko je kabl za povezivanje dovoljno kratak. Primeujete da je ovo obrnuto od onoga to biste mogli oekivati! Za tano odreivanje potrebnih pauza moe se koristiti ranije opisan potprogram za kanjenje sa 52 * 4S petljom za jednu bitsku periodu pri 4800 boda. Kako sam program za slanje traje 12S, u W e se nai broj 49. U potprogram se ulazi sa eljenim karakterom u W. Izlaz za kompjuter je na PORTA registru, bit 2 (pin 1). Izl movwf movlw movwf bsf movlw call rrf btfsc goto bsf goto Obr bcf nop TXREG 0x08 BITOVI PORTA,2 .49 Pau4 TXREG,F STATUS,C Obr PORTA,2 Kraj PORTA,2 BITOVI,F Pet .52 Pau4 PORTA,2 .104 Pau4 ; Stavi W u registar predaje ; 8 bitova podataka ; Brojac za bitove ; Startni bit (invertovan, seate se) +5V na RA2 ; 49 decimalno, vreme za kasnjenje ; U potprogramu za pauzu cekaj 49*4=196S ; Prebaci zadnji desni bit u Carry flag. ; Ako je Carry flag = 0, eli se setovanje bita ; (nizak naponski nivo) ; u protivnom je bit = 0 (visok nivo) ; +5V na pinu 1 (RA2) ; Je li gotovo? ; 0V na pinu 1 (RA2) ; da bi obe opcije trajale tano 12S ; 1 bit manje. Preskoi kada doe do 0 ; ima jo bitova. Kanjenje za slanje ovog. ; 52 decimalo, vreme za kanjenje 208S ; Kanjenje za zadnji bit podataka ; 0V (visoko stanje) za stop bitove ; 104 decimalno ; za dva puta dui stop bit ; Povratak

Pet

Kraj decfsz goto movlw call bcf movlw call return

U ovim potprogramima prikazane su skoro sve potrebne rutine potrebne da bi PIC poslao poruku Zdravo! u kompjuter preko serijskog porta. Ostalo je jo njihovo povezivanje. Program koji sve to povezuje, mogao bi izgledati ovako: 118

Slan bsf movlw movwf bcf clrf movlw call movlw call Blok goto

STATUS,RP0 0x00 TRISA STATUS,RP0 PORTA .50 Kas 0x00 Izl Blok

; Prebacuje u BANK1 ; Postavlja sve pinove kao izlazne ; na PORTA ; Vraa u BANK0 ; RA2 = 0 (RS232 visoko stanje) ; Kasnjenje od 50 mS ; preko potprograma za due pauze ; Ofset za prvi karakter poruke ; Slanje poruke u kompjuter ; Kraj u beskonanoj petlji

Malo komentara o programu: Svi bitovi na PORTA registru su postavljeni kao izlazi. Kako program koristi tabelu, potrebno je testirati njeno prekoraenje. Redosled potprograma, naravno, nije bitan. Bitno je jedino da glavni program (Slan) bude prvi. Za ispravan rad programa, potrebno je osigurati dovoljnu preciznost takta oscilatora, pa se ovaj program moe upotrebiti jedino uz kristalni oscilator od 4MHz. Za povezivanje sa kompjuterom dovoljno je pin 1 mikrokontrolera (RA2) povezati sa pinom 2 (RX) devetopinskog enskog SUB D konektora, i masu (GND) na pin 5 konektora. Kabl ne bi trebao biti dui od 1,5m. U protivnom, morali bi se koristiti odgovarajui drajveri (obino se to radi integrisanim kolom MAX232) namenjeni pretvaranju logikih nivoa sa pinova mikrokontrolera u nivoe pogodne za RS232 komunikaciju. Na strani kompjutera ukljuite Va terminalski program. U samom Windowsu imate Hyper terminal. Izaberite odgovarajui COM port i u podeavanjima izaberite 4800 bita u sekundi, 8 bita podataka, bez provere parnosti i jedan stop bit. Spojite konektor sa kompjuterom i ukljuite mikrokontroler. Svaki put kada ga ukljuite (ili resetujete), poruka Zdravo! e se prikazati na ekranu. U programu nije korien Shaddow registar zbog jasnije ilustracije. Meutim, u realnoj situaciji bilo bi ga korisno implementirati. Iako je za serijsku komunikaciju neophodan tano odreen takt oscilatora, postoje softverske tehnike koje omoguavaju RS232 komunikaciju merenjem signala sa kompjutera, i kalibrisanjem sopstvenog vremena signala i pauze po ovom signalu. Time je omoguena upotreba jeftinijeg RC oscilatora dovoljne brzine. Za detalje pogledajte tehnika uputstva AN510, AN555, AN593 i AN712 sa http://www.microchip.com/. Savremeniji PIC mikrokontroleri imaju hardverski reenu RS-232 komunikaciju. Kod RS423 drajvera prijemnik i predajnik su (kao kod RS232) polarizovani u odnosu na masu. Meutim, naponski nivoi su mu od -4 do -6 za logiku 1 i +4 do +6V za logiku 0. To omoguava da je (uz korienje istog komunikacionog protokola) RS423 kompatibilan sa RS232 drajverom, ali da moe postii brzinu prenosa podataka do 100kB/S, kao i da signal sa jednog predajnika mogu istovremeno primati 10 prijemnika. 119

46. Algoritmi za detekciju greaka


Prilikom prenosa podataka mogue je da se na spojnim putevima jave odreene smetnje. Na primer, ukoliko se mobilni telefon ukljui u blizini kablova kojim su povezani PIC i kompjuter. Prilikom slanja podataka infracrvenom vezom mogue je da svetlost sunca ili sijalice ometa ispravan prijem. Pri radio vezi smetnje bi mogla izazvati grmljavina ili aktivnost lokalnog radio predajnika. Kako bi mikrokontroler mogao ispravno primati signale i u sluaju smetnji, poeljno je softverski detektovati smetnje i (ukoliko je to mogue) ukloniti ih iz korisnog signala. To ne znai da se sa time treba preterivati (u primeru u prolom poglavlju pretpostavlja se da se mikrokontroler nalazi u neposrednoj blizini kompjutera pa je uticaj smetnji zanemarljiv), pogotovu to algoritmimi zauzimaju deo brzine i memorije mikrokontrolera i to su njima preneti podaci vei od originalnih, pa je slanje sporije. U vaem terminalskom programu primetili ste podeavanje provere parnosti. Kod nje bit nakon MSB sadri informaciju o ispravno primljenih ranijih 7 bita. Kako funkcionie 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: START 0123 4567 BIT PARNOSTI 0 1000 0010 0 STOP 1

Terminalski program u kompjuteru nakon prijema sabira redom bitove 0-7 i uporedjuje njihovu parnost sa primljenim bitom parnosti. U sluaju neslaganja prijavie greku ili e jednostavno ignorisati primljeni karakter. Ovaj princip je dovoljno pouzdan za detekciju greke nad jednim bitom poslatog podatka. Meutim, u sluaju pojave greke nad vie bitova bit parnosti nije dovoljan. Umesto provere bita parnosti moe se odreeni broj primljenih bajtova sabrati i uporediti njihov zbir. Na primer ukoliko se u kompjuter alju sledei podatci: 3, 8, 15, 4, 26, 87 u mikrokontroleru bi se izraunao 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). Naalost sa njim su preneeni podatci dui, a ni on nije pouzdan u sluaju pogreno primljena 2 (ili vie) bita (ukoliko na primer nije primljen nijedan bit podataka niti kontrolne vrednosti, svi primljeni bajtovi kao i njihov zbir bie jednaki 0, to pogreno indikuje ispravno primljene podatke). Ovo je ipak mnogo pouzdanije od provere parnosti. Vie o checksumu imate u TB026. Najpraktiniji nain detekcije greaka u prenosu postie se primenom CRC (eng. Cyclic Redundancy Check) algoritma, koji prua najbolji kompromis izmeu brzine algoritma, pouzdanosti detekcije greke i veliine dodatno prenetih podataka. Vie o njegovom principu imate u AN730. 120

U sluaju dvosmerne komunikacije (mikrokontroler ka kompjuteru i kompjuter ka mikrokontroleru) mogue je nakon detektovane greke u suprotnom smeru poslati podatak o rednom broju neispravnog podatka, i na taj nain zatraiti jedino njegovo ponovno slanje, ili pak ponovno slanje cele grupe podataka (tanije za signalizaciju greke pri RS232 vezi koriste se dodatni provodnici, ali se oni uglavnom izbegavaju). Svakako da je ovaj nain prilino vremenski zahtevan, a nije ni mogu u sluaju jednosmerne komunikacije. Da ti problemi prevazili primenjuju se algoritmi za korekciju greaka. Oni e biti detaljnije objanjeni u narednom poglavlju. Uglavnom je potrebno pronai kompromis izmeu najeih vrsta greaka i koliine prenetih podataka za spojni put (provodnici, optika veza, audio veza, radio talasi...) koji se koristi. Pri tome mnogo moe pomoi odgovarajui izbor modulacije signala. Prilikom RS232 komunikacije signali se moduliu preko odgovarajueg drajvera (MAX232) koji pretvara naponske nivoe od +5V i 0V u +15V i -15V, i dalje se oni tako modulisani prenose kroz provodnike. Kod USB ili I2C veze naponski nivoi su 0V i +5V. Kod ostalih vrsta spojnih puteva uglavnom je neophodno eliminisati jednosmernu komponentu napona (duu pojavu logike 0 i logike 1). Zbog toga se za modulaciju sporijih (npr. audio) veza mogu primenjivati RTTY, DTMF, FSK, PSK i razni drugi naini. Za modulaciju brih (npr. optikih) veza najee vrste modulacije su Manchesster, CMI, Miller, MCMI i 5B6B. Iako je radio, audio ili optika komunikacija nesumnjivo interesantna, prevazilazi okvire ovog uputstva, tako da e nadalje biti objanjena jedino veza ianim provodnicima. Uz neodgovarajui izbor modulacije nee Vam pomoi ni najbolji korektivni algoritam. Pogledajte samo kolike su razlike u brzini prenosa podataka preko RS232 i SPI veze, ili u daljini preko I2C i RS485 veze!

121

47. Algoritmi za korekciju greaka


Najjednostavniji algoritam za korekciju poslatih podataka zahtevao bi prenos podataka 3 puta, pri emu bi se za ispravno primljene podatke uzeli samo oni koji su bar u dva sluaja ista. Na taj nain istovremeno je realizovana i detekcija i korekcija greaka. Meutim, taj princip je prilino neefikasan, jer su preneti podaci tri puta dui od originalnih, pa i prenos podataka traje tri puta due. Algoritam za korekciju jednog bita u tri poslata bajta mogao bi se realizovati po sledeem principu. Pretpostavimo da je potrebno RS232 vezom preneti dva bajta (nazovimo ih A i B). Radi detekcije greaka alje se i bit parnosti. Neposredno nakon njih poalje se i bajt C koji predstavlja rezultat XOR operacije nad bajtovima A i B. Ispravna situacija izgledala bi ovako: A P 1011 1001 1 B P 0110 1011 1 C P 1101 0010 0

Meutim ukoliko bi u prenosu podataka dolo do greke u bajtu A, dogaa se sledee: A P 1010 1001 1 B P 0110 1011 1 C P 1101 0010 0

Prijemnik bi najpre na osnovu bita parnosti detektovao da je pogreno primljen bajt A. Da bi ga regenerisao primenjuje XOR nad ispravno primljenim bajtovima B i C. Ovo je slino zakonima u matematici: Ukoliko je A*B=C, onda vai i A=C/B i B=C/A. 0110 1011 B XOR 1101 0010 C = 1011 1001 A Da je pogreno primljen bajt B izvrila bi se XOR operacija nad bajtovima C i A, a da je pogreno primljen bajt C, ne bi se ni izvravala korekcija, jer su nam bitni jedino A i B. Specijalan sluaj predstavljao bi pogreno primljen bit parnosti A ili B bajta. Onda bi se regenerisani bajt uporedio sa originalnim, i u sluaju da su oba bajta ista zakljuio da je pogreno primljen upravo bit parnosti. Kako je proverom bita parnosti mogue 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 sluaju korupcije vie bitova, potrebno je koristiti drugaije algoritme.

122

48. I2C
RS232 komunikacija pogodna je jedino za direktno povezivanje dva ureaja. Njom je teko povezati PIC sa vie ureaja istovremeno (npr. sa A/D konvertorom, dodatnom EEPROM memorijom i jo jednim mikrokontrolerom). Svakako da je takvu komunikaciju mogue ostvariti direktnim povezivanjem pinova mikrokontrolera, ali to troi njihove dragocene pinove, i komplikuje softver zbog razliitih komunikacionih algoritama. I2C (eng. Inter Integrated Circuit bus) veza omoguava povezivanje mikrokontrolera sa jednim ili vie dodatnih ureaja koristei za to samo dva pina, i I2C komunikacioni protokol. Naravno, i ti ureaji moraju imati mogunost (softversku ili hardversku) I2C komunikacije. Zadnjih godina pojavljuje se sve vie hardverskih dodataka koji proiruju upotrebu mikrokontrolera, a za komunikaciju koriste upravo I2C vezu (umesto ranije adresne i magistrale podataka). U I2C vezi mogue je imati jedan glavni mikrokontroler (eng. Master) koji upravlja dodatnim I2C hardverom (eng. Slave), ili pak vie glavnih mikrokontrolera (eng. Multimaster) od kojih svaki moe upravljati dodatnim Slave I2C hardverom. U nastavku e biti opisan jedino prvi sluaj. I2C veza je specifina po tome to se logika 1 ne alje na uobiajeni nain, ve predajnik prilikom predaje logike 1 prelazi u stanje ulaza (visoke impedanse), a logika 1 se javlja pod uticajem (eksternog ili internog) pull up otpornika. Prijemnik je za to vreme takoe u stanju ulaza, ali on (za razliku od predajnika) vodi rauna o signalu koji prima. Na taj nain omoguena je komunikacija preko jedne linije, uz nemogunost kratkog spoja. Preko druge linije Master obezbeuje takt neophodan za sinhronizaciju prijemnika signala. Takt mora biti strogo sinhronizovan sa slanjem signala. Postoji ogranienje 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 poalje takt). Kako je algoritam I2C protokola razvijen tako da je nemogue da dva ureaja istovremeno alju podatke, svaki Slave ima svoju jedinstvenu adresu preko koje mu se pristupa. Jedan deo adrese mu fabriki dodeljen na osnovu funkcije, a drugi deo bira se fizikim prespajanjem pinova. Svakom Slave hardveru povezanom sa Masterom treba inicirati slanje ili prijem podataka. U sluaju da je potrebno neprekidno testiranje Slave hardvera, neprestano bi se izvravala njihova prozivka (kao u Vojsci). Prilikom prijema bajta za adresiranje Slave hardvera svaki od prikljuenih Slave detektuje da li se radi o njemu, i preduzima traenu akciju (obino slanje ili prijem par bajtova). Svaki Slave hardver ima svoje specifinosti tako da se moraju prouiti njegovi tehniki podatci. Na primer prilikom snimanja bajta u I2C EEPROM memoriju potrebno je poslati 7 bita za adresiranje ba tog Slave hardvera (resetovan LSB u njemu inicira upis), 2 bajta za adresu (za memorije do 64Kb) i 1 bajt podatka. Za itanje se alje 7 bita za adresiranje Slave hardvera (setovan LSB inicira itanje), 2 bajta za adresu i ita se 1 bajt. Poetak, kraj kao i razdvajanje bajtova realizovani su slino kao u RS232 komunikaciji preko START, STOP i jo par kontrolnih bitova. Isto kao RS232 i I2C protokol je hardverski implementovan u monijim PIC mikrokontrolerima. Za vie detalja pogledajte AN515, AN541, AN554 i AN578. 123

49. RS485, RS422


RS232 zahteva napone od -3V i nie, i +3V i vie. RS423 napone od -4 i nie, i +4 i vie. I2C napone od +5V i 0V. Meutim, njihovi drajveri koriste zajedniku masu, tako da i pored tolike razlike napona nisu pogodni za vee daljine zbog moguih smetnji. Smetnje koje mogu biti indukovane (u odnosu na masu) mogu na strani prijemnika uticati na pogrenu detekciju napona. Zbog toga je za vee daljine praktinije koristiti diferencijalni predajnik i prijemnik. Kod diferencijalnog primopredajnika umesto linije za signal i mase koriste se dve linije (A i B) za signal, i zajednika masa. Kada je na liniji A +5V na B je 0V i to predstavlja logiku 1. Logiku 0 predstavlja 0V na A i +5V na B liniji. U prijemniku se detektuje razlika napona na ove dve linije. Zbog uspene detekcije razlika napona mora biti bar 0,2V, ali drajveri e po RS485 standardu raditi i sa bilo kojim naponima od -7V do +12V. Kako se indukovane smetnje javljaju na svim provodnicima, one se potiru, omoguavajui brzinu prenosa od 10Mb/S do 10m daljine, ili 100kb/S do 1,2km. U sluaju da brzina nije bitna, softver se podeava za najmanju (a ipak dovoljnu) brzinu. U protivnom, postepeno se poveava brzina do pojave greaka. Onda se brzina malo smanji, i ostavi na toj vrednosti. Za detekciju greaka mogu se koristiti ranije opisani algoritmi. Poetni i krajnji drajver trebaju na svojim ulaznim / izlaznim pinovima imati terminatorske otpornike kojima se eliminie refleksija signala sa krajeva linija. Budui da je preko PIC mikrokontrolera mogue jedino predati, a ne i primiti signale sa RS485 veze (Ovo nije sasvim tano. Za detekciju bi se mogli koristiti integrisani komparatori napona ili A/D konvertori prisutni u monijim mikrokontrolerima, ali sa loijim rezultatima), za detekciju signala moraju se koristiti MAX485, TI 75175, DS1487 ili SN75176 drajveri. Iako je sasvim mogue direktno sa pinova mikrokontrolera proizvoditi potrebne predajne napone, poeljno je i za to koristiti ova kola, jer su ona projektovana tako da smanjuju elektrine smetnje, ak i u sluaju nepostojanja terminatorskih otpornika. Iako je primenom RS485 komunikacionog protokola mogue postii velike daljine koristei jeftine linije (npr. telefonske parice), radi boljih rezultata i veih daljina poeljno je izabrati provodnike ija je impedansa priblino jednaka ulaznoj impedansi prijemnika. Za manje brzine i daljine ovo ne bi trebalo predstavljati problem. Pre projektovanja kola, prouite tehnike podatke odgovarajuih kola, jer se njihove karakteristike prilino razlikuju. Na primer uz MAX481, MAX483, MAX485, MAX487 i MAX1487 mogue je ostvariti dvosmernu naizmeninu 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 mogue je realizovati repetitor signala koji postavljen na polovini linije regenerie signal i tako omoguava duplo due linije. Postoje i galvanski izolovani drajveri (pogodni za podruja sa jakim smetnjama grmljavinom), npr. MAX253 i MAX1480. Ipak, najbolje je u tim sluajevima ukopati linije ili koristiti koaksijalne ili optike kablove (jo kada bi i Telekom Srbije to shvatio). 124

Kako je RS485 protokolom mogue da se pinovi predajnika iskljue (tako to preu u visokoimpedansno stanje slino ulazima mikrokontrolera), mogue je na taj nain kao u I2C protokolu preko istih linija paralelno povezati vie mikrokontrolera. Naravno, mora se povesti rauna o spreavanju istovremene predaje (npr. pojedinanim asdresiranjem kao u I2C protokolu). Ovo je mogue jer RS485 standardom nije propisan komunikacioni softver, ve jedino hardver. To znai da moete napisati sopstveni komunikacioni protokol (ili koristiti gotovi RS232 pogotovu ukoliko je hardverski implementovan u mikrokontroleru) koji e zadovoljiti vae konkretne potrebe. To prua slobodu programeru da unutar protokola ugradi sopstvene algoritme prozivke vie dodatnih mikrokontrolera (do 32 ili uz vie drajvera u jednom integrisanom kolu do 256), algoritme detekcije i korekcije greaka, jednom reju da koristei standardan stabilan komunikacioni hardver softverom komunicira na koji god nain eli. Korienjem repetitora mogue je realizovati virtuelno beskonane mree. Meutim uz vee daljine i vie povezanih mikrokontrolera (pogotovu uz repetitore) kanjenje signala moe biti preveliko. to due linije, to vee kanjenje, samim tim i manja brzina. Najvea razlika izmeu RS485 i RS422 protokola je u predajniku. RS422 predajnik ne moe se nai u stanju visoke impedanse, tako da mikrokontroler moe jedino slati signal preko dve linije, dok bi taj signal moglo istovremeno primati do 10 prijemnika. Za vie detalja pogledajte AN1076. Osim ovih, postoji jo par RS (eng. Recommended Standard) protokola poput RS449 i RS530, meutim budui da oni predstavljaju varijaciju ve opisanih principa, kao i da se retko kada koriste, ovde nee 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. Kako se DMX512 protokolom povezuje jedan predajnik sa vie prijemnika samo u jednom smeru, prijemnici nemaju nain signalizacije neispravno primljenog podatka. Konkretno za sluaj rasvete, to im nije ni potrebno. ak i da doe do greke, ionako e naredni podatak sadrati ispravnu vrednost jaine svetla. DMX512 protokol napravljen je tako da se podaci neprestano (tanije bar jednom u sekundi) alju prijemnicima. Poto je RS232 komunikacioni protokol integrisan u novijim mikrokontrolerima, DMX512 predstavlja modifikaciju RS232 protokola kako bi se njim preko RS485 drajvera moglo adresirati do 512 prijemnika. Modifikacija se sastoji u drugaijem obliku START bita (dosta dua logika 0 pa 1), STOP bita (dve logike 1) i rednom slanju svih 512 bajtova sa STOP bitovima izmeu njih. Broj poslatih bajtova mogao bi se smanjiti za sluaj manjeg broja prijemnika. Prijemnici bi morali redom brojati primljene bajtove kako bi videli koji je bajt za njih. Vie detalja imate u AN1076 i na www.esta.org.

126

51. LIN
LIN komunikacioni protokol podrava dvosmernu komunikaciju preko jednog provodnika (+ masa). Protokol je nastao ukrtanjem I2C i RS232 protokola. Napon na liniji je u neaktivnom stanju na nivou logike 1 generisane (kao kod I2C) pull up otpornikom. Bilo koji lan mree (eng. nod) moe na liniju poslati logiku 0, koja na taj nain prelazi u dominantno stanje i brie postojeu logiku 1. Za razliku od I2C veze umesto linije za takt, podaci se kroz provodnik prenose asinhrono, kao kod RS232 veze. Napon na liniji (generisan pull-up otpornikom) iznosi od 9 do 18V u odnosu na masu. LIN protokol je zbog veeg broja nodova napravljen tako da mikrokontrolerima omogui to jeftiniji hardver, pa je zato mogue koristiti RC oscilatore, pri emu se svi slave nodovi softverski sinhronizuju sa masterom po prijemu njegovog signala. Zbog toga kao sinhronizacioni impuls pre svake poruke master alje bajt b'01010101'. Tako je svakom slave nodu omoguena sinhronizacija korekcijom sopstvenih vremenskih rutina u skladu sa primljenim bitskim vremenima logike 0 i 1. Nakon sinhronizacionog bajta sledi jednobajtno zaglavlje, u kome se saoptava kakvi podaci slede. U njemu 4 bita (bit 0 do bit 3) adresiraju nodove na liniji, 2 bita (bitovi 4 i 5) odreuju duinu informacija (2, 4 ili 8 bajtova), i zadnja 2 bita (6 i 7) slue za proveru parnosti zaglavlja. LIN protokolom nije specifiran format narednih informacija, osim SLEEP komande i checksuma informacija. Kako nakon pojave greke LIN protokolom nije omoguena njena prijava, master moe u delu sa informacijama zatraiti prijemni status od pojedinanih nodova. Svi nodovi mogu primati poruke od ostalih nodova direktno, tako da dodatna intervencija mastera u tom sluaju nije potrebna. Ipak, master mora obezbediti povremenu prozivku nodova u sluaju da su njihovi podaci potrebni ostalim nodovima. Master moe 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 otii u sleep mod. Bilo koji nod moe probuditi ostale slanjem 0x80 koda. Po njegovom prijemu svi nodovi se bude i ekaju dalje informacije od mastera. LIN protokol nije stekao veliku popularnost zbog kanjenja u proizvodnji odgovarajuih integrisanih drajvera, male daljine i podlonosti smetnjama usled direktno polarisane linije. Za vie detalja pogledajte AN729, AN235 i AN237.

127

52. DALI
DMX512 komunikacija je jednosmerna. Zato joj je primena ograniena na upravljanje rasvetom. Meutim, njen princip je nepraktian u sluaju kvara sijalice (reflektora). Zgodnije bi bilo kada bi bilo mogue da drajver za sijalicu detektuje da li ona zaista radi, i da po potrebi obavesti master o kvaru. DALI (eng. Digitally Addressable Lighting Interface) protokol je namenjen upravljanju pre svega fluo cevima. Zbog ega ba njima? Zbog toga za istu potronju elektrine energije jau svetlost od njih (Lm/W) daju jedino metal-halidne, sodijumske (i niskog i visokog pritiska) sijalice, kriogenske i retki Luxeon eksperimentalni tipovi LED. to se tie poetnih investicija, od svih ovih tipova jedino fluo cevi se mogu nabaviti po povoljnoj ceni. Iako jedna fluo cev kota oko 1,3 (u odnosu na sijalicu sa uarenim vlaknom koja je oko 0,2), vremenom e se isplatiti kroz manji raun za elektrinu energiju. Verujte mi na re. Imam ih u svim prostorijama osim kupatila (zbog vlage). Iako se regulacija svetlosti sijalica sa uarenim vlaknom lako implementira faznom regulacijom, kod fluo cevi sa prigunicama je to mnogo tee izvesti. Tek su se oko 2000-te godine pojavili tranzistori dovoljno jeftini i dovoljno velikog probojnog napona da mogu posluiti kao konvertori mrenog napona u napon potreban za rad fluo cevi. Taj princip koristi DALI za funkciju dimera (eng. DALI dimming ballast). Dimerom je omogueno da se potronja elektrine energije jo vie smanji. Na DALI interfejs mogue je povezati do 64 nodova. Regulacija svetlosti postignuta je u 255 koraka, ali logaritamskog odnosa. On prua prirodniji odnos pojaanja i smanjenja svetlosti. Takoe je mogue proizvesti i mone efekte postepenog pojaanja ili smanjenja svetla, podeavalje svetla po grupama i slino. DALI protokol nema posebne integrisane drajvere. Umesto njih, implementirani su diskretnom tehnologijom. Tanije, za prijem i predaju signala koriste se optokapleri, ime je pored niske cene drajvera omogueno i galvansko odvajanje linije od mrenog napona. Kako je DALI protokol rezultat saradnje Microchipa i International Rectifiera, dodatne informacije o DALI protokolu mogu se jedino naruiti na CD-u sa sajta http:// www.irf.com/product-info/lighting/. Za vie detalja pogledajte AN809 i AN811.

128

53. SPI
SPI (eng. Serial Peripheral Interface) predstavlja komunikacioni protokol namenjen brzom prenosu signala, na kratkim odstojanjima. Iako SPI protokol nema ogranienje najmanje brzine, zbog breg prenosa vee koliine podataka se mikrokontroleru obino zabranjuje izvravanje ostalih operacija. Upravo zbog toga Va digitalni foto aparat ne moete istovremeno koristiti kao web kameru, niti na MP3 plejeru ne moete sluati muziku dok je povezan sa kompjuterom. Obino se koristi prilikom komunikacije sa serijskim EEPROM memorijama, kao i memorijskim karticama (MMC, SD, xD, CF...). Iako memorijske kartice u osnovi predstavljaju veliku EEPROM memoriju, imajte u vidu da je proces formiranja sistema za podrku fajlova (eng. Filesystem npr. FAT16, FAT32 ili NTFS) u memorijskim karticama kao i sistem snimanja i itanja fajlova iz takvog fajl sistema prilino komplikovan, tako da PIC16 serija mikrokontrolera obino nema dovoljno resursa za njeno efektno korienje. SPI protokol slian je I2C protokolu, sa glavnom razlikom adresiranja raznih slave ureaja preko posebnog pina, a ne prozivkom njihove adrese. Na taj nain 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 odgovarajui slave SPI hardver prisutna logika 0, onda e on reagovati na signale sa ostale dve linije. U protivnom, ignorisae ih i njegovi pinovi bie neprestano u stanju visoke impedanse, omoguavajui adresiranje ostalih slave SPI hardvera. Interesantna je mogunost istovremenog slanja podataka svim Slave hardverima ukoliko su sve CS linije na logikoj 0 (svi slave oekuju podatke). Isto kao kod I2C protokola, mikrokontroler (master) je uvek zaduen za generisanje takta preko SCK linije. Preko druge (SI) linije sinhronizovano sa taktom alju se podatci u ili iz mikrokontrolera. Za vie detalja pogledajte AN248, AN648 i AN909. Isto kao i RS232 i I2C kod monijih mikrokontrolera je SPI hardverski implementovan.

129

54. INKnet
RS485 standardom propisan je jedino hardver. INKnet predstavlja softver razijen od strane Ed Nisley-ja, a iji su principi opisani u Circuit Cellar asopisu. Za razliku od DMX512 protokola, INKnet protokolom mogua je dvosmerna komunikacija. Iako je INKnet protokol prvenstveno razvijen za 8052 mikroprocesor (tih godina su mikrokontroleri bili retki i skupi), protokol se moe iskoristiti ili prilagoditi bilo kom dananjem mikrokontroleru. Komunikaciju inicira centralni mikrokontroler (master), aljui zahtev za informacijama pojedinanim elijama (nodovima - eng. node). Oblik poruke je takav da se u njoj pre informacije alje desetobajtno zaglavlje, a nakon njega informacije sve do maksimalne veliine poruke od 255 bajtova. bajt 0 rezervisano, mora biti 0 bajt 1 duina poruke sa zaglavljem (9 do 255) bajt 2 adresa noda primaoca informacije bajt 3 komanda primaocu bajt 4 adresa noda poaljioca informacije bajt 5 adresa rezervisanog noda bajt 6 MSB bajt status flagova noda bajt 7 LSB bajt status flagova noda bajt 8 LSB bajt checksuma bajt 9 MSB bajt checksuma bajtovi 10 do 255 informacije Uoavate da je ovim nainom mogue poslati maksimalno 245 bajtova informacija. Vie informacija moralo bi se poslati unutar vie poruka (kao SMS poruke). Iako svi nodovi mogu istovremeno primiti informacije, master je taj koji e na osnovu zaglavlja (i informacija) regulisati rad i komunikaciju izmeu nodova. Slino kao adresa noda primaoca i poaljioca, rezervisani nod e nadalje odgovarati na poruke poaljioca 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 proiriti, to zavisi od konkretnih zahteva mree. 80 - POLL Poll from master to node 81 - STATUS Status response from node to master 82 - UNBUSY Force node "unbusy" regardless of actual status (use with caution!) 88 - RESERVE Reserve node for exclusive use of "from" node (except for polls & responses) 89 - RELEASE Release node for general use (may be sent by any node) 90 - CONSOUT Console output (to display) 91 - CONSIN Console input (from keyboard) 92 - CONSECHO Echo of console input message 93 - CONSFILE Console input (from file) 130

Unutar status bajta noda, takoe (kao kod STATUS registra mikrokontrolera) odreeni flagovi opisuju funkcije noda. Flagovi su sledei: 15 - BUSY Node is busy handling previous message 14 - OVERRUN At least one previous message was lost 13 - ECHO Node will echo all CONSIN messages 12 - LFSTRIP Node strips LF after CR on CONSIN msgs 11 - CSUM Node detected a checksum error 10 - reserved 09 - reserved 08 - MASTER Node is network master Flagovi od 0 do 7 su rezervisani. Ovakav princip omoguava efikasnu integraciju standardnog RS485 drajvera i namenskog softvera za pravljenje sopstvene mree mikrokontrolera. Detekcija greaka implementirana je checksumom, a korekcija ponovnim slanjem informacije ukoliko prijemni nod poalje zaglavlje sa setovanim CSUM bitom njegovog status bajta. Za vie detalja pogledajte asopise Circuit Cellar broj 10 (avg/sep 1989), 11 i 12. U njima moete pronai i objanjenja interesantnih principa komunikacija bez mastera (detekcijom kolizije ili rednim transferom dozvole predaje od jednog ka drugom nodu). Unutar istih asopisa moete videti i organizacionu strukturu sloenijih komunikacionih protokola, formiranu po slojevima (eng. Layers) u CEBus protokolu. Za jednostavniji komunikacioni protokol preko RS485 drajvera pogledajte asopis Circuit Cellar broj 21.

131

55. S-ARTnet
INKnet protokol sa RS485 drajverima pored oiglednih 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 nain smanjiti. S-ARTnet (eng. Serial, Addressable, Receive/Transmitter) protokol reava ovaj problem, tako to se kroz dva provodnika prenosi i napon napajanja i koristan signal. Ovo je omogueno tako to izlazni napon drajvera moe biti 15V, 7,5V ili 0V. Prijemnik na osnovu ovih napona detektuje da li je poslata logika 0 ili logika 1. Kako napon od 0V traje prilino kratko, nodovima e za to vreme napajanje obezbeivati kondenzator. S-ARTnet protokolom mogue je adresirati do 30 slave nodova. S-ARTnet protokol kao i INKnet ima master koji za komunicira sa pojedinim slave nodovima. Meutim, 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. Adresa odgovarajueg slave noda hardverski se postavlja povezujui pinove CS212 kola ka masi ili naponu napajanja (slino kao kod I2C). Master i slave nodovi komuniciraju preko 10-bitnih poruka. Poruka moe biti jedna od 3 sledea tipa: 1. Sinhronizacija Master alje poruku 0111111110. Na osnovu nje svi slave nodovi sinhronizuju svoj takt. 2. Pii Master alje poruku tipa A0 A1 A2 A3 A4 Pa Wr D0 D1 Pd gde A0 do A4 bitovi sadre adresu eljenog noda, D0 i D1 logiko stanje koje se treba postaviti na izlaznim pinovima CS212 kola, Wr bit (1 za indikaciju upisa) i Pa i Pd bitove za proveru parnosti adrese i ostatka poruke 3. itaj Master alje poruku A0 A1 A2 A3 A4 Pa Rd gde su A0 A4 bitovi adrese, Pa bit za proveru parnosti adrese i Rd bit (0 za indikaciju itanja). Po prijemu, CS212 alje poruku I0 I1 Pd gde su I0 i I1 logika stanja na njegovim ulaznim pinovima, a Pd je bit provere parnosti. S-ARTnet kao ni DALI ne sadri integrisane drajvere za master, ali ih ima u CS212 kolima. Neophodna konverzija logikih nivoa se za master obezbeuje odgovarajuim konvertorima signala. Preko ovog protokola master moe adresirati do 30 slave nodova, odnosno oitavati 60 udaljenih ulaznih pinova, i postavljati do 60 udaljenih izlaznih pinova slave nodova. Po potrebi, master moe periodino vriti prozivku svih nodova. Zbog male duine poruka i trostepenog stanja na liniji, mogue je prozivati svih 30 nodova 6 do 7 puta u sekundi. Vie o ovom protokolu imate u asopisu Circuit Cellar broj 21.

132

56. CAN
Svi raniji principi zahtevaju softversku detekciju i/ili korekciju greaka u okruenju podlonom smetnjama. Naravno da je to mogue uraditi (kao u INKnet protokolu), ali Microchip se potrudio pa je softver koji bi inae optereivao mikrokontroler prebacio u hardver. Tako jedno integrisano kolo (MCP2510 ili MCP2515) obavlja komunikacionu funciju (u kojoj je implementirana CRC detekcija greaka, korekcija greaka, 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. Meutim, za razliku od RS485, CAN standardom propisan je i komunikacioni protokol. U njemu je mikrokontroler rastereen od komunikacionih algoritama, i moe svu svoju snagu upotrebiti za ono za ta je i namenjen. Po CAN protokolu ne vri se (kao kod I2C ili INKnet) prozivka svakog pojedinanog noda. Ne. Nodovi se ne adresiraju ni posebnim pinovima kao kod SPI protokola. Umesto toga, nodovi su ravnopravni. Svi oni moraju odreeno vreme oslukivati stanje na liniji pre nego to ponu sa predajom, kako ne bi upali u ve postojeu vezu. Ukoliko se ipak dogodi da dva ili vie nodova istovremeno zaponu predaju podataka, na scenu stupa kolo za detekciju kolizije (eng. Collision Detection). Po detekciji kolizije nod koji je prvi predao logiku 0 unutar podatka nastavlja sa predajom, dok ostali (im detektuju 0 dok u stvari alju 1) momentalno prestaju sa predajom, ekaju dok se ne zavri sa slanjem kao i neko vreme nakon toga (da se ne bi javilo novo preplitanje), i tek onda pokuavaju novu predaju. Kako je logika 0 dominantna, ona e uvek prebrisati logiku 1 (slino kao u I2C). Na taj nain podatak e stii do prijemnika neizmenjen i bez ikakvog kanjenja ili korekcije, a za komunikaciju se (zbog iste linije za slanje i prijem podataka) koriste samo dva provodnika (i zajednika masa). U CAN mrei pojedinani nodovi nemaju adrese. CAN protokol nije adresno ve komandno orjentisan sistem. Zbog toga nodovi obino komuniciraju izmeu sebe periodino aljui poruke po liniji. Ako je nekome potrebna, eto mu je. Ukoliko nije, ignorisae se. Struktura CAN protokola omoguava upotrebu hardverskih CAN ekspandera (kao kod S-ARTnet veze). Microchip je zakljuio da se veliki broj nodova sastoji jedino od odgovarajueg 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 mreu, i ijim je hardverom mogua direktna manipulacija od strane ostalih (inteligentnijih) nodova. Za vie detalja pogledajte datasheetove drajvera, komunikacionog ipa, CAN I/O ekspandera, AN215, AN228 i AN754. Razvitkom CAN mree originalni protokol pretrpeo je izmene softvera, pa je mogue sresti verzije CAN 1.2, CAN 2.0A, CAN 2.0B i ECAN. Na sreu, novije verzije podravaju starije (eng. backward compatibile). Za vie detalja pogledajte AN916. 133

Jedan deo do sada opisanih komunikacionih protokola je hardverski integrisan u jaim serijama mikrokontrolera. To ipak ne znai da se slabiji mikrokontroleri (itaj PIC16F84) ne mogu koristiti za odreene vrste komunikacija. Uvek je mogue (u sluaju da je mikrokontroler dovoljno brz) pravovremeno direktno manipulisati ulazno izlaznim pinovima, i na taj nain ostvariti softversku implementaciju hardverskih komunikacionih rutina (eng. bit-banging) kao to je ilustrovano u RS232 vezi. Taj nain nekada moe biti i neophodan (na primer prilikom istovremene upotrebe 3 RS232 veze jednim mikrokontrolerom). Komunikacioni protokoli ne prestaju da se razvijaju. I sami verovatno znate da se nekada mogao koristiti jedino dial-up, zatim ISDN, a onda ADSL. Brzina i dalje raste. Mikrokontroleri su u potpuno istoj situaciji.

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 sledeoj tabeli dat je uporedni pregled ovde opisanih vrsta komunikacije sa svojim specifinostima:
Paralelna ne RS232 MAX232 RS485 MAX485 DMX512 MAX485 SPI ne ne I2C da LIN DALI PC357NT S-ARTnet da CAN MCP2551

drajver

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 ograniena 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 korek.gresaka ne zav. od soft. max. napon 0V, +5V -25V, +25V drajvera osetljivost zavisi od +-3V, prijemnika hardvera prema masi neaktivno 0V preko +3V stanje nain pren. zav.od hard. asinhroni simpl.br.prov dupl.br.prov. repetitor ul. impedansa zav. od mag. zav. od mag. / zav.od hardv. 1 + masa 2 + masa / 3k do 7k zav. od soft. ne -7V, +12V -7V, +12V

ne
0V, +5V

ne
0V, +5V

checksum zav. od soft. ?


0V, +18V ?

parnosti ne
0V, 7.5V, 15V

hardverska
-40V, +40V +-0,5V diferencijalni nema signala asinhroni 2 + masa / 100k

+-0.2V +-0.2V zavisi od zavisi od zav. od drajv. +-?V trostepena diferencijalni diferencijalni hardvera hardvera diferencijalni zavisi od preko 0,4V nema takta visoka imp. bez Preko 9V preko ?V 15V softvera razlike u + takta razlike u + razlike zav. od soft. asinhroni sinhroni sinhroni asinhroni asinhroni asinhroni 2 + masa 4 + masa da >=12k 2 + masa / da >=12k 4 + masa / / zav.od hardv. 2 + masa / / zav.od hardv. 1 + masa 2 / / / / zav. od drajv. zav. od optok. 1+masa / / zav. od hardv.

160

58. Paralelna D/A konverzija


Ovde e biti prikazana dva hardverska naina realizacije paralelnog D/A konvertora. Paralelna D/A konverzija za razliku od serijske zauzima vie pinova, ali daje stabilniji generisani napon i ne optereuje mikrokontroler. Pogledajte najpre hardversku realizaciju paralelnog D/A konvertora principom binarne teinske otporne mree (eng. binary weighted DAC). Decimalni Bitovi broj RB3 RB0 0 1 2 3 4 Ovde je primenjena binarna otporna mrea kod koje je otpornost povezana na pinove bita vee teine dva puta manja. Na PORTB dovoljno je dovesti eljenu binarnu kombinaciju, i na izlazu e se odmah javiti stabilno analogno stanje. Zbog karakteristika ove mree, bitovi vee teine vie utiu na stanje izlaznog napona od bitova manje teine. Tako setovanje RB3 pina podie napon za 2,51V, a RB0 za samo 0,48V. Zbog bolje linearnosti idealno bi bilo upotrebiti otpornike sa dupliranom vrednou prethodnih. Meutim, to zbog standardnih vrednosti otpornika poskupljuje realizaciju. 5 6 7 8 9 10 11 12 13 14 15 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Izlazni Napon 0V 0,48V 0,87V 1,21V 1,55V 1,79V 1,99V 2,17V 2,51V 2,63V 2,75V 2,85V 2,96V 3,05V 3,12V 3,20V

Kako je impedansa izlaznih pinova (pri oba logika stanja) PIC mikrokontrolera prilino niska (manja od 75 pri naponu napajanja od 5V) daljim irenjem otporne mree ne bi se postigli zadovoljavajui rezultati, pre svega u pogledu linearnosti izlaznog napona. Osim toga, preciznost ovog kola u velikoj meri zavisi od tanih vrednosti i tolerancije upotrebljenih otpornika. Po potrebi binarna teinska mrea moe se napraviti sa logaritamskom a ne linearnom karakteristikom izlaznog signala. To moe biti od koristi kod poveanja dinamikog opsega govora u sistemima za digitalizaciju zvuka, jer po Laplacianovoj distribuciji oblast oko napona bliskog 0 nosi vie informacija od oblasti sa veim amplitudama. Za vie detalja ovakve teinske mree pogledajte http://www.ke4nyv.com/index2.htm. U situacijama kada je neophodna vea rezolucija D/A konvertora moe se koristiti D/ A konvertor sa R-2R otpornim nizom (eng. R-2R ladder DAC). 136

Kod ove eme, umesto dupliranja vrednosti otpornosti koriste se otpornici istih vrednosti. Korienjem integrisanog otpornog niza, kolo sa ovakvom emom moe ak imati manje dimenzije. Rezolucija ovog kola je osmobitna. To znai da se ovim kolom moe (za razliku od prethodnog) dobiti ak 255 stabilnih analognih stanja. U tablici moete videti neke tipine vrednosti izlaznog napona u zavisnosti od postavljenog binarnog stanja na PORTB. Decimalni broj 0 27 53 79 105 157 209 235 255 RB7 RB0 Izlazni napon 0V 0,5V 1V 1,5V 2V 3V 4V 4,5V 5

00000000 00011011 00110101 01001111 01101001 10011101 11010001 11101011 11111111

Linearnost ovog kola je skoro idealna, a zavisi jedino od tolerancije upotrebljenih otpornika. Za kompletnu tablicu izlaznih napona i detalje pogledajte AN655 sa http:// www.microchip.com/.

Za generisanje sloenijih talasnih oblika izlaznih napona, najpraktinije je uzimati bajtove za POTRB iz tabele. Tako se mogu sa lakoom realizovati testerasti, trouglasti, sinusoidni oblici napona, pa ak i DTMF tonovi. Ukoliko mikrokontroler treba izvravati i druge operacije za vreme generisanja signala, moete jednostavnije funkcije realizovati i softverski. Na primer, u interapt rutini moete neprekidno poveavati stanje PORTB registra. Tako dobijate testerasti signal. Naizmeninim poveavanjem i smanjivanjem stanja PORTB registra dobijate testerasti signal. I sinusni signal moete dobiti korienjem matematikih funkcija.

137

59. Serijska D/A konverzija


Serijska D/A konverzija koristi drugaiji princip. Kod nje se kondenzator na izlazu naizmenino puni i prazni tano odreenim odnosom, odravajui 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 moe se implementirati softverski. Ova tehnika esto se koristi za ukljuenja i iskljuenja prekidakog tranistora odreeno vreme. Na primer ukoliko je napon +12V a tranzistor provodi 25, 50 ili 75% vremena, efektivni napon bie 3, 6 i 9V. Minimum napona postojae kada je na pinu neprekidno prisutna logika 0, maksimum kada je neprekidno prisutna logika 1, a polovina kada se na 50% periode naizmenino menja logiko stanje pina. Ovaj nain D/A konverzije uglavnom se upotrebljava za regulaciju brzine motora jednosmerne struje. Nije pogodan za primene u kojima je potrebna vea stabilnost izlaznog signala zbog generisanja smetnji i harmonika.

Nastavak sledi

Pored ovih, postoji jo mnogo, mnogo principa po kojima se moe implementovati D/ A konverzija. Pogledajte http://en.wikipedia.org/wiki/Analog-to-digital_converter za vie detalja. Za PIC16F84 od znaaja bi mogao biti interesantan nain modulacije tona sa download sekcije sajta www.elektronika.ba (picsound). Gornja granina frekvencija koju moete dobiti bilo kojim od prikazanih nainina D/ A konverzije zavisi iskljuivo od brzine oscilatora mikrokontrolera. Svakako da je moete poveati manjim brojem razliitih semplova koje koristite za generisanje eljenog talasnog oblika, ali u tom sluaju 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 prilino istog sinusoidnog signala, ali je za generisanje DTMF tonova neophodna bar osmobitna rezolucija. Ukoliko se mikrokontrolerom generiu sinusoidalni naponi stalne frekvencije, poeljno je na izlazu D/A konvertora staviti analogni filter, propusnik eljenog opsega frekvencije. Posebno je to poeljno kod serijskih D/A konvertora zbog harmonika i smetnji koje oni generiu.

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. Meutim, uz jednostavan interfejs sa njim je mogue meriti odgovarajue vrednosti napona. U narednim poglavljima bie prikazano par principa A/D konverzije. Da biste shvatili rad raznih vrsta A/D konvertora morate se najpre upoznati sa principom rada naponskog komparatora. Naponski komparator nalazi se integrisan u savremenijim verzijama PIC mikrokontrolera. Meutim, iako ga PIC16F84 nema, moe mu se dodati spolja. 4 naponska komparatora u sebi sadri popularno analogno integrisano kolo LM339. Sa jednim kolom mogue je detektovati 5 decimalnih stanja, a sa dva 9 stanja. Kako je LM339 potpuno analogno kolo, da biste na njegovom izlazu dobili naponske nivoe logike 0 i logike 1, morate ga napajati istim naponom napajanja kao i PIC (+5V). ta u stvari radi naponski komparator? On poredi (eng. Compare) napone svoja dva ulaza, i ukoliko je jedan vei 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 poveava od 0 do 5V, izlaz komparatora bie u stanju logike 0 sve dok napon na drugom ulazu ne pree zadatih 3V. Najtee e se naponski komparator snai ukoliko se pogodi da je napon na oba ulaza potpuno isti (3V). Ka kom e izlazu (logika 0 ili logika 1) tada biti naklonjen uglavnom zavisi od stanja izlaza neposredno pre jednakih napona. Jedini predstavnik potpuno paralelnog A/D konvertora je Flash A/D convertor. On je realizovan pomou vie naponskih komparatora. Na jedan ulaz svih komparatora doveden je mereni napon, a na drugi su dovedeni referentni naponski nivoi koji se redom smanjuju od najveeg do najmanjeg. Pri tom smanjivanju moe se (menjanjem vrednosti otpornika) koristiti logaritamski ili linearni odnos napona. Glavna prednost Flash konvertora je kako mu ime kae (eng. munja) njegova brzina. Kako on nije vezan za takt mikrokontrolera, kompletnu A/D konverziju moe obaviti trenutno. Meutim, ima on svoje mane. Broj upotrebljenih naponskih komparatora direktno odreuje broj stanja izlaza. Ako elite flash A/D konvertorom realizovati etvorobitnu konverziju, bie Vam potrebno 16 ulaza (i 16 ulaznih pinova mikrokontrolera). Za osmobitnu konverziju potrebno je 255 ulaza. Pinovi RB4 do RB7 upotrebljeni su jer se njima moe izazvati interapt pri promeni ulaznog napona. Iako je problem velikog broja ulaznih pinova mogue prevazii upotrebom odreenih digitalnih konvertora u binarni format, ovoliki broj naponskih komparatora nije ba najjeftiniji. Zato se ovaj tip A/D konvertora retko koristi. 139

61. Brojaki A/D konvertor


Ovaj tip A/D konvertora u stranoj literaturi (eng.) se jo sree sree pod nazivima Counting ili Digital ramp. Zamolite svog prijatelja da zamisli broj izmeu 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 uopte pribliite zamiljenom broju. Njemu e dosaditi. Mikrokontroleru nee. Ovaj A/D konvertor specifian je po tome to mu je za rad potreban D/A konvertor. Taj D/ A konvertor u emi je realizovan R/2R otpornim nizom. Izlaz D/A konvertora vodi se na jedan ulaz eksternog naponskog komparatora, a na drugi ulaz dovodi se mereni napon. Izlazni napon D/A konvertora se poveava korak po korak (od 0V do 5V). U trenutku kada naponski komparator promeni stanje, oita se trenutno stanje na izlaznim pinovima D/A konvertora. To stanje odgovara merenom analognom naponu. Sasmim tim preciznost A/D konvertora u najveoj meri zavisi od preciznosti D/A konvertora. Verovatno i sami uviate manu ovog principa. Ukoliko je mereni napon blizu svoje maksimalne vrednosti, mikrokontroler mora D/A konvertorom poveavati napon od 0V pa sve do merenog napona. To moe potrajati. Da bi se vreme merenja to vie skratilo, primenjuje se princip opisan u narednom poglavlju. Glavna rutina programa sa ovakvim principom izgledala bi ovako: Pet incf SPORTB,F ; Poveaj Shaddow registar. movf SPORTB,W ; Prebaci u W, movwf PORTB ; pa u PORTB tako poveaj izlazni napon. btfsc PORTA,RA0 ; Jesu li se ovi naponi sada izjednaili? goto Pet ; Nisu, poveavaj i dalje. ... ; Jesu, W sadri vrednost A/D konverzije. 140

62. Sukcesivno aproksimativni A/D konvertor


Da bih Vam ilustrovao princip rada ove A/D konverzije obrazloiu Vam princip algoritma binarne pretrage unutar sortiranog niza podataka. Opet zamolite svog prijatelja da zamisli broj izmeu 0 i 1000. Zamislio je. Sada ga pitajte je li njegov broj vei od [0+((1000-0)/2) = 500] 500. Nije. Znai njegov broj je izmeu 0 i 500. Da li je vei od [0+((500-0)/2) = 250] 250? Nije. Znai broj je izmeu 0 i 250. Da li je vei od [0+((250-0)/2) = 125] 125? Nije. Broj je izmeu 0 i 125. Da li je vei od [0+((125-0)/2) = 62,5] 63? Jeste. Broj je izmeu 63 i 125. Da li je vei od [63+((125-63)/2) = 94] 94? Jeste. Broj je izmeu 94 i 125.

Da li je vei od [94+((125-94)/2) = 109,5] 110? Jeste. Broj je izmeu 110 i 125. Da li je vei od [110+((125-110)/2) = 117,5] 118? Nije. Broj je izmeu 110 i 118. Da li je vei od [110+((118-110)/2) = 114] 114? Nije. Broj je izmeu 110 i 114. Da li je vei od [110+((114-110)/2) = 112] 112? Jeste. Broj je izmeu 112 i 114. Da li je vei od [112+((114-112)/2) = 113] 113? Jeste. Onda je to broj 114. Ovaj princip moete zamisliti kao seenje pice. Isee se na pola, zatim na etvrtine, pa na osmine, i tako sve do najmanjeg pareta. Vidite da ste za razliku od prethodnog sluaja sa samo 10 pitanja uspeli da doete do tanog rezultata. E sada. Ukoliko ovaj princip primenite umesto (kao u brojakom A/ D konvertoru) postepenog poveanja napona korak po korak, vreme utroeno na merenje bie mnogo, mnogo krae, uz potpuno istu elektrinu emu. Program je prilino jednostavan. Najpre se setuje bit najvee teine (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... clrf PORTB ; Inicijalizuj PORTB bsf PORTB,7 ; Setuj MSB btfss PORTA,0 ; Ukoliko je napon preveliki, bcf PORTB,7 ; resetuj ga. bsf PORTB,6 ; Setuj naredni btfss PORTA,0 ; Ukoliko je napon preveliki, bcf PORTB,6 ; resetuj ga. bsf PORTB,5 ; Setuj naredni ... I tako sve do RB0 pina. Na kraju e PORTB sadrati izmerenu vrednost napona. Kod je dat ilustrativno, a u pravim programima bi se koristio i Shaddow registar. 141

63. Wilkinsonov A/D konvertor


Ranije eme zbog upotrebe D/A konvertora zauzimaju previe dragocenih pinova mikrokontrolera. Osim toga, one zahtevaju upotrebu naponskog komparatora za svoj rad. Oigledno je da se PIC16F84 takav kakav je ne snalazi najbolje sa merenjem i poreenjem napona. Sa njegove strane mnogo je zgodnije mereni napon konvertovati u neku drugu fiziku veliinu. Na primer u vreme. Taj princip primenjen je u sledeim emama. One Vam mogu posluiti za merenje otpornosti, temperature (upotrebom NTC ili PTC otpornika), intenziteta svetlosti (upotrebom fotootpornika) ili kapacitivnosti (upotrebom kapacitivnih senzora). Kako radi ovaj interfejs? Najpre dri RB0 na logikoj 1 dovoljno dugo da bi se kondenzator napunio. Ovo vreme je 5*R*C, odnosno za maksimalnu vrednost testiranog otpornika od 10k oko 5mS. im se kondenzator u potpunosti napuni, naizmenino se vri postavljanje pina na logiku 0 (pranjenje kondenzatora), konfigurisanje pina kao ulaz i testiranje da li se kondenzator dovoljno ispraznio (prazan je kada na pinu mikrokontrolera javi logicka 0). Broj ciklusa pranjenja / testiranja ili proteklo vreme direktno odreuje vrednost merene otpornosti. Prekid programa interaptima za vreme merenja dovee do nepreciznog oitavanja vrednosti. Zato se oni moraju iskljuiti dok se merenje ne zavri. Ukoliko Vam je potrebno bre merenje, moete umesto naizmeninog menjanja stanja pina (ulaz/izlaz) moete koristiti neku od sledeih ema: Ovo kolo najpre dri RB0 na logikoj 0 dovoljno dugo da se kondenzator isprazni, odnosno da mu oba pola budu na potencijalu od 0V. Zatim se pin RB0 postavlja u stanje ulaza, i meri se vreme za koje e se na pinu javiti logika jedinica. Kako se kondenzator sada puni preko otpornika, ovo vreme direktno e zavisiti od trenutne vrednosti otpornosti. Prednost ove eme nad prethodnom je mogunost pojave interapta po promeni stanja na RB0/INT pinu, to rastereuje mikrokontroler za ostale potrebe. Sa ovim kolom se uglavnom dobijaju najbolji rezultati. RB0 se postavi na logiku 1, kondenzator se napuni, a zatim se meri vreme koje je potrebno da se na pinu javi logika 0. I sa ovom emom mogue je po zavrenom merenju otii na interapt rutinu. Moda Vam udno deluje taj skok na interapt rutinu. Kako e onda program meriti vreme? Jednostavno. Jo jednim interaptom izazvanim tajmerom. Ove tehnike mogu se primeniti za bilo koju vrednost otpornika i kondenzatora. Meutim, ukoliko se koristi kondenzator kapacitivnosti vee od 100nF izmeu 142

kondenzatora i pina potrebno je postaviti zatitni otpornik od oko 220. On spreava preveliku struju na pinu mikrokontrolera u trenutku naglog punjenja ili pranjenja kondenzatora. Microchip ak navodi da se usled prevelike struje na pinovima portova moe promeniti stanje TRISA ili TRISB registra, pa ga je stoga poeljno povremeno softverski osveiti. Donja granica kapacitivnosti kondenzatora zavisi jedino od brzine vaeg mikrokontrolera. Pri kristalu od 4MHz sasvim je mogue koristiti vrednosti od 33pF. to manji kondenzator upotrebljavate, merenje e biti krae. Kako vreme za koje se kondenzator napunio ili isprzanio nema direktne veze sa celzijusovim stepenima ili svetlosnim luksom, vrednosti ovih veliina najjednostavnije je dobiti iz odgovarajuce tabele. Bilo koja izoblienja pri merenju (poput nelinearne karakteristike upotrebljenog senzora) mogu se odmah kompenzovati u samoj tabeli. Jo jedna mogunost gornjih ema ogleda se u mogunou merenja kapacitivnosti umesto otpornosti. Na taj nain moe se na primer izmeriti poloaj osovine promenljivog kondenzatora. Naravno, u tom sluaju umesto promenljivog, u emu je potrebno postaviti obian otpornik to manjeg stepena tolerancije. Ove eme zbog svoje jednostavnosti imaju jedan veliki nedostatak. Sa njima nije mogue dobiti veu preciznost zbog promene radnih karakteristika upotrebljenog kondenzatora usled promene radne temperature. Zbog toga se moe koristiti kompenzacija ovih nedostataka koristei kalibracioni otpornik i merenjem njegove vrednosti neposredno pre merenja otpornosti senzora. Za detalje pogledajte AN512, AN513 i AN863 sa http://www.microchip.com/. Moda smatrate da ovo nije prava A/D konverzija zbog ogranienja na merenje otpornosti i kapacitivnosti, a ne napona! U pravu ste. Meutim, uz male izmene elektrine eme mogue 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 fizikih veliina jedino u sluaju da senzori nisu previe udaljeni od mikrokontrolera. Ukoliko biste eleli da merite npr. temperaturu na terasi, morali bi razvui bar oko 5m provodnika. Ti provodnici otpornosti senzora dodaju svoju otpornost koja zavisi od njihovog poprenog preseka i duine. Osim toga usled svojih fizikih veliina uvode poveanje mogunosti pogrenog merenja. Na primer usled sopstvene zavisnosti otpornosti od temperature (ponaaju se kao mini senzor temperature), usled poveanja kapacitivnosti na vodovima (provodnici su uglavnom bliski jedan drugom, pa se ponaaju kao kondenzator) ili usled indukovanih elektrinih smetnji (to dui 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 prilino mali potroa elektrine energije. Nema svrhe napraviti kolo za merenje spoljne temperature, ubaciti mu ak i SLEEP mod, a onda mu dodati senzor ija je prosena potronja 12mA. Nije li upravo to rasipnitvo u efikasnom iskorienju datih nam resursa dovelo do opteg poveanja zagaenja planete Zemlje! Kao to ste ranije videli PIC16F84 se ne snalazi najbolje sa direktnim merenjem napona. ta najlake radi? Meri vreme i broji. U ovoj emi upotrebljeno je popularno integrisano kolo NE555 povezano kao astabilni multivibrator. Tako povezano, ono e u zavisnosti od kapacitivnosti elektrolitskog kondenzatora od 1F i otpornosti merenog otpornika od 10k u mikrokontroler slati impulse, tano odreenom frekvencijom. to je otpornost promenljivog otpornika manja, ova frekvencija e biti vea. Algoritam programa trebao bi u fiksnom vremenskom intervalu (npr. 0,5S to dui interval to vea preciznost) brojati impulse. Kako je za eliminaciju smetnji poeljno koristiti ulaz sa mitovim okidaem, impulse je najpraktinije dovesti na RA4 (ukoliko se ne koriste interapti za brojanje) ili RB0 (ukoliko se koriste interapti za brojanje) pin. RB0 pin se ponaa kao ulaz sa mitovim okidaem jedino kada je podeen za interapte. Ukoliko je daljina od mikrokontrolera do NE555 previe velika, moete poveati napon napajanja NE555. Za jo vee daljine moe se kombinovati NE555 sa RS485 drajverom. U stvari kako je ovde potreban jedino predajnik, deo integrisanog invertora signala (7406) bie dovoljan. Ukoliko umesto promenljivog otpornika postavite stalan otpornik malog stepena tolerancije dobijate odlian mera kapacitivnosti upotrebljenog kondenzatora. Detalje o ovom principu imate na http://www.globu.net/pp/english/PP/ne555.htm. Tu se nalaze podaci o frekvencijama u zavisnosti od kapacitivnosti i otpornosti. 144

65. Konverzija napona u frekvenciju


Konvertor napona u frekvenciju (eng. VCO - Voltage Controlled Oscilator naponski kontrolisani oscilator) u frekvenciju pretvara mereni napon.

Nastavak sledi!

145

66. Integrisani A/D konvertori


Pretpostavimo da Vam je potreban A/D konvertor koji bi brzo merio eljeni napon, ne zahtevajui pri tome intervenciju mikrokontrolera (npr. prilikom snimanja i kompresije zvuka). U tom sluaju najpraktinije je koristiti integrisane A/D konvertore rtvujui odreen broj pinova za oitavanje podataka iz njih. Tipini predstavnici integrisanih A/D konvertora su ADC0831, LTC1298, MAX 190 ili MAX 191. Ponekad je potrebno meriti veliki dinamiki opseg napona. Veina 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 moe menjati u irokim granicama, omoguavajui na taj nain 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


Senzori koje upotrebljavate pri merenju obino nemaju linearnu karakteristiku. Na primer NTC otpornik e pri 10oC imati otpornost od 1k, pri 20oC 2k, pri 30oC 4k i pri 40oC 8k. Oigledno je da on umesto linearne ima logaritamsku karakteristiku. Iako se matematikim formulama (npr. Steinhart-Hart ili metodom linearizacije kao u AN942) moe ispraviti njegov opseg, esto razni drugi faktori utiu na pogoranje linearnosti. Te faktore izaziva princip A/D konverzije, promena temperature oscilatora, kablova do senzora ili upotrebljenog VCO konvertora. Da bi se dobila to tanija merenja potrebno je na odgovarajui nain kompenzovati nelinearna izoblienja kako upotrebljenog senzora tako i svih ostalih inilaca. Jedan od naina kompenzacije nelinearnosti je crtanje grafika izmerenih vrednosti. Na X osi postavlja se redni broj merenja koji e na odgovarajui nain biti prikazan mikrokontrolerom (npr. 0 do 50 rezolucijom od 1oC ili 0 do 100 rezolucijom od oC za temperaturni opseg od 0oC do 50oC), a na Y osi vrednost fizike veliine izmerene mikrokontrolerom i kalibrisane instrumentom vee klase preciznosti. Dalje je potrebno softverski svakoj vrednosti sa X ose pridruiti (najee preko tabele) odgovarajuu vrednost sa Y ose. Oigledno je da je radi bolje preciznosti grafika neophodno da merenja budu to preciznija, i sa to vie mernih taaka. Kako bi smanjili broj potrebnih merenja, dipl. ing. Lazar Pani i dipl. ing. Bojan Miti su Vam pripremili program za interpolaciju merenih vrednosti. On na osnovu par zadatih taaka rauna vrednosti preostalog broja potrebnih taaka. Izlazni .txt fajl programa moete editovati prema svojim potrebama i iskopirati ga u sopstveni program. Pri tome niste ogranieni samo na upotrebu PIC mikrokontrolera.

Program je ispitan pod Win98 i Win2000, a dostupna je i njegova Linux verzija. Besplatan je (dat je ak i izvorni kod) i nalazi se na mom sajtu iji link moete nai na kraju ovog uputstva. 147

68. Datalodger
Datalodger predstavlja ureaj koji snima semplovane podatke (obino u eksterni EEPROM) i iz koga je potrebno povremeno spolja iitavati podatke. U ranijim primerima videli ste kako se moe meriti nivo reke. U meuvremenu ste nauili i upotrebu A/D konvertora, I2C i RS232 komunikacionog protokola. Sada i nije teko zamisliti meteoroloku stanicu sa anemometrom (meraem brzine vetra), hidrometrom (meraem vlanosti vazduha), termometrom i meraem smera vetra. U sluaju da se sve ove veliine dobijaju u analognom obliku, dovoljno je dovesti ih u A/D konvertor i nakon toga u PIC. Semplovi svih konvertovanih napona povremeno se snimaju u eksternu EEPROM memoriju preko I2C veze, a ona se periodino prazni preko RS232 veze u kompjuter. Kompjuter bi onda mogao analizirati dobijene podatke i predvideti na primer pojavu sue ili kie. Uz vie istovremeno povezanih sistema (vie udaljenih meraa) mogla bi se sa prilinom tanou predvideti mikroklima odreenih podruja.

148

69. Kontrola temperature


Nita lake. Dovoljno je povezati senzor na A/D kontroler, i zadati mikrokontroleru graninu vrednost rezultata A/D konverzije. Ukoliko na primer senzor kao rezultat A/ D konverzije broj manji od .175 ukljuie se relej grejaa, a za broj .175 (ili vei) koji odgovara temperaturi od 25oC iskljuie se relej. Ilustracija ovoga mogla bi ovako izgledati: movlw subwf btfss goto goto .175 AD,W STATUS,C Ukljuci Iskljuci ; Zadata vrednost temperature ; W = AD - .175 ; Testiraj prekoraenje ; AD < .175 ; AD >= .175

Da li je ovo dobar nain kontrole? Nije! Svi senzori podloni su smetnjama. ta moe izazvati te smetnje? Za poetak, tu je sam mikrokontroler. Njegov takt oscilatora proizvee malo smanjenje i poveanje napona napajanja. Dalje, tu su ureaji koji se kontroliu mikrokontrolerom. Pri multipleksu LED displeja najvie struje troie displej na kome se prikazuje broj 8 (tada su sve pojedinane LED ukljuene), a najmanje onaj sa brojem 1 (ukljuena samo dve LED). Ne mora to obavezno biti LED displej. Isti efekat prouzrokovae i relej grejaa. Sledea je vaa kominica sa svojim (made in China) usisivaem. Iako e dekapling kondenzator u dobroj meri eliminisati ove smetnje, jedan deo e se svakako preneti i do senzora, i tu e proizveti um. Upravo je taj um poguban za uspenu kontrolu temperature. Sa njim e pri istoj temperaturi rezultat A/D konverzije jednom biti 170, a drugi put 180, to e mikrokontroler shvatiti kao odgovarajuu promenu temperature, i brzo e ukljuivati i iskljuivati relej. Kontakti obinih releja jednostavno nisu namenjeni za takav rad, i relej e posle par nedelja stradati. ta je reenje? Rei mikrokontroleru da promeni stanje jedino ukoliko se izmerena temperatura dovoljno (npr. za .10) udaljila od zadate vrednosti (.175), slino kao to to mitov okida radi hardverski. Znai, da ukljui greja ukoliko je oitana vrednost 165 i manja, i da ga iskljui ukoliko je oitana vrednost 185 i vea. Ovde je najbolje radi to manjeg variranja temperature podesiti granine vrednostzi, tako da se postigne kompromis izmeu eeg rada releja i spoljnih smetnji. Da li je sada sve u redu? I dalje ne mora da bude. Ukoliko je senzor temperature postavljen u blizini grejaa, umesto merenja temperature prostorije, merie se temperatura grejaa. Tako e pri ukljuenju grejaa rezultat A/D konverzije veoma brzo postati .255, odnosno, i dalje e se relej previe brzo ukljuivati i iskljuivati. Ovo se moe reiti udaljavanjem senzora na mesto gde nee direktno oseati temperaturu grejaa. Ovo bi moglo biti dovoljno dobro reenje za ON/OFF (ukljui/iskljui) kontrolu grejaa (relejom). Meutim, nekada ON/OFF kontrola jednostavno nije dovoljna. U 149

tim situacijama koristi se kontinualna regulacija snage, faznim pomakom triaka (slino kao PWM za jednosmerni napon). Uzmimo za primer da elite u dvoritu napraviti inkubator za jaja. Ovde je radi to manjih oscilacija temperature poeljno koristiti kontinualnu regulaciju. Meutim, ta sa situacijom kada napolju pone da pada kia (odjednom zahladni)? Uz dovoljno dobro toplotno izolovan inkubator, nee biti nikakvih problema. Ali nekada jednostavno nemamo dovoljno stiropora (i opet je sneg iznenadio nae putare). U ovom sluaju potrebno je mikrokontroleru dodati jo malo logike. Osim temperature potpuno isti principi primenjuju se za kontrolu bilo koje fizike veliine. Vie o ovim kontrolnim procesima imate u asopisima Circuit Cellar br. 17 i 19.

150

70. Rotacioni enkoder


Verovatno Vam je poznata uloga potenciometra u analognoj elektronici. On menja svoju otpornost u zavinosti od poloaja osovine, pomeranjem kontakta klizaa preko otporne povrine. Na taj nain realizovano je na primer pojaanje zvuka na kasetofonu. Analogni potenciometri imaju par mana. Kao prvo njihovi kontakti nisu veni. Oni su kao i kontakti mehanikih prekidaa podloni varnienju (eng. Bouncing). Otuda kranje pri pojaavanju i smanjenju zvuka. Jo gore, ukoliko upotrebite A/D konvertor da prevedete stanje analognog potenciometra u digitalni oblik, mogue je da kontakti potenciometra ba u trenutku merenja usled loeg spoja budu odvojeni od otporne povrine, to e prouzrokovati oitavanje maksimalne otpornosti. Sledea mana analognog potenciometra odnosi se na poloaj njegove osovine pri graninim vrednostima. Koliko puta ste morali menjati gumicu na slavini jer je neko previe zavrnuo? Isto je i sa analognim potenciometrom. Ne moete oekivati od korisnika da e biti nean prema svojim ureajima. Bolje stavite manju kapicu na osovini. Nee se moi previe jako pritisnuti. Postoji vie vrsta rotacionih enkodera. Po nainu konstrukcije mogu biti mehaniki, optiki i magnetski. Mehaniki imaju najvie nedostataka zbog varnienja svojih kontakata i manje rezolucije. Po obliku signala koji se moe dobiti na izlazu digitalnih potenciometra postoje enkoderi sa apsolutnim adresiranjem koji na svom izlazu direktno daju binarni kod (4bitni, 6-bitni, 8-bitni), ili koji koriste malo drugaiji format brojanja (tzv. sivi eng. Grey code) i enkoderi sa relativnim adresiranjem. U daljem opisu bie opisana jedino upotreba rotacionih enkodera sa relativnim adresiranjem (eng. relative rotary encoder, incremental rotary encoder ili quadrature encoder). Za detaljniji opis posetite http://en.wikipedia.org/wiki/Rotary_encoder. Relativni rotacioni enkoder treba sprovesti odgovarajue obrtno kretanje osovine u mikrokontroler. Meutim, za razliku od apsolutnog enkodera PIC ne mora znati kolika je njegova trenutna vrednost u svakom trenutku. emu to. Ionako e je inicijalizovati po ukljuenju (npr. itanjem iz EEPROM-a). Dovoljno je dati mu podatak u kom smeru se okree osovina enkodera (kao kod obinih taster prekidaa levo-desno), a mikrokontroler e to stanje softverski uporediti sa prethodnim i na osnovu rezultata izvriti predvienu operaciju. Ovo uvodi znaajnu prednost rotacionih enkodera u tome to kod njih nema graninih poloaja. Drugim reima, moete okretati njihovu osovinu koliko god elite, kao kod Nautilus slavina. Signal dobijen sa relativnog rotacionog enkodera u jednom trenutku moe imati stanja prikazana u sledeoj tabeli: --> Rotacija u smeru kazaljke na satu --> 00 01 11 10 00 <-- Rotacija suprotno od smera kazaljke <-151

Kao to vidite, ukoliko se signal menja u smeru 00, 01, 11, 10 to znai da se osovina okree u smeru kazaljke na satu. U suprotnom (10, 11, 01, 00) osovina enkodera se okree u suprotnom smeru. Takvo stanje signala omoguava da poreenjem prethodnog i sadanjeg stanja lako otkrijemo u kojem se smeru okree osovina. Na primer, ukoliko je prethodno stanje bilo 11 a sadanje je 01, osovina se okree suprotno od kazaljke na satu. Iako Vam moe izgledati da su rotacioni enkoderi spori, to nije sluaj. Oni mogu imati i preko 255 poloaja za samo 1 okretaj osovine. Moe se desiti da zbog sporosti mikrokontrolera (ukoliko izvrava i druge operacije za vreme okretanja potenciometra) PIC nakon stanja 10 detektuje stanje 01 to je oigledno greka. Jo gore, pri previe brzom okretanju npr. u smeru kazaljke na satu mogue je da nakon stanja 01 ne oita (zbog sporoti) sledea 2 stanja (11 i 10), ve tek tree (00), pa na osnovu toga moe zakljuiti da je osovina okrenuta u suprotnom smeru. Kod mehanikih rotacionih enkodera situacija je jo sloenija, jer se mora izvravati i debouncing rutina. Ona se uglavnom moe uprostiti tako to se umesto nje za jednu promenu stanja enkodera trai uzastopan sled 2 ili vie ispravnih stanja. Na taj nain je postignuta ispravna detekcija trvovanjem rezolucije enkodera. Ukoliko ne elite izgubiti na rezoluciji moete izmeu mehanikog enkodera i mikrokontrolera postaviti hardverski debouncing (sa rednim otpornikom izmeu pina mikrokontrolera i enkodera i kondenzatorom izmeu izlaza enkodera i mase). to je vea kapacitivnost kondenzatora, vea e biti imunost na smetnje varnienja, ali e maksimalna brzina okretanja osovine enkodera biti srazmerno manja. Obino je dovoljna vrednost od 10nF. Upotrebljeni kondenzatori moraju biti odabrani prema maksimalnoj rezoluciji i maksimalnoj procenjenoj brzini okretanja osovine enkodera. Kako e se stanje osovine enkodera najverovatnije retko kada menjati, najpraktinije je povezati izlaze rotacionog enkodera na interapt ulaze mikrokontrolera. U sluaju da je potrebno snimanje trenutne (apsolutne) vrednosti poloaja osovine rotacionog enkodera u EEPROM, praktinije je snimiti je tek nakon to se osovina prestane pomerati (na primer 6S nakon zadnjeg signala). Na taj nain titi se EEPROM. Vie detalja o upotrebi relativnih rotacionih enkodera imate http://www.mcmanis.com/chuck/robotics/projects/lab-x3/quadratrak.html. na sajtu

Trebate shvatiti da rotacioni enkoderi ne mogu zameniti analogne potenciometre u pravom smislu te rei. Oni nemaju nikakvu vezu sa promenom otpornosti. To su samo digitalni davai poloaja osovine. Meutim, to ne znai da se (u kombinaciji sa mikrokontrolerom) ne mogu upotrebiti kao potenciometar. Dovoljno je oitanu vrednost dovesti na D/A konvertor i imate izlazni napon proporcionalan poloaju osovine enkodera. Taj analogni izlazni napon moete koristiti kao izvor napajanja za predpojaava kasetofona, ime ste dobili odlian regulator jaine zvuka. Postoje integrisana kola koja izvravaju upravo tu operaciju bez upotrebe D/A konvertora (DS1669, TDA8551). A ukoliko ste ba reeni da dobijete promenljivu otpornost poveite na PIC bilo koji pretvara digitalnog signala u otpornost. Na primer DF1704.

152

71. Regulacija smera i brzine kolektorskih DC motora


Pod kolektorskim DC motorima podrazumjevaju se motori jednosmerne struje sa etkicama. Velikom broju kolektorskih motora jednosmerne struje mogue je menjati smer i brzinu. Na primer malim motorima iz vokmena ili kasetofona, motorima ventilatora za hladnjak automobila, pa sve do motora za viljukare. Princip njihovog rada je isti, a razlikuju se jedino po svojoj potronji i dimenzijama. Kako motori najbolje iskorienje imaju pri svom nominalnom naponu napajanja, da bi im se promenio (smanjio) broj obrtaja nije ba praktino 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 nain motoru nee biti smanjena snaga obrtanja osovine (usled smanjenog napona napajanja), ve e se snaga regulisati PWM odnosom punog napona napajanja. Za promenu smera okretanja osovine motora koristi se poznata osobina kolektorskih motora da im se rotor moe okretati u suprotnom smeru prilikom promene polariteta napona napajanja (oprez neki motori pri tome imaju smanjenu snagu). Iz tog razloga potrebno je promeniti smer napona napajanja motoru. Stoga se izlazi mikrokontrkora povezuju sa drajverom u obliku tzv. H-mosta (eng. H-bridge), koji obezbeuje neophodnu promenu polariteta. Vie o ovome imate na sajtu: www.mcmanis.com/chuck/Robotics/tutorial/h-bridge/index.html Kako kolektorski motor moe u trenutku ukljuenja povui mnogo veu struju od nominalne, poeljno je galvanski ga odvojiti od mikrokontrolera. Takoe, potrebno je osigurati se da kvar mikrokontrolera ili nepravilna sekvenca na njegovim izlazima ne moe dovesti do kratkog spoja kroz tranzistore zaobilazei motor. Oba problema uspeno su reena elektrinom emom sa sajta: www.mcmanis.com/chuck/Robotics/tutorial/h-bridge/bjt-circuit.html Radi manjeg optereenja motora, drajvera i mehanikih elemenata, prilikom promene smera potrebno je postepeno usporiti motor (smanjivanjem PWM odnosa), zatim ga zakoiti, a tek onda polako ubrzavati (poveanjem PWM odnosa) u suprotnom smeru. Ukoliko ovo ne ispotujete (pri maksimalnoj brzini u jednom smeru dovedete signal za maksimalnu brzinu u suprotnom smeru) efekat e biti isti kao kod automobila koji iz etvrte brzine ubacite u rikverc. Pre testiranja na hardveru simulirajte program i proverite da li ste motoru ostavili dovoljno vremena za zaustavljanje. Usporavanje, koenje i ubrzavanje nee imati svoju funkciju ukoliko se zavre za samo 0,1S.

153

72. Potroa kao senzor


Znate li zato nova, tek kupljena sijalica po prvom ukljuenju pregori? Nemojte se muiti. Miki, profesor elektrinih maina Elektrotehnike kole u Aleksincu postavio je nama uenicima to pitanje. Posle pola kolskog asa, morao je sam odgovoriti na njega. Nijedan ponueni odgovor nije bio taan. Volframova sijalica ima pozitivni temperaturni koeficijent otpornosti (eng. PTC). To znai da joj je otpornost dok kroz nju ne protie struja niska, reda oma. U trenutku ukljuenja (dok je jo hladna), kroz nju proe i do 10 puta vea struja. Meutim, pri proputanju ove struje volframovo vlakno se zagreje i povea svoju otpornost na vie desetina oma, to ograniava dalje poveanje struje. Ukoliko u proizvodnom procesu volframovo vlakno nije pravilno dimenzionisano (npr. prekratko je), njegova otpornost nee se po prvom ukljuenju dovoljno poveati, struja se nee dovoljno ograniiti i ono e se zato istopiti. Iz tog razloga se kod skupljih halogenih sijalica ponekad primenjuje elektronsko kolo sa ogranienjem maksimalne struje (eng. current limiter) ili postepenim poveanjem struje (eng. soft start). Pretpostavimo da elite izmeriti elektrinu otpornost sijalice dok je volframovo vlakno jo usijano. Jasno je da to moete uraditi primenom omovog zakona i merenjem napona i struje, ali moete li to uraditi direktno? Uz mikrokontroler i ovo je mogue. Pretpostavimo da se sijalica napaja sa 5V jednosmerne struje (ne pokuavajte ovo uraditi sijalicom od 220V iz bezbednosnih razloga). Pinom RA0 se preko prekidakog tranzistora ukljuuje i iskljuuje relej. Sijalica je povezana direktno na +5V i na relej, njegov mirni kontakt (iskljuen relej) povezan je na paralelni A/D konvertor na PORTB, a radni kontakt (ukljuen relej) na masu. Setovanjem RA0 pina, ukljuuje se relej, i saeka se da sijalica zasvetli. Resetovanjem RA0 pina iskljuuje se relej i sijalica se (i dalje vrua) prebacuje na A/ D konvertor. Struja koja prolazi kroz interne otpornosti A/D konvertora je toliko mala da ne moe u velikoj meri uticati na dalje zagrevanje sijalice. Brzim nizom merenja moe se u registre mikrokontrolera primenom indirektnog adresiranja snimiti grafik opadanja otpornosti usled hladjenja sijalice. ak se moe merenjem proteklog vremena do minimalne otpornosti sijalice grubo izmeriti spoljna temperatura (sijalica e se bre hladiti ukoliko je spoljna temperatura nia)! Zazmislite bojler, kome je senzor temperature njegov sopstveni greja. Samo kad ne bi imao toliko kamenca! Ovaj princip nije ogranien samo na sijalicu. Elektrini motori jednosmerne struje prilikom iskljuenja inercijom nastavljaju svoj rad, pri tome radei u generatorskom reimu. Na njihovim kontaktima moe se A/D konvertorom izmeriti generisani napon, i na osnovu njega, po potrebi, D/A konvertorom kalibrisati brzina motora. Po istom principu vetrenjai se moe fino regulisati ugao zakretanja krila u zavisnosti od generisanog napona (ime bi se spreio njihov lom pri prejakom vetru), a akumulatoru omoguiti naizmenino punjenje i testiranje napunjenosti. Iako nema direktne veze sa potroaima, verovatno e Vas zanimati kako moete obinu LED upotrebiti za senzor osvetljenosti. Detalje imate na sajtu http://free-vz.t-com.hr/Ivica-Novakovic/index.html.

154

73. Servo motori


Servo motori predstavljaju obine kolektorske DC motore kojima je dodat odgovarajui dava poloaja, odnosno brzine. Na taj nain moete biti sigurni da je motor napravio tano toliko i toliko obrtaja. Ovo bi Vam moglo biti potrebno prilikom regulacije protoka vode ili vazduha pominim pregradama, konstrukcije CNC maine, ili precizne regulacije brzine motora. Servo motori obino imaju reduktore preko kojih im se smanjuje brzina (a poveava snaga) u odreenom opsegu. Kako se osovina motora okree prilino brzo, najpraktinije je uzimati signal sa osovine reduktora. On je tu i precizniji zbog zazora koji moe eventualno postojati (npr. prilikom redukcije kaievima kao kod starijih ve maina). Signal se sa osovine moe dovesti u PIC na vie naina. Ukoliko osovina reduktora ne zatvara pun krug (npr. za pozicioniranje antene), mogue je osovinu reduktora povezati na obian analogni potenciometar. Taj princip objanjen je u AN531. Za ostale primene moda bi pogodniji bio nain sa rotacionim enkoderom. On je objanjen u AN718. Motori koji se i pored reduktora ne mogu dovoljno brzo zaustaviti (imaju veliki zamajac) moraju pored rotacionog enkodera primenjivati usporavanje, koenje pa ubrzanje. To je objasnjeno u AN532 Ponekad se rotacioni enkoder ne moe upotrebiti zbog prevelike maksimalne brzine motora. Na sreu, odgovarajue davae poloaja osovine motora nije teko napraviti uz par odgovarajuih senzora. Vie o tome imate u AN569 i AN894.

155

74. Step motori


Step motori predstavljaju specijalan oblik motora prilagoenih preciznoj regulaciji poloaja osovine. Nisu namenjeni za rad sa veim brzinama ve im se osovina u svakom trenutku moe nai u jednom od tano definisanih poloaja (koraka eng. step). Ukupnim brojem koraka odreen je ugao pomeranja osovine. Uz 200 koraka, ugao izmeu dva koraka je 360o / 200 = 1,8o. Za svoje upravljanje koriste odgovarajue sekvence sline onima iz rotacionih enkodera. Po samom principu njihovog rada oigledno je da im za razliku od servo motora nije potreban ikakav oblik povratne informacije o poloaju. Dovoljno je prilikom inicijalizacije vratiti osovinu step motora do poetnog poloaja, a zatim je okrenuti za eljeni broj koraka.

156

75. Detekcija prolaska napona kroz 0


esto se javlja potreba da se mikrokontrolerom treba detektovati prolazak naizmeninog napona kroz 0. Na primer pri konstrukciji dimera volframske sijalice ili pri konstrukciji sata taktovanog mrenom frekvencijom od 50Hz. Ukoliko je u pitanju nizak napon, nema nikakvih problema. Dovoljan e Vam biti jedan tranzistor, dioda i par otpornika.

Slika

Meutim, ukoliko mikrokontroler treba detektovati prolazak kroz 0 za 220V, ovaj nain nije mogue koristiti zbog prevelikog napona na bazi tranzistora i iz bezbednosnih razloga. Da bi se ovaj problem prevaziao, moe se koristiti sledea elektrina ema: Slika

Moda se pitate zbog ega je ovoliko gradiva posveeno upravo analognoj elektronici. PIC16F84 sam po sebi ne ne moe mnogo toga. Da bi radio ita 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 nain da se oni oitaju i da se na osnovu dobijenih informacija preduzme odreena akcija (npr. navodnjavanje povra u plasteniku ili aktiviranje alarma), dabe ste kupovali PIC.

157

76. Integrisana kola 4000 i 7400 serije


U digitalnoj elektronici se za realizaciju jednostavnih zadataka uglavnom upotrebljavaju popularna integrisana kola serije 4000 ili 7400 (poznatija kao CD4000 i SN7400). Njihova glavna prednost je niska cena i laka dostupnost. PIC16F84 se moe bez problema povezivati sa obe serije integrisanih kola. U ovim kolima su na hardverskom nivou implementirane jednostavne logike operacije, brojai, multiplekseri, pomeraki registri, displej drajveri i dr. tako da su mnogo bra od mikrokontrolera. Ukoliko Vam iz bilo kog razloga zatreba neka funkcija koja nije implementirana u PIC16F84, moete ga direktno povezati sa odgovarajuim integrisanim kolom, koje realizuje pomenutu funkciju. Uputstvo koje detaljno objanjava funkcije osnovnih logikih kola moete nai na http://www.ibiblio.org/obp/electricCircuits/Digital/index.html sajtu. Knjiga koja isto tako detaljno obrauje ovu temu je Elektronika digitalnih raunara Alberta Paula Malvina. Iako je izdata jo 1981, toliko postupno izlae gradivo, da je njen sadraj i dalje aktuelan. Jedini zastareli deo u knjizi jeste opis odavno prevazienih magnetskih memorija. Neki od programa koji Vam mogu pomoi u simuliranju osnovnih logikih kola su:

Logisim Digital Simulator Digital Works

Kako obe serije za povezivanje sa mikrokontrolerom koriste adresnu magistralu, brzina komunikacije e biti ograniena jedino hardverom, ali e se i za najjednostavnije operacije morati utroiti vei broj pinova.

158

77. Multipleksiranje izlaza


PIC16F84 ima 13 ulazno izlaznih pinova. Samim tim izgleda nemogue spojiti direktno na mikrokontroler vie od 13 LED. Meutim, primenom multipleksiranja mogue je direktno na mikrokontroler spojiti mnogo vei broj LED. Kako radi multipleksiranje. Znate i sami da je televizijski prikaz mogu jedino zbog tromosti ljudskog oka. Ovde je primenjen slian pristup. Pogledajte sledeu emu. Anode LED spojene su na PORTB, a katode na tranzistore.

Sa ovom emom omogueno je upravljanje matricom od 32 LED. RA4 pin PORTA registra se ovde ne koristi, jer ne moe dati na svom izlazu logiku jedinicu. Meutim uz malo trikova (zamenom polariteta LED i povezivanjem tranzistora na naponu napajanja) i on moe biti u funkciji. U praksi se uglavnom sree potreba za bar jednim ulazom, tako da se taj nain ne praktikuje. Najpre je potrebno iskljuiti sve prekidake tranzistore dovoenjem logike 0 u PORTA. Zatim je potrebno na PORTB registru postaviti stanje 8 LED u prvoj koloni, i na kratko (obino oko 20mS da se prosean intenzitet svetlosti ne bi previe smanjio) ukljuiti prekidaki tranzistor na RA0 pinu. Diode na koje je dovedena logika 1 e na trenutak zasvetleti. Onda se postavlja stanje LED druge kolone, i na kratko ukljuuje tranzistor na RA1 pinu. Postupak se ponavlja dok se ne prikae stanje i na zadnjoj (etvrtoj) koloni, kada se celokupan proces ponavlja. Zbog tromosti oka, izgledae kao da LED neprekidno svetle. LED e svetleti manjim intenzitetom nego inae, ali to se moe nadoknaditi proputanjem vee struje kroz njih (smanjivanjem vrednosti otpornika na pinovima PORTB registra), ili podeavanjem duine ukljuenog stanja, tako da se postigne kompromis izmeu jaine svetla dioda i njihovog treperenja. Rutinu za ispis stanja na displeju, najpraktinije je realizovati u interapt rutini izazvanoj tajmerom. Na taj nain prikaz stanja LED ne utie (previe) na rad glavnog programa. Na isti nain mogue je prikazati odgovarajue cifre na vie sedmosegmentnih displeja.

159

Svi izvodi svih zajednikih segmenata (a, b, c, d, e, f, g, i dp ukupno 8 izvoda) spojeni su preko otpornika za PORTB mikrokontrolera. Zajednike katode displeja spajaju se preko prekidakog tranzistora na PORTA.

Najpre se iskljuuju svi prekidaki tranzistori dovoenjem logike 0 u PORTA. Zatim je potrebno na PORTB registru postaviti sliku cifre prvog displeja, i kratko ukljuiti prekidaki tranzistor na RA0 pinu. Onda se postavlja slika cifre drugog displeja, i na kratko ukljuuje tranzistor na RA1 pinu. Postupak se ponavlja dok se ne prikae cifra i na zadnjem (etvrtom) displeju, kada se celokupan proces ponavlja. U praksi se moe videti ovakav princip realizovan bez ikakvih opornika i prekidakih tranzistora, odnosno direktnim povezivanjem displeja na PIC. Njegova mana je poveana potronja, 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 (ukljueni svi segmenti) i broj 1 (ukljueni segmenti b i c). Broj pinova moe se smanjiti upotrebom LED drajvera 4000 ili 7400 serije. 4511 integrisano kolo predstavlja drajver za sedmosegmentni LED displej. Kada mu se na ulaz dovode binarni brojevi od 0 do 9, na izlazu ukljuuje odreene segmente LED displeja. Umesto 4511, moe se koristiti 7447.

Postupak je isti kao i ranije, sa tim to umesto odgovarajueg obrasca za prikaz na displeju, na ulaze 4511 treba dovesti binarni broj od 0 do 9. Segment decimalne take (dp), morao je biti doveden direktno na mikrokontroler, jer 4511 (i 7447) ima mogunost prikaza samo jedne cifre. Ukoliko se decimalna taka ne koristi, dobiete jo jedan slobodan pin. Za detaljni opis povezivanja 4511 ili 7447 integrisanih kola, skinite sa interneta njihove tehnike podatke. 160

78. Komplementarno povezivanje LED


Poznato vam je da pin moe biti postavljen kao izlaz na visokom logikom nivou, kao izlaz na niskom logikom nivou, i kao ulaz kada je u stanju visoke impedanse. Sledee kolo koristi sva tri stanja jednog pina, za pogon 2 LED.

Da bi se ovo kolo moglo primenjivati, potrebno je izmeriti odreene parametre. Voff1 maksimalni napon pri kome LED1 ne emituje svetlo Voff2 maksimalni napon pri kome LED2 ne emituje svetlo Von1 miniminalni napon pri kome LED1 emituje svetlo Von2 miniminalni napon pri kome LED2 emituje svetlo Ion1 eljena struja kroz LED1 pri ukljuenom stanju Ion2 eljena struja kroz LED2 pri ukljuenom stanju Vcc napon napajanja Potrebni prorauni su sledei: Ion1 = [ (Vcc-Von1)/R1 ] - [ Von1/(R2+R3) ] Ion2 = [ (Vcc-Von2)/R2 ] - [ Von2/(R1+R3) ] (Voff1+Voff2)/R3=Vcc-Voff1-Voff2/(R1+R2) Da bi se smanjila nepotrebna potronja struje potrebno je za R3 izabrati to veu vrednost, bez ukljuivanja LED pri ulaznom stanju pina. Pribline vrednosti otpornika (za struju od 8mA po ukljuenoj LED) su sledee: R1=300, R2=300, R3=1,2k. Ukljuenje LED1 postie se postavljanjem pina na logiku 0, LED2 na logiku 1, iskljuenje obe LED prelaskom pina u visokoimpedansno stanje (postavljen kao ulaz), a ukljuenje obe LED neprestanim naizmeninim dovoenjem logike 0 i 1 na pin (za to je najpraktinije koristiti interapt izazvan tajmerom). Za razliku od standardnih multipleksa, ovo kolo troi ak 2,5mA u stanju iskljuenih LED, pa nije pogodno za baterijsko napajanje. Praktinije je koristiti multipleks. Ovde je ilustrovano samo kao primer onoga to trebate izbegavati u svojim aplikacijama. Na slian nain moete povezivati i mnogo vei broj LED. Za detalje pogledajte TB029 sa http://www.microchip.com/. U literaturi se ovaj princip moe nai i pod nazivom Charlieplexing. 161

79. LCD - pojam


Pre svega trebate znati da postoji vie vrsta LCD (Liquid Crystal Display). LCD u svom najosnovnijem obliku moete videti na digitalnom satu, digitronu ili video igricama. Cifre na LCD-u sastoje se (kao i kod LED displeja) od segmenata. Meutim, njima se za razliku od LED segmenata ne sme dovesti jednosmeran napon da bi postali vidljivi. tavie. Jednosmerni napon e ih unititi. To znai da se odreenom segmentu da bi postao vidljiv mora neprekidno dovoditi naizmenini napon (kao kod multipleksa pojedinih LED). Na sreu, i LCD moe raditi u multipleksu, ali u dosta drugaijem obliku. Pri tome broj pinova za ukljuenje pojedinih displeja ostaje isti, ali jedan osmobitni port moe kontrolisati maksimalno dva sedmosegmentna LCD displeja (zajedno sa decimalnom takom). PIC16F84 bi prema tome mogao da direktno kontrolie jednu do dve cifre displeja vaeg digitrona. Vie o principu direktnog pogona LCD-a imate u AN563 sa http://www.microchip.com/. Da bi se ovo ogranienje prevazilo izmiljeni su tzv. inteligentni LCD. Oni pored displeja imaju integrisano kolo koje slui da se preko manjeg broja pinova moe upravljati veim brojem segmenata LCD-a. Postoje dve opte vrste ovih displeja. Alfanumeriki i grafiki. Na alfanumerikim se mogu prikazati jedino slova i brojevi (videli ste ih na halo govornicama), a na grafikim ta god elite (imate ih na mobilnim telefonima). U ostatku teksta bie opisani alfanumeriki inteligentni displeji. Integrisani kontroler alfanumerikih inteligentnih displeja zaduen je za generisanje naizmeninog napona neophodnog za rad dispeja, za multipleks, za ispis skraenog seta ASCII ili generisanje sopstvenog seta karaktera, pa ak i za treperenje i rotaciju teksta na displeju. Uglavnom se kao kontroler koristi integrisano kolo Hitachi HD48770 ili neki od njegovih kompatibilnih klonova. ta predstavlja ASCII set karaktera? U rano doba informatike svaki kompjuter (Commodore, Spectrum, Atari, Amstrad, Oric Nova, Pacom, Galaksija) imao 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 takoe su imala nesuglasica. U nekim kompjuterima nisu ni postojala. Predstavljanje cifara brojeva i znakova interpunkcije je opet poseban sluaj. Svakako da je bilo potrebno na neki nain standardizovati elektronski oblik zapisa teksta u raunarima, kako bi se podatci sa jednih raunara mogli bez konverzije koristiti na drugim. Tako je nastao ASCII kod. Po njemu svaki karakter (slovo, broj ili znak interpunkcije) ima svoj jedinstven redni broj. Ukoliko paljivo zagledate alfanumeriki LCD moete videti da mu se mesta za karaktere (elije) sastoje od sitnih takica (piksela). Zatamnjivanjem odreenih piksela dobija se slika (eng. pattern) karaktera u svakoj pojedinanoj eliji. Obino se inteligentni LCD proizvode sa 8*2, 16*1, 16*2 20*2, 20*4, 24*2 ili 40*1 elija. Nema ba mnogo smisla koristiti PIC16F84 za ispis teksta na LCD-u ukoliko u njegovoj (ionako maloj) memoriji trebamo uvati sliku (kao u tabeli za LED displeje) svakog pojedinanog karaktera. Tu obavezu na sebe preuzima integrisani kontroler inteligentnog displeja. On ima ROM memoriju u kojoj se nalaze slike svakog karaktera. Na taj nain PIC treba poslati jedino ASCII kod odgovarajhueg karaktera, 162

a displej e se sam pobrinuti za sve ostalo. To moe biti nedostatak ukoliko elite na displeju prikazati naa slova (npr. ). Iz tog razloga predviena je mogunost 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 ukljuenju. Slika karaktera u ROM-u LCD-a obino se uva u matrici od 5*7 ili 5*8 piksela, ali na displeju je kod ponekih LCD-a mogue prikazati i proirenu matricu od npr. 5*10 piksela. Iskljueni gornji i donji pikseli jednostavno se nee videti. Nama ti dodatni pikseli mogu biti od koristi radi prikaza npr. slova . Iako se displeji mogu razlikovati po broju i rasporedu elija, upotrebljenim fontovima za karaktere, vrsti, nainu i boji pozadinskog osvetljenja, njihovo povezivanje na mikrokontroler je prilino standardizovano. 14 pina koristi se za upravljanje LCD-om, a jo 2 pina za pozadinsko osvetljenje. Ona mogu biti u istom redu sa ostalim pinovima, ili posebno izdvojena. Mogue je nai i LCD bez pozadinskog osvetljenja, ali sa 16 pinova. Pri tome zadnja dva pina (15. i 16.) nisu povezana. Pinovi LCD-a mogu biti postavljeni u jednom (16*1) ili u dva (8*2) reda. Obino su brojevima obeleeni bar krajnji pinovi. Na LCD-u na slici vidite jedan red pinova. Pinovi 15 i 16 povezani su (odozdo) na LED kao izvor pozadinskog svetla (beli pravougaonik sa desne strane). Funkcija pinova je sledea: Pin 1 2 3 4 5 6 7-14 15 16 Simbol VSS VDD VO RS R/W E DB0-DB7 A K Masa Napajanje za kontroler Napajanje za LCD displej (eng. Register selection) (eng. Read/write Selection) Enable pin Signal for LCM Linije za podatke (0-7) Napajanje za LED (+) Napajanje za LED (-) Opis

Kako LCD zahteva ak 8 pinova za prenos bajtova u LCD (DB0DB7), kontrolerom LCD-a je predviena mogunost upotrebe samo 4 pina (DB4-DB7) a osmobitni bajt se u LCD alje u 2 grupe niblova. Uteda 4 pina se svakako isplati. Kako je kontroler LCD displeja u stvari jedan mali mikrokontroler, PIC16F84 treba odreenim 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 nain mikrokontroleru ostaje prilino vremena za ostale operacije koje treba obavljati. Ipak, podatci se na LCD ne smeju slati previe velikom brzinom, jer ih u tom sluaju kontroler LCD-a nee moi ispravno primiti. Enable (startni) pin moete smatrati pinom za iskljuenje LCD-a. Dok je na njemu prisutna logika 1, LCD nee reagovati na ostale signale. Na taj nain mogue 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


Na slian nain kao u prethodnom poglavlju, mogue je realizovati vie od 13 ulaza mikrokontrolera. Izvodi pinova mikrokontrolera spajaju se u matricu tako da su taster prekidai spojeni izmeu vorova. U ovom primeru na PORTB registar spojeni su pinovi RB0, RB1, RB2 i RB3, a na PORTA RA0, RA1 i RA2. Na taj nain realizovana je matrica sa 12 ulaza. Ona se inae najee koristi, jer npr. telefonske tastature (sa 12 tastera) koriste isti princip.

Radi lakeg razumevanja pretpostavimo da su prekidai obeleeni brojevima od 1 do 12. Najpre se PORTA registar postavi na b'00000111'. Zatim se RA0 pin postavi na logiku 0, ime se u prvu kolonu dovodi nivo logike 0. Redom se testiraju bitovi RB0 do RB3 PORTB registra. Ukoliko nijedan nije resetovan, nisu pritisnuti prekidai oznaeni sa 1, 4, 7 i 10. Onda se RA0 setuje, a RA1 resetuje. Ponovo se testiraju bitovi PORTB registra, ali ovoga puta za grupu prekidaa 2, 5, 8 i 11. U zadnjem prolazu setuje se RA1, a resetuje RA2, i testiraju bitovi koji odgovaraju prekidaima 3, 6, 9 i 12. Pull up otpornici moraju biti ukljueni kako se na ulaznim pinovima ne bi javilo nedefinisano stanje. Zbog njih se testiranje obavlja za logiku 0. Ukoliko je potrebno obaviti odreenu operaciju po otputanju tastera, program mora pamtiti zadnje stanje odgovarajueg tastera. U tom sluaju praktinije bi bilo povezati pinove RB4 do RB7 u matricu, i po promeni stanja izazvati interapt. Interapt rutina treba detektovati stanje pinova PORTA i PORTB registra, utvrditi koji bit je izazvao interapt, i izvriti zadatu operaciju. Otpornici od 100 su povezani radi zatite od lanog okidanja usled elektrostatikih smetnji. Ukoliko se tastarura nalazi blizu (<2m) mikrokontrolera, mogu se izostaviti. A ukoliko elite postii jo vie ulaza uz minimalni broj upotrebljenih pinova, moete koristiti sledeu emu.

165

Pretpostavimo da su upotrebljeni pinovi RB0 do RB3, i da su prekidai obeleeni decimalno (1 12), kao u prolom primeru. Pre svega, potrebno je ukljuiti pull-up otpornike. Onda treba definisati pin RB0 kao izlazni, a RB1, RB2 i RB3 kao ulazne i postaviti RB0 na logiku 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 definiu kao ulazni, a RB1 kao izlazni sa logikom 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 nain je softverski malo tei za implementaciju, jer se u istom registru mora vriti manipulacija izmeu ulaznih i izlaznih stanja pinova (to povlai za sobom prelazak izmeu banki). Meutim, njim je mogue testirati 12 prekidaa sa samo 4 pina. I u ovom sluaju mora se pamtiti zadnje stanje odgovarajueg tastera ukoliko je potrebno obaviti odreenu operaciju po njegovom otputanju. Ovakvi naini testiranja tastera mogui su jer je (kao tromost oka kod multipleksa sa LED) ovde primenjena tromost prsta kojim se pritiska prekida. Naime, proseno minimalno vreme za koje korisnik dri taster prekida pritisnutim je oko 50 do 100mS. Lino sam imao zadovoljstvo da na kratko popriam sa prvakom Srbije u kucanju na teleprinteru (sprava poput elektrine pisae maine). Kuca 600 slova za 1 minut, odnosno 10 slova za 1S. Kod njega je ovo proseno vreme sigurno neto krae. Moe li se jo smanjiti broj potrebnih pinova? Naravno da moe. Vie o tome u narednim poglavljima.

166

81. Dupli multipleks


Sledeom emom realizovana je kombinacija multipleksa ulaza sa multipleksom izlaza. Na taj nain pinovi PORTB registra imaju duplu funkciju.

Setite se multipleksa izlaza. Pic periodino postavlja stanje na LED segmentima i preko zajednike katode ukljuuje kompletan displej. Zatim ga iskljuuje, pa postavlja stanje na sledeem. Duplim multipleksom bi se u trenutku dok je su svi displeji iskljueni testirali taster prekidai povezani paralelno sa displejima po principu multipleksa ulaza. Otpornici od 220 postavljeni su zbog ograniavanja struje kroz LED segmente i smanjenja uticaja indukovanih napona na ulazima mikrokontrolera (samo 4 gornja), a otpornici od 2,2k da ostali segmenti displeja ne bi zasvetleli pri pritiskanju prekidaa dok je ukljuen neki od displeja. Najpre je da se ne bi javilo nedefinisano stanje na ulazima potrebno ukljuiti pull up otpornike. To se moe uraditi prilikom inicijalizacije, na poetku programa. Kako su LED displeji aktivni samo kada je PORTB definisan kao izlazni, ovo im nee smetati. U multipleks rutini se u pauzi izmeu ukljuenja displeja (dok su svi displeji preko PORTA registra iskljueni) RB0 do RB3 definiu kao ulazni, a RB4-RB7 kao izlazni pinovi. Redom se na RB4 do RB7 postavlja logika 0, i testiraju stanja na RB0, RB1, RB2 i RB3 pinovima. Ukoliko je na nekom od njih prisutna logika 0, to indikuje pritisnut odgovarajui prekida. Po testiranju svih prekidaa, pinovi PORTB registra definiu se kao izlazni, na PORTB se postavlja slika koja e se pojaviti na LED displeju i ukljuuje se odgovarajui displej. Testiranje se moe obavljati izmeu cifara pojedinih displeja ili nakon to je prikazana slika na svim displejima. Koji ete nain odabrati zavisi od eljene brzine testiranja prekidaa. Za detalje pogledajte AN529 i AN557 sa http://www.microchip.com/. 167

82. Kapacitivni prekidai


U ovom poglavlju nauiete kako se unutar PIC mikrokontrolera moe implementirati detekcija prisustva prsta korisnika u blizini odreenog polja. Seate se principa rada wilkinsonovog A/D konvertora? On (pored otpornosti) moe biti iskorien i za merenje kapacitivnosti. Dovoljno je umesto promenljivog postaviti otpornik stalne vrednosti i to manje tolerancije. Kao jedna obloga kondenzatora koristi se vea povrina ploice pertinaksa, a kao druga priblien prst korisnika. Promena izmerene kapacitivnosti ukazuje na prisustvo druge obloge ovakvog kondenzatora (prsta) u blizini prve obloge. Kako je promena kapacitivnosti previe mala (5pF-15pF) da bi se mogla dovoljno uspeno detektovati A/D konvertorom, obino se umesto jednog koristi 255 ciklusa merenja, pri emu se za njihovo brojanje moe koristiti T0CKI pin. Frekvencija ovakvog oscilatornog kola direktno zavisi od kapacitivnostu izmeu obloge i prsta. Njena promena iznosi od 1% do 5%. Za merenje ovako malih promena su napredniji mikrokontroleri u prednosti zbog postojanja dva tajmera. Jedan se koristi za brojanje impulsa, a drugi za generisanje vremenske baze. Ovaj efekat mogu je jer se ljudsko telo ponaa kao provodnik. Uz dovoljnu veliku povrinu obloge i dovoljno malo rastojanje izmeu obloge i prsta korisnika detekcija je prilino pouzdana. Naravno da je zbog svog principa rada podlonija smetnjama, ali eliminacija mehanikih prekidaa utie na smanjenje cene i lepi izgled projekta. eljeni oblik tastature moe se odtampati na hartiji ili termootpornoj foliji (moe se nabaviti u knjiarama), i takva slika moe se postaviti izmeu stakla i obloge. Kako se u ovom sluaju 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...) mogue je detektovati pribliavanje i odaljavanje prsta od obloge, naravno u dosta ogranienom dometu. I sami moete zakljuiti da najvei efekat na da ispravnu detekciju ima upravo oblik i povrina oplate. Zato se njenoj konstrukciji mora posvetiti posebna panja. Za detalje pogledajte AN1101, AN1102 , AN1103 i AN1104 sa http://www.microchip.com/ i www.microchip.com/mTouch. Kapacitivni prekidai imaju i par mana. Oni imaju malo veu potronju energije, odailju elektromagnetne talase (zbog vee povrine obloge se ponaa kao antena) na maloj daljini, jaki elektromagnetni talasi mogu izazvati pogrenu detekciju ( http://www.youtube.com/watch?v=_gL2VhAPEbA&amp;watch_response ) pritisnutosti tastera, za svaki prekida zahtevaju najmanje jedan U/I pin i zbog pouzdanog merenja trae da PIC radi na to veoj frekvenciji. Sleep mod ni multipleks jednostavno nisu mogui.

168

83. Do 16 ulaza na 1 pinu


Odmah da napomenem da Vam ne preporuujem upotrebu ovog kola. Dovoljno je da upotrebljene komponente usled starenja malo promene svoje vrednosti i detekcija vie nee biti uspena. Osim toga, skoro svaka elektronska komponenta menja svoje parametre pri promeni temperature. Mogue da e sa ovim kolom ispravna detekcija vremenom biti mogua jedino pri niskoj temperaturi. Zato je za ovu emu neophodno koristiti komponente male tolerancije.

Princip rada je sledei. Pin RB0 povezan je kao wilkinsonov A/D konvertor, ali umesto merene otpornosti, ovde se pojavljuje otporna mrea. Rezultujua otpornost na pinu zavisi od toga koji taster je pritisnut u odreenom trenutku. Najmanja je (1k) kada je pritisnut taster 1, poveava se do tastera 16 (1k + 4k7 + 4k7 + 4k7 + 1k + 1k + 1k = 18,1K), a najvea je (teorijski beskonana) kada nije pritisnut ijedan taster. Softver treba po izmeriti vrednost otpornosti po principu A/D konvertora i na osnovu dobijene vrednosti pronai koji taster je pritisnut. Za razliku od ostalih ema sa vie ulaza, ovom emom je skoro nemogue realizovati detekciju vie istovremeno pritisnutih tastera zbog veeg broja rednih i paralelnih spojeva otpornika. Vie o ovom principu imate na http://www.romanblack.com/keypad.htm . http://www.josepino.com/ i na

169

84. Buenje iz sleep moda po pritisnutom tasteru


Ako je potreban 1 taster prekida, nema problema. Koristite buenje interaptom na RB0 pinu. Ukoliko vam je potrebno buenje uz do 4 prekidaa, dovoljno je postaviti prekidae na RB4 do RB7 pinovima, dozvoliti interapt po promeni stanja na RB4 do RB7 pinovima sa setovanim GIE bitom i otii u sleep mod. Zajedniki interapt flag prekidaa e se po pritisku bilo kog prekidaa setovati, ali mikrokontroler u trenutku interapta ne zna koji prekida ga je probudio. Nakon buenja mogue je testirati RB4RB7 pinove kako da bi se utvrdilo na kom pinu je i dalje pritisnut taster. Izgleda da je nemogue buenje iz sleep moda izazvati korienjem veeg broja prekidaa. Kako onda napraviti daljinski upravlja? Postoji kao i uvek vie reenja. Jedno koristi interapte a drugo reset mikrokontrolera. ta ete koristiti zavisi od vaih konkretnih potreba.

Ovde se najpre ukljue pull up otpornici, a zatim se RB0 do RB3 pinovi deklariu kao izlazni sa logikom 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 logiku 0 (drei ostale na logikoj 1), i skenirati RB4 do RB7 pinove da bi se utvrdilo koji je taster i dalje pritisnut. Za vie detalja pogledajte AN552 sa http://www.microchip.com/. Drugim nainom mikrokontroler se resetuje po pritisku prekidaa.

170

Na ovoj emi svi izlazi (RB0 do RB3) postavljeni su na logiku 0. Kondenzator C se napunio preko otpornika od 47k i dovodi logiku 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 logike 0 na MCLR pinu ne resetuje. Po resetu se svi U/I pinovi u hardverskoj inicijalizaciji mikrokontrolera definiu kao ulazi, to spreava dalje pranjenje kondenzatora. Vrednosti otpornika i kondenzatora izabrane su tako da je trajanje ciklusa pranjenja i punjenja kondenzatora manje od vremena reseta mikrokontrolera (oko 18mS). im se reset zavri, potrebno je ukljuiti Pull up otpornike, na RB0 do RB3 pinovima redom na kratko postaviti logiku 0 (drei ostale izlaze na logikoj 1), to bre testirati stanje prekidaa na RA0 do RA3 pinovima, i vratiti pinove RB0 do RB4 na logiku 1. Prebacivanje izlaza na logiku 0 ne moe prouzrokovati ponovni reset mikrokontrolera ukoliko je vreme testiranja previe brzo (reda 10S). Za vie detalja o ovome pogledajte AN528 sa http://www.microchip.com/.

171

85. Moe li jo manje?


Moe, ali uz upotrebu specijalizovanih integrisanih kola koja u sebi ve imaju integrisanu multipleks rutinu, i dovoljan broj pinova za povezivanje na LED displeje, odnosno prekidaku matricu. Tipini predstavnici ovih integrisanih kola su: EDE702 EDE707 LCD displej drajver. Upravljanje preko 1 pina. LED displej drajver za 8 sedmosegmentnih displeja (bez decimalne take). Prikaz cifara 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E i F. Upravljanje preko 4 pina.

EDE1144 - Dekoder za 16 tastera. Serijska detekcija preko 2 pina, ili paralelna preko 4 pina (+1 za signalizaciju ispravno primljenog stanja prekidaa) EDE1188 - Dekoder za 64 tastera. Serijska detekcija preko 2 pina. ICM7218A LED displej drajver za 8 sedmosegmentnih displeja sa zajednikom anodom (bez decimalne take). Prikaz cifara 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E i F sa mogunou direktnog adresiranja pojedinih LED ICM7218B LED displej drajver za 8 sedmosegmentnih displeja sa zajednikom katodom (bez decimalne take). Prikaz cifara 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E i F sa mogunou direktnog adresiranja pojedinih LED Uz njih je za razliku od multipleksa izazivanog mikrokontrolerom bez problema mogue otii u SLEEP mod. EDE707 integrisano kolo e nastaviti sa prikazom po jednom dovedenom stanju, bez ikakve naknadne intervencije mikrokontrolera, a EDE1144 i EDE1188 se mogu povezati tako da po pritisnutom tasteru preko jednog pina izazovu interapt (ovo se moe upotrebiti za buenje iz SLEEP moda), i (45mS nakon interapta dovoljno za stabilizaciju oscilatora mikrokontrolera) serijski preko drugog pina u mikrokontroler poalju kd tastera.

172

86. Poveanje broja U/I pinova


Ponekad nije mogue koristiti multipleks zbog potrebe za stalnim (neisprekidanim) logikim nivoima. Oigledno je da bi u tom sluaju trebali na odgovarajui nain izvriti poveanje broja ulazno izlaznih pinova. Za to se moe koristiti standardno integrisano kolo 74138 u kombinaciji sa 74259 ili 4099 kao ulaznim kolima, i u kombinaciji sa 74251 ili 4512 kao izlaznim kolima.

Na taj nain moete koristei samo PORTB dobiti do 64 ulaznih ili izlaznih pinova. Ukoliko Vam je ovo preskupo, moete koristiti pomerake (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 moe realizovati proizvoljno veliki broj ulaza / izlaza. Softver mikrokontrolera morao bi regulisati pomeranje i serijske ulazno / izlazne rutine. Multipleks korienjem ovako proirenog broja ulazno / izlaznih pinova je mogu jedino u sluaju da nije potrebno menjati stanje pinova od ulaznog u izlazni i obrnuto, ali uz dosta komplikovaniji program. U SLEEP mod je mogue otii, jedino ukoliko se istovremeno ne primenjuje multipleks. Ukoliko Vam je potrebno 8 ulaza ili izlaza, moete koristiti PCF8574. Sa njim je multipleks tee ostvariti, ali je mogu SLEEP mod. U praksi se ovi naini veoma retko koriste. Jednostavnije (i jeftinije) je uzeti mikrokontroler sa veim brojem ulazno izlaznih pinova.

173

87. Odabir i konverzija brojnih sistema


Binarni brojni sistem ne mora uvek biti najpoeljniji. Ukoliko Vam je na primer potrebno prikazivanje 2 cifre na LED displeju, najpoeljniji je BCD oblik. U BCD obliku ak moete 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 matematike operacije praktinije bi bilo korienje operacija sa pokretnim zarezom (eng. Floating Point ili skraeno float). U zavisnosti od konkretne primene moda Vam je lake sve operacije izvravati u obliku koji vama odgovara, a zatim na kraju prorauna konvertovati rezultat u oblik pogodan za prikazivanje preko konverzionih algoritama. Na sajtu http://www.microchip.com/ dat je odreeni broj konverzionih rutina. To su: AN526 - BCD (Binary Coded Decimal) to binary conversion routines - Binary to BCD conversion routines AN554 - 8-bit binary to 2 digit BCD conversion - 16-bit binary to 5 digit BCD conversion - 5-bit BCD to 16-bit binary conversion AN575 - float to integer conversion - integer to float conversion AN670 - Floating Point to ASCII Conversion Za manji broj vrednosti promene brojnih sistema moete runo izvriti koristei integrisan Linuxov ili Windowsov digitron. Prilikom promene bez digitrona, mogue je konverziju obavljati po sledeim principima: Binarni u heksadecimalni oblik Najpre se binarni broj podeli u niblove: 1 1100 0100 1000 1000 0100, a onda se pronae odgovarajua cifra za svaki nibl : 1 C 4 8 8 4 = 1C48x84. Heksadecimalni u binarni oblik Mogue je promeniti svaku cifru u nibl: 5 F 3 7 B = 5F3x7B po sledeem: 101 1111 0011 0111 1011 Binarni u decimalni oblik Ovo je malo problematino. Najpre napiite decimalnu vrednost iznad svakog bita: 1024 512 256 128 64 32 16 8 4 2 1, a onda saberite vrednosti za svaku 1 1 0 1 1 0 1 0 1 1 0 0 = 1024+256+128+32+8+4 = .1452 Decimalni u binarni oblik Ovo je takoe komplikovano. Oduzmite od decimalnog broja maksimalni umnoak broja 2 (1,2,4,8,16,32,64,128,256,512,1024,...) koji moe biti oduzeti od njega, bez prelaska u negativnu vrednost. Bitovi iji umnoak broja 2 se koristi, bie na logikoj 1, dok e ostali biti na logikoj 0. Za broj .582 to izgleda ovako: 174

582 - 512 = 70 70 - 64 = 6 6- 4= 2 2- 2= 0

512 256 128 64 32 16 8 4 2 1 1 0 0 1 0 0 0 1 1 0 = b'10 0100 0110'

Decimalni u heksadecimalni oblik Najpre konvertujte decimalni oblik u binarni, a zatim binarni u heksadecimalni. Za gornji sluaj to bi izgledalo ovako: .582 = b'10 0100 0110' = 2x46 Postoji i nain direktne konverzije deljenjem umnocima maksimalne vrednosti jednog nibla. 582 / 256 = 2 sa ostatkom 70 70 / 16 = 4 sa ostatkom 6 6 / 1 = 6 sa ostatkom 0 Rezultat je 2x46. Heksadecimalni u decimalni oblik Konvertujte iz heksadecimalnog u binarni oblik, a zatim iz binarnog u decimalni. Za raniji sluaj to bi izgledalo ovako: 5F3x7B = b'1011111001101111011'=.390011 Postoji i nain direktne konverzije mnoenjem umnoaka maksimalne vrednosti jednog nibla. Na primer za broj 3x8D to je: 3 x 256 = 768 8 x 16 = 128 Dx 1 = 13 Rezultat je 768 + 128 + (ostatak koji nije mogao biti pomnoen) 13 = .909. Ipak, i dalje je jednostavnije koristiti digitron.

175

88. esnaestobitna aritmetika


Ranije ste nauili upotrebu instrukcija sabiranja i oduzimanja. Moguce je da osmobitne operacije nisu dovoljne za odreene primene. Iako PIC16F84 nema hardverske instrukcije za rad sa esnaestobitnim brojevima, nije ih previe teko implementovati softverski. Pre svega, brojeve kao i rezultat operacije morate drati u dva bajta. Od ta dva bajta jedan e biti bajt vee teine (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. Sledeim potprogramom ilustrovano je sabiranje esnaestobitnih brojeva. cblock 0x1C LSB1 ; Promenljiva 1, bajt manje teine MSB1 ; Promenljiva 1, bajt vee teine LSB2 ; Promenljiva 2, bajt manje teine MSB2 ; Promenljiva 2, bajt vee teine LSBRES ; Rezultat, bajt manje teine MSBRES ; Rezultat, bajt vee teine endc Sab movf addwf movwf movf btfsc addlw addwf movwf return LSB1,W LSB2,W LSBRES MSB1,W STATUS,C 0x01 MSB2,W MSBRES ; Uzmi bajt manje teine prvog operanda ; saberi sa bajtom manje teine drugog operanda. ; Rezultat u bajt manje teine rezultata. ; Uzmi bajt vee teine prvog operanda ; Da li je dolo do prekoraenja? ; Jeste, dodaj Carry flag. ; saberi sa bajtom vee teine drugog operanda. ; Rezultat u bajt vee teine rezultata.

Rezultat e biti taan jedino u sluaju da da se zbir moe predstaviti sa 16 bita (0 do 65535 u sluaju neoznaenih ili -32768 do 32767 u sluaju oznaenih brojeva). U protivnom, bie obavezan jo jedan registar za uvanje stanja Carry flaga. Na slian nain moe se realizovati i oduzimanje dva esnaestobitna broja. Pored ovih operacija, unutar PIC16F84 mikrokontrolera mogue je realizovati mnoenje, deljenje, kvadratni koren, generisanje pseudosluajnog niza brojeva pa ak i mnogo, mnogo komplikovanije operacije. Po potrebi, ove funkcije mogu se proiriti za veu rezoluciju, kao i za rad sa pokretnim zarezom (eng. floating point). Za detalje pogledajte AN526, AN544, AN575, AN617, AN660 sa http://www.microchip.com/ i http://www.piclist.com/cgi-bin/constdivmul.exe link.

176

89. Brze matematike operacije


Pretpostavimo da elite izraunati kvadratni koren. Unutar AN526, AN544 i AN660 datasheeta tvrdi se da e se za njegovo raunanje utroiti oko 3000 instrukcijskih ciklusa (3mS pri 4MHz taktu), kao i da e za njegovo raunanje biti utroeno skoro svih 8 nivoa steka. U ovom poglavlju nauiete par trikova koji Vam mogu posluiti za brzo raunanje. Pretpostavimo da elite izraunati kvadratni koren nad osmobitnim brojem (.0 do . 255). Nita lake. Koristiete tabelu. Tab1 addwf retlw retlw retlw retlw retlw retlw . . retlw retlw PCL,F .0 .1 .1 .1 .2 .2 . .15 .15 ; U W se nalazi broj od .0 do .255. ;00 ;11 ;21 ;31 ;42 ;52 ; 254 15 ; 255 15

Tabelom koja Vam vraa celobrojnu vrednost moete dobiti taan celobrojni rezultat u samo 5-6 instrukcijskih ciklusa. I sami uoavate da je preciznost rezultata previe mala za ikakav ozbiljniji rad. Nema problema. Vrednost prve decimale rezultata nai e se u sledeoj tabeli. Tab2 addwf retlw retlw retlw retlw retlw retlw . . retlw retlw PCL,F .0 .0 .4 .7 .0 .2 . .9 .9 ; U W se nalazi broj od .0 do .255. ; 0 0,0 ; 1 1,0 ; 2 1,4 ; 3 1,7 ; 4 2,0 ; 5 2,2 ; 254 15,9 ; 255 15,9

Za drugu decimalu koristila bi se naredna tabela, i tako dalje. Iako su ovi naini izuzetno brzi, nisu ekonomini u pogledu utroka programske memorije. Dobar kompromis izmeu brzine i veliine programa predstavljao bi uvanje decimala u binarnom ili BCD obliku. Na taj nain gornje dve tabele mogle bi se kompresovati u jednu, tako to bi gornji nibl sadrao celobrojnu vrednost (0 do 15), a donji vrednost prve decimale. Za prikaz celobrojne vrednosti na LED displeju pozvala bi se odgovarajua 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 retlw retlw retlw retlw retlw retlw . . retlw retlw

PCL,F 0x00 0x10 0x14 0x17 0x20 0x22 . 0xF9 0xF9

; U W se nalazi broj od .0 do .255. ; 0 0,0 ; 1 1,0 ; 2 1,4 ; 3 1,7 ; 4 2,0 ; 5 2,2 ; 254 15,9 ; 255 15,9

Za vei broj decimala pogodnije bi bilo koristiti binarni oblik zapisa (makar samo za decimale) i odgovarajue konverzione rutine. Sve zavisi od toga kolika Vam je brzina raunanja potrebna. Dobro poznavanje oblika signala odgovarajue matematike operacije moe Vam pomoi prilikom kompresije njene tabele. Kompresija opisana ranije ne bi bila mogua da je celobrojni rezultat operacije nad brojem 255 vei od 15, jer se broj vei od 15 ne moe nai u jednom niblu. Pogledajte na primer sinusnu funkciju. Slika Umesto uvanja vrednosti cele periode unutar vie tabela, mogli biste koristiti oznaene brojeve i naknadno dodatim MSB bitom pokazivali pripadnost gornjoj, odnosno donjoj poluperiodi. Na taj nain prepolovili biste broj potrebnih tabela za isti broj decimala. Slika Jo veu kompresiju dobili biste ukoliko se ograniite samo na etvrtinu periode, jer zbog simertinosti poluperiode drugi deo moete regenerisati oduzimanjem indeksa tabele od maksimalne vrednosti. Tako je broj potrebnih tabela smanjen na etvrtinu. Jedan nain raunanja sinusne (i kosinusne) funkcije za uglove od 0 do 45 stepeni i sa tanou od 6 decimala dobiti obrascima: SIN(X) = 1.7453293 * X * (1 0.50758 * X * X * (1 0.149 * X * X)) COS(X) = l 1.523087 * X * X * (1 0.25382 * X * X * (1 0.1 * X * X)) Za uglove od 45 do 90 stepeni, setite se da je SIN(X) = COS(90 X). Sledei nain brzog raunanja podrazumeva upotrebu eksterne EEPROM memorije. Na primer uz odgovarajuu I2C EEPROM memoriju mogue je unutar EEPROM-a uvati rezultate svih potrebnih matematikih operacija. Brzina raunanja bila bi jednaka brzini I2C veze, a program ne imao duge tabele. Maksimalnu brzinu dobili bi 178

upotrebom eksterne EPROM memorije, ali ona troi najvei broj pinova. Budui da je njena cena danas izuzetno niska, to bi ipak moglo predstavljati dobro reenje. Ukoliko Vam ni ovaj princip ne moe zadovoljiti apetit, razmislite o eksternom kooprocesoru. Integrisano kolo uM-FPU V3.1 predstavlja 32-bitni kooprocesor sa pokretnim zarezom i integrisanom I2C i SPI vezom. Za razliku od mikrokontrolera on je specijalno razvijen za brzo izvravanje sloenih matematikih operacija, tako da e na primer rezultat kvadratnog korena zavisiti jedino od brzine komunikacije. U praksi se matematiki prorauni uz eksterni hardver retko kada koriste. Isto kao kod poveanja broja U/I pinova, daleko je jednostavnije (i jeftinije) koristiti moniji mikrokontroler.

179

90. Merenje vremena


Ve znate kako moete meriti vreme. Obavezan je kristalni oscilator, i deljenje njegovih taktova. Meutim uz kristalni oscilator od 4MHz morali bi se malo pomuiti dok doete do vremena od tano 1S. Ne verujete? Zato to razmiljate decimalno, a ne binarno! Seate se da se jedna instrukcija izvri za 4 takta mikrokontrolera. Uz kristal od 4MHz instrukcija se izvri za 1 mikrosekundu, odnosno (ukoliko se zbog lakeg razumevanja pretpostavi da se jedna instrukcija izvri za vreme jednog takta oscilatora) kao da je korien kristal od 1MHz. Moda smatrate da je to idealno! 1Hz 10Hz 100Hz 1MHz. I bilo bi tako, samo kada bi PIC mogao lako deliti sa 10. Kako je mikrokontroleru osnova za deljenje 2 a ne 10, evo ta bi se desilo u tom sluaju: 1Hz 2Hz 4Hz 8Hz 16Hz 32Hz 64Hz 128Hz 256Hz 512Hz 1,024kHz 2,048kHz 4,096kHz 8,192kHz 16,384kHz 32,768kHz... Mnogo je praktinije uzeti kristal (kakav se i inae koristi u digitalnim asovnicima) od 32,768kHz, ili kristal sa nekom od frekvencija iz niza. Njegov takt moe se viestrukim uzastopnim deljenjem sa dva smanjiti na ravno 1Hz. Jo bolje, za proces deljenja moe se koristiti integrisani preskaler tajmera sa skokom na interapt po dostignutom odnosu deljenja. Interapt bi Vam ionako bio potreban zbog multipleksa LED displeja. Osim toga kvarcni kristali ove frekvencije fabriki imaju manje odstupanje frekvenije od ostalih, upravo zbog njihove primene u generatorima preciznih vremenskih intervala. Ukoliko mikrokontroler treba (pored sata) obavljati i neke druge operacije, praktinije 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 moe 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 mogue direktno na pinove mikrokontrolera povezati kristal (sa pripadajuim 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 odluiti da li ete mu implementirati korekciju 29. februara za sluaj prestupne godine (Leap year) i automatsko auriranje prilikom promene vremena (eng. Daylight savings). Zbog toga Vas va kompjuter pita za prelazak na letnji ili zimski nain raunanja vremena. Da li ste ikada podesili sat na svom kompjuteru, ali nakog 6 meseci primeujete da on uri 5 minuta. Iako se fabrike trude da im kristali budu sa to preciznijom frekvencijom, ne uspevaju uvek u tome. Sreom, moete 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 tanu kalibraciju upotrebljenog kristala. Najbolje je svakako ovu korekciju ubaciti za odreeni (fiksni) broj sekundi, ali to dosta komplikuje program i samim tim namee potrebu za njegovim sporijim izvravanjem. Drugaiji nain (hardverski) kalibracije vremena sastojao bi se u menjanju kapacitivnosti jednog od kondenzatora pored kristala od 32KHz. Najlake telovanje postie se trimer kondenzatorom. Dodatnu preciznost moete postii temperaturno kontrolisanim oscilatorom. Gotove softverske rutine za sat moete nai 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. Pravljenje najobinijeg digitalnog asovnika mikrokontrolerom nije ba praktino. Digitalni asovnici imaju svoja specijalizovana integrisana kola. Nema svrhe troiti novac na skuplji mikrokontroler. Isplati se to raditi jedino u sluaju da je potrebno napraviti sat specifinih osobina (vie alarma, povezivanje sa kompjuterom), kao na primer sa sajta http://www.bobblick.com/techref/projects/propclock/propclock.html. A ukoliko je mala potronja imperativ, mogu se specijalizovana integrisana kola povezati sa mikrokontrolerom. Tipini predstavnici ovakvih integrisanih kola su DS1307, PCF8593 i NJU6355. Zbog njihove minimalne potronje direktno na tampanu ploicu moe se zalemiti mala litijumska baterija preko koje bi se sat napajao elektrinom energijom u sluaju nestanka struje (isto kao kod matinih ploa kompjutera). Pored toga ova kola (isto kao i gore pomenuti Maestro softver) u sebi sadre kalendar, zajedno sa proraunima prestupnih godina. Nemojte misliti da bi upotrebom tih kola dobili veu preciznost. Preciznost takta direktno zavisi od upotrebljenog kristala (i njegove kalibracije), a potpuno isti kristal se koristi i u tim kolima.

181

91. Drajveri
Iako Vam moe tako izgledati, ovo nije ala. Ovde se dodue ne radi o drajverima za skener, tampa ili grafiku karticu, ve o drajverima za LED, LCD displej, prekidae ili step motor. Pogledajte najjednostavniji primer. Pretpostavljam da Vam je lake i razumljivije da testirate prekidae tako da pri njihovoj pritisnutosti oekujete pojavu logike 1, a ne logike 0 (to bi se sigurno desilo pri upotrebi pull-up otpornika). Najjednostavnije je u tom sluaju invertovati sve ulaze. Drajver_za_prekidace comf PORTB,W andlw b'00000011' return ; Stanje prekidaa u bitovima 0 i 1 u W ; Invertovani PORTB u W ; Maskiranje bitova 2 do 7 (izlazni) ; Povratak iz potprograma

Drajver bi se mogao dodatno kombinovati sa glavnim programom tako da se vrednost b'00000011' zadaje jednom pre inicijalizacije (npr. sa B_ULAZI equ b'00000011'), a zatim da se inicijalno podeavanje TRISB registra kao i andlw instrukcije unutar drajvera podesi ovako imenovanom vrednou. Pogledajte sada sledei primer. Jedan LED displej na portu B. Drajver bi se sastojao od ve ranije nauene tabele i potprograma za ispis. To bi moglo izgledati ovako: Drajver_za_led call Tabl movf SPORTB call Update return Tabl addwf retlw retlw retlw retlw retlw retlw Update movf movwf movf movwf return PCL,f b'00001100' b'10110110' b'10011110' b'11001100' b'11011010' b'11111010' SPORTA,W PORTA SPORTB,W PORTB ; Drajver za ispis W broja na LED displej ; Poziv za sliku LED displeja ; Slika cifre u shaddow registar za port B. ; Poziv potprograma za ispis ; Povratak iz potprograma ; U W se nalazi se vrednost od ; .1 do .6. Ta vrednost se dodaje na PCL. ; Obrazac za crtanje cifre 1 - 1 ; Obrazac za crtanje cifre 2 - 2 ; Obrazac za crtanje cifre 3 - 3 ; Obrazac za crtanje cifre 4 - 4 ; Obrazac za crtanje cifre 5 - 5 ; Obrazac za crtanje cifre 6 - 6 ; Shaddow registar porta A ; u PORTA ; Shaddow registar porta B ; u PORTB ; Povratak iz potprograma

Potprogram Update moe se ovako pozivati i za port A, odnosno moe sluiti kao posebna celina. 182

Kad god je mogue standardizujte softver za uobiajeni hardver drajverima. Potrudite se da odreene 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 greaka. Drajveri koji su vremenski kritini (npr. za osveavanje vie LED displeja, debouncing ili kontrolu step motora) mogu se pozivati u odreenim trenutcima iz interapta. Ipak, rad sa vie ovakvih vremenski kritinih delova unutar jednog programa dodatno komplikuje osnovni algoritam programa. Da bi se takvi delovi mogli izvravati bez dodatnih uslonjavanja, glavni program treba periodino, po zadatim kriterijumima pozivati ove delove. Vie o takvom principu nauiete u narednom poglavlju.

183

92. Operativni Sistem


Da li je mikrokontroleru potreban operativni sistem? Uglavnom nije. Meutim, ima primera kada je jednostavnije podeliti program u vie nezavisnih celina od kojih se svaka treba izvravati nezavisno od drugih. Program na taj nain moe biti sastavljen od mnogo nezavisnih (tanije uslovno nezavisnih) delova (eng. task) pri emu su pojedinani taskovi u osnovi jednostavni. Na primer kod duplog multipleksa jedan task brinuo bi se o osveavanju LED displeja preko njegovog drajvera, drugi o debouncingu prekidaa, a trei bi u stvari radio ono za ta je mikrokontroler i namenjen. Taskovi mogu efektno meusobno komunicirati preko namenskih registara opte namene i flegova unutar njih (npr. registar DISPLEJ1 i DISPLEJ2 za prikaz na LED displejima i registar TASTERI sa flagovima bit 0-taster1, bit 1-taster2...). Na taj nain dobija se jedan pravi mali multitasking sistem. Svakako da je u ovom sluaju poeljno napraviti mali OS koji bi regulisao pozivanje pojedinih celina po unapred zadatim parametrima (npr. u tano odreeno vreme). U nastavku teksta bie opisani osnovni principi takvih sistema. Najjednostavniji multitasking OS bio bi redom pozivao taskove po prekoraenju tajmera. Pojedinani taskovi redom bi se mogli pozivati on W goto principom opisanim ranije. Preskaler treba biti tako podeen da omogui i najzahtevnijem tasku siguran zavretak pre novog prekoraenja tajmera. Svakako da tako jednostavan OS ima dosta mana. Mikrokontroler e sve taskove morati da izvrava malo duim vremenom od taska najdueg trajanja. To je prilino neekonomino rasipanje resursa. Taskovi uglavnom zahtevaju pozivanje u razliitim intervalima (npr. task za osveavanje LED displeja treba ee pozivati od taska za testiranje prekidaa). Interapti moraju trajati to krae kako ne bi previe koili taskove. Sloeniji princip davao bi odreeno fiksno vreme za svakom pojedinanom tasku. To je najlake postii interaptima izazvanim tajmerom. Iako to vreme ne mora biti dovoljno za zavretak taska, po isteku vremena njegovo izvravanje bi se prekinulo, i poeo bi sledei task. Sadraj W i STATUS registra bi se morao snimati (kao kod interapta) za svaki pojedinani task. Redni broj taska koji se trenutni izvrava kao i status pojedinanih taskova (npr. zauzet ili zavrio) mogao bi se snimiti u par kontrolnih registara. Taskovi se mogu razlikovati po zahtevima za opsluivanjem. Na primer osveavanje displeja mora imati prioritet nad ostalim taskovima, i mora biti pozivano u tanim vremenskim intervalima. Za razliku od njega task za izraunavanje kvadratnog korena nema zahteva za odreenim vremenom, tako da se moe izvravati kad god se ne izvrava task veeg prioriteta. U kompjuterskim operativnim sistemima, na primer, najvie procesorske snage troi trenutno aktivan prozor. Za vie detalja pogledajte AN514, AN585, AN777 i asopis Elektor Electronics broj 5/98.

184

93. Elektronika, matematika, fizika...


Programiranje mikrokontrolera se (za razliku od programiranja kompjutera) ne moe posmatrati kao usamljen, izdvojen proces. U najeem broju sluajeva mikrokontroler e obraivati spoljne signale. Ranije pomenute metode (multipleks i dupli multipleks, poveanje broja U/I pinova, principi A/D i D/A konverzije, konverzija otpornosti i kapacitivnosti, princip rada kapacitivnih prekidaa...) zahtevaju poznavanje osnovnih principa elektronike. Matematiki principi su takoe bitni (npr. zbog interpolacije, komplementa dvojke, sortiranja podataka, CRC algoritma, operacija sa negativnim ili brojevima sa pokretnim zarezom...). Meutim, iako se to uglavnom ne spominje u literaturi poznavanje fizikih zakona moe Vam itekako pomoi u pravilnom dizajniranju ureaja. Na primer primenom doplerovog efekta omogueno je (zvuno ili optiko za bre mikrokontrolere) merenje brzine pokretnog objekta. Svest o nejednakoj propustljivosti atmosfere za razliite talasne duine svetlosti omoguie vam pravilan izbor talasne duine predajne i prijemne fotodiode. Fazna modulacija (eng. Phase Shift Keying) tona omoguava uzak audio frekventni opseg, a samim tim veu izlaznu snagu radio predajnika. Takoe je i najosetljivija sa strane prijemnika. Poznavanje karakteristika ljudskog oka omoguava multipleks izlaza a ljudskog uva kompresiju muzike ili govora (npr. ADPCM ili Speex algoritmom) bez znaajnijeg gubitka kvaliteta. Poznavanje informatike, moe Vam itekako pomoi prilikom povezivanja kompjutera i mikrokontrolera. Mikrokontroler bi mogao skupljati podatke na terenu, a kompjuter bi ih mogao na miru svom svojom snagom analizirati.

185

94. Stranienje memorije


U poglavlju sa tabelama upoznali ste se sa problemom stranienja programske memorije u blokovima od po 256 bajtova. Ukoliko elite jednom prei i na savremenije (ili starije a jeftinije) mikrokontrolere, morate shvatiti princip i potrebu za stranienjem memorije. Tabelama je kao to ste ve nauili neophodno stranienje u programskoj (ROM) memoriji. Ukoliko deo tabele izae iz bloka od 256 bajtova, program e verovatno krahirati. U potpuno istoj situaciji nalaze se mikrokontroleri PIC16 serije sa vie od 2Kb memorije. Kod mikrokontrolera iz PIC16 serije koji imaju vie od 2Kb programske memorije (PIC16F84 ima 1Kb) instrukcije CALL i GOTO mogu adresirati maksimalno 2Kb memorije. Ovo ogranienje proistie iz sintakse samih instrukcija. Naime, sve instrukcije su etrnaestobitne. Kako je PC trinaestobitan, on moe direktno adresirati programske adrese od 0 do 8191 (1FxFF), odnosno maksimalno 8Kb programske memorije. Meutim, unutar jedne etrnaestobitne instrukcije nalazi se i kod instrukcije i operand. Kod CALL instrukcije to izgleda ovako: kod adresa 100 xxxxxxxxxxx Kao to vidite, unutar etrnaestobitne instrukcije za adresu preostaje maksimalno 11 bitova. Sa tih 11 bitova mogu se direktno adresirati jedino memorijske adrese od 0 do 2047 (7xFF), odnosno maksimalno 2Kb. Ista situacija je i sa GOTO instrukcijom. Iz tog razloga ni GOTO ni CALL instrukcija ne mogu kao odredite koristiti adrese vee od strane (eng. Page) od 2Kb unutar programske memorije. Da bi se ovo prevazilo, potrebno je kao kod tabele pre skoka podesiti odgovarajue bitove PCLATH registra. RAM memorija takoe pati od slinog problema. Evo kako izgleda kod ANDWF instrukcije: kod odredite adresa 000101 d fffffff Sa 7 bita dostupnih za adresu mogue je adresirati maksimalno 128 registra unutar jedne banke. Kod mikrokontrolera PIC16 serije sa vie od 128 registara (ukljuujui i specijalne registre - PIC16F84 ima 68 optih i 12 specijalnih registara u BANK0) koriste se registri na drugim stranicama RAM memorije (BANK1, BANK2 i BANK3). Prelazak sa banke na banku obavlja se preko RP0 i RP1 bitova. To opet raa nove probleme. Veina registara dostupna je samo iz pojedinih banki. To onemoguava efektno korienje celokupne RAM memorije. Da bi se problem bar donekle ublaio, postoji par registara koji su zajedniki za sve banke. Jo komplikacija moe izazvati indirektno adresiranje preko INDF i FSR registara. Sa 8 bitova koji se mogu nai u njima mogue je adresirati do 256 registara. Zato se unutar STATUS registra nalazi IRP bit kojim se omoguava indirektno adresiranje ostatka RAM memorije.

186

Iz svih ovih razloga PIC16 familija mikrokontrolera je prilino nezahvalna za pravljenje programa veih od 2Kb. Mora se voditi rauna o previe sitnica. Kod PIC18 serije na primer ukinuto je stranienje programske memorije, dok je prostor za registare u bankama povean na 256.

187

95. Disasembler
Sigurno Vam se desilo da ste na internetu naili na program koji radi upravo ono to je Vama potrebno, ali biste mu dodali jo par mogunosti. Naalost autor ga je napisao u PIC Basic ili C jeziku umesto u asembleru, ali je na sajtu ostavio i .hex kd. Disasemblerom je mogue .hex kd pretvoriti u asemblerski listing, koji se kasnije moe editovati. U tome je jedna od prednosti asemblera nad viim programskim jezicima. Ne postoji disasembler koji moe .hex fajl prebaciti u PIC Basic ili C. Neki od najpoznatijih disasemblera za PIC16F84 su Mikado PIC DIS LITE DISASM84 Ve ranije pominjani PIC Simulator IDE. Ovde je potrebno napomenuti da MPLAB asembler omoguuje korienje dodatnog seta instrukcija. Te instrukcije mikrokontroler ne razume, pa su stoga implementovane upotrebom dve ili vie obinih instrukcija. Ovaj set instrukcija mogue je nai u nekim (retkim) .asm fajlovima. Ukoliko elite saznati na koji nain mikrokontroler izvrava takav program, moete disasemblirati njegov .hex fajl i videti nain realizacije iz asemblerskog listinga. Analiza disasembliranih programa uopte nije laka. Komentara nema (osim onih koje disasembler eventualno postavi), registri i bitovi nisu uvek imenovani, a oni koji jesu, imae imena iz banke 0 (iako se moda 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. Neuobiajeno reene operacije (npr. skok upotrebom PCL registra) mogu biti izuzetno komplikovane za analizu. Zato je preporuljivo u disasemblirani listing ubaciti odgovarajue komentare, i podeliti ih u logike celine (blokove). Isto tako, ukoliko ste sigurni u funkciju odreenih registra ili labela, moete im izmeniti naziv u svim mestima u kojima se pojavljuju u programu (preko Edit, Replace opcije). Analiza tuih programa pomoi e Vam u razvijanju sopstvenog stila programiranja, i u uenju novih softverskih tehnika. Osim toga, nema svrhe ponovo izmiljati toplu vodu. Veliki broj mikrokontrolerskih projekata sa interneta je dat kao potpuno besplatan. Onaj ko eli naplatiti svoj trud, ne ostavlja program na internetu, ve prodaje programirane i zatiene mikrokontrolere (ukljuen CP konfiguracioni bit). Budui da je ovaj nain zatite programa mikrokontrolera sasvim dovoljan za spreavanje piraterije, i Vi moete biti sigurni da Vam se dugo pisani program nee odjednom pojaviti na internetu.

188

96. Preprocesor
U programima se esto javlja potreba za standardnim programskim strukturama tipa if...then...else... ili do...while... (primeri su iz Paskal jezika, iako se ista struktura sree u svim viim programskim jezicima). Svakako da se ove strukture mogu realizovati runo u asembleru, ali u veim programima njihov kod je teko pratiti, ak i uz komentare. Preprocesor predstavlja program kojim je mogue ubrzati razvojh programa, zadravajui pri tome svu snagu asemblera. Kako je to mogue? Pretpostavimo da imate ve razvijene drajvere za standardne periferije. Utoliko bolje po Vas. Meutim, nije ba lako povezati ih u celinu. Za najobinije testiranje dvobajtnog broja i izvravanje razliitog koda u zavisnosti od rezultata, morali bi napisati dosta koda. to vie runo pisanog koda, to vea mogunost pojave greaka. Nije li lake pisati: if GODINA > .2008 then incf BROJ,F else decf BROJ,F endif nego: movf sublw btfsc goto btfsc goto Uvecaj Test incf goto movf sublw btfss goto decf ... HI_GODINA,W 0x07 STATUS,Z Test STATUS,C Smanji BROJ,F Kraj LO_GODINA,W 0xD8 STATUS,C Uvecaj BROJ,F

Smanji Kraj

Prvi sluaj je razumljiviji (opet su komentari namerno izostavljeni), i njime je preprocesoru preputena briga oko raunanja konkretnih vrednosti (0x07 i 0xD8) za poreenje, realizovanje odgovarajue programske strukture i izmiljanje naziva labela. Potrebno je naravno prethodno definisati da je GODINA dvobajtna vrednost. Nakon to se preprocesorom dobije odgovarajui asemblerski kod, tako dobijen .asm fajl standardno bi se kompajlirao MPLAB asemblerom. 189

Moda smatrate da je lake koristiti C ili PIC Basic. Delimino ste u pravu. Problem je to vii programski jezici ne ostavljaju programeru mogunost simuliranja programa instrukciju po instrukciju (bar ne na nain kojim bi programer mogao uticati na program na instrukcijskom nivou), njihov kod je dui i sporije se izvrava. Preprocesor pak dodaje samom asembleru (osnovne) mogunosti viih programskih jezika, tako da se asemblerske instrukcije slobodno mogu nalaziti u okviru koda koji izvrava preprocesor. Preprocesor e ih jednostavno ignorisati. Nakon to preprocesor generie osnovni asemblerski kod, lako je naknadno ga izmeniti direktno u MPLAB-u, ukoliko Vam dobijeni kod iz bilo kojih razloga ne odgovara. Prepic preprocesor moete skinuti sa http://www.embedinc.com/pic/dload.htm. Kako on nema GUI (Graphical User Interface) problem e Vam verovatno predstavljati prenoenje parametara unutar komandne linije. SASM (Jessica Meremonte's Structural PIC Assembler preprocessor) preprocesor nalazi se na http://www.picbook.com/downloads.html. On je skromnijih mogunosti, i ne ostavlja programeru mogunost naknadne izmene dobijenog koda (dobija se samo .hex fajl). ista je teta to se mogunosti preprocesora nedovoljno iskoriavaju. Uz preprocesor je razvoj programa skoro isto toliko brz kao kod viih programskih jezika, a opet je korisniku omoguena maksimalna mogua kontrola programa.

190

97. Grafiki orjentisani programski jezici


Za razliku od asemblera i viih programskih jezika grafiki orjentisani programski jezici sastoje se iz blokova (logikih celina), kojima je mogue definisati odgovarajua stanja. Proizvode najdui (i najsporiji) mogui kod, i uopte neracionalno rasipaju resurse mikrokontrolera. Osim toga nemaju dovoljno kontrole u odnosu na bilo koji drugi programski jezik. Zato su onda uopte navedeni ovde? Zato to omoguavaju veoma brzu izradu jednostavnijih programa. Jedan od najboljih grafiki orjentisanih programskih jezika je LDmicro sa http://cq.cx/ ladder.pl. Iako se u njemu ne moe izabrati PIC16F84, moe se koristiti PIC16F628 koji mu je najsliniji. Kako ni on ne proizvodi .asm ve jedino .hex fajl, kasnije e biti neophodno i njegovo disasembliranje radi prevoenja koda za PIC16F84.

191

98. A koliko to kota?


Kao programer morate odabrati najoptimalnije softversko / hardversko reenje za Va projekat. Obino se reenje nalazi u raznim kompromisima. Pre svega u ceni finalnog proizvoda. Nemojte misliti da su digitalne stvari one najbolje. One mogu odlino posluiti u kontroli procesa ili u upravljanju raznim analognim ureajima, ali analogna elektronika i dalje dri veliko vostvo. Iako je sasvim mogue koristiti digitalne senzore temperature (npr. DS1820), pogledajte koliko kotaju pre nego to ih kupite. Nije li mnogo jeftinije koristiti NTC otpornik i A/D konvertor? Preciznost koju biste sa njim mogli dobiti moda Vam nee biti dovoljna za inkubator ili razvijanje filmova, ali za regulaciju temperature prostorije svakako hoe. Ionako Vam mikrokontroler u veini sluajeva bespotrebno troi dragocene taktove. Neka bar radi neto korisno, pogotovu ukoliko se time moe utedeti. Kristalni oscilator daje mnogo precizniju frekvenciju od RC oscilatora, ali pitanje je koliko Vam je ona u stvari potrebna. Uglavnom se moe bez nje. Uporedite cenu XT sa cenom RC oscilatora. Ukoliko je to mogue, probajte mikrokontroleru to vie smanjiti takt, bez uticaja na pravovremeno izvravanje programa. Radie stabilnije, manje e se grejati, troie manje struje i due e trajati. Mala brzina takta oscilatora u veini sluajeva uopte ne predstavlja nedostatak. Uostalom, zapitajte se ta pokree industriju kompjutera. Video igrice! DVD moete gledati i na kompjuteru sa manje od 800MHz. Digitalna kola sa integrisanim satom i kalendarom sigurno Vam deluju primamljivo. Ali pogledajte njihovu cenu! Uporedite je sa cenom 32,768kHz kristala! Posebna situacija je LCD displej. Uglavnom je toliko malih dimenzija i toliko slabo osvetljen da se u praksi prilino malo koristi. Nemojte misliti da e Vam sa njim izgraeni ureaji 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 moe posmatrati pod svim uglovima i odlino se vidi po mraku. Jo jedna moderna novotarija je USB konekcija. Bila bi sasvim u redu, kada bi prosean PIC mikrokontroler imao koji megabajt memorije. Ovako, jedina prednost joj je kompatibilnost izmeu svih PC konfiguracija. Ne kaem da je to mala prednost, ali zapitajte se po kojoj ceni Vam je potrebna.

192

99. Marfijev zakon


U raznim projektima sa mikrokontrolerima mnogo ta moe poi naopako. Na Vama je da predupredite to vie verovatnih greaka. Imajte u vidu da iako mikrokontroler moe bez problema obavljati jako komplikovane operacije, ni on nije svemogu. Vi mu trebate obezbediti optimalne uslove za rad. Tu se pre svega misli na spoljne fizike veliine koje mogu ometati rad mikrokontrolera, ili njegovih dodatnih sklopova. Svakako Vam je jasno da mikrokontroler ne smete koristiti u uslovima vlage, temperature, mehanikih vibracija ili elektromagnetnog zraenja koje izlazi iz granica postavljenih u njegovom tehnikom uputstvu. Jedna od najeih greaka je direktno ukljuenje veih potroaa. Ukoliko ve imate neki potroa (2-3kW) koji elite ukljuivati i iskljuivati mikrokontrolerom, morate znati da bi prevelika struja koju povue taj potroa u trenutku ukljuenja mogla izazvati pad napona u mrei, to bi uzrokovalo reset mikrokontrolera usled sputanja njegovog napona napajanja ispod odreene granice. Isti sluaj moe uzrokovati i obian relej zbog induktivne komponente njegovih namotaja. O stabilnosti oscilatora u ovakvim sluajevima, da ni ne govorim. Druga tipina greka je napon indukovan na tampanoj ploici i prikljunim kablovima. Ne verujete da moe toliko uticati? Ukljuite mobilni u blizini radio prijemnika. U praksi se ak javljaju i sluajevi korupcije programske memorije (monijim mikrokontrolera) zbog njihove mogunosti programiranja niskim )+5V umesto +12V) naponom. Ovi problemi mogu se efektno reiti upotrebom oklopljenih (koaksijalnih) kablova i galvanskim odvajanjem mikrokontrolera od izvora smetnji optokaplerima. Mnogo tee greke nastaju usled loe napisanog softvera. Nemojte se zavaravati. Ukoliko neto moe poi po zlu, budite uvereni da e poi. U nastavku teksta e biti opisane situacije koje (ukoliko se na njih ne obrati panja) mogu dovesti do nepravilnog rada programa. Pinovi koji se ne koriste trebaju biti konfigurisani kao izlazi da ne bi preli u visokoimpedansno stanje. Ukoliko se pin RA4 ne koristi potrebno je pored toga postaviti ga na logiku 0 jer u stanju logike 1 prelazi u visokoimpedansno stanje. U visokoimpedansnom stanju napon na pinovima moe zaoscilovati. Pinovi PORTA i PORTB registra su nakon ukljuenja preko TRISA i TRISB registra definisani kao ulazni. Ukoliko na spoljni hardver elite odmah po ukljuenju mikrokontrolera dovesti logiku 1, morate pre podeavanja TRISA i TRISB registra podesiti PORTA i PORTB. Ukoliko to ne uradite, podesiete TRISA i TRISB, i na pinovima PORTA i PORTB registra javie se nepoznato stanje. Vrednosti u PORTA i PORTB registrima po ukljuenju mikrokontrolera nisu inicijalizovane, to znai da stanje bitova u njima moe biti bilo kakvo. Definisanje pinova kao izlaza pre nego to se promeni nepoznata vrednost u PORTA i PORTB registru moe dovesti do kratkog neeljenog pojavljivanja logike 0 ili 1 na pinovima mikrokontrolera. Da biste se osigurali od ovoga, poeljno 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 poeljno je ubaciti inicijalizaciju u zaglavlje za sve najkorienije registre (npr. INTCON i OPTION_REG) zajedno sa njihovim kratkim objanjenjima, da se njihova inicijalizacija ne bi previdela. Ukoliko su direktno na mikrokontroler povezani prekidai, morate na ulaznim pinovima postaviti pull up ili pull down otpornike. Najpraktinije je koristiti integrisane pull up otpornike na PORTB. U protivnom, zraenje vaeg mobilnog telefona, pojaana aktivnost sunevih pega pa ak i komniin upravo ukljuen usisiva mogu dovesti do prelaska ulaznog pina u nedefinisano stanje i lanu detekciju pritisnutog tastera. Program bez debouncing rutine radie bez problema dok su kontakti prekidaa novi. im se oni iskrzaju, program e detektovati vie uzastopnih pritisaka prekidaa. Korisnici uvek mogu pritisnuti 2, 3 ili vie tastera istovremeno. Budite sigurni da e bar neko od njih to i uiniti. Program mora biti napisan tako da predvidi i tu mogunost. Poseban sluaj predstavljaju greke izazvane internim ciklusom itanja i upisa stanja sa porta (eng. RMW Read, Modify Write). Prilikom izmene stanja porta instrukcijom bcf PORTA,2 mikrokontroler e oitati trenutno stanje svih pinova PORTA registra, resetovati bit 2 i postaviti dobijeno stanje u PORTA. Meutim, ukoliko je na primer pin RA0 definisan kao izlazni sa logikom 1, ali se iz bilo kog razloga (previe mala impedansa na liniji) pin RA0 trenutno nalazi u stanju u kome nije postavljen, mogue je da mikrokontroler pri RMW ciklusu sa njega oita logiku 0 umesto logiku 1, i da mu na taj nain grekom prilikom upisa promeni stanje. Da bi se ovo izbeglo, poeljno je ne izvravati operacije direktno nad portovima, ve sve operacije obavljati nad shaddow registrom, a tek kasnije, kada je to neophodno kopirati rezultat u odgovarajui port. Umesto ekanja na setovanje flaga kraja upisa u EEPROM moete (ukoliko vam brzina nije imperativ) jednostavno saekati dovoljno dugo da se upis sigurno zavri. Takoe dobra je praksa testiranje maksimalnog vremena snimanja i nastavak programa ukoliko je ono mnogo due od normalnog ignoriui pri tome stanje flaga. Na taj nain sigurni ste da e program ispravno raditi ak i da mikrokontroler (iz bilo kog razloga) ne setuje pravovremeno flag. EEPROM memorija mikrokontrolera ima svoj radni vek. Ne bi smeli dozvoliti programu snimanje preko vrednosti specificirane u tehnikom uputstvu. Bolje po inicijalizaciji mikrokontrolera obavite sve potrebne operacije u obinoj (RAM) memoriji, a snimajte u EEPROM, samo kada je to neophodno. Ipak, sam PIC je prilino izdrljiv. Evo dobrog primera sa jedne mailing liste. From: "nepe_yu" To: mikroelektronika@yahoogroups.com Subject: [mikroelektronika] Re: Pouzdanost PIC-ova (WDT) A evo i mog skromnog iskustva :) Naime grekom sam u jednom projektu upis, u interni EEPROM PIC18F452 mikrokontrolera, vrio na 100mS neprekidno, i nakon 194

vie meseci rada ta lokacija EEPROMa je stradala. "Obdukcijom" je utvreno da je vie od 12000000 (12 miliona) puta izvren upis pre nego to se javio problem :) Eto, ima i pozitivnih iskustava :))) Dobru praksu predstavlja kratko ukljuenje svih LED za vreme inicijalizacije mikrokontrolera. Na taj nain odmah po ukljuenju mikrokontrolera moete primetiti da li su svi segmenti LED displeja kao i pojedinane LED ispravne. Ukoliko je mogue, u toku inicijalizacije testirajte i eksterne komponente. Na primer digitalni senzor temperature je oigledno neispravan ukoliko prijavljuje temperaturu apsolutne nule (-273oC). Detekciju bilo kakvog kvara mikrokontroler moe signalizirati treperenjem displeja ili pojedinanih LED uz eventualni opis greke (npr treperea oznaka E1 na LED displeju signalizira prekid veza do senzora osvetljenosti utvrenu njegovom prevelikom otpornou, a treperea oznaka E2 neispravnost digitalnog senzora temperature utvrenu izlaskom merene temperature iz njenog uobiajenog - radnog opsega). Na taj nain blie odreujete mesto kvara, to vam moe pomoi prilikom opravke. Microchip je takoe imao Marfija na umu kada je projektovao mikrokontrolere pa asembler u sve neiskoriene adrese programske memorije snima kod NOP instrukcije. Nakon maksimalne programske adrese 3xFF program se nastavlja od poetka (0x00). Ipak, problem moe izazvati adresiranje memorije koja nije implementovana u PIC16F84 mikrokontroleru (4x00 1FxFF), jer e se ona ponaati kao da je u njoj mapirana obina (radna) programska memorija. Potpuno je isto adresiranje lokacija 0x20, 4x20, 8x20, Cx20, 10x20, 14x20, 18x20 i 1Cx20. Ovo su ipak ekstremni sluajevi i ne bi Vas trebali brinuti.

195

100. Dobar (user frendly) dizajn


Pogledajte Va daljinski za TV! Trebaju li vam svi ti dugmii? Da li ste ikada uspeli da programirate svoj klima ureaj tako da se automatski ukljuuje svakoga dana u 6:00? Jeste li se iznervirali to vam instaliran Office paket zauzima cak 1Gb hard diska, iako je poznato da prosean korisnik iskoristi jedva 2% mogunosti programa za obradu teksta? Pogledajte tastaturu Vaeg kompjutera. Moete li (kao kod pisae maine) odgovarajuim prstom pritisnuti bilo koje dugme na njoj, ne pomerajui celu aku? U osnovi svakog dobrog dizajna lei jednostavnost i maksimalno prilagoenje motorici i intelektualnim sposobnostima krajnjeg korisnika. Moj otac i dalje koristi mehaniku Unix pisau mainu, jer ne uspeva napraviti dupli klik, a majci sam morao kupiti pravu ciglu od mobilnog, da bi uspela pritiskati jedan po jedan taster, a ne vie njih istovremeno. Pogledajte broj 5 na vaem mobilnom telefonu i numerikom delu tastature kompjutera. Primeujete li da se razlikuje od ostalih? Nama to nije potrebno. Ali jeste osobama sa oteenim vidom. Pogledajte sledei primer. Potrebno je na LED displeju prikazati broj od 00 do 99. eljeni broj trebate podesiti preko ulaznog interfejsa. Postoji mali milion naina na koje moete realizovati ovakav zadatak. Ovde je prikazano par primera, a Vi sami procenite koji bi spadali u dobar dizajn. 1. Dva prekidaa (+ za poveanje broja i za smanjenje) vezani su kao ulazi sa svojim pull-up otpornicima. Detekcija pritisnutosti se obavlja softverski, bez debouncing rutine, jedino sa pauzom od treine sekunde po pritisnutom tasteru, nakon ega se izvrava nova detekcija. Za prebacivanje sa 00 na 99 na ovakav nain potrebno je ekati ak 30 sekundi. 2. Softver je prepravljen tako da se i za vreme pauze testira prekida. Ukoliko se pritisne a da jo nije istekla treina sekunde, ponaa se kao da je protekla. Tako se moe brim uzastopnim pritiskanjem prekidaa smanjiti vreme podeavanja. Zbog nepostojanja debouncing rutine, i dalje je mogue je da se jednim pritiskom preskoi koji broj. 3. Dodata je debouncing rutina. 4. Rutina za pauzu prepravljena je tako da pauza nakon prvog pritiska iznosi 0,75S, a da se zatim (ukoliko je prekida i dalje pritisnut) u sledeih par pozivanja smanjuje do npr. 0,15S, i nadalje ostaje na toj vrednosti. Po otputanju i ponovnom pritiskanju prekidaa, pauza bi opet poela od maksimalne vrednosti. Ovim je podeavanje olakano (zbog smanjenja brzine inicijalnog ponavljanja), a vreme za podeavanje smanjeno je (zbog vee brzine ponavljanja) na oko 19S. 5. Umesto dva prekidaa postavljen je rotacioni enkoder. Na taj nain se jednim jedinim pokretom ruke moe fino podesiti eljeno vreme. Vreme potrebno za podeavanje smanjeno je na oko 5S. Ovo je za korisnika najloginiji nain podeavanja vremena. Zato se i koristi kod npr. mikrotalasnih penica. 196

6. Umesto rotacionog enkodera postavljena je tastatura sa ciframa 0 do 9 i tasterom DALJE bez debouncing rutine, ali sa pauzom od treine sekunde po pritisnutom tasteru. Vreme potrebno za podeavanje iznosi oko 3S. 7. Dodata je debouncing rutina. Vreme za podeavanje iznosi samo 2S. Sigurno ste i Vi doli do zakljuka da bi jedino naini pod takom 4, 5 i 7 bili najprilagoeniji korisniku. Koji nain e se koristiti zavisi jedino od broja slobodnih pinova i cene odgovarajueg interfejsa. Osim ulaznih, nije teko ostvariti poboljanja ni na izlaznom hardveru. ta mislite o LED displeju koji menja jainu svog svetla u zavisnosti od spoljnog osvetljenja? Nou bi svetleo slabo, a danju jako. Osim to lepe izgleda (ne bljeti), displej e Vam due trajati. Ukoliko imate este nestaice struje, pa ste zbog toga za sat predvideli dodatno napajanje baterijom, nema potrebe da LED displej bude svo vreme ukljuen. Ako ga ve morate ukljuivati kada nema napajanja iz mree, neka to bude po pritisku taster prekidaa i na kratko.

197

101. Servisni mod


Pogledajte svoj mobilni telefon. Da li ste znali da kombinacijom odreenih tastera moete proveriti tano stanje brojaa minuta i preneenih GPRS podataka? Prilikom blokade auto radia, dovoljno je na njegovoj tastaturi otkucati sigurnosni kod da bi se odblokirao. Ove stvari realizovane su upravo upotrebom tzv. servisnog moda. 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 (tanije svi oni koji znaju tajni postupak ulaska). Ukoliko va program koristi multitasking operativni sistem, najpraktinije je predvideti ulaz u program preko njega. Servisni mod namenjen je pre svega Vama, kako bi vam olakao testiranje mikrokontrolera u praksi. U njega se ulazi postupcima koji nisu uobiajeni za obinog korisnika. To moe biti dranje odreenog tastera pritisnutog 10S, brza kombinacija odreenih tastera (kao upis ifre) ili pritiskanjem (za korisnika nedostupnog) prekidaa kojim bi se izazvao interapt na RB0/INT pinu. ta raditi u servisnom modu? To zavisi jedino od Vas. Ukoliko Vam je to bitno, moete stanje odreenih registra ili flagova prikazati na ve postojeim LED. A moete i poslati stanje svih registara u kompjuter preko RS232 veze (eng. in-circuit debugging). ak to moete raditi po pojavi interapta ili iz samog programa postavljajui na eljenim mestima take prekida (eng. break points) sa pozivom potprograma za servisni mod. Ne zaboravite jedino da pre povratka na glavni program vratite ranija stanja registra (obino STATUS i W) kao u interaptima. Sa strane programiranja, servisni mod Vam moe odlino posluiti za testiranje kraih potprograma ili rutina pre njihove implementacije u glavni program, ili za spoljno podeavanje stanja odreenih registra sa snimanjem u EEPROM. Na taj nain moete podesiti mikrokontroler direktno na zavrenom projektu, ime izbegavate ee premetanje i programiranje mikrokontrolera. Ono to (zbog spoljnih interfejsa) nije mogue testirati u simulatoru, upotrebom servisnog moda postaje mogue. Ukoliko ve imate gotov i proveren program, moda bi Vam bila interesantna mogunost njegove kasnije nadogradnje. Uz par jeftinih elemenata na tampanoj ploici i odgovarajueg konektora moete projektovati svoj proizvod tako da mu omoguite laku 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 odline polazne osnove za dalji rad sa mikrokontrolerima. Ukoliko vam i danje neto nije jasno, pitajte. Internet je pun entuzijasta voljnih da vam pomognu, samo ako se lepo zamole. Naravno, ne moete oekivati da e vam besplatno napraviti program koji vam je potreban, ali ukoliko zapnete negde, tu su. Moete ih nai na forumima www.elitesecurity.org, www.elektronika.ba, www.microchip.com, www.kazus.ru i raznim drugim sajtovima. Da biste uopte mogli oekivati odgovor, budite strpljivi (niko ne deura pored kompjutera da bi eto ba vama momentalno odgovorio) i iscrpni u opisu svog problema. X puta mi se dogodilo (x tei beskonanosti) 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 nain se mogu reprodukovati greke koje dobijate u radu programa. Poeljno je da ukoliko je to potrebno postavite svoj program (ili njegove delove za koje traite savet) na sajt. Radi bolje itljivosti programa pre objavljivanja podesite labele i operande razmacima umesto tabulatorom i postavite listing izmeu [code] i [/code] tagova. Nije na odmet ni postaviti sliku ili opis elektrine eme. Naalost, trenutna situacija u naoj 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 greke i nikako da je otklonite, bolje se nemojte ni javljati po forumima. Ukoliko ne podelite sa ostalima detaljan opis problema koji Vas mui (sa primerom koda i elektrinom emom) svakako da se ne moete nadati pravom, moda mnogo konstruktivnijem odgovoru. Mikrokontroleri se neprestano razvijaju. PIC16F84 je ve zastareo. Dobro je to vam uz naueno gradivo prelazak na jae (ili slabije) familije nee teko pasti. PIC10 i PIC12 serija ima dosta ogranienja u primeni. Imaju samo dva nivoa steka, malu memoriju i komplikovano stranienje memorije. Ipak, zbog minijaturnih kuita i male cene mogu predstavljati dobar izbor za manje zahtevne aplikacije. U celoj PIC16 seriji mikrokontrolera imate iste instrukcije objanjene u ovom uputstvu. Naravno, hardverske razlike su svakako prisutne i samim tim registri imaju razliite adrese i namene, ali Vam uz postojee .inc fajlove to nije preterano bitno. PIC17 serija uvodi 16 nivoa steka, olakano itanje tabela i dodatni set instrukcija. Ona nije stekla popularnost meu programerima, tako da moete imati problema prilikom njene nabavke. PIC18 serije su jo naprednije (uz 42 nove instrukcije u odnosu na PIC16 seriju), imaju 31 nivo steka, nemaju stranienje programske (ne i RAM) memorije, i nude nove hardverske dodatke (npr. integrisani USB2 kontroler). U PIC24 i dsPIC seriji stek je umesto hardverski, implementovan softverski, a umesto jednog radnog (W) registra uvedeno je ak 16. Instrukcijski set je dosta izmenjen. Zbog namenskog hardvera PIC24 serija prilagoena je upravljanju motorima a dsPIC digitalnom procesiranju signala (eng. DSP - Digital Signal Processing). 199

Najnovija Microchip familija mikrokontrolera PIC32mx omoguuje rad sa tridesetdvobitnim instrukcijama, ali naalost instrukcije su joj potpuno razliite od ranijih serija. Izgleda da je Microchip reio da prilagodi svoje proizvode i za programski jezik C koji u ranijim serijama nije bio efektno zastupljen. Umesto PIC16F84 mikrokontrolera moete uz odgovarajue izmene softvera koristiti PIC16F628 koji ima duplo vie memorije, integrisani PWM i RS232 i jo dva tajmera uz duplo manju cenu. Ukoliko su Vam bitni A/D konvertori idealno reenje predstavljaju 18-pinski PIC16F88 i 40-pinski PIC16F877. Uz ovakve osnove moete isprobati i druge familije mikrokontrolera. Trenutno su aktuelne serije AVR i Motorola. Naalost motorolini mikrokontroleri (iako odlini i jeftini) imaju prilino skup softver, a i dostava im moe biti problematina za nau zemlju. Ono to ini mikrokontrolere toliko monim nije njihova brzina, memorija ni integrisani hardver, ve ideja o njihovoj moguoj upotrebi u svakodnevnom ivotu, i poboljanja koja bi se njihovom upotrebom mogla ostvariti. Ukoliko ve nemate uslova da mikrokontrolerima poboljate industrijske maine, ponite od svog domainstva. Stepenini automat za svetlo, elektronska brava, zvono, tajmer za osvetljenje akvarijuma, tajmer za prehranu pela zimi, automatska hranilica za kune ljubimce, digitalni podsetnik, brzinomer za biciklu, sve su to mali projekti koji Vam mogu pomoi u svakodnevnom ivotu. Deluje jednostavno? Setite se svog prvog programa. Mogunost za nadogradnju uvek postoji.

200

103. Prilozi
Priloge na narednim stranama poeljno je tampati posebno, kako bi Vam uvek bili na dohvatu ruke. Moete ih koristiti kako bi se brzo podsetili tanog naziva instrukcija ili banke registara. XOR 0 1 0 1 AND 0 1 0 1 IOR 0 1 0 1 COM 0 1 1 0 00101110 XOR 10010110 = 10111000 Rezultat XOR operacije e biti logika 1 samo ukoliko su mu oba operanda razliita. Ukoliko su ista (obe 0 ili obe 1), rezultat e biti logika 0. 01101011 AND 10100101 = 00100001 Rezultat AND operacije bie logika 1 samo ukoliko su oba operanda na logikoj 1. Ukoliko bar jedan nije, rezultat e biti logika 0. 01101011 IOR 10100101 = 11101111 Rezultat IOR operacije bie logika 1 ukoliko je bar na jednom operandu prisutna logika 1. Ukoliko su oba na logikoj 0, i rezultat e biti jednak logikoj 0. COM 01101011 = 10010100 Komplement ili invertovanje predstavlja logiku operaciju u kojoj svaki bit u bajtu menja svoju vrednost.

0 0 1 1

0 1 1 0

0 0 1 1

0 0 0 1

0 0 1 1

0 1 1 1

201

Dec Hex .0 .1 .2 .3 .4 .5 .6 .7 .8 .9

Bin

BCD 00 01 02 03 04 05 06 07 08 09 0x 0x 0x 0x 0x 0x BCD 20 21 22 23 24 25 26 27 28 29 2x 2x 2x 2x 2x 2x

Ozn 0 +.1 +.2 +.3 +.4 +.5 +.6 +.7 +.8 +.9 +.10 +.11 +.12 +.13 +.14 +.15 Ozn +.32 +.33 +.34 +.35 +.36 +.37 +.38 +.39 +.40 +.41 +.42 +.43 +.44 +.45 +.46 +.47

Dec Hex

Bin

BCD 10 11 12 13 14 15 16 17 18 19 1x 1x 1x 1x 1x 1x BCD 30 31 32 33 34 35 36 37 38 39 3x 3x 3x 3x 3x 3x

Ozn +.16 +.17 +.18 +.19 +.20 +.21 +.22 +.23 +.24 +.25 +.26 +.27 +.28 +.29 +.30 +.31 Ozn +.48 +.49 +.50 +.51 +.52 +.53 +.54 +.55 +.56 +.57 +.58 +.59 +.60 +.61 +.62 +.63

0x00 b'0000 0000' 0x01 b'0000 0001' 0x02 b'0000 0010' 0x03 b'0000 0011' 0x04 b'0000 0100' 0x05 b'0000 0101' 0x06 b'0000 0110' 0x07 b'0000 0111' 0x08 b'0000 1000' 0x09 b'0000 1001'

.16 0x10 b'0001 0000' .17 0x11 b'0001 0001' .18 0x12 b'0001 0010' .19 0x13 b'0001 0011' .20 0x14 b'0001 0100' .21 0x15 b'0001 0101' .22 0x16 b'0001 0110' .23 0x17 b'0001 0111' .24 0x18 b'0001 1000' .25 0x19 b'0001 1001' .26 0x1A b'0001 1010' .27 0x1B b'0001 1011' .28 0x1C b'0001 1100' .29 0x1D b'0001 1101' .30 0x1E b'0001 1110' .31 0x1F b'0001 1111' Dec Hex Bin

.10 0x0A b'0000 1010' .11 0x0B b'0000 1011' .12 0x0C b'0000 1100' .13 0x0D b'0000 1101' .14 0x0E b'0000 1110' .15 0x0F b'0000 1111' Dec Hex Bin

.32 0x20 b'0010 0000' .33 0x21 b'0010 0001' .34 0x22 b'0010 0010' .35 0x23 b'0010 0011' .36 0x24 b'0010 0100' .37 0x25 b'0010 0101' .38 0x26 b'0010 0110' .39 0x27 b'0010 0111' .40 0x28 b'0010 1000' .41 0x29 b'0010 1001' .42 0x2A b'0010 1010' .43 0x2B b'0010 1011' .44 0x2C b'0010 1100' .45 0x2D b'0010 1101' .46 0x2E b'0010 1110' .47 0x2F b'0010 1111'

.48 0x30 b'0011 0000' .49 0x31 b'0011 0001' .50 0x32 b'0011 0010' .51 0x33 b'0011 0011' .52 0x34 b'0011 0100' .53 0x35 b'0011 0101' .54 0x36 b'0011 0110' .55 0x37 b'0011 0111' .56 0x38 b'0011 1000' .57 0x39 b'0011 1001' .58 0x3A b'0011 1010' .59 0x3B b'0011 1011' .60 0x3C b'0011 1100' .61 0x3D b'0011 1101' .62 0x3E b'0011 1110' .63 0x3F b'0011 1111'

202

Dec Hex

Bin

BCD 40 41 42 43 44 45 46 47 48 49 4x 4x 4x 4x 4x 4x BCD 60 61 62 63 64 65 66 67 68 69 6x 6x 6x 6x 6x 6x

Ozn +.64 +.65 +.66 +.67 +.68 +.69 +.70 +.71 +.72 +.73 +.74 +.75 +.76 +.77 +.78 +.79 Ozn +.96 +.97 +.98 +.99

Dec Hex

Bin

BCD 50 51 52 53 54 55 56 57 58 59 5x 5x 5x 5x 5x 5x BCD 70 71 72 73 74 75 76 77 78 79 7x 7x 7x 7x 7x 7x

Ozn +.80 +.81 +.82 +.83 +.84 +.85 +.86 +.87 +.88 +.89 +.90 +.91 +.92 +.93 +.94 +.95 Ozn +.112 +.113 +.114 +.115 +.116 +.117 +.118 +.119 +.120 +.121 +.122 +.123 +.124 +.125 +.126 +.127

.64 0x40 b'0100 0000' .65 0x41 b'0100 0001' .66 0x42 b'0100 0010' .67 0x43 b'0100 0011' .68 0x44 b'0100 0100' .69 0x45 b'0100 0101' .70 0x46 b'0100 0110' .71 0x47 b'0100 0111' .72 0x48 b'0100 1000' .73 0x49 b'0100 1001' .74 0x4A b'0100 1010' .75 0x4B b'0100 1011' .76 0x4C b'0100 1100' .77 0x4D b'0100 1101' .78 0x4E b'0100 1110' .79 0x4F b'0100 1111' Dec Hex Bin

.80 0x50 b'0101 0000' .81 0x51 b'0101 0001' .82 0x52 b'0101 0010' .83 0x53 b'0101 0011' .84 0x54 b'0101 0100' .85 0x55 b'0101 0101' .86 0x56 b'0101 0110' .87 0x57 b'0101 0111' .88 0x58 b'0101 1000' .89 0x59 b'0101 1001' .90 0x5A b'0101 1010' .91 0x5B b'0101 1011' .92 0x5C b'0101 1100' .93 0x5D b'0101 1101' .94 0x5E b'0101 1110' .95 0x5F b'0101 1111' Dec Hex Bin

.96 0x60 b'0110 0000' .97 0x61 b'0110 0001' .98 0x62 b'0110 0010' .99 0x63 b'0110 0011' .100 0x64 b'0110 0100' .101 0x65 b'0110 0101' .102 0x66 b'0110 0110' .103 0x67 b'0110 0111' .104 0x68 b'0110 1000' .105 0x69 b'0110 1001' .106 0x6A b'0110 1010' .107 0x6B b'0110 1011' .108 0x6C b'0110 1100' .109 0x6D b'0110 1101' .110 0x6E b'0110 1110' .111 0x6F b'0110 1111'

.112 0x70 b'0111 0000' .113 0x71 b'0111 0001' .114 0x72 b'0111 0010' .115 0x73 b'0111 0011'

+.100 .116 0x74 b'0111 0100' +.101 .117 0x75 b'0111 0101' +.102 .118 0x76 b'0111 0110' +.103 .119 0x77 b'0111 0111' +.104 .120 0x78 b'0111 1000' +.105 .121 0x79 b'0111 1001' +.106 .122 0x7A b'0111 1010' +.107 .123 0x7B b'0111 1011' +.108 .124 0x7C b'0111 1100' +.109 .125 0x7D b'0111 1101' +.110 .126 0x7E b'0111 1110' +.111 .127 0x7F b'0111 1111'

203

Dec Hex

Bin

BCD 80 81 82 83 84 85 86 87 88 89 8x 8x 8x 8x 8x 8x BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx

Ozn -.1 -.2 -.3 -.4 -.5 -.6 -.7 -.8 -.9 -.10 -.11 -.12 -.13 -.14 -.15 -.16 Ozn -.33 -.34 -.35 -.36 -.37 -.38 -.39 -.40 -.41 -.42 -.43 -.44 -.45 -.46 -.47 -.48

Dec Hex

Bin

BCD 90 91 92 93 94 95 96 97 98 99 9x 9x 9x 9x 9x 9x BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx

Ozn -.17 -.18 -.19 -.20 -.21 -.22 -.23 -.24 -.25 -.26 -.27 -.28 -.29 -.30 -.31 -.32 Ozn -.49 -.50 -.51 -.52 -.53 -.54 -.55 -.56 -.57 -.58 -.59 -.60 -.61 -.62 -.63 -.64

.128 0x80 b'1000 0000' .129 0x81 b'1000 0001' .130 0x82 b'1000 0010' .131 0x83 b'1000 0011' .132 0x84 b'1000 0100' .133 0x85 b'1000 0101' .134 0x86 b'1000 0110' .135 0x87 b'1000 0111' .136 0x88 b'1000 1000' .137 0x89 b'1000 1001' .138 0x8A b'1000 1010' .139 0x8B b'1000 1011' .140 0x8C b'1000 1100' .141 0x8D b'1000 1101' .142 0x8E b'1000 1110' .143 0x8F b'1000 1111' Dec Hex Bin

.144 0x90 b'1001 0000' .145 0x91 b'1001 0001' .146 0x92 b'1001 0010' .147 0x93 b'1001 0011' .148 0x94 b'1001 0100' .149 0x95 b'1001 0101' .150 0x96 b'1001 0110' .151 0x97 b'1001 0111' .152 0x98 b'1001 1000' .153 0x99 b'1001 1001' .154 0x9A b'1001 1010' .155 0x9B b'1001 1011' .156 0x9C b'1001 1100' .157 0x9D b'1001 1101' .158 0x9E b'1001 1110' .159 0x9F b'1001 1111' Dec Hex Bin

.160 0xA0 b'1010 0000' .161 0xA1 b'1010 0001' .162 0xA2 b'1010 0010' .163 0xA3 b'1010 0011' .164 0xA4 b'1010 0100' .165 0xA5 b'1010 0101' .166 0xA6 b'1010 0110' .167 0xA7 b'1010 0111' .168 0xA8 b'1010 1000' .169 0xA9 b'1010 1001' .170 0xAA b'1010 1010' .171 0xAB b'1010 1011' .172 0xAC b'1010 1100' .173 0xAD b'1010 1101' .174 0xAE b'1010 1110' .175 0x2F b'1010 1111'

.176 0xB0 b'1011 0000' .177 0xB1 b'1011 0001' .178 0xB2 b'1011 0010' .179 0xB3 b'1011 0011' .180 0xB4 b'1011 0100' .181 0xB5 b'1011 0101' .182 0xB6 b'1011 0110' .183 0xB7 b'1011 0111' .184 0xB8 b'1011 1000' .185 0xB9 b'1011 1001' .186 0xBA b'1011 1010' .187 0xBB b'1011 1011' .188 0xBC b'1011 1100' .189 0xBD b'1011 1101' .190 0xBE b'1011 1110' .191 0xBF b'1011 1111'

204

Dec Hex

Bin

BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx

Ozn -.65 -.66 -.67 -.68 -.69 -.70 -.71 -.72 -.73 -.74 -.75 -.76 -.77 -.78 -.79 -.80 Ozn -.97 -.98 -.99

Dec Hex

Bin

BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx

Ozn -.81 -.82 -.83 -.84 -.85 -.86 -.87 -.88 -.89 -.90 -.91 -.92 -.93 -.94 -.95 -.96 Ozn -.113 -.114 -.115 -.116 -.117 -.118 -.119 -.120 -.121 -.122 -.123 -.124 -.125 -.126 -.127 -.128

.192 0xC0 b'1100 0000' .193 0xC1 b'1100 0001' .194 0xC2 b'1100 0010' .195 0xC3 b'1100 0011' .196 0xC4 b'1100 0100' .197 0xC5 b'1100 0101' .198 0xC6 b'1100 0110' .199 0xC7 b'1100 0111' .200 0xC8 b'1100 1010' .201 0xC9 b'1100 1001' .202 0xCA b'1100 1010' .203 0xCB b'1100 1011' .204 0xCC b'1100 1100' .205 0xCD b'1100 1101' .206 0xCE b'1100 1110' .207 0xCF b'1100 1111' Dec Hex Bin

.208 0xD0 b'1101 0000' .209 0xD1 b'1101 0001' .210 0xD2 b'1101 0010' .211 0xD3 b'1101 0011' .212 0xD4 b'1101 0100' .213 0xD5 b'1101 0101' .214 0xD6 b'1101 0110' .215 0xD7 b'1101 0111' .216 0xD8 b'1101 1000' .217 0xD9 b'1101 1001' .218 0xDA b'1101 1010' .219 0xDB b'1101 1011' .220 0xDC b'1101 1100' .221 0xDD b'1101 1101' .222 0xDE b'1101 1110' .223 0xDF b'1101 1111' Dec Hex Bin

.224 0xE0 b'1110 0000' .225 0xE1 b'1110 0001' .226 0xE2 b'1110 0010' .227 0xE3 b'1110 0011' .228 0xE4 b'1110 0100' .229 0xE5 b'1110 0101' .230 0xE6 b'1110 0110' .231 0xE7 b'1110 0111' .232 0xE8 b'1110 1000' .233 0xE9 b'1110 1001' .234 0xEA b'1110 1010' .235 0xEB b'1110 1011' .236 0xEC b'1110 1100' .237 0xED b'1110 1101' .238 0xEE b'1110 1110' .239 0xEF b'1110 1111'

.240 0xF0 b'1111 0000' .241 0xF1 b'1111 0001' .242 0xF2 b'1111 0010'

-.100 .243 0xF3 b'1111 0011' -.101 .244 0xF4 b'1111 0100' -.102 .245 0xF5 b'1111 0101' -.103 .246 0xF6 b'1111 0110' -.104 .247 0xF7 b'1111 0111' -.105 .248 0xF8 b'1111 1000' -.106 .249 0xF9 b'1111 1001' -.107 .250 0xFA b'1111 1010' -.108 .251 0xFB b'1111 1011' -.109 .252 0xFC b'1111 1100' -.110 .253 0xFD b'1111 1111' -.111 .254 0xFE b'1111 1110' -.112 .255 0xFF b'1111 1111'

205

Instrukcija Prepis podataka MOVF f,d MOVWF f MOVLW k CLRF f CLRW SWAPF f,d ADDWF f,d ADDLW k SUBWF f,d SUBLW k INCF f,d DECF f,d IORWF f,d IORLW k ANDWF f,d ANDLW k XORWF f,d XORLW k COMF f,d BCF f,b BSF f,b RLF f,d RRF f,d BTFSC f,b BTFSS f,b INCFSZ f,d GOTO k CALL k RETURN RETLW k RETFIE Ostalo NOP CLRWDT SLEEP Bez operacije Prepii f u d Prepii W u f

Opis

Cik. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Kod

Flagovi Nap. 12

001000 dfffffff Z 000000 1fffffff 1100xx kkkkkkkk 000001 1fffffff Z 000001 0xxxxxxx Z 001110 dfffffff

Upii konstantu u W Upii 0 u f Upii 0 u W Prepii unakrsno niblove iz f u d Saberi W i f Saberi W sa konstantom Oduzmi W od f Oduzmi W od konstante Uveaj f Smanji f Logiko ILI W sa f Logiko ILI W sa konstantom Logiko I W sa f Logiko I W sa konstantom Logiko ISKLJUUVO ILI W sa f Invertuj f Resetuj bit b u f Setuj bit b u f Rotiraj nalevo kroz CARRY Rotiraj nadesno kroz CARRY Test bita b u f, preskoi ako je bit = 0 Test bita b u f, preskoi ako je bit = 1 Uveaj f, preskoi ako je = 0 Idi na adresu Pozovi potprogram Vrati se iz potprograma Vrati se sa konstantom u W Vrati se iz interapta

2 12

Aritmetiko logike operacije 000111 dfffffff C DC Z 1 2 11111x kkkkkkkk C DC Z 000010 dfffffff C DC Z 1 2 11110x kkkkkkkk C DC Z 001010 dfffffff Z 001011 dfffffff Z 000100 dfffffff Z 111000 kkkkkkkk Z 000101 dfffffff Z 11111x kkkkkkkk Z 000110 dfffffff Z 111010 kkkkkkkk Z 001001 dfffffff Z 0100bb bfffffff 0101bb bfffffff 001101 dfffffff C 001100 dfffffff C 12 12 12 12 12 3 3 123 123 12 12 12 12 12

Logiko ISKLJUUVO ILI W sa kon. 1

Operacije sa bitovima

Upravljanje tokom programa 1 (2) 0110bb bfffffff 1 (2) 0111bb bfffffff 1 (2) 001111 dfffffff 1 (2) 001011 dfffffff 2 2 2 2 2 1 1 1 101kkk kkkkkkkk 100kkk kkkkkkkk 000000 00001000 1101xx kkkkkkkk 000000 00001001 000000 0xx00000 000000 01100100 TO PD 000000 01100011 TO PD

DECFSZ f,d Smanji f, preskoi ako je = 0

Inicijalizuj watchdog tajmer Prelazak u sleep mod

206

Legenda: f W b k x d C DC Z TO PD adresa registra W registar adresa bita unutar osmobitnog registra konstantna (nepromenljiva) vrednost ili labela nebitan bit (njegova vrednost se ignorie. Asembler ga automatski resetuje) odredite: d=0 rezultat u W, d=1 rezultat u f Carry flag STATUS registra Digit Carry flag STATUS registra Zero flag STATUS registra Time out bit STATUS registra Power down bit STATUS registra

Napomene: 1 Ukoliko je izlazni pin oitan pa modifikovan od strane jedne instrukcije (npr. movf PORTB,f), vrednost koja je uzeta za poetnu bie vrednost koja je oitana sa samih pinova. Ovo moe izazvati probleme zbog RMW ciklusa. 2 Ukoliko se ova instrukcija izvrava nad TMR0 registrom (i ukoliko je odredite d = 1 ako se koristi), stanje preskalera e biti obrisano ukoliko je pridrueno tajmeru. 3 Ukoliko je test ispravan, instrukcija e se izvriti za 2 instrukcijska ciklusa. Za detaljnija objanjenja pogledajte DS33023A sa www.microchip.com.

207

Adresa 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B

Naziv INDF TMR0 PCL FSR PORTA PORTB /

Opis Sadraj eljenog RAM registra u indirektnom adresiranju Tajmer 0. Poveava se od .0 do .255 Niih 8 bitova programskog brojaa PCLATH + PCL = PC Pointer indirektnog adresiranja Ulazno izlazni port A Ulazno izlazni port B -

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1 Bit 0

Reset ---- ---xxxx xxxx

Bank obe 0 obe obe obe 0 0 / 0 0 obe obe obe 1 obe obe obe 1 1 / 1 1 obe obe

PC -

PC RB6 -

PC RP0 RB5 -

PC TO

PC PD

PC Z RA2 RB2 -

PC DC RA1 RB1 -

PC C RA0 RB0 -

0000 0000 0001 1xxx xxxx xxxx ---x xxxx xxxx xxxx 0000 0000 xxxx xxxx xxxx xxxx

STATUS Registar stanja mikrokontrolera

RA4/T0CKI RA3 RB4 RB3 -

RB7 -

EEDATA Sadraj eljene EEPROM memorije EEADR Adresa unutar EEPROM memorije GIE EEIE T0IE PC INTE PC RBIE PSA PC PD PC T0IF PS2 PC Z PC PC PCLATH Viih 5 bitova programskog brojaa PCLATH + PCL = PC INTCON Interapt kontroler INDF PCL FSR TRISA TRISB / EECON1 EEPROM kontroler EECON2 Otkljuavanje upisa u EEPROM PCLATH Viih 5 bitova programskog brojaa PCLATH + PCL = PC INTCON Interapt kontroler GIE EEIE T0IE PC INTE PC RBIE PC T0IF PC PC Sadraj eljenog RAM registra u indirektnom adresiranju RBPU INTEDG T0CS T0SE PC PC PC RP0 EEIF RD PC TO PS1 PC DC PS0 PC C Niih 8 bitova programskog brojaa PCLATH + PCL = PC Pointer indirektnog adresiranja Registar smera podataka za PORTA Registar smera podataka za PORTB WRERR WREN WR OPTION Konfigurisanje hardverskog stanja mikrokontrolera STATUS Registar stanja mikrokontrolera

---0 0000 ---- ---1111 1111 0000 0000 0001 1xxx xxxx xxxx ---1 1111 1111 1111 0000 0000 ---0 x000 ---- ------0 0000

INTF RBIF 0000 000x

INTF RBIF 0000 000x

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 zavretku. Zbog zatite od spama, e-mail e biti prikazan u obliku slike. U uputstvu ima izvesnih nedoreenosti u pogledu funkcija pojedinih registara, pinova, tajminga i slinih stvari. Kako je ovo prvenstveno poetniko uputstvo, ne smatram da je bitno optereivati itaoca znanjem koje mu verovatno nikada nee ni koristiti. Za profesionalan rad sa PIC mikrokontrolerima, nauite engleski i itajte Microchipova tehnika uputstva (Datasheet). Ne krivite me zbog upotrebe stranih rei. ta mislite, kako bi kardiovaskularni hirurg mogao objasniti svoju profesiju laiku bez upotrebe latinskih izraza? Primetili ste greku? Nepostojei link? Prvo proverite da li je to ispravljeno u najnovijem uputstvu (na sajtu kao i u uputstvu uvek objavljujem i datum izlaska nove verzije), i ukoliko nije kontaktirajte me preko knjige utisaka ili mailom objavljenim na sajtu. elite li da Vas obavetavam o objavljivanju nove verzije uputstva na sajtu? Moe. Poaljite mi svoj e-mail sa naznakom da elite da budete obavetavani. Takoe ga poaljite i za eventualnu kasniju odjavu. Moete se prijaviti i preko knjige utisaka na sajtu. Bez brige. E-mail adresa nee Vam biti objavljena. Uputstvo se moe slobodno kopirati i distribuirati pod uslovom da se u njega ne unose izmene. Delimino kopiranje uputstva je dozvoljeno uz navoenje linka do mog sajta, ali nije preporuljivo zbog novih verzija uputstva i eventualnih greaka. Meutim, prodaja ovog uputstva je zabranjena. Ukoliko ste ovo uputstvo kupili bilo gde i u bilo kom obliku (na CD-u na buvljaku, na flopiju od kolege sa posla pirata, od lokalnog TV servisera u tampanom izdanju), molim Vas da me o tome obavestite. Autor ne snosi ni najmanju odgovornost za korienje informacija sa ovog uputstva, datih linkova ili programa. Ako sprite PIC, gomilu elektronskih komponenti ili najnoviji Macintosh laptop, kupite novi, ali o svom troku. U izradi ovog uputstva koriena je sledea literatura:

Najvei deo sa http://www.mstracey.btinternet.co.uk/index.htm Datasheetovi sa http://www.microchip.com/ Tekstovi Voje Antonia http://www.paralaxa.co.rs/ objavljeni u asopisu PC Press http://www.pcpress.co.rs/ novembra 1997 za I/O hardver Serijska i rutina za kanjenje sa http://www.nomad.ee/PIC/picprog.html Slike D/A konverzije sa http://www.avr-asm-tutorial.net/avr_en/AVR_DAC.html 2 LED na 1 pinu sa download sekcije sajta http://www.elektronika.ba/ asopis Elektor 7-8 2001 http://www.elektor-electronics.co.uk za multipleks Neka objanjenja sa http://www.geocities.com/sinelyu/pic/pic_kontroleri.htm Primer izdrljivosti PIC-a sa mailing liste mikroelektronika@yahoogroups.com Uputstvo postavljeno 21.8.2008. na sajtu http://www.ptt.rs/korisnici/t/r/trifunov/ 209

You might also like