PIC16F84

UPUTSTVO ZA RUKOVANJE

Staza za plažu 6 kaca na Moravici u Sokobanji 1

1. Predgovor
Zašto baš PIC16F84? Taj mikrokontroler je zastareo, veliki, spor, skup... Međutim da li je baš sve tako. Star? Pa šta. Nijedan moj kompjuter nije (u trenutku kupovine) bio mlađi od 4 godina. Prvi put sam na internet izašao mašinom sa 100MHz i 16Mb. Ukoliko i dalje može poslužiti, godine mu nisu bitne. Čak zato ima i jednu prednost: ima ga na svakom ćošku! Njegova veličina za početnike može predstavljati samo pogodnost. Početniku je daleko lakše lemljenje osamnaestopinskog DIP nego šezdesetčetvoropinskog TQFP kućišta, naravno na jednoslojnoj štampanoj pločici. Brzina mikrokontrolera pri učenju ne igra nikakvu ulogu. Štaviše, na više mesta u programima datim u uputstvu namerno se moralo izazivati kašnjenje. Cena mikrokontrolera! Jeste skup. Danas se mogu kupiti mnogo moćniji mikrokontroleri po manjoj ceni. Ali ukoliko se uzme u obzir i cena odgovarajućeg programatora (pogotovu mogućnost samogradnje), PIC16F84 je i dalje najjeftiniji mikrokontroler. Početniku u svetu mikrokontrolera najteže je napraviti onaj prvi korak. Nadam se da će mu ovo uputstvo će pomoći u tom putu. A posle? Lako će se sa stečenim znanjem naučiti i mnogo komplikovaniji i savremeniji mikrokontroleri. Iako se hardverske mogućnosti mikrokontrolera neprekidno usavršavaju, softver uglavnom ostaje isti. Za lakše razumevanje ovog uputstva poželjan je pristup internetu i potrebna su određena predznanja:

Osnovno poznavanje elektronskih kola (anoda i katoda LED, povezivanje LED displeja, funkcija taster prekidača, obeležavanje izvoda integrisanih kola, pojam pina, funkcija diode u logičkim kolima, naponski nivoi logičke 0 i 1, visokoimpedansno stanje, Šmitov okidač) Osnovno poznavanje binarnih sistema (bit, bajt, binarno, decimalno, heksadecimalno, BCD i označavanje negativnih brojeva) Osnovne logičke operacije (Bulova algebra) Pojam multipleksa Princip serijskog prenosa podataka

● ● ●

Nemojte dozvoliti da Vas ovaj spisak obeshrabri. Veliki deo ovoga je objašnjen u uputstvu. Gradivo u uputstvu izloženo je od poznatih ka nepoznatim i od lakših ka težim lekcijama. Za dosta specifičnosti dati su primeri programa u kojima se upotrebljavaju. Trudio sam se da gradivo što interesantnije izložim. Nadam se da sam uspeo. 2

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

Ukoliko stavite ; (tačku-zarez) bilo gde u Vašem programu, kompajler će ignorisati sve karaktere iza njega sve dok ne dođe do znaka za novi red. Ovo znači da možete staviti komentar unutar programa kako bi Vas podsetio šta se uopšte u njemu radi. Ovo je dobra praksa, čak i za najjednostavnije programe. Možda sada u potpunosti razumete šta program radi, ali za par meseci, samo ćete se češkati po glavi. Zbog toga, komentarišite što više. Nema ograničenja. Možete pridružiti imena konstantama i registrima (više o ovome kasnije). Dosta je lakše čitati na srpskom u šta upisujete, ili šta označava broj, nego da pokušavate da se setite šta znače svi ti brojevi. Zbog toga, koristite opisna imena kao npr. ZBIR. Primetili ste da sam napisao ime velikim slovima. Ono se tako ističe. Napravite zaglavlje programa koristeći tačku-zarez. Primer je dat ispod. ;********************************************************* ; Autor : Pera Ždera Datum : 12.4.2008. ; Verzija : 0.5 Naslov : Test ; ; Opis hardvera : ; - RC oscilator 200KHz. ; - Svi tasteri su povezani od pinova ka masi. ; T1 na RB0, T2 na RB1. Uključeni su interni Pull-up otpornici. ; - Sve LED od +5V ka pinovima. LED1 na RA0, LED2 na RA2. ; ; Opis softvera : ; - Stanje LED1 menja se prilikom svakog interapta sa T1 ; - Stanje LED2 menja se tajmerom na svakih 0,5S jedino ; ukoliko je istovremeno pritisnut T2 ; ; Dodatni fajlovi : p16F84.inc ;********************************************************* Uočili ste da je napravljena neka vrsta kocke. Ovako izgleda preglednije.

Izdvojite instrukcije od početka reda i labela sa par razmaka ili „Tab“ dugmetom. Na taj način asembler prepoznaje da li je reč o instrukciji ili labeli, a program izgleda preglednije. Najzad, isprobajte i dokumentujte Vaš program i na papiru. Možete koristiti grafike, algoritme ili šta god želite. To će vam pomoći u pisanju programa, korak po korak, kao i u njegovoj kasnijoj analizi.

A sada prelazimo na pravu stvar. 3

3. Registri
Registar je RAM memorijska lokacija unutar mikrokontrolera u koju se može upisivati, sa koje se može čitati, ili obavljati obe ove funkcije. Najlakše je da svaki od njih zamislite kao kutiju u koju može stati do 255 klikera (različitih stanja). Sledeća skica prikazuje raspored registara unutar PIC16F84 mikrokontrolera. Slika prikazuje adrese na kojima je smeštema RAM memorija (u obliku osmobitnih registara) unutar mikrokontrolera, što će Vam pomoći pri razumevanju njihovog adresiranja. Adresa 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C . . . . . 0x4F 0x50 . . . 0x7F / / 68 Registra opšte namene (statička 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 fizički registar 4

Sledeću specifičnost predstavljaju prvih 12 registara u bankama (0x00 – 0x0B). Njima se direktno upravlja radom mikrokontrolera što ih čini povlašćenim (eng. Za prebacivanje iz banke 0 u banku 1 potrebno ga je setovati. a za vraćanje u banku 0.registri opšte namene) dostupna u registrima od 0x0C do 0x4F. Kako se najbitniji registri (PORTA i PORTB) nalaze u BANK0. decimalni ili heksadecimalni) format brojeva. Sigurno ste već videli rampe za prolaznike po supermarketima ili autobuskim stanicama. koristite bilo koji napredniji kalkulator.bit najveće težine ) odgovara pinu RB7 i da se on prilikom binarnog označavanja nalazi sa leve strane. Oni se nalaze na adresama 0x85 i 0x86. Nasuprot njemu bit 0. Potpuno ista situacija je i sa TRISA registrom. Pri tome možete koristiti bilo koji (binarni. međutim binarnim se slikovitije predstavlja stanje željenog pina. a decimalni kao . Uglavnom mu je (za jednostavnije programe) dovoljno pristupiti samo prilikom početne inicijalizacije mikrokontrolera. 5 . General Purpose Registers . Oni mogu biti ulazni ili izlazni. a istovremeno joj se može pristupiti i preko 0x8C do 0xCF adresa.registri specijalne namene). program će uglavnom biti u njoj. STATUS registar se nalazi na adresi 0x03 (0x03 ili h'03' označava brojeve u heksadecimalnom formatu. Da li će biti ulazni ili izlazni podešava se u odgovarajućem TRIS registru. Special Function Registers . One propuštaju prolaznike samo u jednom smeru.03 ili d'03'). MSB – Most Single Bit . pošaljete 1 ili 0 na njegov bit u odgovarajućem TRIS registru. sa tom razlikom što su njemu gornji bitovi neiskorišćeni (jer nemaju pripadajućih pinova). Ukoliko niste vični pretvaranju binarnih u decimalne ili heksadecimalne brojeve i obratno. resetovati. Na gornjoj slici pinovi su konfigurisani po sledećem: 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. Svi RA (RA0 do RA4) i RB (RB0 do RB7) pinovi mikrokontrolera imaju dvojaku fuknciju. Binarni format se piše kao b'00000011'. Da biste programirali željeni pin tako da bude ulazni ili izlazni (propušta prolaznike unutra ili napolje). označene sa BANK0 i BANK1. Da bi se prebacili iz banke u banku koristi se bit 5 STATUS registra. Na primer ukoliko se u TRISB nalazi sledeća binarna vrednost: b'00101111' pinovi će biti konfigurisani kao na slici. bit najmanje težine (eng LSB – Low Single Bit) odgovara pinu RB0.Primećujete da su registri podeljeni u dve grupe. Primećujete da bit 7 (eng. BANK1 se uglavnom koristi za konfigurisanje trenutnog hardverskog stanja mikrokontrolera. respektivno. dok je obična RAM memorija (eng. Unutar mikrokontrolera TRIS (TRISA i TRISB) registri izvršavaju ovu funkciju.

Slično tome.radni) registar je registar opšte namene u koji možete smestiti bilo koju brojčanu vrednost (u opsegu od . a eventualno i njegovu neispravnost. Pinove koji se ne upotrebljavaju u električnoj šemi potrebno je konfigurisati kao izlazne. treba da proverite da li je odgovarajući bit u PORTA ili PORTB registru u setovanom ili resetovanom stanju. Za razliku od ostalih registara on nema svoju adresu. Ukoliko je pak pin konfigurisan kao ulazni. Najpre je potrebno prebaciti program iz banke 0 u banku 1. Ovde je f=0x03 što je adresa STATUS registra (pogledajte raniju tabelu) i b=5 što označava redni broj bita u STATUS registru. i pripremite se da naučite par asemblerskih instrukcija.5 BSF f. i njegovim editorom. Ilustrovaćemo sve do sada naučeno. čija je adresa 0x03. file) označena adresa jednog od registra iz tabele sa početka ovog poglavlja. destination) rezultata operacije. U jednom od narednih poglavlja. Nakon što ste pridružili određenu vrednost registru W. da biste pročitali da li se neki pin (ranije konfigurisan kao ulazni) nalazi na logičkoj 0 ili 1. Dakle ovim je rečeno “setuj bit 5 na adresi 0x03”. na njega se iz mikrokontrolera mogu poslati naponski nivoi od 0V i +5V. Nemojte još uvek isprobavati ni kompajlirati kôd . U protivnom varijacije napona na njima prouzrokuju povećanu potrošnju i grejanje mikrokontrolera. Za pisanje kôda možete koristriti bilo koji tekst editor koji snima čist . Format zapisa je isti kao i za TRIS registre.0 do . odnosno na njemu će se u svakom trenutku nalaziti jedan od ovih napona. Pri tome je sa f (eng. U opisima instrukcija se mogu sresti oznake f. bsf 0x03. upoznaćete se sa MPLAB razvojnim okruženjem. i u zavisnosti od logičkog nivoa na pinu preduzme odgovarajuću akciju. k označava konstantnu vrednost. Ovo se radi setujući bit 5 STATUS registra.txt fajl bez ikakvih formatiranja. Bit Set f). b je redni broj bita u registru a d označava odredište (eng. jednostavno treba poslati “1” na njemu odgovarajući bit u PORTA ili PORTB registru. k. možete mu pridružiti neku drugu vrednost (oprez – time biste automatski obrisali prethodnu) ili zapamćenu vrednost iz njega premestiti na neku drugu memorijsku lokaciju (registar). Pre nego što proučite primer asemblerskog kôda. Working . Za sada pokušajte da prepoznate način na koji se konfigurišu portovi. b i d.255) sa kojom želite raditi. treba objasniti funkciju još jednog registra: W. Na primer odličan Notepad++ (ugradio sam mu prepoznavanje i naglašavanje asemblerskih instrukcija). Code Edit Pro (sam naglašava instrukcije).to ćete uraditi kada dođete do prvog celovitog programa. a napon od +5V kao logička 1. W (eng. mikrokontroler će u svakom trenutku moći da očita gore pomenute vrednosti napona na pinu. već je integrisan u sklopu samog mikrokontrolera. 6 .b znači “setuj bit b u registru f” (eng. Da biste postavili jedan od izlaznih pinova na visoki logički nivo. Pri tome se naponski nivo od 0V predstavlja kao logička 0.Čemu konfigurisanje pinova? Ukoliko je odgovarajući pin konfigurisan (preko svog TRIS registra) kao izlazni. Windowsov Notepad ili Linuxov Leafpad.

Svim registrima u BANK1 može se pristupati preko adresa registra u BANK0. kako bi se dalje moglo manipulisati signalima na U/I pinovima. a u Linuxu npr. Još samo 31! 7 . Ceo prethodni kôd zapisan u jednom bloku izgleda ovako: bsf movlw movwf bcf 0x03. MOVLW k znači “ubaci vrednost koja sledi direktno u registar W” (eng. TRISB registar sada sadrži željenu vrednost. movwf 0x86 Instrukcija MOVWF f znači: “premesti vrednost registra W u f registar” (eng. jer je W registar nakon instrukcije ostao nepromenjen. Brojevi koji slede su adresa registra (f). da bi se konfigurisali pinovi PORTB registra. Gnome Commander.b znači “resetuj bit b u registru f” (eng. čime su konfigurisani ulazno/izlazni (skraćeno U/I) pinovi. Posledica poslednje instrukcije je da se program ponovo nalazi u BANK0. Bit Clear f). Bitno je primetiti da ovo nije premeštanje u svom bukvalnom značenju. Vrati se u BANK0 Nakon što snimite fajl. Ovo isto mogli ste da uradite sa heksadecimalnim brojem i tada bi instrukcija izgledala ovako: movlw 0x2F Obe instrukcije rade potpuno istu stvar. Dakle ovim je u stvari resetovan bit 5 STATUS registra. U ovom slučaju adresa f je adresa registra TRISB (vidite u tabeli). promenite mu txt ekstenziju u asm.5 Ova instrukcija je suprotna od BSF. ovo je potpuno svejedno. BCF f. Za registre koji su zajednički za obe banke. u ovom slučaju STATUS registra i broj bita (b). dakle. Primećujete da je adresa STATUS registra ista. Nemoj da vas to buni. copy). Prebaci b'00101111' u TRISB . jedino je bitno pravilno podesiti u kojoj se banci nalazi program. Pre bi joj odgovarao prevod kopiraj (eng. iako bi u BANK1 trebala biti 0x83. Move W to f). Move Literal to W).Sada se.5 b'00101111' 0x86 0x03. Sada treba premestiti ovu vrednost u TRISB registar. program nalazi u banci 1. Ipak.5 . Stavi b'00101111' u W . Za ovo će vam u Windowsu trebati Total Commander. Sada je potrebno prebaciti program u banku 0. sve dok ne budete u stanju da ga u potpunosti razumete. Razumljivije je čitati program sa normalnim adresama. movlw b'00101111' Ovom instrukcijom smešta se binarni broj b'00101111' u W registar. ne preterujte sa ovim. bcf 0x03. Idi u BANK1 . Proučite prethodni primer nekoliko puta. u ovom slučaju bit 5. Za sada ste naučili 4 instrukcije.

Ono što želite da postignete jeste da LED neprekidno treperi. i zatim isključite LED. kompajlirati ni programirati Vaš PIC listinzima koji slede.0) u PORTA. 0x05. To se može implementirati vraćajući izvršenje programa na početak. U primeru koji sledi cilj će Vam biti da omogućite treptanje jedne LED (eng. čija adresa je 0x05 Ovim ste postigli da jednom uključite.4. Jedina razlika je u tome što ste sada podesili sve pinove PORTA registra kao izlazne. jer su oni dati samo kao ilustracija.0 u W registar.5 . movlw movwf b'00000000' . 0x05 . i zatim prepišite sledeći kôd: Poc movlw movwf b'00000100' . recimo Poc. Idi u banku 1 b'00000000' . Labela se postavlja veoma jednostavno: upišite ime.4) u PORTA. 0x05 . Light Emitting Diode). Upiši .4) u PORTA.5 . 8 . Izlazi U prethodnom poglavlju ste naučili kako da konfigurišete U/I pinove porta tako da budu ulazni ili izlazni. Vrati se u BANK0 Ovo bi trebalo da Vam bude poznato iz prethodnog primera. . Prebaci sadržaj iz W (. treba je isključiti. (Obratite pažnju na komentare kôda): movlw movwf b'00000100' . čija adresa je . To postavlja logičku 1 samo na pinu RA2. šaljući 0x00 u TRISA registar. Evo kako se to radi. U ovom poglavlju ćete naučiti kako da pošaljete odgovarajući logički nivo na portove. čija adresa je . Prebaci 00000 u TRISA – svi pinovi su izlazni 0x03.4 u W registar. Pošto je LED uključena. Upiši .4 u W registar. Upiši . i zatim recite programu da nastavi svoje izvršavanje sa tako označene pozicije. Stavi 00000 u W 0x85 . Zatim treba uključiti LED. To postavlja logičku 1 samo na pinu RA2. 0x05. Prebaci sadržaj iz W (. Prebaci sadržaj iz W (. 0x05 . i u njemu ćete videti jedan potpuni program. Nemojte još uvek isprobavati. Postavite “labelu” (oznaku) na početak programa. Zato treba na jedan od pinova (onaj na kome je povezana LED) poslati logičku 1. Najpre treba podesiti drugi bit PORTA registra tako da bude izlazni: bsf movlw movwf bcf 0x03.

To postavlja logičku 0 na sve pinove (RA0 do RA4) Poc . a prestaće po njegovom nestanku. program bi i dalje delovao nejasno. ali već i tokom prvobitnog pisanja programa. Važno je da primetite da ovo nije instrukcija za PIC već tzv. predstavlja adresu STATUS registra 0x85 . a zatim ocenite čitljivost takvog programa. movlw movwf goto b'00000000' . Čak i kada biste dodali komentare. koji . biti identičan programu bez “equ” direktive. Pogledajte još jednom isti program: bsf movlw movwf bcf movlw movwf movlw movwf goto 0x03. Ovo može da bude krajnje zbunjujuće ukoliko kasnije pokušavate da ispravite eventualno otkrivenu grešku u programu. Ovo pridružuje naziv TRISA broju 0x85. Go-idi. Program će sada neprekidno uključivati i isključivati LED od trenutka dovođenja napona napajanja. Ovo pridružuje naziv STATUS broju 0x03. koja jednostavno znači “jednako nečemu drugom” (eng.0 u W registar. STATUS TRISA equ equ 0x03 . nakon asembliranja u mašinski kôd PIC-a. 0x05 .5 b'00000100' 0x05 b'00000000' 0x05 Poc Poc Komentari su namerno izostavljeni i sve što možete videti jesu nizovi instrukcija i brojeva. predstavlja adresu TRISA registra 9 . koji . čija adresa je 0x05 . najpre je ispred instrukcije na početku reda stavljena labela “Poc”. Program koji sadrži “equ” direktivu će. kada treba zapamtiti sve te pojedinačne adrese. Tona) adresu (k) ili labelu. Nastavi dalje izvršavanje programa od labele Poc Kao što primećujete. Ovom direktivom samo zamenjujete željeni broj imenom..0) u PORTA. Postupite ovako: izbacite sve komentare ali imenujte registre u Vašem programu.5 b'00000000' 0x85 0x03. Pošto je LED uključena. Ovo može da se uradi naredbom “equ”. dakle. Instrukcija GOTO k znači “idi na” (eng. Equal – jednak). Prebaci sadržaj iz W (. Upiši . Zbog toga treba svim brojevima dati imena. treba je isključiti. direktiva koja ima uticaj na sam asembler (više o njemu kasnije). Na samom kraju programa je “goto Poc” instrukcijom nastavljeno dalje izvršavanje programa od labele.

predstavlja adresu PORTA registra 0x05 . Ukoliko sada prepišete program bez komentara. redni broj bita unutar STATUS registra. koji predstavlja . i zbog toga ih uvek definišite na početku svakog programa. 10 . ali sa imenovanim registrima. Međutim. Možda vam deluje čudno što PORTA registar i RP0 bit STATUS registra imaju istu vrednost (0x05). Ovo pridružuje naziv PORTA broju 0x05. čak i bez ikakvih komentara. Imena moraju biti definisana pre nego što budu upotrebljena. PORTA predstavlja adresu registra. moći ćete da uporedite preglednost i čitljivost takvog listinga sa prethodnim: STATUS TRISA PORTA RP0 equ equ equ equ 0x03 0x85 0x05 0x05 STATUS. Na taj način ne možete doći u situaciju da kasnije razmišljate da li je neka takva oznaka labela ili imenovani registar. razlika je očigledna.RP0 b'00000000' TRISA STATUS. a RP0 bit 5 STATUS registra. To je obavezno. Takođe možete primetiti da se imenovani registri razlikuju od labele po tome što su im sva slova velika.PORTA RP0 equ equ 0x05 . da ih asembler ne bi preveo kao labele. koji . Nakon imenovanja registara. ali vodi računa o njihovom redosledu unutar instrukcije. Takođe možete videti da su instrukcije odvojene od početka reda.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 praćenje programa znatno lakšim. Ovo pridružuje reč RP0 broju 0x05. Asembler ne pravi razliku između njih jer im je vrednost ista (čak se mogu i zameniti). unesite njihova imena i u aktivni deo programa.

Prilikom dobijanja napona napajanja. Skoro svaka instrukcija zahteva jedan instrukcijki ciklus da bi se izvršila. Instrukcijski ciklus je 4 puta veći od takta oscilatora. Korišćenje neinicijalizovanih (0xFF) vrednosti može dovesti do zabune prilikom kasnije analize programa. zbog sporosti oka delovaće Vam kao da LED svetli konstantno. dobiti grešku pri kompajliranju programa. ona će ukazivati na adresu registra opšte namene (RAM memoriju koju možete slobodno koristiti). Verovatno ćete se pitati kako ste mogli smanjiti vrednost u registru bez njegove prethodne inicijalizacije. Najpre stavite broj 0x85 u W registar. i zbog toga joj ne možete pristupiti. Na primer. Zatim treba odlučiti kolika će biti stvarna vrednost ovog broja. kako onda podesiti BROJAC na drugu vrednost? Sve što trebate uraditi je da ubacite željenu vrednost u taj registar. ali sa pola snage. Pa kako onda pridružiti željeni broj? Za to je potrebno da sa strane sagledate situaciju. Međutim. Ali. dakle. Ovo se dešava jer memorijska adresa 0xFF nije implementovana u PIC16F84. Kako se koristi samo 5 instrukcija. Ukoliko kao oscilator za takt za PIC16F84 koristite kvarcni kristal od 4MHz trajanje svake instrukcije će biti 4MHz/4ciklusa. Najpre treba definisati konstantnu vrednost koja će predstavljati inicijalnu vrednost brojača. Ukoliko ih Vi budete koristili u svojim programima obavezno to naglasite odgovarajućim komentarima. Kako je to treptanje previše brzo da biste ga uopšte mogli primetiti. ukoliko probate njom pridružiti vrednost 0xFF. nakon čega PIC nastavlja sa izvršavanjem daljeg programa. jer će onda BROJAC sadržati adresu TRISA registra. Program Counter – više o njemu kasnije) poput GOTO za svoje izvršenje troše 2 instrukcijska ciklusa. LED će se uključiti i isključiti u samo 6μS. a onda ga prebacite u 0x0C registar Sada možete slobodno napisati BROJAC equ 0x0C. ne možete napisati BROJAC equ 0x85. Nazovite je BROJAC. kao što je napomenuto u prethodnom poglavlju. naredba equ pridružuje imena običnim brojevima. predstavlja kraj i izlazak iz petlje. Prazne petlje U prethodnom programu postoji mala greška. Nulta vrednost. na primer adresu 0x0C. ili 1μS. Vrednost unutar imenovanog registra BROJAC koji se nalazi na adresi 0x0C će biti 0x85. Zato će BROJAC imati vrednost 0xFF. Ukoliko imenu BROJAC pridružite. Zbog čega 6 a ne 5? Zbog toga što instrukcije koje menjaju stanje programskog brojača (eng. 11 . Zato trebate uraditi sledeće: movlw movwf 0x85 0x0C . U primerima u ovom uputstvu one su korišćene isključivo zbog štednje prostora. svi neiskorišćeni registri u mikrokontroleru (osim registara specijalne namene) postavljaju se na vrednost 0xFF. ukoliko želite da BROJAC sadrži vrednost 0x85. ne praveći razliku između adresa registra i bitova. .5. Dakle potrebno je napraviti adekvatno kašnjenje između trenutka uključenja i isključenja LED. Najveći broj koji se može zadati je d'255' odnosno 0xFF. i da u trenutku dostizanja nule prekine odbrojavanje. Zato ćete. Uobičajeni princip po kome se implementira kašnjenje jeste da mikrokontroleru zadate da odbrojava od prethodno postavljenog broja do nule.

To se ponavlja sve dok vrednost registra BROJAC ne bude jednaka nuli.d (eng. U sledećem redu definisana je labela nazvana Pet. ovim se program “vrti” u jednom mestu tačno određeno vreme (kao brojanje u žmurkama). na sledeći način: W F equ . To se naziva “prazna petlja”.Znači. Pogledajte njenu primenu u praksi. Kako se odredište rezultata koristi u dosta instrukcija.0 equ .F goto Pet Nastavi odavde Ovde je najpre (inicijalno) postavljena konstanta BROJAC na 0xFF. najpre je potrebno imenovati registar: BROJAC equ 0x0C Dalje se treba smanjivati vrednost registra BROJAC sve dok ne dostigne vrednost 0x00. moguće je i bitu odredišta dati ime. i rezultat vraća u registar BROJAC. program se nastavlja od sledeće linije. biće Vam potrebne bar dve petlje (jedna unutar druge) ukupnog kašnjenja od 3μS * 256 * 256 = 0. za jednu instrukciju. koja vraća izvršenje programa na decfsz instrukciju. U prošlom poglavlju to nije naglašeno. Kao što vidite. Skip if zero) znači “Smanji vrednost registra f (u ovom slučaju BROJAC odnosno 0x0C) i stavi dobijenu vrednost u W ako je d=0. Ta instrukcija ima sledeći oblik: decfsz BROJAC. U sledećoj liniji imamo instrukciju goto. Ona istovremeno proverava da li je nova vrednost registra BROJAC jednaka 0.1 Mnogo reči. Unutar PIC postoji instrukcija kojom se može ovo uraditi. i zadana je decfsz instrukcija. a kao što ste već naučili lakše je pamtiti imena umesto brojeva. Početak programa se definiše sledećom direktivom ORG 0x00 Sada ubacite ove petlje u program.F smanjuje vrednost registra BROJAC za 1. Decrement f. i dovršite ga praveći pravi program sa komentarima: 12 . Ukoliko je rezultat nakon smanjenja jednak 0 preskoči sledeću instrukciju”. ali svakom programu potrebno je definisati početak (adresu unutar PIC16F84 sa koje počinje snimanje kôda) i kraj (posle koga nema više instrukcija).1 Instrukcija DECFSZ f. Onda program preskače sledeću instrukciju (u ovom primeru goto) i nastavlja od mesta gde je napisano “Nastavi odavde”. Kako bi se jednom petljom postiglo maksimalno kašnjenje od 3μS * 256 = 768μS. odnosno u registar f ako je d=1. pre nego što nastavi dalje.2S da biste mogli primetiti kako LED treperi. uz malu pomoć instrukcije goto i labele. BROJAC Pet equ 0x0C decfsz BROJAC. Ukoliko nije. Decfsz BROJAC.

Inicijalno 0xFF BROJAC2 equ 0x0D . Uključuje LED stavljajući vrednost PORTA . Adresa PORTA registra BROJAC1 equ 0x0C . Adresa TRISA registra PORTA equ 0x05 . To je tzv. ****** Prva petlja aktivna pri uključenoj LED oko 0. Sada isključi LED ****** movlw movwf b'00000000' . 13 .. Inicijalno 0xFF RP0 equ 0x05 . Drugi brojač za praznu petlju. ****** Imenovanje registra ****** STATUS equ 0x03 . Direktiva za označavanje kraja programa. Adresa STATUS registra TRISA equ 0x85 . kao izlazne . Ukoliko je BROJAC2 jednak 0. ****** Kraj programa ****** end . . Ukoliko je BROJAC1 jednak 0. nastavi dalje . dovoljno dugo da bi se to moglo primetiti . ****** Uključi LED ****** Poc movlw movwf b'00000100' .F Pet1 . .F Pet2 . a zatim u PORTA . nastavi dalje. Oznaka odredišta rezultata instrukcije .RP0 movlw b'00000000' movwf TRISA movwf TRISB bcf STATUS. Isključi LED stavljajući 0 u W registar.F Pet2 BROJAC2.2S ****** Pet1 decfsz goto decfsz goto BROJAC1. u suprotnom vrati se na početak petlje. Prebacuje program u banku 1 . a zatim i u PORTA . ****** Sada se program vraća na početak ****** goto Poc . ****** Druga petlja aktivna pri isključenoj LED oko 0. Vraća program u banku 0 . . Druga petlja drži LED isključenom . Postavlja sve pinove . Smanji BROJAC2 za 1 . 255 puta . Smanji BROJAC1 za 1 . . Ovaj brojač broji nadole od 255 do 0. PORTA . b'00000100' u W. Oznaka bita 5 STATUS registra F equ .1 . . Prvi brojač za praznu petlju. petlja unutar petlje. Vraćanje na početak programa . ****** Kašnjenje završeno. .RP0 .F Pet1 BROJAC2. ****** Podešavanje porta ****** org 0x00 bsf STATUS.2S ****** Pet2 decfsz goto decfsz goto BROJAC1.

Pri tome će LED svetleti po dovođenju logičke 0 na pin.Naravno. Evo električne šeme koju trebate napraviti za test ovog programa. Takt mikrokontrolera određen je upotrebljenim RC oscilatornim kolom (otpornik od 10kΩ i kondenzator od 33pF). 25mA. želećete da isprobate program da bi videli da li zaista radi. Za sada ste sledeći ova uputstva naučili 7 od ukupno 35 instrukcija. 14 . Ovo je moguće jer pin pri logičkoj 0 može upijati struju do 25mA. pošto PIC16F84 ima interno ograničenje izlazne struje na max. Cena otpornika je zanemarljiva u odnosu na cenu mikrokontrolera. to je poželjno ukoliko su pinovi na PORTB nepovezani. i već kontrolišete ulazno izlazni port. Bolje je utrošiti instrukciju više nego rizikovati nepouzdan rad ili oštećenje mikrokontrolera. Upravo ste napravili svoj prvi program. U sledećem poglavlju naučićete kako da svoj kôd kompajlirate i snimite u PIC. i napravili kolo kojim se LED uključuje i isključuje. a katoda (preko otpornika) na pin. a i poželjno zbog manjeg grejanja i potrošnje mikrokontrolera. Isto tako LED je moguće povezati direktno na pin (bez otpornika). Međutim to nije poželjno. U praksi se češće sreće inverzna logika za povezivanje LED tako što se anoda LED poveže na +5V. Čestitamo. Iako za dati primer nije potrebno konfigurisati pinove oba porta.

MPLAB Asembler U ovom poglavlju upoznaćete se sa MPLAB razvojnim okruženjem. Definiše upotrebljeni mikrokontroler . Autor : .com/ trebate skinuti programski paket MPLAB. Sa sajta http://www. Funkcija editora bi trebalo da vam je jasna. MPLAB asembler ima mogućnost učitavanja fajla koji sadrži sva ova imena. uobičajenim direktivama.sadrži sve standardne labele Ovaj fajl trebalo bi da se nalazi u folderu C:\Program Files\Microchip\MPASM Suite\P16f84. MPLAB ima jedan poznat bag koji se ogleda u nemogućnosti rada sa putanjom do foldera dužom od 51 karaktera. umesto instrukcije movlw 0x01 trebali bi pisati binarni mašinski kôd 110000 00000001.microchip. Verzija : . posebnim delom za interapte (više o njima kasnije). Asembler služi da tekstualne instrukcije iz . Datum : .********************************************************** list #include p=16F84 <p16F84.asm fajla pretvori u mašinski kôd koji PIC razume. U protivnom.inc> . Ubacuje nazive registra u program 15 . . Još bolje. .6. sam paket teži oko 65Mb. On ima integrisan editor (umesto Windows Notepada). Opis hardvera : . Zato direktno u C: napravite folder „Moji programi“.asm fajla. Verovatno Vam je već dosadilo da iznova i iznova pišete STATUS equ 0x03 i ostala standardna imena. asembler.inc . U njega kopirajte sledeći fajl: P16f84. Opis softvera : . u sebi ima i predefinisane obrasce (eng. Generisanje čistog . i specijalnim funkcijama njegovog editora.********************************************************** . Potrebni fajlovi : p16F84. Na žalost nas sa dial-up vezom. . simulator i drajvere za svoje programatore.. standard code template) za upis asemblerskog programa sa zaglavljem. Naslov : .inc .inc Onda u Vašem tekst editoru napravite sledeće zaglavlje..

Ostale moguće opcije su U (User) – relativna putanja do fajlova. izaberite PIC16F84. Možda vam ovaj postupak trenutno izgleda komplikovano. tako da originali ostaju nepromenjeni za idući put.asm. U novootvorenom prozoru „Proba. Next. Sada uključite MPLAB IDE. i proverite da li se nalazi u folderu C:\Program Files\Microchip\MPASM Suite. Next. end .asm. Zagl. Kliknite na „MPASM Assebmler (Mpasmwin.asm programom. 16 . Project Wizard. Prostor za vaše programe. Ostala dva fajla Vam (za sada) nisu bitna. Next Izaberite (ukoliko već nije) Microchip MPASM Toolsuite.inc. Ne obazirite se na prozore koje je otvorio.exe)“. Uđite u C:\Moji programi. Kliknite na slova A pored njih dok se ne promene u C (Copy). Ukoliko Vam njegova trenutna struktura iz bilo kog razloga ne odgovara. Next i kliknite na Finish.__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . S (System) – apsolutna putanja i A (Auto) – MPLAB sam odlučuje. već sledite sledeću proceduru: Project. Unutar foldera „C:\Moji programi“ napravite folder „Proba“. i na Add. Upišite ime projekta (npr. Obična rutina. Kliknite naizmenicno na P16f84. Otvara se prozor editora u kome možete pisati Vaš program. i ovaj fajl možete editovati po sopstvenim potrebama. . Ukoliko ga nema.mcw“ duplo kliknite na Zagl. pa čak i bitovi pojedinih registra.inc fajla (F3 iz Total Commandera). Na taj način se odabrani fajlovi kopiraju u trenutni projekat (u folderu Proba). Definiše start programa ORG 0x00 . tako da se oba fajla pojave u desnom prozoru. locirajte ga ručno klikom na Browse. .asm”. Podešava konfiguracione bitove. Ovo zaglavlje možete koristiti za svaki novi program koji pravite. Više o njima kasnije. tako da odgovara Vašim specifičnim potrebama. Proba) i izaberite putanju do ranije napravljenog foldera C:\Moji programi\Proba Next. Ukoliko zavirite u strukturu p16F84. U tom slučaju uvek ga čuvajte zajedno sa . Kraj programa i snimite ga u folder „C:\Moji programi“ sa nazivom „Zagl. ali u praksi je potrebno ponoviti ga 2 do 3 puta da bi postao to što i jeste. međutim uvek ga možete promeniti. možete primeriti da su u njemu imenovani svi registri.

nastavi dalje.2S ****** Pet1 decfsz goto decfsz goto BROJAC1. LED od pina RA2 ka masi .********************************************************** . Prebacuje program u BANK1 . . Postavlja sve pinove . Vraća program u BANK0 . Drugi brojač za praznu petlju.RP0 b'00000000' TRISA TRISB STATUS. Uključi LED stavljajući b'00100' . . 17 . Prvi brojač za praznu petlju. Definiše upotrebljeni mikrokontroler <p16F84. . Datum 23.8 .F Pet1 . .3.inc . nastavi dalje . Ukoliko je BROJAC2 jednak 0.2008 . Naslov Treptanje LED . Ukoliko je BROJAC1 jednak 0. petlja unutar petlje.F Pet1 BROJAC2. 255 puta .Ovim programom omogućeno je treptanje LED . Inicijalno 0xFF . Verzija 7.RC oscilator.inc> . Smanji BROJAC1 . u suprotnom vrati se na početak petlje. Ovaj brojač broji nadole od 255 do 0. .RP0 . Smanji BROJAC2 . Opis softvera : . ****** Inicijalizacija asemblera ****** list #include __CONFIG p=16F84 .********************************************************** .Sa svim ovim podešavanjima kompletan program bi trebao izgledati otprilike ovako: . kao izlazne . a zatim i u PORTA . Podešava konfiguracione bitove. Ubacuje nazive registra u program _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . ****** Imenovanje registra ****** BROJAC1 BROJAC2 equ equ 0x0C . Opis hardvera : . ****** Prve petlja aktivna pri uključenoj LED oko 0. To je tzv. u W registar. ****** Uključi LED ****** Poc movlw movwf b'00000100' PORTA . ****** Podešavanje porta ****** org bsf movlw movwf movwf bcf 0x00 STATUS. Potrebni fajlovi : p16F84. Autor Pera Detlić . Inicijalno 0xFF 0x0D .

F Pet2 BROJAC2. ****** Vraćanje programa na početak ****** goto Poc . . Ona mora biti „BUILD SUCCEEDED“. a program nije ništa duži nego inače.F Pet2 .2S ****** Pet2 decfsz goto decfsz goto BROJAC1. Isključi LED stavljajući 0 u W registar.hex ekstenzijom predstavlja fajl spreman za snimanje u PIC. ****** Kraj programa ****** end .err ekstenzijom. Za kompajliranje pritisnite taster F10 na tastaturi. Fajl sa . Ona Vas podseća da upotrebljeni registri (npr.. U novootvorenom prozoru „Output“ videćete kratak opis uspešnosti operacije.. Možete slobodno ignorisati Message [302]. TRISA) nisu u BANK0. a zatim u PORTA . možete pre prve instrukcije napisati "ERRORLEVEL -302". . dovoljno dugo da bi se to moglo primetiti . ****** Druga petlja aktivna pri isključenoj LED oko 0. U folderu „Proba“ sada se nalazi par fajlova. Fajl sa .hex. Na taj način program je pregledniji.err. Vraćanje na početak programa .. Iz njega možete videti u kom trenutku je tačno nastupila greška u asembliranju. Kraj programa. U „Output“ prozoru najbitnija je zadnja poruka. Ukoliko Vas ova poruka nervira. U fajlu sa . .inc ispred vašeg asemblerskog programa. Kao što ste i sami pretpostavili direktiva #include <p16F84. Sada možete kompajlirati program. Druga petlja drži LED isključenom .lst ekstenzijom predstavlja detaljan pregled svih upotrebljenih instrukcija. možete videti spisak grešaka i upozorenja nastalih pri asembliranju programa. naučićete u narednim poglavljima. Sam asembler će pri konverziji instrukcija u mašinski kôd uzeti iz fajla nazive samo onih imenovanih registra koji se koriste u programu. Sada isključi LED ****** movlw movwf b'00000000' PORTA .lst i . 18 . . komentara. Vama je skraćeno vreme pisanja programa (za imenovanje registra). Postupak snimanja. ****** Kašnjenje završeno.inc> ubacuje fajl p16F84. Bitni su vam jedino oni sa ekstenzijom .

Power Up Timer Enable bit je (osim kada imate kvalitetan oscilator i kada vam je potreban brz start mikrokontrolera) preporučljivo ostaviti uključenim – PWRTE ON. neka bude isključen CP OFF. Ukoliko želite kupiti programator.hex fajla u PIC neophodan vam je programator kao hardverski deo i određeni softver u kompjuteru preko koga se vrši programiranje. Njima se određuju hardverske specifičnosti mikrokontrolera. Programatori Za snimanje . Jedino bih preporučio izbegavanje programatora sa serijskim portom. Iako su inicijalno ubačeni u __CONFIG diirektivu. zbog nejednakosti njegovih karakteristika na raznim matičnim pločama (uglavnom na laptopovima). High Speed) Za kristalne oscilatore veće brzine 4MHz-10MHz Upotrebu Watchdog Timera naučićete kasnije. Ionako ćete uglavnom snimati manje od 1KB programa. Vaš novac je u pitanju. Proguglajte malo. Za PIC16F84 konfiguracioni bitovi su: Watchdog Timer – dozvoljava odnosno zabranjuje upotrebu WDT u programu Power Up Timer Enable – prouzrokuje kašnjenje pri dovođenju napona napajanja da bi se oscilator mikrokontrolera stabilizovao Code Protection – onemogućava iščitavanje kôda iz PIC – kopiranje programa Oscillator – omogućuje izbor jednog od 4 standardna tipa oscilatora. 19 . ukoliko trebate prodati PIC sa Vašim programom na koji ste utrošili 3 meseca rada. Na istom sajtu nalazi se i pripadajući softver za programiranje. Low Power) Za kristalne oscilatore male potrošnje 32KHz-200KHz XT – Za klasične kristalne oscilatore 100KHz-4MHz HS – (eng. kako biste mogli verifikovati program nakon programiranja. Da li će on biti na USB ili paralelnom portu uopšte Vam nije bitno. Funkcija programatora je programiranje PIC mikrokontrolera možda 5-6 puta dnevno. Možda naiđete i na nešto lakše. možete napraviti jedan od programatora sa sajta http://www. Ukoliko imate iskustva u pravljenju elektronskih kola. Code Protection je poželjno isključiti.7. neki programatori je ignorišu i postupaju po sopstvenim setovanjima. Za skoro sve primere u ovom uputstvu.icprog. U ovom uputstvu. Resistor Condensator) 1 otpornik i 1 kondenzator LP – (eng.com/. možete pogledati sledeće sajtove: ● ● AllPic programator Oko 15 € Oko 100 € Programator i razvojni sistem u jednom I opet pre kupovine pretražite internet. obavezno ga uključite. Međutim. Nemojte se zaleteti pa odmah kupiti najskuplji Microchipov programator. on treba biti isključen – WDT OFF. odnosno RC – (eng. Unutar mikrokontrolera nalaze se takozvani konfiguracioni bitovi.

Vreme je za učenje novih instrukcija. Za sada je bitno da znate da ovde koristite RC (Resistor – Capacitor) oscilator. Dosta je toga o asembleru i hardveru. U sledećem poglavlju naučićete upotrebu potprograma koji će Vam pomoći da program bude manji i jednostavniji.Vrste oscilatora naučićete kasnije. 20 .

Na kraju se potprogram završava RETURN instrukcijom. Return from Subroutine) “povratak iz potprograma”. Ukoliko u programu imate dve promenljive. Međutim. Međutim. PIC ne pravi razliku između potprograma i glavnog programa. Tamo nastavlja sa izvršavanjem komandi unutar potprograma sve do nailaska na instrukciju RETURN (eng. jednostavno upišite CALL instrukciju i labelu početka potprograma. Povratak iz potprograma Prvo trebate labelom dati potprogramu ime. praktičnije je definisati ih unutar jednog bloka. pri više registara ovo može biti od pomoći. Call Subroutine) “pozovi potprogram”. Smanjuje i proverava . Drugo. Ipak postoje dve stvari na koje morate obratiti pažnju. Očigledno da ovo nije velika ušteda pri korišćenju samo dva registra. Potprogrami Potprogram je deo kôda. i u ovom slučaju izabrano je da to bude “Pet”. Pogledajte strukturu jednostavnog potprograma: BROJAC Pet equ 0x0C decfsz goto return . za veći broj registara. morate biti sigurni da će izvršavanje glavnog programa zaobići potprogram. deset puta kroz glavni program. i poboljšavate portabilnost programa za moćnije serije mikrokontrolera. 21 . Potprogrami se koriste u slučajevima višestrukog izvršavanja jedne iste funkcije. to je kašnjenje za program sa LED. ili na početku glavnog programa. Oni se mogu imenovati u samom potprogramu. Ukoliko stavite potprogram na kraj Vašeg programa i zaboravite da stavite instrukciju goto koja bi nastavila izvršavanje dalje od potprograma. sve do 0 . ili program. Na taj način mikrokontroler preuzima obavezu određivanja adresa pojedinačnih registara (određujete mu samo prvu). on skače na mesto na kojem se nalazi potprogram. kao na primer rutine sa praznom petljom za kašnjenje. nego npr. U ovom slučaju.8. Najpraktičnije je imenovati ih na početku programa. Po nailasku na RETURN program nastavlja izvršavanje od instrukcije koja se nalazi iza CALL instrukcije. To se izvodi „cblock“ i „endc“ direktivama. koji možemo pozvati kao takav kad god je potreban.F Pet . Možete pozvati potprogram koliko god puta želite. u glavnom programu. program će nastaviti sa izvršavanjem i izvršiti i potprogram želeli Vi to ili ne. i zbog toga se korišćenjem potprograma smanjuje ukupna dužina programa. Prednosti korišćenja potprograma su u lakoći menjanja vrednosti brojača jednom unutar potprograma. trebate ih pamtiti u dva registra opšte namene. Ovde treba napomenuti i mogućnost istovremenog imenovanja više registara. Onda se upisuje kôd koji se izvršava u okviru potprograma. gde je k adresa ili labela potprograma. Uzima inicijalnu vrednost 0xFF BROJAC. Na taj način ćete znati da su su svi na istom mestu. i u smanjenju količine memorije koju program zauzima unutar PIC. Da biste pozvali potprogram iz glavnog programa. svi registi moraju biti imenovani i inicijalizovani pre nego što se upotrebe. Prvo. Kada glavni program dođe do dela sa instrukcijom CALL k (eng.

****** Kraj programa ****** end .2S ****** Pet decfsz BROJAC1. omogućavajući da decfsz BROJAC2. Isključi LED stavljajući b'00000' movwf PORTA .F . ****** Dodaj kašnjenje ****** call Pet . bez obzira svetli li LED ili ne. kao izlazne . Vraća program u BANK0 . ****** Inicijalizacija i imenovanje ****** list p=16F84 . Na kraju potprograma program se vraća na red iza CALL instrukcije. Povratak iz potprograma . Inicijalno 0xFF BROJAC2 . Prvi brojač za petlju. ****** Sada se vrati na početak programa ****** goto Poc .RP0 movlw b'00000000' movwf TRISA movwf TRISB bcf STATUS. ****** Uključi LED ****** Poc movlw b'00000100' movwf PORTA . a zatim i u PORTA . u W registar.F . ****** Dodaj još jedno kašnjenje ****** call Pet . . Kraj bloka registara . Prebacuje program u BANK1 .Prepravite program za treperenje LED tako da koristi potprogram. ****** Potprogram za kašnjenje od oko 0. ****** Kašnjenje završeno. 22 . Kraj programa.inc> . Inicijalno 0xFF endc . cblock 0x0C . Svaki put kada je potrebno napraviti pauzu. Postavlja sve pinove . Podešava konfiguracione bitove.RP0 . Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . Ove dve petlje služe za brojanje nadole od goto Pet . . se može primetiti kako LED treperi goto Pet return . Definiše upotrebljeni mikrokontroler #include <p16F84. Početak slobodnih registara BROJAC1 . u W registar. 255 do 0. pozove se potprogram. Drugi brojač za petlju. 255 puta. Uključi LED stavljajući b'00100' . ****** Podešavanje porta ****** org 0x00 bsf STATUS. sada isključi LED ****** movlw b'00000000' . a zatim i u PORTA Možete videti da je korišćenjem potprograma smanjena veličina programa.

originalan program bio je dug 121 bajtova. Korišćenjem potprograma. Bitno je napomenuti i to da je moguće pozivanje drugog potprograma unutar prvog. Pozivanje drugog potprograma . smanjen je na 104 bajta.U primeru se najpre uključuje LED. odnosno “goto Poc”. Neprekidno vraćanje na početak u mrtvoj petlji . Onda se poziva potprogram. Opet se poziva potprogram. i po povratku iz njega. Povratak iz prvog potprograma . Povratak iz drugog potprograma Ovako se može ići samo do osmog nivoa dubine na šta se mora obratiti pažnja. Pozivanje prvog potprograma . ali imajte u vidu da memorija PIC16F84 mikrokontrolera iznosi samo 1024 bajta. U sledećem poglavlju naučićete kako da PIC očita spoljne signale. Ovo možda i ne izgleda mnogo. Svaki bajt je bitan. Za one koje interesuje. Nakon povratka iz potprograma može se isključiti LED. izvršava se sledeća instrukcija. Na primer ovo je potpuno moguće: Pocetak Prog1 Prog2 call Prog1 goto Pocetak call Prog2 return return . 23 .

Napišite sada program kojim će LED treptati jednom brzinom.9. preskoči sledeću instrukciju“. Na primer. Da bi se konfigurisao kao ulazni. i programirati PIC da različito reaguje u zavisnosti od spoljnih signala. Ulazi Do sada ste samo pisali po portu A da bi se uključivala i isključivala LED. a ukoliko se pritisne prekidač. preskoči sledeću instrukciju“. Tako je pin RA0 ulazni. BTFSC f. možete iskoristiti instrukciju BTFSS ovako: Početak programa Test btfss PORTA. Za ovo se koristi instrukcija BTFSC ili BTFSS.b (eng. Najpre to uradite: bsf STATUS. ona će treptati duplo sporije. TRISA registar. ukoliko čekate da se na ulaznom pinu javi nivo logičke 1.RP0 . Bit Test f. Na taj način moguće je na pinove mikrokontrolera povezati spoljno elektronsko kolo. Skip if Set) znači “Testiraj bit b registra f. BTFSS f. Ako je bit jednak 0. U ovom poglavlju naučićete upotrebu ulaznih pinova.0 goto Test Nastavi odavde Program će nastaviti izvršavanje od “Nastavi odavde” samo ukoliko je bit 0 PORTA registra setovan. Banka 1 Da bi se konfigurisao odgovarajući pin na portu A kao izlazni. da biste videli da li ste shvatili postupak. Bit Test f. movlw movwf bcf b'00000001' . STATUS. Stavi b'00001' u W. a zatim u TRISA . odnosno ukoliko je na pinu RA0 prisutan nivo logičke 1 (+5V). Ako je bit jednak 1. treba poslati 0 na njemu odgovarajuće mesto u TRISA registru. Koju instrukciju ćete koristiti zavisi od toga kako želite da program reaguje kada testirate željeni bit.b (eng. Kao što Vam je poznato. Sada je potrebno proveriti da li je na njemu prisutan nivo logičke jedinice ili nule. Banka 0 Ovim je RA0 pin konfigurisan kao ulazni. Skip if Clear) instrukcija znači “Testiraj bit b registra f. Možete probati da sami napišete ceo program. 24 .RP0 . da bi konfigurisali U/I pinove treba prebaciti program iz banke 0 u banku 1. treba poslati 1.

Drugi brojač petlje.RP0 movlw b'00000001' movwf TRISA movlw b'00000000' movwf TRISB bcf STATUS. kao da se ništa ne događa . a RA2 izlazni. Ako je 1 prođi kroz call Pet . Podešava konfiguracione bitove. Ako je 0 . Uključi LED stavljajući b'00100' u . Ova pauza se uvek izvršava 25 . Prvi brojač petlje. ****** Proveri da li je prekidač zatvoren ****** btfsc PORTA. ****** Inicijalizacija i imenovanje ****** list p=16F84 . Inicijalno 0xFF org 0x00 . Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . Inicijalno 0xFF BROJAC2 equ 0x0D . . Definiše upotrebljeni mikrokontroler #include <p16F84. Testiraj stanje bita 0 porta A. ****** Uključenje LED ****** Poc movlw b'00000100' movwf PORTA . preskoči prvu pauzu. Tako je pin . Stavi b'00000000' u TRISB. ****** Dodavanje još jedne pauze ****** call Pet . Stavi b'00001' u TRISA.0 . Banka 0 . W registar. .RP0 . Banka 1 . Tako su .. a zatim i u port A . ****** Podešavanje porta ****** bsf STATUS. obe pauze.inc> . svi pinovi izlazni. BROJAC1 equ 0x0C . RA0 ulazni.

****** Potprogram za kašnjenje od oko 0.0 . ****** Dodavanje još jedne pauze ****** call Pet . Ukoliko ste iz početka pratili ova uputstva. 26 . ****** Kraj programa ****** end . Kolo i program neće impresionirati nekog koga ne interesuje programiranje mikrokontrolera. Onda proverava da li je prekidač zatvoren. omogućavajući da decfsz BROJAC2. kao da se ništa ne događa . Ako je na 1 prođi kroz call Pet . onda biste možda voleli da znate da ste do sada naučili 10 od ukupno 35 instrukcija za PIC16F84! Sve su naučene uključivanjem i isključivanjem LED i testiranjem prekidača. 255 puta. grmljavinu). Možete kompajlirati i isprobati ovaj program. Zato se nemojte uznemiravati kada svojoj porodici i prijateljima pokažete kako možete menjati brzinu treptanja LED prekidačem. 255 do 0. pin bi zbog svoje visoke ulazne impedanse postao previše osetljiv na spoljnje smetnje (npr. Program najpre uključuje LED. U protivnom. prvi poziv za potprogram se preskače. Ipak da Vas odmah upozorim. Kraj programa.F .F . Sada se vrati na početak ****** goto Poc . a zatim i u port A . Otpornik od 4k7Ω obavezan je da bi pin RA0 i pri otvorenom prekidaču bio u stabilnom logičkom stanju (logička 0). Ako je na logičkoj 0 .2S ****** Pet decfsz BROJAC1. U praksi se umesto otpornika prema masi. se može primetiti da LED treperi goto Pet return . Ukoliko nije (na ulazu je logicka 0). ****** Pauza završena.. ****** Pauza završena. u W registar. Više o potrebi za ovim (pull-up i pull-down) otpornicima naučićete u narednim poglavljima. program se izvršava kao da se ništa nije desilo. češće sreće otpornik prema naponu napajanja. preskoči prvu pauzu. Testiraj stanje RA0 pina. Isto se dešava i nakon što se isključi LED. Isključi LED stavljajući b'00000' movwf PORTA . pa je pauza u tom slučaju ista kao kod ranije napisanih programa. Sada isključi LED ****** movlw b'00000000' . Vrati se na početak . ****** Proveri da li je prekidač i dalje zatvoren ****** btfsc PORTA. ili bi pak neprestano bio u logičkoj 1 bez obzira na stanje prekidača. Povratak iz potprograma . Ukoliko jeste (na ulazu je nivo logičke 1). i prolazi kroz oba poziva za potprogram. Ove dve petlje služe za brojanje nadole od goto Pet . Ova pauza se uvek izvršava . a oni za to pokažu veoma malo interesovanja. obe pauze.

27 . Settings. Verovatno će Vam lakši biti prikaz labela. ali bez animiranosti njegovog izvršavanja. Registri opšte namene pri tome zadržavaju svoje vrednosti. Besplatan je jedino Misim. Detaljnije praćenje promena registara. može se koristiti samo 30 dana pre isteka probnog perioda. Petom (Step Over) se maksimalnom brzinom izvršava potprogram ili naredna instrukcija. Možda vam je animacija brzine izvršavanja programa previše spora? Povećajte je na Debugger. Nažalost. Kliknite na treću (Animate . Umesto 500mS stavite npr. U toolbaru će se pojaviti nekoliko novih ikonica. Jedan od najpopularnijih (i najjednostavnijih) simulatora je svakako PIC Simulator IDE. Na drugoj ikoni (Halt) pauzirate program. smanjuje se BROJAC2 na adresi 0x0D. a ne adresa. Kada dostigne 0. Animation / Realtime Updates pod Animate step time.dve strelice nadesno) i pratite izvršavanje programa u prozoru sa . ali nije dovoljno upotrebljiv.asm fajlom. Upotrebu ovih bitova naučićete kasnije. MPLAB IDE ima u sebi odličan a besplatan simulator. U njemu je dovoljno kliknuti na željeni pin mikrokontrolera da bi se logičko stanje na njemu promenilo.10. DC i C pri dnu ekrana označavaju da su ti bitovi setovani. File Registers. Duplim klikom na vrednosti pored registara.jedna strelica nadesno) se program izvršava maksimalnom brzinom. Simulator Simulacija je proces virtuelnog simuliranja izvršavanja instrukcija iako još ništa konkretno nije hardverski napravljeno. Ni on nije besplatan. i tako njegovo izvršavanje može početi iz početka. Select Tool. Četvrtom ikonom (Step Into) se kada je program u pauziranom stanju vrši prelaz na sledeću instrukciju. Velika slova Z. Još jedan odličan simulator je Proteus. korak po korak. U prozoru koji se otvorio možete videti da se registar na adresi 0x0C (koja je izabrana za BROJAC1) u koracima smanjuje do 0. Vidite kako je došao do petlje i kako neprestano izvršava dve iste instrukcije. Na prvoj (Run . Da biste uključili simulator idite na Debugger. Da biste videli aktuelni sadržaj registara BROJAC1 i BROJAC2 možete zadržati miš iznad njih. Osenčite željeni registar. Brzina simuliranja ograničena je brzinom vašeg kompjutera. možete ih nasilno promeniti. i prevucite ga u Watch prozor. Šestom ikonom (Step Out) nasilno se izlazi iz potprograma. Za BROJAC1 i BROJAC2 najpregledniji bi bio decimalni format. MPLAB SIM. Donji deo MPLAB prozora pruža Vam korisne informacije o trenutnom stanju banke. Desnim klikom preko registra unutar Watch prozora i izborom opcije Properties dobijate mogućnost podešavanja željenog formata brojeva. On pruža mogućnost integracije mikrokontrolera sa eksternim hardverom. W registra i pojedinih bitova STATUS registra. Watch opcije. 50. U ovom poglavlju biće opisane njegove specifičnosti. možete uključiti preko View. Promenite prikaz klikom na „Symbolic“ tab. Zadnjom ikonom se vrši reset programa. ili ići na View.

isto RA0) i Toggle akciju. Stimulus Controller. U asinhronom tabu potrebno je u željenom trenutku fizički kliknuti na polje za pokretanje određenih opcija. Dovoljno je izabrati brzinu oscilatora u Debugger. možete izabrati Pulse High ili Pulse Low akciju. U sledećem poglavlju naučićete kako se programska memorija mikrokontrolera može efikasnije iskoristiti.5MHz. morao bi se koristiti Register Injection tab. Da bi to bilo moguće mora se definisati određeni stimulans (eng.Ukoliko Vas interesuje realna brzina (eng.bez animiranja) do prve tačke prekida. Početak impulsa se takođe određuje klikom na Fire polje pored željenog pina. Onda se program izvrši (Run . Na primer da biste tačno odredili vreme za koje je LED aktivna. Stimulus) po kome će se odvijati promene. Za početak. ona je oko 3. Iako je prikaz svih izlaznih pinova portova veoma lako implementirati. Pri njoj se klikom na Fire polje pored željenog pina menja njegovo logičko stanje. Čim simulator naiđe na taj deo. New Scenario. prazna petlja). Setings. U Register Injection tabu željeni trenutci promene stanja pinova (bitova) mogu se definisati eksternim fajlom. Na primer. U tom slučaju trebate odrediti i željenu dužinu impulsa datu u vremenu ili broju instrukcijskih ciklusa. Pin / Register Actions i Advanced Pin / Register tabovima definišu se složenije akcije koje će se odvijati po promeni ili dostizanju unapred zadatog stanja bita ili registra. Clock Stimulus tabom definišu se logička stanja pinova koja će se javljati u tačno određenim trenutcima. MPLAB simulator Vam omogućava da u programu postavite tačke prekida (eng. što možete pratiti u File Registers ili Watch prozoru. Upotreba štoperice može biti izuzetno korisna. ukoliko je prekidač na RA0 pinu svo vreme pritisnut (a pin je definisan kao ulazni). a u Register Trace tabu može se definisati eksterni fajl koji će snimati stanje određenih bitova po unapred zadatim kriterijumima. potrebno je izabrati asinhroni (Asynch) tab. Ukoliko je potrebno da pin u određenom logičkom stanju bude tačno određeno vreme. koristite jedino asinhroni tab. i tu se resetuje štoperica i klikne na Step Over. možete je proveriti preko Debugger. Crvena oznaka B pojavljuje se leve strane prozora editora. zaustaviće dalju simulaciju što će Vam omogućiti pregled stanja registara ili proračun vremena (preko štoperice) potrebnog za izvršavanje instrukcija. Nekada nema svrhe čekati da se završi određeni proces (npr. Da bi se menjalo ulazno stanje određenog pina potrebno je izabrati željeni pin (npr. ukoliko je potrebno simulirati program koji treba reagovati na signale sa ulaznih pinova (tipa pritisnut prekidač T1) stanje se iz osnova menja. a zatim u jednom od redova ubaciti RA0 i Set High akciju. dovoljno je postaviti jednu tačku prekida na call instrukciju. Za složenija stanja. Stopwatch (eng. stopwatch – štoperica) opcije. Potprogram se izvršava maksimalnom brzinom (bez animiranja) i nakon što se završi iščita se proteklo vreme iz štoperice. 28 . Za date vrednosti RC oscilatora (10kΩ i 33pF). Željeni scenario promena definišete sa Debugger. Real Time) kojom bi program radio. Osc / trace opciji. Breakpoint) duplim klikom na željenu instrukciju.

XOR (eng. a CLRF f u željeni registar. Jedini problem je u tome što je program bio dugačak.11. i menjajući brzinu treptanja diode. Da bi se isključila obrisan je W registar. Da bi ga skratili trebate naučiti još par instrukcija. zatim je prosleđena na PORTA da bi se uključila LED. CLRW instrukcija postavlja vrednost 0x00 u W. XOR (kao i sve ostale logičke instrukcije) se može izvršiti jedino nad celim bajtovima. rezultat će biti logička 0. i bespotrebno je trošio memoriju. Efikasno korišćenje memorije Do sada ste programirali PIC da uključuje i isključuje LED. XOR 0 0 1 1 0 1 0 1 0 1 1 0 00101110 XOR 10010110 = 10111000 Rezultat XOR operacije će biti logička 1 samo ukoliko su mu oba operanda različita. Exclusive Or) operacija izvršava logičku operaciju “ekskluzivno ili” na registru koji odredite. pri čemu se vodi računa o njihovom položaju. Onda ste upravljali njegovim radom dodavši mu prekidač. Ukoliko su ista (obe 0 ili obe 1). Kako se ovo može efektnije rešiti? Koristeći logičku operaciju zvanu XOR. Između ovih rutina pozivan je potprogram za kašnjenje da bi se moglo primetiti da LED treperi. Tako umesto movlw b'00000000' movwf TRISB možete pisati clrw movwf TRISB ili clrf TRISB Hajde da vidimo kako ste do sada uključivali i isključivali LED. Znači dva puta su prebacivana 2 seta podataka (jednom u W registar. a onda u PORTA) i dva puta je pozivan potprogram (jednom nakon uključenja i jednom nakon isključenja LED). 29 . sa vrednošću koju mu date. movlw movwf movlw movwf b'00000100' PORTA b'00000000' PORTA Najpre je ubačena vrednost 0x04 u W registar. Trebalo bi ovo malo bolje objasniti. i ponovo je njegova vrednost prosleđena na PORTA. LSB bit rezultata sadržaće rezultat XOR operacije nad LSB bitovima prvog i drugog operanda.

Vrednost k mora biti u opsegu od 0 do 255 (0x00 – 0xFF). Sa „d“ je označeno gde će biti smešten rezultat XOR operacije. rezultat će biti smešten u f registru. Promeni stanje bita 2 u PORTA registru Ovde je vrednost 0x04 (b'00100') XOR-ovana sa ranijim sadržajem porta A. Rezultat operacije će biti u W registru. opet će se promeniti. Upotrebom ove instrukcije su za naizmenično uključenje i isključenje LED dovoljne samo dve linije kôda: movlw xorwf b'00000100' PORTA. Još jedna interesantna osobina XOR operacije je da bilo koja vrednost dva puta XORovana istim brojem vraća originalnu vrednost.F . zatim izvrši željenu operaciju nad njim.d gde se XOR operacija izvršava nad W i vrednosti unutar registra čija je adresa označena sa f. rezultat će biti u W registru. postaće 0. Međutim. a ukoliko je bio 0 postaće 1. 30 . Ukoliko je bit 2 u portu A bio 1. Iako je direktna manipulacija nad portovima sasvim moguća. XORWF f. Čak nema ni potrebe za inicijalizacijom vrednosti u portu A. Zbog čega? Zbog internog RMW (eng. b'00000100' u W . Zbog čega? Pa ukoliko je njegov bit 2 bio 0. 2. Ukoliko je d=0. direktno menjanje PORTA (ili PORTB) registra ne spada u dobru programersku praksu. XORLW k gde se XOR operacija izvršava nad W i konstantnom vrednošću k. promeniće se. nedostatak inicijalizacije porta A može uticati na stanje ostalih pinova. RMW ciklus znači da mikrokontroler prilikom promene stanja nekog od bitova odgovarajučeg registra najpre očita ceo registar (svih 8 bitova). I 00101110 XOR 10010110 = 10111000 II 10111000 XOR 10010110 = 00101110 XOR operacija može se naći u instrukcijama PIC16F84 u dva oblika. Ukoliko je bio 1. tako da je ona svakako preporučljiva. i na kraju vrati rezultat u taj isti registar. Read Modify Write) ciklusa mikrokontrolera. a ukoliko je d=1.Uočavate li da XOR operacijom nad bitom koji je stalno na logičkoj 1 i prethodnim stanjem bita menja stanje rezultata sa 0 na 1 i sa 1 na 0? I 00000000 XOR 00000001 = 00000001 II 00000001 XOR 00000001 = 00000000 Ta specifičnost XOR operacije može biti iskorišćena za naizmenično uključivanje i isključivanje LED. 1.

Drugi brojač petlje.Zamislite da je korisnik rešio da izvuče LED na neko udaljenije mesto (kao što mnogi izvlače signalizaciju jeftine struje sa strujomera). Pogledajte sada novi asemblerski kôd. PORTB (i PORTA) se pri očitavanju stanja ponašaju kao da su povezani kao ulazi. a tek onda kada je to neophodno kopirati rezultat iz njega u odgovarajući port. U oba programa kao shaddow registar upotrebljen je W registar. a u drugom je dodat prekidač. ****** Pauza ****** call Pet . Promeni stanje bita 2 u W registru movwf PORTA . koristio bi se neki od registara opšte namene. PIC je hardverski konstruisan tako da je moguće čak i da se očitavanje stanja sa portova može završiti i pre ranije zadate promene njihovih stanja. Vrati se na početak 31 . Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . kao izlazne. Definiše upotrebljeni mikrokontroler #include <p16F84. bez obzira na ranije konfigurisano stanje pinova. bcf STATUS.RP0 . Zato je ukoliko želite brzo uključiti i isključiti LED moguće da ona neposredno nakon uključenja ne zasvetli zbog previše male otpornosti na njenim vodovima (dok se takav virtuelni kondenzator ne napuni). Da se menja. ****** Pauza završena.inc> . Treptuća LED . ****** Inicijalizacija i imenovanje ****** list p=16F84 . jer se njegovo stanje ne menja u ostalim delovima programa. Zbog toga je pouzdanije sve operacije izvršavati nad određenim registrom opšte namene (obično se taj registar naziva shaddow registar (eng. Banka 1 clrf TRISA . To može dovesti do očitavanja pogrešnog stanja. Inicijalno 0xFF org 0x00 . Shaddow – senka)). ****** Uključenje i isključenje LED ****** Poc xorlw b'00000100' . ****** Inicijalizacija i podešavanje porta ****** bsf STATUS. Više o shaddow registrima možete naučiti na http://www.piclist. Podešava konfiguracione bitove. W je inicijalizovan na 0x00 . Prvi brojač petlje. Vrati se na početak programa ****** goto Poc . Prvi je originalni program za treperenje LED. Postavlja sve pinove clrf TRISB . Banka 0 clrw . Kopiraj W u PORTA . BROJAC1 equ 0x0C . Kablovi preko kojih je povezana LED ponašaju se usled svoje velike dužine i male daljine jedan od drugog kao kondenzator male kapacitivnosti. videćete da LED i dalje nije uključena. a samim tim i nepravilnog rada programa.RP0 .htm sajtu.com/tecHREF/readmodwrite. Inicijalno 0xFF BROJAC2 equ 0x0D . Ukoliko odmah po uključenju očitate stanje sa PORTB registra.

obe pauze. Svi pinovi na portu B su izlazni. Ove dve petlje služe za brojanje nadole od goto Pet . preskoči prvu pauzu. ****** Kraj programa ****** end . ****** Proveri da li je prekidač zatvoren ****** btfsc PORTA. Prvi brojač petlje. ****** Dodavanje još jedne pauze ****** call Pet .2S ****** Pet decfsz BROJAC1. ****** Uključenje i isključenje LED ****** Poc xorlw b'00000100' .inc> .. ****** Potprogram za kašnjenje od oko 0. Podešava konfiguracione bitove.F . Vrati se na početak 32 . Promeni stanje bita 2 u W registru movwf PORTA . Ukoliko je 0 . . Stavi b'00001' u TRISA. Ukoliko je 1 prođi kroz call Pet . omogućavajući da se decfsz BROJAC2. ****** Pauza završena. Kraj programa Treptuća LED sa prekidačem . kao da se ništa ne događa .RP0 movlw b'00000001' movwf TRISA clrf TRISB bcf STATUS. Vrati se na početak programa ****** goto Poc . Definiše upotrebljeni mikrokontroler #include <p16F84. 255 do 0.RP0 clrw . 255 puta. Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . ****** Inicijalizacija i imenovanje ****** list p=16F84 . može primetiti kako LED treperi goto Pet return . W je inicijalizovan na 0x00 . Kopiraj W u port A . . Uzmi vrednost sa pina RA0. BROJAC1 equ 0x0C . Povratak iz potprograma . Banka 0 . porta A ulazni. ****** Podešavanje porta ****** bsf STATUS. Banka 1 . a bit 2 izlazni. Drugi brojač petlje.F . Ova pauza se uvek izvršava .0 . Inicijalno 0xFF org 0x00 . Inicijalno 0xFF BROJAC2 equ 0x0D . Tako je bit 0 .

****** Potprogram za kašnjenje od oko 0. 255 puta. ispod su prikazni nazivi programa. ****** Kraj programa ****** end . Ove dve petlje služe za brojanje nadole od goto Pet . Kraj programa Nadam se da ste uočili da je upotrebom novih instrukcija prilično smanjena veličina programa. već ste i smanjili veličinu programa. i njihove veličine.. izmene koje su izvršene. Povratak iz potprograma .2S ****** Pet decfsz BROJAC1. 255 do 0.F .F . 33 . Program Treptuća LED Treptuća LED Treptuća LED LED sa prekidačem LED sa prekidačem Izmena Veličina (instrukcija) 18 17 14 22 17 Original Dodat potprogram Dodata ekskluzivno ili funkcija Original Dodata ekskluzivno ili funkcija Vidite da ste ne samo naučili nove instrukcije. Da biste lakše uočili ovu razliku. omogućavajući da se decfsz BROJAC2. može primetiti kako LED treperi goto Pet return .

Ukoliko su oba na logičkoj 0.12.d koja izvršava AND operaciju nad vrednošću W i vrednošću f registra. ANDWF f. Sledi IOR operacija: IOR 0 0 1 1 0 1 0 1 0 1 1 1 01101011 IOR 10100101 = 11101111 Rezultat IOR operacije biće logička 1 ukoliko je bar na jednom operandu prisutna logička 1. negacija ili invertovanje je logička operacija u kojoj svaki bit unutar bajta menja svoje stanje. AND „logičko I“ operacija daće na svom izlazu logičku 1 samo ukoliko su joj na oba ulaza dovedene logičke 1. Ukoliko je d=0.d koja izvršava IOR operaciju nad vrednošću W registra i f registra. Sa „d“ je označeno gde će biti smešten rezultat operacije. 2. 34 . IORWF f. Kao i XOR i AND operacija se može naći u dva oblika. Ovde je njena tablica istinitosti. rezultat će biti u W registru. IORLW k koja izvršava IOR operaciju nad registrom W i konstantnom vrednošću k. a ukoliko je d=1. rezultat će biti u f registru. I ona se javlja u dva oblika. AND 0 0 1 1 0 1 0 1 0 0 0 1 01101011 AND 10100101 = 00100001 Rezultat AND operacije biće logička 1 samo ukoliko su oba operanda na logičkoj 1. 1. ANDLW k koja izvršava AND operaciju nad registrom W i konstantnom vrednošću k. Rezultat operacije će biti u W registru. a ukoliko je d=1. Logičke operacije Jednu logičku operaciju (XOR) ste već naučili. rezultat će biti u f registru. Rezultat operacije će biti u W registru. Ukoliko bar jedan nije. Sada ćete se upoznati sa još tri. i rezultat će biti jednak logičkoj 0. rezultat će biti logička 0. 2. Ukoliko je d=0. COM 0 1 1 0 COM 01101011 = 10010100 Komplement. Zadnja logička operacija koju podržava PIC16F84 je komplement. 1. rezultat će biti u W registru.

a ukoliko je 1 u f registru. Zero flag). COM = 11111111 00000000 U prilogu ovog uputstva možete videti uporedni prikaz instrukcija u kome je navedeno koje sve instrukcije menjaju stanje Zero flaga. Zero flag će biti setovan. Ukoliko je stanje unutar registra jednako stanju u W registru. 35 . COMF f. Termin „flag“ koristi se za označavanje bitova koje mikrokontroler sam setuje ili resetuje u zavisnosti od svog trenutnog stanja (u ovom slučaju rezultata prethodne logičke instrukcije). a ne samo onaj koji je potreban. Ukoliko je d=0 rezultat će biti u W.d instrukcijom se invertuju svi bitovi u registru f. Zbog toga ova operacija ima samo jedan oblik instrukcije. Slično kao XOR operacija. Dakle ukoliko je rezultat XOR operacije sledeći: XOR = 00011010 00011010 00000000 Zero flag STATUS registra će biti setovan. duplo komplementovana vrednost vraća originalnu: I COM 01101011 = 10010100 II COM 10010100 = 01101011 Sve do sada naučene logičke operacije menjaju vrednost bita 2 STATUS registra u slučaju da je rezultat njihove operacije jednak nuli. Iako nema mnogo smisla Zero flag možete setovati čak i operacijom komplementovanja. Jedina razlika je u tome što bi se onda invertovali svi bitovi PORTA registra. Verovatno uočavate da ste ovu logičku operaciju mogli upotrebiti u ranijem programu umesto XOR. Ovo se može iskoristiti za brzo poređenje vrednosti u registru tako što se u W registar postavite željeni oblik bitova a onda izvrši XOR operaciju nad njim i željenim registrom. Kako je bit 2 po tome specifičan on ima svoju posebnu oznaku „nulti bit“ (eng.Za razliku od ostalih logičkih operacija komplemen se izvršava nad samo jednim bajtom.

F 0x0C. rezultat operacije će biti u W registru.F .13. rezultat će biti u registru f. Sintaksa instrukcije je sledeća: RLF f.F 0x0C. rlf rlf rlf rlf rlf .F registar 0x0C će dobiti vrednost b'00110010'. Postoji! 36 . Preporučljivo je ovo uraditi neposredno pre rotacije kako na bitu 0 nakon rotacije ne bi dobili nepoznatu vrednost. C 0 0 1 76543210 01011001 10110010 01100100 = = = 89 178 356 (računajući i Carry flag) Ukoliko vam je potrebno množenje sa 2 većih brojeva možete koristiti uzastopnu rotaciju dva ili više registra. logično bi bilo da postoji i instrukcija za rotaciju bitova udesno. Kada već postoji instrukcija za rotaciju ulevo. 0x0C. On se nalazi na mestu bita 0 STATUS registra. događa se sledeće: Carry flag 0 0 1 0 0 Bitovi 0x0C registra 76543210 01000000 10000000 00000000 00000001 00000010 . Dakle kada jedinica dođe do kraja. Neće se izgubiti. Ukoliko vam je to potrebno možete ubaciti 0 ili 1 u Carry flag pre rotacije instrukcijama bsf STATUS.F 0x0C. Nakon još jedne iste instrukcije u registru će biti vrednost b'01100100'. Kao što vidite ova instrukcija rotira sadržaj registra ulevo. A šta kada 1 dođe do kraja – pitate se vi. Rotacija RLF (Rotate Left f Through Carry) instrukcija rotira ulevo bitove unutar zadatog registra. Vidite da je Carry flag ovde iskorišćen kao osmi bit registra. Ne utiče samo RLF instrukcija na Carry flag. Interensantno je da se rotacijom ulevo (sa prethodno resetovanim Carry flagom) broj unutar registra množi sa 2. a ukoliko je d=1.C i bcf STATUS.C (C je imenovani bit 0 STATUS registra).d pri čemu je f registar nad čijim sadržajem se obavlja rotacija.F 0x0C. Ukoliko je d=0. “bit prekoračenja” (eng. Carry flag iz prvog registra preneće se na početak drugog. Tako će se vrednost iz Carry flaga pojaviti na bitu 0 nakon rlf instrukcije. Carry flag). u registru 0x0C imate vrednost b'00011001' nakon instrukcije RLF 0x0C. Šta radi ova instrukcija? Ukoliko npr. Za vreme rotacije ulevo MSB se smešta se u tzv.

F SPORTB.d. Sledećom šemom ilustrovana je upotreba logičkih i instrukcija rotacije: 37 .F 0x0C. LSB se premešta u Carry flag po sledećem: Carry flag 0 0 1 0 Bitovi 0x0Ch registra 76543210 00000010 00000001 00000000 10000000 rrf rrf rrf rrf 0x0C. U tom slučaju mogući algoritam bi bio: SPORTB equ rlf movf movwf 0x0C SPORTB. Kopiranje iz SHADDOW u W . (eng.F Instrukcije RLF i RRF mogu se upotrebiti za simulaciju trčećeg svetla. Zbog čega bi iko želeo da sadržaj registra upiše u taj isti registar? U praksi se ta mogućnost koristi jedino pri testiranju sadržaja registra na vrednost 0x00. rrf instrukcijom (i resetovanim Carry flagom) se sadržaj registra deli sa 2. jer movf instrukcija utiče na Zero flag.F 0x0C. Move f) vrednost iz registra f prebacuje u W (pri d=0) ili u taj isti registar f (pri d=1). Instrukcija movf f.W PORTB . Kako se rlf instrukcijom sadržaj u registru množi sa 2.RRF (Rotate Right f Through Carry) Sintaksa instrukcije je ista kao i kod RLF. Rotacija u SHADDOW registru .F 0x0C. Kopiranje iz W u PORTB.

DATA equ 0x0C . i postaje b'00110'. Stavi rezultat u PORTA. ****** Prebacivanje rezultata na izlaz ****** movwf DATA . i stavi rezultat u W (interesuje nas . Registar za privremene podatke org 0x00 . ****** Podešavanje porta ****** bsf STATUS. postavljenim stanjem prekidača. a bit 2 izlazni. .RP0 . Izvrši XOR nad PORTA i W registrom. Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . u W registar. . Tako su bit 0 i . Iz komentara se može lako zaključiti šta program radi.W . movwf PORTA . Rotiraj sadržaj. Ta vrednost se rotira. registar. Podešava konfiguracione bitove.Upotreba logičkih i instrukcija rotacije .inc> . ****** Testiranje prekidača ****** Poc rlf PORTA. Svi pinovi na PORTB su izlazni.W . programirajte PIC i isprobajte njegov rad. Prebacuje program u BANK1 . Rotiraj sadržaj PORTA i stavi rezultat u W . . Dalje se izvršava ekskluzivno ili nad tom vrednošću i trenutnom vrednošću PORTA koji je i dalje b'00011'. ****** Kraj ****** end . Povratak na početak. goto Poc . Premesti sadržaj iz W u DATA jer se rotacija . Kompajlirajte program. 38 . Evo šta će se dogoditi u programu u slučaju da su oba prekidača zatvorena: PIC uzima vrednost iz PORTA. ****** Inicijalizacija i imenovanje ****** list p=16F84 . Kako su oba tastera pritisnuta ona je b'00011'. a na bitu 2 će se . ne može izvršiti direktno nad W registrom rlf DATA. bita 2 (na mesto izlaznog bita) i vrati rezultat . Stavi b'00011' u TRISA.RP0 movlw b'00000011' movwf TRISA clrf TRISB bcf STATUS. Rezultat se smešta u W registar. neće reagovati. pojaviti rezultat XOR operacije nad . ulazni. Vraća program u BANK0 . Kraj programa. Tako je bit 0 došao na mesto bita 1 xorwf PORTA.W . XOR nad bitom 1 ova dva registra). bit 1 ulazni. . Kako su bit 0 i bit 1 . . Tako je bit 1 došao na mesto . Definiše upotrebljeni mikrokontroler #include <p16F84.

vrednost koja će doći na njih biće ignorisana. Izvrši XOR nad PORTA i W . Program je napisan tako da inicijalna vrednost Carry flaga nema uticaja na njegovo izvršavanje. a bit 3 nas ionako ne interesuje i njegova vrednost se može ignorisati.W . U praksi taj pin ne bi bio povezan. To je više od polovine. LED neće svetleti. Ukoliko u programu zamenite instrukciju ANDWF instrukcijom IORWF možete isprobati rad ove operacije. Rotirana vrednost je b'01010'. Kao što vidite na kraju svega bit 2 sadrži vrednost XOR operacije (u ovom slučaju 0).Sada se rezultat b'00101' prebacuje u privremeni registar DATA gde se rotira. Do sada ste naučili 22 od 35 instrukcija. LED će svetleti suprotno od stanja prekidača T1 ignorišući stanje prekidača T2. Čestitamo. Možete proveriti rezultat funkcije pritiskanjem prekidača po tablici XOR operacije.W PORTA. 39 . ili bi se bit 3 „maskirao“. 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 korišćenja instrukcija nema potrebe za ograničenjem setovanja bita 3 PORTA registra. A ukoliko upotrebite COMF instrukciju. Kako su na PORTA bit 0 i bit 1 ulazni. pa njegovo brisanje ovde nije potebno. Pritiskanjem prekidača možete videti da će LED svetleti jedino ukoliko su oba prekidača (T1 i T2) zatvorena (na oba ulaza dovedena logička jedinica). Izvrši AND nad PORTA i W Program radi isto što i ranije. i ona se preko W registra smešta u PORTA. Kako je ovaj bit izlazni. Prepravite sada program po sledećem: Umesto napišite xorwf andwf PORTA. s tom razlikom što umesto XOR primenjuje AND operaciju. LED1 će svetleti ukoliko je uključen bar jedan prekidač.

Odmah ćete videti. Povećaj vrednost u registru 0x0C za 1. Brojanje i sabiranje Već ste videli kako PIC16F84 može množiti i deliti sa dva u binarnom brojnom sistemu. Ili za još veće brojeve možete kao u primeru sa praznom petljom staviti petlju unutar petlje.F incf 0x0C. i vrati se na početak. U slučaju da brojač dođe do 0 desiće se sledeće: Bitovi 76543210 00000001 00000000 11111111 11111110 STATUS Zero flag 0 1 0 0 decf 0x0C. Njen oblik je: INCF f. Sintaksa joj je ista kao kod INCF instrukcije. vrednost registra opšte namene 0x0Ch bila 0x00. Bitovi 76543210 11111110 11111111 00000000 00000001 STATUS Zero flag 0 0 1 0 incf 0x0C.pitate se vi. Decrement f). .d (eng. A šta će biti kada se dođe do 0xFF . Ukoliko se nakon povećanja .F decf 0x0C. INCF (eng.d pri čemu d određuje gde će ići rezultat (u W ili F). i onda pokrenuti sledeći registar za inkrementaciju. .F Ukoliko vam je potrebna inkrementacija do većih vrednosti možete detektovati stanje Zero flaga.14.d koju ste već naučili u praznoj petlji i INCFSZ f. preskoči goto instrukciju i nastavi dalje. Increment f) instrukcija služi za inkrementaciju.d (Increment f. Ova instrukcija smanjuje vrednost registra f za 1. odnosno dekrementuje ga.F Dva specijalna oblika ovih instrukcija su: DECFSZ f. Sada ćete naučiti kako može brojati unapred i unazad kao i sabirati.F goto Poc Nastavi odavde Ove instrukcije za razliku od običnih INCF i DECF ne utiču na Zero flag.F decf 0x0C. Skip if zero) koja povećava sadržaj registra f za 1 po istom principu kao INCF instrukcija. dobije 0. a nakon sledeće iste instrukcije 0x02. 40 . Instrukcija suprotna ovoj je DECF f. Poc incfsz 0x0C. i koja preskače sledeću instrukciju u slučaju da je rezultat operacije jednak 0.F njegova vrednost će postati 0x01. Ukoliko je npr.F incf 0x0C. nakon instrukcije inc 0x0C. Ovom instrukcijom se vrši povećanje sadržaja registra f za 1.

ADD (eng. odnosno bit 1 STATUS registra. Carry flag mora se uzeti u obzir pri prenosu u bajt veće težine.205 . On će biti setovan pri prekoračenju donjeg četvorobitnog dela bajta (tzv. Ukoliko je potrebno sabirati brojeve čiji zbir može biti veći od 255. Ukoliko ni MSB nije dovoljan za prenos. a donji od 0 do 9). Digit Carry). saberi) operacija sabira dva broja. ADDWF f.d sabira sadržaj W registra i registra f. U instrukcijama za PIC operacija sabiranja ima dva oblika: ADDLW k sabira sadržaj W registra i konstantne vrednosti k. Sa d se određuje gde će se naći rezultat. Uvećanje samo gornjeg nibla rešava se sabiranjem sa b'00010000'. Aritmetičke operacije sabiranja (i oduzimanja) pored Carry i Zero flaga utiču još i na tzv. a drugim drugu (npr u digitalnom časovniku za minute gornji nibl od 0 do 5. Rezultat će se naći u W registru. 41 . 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. Kod ovakvih slučajeva bit prekoračenja smešta se u Carry flag.184 . Pogledajte kako se izvršava 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 .389 Prilikom sabiranja dve logičke 1 javlja se prenos u bit veće težine. nibla). Menja se po istom principu kao i Carry flag. setovaće se Carry flag. DC flag (eng.

F . pa može doći do netačnog rezultata operacije. Osnovna ideja je invertovanje svih bitova unutar bajta. ovako postoji samo jednostruko predstavljanje broja 0. Granice označenih brojeva ne smeju se prekoračiti. Znači kod oduzimanja manjeg broja od većeg (i u slučaju da su brojevi jednaki).91 -. Dodaj broj 1 Ručno pretvaranje pozitivnih u negativne brojeve najlakše možete izvršiti računajući drugi komplement broja. Oduzimanje se unutar mikrokontrolera izvršava upravo sabiranjem prvog broja sa komplementom dvojke drugog broja. za razliku od običnih neoznačenih (0-255) brojeva.91 Kao što vidite. +1 = 00000001 +0 = 00000000 -1 = 11111110+1 = 11111111 -0 = 11111111+1 = 00000000 Kao što vidite.15. Zato je bitno unapred odrediti da li ćete raditi sa označenim ili neoznačenim brojevima. Takav postupak naziva se drugi komplement ili komplement dvojke. tako da je Carry flag setovan ukoliko nema prekoračenja (tačnije pozajmice). tako da se unutar osmobitnog bajta mogu naći pozitivni (0 do 127) i negativni (-1 do -128) brojevi. 42 . Substract) „oduzmi“. Za razliku od sabiranja. Operacija suprotna sabiranju je SUB (eng. Pošto mikrokontroler koristi jedino 0 i 1 za predstavljanje brojeva. Računanje drugog komplementa broja može se izvršiti sledećim algoritmom: comf BROJ. Međutim. odnosno prvi komplement). Carry flag će biti setovan. kod oduzimanja je primenjena negativna logika. kod koga se Carry flag setuje pri prekoračenju. ovaj princip ima tu manu što se nula može predstaviti dvojako (00000000 i 11111111). Računanje će vam biti utoliko lakše ukoliko se prisetite običnog komplementovanja (ili invertovanja ako vam je tako lakše). Njegovo stanje se tada treba ignorisati. Pogledajte to na sledećem primeru: 100-55. Most Signle Bit – kod osmobitnih brojeva bit 7) predstavlja znak minus. Ukoliko je MSB setovan. Za prikazivanje rezultata ostaje vam još 7 bitova. Negativni brojevi i oduzimanje Kod negativnih brojeva uzeto je pravilo da bit najveće težine (eng. jer PIC ne pravi razliku između označenih i neoznačenih brojeva. MSB ima ulogu znaka (0-pozitivan. COM 01011011 10010000 + 1 = 10100101 +. 1-negativan). Stoga je praktičniji način invertovanje svih bitova i dodavanje broja 1. broj je negativan. Ovakvi brojevi nazivaju se označenim. Prvi komplement . postavlja se logično pitanje kako predstaviti negativne brojeve.F incf BROJ. Drugi komplement predstavlja običan komplement kome je dodat broj 1. (to bi bio obični.

i instrukcija za oduzimanje može se javiti u dva oblika.45 C 1 01100100 11001001 00101101 +.87) = -. jer on označava pripadnost pozitivnim.55 00110111 11001001 Kod oduzimanja većeg od manjeg broja. prilikom sabiranja sa komplementom dvojke nema prekoračenja.87 01010111 10101001 Testiranjem MSB možete utvrditi da li je označeni rezultat pozitivan ili negativan.100 +(-. odnosno negativnim brojevima.+. SUBLW k oduzima sadržaj W registra od konstantne vrednosti k.87 -.55 -. SUBWF f. a testiranjem Zero flaga da li je rezultat 0. pa se Carry flag ne setuje.31 C 0 00111000 10101001 11100001 +.55) = +. kada je potrebno izmeriti i prikazati temperature iznad i ispod nule. Isto kao i sabiranje. Saberite jedan broj sa drugim komplementom dvojke drugog broja. uradite isto što i mikrokontroler. Skoro sve operacije izvršavaju se nad neoznačenim brojevima. +. Rezultat će se naći u W registru. U praksi se retko kada sreće potreba za primenom označenih brojeva. Označeni brojevi mogli bi imati primenu u funkciji mikrokontrolera kao termometra.d oduzima sadržaj W registra od registra f. Sa d se određuje gde će se naći rezultat. Ukoliko Vam je oduzimanje i testiranje Carry flaga naporno. Ukoliko se rotacijom izvršava množenje ili deljenje sa 2 nad označenim brojevima.56 +(-. obavezno se mora obratiti pažnja na MSB. 43 . Pogledajte to na primeru: 56-87.

odnosno naponske nivoe od 0V i +5V. On razume jedino logičku 0 i logičku 1. i od 2. šmitov okidač. a u protivnom da nije. Elementi koje mu dodajemo mogu. Ukoliko su u svim slučajevima dobijena ista logička stanja na pinu... Funkcija svih ovih gore nabrojanih termina je da se spreče upravo takvi efekti. ali za njega svaki pin mora imati svoj prekidač što onemogućava multipleks ulaza (više o njemu kasnije) i sa svakim tasterom potrebno je povezati dva otpornika i kondenzator. to znači da je taster sigurno pritinut (otpušten). senzori. poželjno je ovo uraditi kod svakog od njih. Alternativno.com/debouncing. sačeka malo (koliko je potrebno da se stabilizuje stanje prekidača) i onda ga opet testira. da bi se sprečile oscilacije napona napajanja na njegovom izlazu.16. uvećava mogućnost pojave hardverskih grešaka i zahteva povećanje dimenzije i težine hardvera.8V za logičku 0.5V? 44 . neizbežno je javljanje par varnica pre konačne promene stanja. sonde. Dekapling. poželjno je zalemiti keramički kondenzator od 100nF paralelno napojnim pinovima mikrokontrolera (pinovi Vss i Vdd). 1.). U šemama u ovom uputstvu nisu nacrtani jedino zbog veće preglednosti. Ukoliko u projektu koristite više integrisanih kola.4V do 5V za logičku 1.. ali i ne moraju biti digitalni. Debouncing rutina testira stanje pina. moguće je realizovati i hardverski debouncing. Na taj način kondenzator sprečava bilo kakve nepoželjne oscilacije napona (obično nastale usled indukcije napona sa izlaznih pinova). Dekapling predstavlja zaštitu mikrokontrolera od smetnji na vodovima napajanja. ova pojava nije bitna. Da bi se ova pojava neutralisala potrebno je u mikrokontroleru realizovati smanjenje šuma na ulaznom signalu. Ovaj princip standardno koriste kompjuterske tastature.ganssle. Idealno bi bilo kada bi prekidač odjednom mogao prebaciti svoje stanje od uključenog u isključeno i obrnuto. U tehničkom uputstvu preporučeno je da ulazni logički nivoi (pri naponu napajanja od 5V) budu u intervalu od 0 do 0. Detalji na http://en. Testiranje se ukoliko je potrebna veća preciznost može uzastopno izvršavati i više od dva puta. Međutim. Šta će se dogoditi ukoliko ovi elementi umesto precizno definisanih logičkih nivoa na ulazni pin dovedu napon od npr. Za stabilizaciju ovog napona uglavnom se koristi popularni 78L05 integrisani stabilizator napona.org/wiki/Decoupling_capacitor. PIC sam po sebi ne bi mogao mnogo toga uraditi bez par ulaznih elemenata (prekidači. a što bliže njima. Kod uključenja ili isključenja svetla. Međutim. Imate PIC16F84 mikrokontroler. odnosno debouncing.pdf. debouncing. Za više detalja pogledajte http://www. Međutim.wikipedia. To direktno poskupljuje proizvodnju. pull up otpornici. Ali mikrokontroler zbog svoje velike brzine usled ove pojave može zaključiti da je taster na njegovom ulaznom pinu umesto jednom pritisnut više puta. ponekad se dogodi da mu se umesto ovih napona dovedu naponi koji odstupaju od onih preporučenih u njegovim specifikacijama. Sigurno vam se već desilo da prilikom uključenja ili isključenja svetla na prekidaču primetite varničenje kontakta. Unutar njega sve je digitalno.. kako se kontakti prekidača fizički ne mogu previše brzo kretati.

45 . kada bi se prekidač postavio prema naponu napajanja. U praksi se nekad javi situacija da je potrebno na mikrokontroler dovesti upravo ovakav „sivi“ napon. on može pročitati 0. pa čak prouzrokovati uništenje mikrokontrolera.org/wiki/Pull-up_resistor. Stoga su na pinovima PORTB registra oni hardverski implementirani. U PIC16F84 šmitov okidač nalazi se na RA4 pinu. ili ih dodati eksterno (npr.7kΩ do 10kΩ. Pull up otpornik je otpornik povezan između napona napajanja mikrokontrolera i ulaznog pina. sve dok se ne pritisne taster. poželjno je na svaki pin pre bilo kakvog hardvera povezati redni otpornik. Schmitt trigger).wikipedia. što je ilustrovano u ranijim šemama. Resetovanjem NOT_RBPU bita povezuju se interni otpornici mikrokontrolera na svaki od ulaza PORTB registra prema naponu napajanja mikrokontrolera. Nema pravila. Očigledno je da će pri povezivanju taster prekidača na ulaze PIC16F84 mikrokontrolera biti potrebno da njegovi ulazi budu u svakom trenutku na tačno definisanom logičkom nivou. U tom slučaju poželjno je koristiti uzlaze sa šmitovim okidačem (eng. ulaz će i dalje javljati njegovo poslednje stabilno definisano stanje. Još jedna stvar vredna pažnje je elekrtomagnetna interferencija. Primećujete da je ovo suprotno od onoga što biste mogli očekivati! Zato se takvi „nelogični“ bitovi označavaju sa crticom iznad njih ili NOT_ predznakom. Pored te. Ovo se hardverski realizuje Pull-up (povući nagore) ili Pull-down (povući nadole) otpornicima. pa je stoga najpraktičnije ne menjati sadržaj njegovih ostalih bitova. Ukoliko ulazni pin (u najgorem mogućem slučaju) nije povezan na eksterno kolo. Postavljanje eksternih pull up otpornika komplikuje izradu štampane pločice. Ukoliko se ulaznom pinu mikrokontrolera dovede ovako nedefinisan napon. a uključuju se resetovanjem bita 7 (Port B Pull Up) OPTION_REG registra. Da bi se zaštitili od nje. Stanje na pinu promeniće se tek kada se signal dovoljno približi njegovoj definisanoj oblasti. Više o ovome imate na sajtu http://en. To označava da je logička 0 njihovo aktivno stanje. preko 7414 šestostrukog invertora). Preporučene vrednosti su od 4.wikipedia. Kod ulaza sa šmitovim okidačem nema nedefinisanih stanja ulaznog pina. OPTION_REG registar ima i razne druge funkcije. Kada je taster otpušten. Ako se nakon toga vrati ka srednjoj (sivoj) oblasti. pull up otpornik dovodi napon napajanja direktno na pin. napon na njemu može zaoscilovati. Ovaj otpornik ne treba biti previše male vrednosti zbog manje potrošnje struje pri pritisnutom taster prekidaču.org/wiki/Schmitt_trigger. pri čemu se taster prekidač vezuje između pina i mase. a može i 1. Stanje na njegovom pinu mora biti ili crveno ili belo (navijam za Zvezdu). Interni otpornici spajaju se na sve ulazne pinove porta B. Na isti način na željeni pin mikrokontrolera može se postaviti pull down otpornik prema masi. Na RB0 pinu nalazi se samo kada je ovaj definisan kao izvor interapta (više o njima kasnije).Kod mikrokontrolera nema „sivog“ stanja. Bez njega bi napon na pinu verovatno zašao u nedefinisano stanje. postavljajući ga tako u stanje logičke jedinice. Više o pull-up otpornicima možete saznati na http://en.

Nakon toga neke stvari će vam biti jasnije. Njega možete zamisliti kao cev zatvorenu sa jedne strane u koju redom ubacujete klikere. 46 . Hardware stack.). Po nailasku na instrukciju povratka. Međutim. ona će u PC postaviti novi adresu. Postoje i instrukcije koje nemaju operand (npr. stek nije beskonačan. CLRW). PC se uvećava za 1. Nakon toga nove adrese povratka prebrisaće početne (crveni pa zeleni kliker. rezultat instrukcije (tačno ili netačno – 1 ili 0) dodaje se na PC. Po izvršavanju instrukcije. BTFSC ili BTFSS). Crveni. što će prouzrokovati nepravilan rad programa. Ta informacija čuva se u steku.. U praksi uglavnom nema potrebe za potprogramima koji idu više od druge ili treće dubine. Program Counter) registar. bsf PORTA. Dalje izvršenje programa nastavlja se odatle. Sve instrukcije sa kojima radi PIC16F84 su četrnaestobitne. unutar samih instrukcija nalazi se kôd instrukcije (po kome se npr. Pri nailasku na CALL instrukciju. U njemu je smeštena adresa izvršavanja tekuće instrukcije. ali je za tabele neophodno. Ukoliko u programu imate više pozivanja potprograma. i tamo nastavlja izvršenje programa sve do instrukcije povratka. i izvršenje programa nastaviće se odatle. Ovo ograničenje ne bi trebalo preterano da Vas brine. prilikom simulacije programa proverite sadržaj steka opcijom View. bajt ili oba u npr. koji predstavlja podatak sa kojim radimo (bit.. Stek je interni deo mikrokontrolera (kao uostalom i W registar) kome mogu pristupiti jedino instrukcije skoka i povratka iz potprograma ili interapt rutine (više o njoj kasnije). zeleni. i vrši se izmena PC. Ukoliko je tekuća instrukcija instrukcija uslovnog skoka (DECFSZ. ne možete izvući zeleni kliker ukoliko prethodno ne izvučete plavi pa žuti. Mikrokontroler skače na potprogram. mikrokontroler preuzima adresu povratka sa steka. U primeru koji sledi tabela se koristi za odabir odgovarajućeg šablona za crtanje brojeva od 0 do 9 na sedmosegmentnom LED displeju.2 instrukciji). PIC mora na neki način upamtiti mesto sa koga je skočio na potprogram. Iako PIC nema set instrukcija kojima bi se mogle koristiti tabele u programu.17. pri čemu se nakon povratka bajt k nalazi u W registru. i smešta je u PC. Za obične potprograme to i nije neka velika pogodnost. Tabele se koriste pozicionirajući PCL registar na odovarajuću instrukciju. instrukcija CALL razlikuje od MOVLW) i operand. moguće je implementirati ih upotrebom PCL i PCLATH registra i instrukcije RETLW k. Vreme je da se malo pozabavite unutrašnjom strukturom mikrokontrolera. adresa naredne instrukcije se stavlja na stek. Očigledno. Međutim ukoliko je tekuća instrukcija GOTO. Specijalan slučaj predstavlja koriščenje CALL instrukcije. Još malo o hardveru Do sada ste pisali i pisali programe. Retlw k (Return with Literal in W) instrukcija omogućava povratak iz potprograma (isto kao i RETURN instrukcija). Pre izvršenja svake instrukcije PIC gleda sadrežaj registra PCL i PCLATH. Međutim. INCFSZ. i prelazi na sledeću instrukciju. čime je omogućen skok preko sledeće instrukcije. žuti i plavi. Oni (tačnije bitovi 0-5 PCLATH + 0-8 PCL) čine jedinstven trinaestobitni PC (eng. U njega se može upisati maksimalno 8 adresa za povratak (još manje ukoliko se koriste interapti).

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

. Nije. Obrazac za crtanje cifre 3 . Obrazac za crtanje cifre 5 . Pauza zbog debouncing .C goto Ini incf BROJ.0 . btfss PORTB.7 retlw b'11111110' .3 retlw b'11001100' .1 = setovan Carry flag) .9 .. resetuj brojač . uvećaj brojač. ****** Pauza ****** Pau decfsz BROJAC. Obrazac za prikaz u W movwf PORTB . Jeste.4 retlw b'11011010' . rutine . Još jedno testiranje zbog imunosti na goto Cek1 . Obrazac za crtanje cifre 9 . ****** Brojanje ****** movlw 0xF6 addwf BROJ. Obrazac za crtanje cifre 4 .0 do .1 retlw b'10110110' . Nije otpušten call Pau . ****** Testiranje prekidača ****** Cek1 btfss PORTB.6 retlw b'00001110' . Povratak iz potprograma . nastavi sa testiranjem i brojanjem .0 retlw b'00001100' . Da li je došlo do prekoračenja (Carry flag)? . . ****** Kraj programa ****** end . Kraj programa. .9.0 . Nije pritisnut call Pau . Jeste otpušten. Jeste pritisnut. Testiranje pritisnutosti prekidača goto Cek2 . Ta vrednost se dodaje na PCL. Obrazac za crtanje cifre 1 . . eventualna varničenja kontakta.5 retlw b'11111010' . ****** Potprogram za prikaz na LED displeju ****** Disp call Tabl . Obrazac za crtanje cifre 2 . Pozovi pauzu. Cek2 btfsc PORTB. Prikaži na displeju return .0 . Testiranje otpuštenosti prekidača goto Cek1 .W .8 retlw b'11011110' . Još jedno testiranje zbog imunosti na goto Cek2 . btfsc PORTB. Pozovi pauzu. Obrazac za crtanje cifre 6 . Povratak iz potprograma . Obrazac za crtanje cifre 7 .F . prikaži rezultat i.246+.W btfsc STATUS.2 retlw b'10011110' . 48 . Obrazac za crtanje cifre 0 .9+. Saberi sa BROJ.F call Disp goto Cek1 . rezultat u W . ****** Tabela ****** Tabl movf BROJ.F goto Pau return .246 u W (. .0 . retlw b'01111110' . Obrazac za crtanje cifre 8 . U promenljivoj BROJ nalazi se vrednost od addwf PCL. eventualna varničenja kontakta.

U slučaju prekoračenja izvršavanje programa će se nastaviti sa slučajne memorijske adrese što će prouzrokovati nepravilan rad ili blokadu programa. a zatim na pritisnutost sprečava nastavak brojanja ukoliko se prekidač neprekidno drži pritisnut.. Morate biti sigurni da je broj koji sabirate sa PCL u tačno određenim granicama. Testiranje na otpuštenost. d. Njen oblik je sledeći: addwf PCL. ASCII karakteri u tabeli U radu sa tabelama morate obratiti pažnju na dve stvari. Prikaz dekadnog broja realizovan je direktnim dovođenjem napona na pojedine segmente LED displeja. a ne prilikom otpusta tastera.F . 2 promeniti u b'01001001' U tom slučaju potrebno je prepraviti električnu šemu tako da se zajednička anoda poveže na +5V. to nije slučaj. f i g. Za vrednosti od 0 do 9 sabrane sa .10). Testiranje prekoračenja realizovano je sabiranjem vrednosti sa brojem 246 i testiranjem Carry flaga.Duplim testiranjem pritisnutosti taster prekidača sa pauzom između testiranja realizovana je debouncing rutina. Ovi segmenti su na LED displeju označeni su slovima a.). U potprogramu za prikaz možete videti klasičan primer pozivanja drugog potprograma iz prvog. Saberi sa PCL dt d'10'. Pri tome se mogu primenjivati svi načini označavanja brojeva (decimalni. e. MPLAB asembler ima direktivu DT (eng. i omogućava promenu stanja prilikom pritiska. 1 promeniti u b'11110011' . d'253'. 0 promeniti u b'10000001' . c. Ova pogodnost najviše dolazi do izražaja pri upisivanju ASCII karaktera: addwf PCL. 49 . Saberi sa PCL dt “Proba ispisa teksta“ . decimal point) „decimalna tačka“ ovde nije iskorišćen. 1. One će prouzrokovati ponovnu inicijalizaciju brojača. Iako je program je napravljen za rad sa displejem sa zajedničkom katodom. može može se prepraviti za rad sa displejem sa zajedničkom anodom prepravkom tabele na taj način š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' . d'84'. d'0'. heksadecimalni. Define Table) kojom se mogu brže unositi željene vrednosti u tabelu. Vrednosti Iako na prvi pogled deluje da se na ovaj način štedi memorija mikrokontrolera. Segment dp (eng. ali hoće za vrednosti veće od njih (. d'5' . Asembler će dt direktivom naredne memorijske lokacije napuniti retlw instrukcijama koje sadrže vrednosti navedene iza direktive.. b. i ciklus brojanja će ponovo početi od 0. d'18'.249 Carry flag neće biti setovan.F .

a gornji (>255) u bitovima 0-5 PCLATH.com/. pri čemu se adresa na koju se treba skočiti čuva u W registru u obliku broja instrukcija koje se trebaju preskočiti da bi se došlo do željene. Za postavljanje početka tabele na željeno mesto (početak bloka) možete koristiti ORG direktivu.2. jer je on ionako dug samo 43 bajta. Da biste ih prevazišli. Veličinu bloka najjednostavnije možete proveriti brojanjem upotrebljenih instrukcija (bez direktiva). Ukoliko je neophodno koristiti tabele sa većom količinom podataka. potrebno je osigurati da tabela ne izađe iz bloka od 256 bajtova. pogledajte AN548 sa http://www. rešenje bi moglo biti u postavljanju više tabela. ili analizom . Kod programa navedenog kao primer.microchip. 50 . Ogrančenja vezana za tabele važe i u ovom slučaju. Umesto tabele moguće je napraviti skok na proračunate memorijske lokacije addwf PCL. Kako je PC trinaestobitni registar čiji donji deo (0-255) je u PCL. to nije problem.F instrukcijom.lst fajla generisanog prilikom asembliranja.

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. 0 0. U oba slučaja potrebna Vam je neka vrsta reseta ukoliko se program zaglavi. Ali kako on radi? Unutar mikrokontrolera nalazi se interni RC oscilator koji obezbeđuje jedinstven takt. Prvo za koliko vremena će WDT preći sa 0x00 na 0xFF. Kada se na ovaj pin dovede logička 1. 1 0. Pretpostavimo da PIC nadgleda određeni ulazni pin. preskaler (eng. Normalno. Zbog lakšeg objašnjavanja zaokružiću ovo vreme na tačno 18mS. bit 2. On se može programirati za deljenje WDT takta generisanog internim RC oscilatorom. drugo kada ga trebate resetovati i treće kako podesiti softver programatora za njegovo uključenje. Watchdog tajmer (skraćeno WDT) nije ništa novo. Da biste mogli uspešno koristiti WDT potrebno je da znate tri stvari. pas čuvar) tajmera. Izaći će iz petlje tek kada se na pinu pojavi 1. 0. To je svrha Watchdog (eng. Što se veći odnos deljenja koristi. Pretpostavimo da ste napisali program. i redom se inkrementuje sve dok ne dostigne maksimalnu vrednost 0xFF.1. Kada se WDT uključi. odnos deljenja takta i vreme prekoračenja vrednosti WDT. Pogledajte sada malo drugačiji primer. Uzmite u obzir sledeći slučaj. temperatura mikrokontrolera i. Jedini način na koji se može sprečiti ovaj reset.1S 2. ono se može i produžiti.3S Unutar mikrokontrolera nalazi se tzv. 51 .0 0. 0. Vreme WDT WDT ima vreme prelaska sa 0x00 na 0xFF od oko 18mS. Sada možete i sami uvideti da u slučaju zaglavljivanja mikrokontrolera u petlji WDT neće biti resetovan. 1. što će prouzrokovati reset mikrokontrolera. PIC će se vrteti u petlji i čekati. Preskaler se nalazi u OPTION_REG registru (0x81) na mestu od nultog do drugog bita. 1 1. pre podeliti). 0.t. nezavistan od takta mikrokontrolera. 0. 1 1. je periodično resetovanje WDT na 0 kroz program. U trenutku prelaska sa 0xFF na 0x00 (što je 0xFF+1) PIC će se resetovati bez obzira na njegovo stanje. 0 0. čak i simulirali njegov rad u simulatoru. 1. kompajlirali ga. 1. 1. Ukoliko se to ne desi. 0 1. Ovo vreme zavisno je od nekoliko spoljnih faktora kao što su napon napajanja. program skače na naredni deo i čeka da sledeći pin dobije logičku 1. želeli bi da se osigurate da će program uvek nastaviti sa izvršavanjem bez obzira na to šta se sa njim događa. Međutim posle dugo vremena program se zaglavi u nekoj petlji (koliko ste samo puta Vi pritisnuli Ctrl Alt Delete kombinaciju na Windowsu). Watchdog tajmer Pretpostavimo da ste napisali program koji se neprekidno izvršava na mikrokontroleru.18. Mnogi mikrokontroleri i mikroprocesori imaju ga u sebi. 0 1.d. takt WDT će biti sporiji. Ipak. U tabeli je prikazan odnos bitova. njegov brojač počinje sa 0x00.

Upamtite da su ova vremena nezavisna od takta oscilatora mikrokontrolera. To znači da je potrebno prebaciti ga na WDT. bez menjanja odnosa .inc> . Vrednosti u OPTION_REG registru levo od preskalera označene sa x imaju specijalne funkcije (poput uključenja Pull-Up otpornika) koje ćete naučiti u delu sa tajmerom i interaptima. Kako i interni i watchdog tajmer koriste iste bitove OPTION_REG registra Microchip preporučuje sledeću proceduru kako ne bi došlo do nehotičnog reseta PIC. . BANK1 . odnosno 0. Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC org 0x00 . i postavi zeljeni odnos . Definiše upotrebljeni mikrokontroler #include <p16F84. Najbliža standardna vrednost je 576mS.576S to je b'xxxx1101' .RP0 * movlw b'xx0x0111' * movwf OPTION_REG * bcf STATUS. . BANK0 . pa je dovoljno poslati vrednost b101 u OPTION_REG registar. Međutim nije baš sve tako jednostavno. ****** Podešavanje WDT ****** * bsf STATUS.RP0 . Za 0.RP0 b'xxxx1111' OPTION_REG b'xxxx1xxx' OPTION_REG STATUS. Ovo je 0x05 . Izaberi tajmer i preskaler različit od 000 . real time).RP0 clrf TMR0 bsf movlw movwf clrwdt movlw movwf bcf STATUS. Iz tog razloga im ovde nisu dodeljene konkretne vrednosti. . Izaberi WDT. nasuprot taktu mikrokontrolera koji možete menjati fizičkom zamenom par delova u oscilatoru. preskalera xxx. Adresa OPTION_REG registra. BANK1 . Podešava konfiguracione bitove. Izaberi WDT. Obriši WDT . movlw movwf b'101' 0x81 .576S. preskalera U slučaju željenog odnosa različitog od 1:1 (vrednost preskalera 000) mogu se izbaciti instrukcije označene zvezdicom. Mislite o ovim vremenima kao stvarnim (eng. Pretpostavimo da želite da WDT resetuje PIC nakon pola sekunde. ****** Inicijalizacija i imenovanje ****** list p=16F84 . Brisanje vrednosti internog tajmera i . BANK0 . preskalera – pri upisu u tajmer. Za sada je dovoljno da znate da se bitom 3 OPTION_REG registra vrši selekcija tajmera kome će biti pridružen delitelj po sledećem: 1 – postskaler WDT 0 – preskaler internog tajmera. 52 . Po inicijalizaciji PIC-a postskaler je pridružen internom tajmeru mikrokontrolera (više o njemu kasnije). .

pa ona traje 1 instrukcijski ciklus. Ukoliko taj uslov nije ispunjen. Pretpostavite da sve instrukcije traju 1 instrukcijski ciklus. RETURN instrukcija traje 2 ciklusa. Nakon nje. movlw movwf decfsz goto end 0x02 BROJAC BROJAC. Onda se ponovo vrši smanjenje registra BROJAC za 1. Ali. postoje 4 instrukcije koje mogu trajati 1 ili 2 instrukcijska ciklusa. i ona traje 2 ciklusa. odnosno za jednu instrukciju koja traje 1 instrukcijski ciklus će mu trebati 1μS. Time Out – isteklo vreme) STATUS registra biće iznova setovan. 53 . Clear Watchdog timer) instrukcije. Sledeća instrukcija je slična. Ona takođe ne menja stanje PC. Ukoliko je kao izvor takta upotrebljen kristal od 4MHz. onda će ona trajati 2 instrukcijska ciklusa.F Pet Pet Prva instrukcija postavlja vrednost 0x02 u W. GOTO instrukcija traje 2 ciklusa jer prouzrokuje da PC skoči na neko drugo mesto u programu. jer samo premešta podatak sa jednog na drugo mesto. PIC deli takt oscilatora sa 4. a naći će se u resetovanom stanju jedino prilikom WDT reseta. Ovo ne prouzrokuje menjanje PC. on se mora preko nje uključiti sa WDT ON. Softver programatora Sećate se __CONFIG direktive? Za korišćenje WDT. Vidite koliko zbunjujući može biti instrukcijski ciklus instrukcija uslovnog skoka. ali kako je sada rezultat „testa na vrednost 0“ = 1. INCFSZ. One će preskočiti sledeću instrukciju u slučaju da je određeni uslov ispunjen i onda će trajati 2 ciklusa. Sada će sledeća instrukcija izvršiti prvo smanjenje registra BROJAC za 1 i rezultat „testa na vrednost 0“ = 0 pridružiti PC. TO bit (eng. A pošto je neki programatori ignorišu. BTFSC i BTFSS. Na primer MOVWF instrukcija traje 1 instrukcijski ciklus. PC će promeniti svoju vrednost na PC+1. izvršiće se naredna instrukcija kao da se ništa nije ni desilo. pa i ona traje 1 ciklus. Znači ovaj program zauzeće ukupno 7 instrukcijskih ciklusa. Na ovaj način PC se ne menja. Ovo vreme naziva se instrukcijski ciklus. pa instrukcija traje 1 ciklus. dok će mu za instrukciju koja traje 2 instrukcijska ciklusa trebati 2μS. Način da zapamtite broj instrukcijskih ciklusa za sve instrukcije je prilično lak. Više o tome naučićete u poglavlju sa reset funkcijom. do programatora (softvera). jer se PC vraća na glavni program. potrebno je i unutar njihovog softvera podesiti konfiguracione bitove. Vreme izvršavanja instrukcija Kao što se sećate. Pogledajte sada sledeći program. To su DECFSZ. Postupak njihovog podešavanja razlikuje se od programatora. PIC će izvršavati instrukcije brzinom od 4MHz/4=1MHz.U primeru ste naučili upotrebu CLRWDT (eng. i onda će trajati 1 ciklus. što troši 2 instrukcijska ciklusa. Uglavnom se traži njihov upis neposredno pre programiranja mikrokontrolera. ukoliko instrukcija prouzrokuje nastavak programa sa neke druge adrese (promenjen je sadržaj PC). Uz kristal od 4MHz program će trajati 4MHz / 4takta = 1μS po instrukcijskom ciklusu. što za 7 ciklusa iznosi 7 * 1μS = 7μS. Međutim. Sledeća instrukcija je GOTO.

izaberi WDT. . org 0x00 .inc> .RP0 clrf TMR0 bsf movlw movwf STATUS. Prebacuje program u BANK1 . Svi pinovi . Isključi Pull-up otpornike i .Sledećim programom namerno se dozvoljava prekoračenje WDT. Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC . Resetovan je. Definiše upotrebljeni mikrokontroler #include <p16F84. a da joj se napon dovodi direktno sa napajanja! To je bolje zbog manjeg grejanja i potrošnje. . ****** Podešavanje WDT ****** bcf STATUS. Brisanje vrednosti internog tajmera i . Brisanje vrednosti internog tajmera i . Vraća program u BANK0 . ****** Test WDT reseta ****** btfss STATUS. Za pin RA4 ovo je i jedino moguće rešenje. kao i ograničenje ukupne struje koju prima i kojom može napajati eksterne potrošače (150mA).RP0 b'10001111' OPTION_REG 54 . do 80mA za PORTA i do 150mA za PORTB. . ****** Inicijalizacija i imenovanje ****** list p=16F84 . jer on na svom izlazu ne može dati logičku 1.RP0 clrf TRISA clrf TRISA clrf TMR0 . Testiraj stanje TO bita . znači WDT reset . ****** Podešavanje porta ****** bsf STATUS. Prebacuje program u BANK1 . Njegov takt koristi se za treptanje LED. PIC pri ovakvom povezivanju podnosi do 25mA po pinu. preskalera – pri upisu u tajmer. Podešava konfiguracione bitove. preskalera – pri upisu u tajmer. vremenom preskalera . Primećujete da je LED povezana tako da svetli pri dovođenju logičke 0 na pin.TO goto Led . Osim toga PIC pored ograničenja struje po pojedinačnim pinovima (20mA) ima i ograničenje struje koju može dati ceo port (do 50mA za PORTA i do 100mA za PORTB). sa maksimalnim . . su izlazni.

Za detalje pogledajte AN828. 55 . ****** Naredna prekoračenja WDT ****** Led xorlw b'00000100' . ****** Kraj programa ****** end . Vrti se ovde do . Obriši W Pet goto Pet . ali će deo sa testiranjem TO bita detektovati je li nastupio WDT reset ili ne. Nestabilnost WDT oscilatora usled promene temperature može biti efektno iskorišćena za merenje temperature mikrokontrolera (samim tim i spoljne temperature) bez ikakvih eksternih senzora. preskalera od 1. BANK0 . sledećeg WDT reseta . Kraj programa.1S nastupiće WDT reset. prvog WDT reseta . Obriši WDT . Kako u njoj nema CLRWDT instrukcije. Nakon početne inicijalizacije program će se vrteti u prvoj mrtvoj petlji. ****** Inicijalizacija W i prvo prekoračenje WDT ****** clrw . Vrti se ovde do .clrwdt movlw movwf bcf b'10001110' OPTION_REG STATUS. i ukoliko jeste dalje izvršavanje programa nastaviće se od labele Led gde će se izmeniti stanje RA2 pina. nakon 1. i postavi odnos . Izmeni stanje bita 2 u W movwf PORTA . Mrtva petlja. Mrtva petlja.1S . Prebaci stanje iz W u PORTA Pet2 goto Pet2 . Po resetu program će se izvršiti od početka. Izaberi WDT.RP0 .

brojanje će biti sinhronizovano sa eksternim taktom koji se treba dovesti na pin 3 (RA4/T0CKI). tajmer isto kao i WDT može koristiti preskaler. Ovaj takt se može dobiti sa CLKOUT pina mikrokontrolera. Njime se bira hoće li se brojanje vršiti pri prelasku sa logičke 0 na 1 (resetovan T0SE) ili sa logičke 1 na 0 (setovan T0SE). kako bi program znao da je ciklus brojanja završen. PIC16F84 ima u sebi integrisan tajmer. Timer0 Clock Select) bit omogućava izbor takta tajmera. T0CS (eng. Prednost tajmera nad običnom petljom za kašnjenje je u činjenici da je brojanje interni proces mikrokontrolera. Ukoliko je setovan. Glavna funkcija tajmera je brojanje (. brojanje će se odvijati sinhronizovano sa taktom izvršavanja instrukcija koji je četiri puta manji od takta oscilatora. a ukoliko je resetovan preskaler će biti pridružen tajmeru. Postoji elegantniji način rešavanja ovog problema. i ciklus brojanja opet počinje od nule. Timer0 Source Edge) bit ima smisla jedino pri upotrebi eksternog takta. Kako na ovaj način nije moguće dobiti veće periode. ● ● 56 . Upotrebu INTEDG (eng. vreme je da se bliže upoznate sa njegovom unutrašnjom strukturom. Bitovima PS0 do PS2 bira se odnos deljenja preskalera po sledećoj tablici. Tajmer U slučaju da pišete program koji mora imati veliku ali tačno definisanu pauzu sigurno vam se neće svideti mogućnost postavljanja jedne petlje unutar druge i proračunavanja broja ciklusa za željenu dužinu pauze. PSA (eng. Impulsi ovog tajmera mogu biti sinhronizovan sa taktom izvršavanja instrukcija mikrokontrolera ili sa taktom eksternog oscilatora čiji impulsi se dovode na pin 3 (RA4/T0CKI). Ukoliko je T0CS bit setovan. Ukoliko je resetovan. U trenutku prekoračenja maksimalne vrednosti. ● ● ● T0SE (eng. bit7 RBPU ● INTEDG T0CS T0SE PSA PS2 PS1 bit0 PS0 NOT_RBPU (eng. i da ni na koji način ne utiče na brzinu izvršavanja glavnog programa. Interrupt edge) bita naučićete u sledećem poglavlju.255) koje je za razliku od WDT sinhronizovano sa ovim taktom.19.0-. flag tajmera se setuje. Dovoljno je povremeno proveriti stanje flaga tajmera. postskaler će biti pridružen WDT. Port B Pull Up) bit OPTION_REG registra služi za povezivanje internih otpornika PORTB registra na napon napajanja. Prescaller Assigment) bit se koristi za selekciju pridruženosti preskalera. Budući da se za korišćenje i WDT i internog tajmera pretežno vrši manipulacija nad OPTION_REG registrom.

Postavlja sve pinove clrf TRISB . ****** Inicijalizacija tajmera i displeja ****** clrf TMR0 . na displeju (0x00-0x0F) DEL equ 0x0D . Timer0) nalazi se na adresi 0x01. ne može se doći u situaciju da se WDT sam uključi. Sledi program koji ilustuje upotrebu tajmera. 0. Brisanje flaga tajmera bsf STATUS. 0. On će instrukcijski ciklus preskalerom deliti sa 256. ****** Inicijalizacija i imenovanje ****** list p=16F84 . Budući da se pri samom programiranju PIC16F84 vrši uključenje ili isključenje WDT (podešavanjem konfiguracionih bitova). kao izlazne movlw b'10000111' . Timer0 Overflow Interrupt Flag) nalazi se u INTCON registru. Podešava konfiguracione bitove DISP equ 0x0C . Povratak u BANK0 57 . On je tu jer se odnos tajmera od 1:1 može dobiti jedino pridruživanjem preskalera WDT.Bit 2. Promenljiva za broj koji se prikazuje . Inicijalizacija tajmera clrf INTCON . a onda će heksadecimalne brojeve (0x00 do 0x0F) prikazivati na LED displeju. Više o ovom registru naučićete u delu sa interaptima. 0. Prelazak u BANK1 clrf PORTA . U programu će biti upotrebljen ranije ilustrovani princip prikaza na LED displeju. 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 Primećujete da se i ovde pominje WDT odnos. setovanjem PSA bita. 1. 1 0. 1. Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . 0. 0 0. 1.RP0 . Registar tajmera TMR0 (eng. 0 1. Definiše start programa . 1. Pull up otpornici su isključeni bcf STATUS. 1 1. .RP0 . i preskaler je movwf OPTION_REG . 1 1. a njegov flag T0IF (eng. 0 0. Promenljiva za rotaciju ORG 0x00 . Deljenje sa dva se kao što se sećate može realizovati rotacijom bitova unutar registra.inc> . zatim softverski još sa 6. 0 0. instrukcijskim ciklusom. 0. Za takvo podešavanje primenjuje se kôd opisan u prošlom poglavlju sa instrukcijama označenim zvezdicama. Definiše upotrebljeni mikrokontroler #include <p16F84. iako mu je pridružen preskaler. 1 1. podešen za odnos 1:256 . i tako izazove reset mikrokontrolera. Tajmer je sinhronizovan sa .

Inicijalizacija . Obrazac za crtanje cifre 1 . nastavi dalje sa brojanjem.F . Obrazac za crtanje cifre 3 .8 retlw b'11011110' . ****** Kraj programa ****** end . . čekaj na još jedan ciklus tajmera.3 retlw b'11001100' . goto Cek .F .F .T0IF . Obrazac za crtanje cifre 0 . Obrazac za crtanje cifre 4 . flag setuje.1 retlw b'10110110' .DC . Obrazac za crtanje cifre 7 . Saberi DISP sa W.D retlw b'11110010' .T0IF . displeja . 0x00 do 0x0F. retlw b'01111110' . ****** Deljenje sa 6 ****** rrf DEL btfss STATUS. Uzmi obrazac iz tabele. Ta vrednost se dodaje na PCL.. Obrazac za crtanje cifre 8 . . Da li je došlo do prekoračenja vrednosti 0x0F? goto Ini .0 retlw b'00001100' . ****** Testiranje prekoračenja vrednosti cifre na displeju ****** movlw 0x01 . . Nije.6 retlw b'00001110' .A retlw b'11111000' . Obrazac za crtanje cifre C . delitelja .C retlw b'10111100' . U promenljivoj DISP nalazi se vrednost od addwf PCL. nastavi dalje. setovan. Rezultat u DISP btfsc STATUS.7 retlw b'11111110' . Inicijalizacija . Obrazac za crtanje cifre D . Obrazac za crtanje cifre F .E retlw b'11100010' . ****** Prikaz cifre na displeju ****** call Tabl .4 retlw b'11011010' . Resetovanje flaga tajmera Cek btfss INTCON.9 retlw b'11101110' .5 retlw b'11111010' . Obrazac za crtanje cifre 5 . Obrazac za crtanje cifre 6 .C goto Taj .W . ****** Inicijalizacija brojača ****** Ini movlw 0x00 movwf DISP movlw b'00100000' movwf DEL . počni brojanje od početka (cifre 0) goto Taj . Obrazac za crtanje cifre E . Jeste. movwf PORTB . Obrazac za crtanje cifre B . Kada se Carry . Kraj programa 58 . Obrazac za crtanje cifre 2 . Rotiraj DEL registar nadesno. . Obrazac za crtanje cifre A. ****** Čekanje na prekoračenje tajmera ****** Taj bcf INTCON.B retlw b'01110010' . Ukoliko i dalje nije . i prikaži cifru na displeju.2 retlw b'10011110' . Čekanje na setovanje flaga tajmera. ****** Tabela ****** Tabl movf DISP. Obrazac za crtanje cifre 9 . odnosno prekoračenje tajmera .1 u W addwf DISP.

jer će većina instrukcija čije je odredište TMR0 registar obrisati preskaler. . pa inicijalizovati TMR0 na .100.100. Povedite računa o instrukcijama koje koristite za podešavanje tajmera. Isto tako moguće je primeniti drugačiji pristup.0. . Jedino instrukcije sabiranja i oduzimanja menjaju stanje DC flaga. U tom slučaju tajmer će brojati od .100 do . Svakako da se njegovo uvećanje moglo izvršiti i inkrementacijom. Za kraće periode moguće je nakon svakog prekoračenja postaviti inicijalnu vrednost tajmera na npr. kada će se setovati njegov flag. i testirati ga na vrednost npr. i jedino pri prekoračenjima donjih niblova (tačnije vrednosti 0x0F donjeg nibla). 59 .255. ali na ovaj način lakše je nakon povećanja testirati njegovo prekoračenje.Možda Vam izgleda čudno upotreba sabiranja umesto inkrementovanja registra DISP.

RB0/INT Interrupt Enable . Pri rastućoj (sa 0V na +5V) ili pri opadajućoj ivici (sa +5V na 0V) signala. a resetovanje pri silaznoj. Očigledno je da je RB0 ulazno izlazni pin PORTB registra. Odjednom vam mobilni signalizira prijem SMS poruke. PIC16F84 ima 4 izvora interapta. Unutar PIC16F84 nalazi se INTCON (eng.uključi interapt na RB0/INT pinu). Setovanjem GIE mikrokontroler dozvoljava upotrebu jednog ili više izvora interapta. Interapti . Za sada ćete naučiti primenu eksternih izvora. Interrupt Controller) registar na adresi 0Bh. a proces čitanja poruke (i eventualnog odgovora na nju) kao potprogram za obradu intertapta. Dva eksterna i dva interna. Interapt je proces ili signal koji prekida izvršavanje glavnog mikrokontrolerskog programa i prebacuje njegovo izvršavanje na potprogram koji je zadužen za obradu interapta. trebaju se uraditi dve stvari.pojam Pojam interapta će vam verovatno biti najteži za razumevanje. i nastavljate čitanje sa mesta na kome ste stali. ili sa logičke 1 na logičku 0. Setovanje njegovog bita 6 nazvanog INTEDG (eng. Ukoliko pogledate oznake izvoda pinova PIC16F84 videćete da je na pinu 6 oznaka RB0/INT. Prvo se trebaju dozvoliti interapti. Po povratku iz potprograma glavni program nastavlja sa radom kao da se ništa nije ni dogodilo. kako se ne bi dogodilo da se interapt izazove prilikom menjanja njegovog stanja od strane samog programa. i vratiti se u BANK0. korišćenje bilo kog interapta nije moguće. Možete zamisliti glavni program kao čitanje uputstva. a zatim izabrati željeni izvori interapta koji će se koristiti u programu. ali nadam se da ćete pri kraju ove sekcije moći da ih uspešno primenjujete u svojim programima. Interrupt Edge) prouzrokovaće interapt pri rastućoj ivici. 60 . Bit 4 INTCON registra nazvan je INTE (eng. Pri tome se on ponaša kao šmitov okidač. zvonjavu mobilnog kao izvor interapta. što otežava pojavu lažnih signala okidanja. Njega možete uporediti sa centralnom bravom automobila. Pre nego što se upotrebi bilo koji izvor interapta. Ilustrovaću ovo na svakodnevnom primeru. Pre toga je (naravno) potrebno konfigurisati ga kao ulazni pin. Sada se mikrokontroler treba podesiti za željeni signal izazvanja interapta. Ovim je PIC16F84 podešen za korišćenje interapta na RB0/INT pina PORTB registra. Najpraktičnije je ovo podešavanje izvršiti uz ostala u toku inicijalizacije mikrokontrolera. tamo setovati ili resetovati INTEDG bit OPTION_REG registra. Njegov MSB nazvan je GIE (eng. Takođe se i pinovi RB4 do RB7 mogu koristiti za interapte. Ovo se podešava u OPTION_REG registru na adresi 81h. Ne postoji lak način za njihovo objašnjavanje.20. a interni će biti objašnjeni kasnije. pročitate poruku (eventualno i odgovorite). Prekidate čitanje. Global Interrupt Enable). Ukoliko je GIE resetovan. Setovanjem INTE bita dozvoljena je upotreba RB0 pina kao izvora interapta. Drugim rečima da li želite da se interapt u mikrokontroleru izazove pri prelasku signala na RB0 pinu sa logičke 0 na logičku 1. Pretpostavimo da sedite kući i čitate ovo uputstvo. treba preći iz BANK0 u BANK1. Kako je nažalost OPTION_REG registar u BANK1. INT označava da se on može konfigurisati i kao pin eksternog interapta.

a neposredno pre izlaska iz nje. Uprošćen prikaz interne interapt logike 61 . Daleko je praktičnije završiti sa jednom porukom. a to je omogućavanje interapt rutini detekciju izvora interapta (RB0/INT pin odnosno RB4 do RB7 pinovi) u slučaju korišćenja više izvora interapta. Port B Change Interrupt Enable) „uključi interapte pri promeni stanja na portu B“. ali i sa logičke 1 na logičku 0. Ovaj posao mora programer sam izvršiti (siguran sam da već znate kako). to je kao da Vam za vreme odgovora na SMS stigne nova poruka i prekine upis odgovora. To je cela njegova funkcija. Ukoliko se setite primera sa mobilnim. interapt flag je resetovan. Iako PIC automatski setuje interapt flagove pri nailasku interapta. PIC će prihvatati nove interapte što može dovesti do neprestanog vraćanja programa na početak rutine za obradu interapta koja se usled toga nikada ne može izvršiti do kraja. Kada interapta nema. Podešavanje ovih pinova za izvore interapta vrši se setovanjem bita 3 INTCON registra nazvanog RBIE (eng. Ukoliko je interapt flag setovan PIC ne može i neće odgovarati na druge interapte. Oni se razlikuju od RB0/INT pina u tome što se interapt javlja pri promeni stanja na pinovima. Kako se kod njih interapt izvršava pri svakoj promeni stanja pinovi RB4 do RB7 nemaju svoj bit za određivanje ivice signala pri kojoj će se izazivati interapt.Interrupt flag). Sada se verovatno pitate kakva je njihova svrha. odnosno bit 0 (RBIF eng. Ukoliko interapt flag nije setovan. on ih ne resetuje pri povratku iz rutine za obradu interapta. Pretpostavimo da je izazvan interapt. možete koristiti pinove RB4 do RB7. i treba se odraditi nakon završetka rutine za obradu interapta. Interapt flagovi imaju još jednu funkciju. Odgovarajući interapt flag će biti setovan. To znači da će se interapt javiti pri prelasku sa logičke 0 na logičku 1. Interapt flag Sećate li se kako se vrši setovanje Carry flaga? Pri nailasku na interapt na RB0/INT pinu na sličan način se setuje bit 1 (INTF eng. i mikrokontroler će izvršiti potprogram za obradu interapta. Port B Interrupt flag) pri interaptu na RB4 do RB7 pinovima u INTCON registru.Ukoliko želite koristiti više eksternih izvora interapta. i onda dozvoliti prijem novih.

na početak programske memorije. Međutim. Na primer. Ukoliko koristite isti registar u glavnom programu i u rutini za obradu interapta imajte u vidu da će se sadržaj tog registra verovatno promeniti pri izvršenju rutine za obradu interapta. Ovo vreme naziva se instrukcijskim ciklusom. Rešenje ovoga je privremeno čuvanje vrednosti W registra u nekom od slobodnih registara. Ovde se nalazi rutina za obradu interapta koju . pre svega trebate reći mikrokontroleru da preskoči preko adrese 0x04. Ukoliko se za takt mikrokontrolera koristi kvarc od 4MHz. Najpre je potrebno da program standardno započne direktivom ORG 0x00. 1. Isto važi i za ostale registre (obično za STATUS) čiji sadržaj se menja u interapt rutini. i pri povratku iz nje. a nakon nje rutina za obradu interapta. Ovo se veoma lako implementira. ovoga puta sa adresom 0x04. PIC dolazi ovde pri pojavi interapta . . W registar će pri povratku iz rutine za obradu interapta zadržati vrednost koju je imao u interapt rutini. Dalje je potrebno preskočiti preko adrese 0x04. Nakon ove goto instrukcije sledi još jedna ORG direktiva. PIC izvršava jedino pri nailasku na interapt. Ovo se radi postavljanjem GOTO instrukcije. Početak glavnog programa Postoji par stvari na koje trebate obratiti pažnju prilikom korišćenja interapta. . ovaj podatak biće poslat na PORTA umesto vrednosti koju je W registar imao ranije. 2. kada pišete programe koji će koristiti interapte. org 0x00 goto Main org 0x04 : : : : : : retfie Main . interapt flag. Na kraju programa za obradu interapta potrebno je staviti RETFIE (eng. Return from interrupt) instrukciju. Idi na glavni program .Start i interapt vektor programske memorije U trenutku dovođenja napona napajanja ili prilikom reseta. PIC će izvršavati instrukcije brzinom od 1μS po instrukciji. i zadrži interapt rutinu koja počinje na adresi 0x04 odvojenu od ostatka programa. pri pojavi interapta PC će adresu sledeće instrukcije staviti na stek. Kada PIC naiđe na ovu instrukciju PC uzima sa steka lokaciju na kojoj je PIC bio pre nego što se pojavio interapt. Datasheet) za PIC 62 . Potrebno je obratiti pažnju na minimalno vreme između dve uzastopne pojave interapta. programski brojač (PC) pokazuje na adresu 0x00. i skočiće na adresu 0x04. recimo da koristite W registar da biste poslali podatak na PORTA. Na njenom kraju potrebno je obrisati odgovarajući . i takođe koristite W registar u rutini za obradu interapta za neku drugu operaciju. Završetak rutine za obradu interapta . Ukoliko ne pazite. PIC počinje odavde pri uključenju i resetu . U tehničkom uputstvu (eng. Ova instrukcija označava povratak iz interapt rutine. nakon koje sledi labela pozicionirana za start glavnog programa. Sledi deo kôda koji ilustruje navedeno. Dakle. i vraćanje njegove stare vrednosti po završetku interapt rutine.

Microchip preporučuje da se nakon resetovanja GIE bita proveri da li je bit zaista resetovan i da se. U sledećem poglavlju videćete program koji koristi interapte. Bilo koji senzor može okinuti PIC za uključenje alarma. Na kraju interapt rutine bit GIE INTCON registra se automatski setuje. a zatim će početi izvršavanje interapt rutine koja će na svom kraju da automatski setuje bit GIE. To može biti iskorišćeno za detekciju njihovih stanja iz samog programa bez korišćenja interapta. Da bi se zaštitili od ove situacije. Stoga je potrebno u samoj interapt rutini testirati prvi interapt flag. Uvek uzmite u obzir najgoru moguću varijantu. Ovo štedi neprekidno testiranje portova. svi postaju dostupni. kao i pojedinačnih dozvola za interapte (kao u programu sa tajmerom). U slučaju korišćenja više izvora interapta moguće je da se za vreme interapt rutine izazvane RB0/INT pinom pojavi i interapt na bitovima 4-7 PORTB registra. a rutina za alarm je rutina za obradu interapta. Nažalost njihovim interapt flagom (RBIF INTCON registra) nije moguće izvršiti detekciju interapta na pojedinačnim pinovima. Tako će GIE bit biti setovan iako je neposredno pre interapta bio resetovan. 7. moguće je da instrukcija za resetovanje ovog bita (zabranu svih interapta) u glavnom programu uopšte ne bude izvršena. Naime. setovanje interapt flaga i povratak iz potprograma za obradu interapta. 63 . i vratite ih natrag prilikom izlaska iz interapt rutine. Ukoliko je to neophodno. Interapt flagovi setuju se bez obzira na stanje GIE bita. prvo će ta instrukcija biti završena do kraja (resetovaće se GIE bit). odgovarajući interapt flag je kao i kod interapta potrebno ručno resetovati nakon detekcije. Budite oprezni prilikom korišćenja potprograma unutar interapt rutine. i tamo resetovati samo taj interapt flag. operacija ponovi. ukoliko uključite ove pinove. U čemu je svrha korišćenja 4 bita kao izvora interapta? Primer može biti kućni alarm. 6. Odmah nakon povratka iz potprograma za obradu interapta. izvršiće se interapt izazvan drugim izvorom. ukoliko interapt nastupi u trenutku izvršavanja instrukcije koja resetuje GIE bit. navedeno je da se treba ostaviti najmanje 3 do 4 instrukcijska ciklusa (znači bar 3-4μS) između dve uzastopne pojave interapta. i rasterećuje mikrokontroler za druge namene. 5. još par takvih pozivanja unutar interapt rutine sigurno će izazvati njegovo prekoračenje. Razlog za je vreme koje je potrebno mikokontroleru za skok na rutinu za obradu interapta. Ukoliko je u glavnom programu stek skoro pun (a biće pri pozivanju potprograma iz potprograma). Ne možete izabrati pojedinačne pinove na PORTB za interapte. ukoliko nije. Imajte ovo na umu ukoliko koristite eksterne izvore interapta. tj. čija 4 senzora su povezana na pinove na PORTB registru. Dakle. da se interapt rutina javlja baš prilikom izvršavanja potprograma najveće dubine. prilikom ulaska u interapt rutinu snimite sadržaj svih registara modifikovanih u potprogramu. tj. u zavisnosti od negovog stanja otići na rutinu za njegovu obradu. Naravno.3. Automatsko setovanje GIE bita može da bude i nedostatak u jednom slučaju. 4. Ne pozivajte iz rutine za obradu interapta potprograme koje već pozivate iz glavnog programa. već jedino na svim. 8. Sećate se da se bitovi 4 do 7 na PORTB registru mogu koristiti kao izvori interapta.

GIE INTCON. i došlo je vreme da se upoznate sa programom koji koristi interapte. Rezultat će se prikazivati na 3 LED na PORTA u binarnom obliku. Upisaće se kasnije . org goto org . Početak glavnog programa Onda je potrebno podesiti PIC za korišćenje interapta na pinu 6: bsf bsf INTCON. Ovde PC dolazi pri uključenju i resetu . retfie Main 0x00 Main 0x04 .program Prešli ste dosta teorije u prošlom poglavlju. Rutina za obradu interapta. . RB0 Interrupt enable (1 – uključi) 64 . Ovde će početi rutina za obradu interapta . Interapti . Odlazak na glavni program . Program će pri pritiskanju prekidača brojiti od 0 do 7.21. a brojanje i testiranje prekoračenja biće realizovani interapt rutinom. .INTE . i vraća PC na glavni program. interapta. . Najpre se mikrokontroler treba podesiti tako da pri izvršavanju programa preskoči deo na koji PC skače pri pojavi interapta. Global interrupt enable (1 – uključi) . Sam glavni program će samo prikazivati rezultat. Ova instrukcija označava kraj rutine za obradu .

TEMPW na adresi 0x0C . Interapt se izaziva pri .RP0 . RB0/INT kao ulaz. b'00000001' u TRISB TRISB .5 00000110 . opadajućoj ivici signala OPTION_REG. Obriši interapt flag Kako su ovde iskorišćene čak 3 instrukcije za menjanje vrednosti samo jednog registra praktičnije je u pogledu štednje memorije i brzine izvršavanja programa zameniti ih sa dve. Sećate se da zbog korišćenja RB0 kao interapt pina. bit 7 GIE – Global interrupt enable (1 – uključi) . on mora biti postavljen kao ulazni. otpornici na PORTB STATUS.0 00000001 .RP0 .NOT_RBPU .8 .INTF . a ostali kao izlaz TRISA . bit 4 INTE – RB0 Interrupt enable (1 – uključi) .1 00000010 .prekoračenje Stoga je najpre potrebno imenovati registre i inicijalizovati vrednost BROJAC registra. Povratak u BANK0 Kako interapt želimo izazivati pri opadajućoj ivici signala (sa +5V na 0V) mora se podesiti i INTEDG bit OPTION_REG registra.INTEDG . Program će koristiti promenljivu TEMPW za privremeno čuvanje W registra dok se izvršava interapt rutina i promenljivu BROJAC za pamćenje broja pritisnutih prekidača.6 00000111 . Inicijalizuj INTCON registar Sada je potrebno podesiti portove. bit 1 INTF – Interrupt flag (0 – obriši) . TEMPW equ BROJAC equ clrf 0x0C 0x0D BROJAC .2 00000011 . Prebacuje nas u BANK1 0x01 . BROJAC na adresi 0x0D .7 00001000 .3 00000100 . BROJAC će u programu imati sledeće vrednosti: bitovi 76543210 00000000 . Takođe su resetovanjem NOT_RBPU bita uključeni pulll up otpornici. bsf movlw movwf clrf bcf bcf bcf STATUS. Uključeni interni „pull up“ . Svi pinovi na PORTA su izlazni OPTION_REG. movlw movwf b'10010000' INTCON . Stavi 0x00 u BROJAC 65 .4 00000101 .Za svaki slučaj potrebno je resetovati interapt flag (nikad ne veruj mikrokontroleru): bcf INTCON.

****** Inicijalizacija i imenovanje ****** list #include __CONFIG ORG TEMPW BROJAC p=16F84 . movwf TEMPW . Dalje je potrebno proveriti da li je promenljiva BROJAC prekoračila maksimalnu vrednost . a odatle u PORTA . BROJAC. Kraj interapt rutine.0 . sada je inkrementovan. U interapt rutini potrebno je najpre sačuvati vrednost W registra. Vrati se na početak petlje Budući da prva pojava interapta nastaje tek kada se program nađe u glavnoj programskoj petlji (Pri).3 movf bcf retfie Pogledajte sada celokupan program: . BROJAC na adresi 0x0D 0x00 equ 0x0C equ 0x0D 66 . Upisi 0x00 u BROJAC . Privremeno čuvanje sadržaja W registra Onda je potrebno inkrementovati sadržaj BROJAC registra. Čuvanje sadržaja W registra na adresi 0x0C .W . u interapt rutini nema potrebe za privremenim čuvanjem njegove vrednosti. Invertovani BROJAC u W registar (zbog LED) .W PORTA Pri . .inc> . incf BROJAC. Najpraktičnije je izvršiti testiranje trećeg bita BROJAC registra. Vrati prethodni sadržaj W registra INTCON. sada je jednak .F . Testiraj treći bit 00001000 BROJAC registra. Ubacuje nazive registra u program _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . Uvećaj registar BROJAC. preskoči sledeću .INTF . prekoračio maksimalnu vrednost (b'00000111') .Dalje je potrebno u glavnom programu napraviti petlju koja će vrednost promenljive BROJAC neprestano prikazivati na PORTA registru. Ukoliko je BROJAC nakon inkrementacije . i da u sama petlja ne reaguje na stanje bitova STATUS registra. Definiše start programa . Obriši INTF – dozvoli nove interapte . Podešava konfiguracione bitove . instrukciju BROJAC . Pri comf movwf goto BROJAC. TEMPW. Ukoliko nije setovan.8 (b'00001000'). btfsc clrf . Ukoliko nije.7 (b'00000111') i došla do . Definiše upotrebljeni mikrokontroler <p16F84.

****** Glavni program – inicijalizacija ****** Main movlw movwf bsf movlw movwf clrf bcf bcf bcf clrf b'10010000' .0 u BROJAC . Ukoliko nije. a u 67 . Inicijalizuj INTCON registar STATUS. Ukoliko je BROJAC nakon inkrementacije . a ostali kao izlaz TRISA .RP0 . Obriši INTF – dozvoli nove interapte . Ovde PC dolazi pri uključenju i resetu . Uključeni interni „pull up“ . Privremeno čuvanje sadržaja W registra . Vrati prethodni sadržaj W registra INTCON.0 u BROJAC .F BROJAC. Vrati se na početak petlje .INTEDG . Testiraj treći bit b'00001000' BROJAC registra.7) . Povratak u BANK0 BROJAC . U slučaju da se na njega pošalje logička 0. ****** Interapt rutina ****** org goto org movwf incf btfsc clrf 0x00 Main 0x04 TEMPW BROJAC.INTF . bit 1 INTF – Interrupt flag (0 – obriši) INTCON . Invertovani BROJAC u W registar (zbog LED) .W PORTA Pri . Kao što je ranije rečeno RA4 pin ne može na svom izlazu dati logičku jedinicu. ponašaće se isto kao i ostali pinovi.0 . bit 7 GIE – Global interrupt enable (1 – uključi) . Upisi . . Kraj interapt rutine. Svi pinovi na PORTA su izlazni OPTION_REG. preskoči sledeću . Inkrementuj BROJAC.3 . prekoračio maksimalnu vrednost (. RB0/INT kao ulaz. instrukciju BROJAC . Stavi .NOT_RBPU . ****** Glavni program – petlja ****** Pri comf movwf goto BROJAC.W . sada je . Odlazak na glavni program movf bcf retfie .. Ukoliko nije setovan. Ovde će početi rutina za obradu interapta . . Prebacuje program u BANK1 0x01 .RP0 . b'00000001' u TRISB TRISB . Interapt se izaziva pri . ****** Kraj programa ****** end . Kraj programa. TEMPW. otpornici na PORTB STATUS. a odatle u PORTA . opadajućoj ivici signala OPTION_REG. bit 4 INTE – RB0 Interrupt enable (1 – uključi) . sada je inkrementovan. .

TMR0 i OPTION_REG. Pin RA4 razlikuje se od ostalih i po svom ulazu. PORTB. Sledi još jedan deo sa interaptima. PCL. Kako je ovaj program dat samo ilustrativno. Verovatno i sami uočavate da Vam sada veći problem od učenja novih instrukcija predstavlja učenje funkcija registara specijalne namene. TRISB. TRISA. Prilikom pritiskanja prekidača možete primetiti da se umesto jednog ponekad javi preskok brojeva. Ulaz mu je sa Šmitovim okidačem. Do sada ste naučili 32 instrukcije. sa udaljenog senzora). PCLATH. njim nije realizovana debouncing rutina. U registare koje ste u potpunosti naučili spadaju PORTA. a onda nešto novo. 68 . To omogućava bolji prijem signala sa prisustvom šuma (npr. To je osam potpuno i dva delimično (STATUS i INTCON) naučena registra. preći će u stanje visoke impedanse (kao da nije ni povezan).slučaju jedinice.

INTF (eng. Njegovim setovanjem. Setovanjem EEIE (EEPROM Interrupt Enable) omogućen je završetak snimanja u EEPROM kao izvor interapta. RBIF (eng. RB0/INT INTerrupt Enable) bit setovanjem dozvoljava korišćenje RB0 pina mikrokontrolera kao izvora interapta. Tajmerom izazvani interapti Sećate li se tajmera. Port B Change Interrupt Enable) bita. Da bi se dozvolili novi interapti. T0IF (eng. Malo je nepraktično sve vreme čekati na promenu njegovog flaga. moguće je. Sva podešavanja vezana za običan tajmer (preskaler. i resetovanjem njegovog flaga. eksterni takt) važe i u ovom slučaju. INTE (eng. omogućena je upotreba PORTB registra kao izvora interapta pri promeni logičkog stanja na RB4 do RB7 pinovima. Interrupt Flag) bit setuje se pri dolasku odgovarajućeg logičkog nivoa (odabranog INTEDG bitom OPTION_REG registra) na RB0 pin mikrokontrolera. Setovanjem T0IE (eng. Timer0 Interrupt Enable) bita tajmer je upotrebljen kao izvor interapta. MOVF instrukcija 69 . Pre nego što naučite kako se to može ostvariti. bit7 GIE ● EEIE T0IE INTE RBIE T0IF INTF bit0 RBIF GIE (eng. Kako je u interapt potprogramima uglavnom neophodno čuvati stanje STATUS registra posebna pažnja mora se obratiti na instrukcije koje prilikom njegovog vraćanja ne utiču (iznova) na promenu njegovog stanja kao što npr. Praktičnije bi bilo da mikrokontroler za vreme brojanja tajmera obavlja neku drugu operaciju a da se pri setovanju njegovog flaga izvrši interapt rutina. dovoljno je dozvoliti njegovo korišćenje setovanjem GIE i T0IE bitova. dozvoljena je upotreba interapta. Da bi se tajmer upotrebio kao izvor interapta. Port B Interrupt Flag) setuje se pri promeni logičkog stanja na pinovima RB4 do RB7. ● ● ● ● ● ● ● Interapt flagovi se ne resetuju automatski nakon očitavanja.22. Setovanjem RBIE (eng. neophodno je resetovati željeni flag pre izlaska iz interapt rutine. Timer0 Interrupt Flag) bit setuje se pri prekoračenju tajmera. upoznaćete se sa internom strukturom INTCON registra. Global Interrupt Enable) omogućava ili zabranjuje upotrebu svih interapta. Pogađate.

****** Inicijalizacija i imenovanje ****** list p=16F84 . Definiše upotrebljeni mikrokontroler #include <p16F84. Čuvanje sadržaja STATUS registra BROJAC1 . Swap F . bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 bit3 bit2 bit1 bit0 bit7 bit6 bit5 bit4 Sintaksa instrukcije je swapf f. Definiše start programa cblock 0x0C TEMPW . BROJAC1. Swapf (eng. Interapt potprogram troši vreme potrebno za izvršavanje svojih instrukcija. Električna šema ista je kao u prethodnom poglavlju.zameni) instrukcija menja mesta gornjem i donjem niblu u registru.d pri čemu je f registar nad kojim se izvršava operacija. Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . Shaddow registar za PORTA endc . Inicijalno 0xFF BROJAC2 . BROJAC2. Ova tri dela su samo uslovno nezavisna. a sa d je određeno odredište rezultata operacije. ****** Interapt rutina ****** org goto org movwf 0x00 Main 0x04 TEMPW . pa će u zavisnosti od brzine izvršavanja interapt potprograma (i brzine njenog pojavljivanja) glavni program raditi sporije. interapt rutina se uglavnom pravi tako da njeno trajanje bude što kraće. Trećim delom će se tajmerom izazivati interapt koji će menjati stanje LED3.inc> . Zbog toga se preporučuje upotreba SWAPF instrukcije. To će biti glavni program. Čuvanje sadržaja W registra u TEMPW 70 . Inicijalno 0xFF BROJAC3 . Inicijalno 0xFF SPORTA . Prvim delom će LED1 treperiti. pa tako njeno izvršavanje ne utiče u velikoj meri na brzinu glavnog programa. Podešava konfiguracione bitove ORG 0x00 . . BROJAC3. Ovde će početi rutina za obradu interapta .može uticati na izmenu Zero flaga. Ovde PC dolazi pri uključenju i resetu . Čuvanje sadržaja W registra TEMPSTATUS . Sledi program koji ilustruje upotrebu 3 nezavisna dela. Drugim delom će se pri pritisku tastera izazvati interapt koji će menjati stanje LED2. Međutim. Odlazak na glavni program .

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

INTEDG=0 . RB0/INT kao ulaz.GIE . Ubaci kašnjenje goto Poc .RP0 . bit 4 INTE – RB0 Interrupt enable (1 – uključi) .Tajmer je sinhronizovan sa . ****** Glavni program – inicijalizacija ****** Main bsf movlw movwf clrf movlw STATUS.RP0 . možemo videti kako LED1 treperi goto Pet return . Inicijalizacija Shaddow registra b'10110000' . bit 1 INTF – Interrupt flag (0 – obriši) . ****** Glavni program – treptanje LED1 ****** Poc bcf INTCON. Nisu. Preskaler . kada se isto moglo realizovati i movf TEMPW. b'00000' u TRISA. Dozvoli nove inerapte call Pet . a ostali kao izlaz TRISA . ****** Potprogram za kašnjenje od oko 0. Kopiraj W u Shaddow registar bsf INTCON. Promeni stanje bita za LED1 u W movwf PORTA . Zabrani nove interapre btfsc INTCON. T0CS=0 . zabrani ih opet. omogućavajući nam da decfsz BROJAC2. STATUS.Uključeni interni „pull up“ . 255 puta.F . Prebacuje program u BANK1 0x01 . movf SPORTA.PSA=111 je podešen za odnos 1:256 . ****** Kraj programa ****** end . Razlog je taj što će mowf instrukcija setovati Zero flag u slučaju da je u W bila vrednost 0x00. bit 7 GIE – Global interrupt enable (1 – uključi) . SHADDOW u W xorlw b'00000001' . b'00000001' u TRISB TRISB . Povratak iz potprograma . bit 2 T0IF – Timer interrupt flag (0 – obriši) INTCON .GIE .2S ****** Pet decfsz BROJAC1. Povratak u BANK0 TMR0 . Ove dve petlje služe za brojanje nadole od goto Pet . Kraj programa Možete se zapitati zašto su upotrebljene dve swapf instrukcije pri vraćanju TEMPW u W. dok je 72 .W instrukcijom.W . Inicijalizacija tajmera SPORTA . NOT_RBPU=0 . 255 do 0. instrukcijskim ciklusom . bit 5 T0IE – Timer interrupt enable (1 – uključi) .Interapt se izaziva pri . Inicijalizuj INTCON registar movwf bcf clrf clrf movlw movwf .F . otpornici na PORTB OPTION_REG . svi pinovi PORTA su izlazni b'00000111' .. Kopiraj W u PORTA movwf SPORTA . Vrati se na početak . opadajućoj ivici signala (sa 1 na 0) . Proveri jesu li interapti zaista zabranjeni goto Poc .GIE .

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. Sledi nešto sasvim drugačije. njegovi flagovi postaviće se u zavisnosti od rezultata instrukcije. Ukoliko to nije bio prekidač. onda je sigurno bio tajmer Ukoliko su oba interapta nastupila istovremeno (setovana oba interapt flaga). U delu sa testiranjem interapta možete primetiti da je testiran samo interapt flag prekidača. Ono se moralo izvesti na taj način (u prolazu) jer se ne sme dozvoliti da preveliko kašnjenje interapt potprograma koči izvršenje glavnog programa. bez obzira na stanje bajta koji želimo poslati u njega. jer nešto mora da je izazvalo interapt kada se već ušlo u interapt rutinu. ali po povratku iz interapt potprograma odmah će se izazvati novi interapt jer je interapt flag tajmera i dalje setovan. Sigurno ste u delu za obradu tajmerskog interapta uočili neobičnu realizaciju kašnjenja. Ukoliko je odredište instrukcije koja menja stanje flagova STATUS registra sam STATUS registar. Dosta je bilo interapta. To je sasvim normalno. Slično važi i za STATUS registar. Testiranje zabrane svih interapta takođe je neophodno (pogledajte napomene uz interapte).swapf instrukcija neutralna prema svim flagovima. 73 . najpre će se izvršiti interapt rutina prekidača.

dobićete vrednost 0x03. moguće je postići korišćenjem FSR i INDF registra. Nije.F . a PORTB 0x2B. 74 . movlw movwf clrf incf btfss goto b'00100000' .23. Pozicioniranje pointera na sledeći registar FSR. Takav postupak naziva se indirektno adresiranje. nastavi sa brisanjem Pet . nastavak programa. na registar 0x20 INDF . Za razliku od tabele. Isto tako je moguće i upisivanje podataka u željene registre. INDF registar nije fizički registar. zbog malog broja registara kod upotrebe indirektnog adresiranja nema ograničenja u smislu blokova podataka (bar kod PIC16F84 mikrokontrolera – kod mikrokontrolera sa većim brojem registara ovo nije slučaj). Njegovo adresiranje u stvari adresira registar čija adresa je sadržana u FSR registru (FSR je pointer adrese željenog registra). Indirektno brisanje željenog registra FSR. Prekoračenje? 0x30 = b'00110000' Pet . i pročitate sadržaj registra INDF. Prešli ste najveći (i najteži – interapti) deo gradiva. potpunu upotrebu deset registra i delimičnu upotrebu dva registra od ukupno 15. Indirektno adresiranje se u programima najčešće upotrebljava jedino u slučaju veće količine podataka. Sada će očitavanje vrednosti iz INDF registra vratiti vrednost 0x2B. međutim ima se još mnogo toga naučiti. Ukoliko u FSR ubacite adresu PORTA registra (0x05). Sledeći program ilustruje upisivanje vrednosti 0x00 u registre od 0x20 do 0x2F. Inicijalizacija pointera FSR . Nešto slično ali u odnosu na registre. on će ukazivati na PORTB (0x06).4 . Indirektno adresiranje Sećate li se tabele? Kod nje je skok na željenu lokaciju izvršen sabiranjem PCL sa W. Ukoliko sada inkrementujete FSR. Pretpostavite da PORTA sadrži vrednost 0x03. Jeste. Do sada ste naučili 33 od 35 instrukcija.

EEPROM Interrupt Enable) bita INTCON registra. prestaju da rade klima uređaji i osvetljenje. Nakon što se broj osoba u banci smanji za 1 osobu (što može nastati i mnogo kasnije. EEPROM Controller1) i EECON2 (eng. kao i one koji su izašli kroz izlazna vrata. EEPROM Data)) potrebno je inicirati proces čitanja ili snimanja bajta. Jedan manji akumulator ili UPS rešio bi problem. Po dolasku napona napajanja ove vrednosti trebaju se pročitati. i na osnovu broja lica u banci reguliše rad senzora pokreta. To direktno poskupljuje projekat. Međutim. ova memorija zadržava svoje stanje i nakon nestanka napona napajanja mikrokontrolera. Ovaj interapt može se dozvoliti setovanjem EEIE (eng. Unutar PIC16F84 nalazi se 64 bajta EEPROM memorije (0x00–0x3F). EEPROM memorija Zamislite da imate PIC koji preko sistema fotoćelija broji posetioce koji su ušli kroz ulazna vrata banke. Pa nije valjda džabe kupio agregat! U ovom slučaju potrebno je da PIC i nakon nestanka napona napajanja zapamti vrednost promenljive BROJAC (ili više promenljivih ukoliko je broj osoba koje mogu stati u prostoriju veći od 255). 2 sekunde nakon nestanka struje uključuje se elektroagregat (što ne sprečava reset kompjutera i zabrinuto „Jao dođite kasnije. osvetljenja i klima uređaja. ne rade nam terminali“). i PIC (koji se takođe resetovao) kreće sa radom inicijalizujući u svom brojaču 1 osobu (u normalnom radu onoga ko prvi dolazi na posao). Pre nego što naučite čitanje i snimanje u EEPROM. Nažalost zbog fizičkih osobina EEPROM memorije rad sa njom nije ni izdaleka tako jednostavan kao rad sa običnim RAM registrima. Kako ne biste želeli da išta prepustite slučaju. a senzori pokreta uključuju alarm i dojavljuju pljačku banke policiji. Kako banka ne bi bila banka ukoliko nema neku rezervu. EEIF (eng. Potrebno ga je ručno obrisati pre povratka iz interapt rutine. EEPROM Adress) i EEDATA (eng. upoznajte internu strukturu EECON1 registra.24. Ali direktor banke ni da čuje. jer su klijenti banke čuli da je legla plata). Znam znam. Pored indirektnog adresiranja (za šta se koriste registri EEADR (eng. EEPROM Interrupt Flag) bit predstavlja flag interapta izazvanog završetkom procesa snimanja bajta. mikrokontroler radi sa uključenim WDT. Za razliku od registara koji su obična RAM memorija. elektrodistribucija se postara da ne bude sve tako idealno i odjednom nestane struje. Trebaju biti na logičkoj nuli. i prebaciti u odgovarajuće registre. bit7 / ● ● / / EEIF WRERR WREN WR bit0 RD Bitovi 5 do 7 se ne koriste u EECON1 registru. što se vrši preko EECON1 (eng. EEPROM Controller2) registra. 75 .

WRERR (eng. Write Error) bit indikuje prekid snimanja bajta u EEPROM, usled isteka vremena WDT ili eksternog reseta mikrokontrolera. Program može nakon reseta testirati ovaj bit (uz to mora otkriti i da li je reset nastao usled nestanka napona napajanja ili ne), i na osnovu njegovog stanja dovršiti proces snimanja (sadržaj EEADR i EEDATA registra ne menja se nakon reseta). WREN (eng. Write Enable) bit mora biti setovan, da bi bio moguć upis u EEPROM. 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 pročitati sadržaj EEPROM ; memorije sa adrese 0x10 ; Prebacuje nas u BANK1 ; Inicira proces čitanja ; EEPROM memorije ; Prebacuje nas u BANK0 ; Sadržaj bajta sa adrese 0x10 ; iz EEPROM memorije je u EEDATA, ; odakle se može prebaciti u W

Ovaj program trebao bi da Vam je u potpunosti jasan. Setovanjem RD bita iniciran je proces čitanja, a zatim se RD bit automatski nakon čitanja vraća na 0. Podatak iz EEPROM memorije dostupan je u EEDATA registru odmah u narednom instrukcijskom ciklusu, odakle je premešten 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 neće se inicirati ukoliko nije tačno ispoštovana procedura (0x55 u EECON2, 0xAA u EECON2, setovan WR) i to bez pauza (otud zabrana interapta) za svaki pojedinačni bajt. Microchip navodi da je ta procedura uvedena kako bi se sprečio nehotičan upis u EEPROM zbog mogućih grešaka u programu. Iz istog razloga WREN bit je potrebno držati setovanim jedino za vreme upisa u EEPROM. WR bit se automatski resetuje po završetku upisa. U slučaju serijskog snimanja podataka u EEPROM, potrebno je pre sledećeg snimanja proveriti stanje ovog bita, kako se ne bi desilo iniciranje novog upisa u EEPROM a da prethodno snimanje još nije završeno. To je obavezno, jer snimanje u EEPROM nije sinhronizovano sa instrukcijskim ciklusom, već se za upis u EEPROM koristi poseban interni oscilator, koji određuje vreme upisa od oko 10mS. Kod čitanja podataka iz EEPROM memorije nema ovakvih problema. Umesto testiranja flaga moguće je i jednostavno sačekati dovoljno dugo (npr. 12mS). Možda Vam se mere inicijalne procedure i WRERR bita čine preteranim. Ali zapitajte se šta bi se desilo ukoliko bi u EEPROM memoriji čuvali npr. obrasce za prikaz broja na LED displeju. U slučaju korupcije EEPROM memorije PIC ni nakon reseta ne bi mogao nastaviti sa normalnim radom. Morao bi se odlemiti sa štampane pločice i ponovo programirati (u mikrokontroler se sa programom snima i sadržaj EEPROM memorije). U sledećem poglavlju upoznaćete se sa programom koji koristi EEPROM memoriju i naučićete upotrebu EEIF bita i proces upisa podataka u EEPROM iz samog asemblera. Na taj način se sadržaj EEPROM memorije može čuvati zajedno sa programom u jednom .asm ili .hex fajlu.

77

25. EEPROM i interapti
Sećate li se onog teškog? 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 (prekoračenje tajmera i završetak slanja podatka u EEPROM). Ima li svrhe koristiti završetak slanja podatka u EEPROM kao izvor interapta? Teško. Sav proces može se završiti linijskim kôdom. Opravdanje njenog korišćenja može se naći u vremenski kritičnim programima kod kojih je potrebno za vreme snimanja u EEPROM izvršavati druge operacije, kako mikrokontroler ne bi gubio vreme čekajući (čak 10mS) na završetak snimanja. Bolje je da program umesto čekanja na završetak upisa u EEPROM radi nešto korisno. Sada ćete se upoznati sa programom koji po pritisku na taster menja stanje na LED displeju od 9 do 0, i snima ga u EEPROM. Po isključenju napona napajanja i njegovom ponovnom dovođenju, na LED displeju naći će se poslednja zapamćena vrednost (to je i bio cilj u primeru sa bankom). Glavni program imaće jedino funkciju učitavanja i snimanja trenutnih vrednosti u EEPROM, a interapt rutinom će se realizovati sve ostalo (test prekidača, smanjenje broja, prikaz na displeju). Kod ovakvog programa očigledno je da interapt rutina traje daleko duže od samog glavnog programa. To se ovde može tolerisati. Električna šema je ista kao u delu sa tabelama. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definiše upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podešava konfiguracione bitove cblock 0x0C 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 ; Početak EEPROM memorije de 0x00 ; Inicijalizacija početne vrednosti na ; displeju ; ****** Interapt rutina – čuvanje sadržaja registra ****** org goto org movwf swapf movwf 0x00 Main 0x04 TEMPW STATUS,W TEMPSTATUS ; Ovde PC dolazi pri uključenju i resetu ; Odlazak na glavni program ; Ovde će početi interapt rutina ; Čuvanje sadržaja W registra u TEMPW ; STATUS sa okrenutim niblovima u W ; i zatim u TEMPSTATUS registar 78

; ****** Test prekidača ****** 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 izvršavao u BANK1 ; Testiranje otpuštenosti prekidača ; Nije otpušten ; Jeste otpušten. Idi na pauzu. ; Još jedno testiranje zbog imunosti na ; eventualna varničenja kontakta. ; Testiranje pritisnutosti prekidača ; Nije pritisnut ; Jeste pritisnut. Idi na pauzu. ; Još jedno testiranje zbog imunosti na ; eventualna varničenja kontakta.

; ****** Prikaz cifre na displeju ****** movf DISP,W ; DISP u W call Tabl ; Uzmi obrazac iz tabele, movwf PORTB ; i prikaži cifru na displeju. ; ****** Testiranje prekoračenja vrednosti cifre na displeju ****** decf DISP,F ; Smanji DISP za 1. Rezultat u DISP btfss DISP,7 ; Testiraj MSB. On će biti 1 jedino ukoliko je ; došlo do prekoračenja sa 0x00 na 0xFF goto Povr ; Nije, izađi iz interapt rutine movlw 0x09 ; Jeste, inicijalizuj brojac na movwf DISP ; vrednost 0x09 Povr swapf 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 odredištem. ; 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 - Uključeni interni movwf OPTION_REG ; pull up otpornici na PORTB movlw 0x01 ; b'00000001' u TRISB movwf TRISB ; RB0/INT kao ulaz, a ostali kao izlaz clrf TRISA ; Svi pinovi na PORTA su izlazni bcf STATUS,RP0 ; Povratak u BANK0

79

na adresu .2 retlw b'10011110' .3 retlw b'11001100' . U ovom trenutku snimanje je završeno pa se interapt flag setuje i nastaje interapt.WR Kraj btfss goto EECON1.W . Obrazac za crtanje cifre 1 . 0x00 . Inicira proces čitanja .WR Kraj . Test završetka snimanja . .RD .6 80 .WREN STATUS.9. Prikaži cifru na displeju . Dozvola pisanja u EEPROM .. ****** Tabela ****** Tabl movf DISP. Prebacuje program u BANK0 movf EEDATA. ****** Snimanje u EEPROM ****** Gla movf DISP. Povratak u BANK0 .0 do . Inicijalizacija brojača call Tabl .W movwf EEDATA movlw 0x00 movwf EEADR bsf STATUS. Povratak na početak programa . retlw b'01111110' . Zabrana pisanja u EEPROM .W . Obrazac za crtanje cifre 2 . . Sadržaj bajta sa adrese 0x00 iz . Želimo pročitati sadržaj EEPROM movwf EEADR . DISP u W . Ta vrednost se dodaje na PCL. EEPROM memorije bcf STATUS.RP0 . ****** Čitanje iz EEPROM memorije ****** movlw 0x00 .RP0 Gla . . bcf bcf goto EECON1.4 retlw b'11011010' . Uzmi obrazac iz tabele i movwf PORTB .5 retlw b'11111010' .f .0 retlw b'00001100' .WREN movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1. . .RP0 bsf EECON1. U interapt rutini čekaće se na pritisak prekidača. Obrazac za crtanje cifre 5 .1 retlw b'10110110' .PR0 . EEPROM memorije u W . Obrazac za crtanje cifre 4 . Prebacuje nas u BANK1 zbog EECON1 . ****** Inicijalizacija brojača i LED displeja ****** movwf DISP . Obrazac za crtanje cifre 0 . Prebacuje program u BANK1 bsf EECON1. U promenljivoj DISP nalazi se vrednost od addwf PCL. memorije sa adrese 0x00 bsf STATUS. Otključavanje upisa u EEPROM . Obrazac za crtanje cifre 6 . Obrazac za crtanje cifre 3 . smanjiće se vrednost na displeju i tek onda će se izaći iz nje i nastaviti dalji program. pa u EEDATA .

Povratak iz potprograma . kako se ne bi desilo da se i program greškom upiše u EEPROM. U EEPROM memoriji nije moguće izvršavati programe. 0xA8. U protivnom će mikrokontroler uzeti inicijalno stanje iz EEPROM memorije (0xFF) i pri nailasku na tabelu izvršavanje programa će se nastaviti za 245 bajtova iza same tabele. rutine return . Ova instrukcija. osim što traje jedan instrukcijski ciklus ne radi ništa korisno. vreme je da naučite jednu lenju instrukciju. Budući da je za nju potrebno prethodno definisati početak upisa u EEPROM memoriju (org direktivom i adresama od 21x00 do 21x3h). Budući da ćete se u idućem poglavlju upoznati sa uspavanim stanjem mikrokontrolera. Ukoliko bi se interapti zabranili. ****** Pauza zbog debouncing rutine ****** Pau decfsz BROJAC. u petljama kašnjenja ili debouncing rutini). kao da je nema. program ne bi skočio na interapt rutinu. ****** Kraj programa ****** end . Preći će preko nje. što će izazvati nepravilan rad (tačnije resetovanje) mikrokontrolera. utrošiće jedan instrukcijski ciklus nizašta. Obrazac za crtanje cifre 7 . Možda ste primetili da u rutini za snimanje u EEPROM nije izvršena zabrana korišćenja svih interapta resetovanjem GIE bita. ovako: de 0x05. Sve preko ove vrednosti povećava verovatnoću nastupa kvara adrese.. Jedna EEPROM memorijska lokacija može se menjati do 1 milion puta. Pauza zbog debouncing goto Pau . ostali bi se morali privremeno zabraniti. isto kao što se ni iz programa ne može čitati (a ni menjati) sadržaj programske memorije (bar kod PIC16 serije). ukoliko se koristi više izvora interapta.F .retlw retlw retlw b'00001110' b'11111110' b'11011110' . To je NOP (eng. Obrazac za crtanje cifre 9 - 7 8 9 . Define EEPROM) direktive. ova EEPROM adresa bi se usled starenja pokvarila (kao ogrebotina na DVD disku). ili kratko kašnjenje (npr. Njom se jedan (ili više) bajtova smeštaju u EEPROM. razlika svakako postoji. Kada program mikrokontrolera naiđe na nju. 0x79. možete bajt po bajt iza DE direktive odvojiti zarezom. Pri smeštanju više bajtova u EEPROM. Uglavnom se koristi u situacijama kada je potrebno realizovati tačno određeno. No Operation).. i neprestano bi se vrteo u petlji snimajući jedan isti bajt u EEPROM adresu 0x00. Obrazac za crtanje cifre 8 . najpraktičnije je staviti je ispred ili iza programa. To je u programu učinjeno upotrebom DE (eng. Naravno. 81 . Ukoliko bi se ovo dovoljno dugo ponavljalo. Kraj programa Prilikom snimanja kôda u PIC16F84 mora se sadržaj memorijske adrese 0x00 u EEPROM memoriji podesiti na proizvoljan broj između 0x00 i 0x09. Iako izgleda da je EEPROM na neki način produžetak programske memorije.

na svim pinovima je logička 1 (uključeni su interni pull up otpornici). Resetom preko isteka vremena WDT. Očigledno je da u aktivnom stanju mikrokontroler radi samo povremeno (u trenutku povećanja ili smanjenja nivoa vode). to iznosi samo oko 8 merenja dnevno. U SLEEP modu blokira se rad glavnog oscilatora. tako da je na svim pinovima logička 0. a WDT se (ukoliko je uključen) resetuje (ali nastavlja sa radom zbog sopstvenog oscilatora). a očitavanje nivoa vode se vrši interaptom pri promeni stanja na pinovima RB4 do RB7. i bespotrebno trošeći struju iz akumulatora. i upis vremena i nivoa vode u EEPROM memoriju). bitovima 4 do 7. Negativni pol akumulatora (masa) spojen je sa rekom. Sleep mod .26. koji su povezani sa odgovarajućim sondama na po 5cm dubine. Preostalo vreme mikrokontroler će se vrteti u praznoj petlji čekajući na interapt. Interaptom na RB0/INT pinu. interaptom pri promeni stanja na PORTB registru. Portovi zadržavaju svoja stanja (izlaz – 0. RA4/T0CKI pin bi takođe trebao biti na stabilnom nivou (ne bi smeo biti izlazni sa logičkom 1 jer je ne može dati). Ukoliko Vam je potrošnja struje izuzetno bitna. voda se ponaša kao provodnik između mase i sondi. i da prikupljene podatke povremeno (po popuni EEPROM memorije) prebacujete u laptop. izlaz – 1 ili ulaz – stanje visoke impedanse). Kada je nivo vode iznad najvišlje. Potrošnja mikrokontrolera pada sa oko 2mA na oko 5μA. 82 . u idućim poglavljima. Kada je nivo vode ispod najniže sonde. Da biste proverili da li reka ima dovoljan protok vode tokom cele godine. tajmer prestaje sa radom.5V bez gubitka podataka. Kako na reci nema električne mreže. koji mu omogućavaju memorisanje tačnog trenutka rasta ili opadanja nivoa vode. Mikrokontroler je povezan sa digitalnim časovnikom i dodatnom EEPROM memorijom. U SLEEP mod ulazi se SLEEP instrukcijom. 2. SLEEP „spavajući“ mod predstavlja stanje u kojem se mikrokontroler nalazi u režimu smanjene potrošnje energije. Napon napajanja mikrokontrolera može se spustiti i do 1. a iz njega se mikrokontroler može „probuditi“ na tri načina. 1. Instrukcije se prestaju izvršavati. mikrokontroler se napaja iz akumulatora. ili interaptom izazvanim završetkom upisa u EEPROM. možete kupiti verzuju mikrokontrolera specijalno napravljenu za rad sa što manjom potrošnjom struje. Za najmanju moguću potrošnju potrebno je projektovati spoljna elektronska kola tako da ne vuku struju iz izlaznih pinova portova. i veoma kratko (vreme potrebno za čitanje tačnog vremena iz sata. Kako će tokom 24h najverovatnije nastupiti jedan period plime i oseke. i da ulazne pinove postave na stabilan logički nivo (0 ili 1). odlučili ste da merite njen nivo mikrokontrolerom.pojam Pretpostavimo da želite napraviti hidroelektranu. Dovođenjem logičke nule na MCLR pin mikrokontrolera. Više o resetu. što prouzrokuje reset mikrokontrolera. 3.

Interapt izazvan tajmerom ne može se koristiti za buđenje iz SLEEP moda. Tako mikrokontroler može povremeno izvršiti poneku operaciju. Digit Carry/borrow) bit „bit prekoračenja/pozajmice cifre“ indikuje prekoračenje ili pozajmicu donjem niblu nastalu zbog izvršavanja instrukcija sabiranja ili oduzimanja. Time-Out) „prekoračenje vremena“ bit je na stanju logičke 0 nakon isteka WDT. Power-Down) bit postavlja se na 1 po dolasku napona napajanja ili izvršenju CLRWDT instrukcije. kako bi se mogao nastaviti započeti program. Ulaskom u SLEEP mod. oduzimanja ili rotacije. i izvršenju CLRWDT ili SLEEP instrukcije. a u stanju logičke 1 po dolasku napona napajanja. i na osnovu njegovog stanja zaključiti da li se radi o prvom uključenju mikrokontrolera.BANK0 – 0x00-0x7F 1 . Možda vam čudno izgleda buđenje iz SLEEP moda istekom WDT. 83 . a na 0 po izvršenju SLEEP instrukcije. Kako istek WDT prouzrokuje softverski reset mikrokontrolera program mora po resetu testirati TO bit. menja se stanje određenih bitova STATUS registra. Vreme je da napokon proučite i njegovu unutrašnju strukturu. On se u mikrokontroleru koristi za povremeno buđenje iz SLEEP moda. Logička nula na ovom bitu ukazuje da je rezultat različit od 0. PD (eng. ● ● ● ● ● Kao što vidite iz samog STATUS registra. jer je u SLEEP modu i tajmer uspavan. Trebaju biti u stanju logičke 0.BANK1 – 0x80-0xFF TO (eng. Logička jedinica na C (eng. Carry/borrow) bitu „bitu prekoračenja/pozajmice“ ukazuje da je došlo do prekoračenja ili pozajmice u bajtu nad kojim su se izvršile operacije sabiranja. i ponovni ulazak u SLEEP mod. Bit 5 (RP0) koristi se kod direktnog adresiranja za izbor banke podataka po sledećem : 0 . DC (eng. U sledećem poglavlju upoznaćete se sa specifičnostima upotrebe interapta u SLEEP modu. Na osnovu stanja ovog bita program može detektovati da je reset mikrokontrolera nastao usled prekoračenja WDT. ili o prekidu nastalom istekom WDT. U praksi se mnogo češće sreće buđenje interaptima. izvršenje SLEEP instrukcije prouzrokuje resetovanje PD bita i setovanje TO bita. a opet će većinu vremena provesti spavajući (i trošeći manje struje). Logička jedinica na Zero “nultom” bitu pokazuje da je rezultat zadnje aritmetičke ili logičke operacije jednak 0. bit7 / ● ● / RP0 TO PD Z DC bit0 C Bitovi 7 i 6 ne koriste se u PIC16F84. obavljanje određene operacije.

Ali. Nakon 5 prikazanih kombinacija. Stanje postavljeno na displeju snima se u memoriju mikrokontrolera primenom indirektnog adresiranja. Naime.27. Promenljiva za W registar TEMPSTATUS . 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. U tom slučaju. Sada ćete se upoznati sa programom koji ilustruje upotrebu SLEEP moda i buđenje iz njega na oba načina (sa setovanim i resetovanim GIE). Definiše upotrebljeni mikrokontroler #include <p16F84. SLEEP instrukcija se neće izvršiti. Program se sastoji iz dva dela. pa neće biti resetovan WDT i njegov preskaler. U prvom delu. program ulazi u SLEEP mod. izvršavanje programa nastavi iza SLEEP instrukcije. resetovan PD bit i setovan TO bit. Promenljiva za rotaciju endc . ukoliko je u SLEEP modu GIE setovan.36 RAM memorija za snimanje stanja prekidača org goto 0x00 Main . Odlazak na glavni program 84 . Podešava konfiguracione bitove cblock 0x0C TEMPW . slika će se na displeju prikazivati kombinacijom pinova PORTA i PORTB registra (tačnije pinovima RA0 do RA4 i RB1 do RB3).32 – . . Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . U drugom delu. i od korisnika se zahteva da postavi kombinaciju tastera T1 do T4. . Zbog toga je potrebno ručno resetovati WDT (ukoliko se koristi) neposredno pre SLEEP instrukcije. Buđenje iz Sleep moda Buđenje iz SLEEP moda interaptima razlikuje se od običnih interapta po tome što je moguće da se umesto skoka na interapt rutinu. pri interaptu (dozvoljenim odgovarajućim interapt flagom) će se probuditi i nastaviti dalje izvršenje programa. pri interaptu će se mikrokontroler probuditi i skočiti na interapt rutinu. to se može proveriti testiranjem PD bita STATUS registra. Kako je zbog interapta i internih pull up otpornika potrebno da prekidači budu na portu B. program se ponavlja iz početka. Ovde PC dolazi pri uključenju i resetu . Promenljiva za STATUS registar TEMP . bez skoka na interapt rutinu. kao u običnom programu.inc> . Po izazivanju interapta (T5) snimljene kombinacije se čitaju i prikazuju na displeju sa uključenom decimalnom tačkom (segment dp na displeju). U slučaju da je potrebno saznati da li se izvršila SLEEP instrukcija. ukoliko je GIE resetovan. Nakon postavljenog željenog broja pritisne se T5 izazivajući novi interapt (RB0). Postupak se ponavlja sve dok se ne snimi 5 kombinacija. ****** Inicijalizacija i imenovanje ****** list p=16F84 . U zavisnosti od trenutka sticanja uslova za pojavu interapta moguće je da se interapt dogodi neposredno pre SLEEP instrukcije. mikrokontroler se ponovo uspavljuje ali tako da interapt prouzrokuje njegovo buđenje i nastavak programa bez skoka na interapt rutinu.

Indirektno snimanje u željeni registar incf FSR. Nije.INTF .W .F . Uzmi sliku za displej iz tabele. i zatim u TEMPSTATUS registar swapf andlw PORTB. ****** Interapt rutina za prvi deo programa – normalne interapte ****** org 0x04 . idi na deo za prekidače T1 do T4. Interapt izazvan prekidačem T5? goto T14 . Čuvanje sadržaja W registra u TEMPW swapf STATUS. STATUS sa okrenutim niblovima u W movwf TEMPSTATUS . 85 . Maskiraj neželjene bitove . Ovde će početi interapt rutina movwf TEMPW .INTF .. Uzmi stanje sa porta i zameni stanje niblova.W . . ****** Interapti izazvani prekidačima T1 do T4 ****** call Tabl . ****** Interapti izazvani prekidačem T5 ****** movwf INDF . b'00001111' . ****** Test interapta izazvanog prekidačem ****** btfss INTCON. Vrati sadržaj W i STATUS registra bcf INTCON. Pozicioniranje pointera na sledeći registar call Vrat . Obriši interapt flag prekidača T5 retfie . Vrati se iz interapt potprograma .

Obrazac za crtanje cifre 6 . Obrazac za crtanje cifre 9 .5 b'01010000' . Obrazac za crtanje cifre 1 . a drugi put sa W kao odredištem. INTEDG=0 . Nacrtaj sliku. Povratak iz potprograma. Vrati se iz interapt potprograma TEMPSTATUS.1 b'10010100' .7 b'00010000' .call call bcf retfie Vrat swapf movwf swapf swapf return Nacr .B b'11010000' . Povratak iz potprograma. na mesto bita 1 (isto se moglo realizovati . Obrazac za crtanje cifre 4 .F .C b'00110100' . Obrazac za crtanje cifre 7 . RB2 i RB3 izlazni.A b'01110000' . . i sa 4 RRF instrukcije) movwf PORTB . Vrat . Prebacuje program u BANK1 movlw b'11110001' . Pošalji u PORTA bitove RA0 do RA4 movwf TEMP . u W. Zameni mesta niblovima tako da RB1 bit dodje . Obrazac za crtanje cifre 0 .4 b'01010010' .Interapt se izaziva pri 86 . Obrazac za crtanje cifre 2 . TEMPSTATUS sa okrenutim niblovima . a RB1. . bez decimalne tačke b'00011000' . Vrati sadržaj W i STATUS registra INTCON.9 b'00010001' . (0x00 do 0x0F) se dodaje na PCL . Dva puta okrenuti niblovi daju . Vrednost u W od b'00000000' do b'00001111' . prvobitno stanje koje ide u STATUS .RBIF . . pinovi RB0 i RB4 do RB7 ulazni.RP0 .W . ****** Glavni program – inicijalizacija ****** Main bsf STATUS.6 b'00011111' .D b'11010000' . Obriši interapt flag prekidača T1 do T4 . Obrazac za crtanje cifre 8 .F TEMPW. TEMPW registru. .W STATUS TEMPW. Obrazac za crtanje cifre F . ****** Tabela ****** Tabl addwf PCL. Pošalji u TEMP registar zbog zamene niblova swapf TEMP. Jednom okreni niblove u samom . Obrazac za crtanje cifre D . clrf TRISA .E b'11010001' .0 b'00111111' .W . Pošalji u PORTB bitove RB1 do RB3 return . ****** Potprogram za crtanje slike na displeju ****** Nacr movwf PORTA . Svi pinovi porta A izlazni movlw b'00000000' . Obrazac za crtanje cifre E . Obrazac za crtanje cifre 5 . Obrazac za crtanje cifre 3 .F retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw .8 b'00010010' .3 b'00110011' . Obrazac za crtanje cifre B .2 b'00010110' . Obrazac za crtanje cifre A. movwf TRISB . Obrazac za crtanje cifre C .

RP0 . U ovom trenutku snimljeno je svih 5 vrednosti u RAM adrese od . call Nacr . andlw b'00001111' . movwf PORTB . . pull up otpornici na PORTB . FSR u W . Jeste. ****** Prvi deo programa – setovan GIE. Međutim. normalni interapti ****** Poc sleep . RBIE – RB Interrupt enable (1 – uključi) . Sada je potrebno proveriti da li . Povratak u BANK0 . Proveri jesu li interapti zaista zabranjeni . ****** Uključi interapte ****** bsf STATUS. FSR treba biti od . Uključi SLEEP mod . Uzmi stanje sa porta i zameni stanje niblova. registra sabiranjem. bolje je ovde proveriti vrednost FSR .RP0 . Test prekoračenja. Obriši LED displej (segmenti na PORTB) 87 . . Povratak u BANK0 . na registar .219 = setovan Carry . interaptima se nastavlja glavni program ** movlw 0xFF . Nacrtaj sliku. Uzmi sliku za displej iz tabele. Maskiraj neželjene bitove call Tabl . . ** Drugi deo programa – resetovan GIE. Zabrani nove interapre . Sada se treba zabraniti odlazak na interapt potprogram. Još nema prekoračenja.movwf bcf Opet movlw movwf OPTION_REG STATUS. INTE – RB0 Interrupt enable (1 – uključi) . RBIF – Interapt flag za T1-T4 (0 – obriši) bcf STATUS. testa Zero flaga. jer je moguće da se (npr. Zabr bcf btfsc goto INTCON. INTF – Interapt flag za T5 (0 – obriši) movwf INTCON .C Poc .36 .GIE Zabr . uzastopnih interapta i tako snime vrednosti u još par narednih RAM adresa.219 STATUS.W . zabrani ih opet. movwf PORTA .37 i više + . Prebacuje program u BANK1 movlw b'10011000' . Inicijalizacija pointera RAM memorije . da se to dogodi.W . ******* Postavi sliku na displeju pre uključenja interapta ****** swapf PORTB. Obriši LED displej (segmenti na PORTA). opadajućoj ivici signala (sa 1 na 0) .32 do . usled debouncinga na T5) izazove više .GIE INTCON. Spavaj i dalje. U ovom trenutku program se vratio iz interapt rutine. Čak i .32 . GIE – Global interrupt enable (1 – uključi) .32 FSR .32 do . movf addlw btfss goto FSR. Nisu. testom Carry flaga može se detektovati taj slučaj za razliku od . . je snimljeno svih 5 vrednosti.36 .Uključeni interni . NOT_RBPU=0 .RP0 .

Naime.36 . Utroši jedan instrukcijski ciklus . GIE – Global interrupt enable (0 – isključi) . Uzmi sliku za displej iz tabele. Pozicioniranje pointera na sledeći registar . Spavaj i dalje. na interapt potprogram nop . Zato se pri korišćenju SLEEP moda ne može vršiti merenje vremena brojanjem instrukcijskih ciklusa instrukcija u programu. nije mu baš lako da odjednom počne proizvoditi čiste taktove.4 FSR. Počni program iz početka. INTF – Interapt flag za T5 (0 – obriši) movwf INTCON . vreme za njegovu stabilizaciju je skoro trenutno. iako bi sada slobodno mogao biti sa XOR . Kako RC oscilator najlakše počinje sa oscilacijama. mikrokontroler se neće moći probuditi iz SLEEP moda. . RBIF – Interapt flag za T1-T4 (0 – obriši) bcf STATUS. Ima prekoračenja.bcf movlw movwf PORTA. Inicijalizacija pointera RAM memorije . Test prekoračenja je isti kao i ranije. operacijom movf addlw btfss goto goto FSR. FSR treba biti od . .RP0 . U ovom trenutku pritisnut je prekidač T5. Još nema prekoračenja. Uspavaj mikrokontroler do pojave interapta.32 . ****** Kraj programa ****** end U Sleep modu oscilator je nestabilan prilikom buđenja. INTE – RB0 Interrupt enable (1 – uključi) . . . movf call call bcf incf INDF. Test prekoračenja.32 FSR . Nacrtaj sliku. . Indirektno čitanje željenog registra . Sve dok se stabilizacija takta ne završi. Buđenje neće biti moguće dok se oscilator ne stabilizuje. Povratak u BANK0 . ****** Ponovo uspavaj mikrokontroler ****** Spa sleep .RP0 .219 STATUS. nastavi program bez skoka . dok je kod upotrebe ostalih vrsta oscilatora potrebno 1024 takta oscilatora za kompletnu stabilizaciju. čak iako se buđenje interaptom dešava tačno određeno vreme nakon ulaska u Sleep mod. Uključi segment decimalne tačke. Preporučljivo nakon buđenja . Kraj programa . Uključi segment decimalne tačke.C Spa Opet .W Tabl Nacr PORTA. FSR u W . .32 do . Prebacuje program u BANK1 movlw b'00010000' . na registar . . . Po njegovoj pojavi. ****** Zabrani buđenje iz sleep moda prekidačima T1 do T4 ****** bsf STATUS.219 = setovan Carry .W .4 . pošto je oscilator za vreme spavanja blokiran. RBIE – RB Interrupt enable (0 – isključi) .37 i više + .F . 88 .

Šta se dobija upotrebom ovakvog brojača? Umesto da se interapt izaziva prilikom svakog impulsa. Za odnos preskalera od 1:1 to znači da će se interapt izazivati nakon svakog 255-og impulsa. interapt se izaziva kao kod tajmera. Očigledno je da bi ovakaj princip brojanja zauzeo najviše resursa mikrokontrolera. Dakle. Međutim.0025km/h ukoliko već vozite biciklu preko 30km/h? Teško da će biti ukoliko ne idete na „Tour de France“ (poznata biciklistička trka u Francuskoj). U praksi se često javlja potreba za brojanjem većih vrednosti. Na primer. jedan bi se iskoristio za brojanje eksternih impulsa. kako brojati sa zaokruženjem? Potrebno je podesiti tajmer tako da umesto instrukcijskih ciklusa broji impulse sa RA4/T0CKI pina. Counter). trajanje logičke 0 i 1 eksternog takta mora biti duže od 3 takta oscilatora PIC16F84 (tačnije oko 2 takta + 20nS). 89 . koji dodatno hardverski dele ulazni signal. U slučaju odnosa preskalera 1:1. a ipak može pravovremeno odgovoriti na spoljne impulse. Ovde su moćniji mikrokontroleri u prednosti zbog postojanja više tajmera. pri čemu se rezolucija brojača zaokružuje na dovoljan broj decimala. 74390 ili 4040). Preskaler se podešava kao kod tajmera.28. Brojač Kako možete brojali spoljne signale? Jedan od mogućih načina predstavlja neprekidno testiranje pina na logičku 0 pa na logičku 1 iz glavnog programa (eng. pooling). Poređenjem ove dve vrednosti može se lako dobiti frekvencija eksternog signala. izazivaće se tek prilikom prekoračenja brojača. Drugi način je interaptima. setovanjem T0CS bita OPTION_REG registra. Tako za glavni program ostaje mnogo više resursa. čak se i upisivanjem u TMR0 registar inicijalizuje tajmer i preskaler. Na taj način Timer0 ima funkciju brojača (eng. Ograničenjem minimalnog trajanja logičke 0 i logičke 1 ograničen je i maksimalni takt koji može meriti mikrokontroler. ovo se može efikasno rešiti korišćenjem eksternih integrisanih delitelja signala (npr. sve je ostalo isto. Njima je mikrokontroleru ostavljeno dovoljno vremena za glavni program. Za više detalja pogledajte AN689 Voje Antonića i AN592. a u slučaju bilo kog drugog odnosa duže od 5 takova (tačnije 4 takta + 40nS). a drugi za to vreme može generisati stabilnu vremensku bazu. Osim promene izvora takta tajmera. Da li Vam je toliko bitna razlika u brzini od 0.

Reset Najjednostavnije rečeno. Možete izvršiti softverski reset namernim izostavljanjem CLRWDT instrukcije u željenom delu programa. testiranjem stanja TO i PD bitova STATUS registra. i na osnovu toga nastaviti rad programa. Poslednji izvor reseta naučili ste u delu sa WDT. Unutar mikrokontrolera nalazi se malo električno kolo koje detektuje porast napona napajanja do napona dovoljnog za rad mikrokontrolera. PIC16F84 ima 3 izvora reseta. Obično se to realizuje povezivanjem sa naponom napajanja preko otpornika od 10kΩ. koji bi mogli prouzrokovati nehotični reset mikrokontrolera. Drugi izvor reseta je MCLR pin mikrokontrolera. mikrokontroler se resetuje. 90 . može se uključiti PWRTE (eng. mikrokontroler se resetuje. i jer se ne koristi.29. Power-up Timer Enable) konfiguracioni bit koji drži mikrokontroler u stanju reseta oko 72mS od dovođenja napona napajanja. Za svaki slučaj u ulaznom stepenu ovog pina postavljen je Šmitov okidač koji ima ulogu filtriranja slabih impulsa. TO 1 1 0 0 1 1 1 PD 1 0 0 1 0 1 1 Stanje Stanje nakon izvršenja CLRWDT instrukcije Stanje nakon izvršenja SLEEP instrukcije WDT reset za vreme SLEEP moda WDT reset za vreme normalnog izvršavanja programa MCLR reset za vreme SLEEP moda ili buđenje interaptom MCLR reset za vreme normalnog izvršavanja programa POR reset pri dolasku napona napajanja U prilogu ovog uputstva možete videti inicijalno stanje svih registara nakon reseta. Iako reset prvenstveno služi za ponovni start programa. Prvi je svakako reset prilikom dovođenja napona napajanja (eng. Nakon što se ovo kašnjenje završi. On mora uvek biti držan na logičkoj jedinici. mikrokontroler (za svaki slučaj) čeka još 1024 takta oscilatora pre nego što počne izvršavati program. Ukoliko je potrebno. U šemama u ovom uputstvu on je spojen direktno zbog veće preglednosti šeme. To je dovoljno da se napon napajanja podigne na nominalnu vrednost i da oscilator mikrokontrolera počne proizvoditi čiste neprigušene oscilacije. POR – Power-on Reset). reset služi da izvršavanje programa počne iz početka. U trenutku dostizanja nominalnog napona. moguće je utvrditi na koji način je izazvan reset. Ovo kašnjenje realizovano je internim RC oscilatorom nezavisnim od takta oscilatora. Ovim se sprečava rad mikrokontrolera pri preniskom naponu napajanja. Pri dovođenju logičke 0 na ovaj pin (spajanje sa masom).

Postavljanjem pina na logičku 0 ili 1. Srce mikrokontrolera Isto kao što Vaše srce pumpa krv određenim ritmom. Tako se može grubo menjati frekvencija oscilatora. Oni se dobijaju iz oscilatora. pa ni ovaj signal više nije dostupan. Što se tiče mikrokontrolera. (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 može se koristiti za pun opseg frekvencija mikrokontrolera (DC do 4MHz. mikrokontroler za svoj pravilan rad mora imati tačno podešene taktne impulse. zbog preporučenih vrednosti otpornosti (do 100kΩ) nije 91 . Microchip kalibracioni niz snima u deo programske memorije. moguće je primenjujući male softversko hardverske trikove indirektno uticati na njegovu frekvenciju. 1340 3500 2660 4610 Kapac. odnosno do 20MHz za brže verzije PIC16F84 mikrokontrolera). korišćen u dosadašnjim šemama. Sastoji se samo od kondenzatora i otpornika. Mana mu je loša stabilnost frekvencije i „šetanje“ frekvencije usled promene temperature. a kapacitivnosti preko 20pF. Dovoljno je npr. jednim pinom mikrokontrolera uključivati paralelno povezivanje otpornika u RC članu. U nekim PIC mikrokontrolerima (nažalost ne u PIC16F84) nalazi se integrisani hardverski RC oscilator. Ovaj princip može biti iskorišćen za smanjenje frekvencije oscilatora u periodima kada mikrokontroleru nije potrebna puna brzina čime bi se istovremeno smanjila potrošnja mikrokontrolera. on će bez problema raditi čak i sa taktom oscilatora manjim od 1Hz. Kao lenjivac. Na OSC2 pinu pri radu RC oscilatora dobija se četvrtina takta oscilatora. Preporučene vrednosti otpornosti su od 3kΩ do 100kΩ. U ovom poglavlju biće prikazane šeme hardverskog povezivanja raznih vrsta oscilatora. (Khz) 26 83 243 311 428 756 Najjeftiniji je svakako RC oscilator. Kasnije se ovaj niz može pročitati i softverski podesiti. Gornja granica kapacitivnosti zavisi isključivo od željene maksimalne frekvencije. Zbog preciznijeg takta. što se može iskoristiti za sinhronizaciju dodatnih eksternih uređaja sa mikrokontrolerom. Međutim. Iako je oscilator mikrokontrolera nezavistan od ostatka hardvera.30. smanjujući rezultujuću vrednost otpornosti. i biće bliže objašnjene njihove specifičnosti. Frekv. U SLEEP modu oscilator se blokira. U tablici su date vrednosti otpornosti i kapacitivnosti za dobijanje željenih frekvencija. dodatni otpornik će se paralelno spojiti sa već postojećim otpornikom.

Za ova 3 načina sa kristalnim oscilatorom primenjuje se sledeća šema: Frekv. HS mod mogu koristiti jedino tipovi PIC16F84 mikrokontrolera predviđeni za rad na visokim frekvencijama. Konfiguracioni bitovi trebaju u tom slučaju biti podešeni na LP. (pF) 68-100 15-30 68-150 22-100 15-68 15-68 10-68 10-22 5-10 Konfig.romanblack. bitovi LP LP XT XT XT XT HS HS HS Dizajn internog oscilatora zahteva upotrebu paralelno rezanog kristala. Njihova upotreba u šemi kristalnog oscilatora dovešće do frekvencije koja odstupa od specifikacija u karakteristikama proizvođača kristala. A ukoliko je brzina imperativ. Međutim. zbog smanjenja interferencije. sat na baterije) PIC treba raditi sa 32KHz-200KHz kristalom. mogu se kupiti verzije PIC16F84 mikrokontrolera koje mogu bez problema raditi na taktu većem od 4MHz. 4000 8000 16000 20000 Kapac. 92 . Zbog toga se može umesto samo otpornika uključivati dodatni RC član.preporučljivo ovim načinom menjati frekvenciju u većim opsezima. (npr.com/ u delu PIC with 2 clock speeds! Ukoliko je potrebno rad mikrokontrolera sinhronizovati sa eksternim uređajima. Na manjem taktu zbog manjeg pojačanja integrisanog oscilatornog kola PIC troši manje struje nego inače. Za ovakvu vrstu oscilatora treba podesiti konfiguracioni bit oscilatora na – OSC LP. Nažalost. OSC2 pin je poželjno povezati na masu mikrokontrolera preko otpornika veće vrednosti (10kΩ). ali jedino uz eksterno oscilatorno kolo. XT ili HS. Za njega je potrebno konfiguracioni bit podesiti kao . U najvećem broju slučajeva može se izostaviti. može mu se spolja obezbediti spoljni takt.OSC XT. Ukoliko nije potrebna velika brzina izvršavanja instrukcija. iako to povećava potrošnju mikrokontrolera. a bitna je potrošnja i stabilnost frekvencije. i redno rezani kristali mogu se koristiti kao izvor takta. Više o ovom principu imate na sajtu http://www. one su i skuplje. Njihov konfiguracioni bit potrebno je podesiti kao – OSC HS. U ovom modu zbog najvećeg pojačanja integrisanog oscilatornog kola PIC16F84 troši najviše električne energije. dobar izbor bi bio kristalni oscilator do 4MHz. Ukoliko je bitna stabilna frekvencija a i cena PIC16f84. (Khz) 32 200 100 455 2000 Otpornik je potreban samo za retke tipove kristala.

Grejačem i termostatom reguliše se konstantna temperatura kristala iznad sobne temperature. Keramički oscilator obično je zajedno sa kondenzatorima spakovan u zajedničko tropinsko kućište. Za detalje o tipovima oscilatora. Za napajanje grejača potrebno je dovesti spoljni izvor napajanja koji nažalost dodatno povećava potrošnju kola. Kako su takvi kristali (i takva kućišta) dosta skuplji od običnih. Takvi elementi nazivaju se keramički rezonatori. uz uslov da se njime može postići željena brzina oscilatora.Ukoliko želite imati izuzetno stabilnu frekvenciju možete umesto običnih koristiti OCXO (eng. Najbolje je koristiti oscilator sa najmanjim mogućim pojačanjem. oduzimanjem.com/ u delu Simple xtal oven for accurate clocks. Međutim. Veća kapacitivnost kondenzatora povećava stabilnost oscilatora. Ukoliko želite da se određeni deo programa izvršava 5 puta. probajte promeniti konfiguracione bitove oscilatora. ova 3 stanja konfiguracionih bitova (LP. tako da je temperaturni drift frekvencije kristala minimalan. XT i HS) razlikuju se jedino u pojačanju internog invertora oscilatornog kola što omogućava različit opseg frekvencija.microchip. upotrebu svih 35 instrukcija i svih 15 registara. Oven Controlled Xtal Oscillator) kristale koji u istom kućištu imaju kristal. dekrementacijom pa čak i rotacijom. U principu. Čestitam! Sada znate funkcije svih pinova mikrokontrolera. ali takođe povećava i vreme potrebno za stabilizaciju oscilatornog kola pri uključenju mikrokontrolera ili buđenju iz SLEEP moda. Ukoliko Vam se desi da neki kristal ne može proraditi u jednom modu. potrebno brojanje možete implementovati sabiranjem. pogledajte AN588 sa http://www. grejač i termostat.romanblack. U sledećim poglavljima upoznaćete se sa najčešće korišćenim softversko hardverskim tehnikama za realizaciju određenih zadataka. Skoro svaki softverski problem može se rešiti na više načina. možete ih sami napraviti sledeći uputstva sa sajta http://www. 93 . tek ste počeli sa učenjem.com/. inkrementacijom.

Npr. asembler može izračunati i vrednosti određenih logičkih operacija. ~((BROJ1&BROJ2)^BROJ3). One su dovoljne za analizu bilo kog asemblerskog (pa čak i disasembliranog) programa. Idi na potprogram Na isti način za duplo kraću pauzu možete napisati: movlw call PAUZA / 2 . PAUZA / 2 = . Unutar potprograma tu vrednost koristite kao broj milisekundi. i ona će na svom mestu ubaciti odgovarajuću instrukciju prelaska (bcf STATUS. MPASM direktive i makroi Ranije ste naučili par najkorišćenijih mogućnosti MPLAB asemblera. Dovoljno je iza nje navesti naziv registra kome pristupate. Na primer: – – – – – – ~ komplement << rotacija ulevo (bez Carry Flaga) >> rotacija udesno (bez Carry Flaga) & AND ^ XOR | IOR I kod njih se prioriteti definišu zagradama. (8-6)*5.RP0). Pretpostavimo da vam u programu zatreba pauza duplo dužeg trajanja. možete napisati sledeće: movlw call PAUZA * 2 . One u svakom slučaju moraju biti poznate pre računanja. Već znate kako deluje equ direktiva.RP0 ili bsf STATUS.200 Cekaj . Koristite banksel direktivu. Osim matematičkih. Npr. Pretpostavimo da ste imenu PAUZA pridružili decimalnu vrednost 100. Idi na potprogram Asembler u oba slučaja za vreme asembliranja računa vrednosti koje se trebaju naći na određenim mestima. 94 . PAUZA * 2 = . U ovom poglavlju naučićete par asemblerskih specifičnosti kojim će Vaš program biti čitljiviji i kojim ćete smanjiti mogućnost pojave grešaka prilikom njegovog pisanja.50 Cekaj . Neke od aritmetičkih operacija koje može izvršiti asembler su sledeće: – – – – – – * / % + - negacija (po drugom komplementu) množenje deljenje moduo (ostatak pri deljenju) sabiranje oduzimanje Željeni prioritet operacija može se definisati zagradama. Umesto imenovanja još jednog broja.31. Da li Vam je zamoran prelazak iz banke u banku? Ko bi pamtio treba li se RP0 bit setovati ili resetovati! Ne morate.

Da li je taster pritisnut? Prit . definisani izvan makroa port. Da li je taster pritisnut? .pin . Označava da su labele ili registri . Direktiva za oznaku kraja makroa Kad god je unutar programa potrebno na osnovu pritisnutog tastera otići na Prit ili Otpu delove. Na taj način moguće je i unutar glavnog programa i unutar makroa imati labelu istog naziva. U makrou ona mora biti definisana kao interna. Taster je povezan na RA3 pin . dovoljno je kasnije umesto gornjeg koda napisati samo oznaku labele makroa i parametra „Test TASTER“. vrednosti port i pin unutar makroa uzeće ove vrednosti. Određuje ulazne parametre Prit. #define Test macro extern btfsc goto goto endm TASTER PORTA. što znači da joj program spolja ne može pristupiti. Jeste . Jeste . Za to se koriste makroi. Zamenom dela teksta za tim nema potrebe.3 .3 . Nije i dalje je potrebno pamtiti na kom je portu povezan taster. morate obratiti pažnju na moguće zaokruživanje broja (na primer prilikom deljenja). Zbog toga je potrebno unutar makroa definisati korišćene unutrašnje i spoljne labele i registre. Na taj način se u makro ubacuju željeni parametri. Kako je imenom TASTER zamenjena oznaka odgovarajućeg porta i pina. Nije #define direktivom nije moguće zameniti veći deo koda (2 ili više instrukcija). Labele definisane kao eksterne mogu se pozivati i iz makroa. kako se makro poziva iz spoljnog programa. Za kompletno uputstvo o upotrebi makroa. Nije .3 rečju TASTER . Jeste Otpu . Ukoliko u programu imate ovakav deo: TASTER equ btfsc goto goto 3 PORTA.Otpu . Čak je moguće u makro preneti određene parametre ranije definisane. 95 .TASTER Prit Otpu .com/. #define btfsc goto goto TASTER TASTER Prit Otpu PORTA. Da li je taster pritisnut? . Sledeća pogodnost koju pruža MPLAB asembler je zamena teksta. poželjno je da labele i registri unutar makroa ne dođu u konflikt sa delovima programa izvan makroa.pin . Isto tako. Međutim. Unutar makroa moguće je koristiti sve instrukcije kao i u glavnom programu. direktiva i aritmetičko logičkih operacija pogledajte DS33014J sa http://www.Prilikom ovakvih vrednosti morate biti sigurni da parametar ne može izaći izvan dozvoljenih granica. Zameni izraz . Imenuje nazive port. PORTA.microchip.

Naslov : .inc> . Verzija : .oscilator male potrošnje . Shaddow registar za PORTA SPORTB . de 0x00 . . LP OSC .otpornik i kondenzator . Start programa .zaštita od čitanja .********************************************************** list #include __CONFIG p=16F84 . Sećate se zaglavlja koje ste do sada koristili. Autor : . ****** Inicijalizacija vrednosti u EEPROM memoriji ****** org 21x00 . HS OSC . .kristalni oscilator . Definiše upotrebljeni mikrokontroler <p16F84.32. WDT .watchdog tajmer .brzi oscilator . malo se pričalo o komentarima.inc .kašnjenje po uključivanju . Prepravite ga po sledećem: . Ubacuje nazive registra u program _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC . U ovom poglavlju upoznaćete se sa modifikacijama zaglavlja tako da Vam bude prilagođenije. Potrebni fajlovi : p16F84. XT OSC . Privremeno čuvanje W registra TEMPSTATUS . Početak EEPROM memorije . Privremeno čuvanje STATUS registra SPORTA . Shaddow registar za PORTB endc . ****** Inicijalizacija registara ****** cblock 0x0C TEMPW . RC OSC .********************************************************** . PWRTE . 96 . CP . ****** Start programa ****** ORG 0x00 goto Main . i sa načinima komentarisanja registara koji imaju bitove različitih funkcija. Komentari Na početku ovog uputstva. Datum : . Opis softvera : . Opis hardvera : . Inicijalizacija prvog bajta .

000=1:2 001=1:4.F TEMPW. TEMPSTATUS sa okrenutim niblovima .1=/ 0=\ . Povratak iz interapt rutine. Konfigurisanje pinova movwf banksel movlw movwf movwf movlw movwf movwf b'00000000' . . . Jednom okreni niblove u samom .RBIF INTCON. TEMPW registru.W STATUS TEMPW.T0SE eksterni takt 1=\ 0=/ . Dozvoli nove interapte EEPROM-a . 97 . PORTA b'00000000' PORTA SPORTA b'00000000' PORTB SPORTB . . .EEIF . a drugi put sa W kao odredištem. ****** Početak programa ****** Main banksel TRISA movlw movwf movlw movwf movlw b'00000000' TRISA b'00000000' TRISB . .W .0=uklj. prvobitno stanje koje ide u STATUS . !!+---------. Dozvoli nove interapte prekidača .INTEDG . STATUS sa okrenutim niblovima u W . +-----------.RBPU . Dozvoli nove interapte po promeni stanja . Čuvanje sadržaja W registra . Shaddow registara . i zatim u TEMPSTATUS registar . BANK 1 . Dva puta okrenuti niblovi daju .INTF INTCON. . Inicijalizacija stanja portova i .T0IF INTCON. !!!+--------.1=WDT 0=tajmer . 1=isključeni otpornici OPTION_REG .W movwf TEMPSTATUS .T0CS . u W. . !+----------. ****** Interapt potprogram ****** ORG 0x04 movwf TEMPW swapf STATUS... Back bcf bcf bcf bcf INTCON. . !!!!+-------. Dozvoli nove interapte tajmera . BANK0 .PS0-PS2 . Konfigurisanje pinova . Prostor za interapt potprogram.. swapf movwf swapf swapf retfie TEMPSTATUS. !!!!! +-----. .1= eksterni takt 0=takt tajmera .PSA .

RBIF .6 retlw b'00001110' . Tabl movf CIFRA.8 retlw b'11011110' .*********************************************** . Po potrebi u zaglavlje se mogu dodati i najkorišćeniji delovi programa (npr. nego ih po potrebi iznova pisati za svaki novi program. Tabela za ispis cifre na LED displeju . !!!!!+------. Delove koji se ne koriste lakše je odjednom obrisati. 98 .RBIE . razumljivije je značenje bitova u OPTION_REG i INTCON registru. Mora se nalaziti u bloku od 256 bajtova. +-----------. !!!!!!+-----.7 retlw b'11111110' . za pauzu. a najčešće korišćeni registri su unapred inicijalizovani pravilnim redosledom.W addwf PCL. što smanjuje mogućnost nepravilne inicijalizacije.EEIE .3 retlw b'11001100' .5 retlw b'11111010' . !!!!!!!+----.4 retlw b'11011010' . MPLAB za razliku od ostalih tekst editora za TAB postavlja 4 (umesto 8) razmaka.T0IF . !!!+--------.T0IE . . za korišćenje EEPROM memorije ili RS232 veze).2 retlw b'10011110' .INTE .0 retlw b'00001100' . ali je praktičnije odvojiti ih u zasebne celine u sklopu potprograma.GIE INTCON .embedinc.1 retlw b'10110110' .F retlw b'01111110' . – 0=obriši – 0=obriši – 0=obriši – 1=uključi – 1=uključi – 1=uključi – 1=uključi – 1=uključi . end . !+----------. na primer ovako: . Za to možete koristiti ASPIC_FIX program sa http://www. što listing programa čini preglednijim. Zato je dobro pre štampanja listinga programa dodatno „srediti“ . Prostor za programe. !!+---------.asm fajl.movlw movwf Start b'00000000' . Prilikom pisanja programa neki put ćete koristiti TAB a neki put par razmaka.9 Možete ih takođe ubaciti i u formi makroa.INTF . Kraj programa Na ovaj način program je pregledniji nego ranije.com/ . !!!!+-------.

PORTA u W. Rezultat AND operacije nad bitovima. PORTA .33. Maskiranje Pod maskiranjem se podrazumeva izdvajanje željenog bita prepisivanjem niza nula ili jedinica u ostale. . biće 1 samo ako je na oba bita prisutna logička 1. Rezultat b'00001000' ili b'00000000' u W. Resetovanje ranijeg stanja trećeg bita SPORTA.W . Rezultat u W. jer IOR operacija sa bilo kojom vrednošću bita i nulom. PRIKAZ registra SPORTA. Ukoliko se ostali bitovi maskiraju. Maskiranje svih osim trećeg bita PRIKAZ. koje je preuzeto iz PRIKAZ registra. u zavisnosti od stanja trećeg bita . Postavljanje samo trećeg bita na novu vrednost .W . daje sam taj bit. U tom slučaju (budući da je treći bit resetovan BCF instrukcijom). Pretpostavimo da je potrebno dovesti treći bit registra PRIKAZ na treći bit PORTA registra. 99 . ali tako da se ne promeni stanje ostalih bitova PORTA registra. a odatle u PORTA registar i SPORTA . stanje trećeg bita SPORTA registra zavisiće jedino od stanja trećeg bita W registra. u W će se naći jedino stanje trećeg bita PRIKAZ registra.W . Ostali bitovi u SPORTA registru zadržaće svoja stanja. SPORTA .3 . rezultat IOR operacije daje 1 ukoliko je bar 1 bit na logičkoj 1. u SHADDOW registar. a odatle u Shaddow registar b'00001000' . movf movwf movlw andwf bcf iorwf movwf movwf PORTA. Nasuprot AND operaciji.

zadnjoj EEPROM adresi (0x3F). Osnovni preduslov je da se u podatcima nalaze prazni (neiskorišćeni) bitovi. postaje dostupno 128 četvorobitna (128 nibla) ili 256 dvobitna dela.1 ST2. Maskiranje nepotrebnih bitova .F STANJE3.0 ST2.0 00000011b STANJE1. Kompresija Kompresija je postupak kojim se troši manje memorije za čuvanje većeg broja podataka efikasnijim smeštanjem podataka u memoriji.W STANJE. Zadnja dva bita iz STANJE4 registra u W . a odatle u STANJE registar . Može se bez problema koristiti u običnoj kao i u programskoj memoriji u tabelama. Maskiranje nepotrebnih bitova . movlw andwf movwf rlf rlf movlw andwf iorwf rlf rlf rlf rlf movlw andwf iorwf rrf rrf rrf movlw andwf iorwf bit7 ST4. pravo . Ukoliko se snimaju samo 2 bita. onda je raspoloživa memorija u kompresovanom stanju 4 puta (8 bita / 2 bita) veća od maksimalne. Rotacija bitova tako da . STANJE3 i STANJE4 kompresovati u registar STANJE. Kompresija. tako da dođu .F STANJE4 STANJE4 STANJE4 11000000b STANJE4. već samo čitati. STANJE2. Maskiranje nepotrebnih bitova . ukoliko je potrebno u EEPROM snimati grupe od dva bita (kao u primeru sa buđenjem iz SLEEP moda). Na primer.0 ST1.F ST3.W STANJE. šteta je ne iskoristiti i ostatak bitova u bajtu. nije ograničena samo na EEPROM memoriju. Pretpostavimo da je potrebno prva dva bita iz registara STANJE1. a odatle u STANJE registar bit0 ST1. Maskiranje nepotrebnih bitova .1 . Prva dva bita iz STANJE1 registra u W . dođu na . Rotacija bitova tako da .0 STANJE ST3. Sledeća dva bita iz STANJE3 registra u W .F STANJE3. na pravo mesto .F STANJE3.F 00110000b STANJE3.1 ST4. a odatle u STANJE registar . dođu na pravo mesto . Za EEPROM to znači da umesto 64 osmobitna.34.F 00001100b STANJE2. u slučaju programske memorije podatke u tabeli nije moguće menjati. Sledeća dva bita iz STANJE2 registra u W . Normalno. a odatle u STANJE registar . A ukoliko nije poznata konačna veličina (kraj) memorisanih podataka.W STANJE STANJE2. Rotacija bitova . mesto .W STANJE.F STANJE3. mogu se brojati ciklusi snimanja i po završetku snimanja snimiti u npr.1 100 .F STANJE2.

movf movwf rlf rlf movf movwf rlf rlf movf movwf rlf rlf movwf STANJE. STANJE2. dođu na pravo mesto . Rotacija bajtova tako da . STANJE u W . Rotacija bajtova tako da . sa tim što se onda podatci uvek snimaju u više od jednog bajta. dođu na pravo mesto . STANJE u W .W STANJE3 STANJE. ovde neće biti razmatrani.F STANJE. Sledeća dva bita u STANJE3 .F STANJE. Osim ovog. Imajte na umu da se EEPROM memorija „troši“ za vreme snimanja.W STANJE2 STANJE. i tek onda snimiti ceo bajt u EEPROM. Prva dva bita u STANJE1 . Rotacija bajtova tako da . kompresovati bitove u njih. ostali bitovi mogu se setovati ili resetovati maskiranjem. postoje i mnogo komplikovaniji načini kompresije (npr. 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 način moguće je izvršiti kompresiju i dekompresiju podataka koji sadrže više od 8 bitova.F STANJE. a zatim ih redom snimati u memoriju. Sledeća dva bita u STANJE2 .F STANJE. postupak je malo teži. STANJE3 i STANJE4) naziva se dekompresija. Ukoliko je to nepoželjno. a stanje ostalih bitova zavisi od stanja bitova u ostalim registrima. STANJE u W . ZIP algoritam).W STANJE4 .F STANJE. 101 . Potrebno je odrediti minimalan broj punih bajtova. Budući da oni prevazilaze okvire ovog uputstva.Proces vraćanja u prvobitno stanje (iz STANJE u STANJE1. Zbog toga nije poželjno snimati svaki dvobitni deo posebno. Zadnja dva bita u STANJE4 U ovoj dekompresiji na tačnu vrednost postavljeni su samo nulti i prvi bit u svakom registru.W STANJE1 STANJE. Sa kompresijom broja bitova sa kojima osmobitni bajt nije deljiv. dođu na pravo mesto . Sigurnije je sačekati da broj delova dostigne celobrojni broj bajtova.

else goto Isti Razliciti . then Isti Z=1? Ne Različiti Razliciti .35.. then goto Razliciti Ne Isti Različiti Kao što primećujete.. Nije. teško je razumeti i incfsz i decfsz instrukcije. Uporedi Da Z=0? STATUS. Broj 5? .W .. Pogledajte ilustraciju njihove primene u algoritmu koji broji od 25 do 0: movlw movwf Sman decfsz goto Broj0 . Probleme može izazvati i razumevanje preskoka naredne instrukcije. . Kako će stanje flaga direktno zavisiti od rezultata prethodne instrukcije (5 XOR 5 = 0 pa je Z setovan) koja utiče na njegovo stanje. vrati se . dok ne usavršite programiranje upotrebljavajte prvi oblik (sa dve GOTO instrukcije). If Z = 0 Isti . prilikom izvršenja btfsc ili btfss instrukcije. Naime. u programu se ne testira realno stanje registara. Da Smanji BROJ BROJ=0? Ne Vrati se 102 .25 BROJ BROJ. Pored btfsc i btfss instrukcija. Razliciti Isti Iako je jednostavnije algoritme testiranja moguće napraviti bez dve goto instrukcije. .Z ...5 BROJ.. Pogledajte sledeći primer. . If Z = 1 Razliciti .Z . Iznova i iznova upotreba instrukcija grananja zbunjuje početnike.12 BROJ... jer će program u slučaju da je odgovarajući uslov ispunjen (setovan ili resetovan flag) preskočiti narednu instrukciju.W . else goto Razliciti . u BROJ .. If . nema realne potrebe (osim lakše čitljivosti takvog programa) za dve goto instrukcije.25 .F Sman . Broj 12? . zajedno sa odgovarajućim algoritmom: movlw xorwf btfsc goto goto . Uporedi Da STATUS. Then . već jedino logičko stanje odgovarajućeg flaga (odnosno bita) unutar registra. Else . U ovom poglavlju biće dodatno objašnjena njihova primena. BROJ=0? . Jeste. movlw xorwf btfss goto Isti .. upravo je njegovim testiranjem omogućeno grananje.

36. Šta možete uraditi? Zameniti tabelu! U redu. Uslovno asembliranje Pretpostavimo da imate program koji kontroliše LED displej. Na sreću. pa morate kupiti displej sa zajedničkom katodom. a koji ne. Jedini je problem u tome što jednom nabavite displej sa zajedničkom anodom. Njima se u zavisnosti od datih uslova može izabrati koji deo programa će se asemblirati. Već ste to naučili. jedini je problem tabela. a drugi put ga nema u prodavnicama. Pogledajte na primer sledeći deo: Nastavak sledi! 103 . Ništa čudno. Ali šta ukoliko i drugi put promenite displej? Da li da čuvate dve verzije programa? Mora da postoji bolji način! MPLAB asembler sadrži par uslovnih direktiva. da možete lako prebaciti katodu sa napajanja na masu. pogodilo se da su priključci isti.

Kao što ste već naučili. idi na Label1 .W STATUS. idi na Label2 . Nije nađena odgovarajuća vrednost.Z Label1 . Nije nijedna vrednost od ponuđenih. lako je porediti jednakost dva broja korišćenjem XOR operacije. Jesu. Uporedi . Da li je to slovo “R” (G XOR (G XOR R) = R) STATUS. Na taj način ušteđeno je vreme potrebno za ručno XOR-ovanje. Jednom XOR-ovana vrednost ponovo se XOR-uje i takva se upoređuje sa ostalim. Da li su isti? . Da li su isti? . idi na Label2 'R' ^ 'Z' .W STATUS. Da li su isti? . 104 . Idi na Label4 Postupak je moguće skratiti poređenjem višestruko XOR-ovanih vrednosti: movf xorlw btfsc goto xorlw btfsc goto xorlw btfsc goto goto SLOVO. Jesu. Da li su isti? Label2 . moguće je testirati ih na sledeći način: movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto goto 'G' SLOVO. Jesu.Z Label2 'Z' SLOVO. Uporedi .37. Da li su isti? . . Jesu. Nisu. U slučaju testa više vrednosti. Broj u W . Jesu. Uporedi . idi na Label1 'G' ^ 'R' . Jednakost dva broja U programima se često javlja potreba za testiranjem određenih vrednosti.W 'G' STATUS.W STATUS. Idi na Label4 U ovom slučaju asembler će prilikom asembliranja programa izračunati vrednost “G” XOR “R” (oznaka ^ označava XOR logičku operaciju) i postaviće dobijenu vrednost na rezultat. idi na Label2 . Da li je to slovo “G”? . idi na Label3 Label4 . Da li je to slovo “Z” (R XOR (R XOR Z) = Z) STATUS. Slovo “R”? .Z Label3 Label4 . Nije.Z Label1 'R' SLOVO.Z . Da li su isti? Label3 . Da li je to slovo “Z” . i odgovarajućim skokom u zavisnosti od stanja Zero flaga. .Z . Jesu. Slovo “G”? .

Detaljniji postupak prekoračenja naučićete u narednom poglavlju. test TMR0 registra). Verovatno jer je jednostavnije za razumevanje. pouzdanije je testirati prekoračenje vrednosti testom Carry (umesto Zero) flaga. Da li je W = 0 (biće kada su vrednosti iste)? .30 .0. Vrednosti su iste Testiranje oduzimanjem više se sreće u programima. Ukoliko imate čestu promenu vrednosti registra koji testirate bez mogućnosti testiranja njene jednakosti sa zadatom vrednošću neposredno nakon promene (npr. Ovo je bolji način jer je moguće da između dve uzastopne provere (pogotovu ukoliko koristite duže interapte ili retko testirate jednakost) registar dođe a zatim i pređe preko zadate vrednosti pre provere. a i pri prekoračenju. movlw subwf btfss goto goto 'G' SLOVO. Carry flag bi (za razliku od Zero flaga) bio setovan i pri dostizanju vrednosti . Vrednosti se razlikuju .Z Razliciti Isti . W = SLOVO . Slovo “G”? . 105 .Osim XOR operacije testiranje jednakosti može se izvršiti i oduzimanjem dva broja i testiranjem Zero flaga.W STATUS.

ukoliko je BROJ manji od 2 neće biti setovan Carry flag. W . što omogućava lakšu izmenu testirane vrednosti.2uW . Umesto ovoga moglo se pisati i movlw . Testiraj prekoračenje .BROJ .W BROJ. Vrati inicijalnu vrednost (2) u W duplim XOR .W STATUS.2 .W STATUS.2 . W>=0.2 STATUS. BROJ < 2 . BROJ = 2 . W<0. U njemu se testiraju vrednosti W registra i registra BROJ. pa će se dalje izvršavanje nastaviti od labele Manji.C Manji Veci . W = 2 . BROJ <= 2 I u ovom slučaju Carry flag će biti setovan kada su brojevi jednaki.2 u W = 2 .2 BROJ. Stoga.BROJ moguće je testirati malo drugačija stanja. Ukoliko se okrene formula W = BROJ . Da bi eliminisali jednakost moguće je kombinovati jedan od ovih algoritama sa proverom jednakosti: movlw xorwf btfsc goto xorwf subwf btfss goto goto .C Veci Manji .C Manji Veci . movlw subwf btfss goto goto . W>=0.2 BROJ.2 . BROJ >= 2 Prilikom oduzimanja broj 2 se menja u svoj drugi komplement (0xFE) i ova vrednost se sabira sa vrednošću iz registra BROJ. Uporedi . BROJ > 2 . ukoliko je BROJ veći ili jednak broju 2 program će se nastaviti od labele Veci. Pogledajte sledeći primer. 106 . W = BROJ . BROJ > 2 Dupla XOR operacija upotrebljena je da bi vrednost sa kojom se testira BROJ mogla biti uneta u samo jednoj instrukciji. W<0. Manji ili veći Isto kao i poređenje jednakosti PIC16F84 može uz par instrukcija testirati da li je određeni broj A manji ili veći od broja B. W = BROJ .38. BROJ u W . Za to je najpraktičnije koristiti oduzimanje i testiranje Carry flaga. Na primer: movf sublw btfss goto goto BROJ.Z Isti BROJ. Testiraj prekoračenje . Da li su isti? . Kako se Carry flag setuje i kada su brojevi jednaki. BROJ < 2 . Testiraj prekoračenje .W STATUS.2 .

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

BROJ1 dobija početnu vrednost registra BROJ2 . BROJ2 dobija početnu vrednost registra BROJ1 Na sledeći način možete direktno izvršiti njihovu zamenu bez upotrebe dodatnog registra. BROJ1 u W .W TEMP BROJ2.39.F . W se ne menja . .F BROJ. 108 .F BROJ2. TEMP u W .W BROJ.W BROJ2. BROJ2 u W .W BROJ1 TEMP. Potpuno istim načinom moguće je promeniti sadfržaj BROJ i W registra. BROJ1 u W . temp) registar. Zamena sadržaja dva registra Ponekad (npr. movf movwf movf movwf movf movwf BROJ1.F . BROJ1 ^ BROJ2 u W . W u TEMP .W BROJ2 . movf xorwf xorwf xorwf BROJ1. xorwf xorwf xorwf BROJ. W ^ BROJ2 u BROJ2 Ovaj algoritam moguć je jer se duplo XOR-ovana vrednost bilo kojim brojem ne menja.W BROJ1. W ^ BROJ1 u BROJ1. Obično se za to koristi dodatni privremeni (eng. . pri sortiranju podataka) se javlja potreba za zamenom sadržaja dva registra.

U W se nalazi broj od 0 do 7 . U protivnom.8 OFSET. W=3 .F Program1 Program2 Program3 Program4 Program5 Program6 Program7 Program8 . Razumljiv i dobro komentarisan program olakšava njegovu naknadnu ispravku.. Ograničenja vezana za njih važe i u ovom slučaju. W=6 . W=1 . OFSET u W . Slično kao kod tabele. Nije ni čudo što se kod nerazumljivih programa naziva špageti kod. Morate imati u vidu da će se u programu verovatno javljati greške. Poc incf movlw xorwf btfsc clrf movf Skok addwf goto goto goto goto goto goto goto goto OFSET. W=4 . nego na pisanje novog programa iz početka. Pretpostavimo da je se registar OFSET uvećava pri svakom prolasku kroz program i da se na osnovu njegovog trenutnog stanja izvršavaju dalji programi jedan za drugim. W=7 Svakako možete zapaziti da se ovaj postupak ne razlikuje mnogo od tabele. Ipak. Broj prekoračenja . W=0 .W PCL. Isto kao u tabelama i ovde je potrebno proveriti da li program prelazi granicu od 256 instrukcija. U gornjem programu umesto zadnje intrukcije (goto Program8) moglo se odmah nastaviti sa izvršavanjem osmog programa. Jeste.F . analiza ovakvog programa je prilično jednostavnija. Na kraju svog izvrsavanja svaki program izvršava goto Poc instrukciju kojim se nastavlja iz početka. Iako je time utrošena jedna instrukcija više. Uvećaj OFSET . ovako program izgleda preglednije i lakši je za analizu. sabiranjem PCL sa određenim brojim možemo otići na proizvoljne memorijske lokacije.. .40. 109 . W=5 .Z OFSET OFSET. Da li je nastupilo prekoračenje? .W STATUS. naći ćete se u gomili naizgled besmislenih instrukcija. W=2 . On W goto . Česta je pojava da se prilikom kasnijeg razvoja programa više vremena utroši na njegovu analizu. inicijalizuj OFSET .

U slučaju da je to potebno. Pri proračunu tačnog vremena kašnjenja mora se uzeti u obzir i vreme potrebno za skok na potprogram. . Program sam postavio na svom sajtu čiji link mođete naći na kraju ovog uputstva. Kašnjenje je najpraktičnije implementirati unutar potprograma. Pre poziva potprograma je u W potrebno zadati željeni broj milisekundi kašnjenja. za još 6μS . Ovde je dat potprogram kojim će se (pri 4MHz) realizovati kašnjenje od tačno 1mS. Da li je rezultat 0? . Povratak iz potprograma Ukoliko Vam se ovaj način čini previše težak. mora se koristiti registar (u ovom slučaju PAUZA). Inicijalizacija vrednosti .piclist. Nije. Addlw traje 1. Kas movwf Pet1 movlw call nop nop decfsz goto return PAUZA 0xF8 Pau4 PAUZA. .com/cgi-bin/delay. Ukoliko ne želite išta instalirati online generator kašnjenja imate na linku http://www. izbrisao je PicLoops sa svog sajta i sada kolekcionira stare video igrice. Kašnjenje u petlji U dosta slučajeva potrebno je da program jednostavno čeka u petlji određeno vreme. instrukcijska ciklusa za skok na potprogram . Još petlji.exe. Smanji vrednost u registru . vrati se iz potprograma. nastavi sa petljom . 248 * 4 + 2 = 994 ovde . Inicijalna vrednost u W. Imajte na umu da je i Call instrukciji potrebno 2μS. Tu nisu uračunata 2 .Z Pau4 . kao i za povratak iz njega (2 * 2 instrukcijska ciklusa). Kako (za 4MHz kristalni oscilator) instrukcijski ciklus traje samo 1μS.F Pet1 . Potprogram za svoj rad ne koristi registre. Svaki prolazak kroz petlju troši 4μS. Njim je moguće realizovati pauze od 1 do 255mS (¼ S). 110 . Iako izgleda kao program. Ostatak. W u PAUZA registar . potrebno je softverski realizovati duža kašnjenja. moguće je u W zadati željenu dužinu pauze (4μS * W) i skočiti direktno na Pau4. možete isprobati PicLoops program koji generiše deo potrebnog kôda u zavisnosti od unetog vremena kašnjenja i brzine oscilatora. Za duže pauze. btfss 1 i goto 2μS.41. radi se o linku. I u trenutku izlaska iz petlje (W=0) kašnjenje je takođe 4μS. Autor tog programa prestao je da programira mikokontrolere. Jedino W. Jeste. Pau movlw nop Pau4 addlw btfss goto return 0xF9 0xFF STATUS. Oduzmi 1 od W sabirajući W sa 0xFF .

Ili ćete kupiti dodatnu EEPROM memoriju. oni se mogu kompresovati i tako zauzeti samo 144/8 = 18 EEPROM adresa. odmor u Egiptu može trajati i do 15 dana (nakon toga postaje dosadno). Prvi se odnosi na maksimalan broj semplova. Pogledajte kako se ona može odrediti. odnosno 6*24 = 144 sempla dnevno. Šta to znači? Ukoliko je za period od 24 časa moguća pojava maksimalno dve plime i dve oseke. Ovde se javlja drugi problem. tako da za 1 sat mikrokontroler dobije 6 sempla. po istoj teoriji svaki analogni audio signal (20Hz – 20 kHz) može se predstaviti digitalnim signalom semplovanim na (dovoljnih) 40kHz. i dobijene podatke snimati redom (bit po bit) u RAM registre ili EEPROM memoriju. Da bi se svaka promena sigurno detektovala. Kod semplovanja se javljaju četiri problema. morate nešto žrtvovati. a pojedinačni dobijeni podaci (logička stanja pinova u određenom trenutku) semplovi. Dovoljan kvalitet postiže se tek pri desetostruko većoj frekvenciji (200kHz). drugi na dužinu pauze između semplova. Ovo je i dalje sasvim dovoljno. ali više semplova će svakako vernije prikazati signal. tolika preciznost jednostavno nije potrebna. treći na rezoluciju semplova. međutim tako malim brojem semplova je teško razlikovati violinu od bas gitare. Ovo je minimalni dovoljan broj semplova. Takav postupak naziva se semplovanje. Dokle će biti dovoljno? Objašnjenje daje teorija semplova. Znači. Iako se semplovi mogu uzimati svake milisekunde. Na primer. Postoji li još neki način? Postoji i odnosi se na povećanje rezolucije semplova. za 15 dana možete u EEPROM snimiti maksimalno (64*8)/15 = 34 sempla dnevno. Kako su semplovi jednobitni. U zavisnosti od raspoloživog vremena (i dubine novčanika). Po njoj je bilo koji signal moguće predstaviti semplovima uzetih na frekvenciji koja je bar duplo veća od maksimalne frekvencije originalnog signala. Pogledajte šta se događa ukoliko izaberete drugo rešenje. Kako EEPROM PIC16F84 mikrokontrolera ima 64 adresa. to predstavlja maksimalno 4 promene logičkog stanja na pinu. To je treći problem. semplovanje mora biti bar duplo brže od tih promena.42.5 dana! Ukoliko Vam je ovaj period previše kratak (idete na odmor u Egipat). Semplovi bi se uzimali (otprilike) svakih (24*60)/34 = 42 minuta. Pretpostavimo da je potrebno promenom logičkog stanja na jednom pinu pratiti nivo reke (periode plime i oseke). Semplovanje Pretpostavimo da je potrebno određeno vreme pratiti promene na ulaznim pinovima. to znači da bi u njega bilo moguće snimati semplove maksimalno (64*8)/144 = 3. Ovde se javlja prvi problem. Maksimalna raspoloživa količina memorije. 111 . Biće sasvim dovoljno ukoliko se između semplova ubaci pauza od 10 minuta. ili ćete povećati pauzu između semplova. a četvrti na preciznost pauze. odnosno biće potrebno bar 8 sempla dnevno.

i tada se dobija 00. Uglavnom je potrebno odabrati kompromis između dovoljnog broja semplova i njihove rezolucije. sada će biti moguće dosta (četiri puta) preciznije pratiti povećanje i smanjenje nivoa. Međutim. Semplovanje nije ograničeno samo na merenje „egzotičnih“ signala kao što je nivo reke. 001. ukoliko se za merenje nivoa vode koriste tri ulazna pina (umesto jednog). Ukoliko se za merenje koriste 3 pina. To je četvrti problem.Do sada je rezolucija semplova bila jednobitna. 10 i 11. odnosno omogućavala je samo dva logička stanja (ima/nema vode). U idućem poglavlju naučićete kako se semplovanje može efektno iskoristiti unutar debouncinga. Vidite da je dvobitnom rezolucijom moguće predstaviti 4 nivoa reke. ali nekada ne. Znači. Nekada to može biti zanemarljivo. a to opet zavisi od konkretnih potreba merenja. Pauzu između semplova treba što preciznije odrediti. Ona se mogu konvertovati u binarni oblik. Zbog što preciznijeg vremena semplovanje se uglavnom izvršava nakon prekoračenja tajmera (ili unutar interapta izazvanih tajmerom). Na primer za početni slučaj (merenje na svakih 10 minuta) uz tri sonde biće potrebno (6*24)*2 = 288 sempla. odnosno 288/8 = 36 bajtova dnevno. moguće je prikazati četiri nivoa reke uz dva bita unutar sempla. Duplo više bitova donosi i duplo povećanje memorije. Sećate se da je pri učenju interapta predlagan metod merenja nivoa reke preko više ulaznih pinova. 011 i 111. 112 . 01. moguće je dobiti sledeća stanja: 000. Greška od jedne sekunde unutar jednog sata za petnaest dana narasla bi na grešku od 6 minuta.

U sledećim poglavljima upoznaćete se sa par komunikacionih protokola. potrebno je saopštiti glavnom programu da je prekidač pritisnut (otpušten). Ukoliko se petlja završi. Uglavnom se primenjuje komunikacija preko par registara opšte namene. 113 . Sigurno ćete primetiti kompromis između broja pinova koji se koriste za komunikaciju i brzine komunikacije. to znači da se stanje prekidača nije promenilo svo vreme trajanja petlje. i onda ponovnim testiranjem. a setovan bit 1 da je pritisnut taster „DESNO“.43. i u zavisnosti od njihovog stanja preduzimati određene akcije. Dovoljno je napraviti petlju (ili petlju unutar petlje). i za to vreme neće moći da izvršava ostale operacije. Bolji način predstavlja testiranje tastera više puta. uporedi sa prethodnim i smanji (uveća) unapred zadat brojač semplova. Osim toga interapti mogu izazvati privremen prestanak ili duže vreme testiranja prekidača. Na primer setovan bit 0 registra TASTERI značio bi da je pritisnut taster „LEVO“. uzeti sempl i resetovati petlju ukoliko se sempl promenio. Komunikacija između glavnog programa i interapta nije baš jednostavna. sa tom pogodnošću što tada ranije opisanih problema nema. brojač bi se ponovo inicijalizovao. Ovako jednostavan princip ima naravno i par mana. Ukoliko kontakti prekidača neprestano varniče. Jedan deo je hardverski integrisan u savremenijim PIC mikrokontrolerima. Ukoliko je sadašnje stanje sempla drugačije od prethodnog. pa tako zadnji sempl može biti uzet kao stabilno stanje prekidača. i izmenu jedino ukoliko je u svim slučajevima testiranja dobijeno novo stanje. Dobar je jedino za programe gde se može dozvoliti čekanje na pritisnutost (ili otpuštenost) tastera. Program se treba bar 20mS vrteti u petlji. program neće moći da izađe iz petlje. Glavni program trebao bi periodično testirati ove bitove. Debouncing Ranije ste videli da se debouncing može realizovati testiranjem tastera. odnosno da se u jednom prolazu uzme samo jedan sempl. pa kratkim čekanjem. U ostalim situacijama trebalo bi koristiti testiranje prekidača unutar interapta izazvanih tajmerom. Kada brojač (napokon) istekne. Kako se interapti izazvani tajmerom pozivaju prilično retko. kako bi testiranje ponovo počelo iz početka. Za testiranje se bez problema može iskoristiti semplovanje. potrebno je da semplovanje traje što kraće.

Može doneti penziju. Njime je moguće adresirati ukupno 64Kbita (65536 bitova) podataka. a za njim i broj kolone. Međutim. Bitska matrica je unutar memorije organizovana u obliku redova i kolona. Data Out) pin. Neophodna sinhronizacija obezbeđuje se preko dva (ovo je svakako manje od osam) dodatna pina. potrebno je preko adresne magistrale pristupiti ćeliji u kojoj se taj bit nalazi. Naravno. kako je samo jedan od njih trenutno u funkciji u zavisnosti od stanja WE pina. Malo teorije oko memorije U početku beše DRAM. tako da se u memoriju najpre šalje broj reda. dobija se jedan U/I pin preko koga je moguće upisati ili pročitati jedan bit podataka sa predate adrese. Ukoliko se spoje. Naziv (broj) ulice i broj zgrade. On sa koverte čita dve informacije. Klasičan predstavnik DRAM memorije je 4164 integrisano kolo. a prilikom upisivanja kao izlazni. Da li poštar doneti ili odneti penziju (čitati ili upisivati podatke u memoriju) zavisi od logičkog stanja WE (eng. Da bi se pristupilo određenom bitu (bilo za čitanje ili upis podataka). Njih je moguće povezati direktno na dva U/I pina mikrokontrolera. I na kraju memorija ima ulazni DIN (eng. oni se bez problema mogu spojiti jedan za drugi. Kroz takvu mrežu probija se naš glavni junak – nervozni poštar. Za očitavanje kompletne adrese memorija bi morala imati čak 16 ulaznih pinova (8 za ulicu i 8 za broj). Data In) i izlazni DOUT (eng. a kolone brojeve zgrada. 114 .44. ili (doneti račun i) odneti penziju. Write Enable) pina. Poštar kao što sigurno već znate može obavljati dve operacije. Zamislite mrežu zgrada u kojoj redovi imaju nazive ulica. 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). Ovo se uglavnom rešava multipleksom adresne magistrale (više o principu multipleksa naučićete kasnije). Tako se jedan pin koristi i za ulaz i za izlaz (isto kao i pinovi mikrokontrolera).

D3 i D4). D2. Mikrokontroler bi znači morao povremeno pročitati sadržaj celokupne memorije (ili bar onih memorijskih lokacija koje koristi). a magistrala podataka umesto jednog zauzima čak 8 provodnika (ili 16 ukoliko se ulazni i izlazni pinovi memorije ne spoje jedan za drugi). Kada se podaci jednom snime u EPROM memoriju. kondenzator će se napuniti. Sada ono teško. a zatim ih ponovo upisati. U tom slučaju veličina adresne magistrale ostaje ista. DRAM memorija ima više mana nego prednosti. Nezaobilazna je i EPROM memorija. Taj proces obično zahteva više napone od radnih (+12V umesto +5V). ne bi više bio u stanju čuvati podatak. access time) ćelijama sporije od ostalih vrsta memorija. Za čitanje i pisanje jednog bajta moguće je redom čitati (ili pisati) u grupama od 8 bitova. Klasičan njen predstavnik bila bi npr. tako da se adresa željenog bita može zadati u jednom koraku. Tek onda je moguće ponovno programiranje. pa se morao povremeno (npr. Mogu se koristiti i 4464 memorije koje imaju u sebi 64Kbita * 4 (65536 * 4 bitova). i na taj način se EPROM obriše. i kasnije će pri očitavanju davati logičku 0. Naime. Većinu EPROM memorija moguće je postaviti u sleep mod. podaci se u EPROM mogu snimati preko odgovarajućih programatora specijalnom procedurom (kao snimanje koda u PIC). Zbog toga se DRAM memorija sve ređe koristi i pored niske cene. odnosno uz istu adresnu magistralu imaju 4 pina na magistrali podataka (spojeni DIN i DOUT formiraju D1. Za razliku od DRAM. mora se povremeno očitati i osvežiti. Memorija neće raditi u slučaju pokušaja očitavanja ili upisa većom brzinom od dozvoljene. Teoretski. 115 . Razvojem elektronike pojavljuje se SRAM (statička RAM memorija) po pristupačnoj ceni. Punjenje i pražnjenje kondenzatora zahteva određeno vreme. Kako bi se kondenzator posle par mS potpuno ispraznio. dovođenjem logičke 1 na njen CE (eng. 5564 memorija (SRAM 8Kbita * 8). Chip Enable) pin. Da se ne bi vremenom ispraznio. Ukoliko mu se pak dovede logička 0. ne mogu se snimiti naredni sve dok se EPROM određeno vreme ne izloži ultraljubičastoj svetlosti. svake druge milisekunde) osvežavati. Ukoliko mu se najpre određeno vreme dovede logička 1. DRAM memoriju kapaciteta jednog bita možete dobiti povezivanjem kondenzatora direktno na U/I pin mikrokontrolera.To bi bilo to za čitanje i pisanje jednog bita. tako da je vreme pristupa (eng. tako da im osvežavanje nije potrebno. a jednom upisan podatak ostaje u SRAM memoriji sve do upisa sledećeg ili do gubitka napona napajanja. Taj proces ubrzava „curenje“ naelektrisanja isprogramirane EPROM memorije. dok kod C64 video kontroler osvežava memoriju za vreme dela instrukcijskog ciklusa u kome mikroprocesor ne pristupa memoriji. Ona na sebi ima mali stakleni „prozor“ preko koga se može brisati. ili kao kod Commodore 64 kompjutera paralelno adresnoj magistrali dodati još sedam 4164 DRAM memorija. kondenzator će se isprazniti. Tako unutar Spectrum kompjutera Z80 mikroprocesor paralelno sa izvršavanjem instrukcija povremeno osvežava DRAM memoriju. Osvežavanje memorije troši dosta mikrokontrolerskog vremena. i ukoliko se kasnije očita njegovo stanje taj pin će davati logičku 1. U njoj se memorijske ćelije sastoje od nekoliko tranzistora povezanih u formi Flip Flopa. u SRAM memoriji je napušten princip multipleksa adresne magistrale (zbog veće brzine). Svaka bitska DRAM ćelija sastoji se od jednog kondenzatora i jednog tranzistora.

Iako je uglavnom moguće donekle „overklokovati“ memoriju. To omogućava multipleks magistrale podataka. Mikrokontroleri se zbog velikog broja potrebnih pinova uglavnom uopšte ne povezuju sa eksternim hardverom adresnom magistralom. Pri radu sa bilo kojim eksternim memorijama morate obratiti pažnju na brzinu pristupa podacima (obično od 45nS do 450nS). Jednom će svakako stradati. već se sve više razvija specifičan hardver. Za više detalja pogledajte TB011 sa http://www. Output Enable) pinu EPROM memorije prisutna logička 1. uz manju brzinu pristupa. svi pinovi magistrale podataka (D0 pa nadalje) naći će se u stanju visoke impedanse.com/. Zbog toga se najviše koristi u kompjuterima.Ukoliko je na OE (eng. kojim se određenim komunikacionim protokolima može upravljati manjim brojem pinova. to ne predstavlja dobru praksu. 116 . ali joj je i brzina maksimalna. i njeno deljenje između EPROM i RAM memorije (Commodore 64 koristi isti princip sa svojom ROM memorijom).microchip. Bolje da to bude što kasnije. Kao što uočavate za upotrebu adresne i magistrale podataka potreban je veliki broj pinova.

Još karaktera POINTER POINTER. ****** Tabela sa tekstom ****** Text addwf PCL. 0x00 Označava kraj teksta Da bi se na serijski port poslao karakter. Uzmi movwf Pet movf call addlw btfsc return call incf goto . 8 bita podataka svaki trajanja jednog perioda slede za ovim startnim bitom. brzina kojom kompjuter može pročitati ove podatke je (u odnosu na PIC) toliko mala. Stavi pointer u W . Postavi vrednost iz W u pointer poruke . . a ni komercijalno nisu dostupni programi za njegovu upotrebu. a drugi za prijem podataka) na kompjuter (npr. preko serijskog (RS-232) porta. potrebno je u jednom registru čuvati redni broj slova koje se prikazuje (broj koji se dodaje na PCL) i pozvati rutinu za slanje karaktera. povećavajući svaki put vrednost u pointer registru. da se ne dobija nikakvo značajno povećanje brzine. ili povezati samo 2 pina (jedan za slanje. Visok logički 117 . vreme koje bit provede u stanju logičke 0 treba biti 1/4800 = 208μS. 0x0D Vraća znak Return . paralelni port ima prilično nestandardan interfejs.F . Međutim. Najpre je potrebno uneti poruku koja će se poslati. iz tabele se vraća 0x00. Setuje Zero flag ako je W = 0 . Povezati potreban broj pinova porta B direktno za adresnu magistralu (npr. Završava potprogram ako je W = 0 Slan .W Text 0x00 STATUS. Očigledno je da bi paralelni prenos podataka trebao biti mnogo brži od serijskog. ASCII kod za slovo T. Kada se dodje do zadnjeg karaktera. što olakšava unos poruke. i postaviti pinove porta B u određeno stanje. paralelni port kompjutera). U rutinu se ulazi sa rednim brojem prvog karaktera (ofsetom) u W. 0x0A Vraća oznaku za novi red . a za prenos podataka je zauzeto više pinova mikrokontrolera. serijski port) i slati podatke kroz njih bit po bit određenom brzinom.45. Njegovo uobičajeno stanje je visok logički nivo (1). Vraća karaktere. Osim toga. označava se sa a'T' ili 'T'. 0x0A. na osnovu čega potprogram detektuje kraj niza karaktera. 0x0D. 0x00 . MPLAB asembler može sam vršiti konverziju ASCII koda. Šalje karakter na serijski port POINTER. dodaj W na PCL dt 'Zdravo!'. RS232 i RS423 Kako poslati podatak iz PIC mikrokontrolera u Vaš kompjuter? Postoje dva načina.F . Pri brzini prenosa podataka od 4800 boda. Vraća ASCII karakter u W . a nizak nivo (0) pri tome označava startni bit.Z Serijski prenos podataka sastoji se od postavljanja odgovarajućeg pina na logičku 0 i logičku 1 u tačno određenim trenutcima. . Pozicioniraj pointer na sledeći karakter Pet . Najlakše je uneti je u PIC u obliku tabele. Sledećim programom prenosi se poruka u kompjuter. Preskače ako Zero flag nije setovan .

49 decimalno. . Podatci se u kompjuteru čitaju na polovini bitskog perioda. Program koji sve to povezuje. da bi se pouzdanije detektovalo da li je odgovarajući bit na logičkoj 0 ili 1. Izl movwf movlw movwf bsf movlw call rrf btfsc goto bsf goto Obr bcf nop TXREG 0x08 BITOVI PORTA. 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. bit 2 (pin 1).2 . . ukoliko je kabl za povezivanje dovoljno kratak. Ostalo je još njihovo povezivanje. Kako sam program za slanje traje 12μS.104 Pau4 . Naponski nivoi RS232 porta su -3V ili niže za logičku jedinicu. želi se setovanje bita . Preskoči kada dođe do 0 . Ovo se uglavnom može zaobići. Kašnjenje za slanje ovog. tako što se koriste nivoi od +5V za logičku 0 i 0V za logičku 1. U potprogram se ulazi sa željenim karakterom u W. u protivnom je bit = 0 (visok nivo) . Je li gotovo? . 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.2 . vreme za kasnjenje . (nizak naponski nivo) . Bitovi se šalju sa prvim bitom najmanje težine (LSB). 52 decimalo. vreme za kašnjenje 208μS . mogao bi izgledati ovako: 118 . Izlaz za kompjuter je na PORTA registru.F Pet . Prebaci zadnji desni bit u Carry flag.52 Pau4 PORTA. u W će se naći broj 49.nivo duži od perioda jednog bita označava stop bit. 1 bit manje. i +3V i više za logičku 0. 8 bitova podataka .2 Kraj PORTA.49 Pau4 TXREG.F STATUS. Startni bit (invertovan.2 BITOVI. da bi obe opcije trajale tačno 12μS . Brojac za bitove . 0V (visoko stanje) za stop bitove . U potprogramu za pauzu cekaj 49*4=196μS . za dva puta duži stop bit . sećate se) +5V na RA2 . Kašnjenje za zadnji bit podataka . ima još bitova. Stavi W u registar predaje .C Obr PORTA. Primećujete da je ovo obrnuto od onoga što biste mogli očekivati! Za tačno određivanje potrebnih pauza može se koristiti ranije opisan potprogram za kašnjenje sa 52 * 4μS petljom za jednu bitsku periodu pri 4800 boda. 0V na pinu 1 (RA2) . +5V na pinu 1 (RA2) . 104 decimalno . Ako je Carry flag = 0.

Prebacuje u BANK1 . potrebno je testirati njeno prekoračenje. pa se ovaj program može upotrebiti jedino uz kristalni oscilator od 4MHz. Međutim.RP0 PORTA . Kasnjenje od 50 mS . u realnoj situaciji bilo bi ga korisno implementirati. morali bi se koristiti odgovarajući drajveri (obično se to radi integrisanim kolom MAX232) namenjeni pretvaranju logičkih nivoa sa pinova mikrokontrolera u nivoe pogodne za RS232 komunikaciju. Izaberite odgovarajući COM port i u podešavanjima izaberite 4800 bita u sekundi. Kabl ne bi trebao biti duži od 1. Na strani kompjutera uključite Vaš terminalski program.microchip. i kalibrisanjem sopstvenog vremena signala i pauze po ovom signalu. Ofset za prvi karakter poruke . 8 bita podataka. RA2 = 0 (RS232 visoko stanje) . Iako je za serijsku komunikaciju neophodan tačno određen takt oscilatora. Kako program koristi tabelu.RP0 0x00 TRISA STATUS. potrebno je osigurati dovoljnu preciznost takta oscilatora. Za povezivanje sa kompjuterom dovoljno je pin 1 mikrokontrolera (RA2) povezati sa pinom 2 (RX) devetopinskog ženskog SUB D konektora. postoje softverske tehnike koje omogućavaju RS232 komunikaciju merenjem signala sa kompjutera. nije bitan. Bitno je jedino da glavni program (Slan) bude prvi.com/. U programu nije korišćen Shaddow registar zbog jasnije ilustracije. Slanje poruke u kompjuter .Slan bsf movlw movwf bcf clrf movlw call movlw call Blok goto STATUS. Svaki put kada ga uključite (ili resetujete). U protivnom. preko potprograma za duže pauze . Za detalje pogledajte tehnička uputstva AN510. Za ispravan rad programa. na PORTA . i masu (GND) na pin 5 konektora. Time je omogućena upotreba jeftinijeg RC oscilatora dovoljne brzine. Redosled potprograma.50 Kas 0x00 Izl Blok . kao i da signal sa jednog predajnika mogu istovremeno primati 10 prijemnika. Savremeniji PIC mikrokontroleri imaju hardverski rešenu RS-232 komunikaciju. Postavlja sve pinove kao izlazne . naravno. To omogućava da je (uz korišćenje istog komunikacionog protokola) RS423 kompatibilan sa RS232 drajverom. poruka „Zdravo!“ će se prikazati na ekranu. Međutim. AN593 i AN712 sa http://www. 119 . Vraća u BANK0 . naponski nivoi su mu od -4 do -6 za logičku 1 i +4 do +6V za logičku 0. bez provere parnosti i jedan stop bit. Kraj u beskonačnoj petlji Malo komentara o programu: Svi bitovi na PORTA registru su postavljeni kao izlazi. ali da može postići brzinu prenosa podataka do 100kB/S. AN555. Kod RS423 drajvera prijemnik i predajnik su (kao kod RS232) polarizovani u odnosu na masu. U samom Windowsu imate Hyper terminal.5m. Spojite konektor sa kompjuterom i uključite mikrokontroler.

Cyclic Redundancy Check) algoritma.46. 8. što pogrešno indikuje ispravno primljene podatke). Kako bi mikrokontroler mogao ispravno primati signale i u slučaju smetnji. Prilikom slanja podataka infracrvenom vezom moguće je da svetlost sunca ili sijalice ometa ispravan prijem. U slučaju neslaganja prijaviće grešku ili će jednostavno ignorisati primljeni karakter. Pri radio vezi smetnje bi mogla izazvati grmljavina ili aktivnost lokalnog radio predajnika. Više o njegovom principu imate u AN730. checksum). Kod nje bit nakon MSB sadrži informaciju o ispravno primljenih ranijih 7 bita. Najpraktičniji način detekcije grešaka u prenosu postiže se primenom CRC (eng. ukoliko se mobilni telefon uključi u blizini kablova kojim su povezani PIC i kompjuter. pouzdanosti detekcije greške i veličine dodatno prenetih podataka. Ukoliko jeste MSB se setuje (parna parnost) ili resetuje (neparna parnost). Na primer. Ovaj princip je dovoljno pouzdan za detekciju greške nad jednim bitom poslatog podatka. U vašem terminalskom programu primetili ste podešavanje provere parnosti. Više o checksumu imate u TB026. 87 u mikrokontroleru bi se izračunao njihov zbir 3+8+15+4+26+87=143 koji bi se poslao nakon podataka unutar par dodatnih bajtova. svi “primljeni“ bajtovi kao i njihov zbir biće jednaki 0. Na primer ukoliko se u kompjuter šalju sledeći podatci: 3. 4. koji pruža najbolji kompromis između brzine algoritma. 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. Međutim. pogotovu što algoritmimi zauzimaju deo brzine i memorije mikrokontrolera i što su njima preneti podaci veći od originalnih. i proverava se da li je njihov zbir paran broj (deljiv sa 2 bez ostatka). a ni on nije pouzdan u slučaju pogrešno primljena 2 (ili više) bita (ukoliko na primer nije primljen nijedan bit podataka niti kontrolne vrednosti. Nažalost sa njim su prenešeni podatci duži. To ne znači da se sa time treba preterivati (u primeru u prošlom poglavlju pretpostavlja se da se mikrokontroler nalazi u neposrednoj blizini kompjutera pa je uticaj smetnji zanemarljiv). 26. Kako funkcioniše provera parnosti? Najpre se bitovi 0-7 koda željenog karaktera redom sabiraju. pa je slanje sporije. Algoritmi za detekciju grešaka Prilikom prenosa podataka moguće je da se na spojnim putevima jave određene smetnje. 120 . u slučaju pojave greške nad više bitova bit parnosti nije dovoljan. Ovo je ipak mnogo pouzdanije od provere parnosti. poželjno je softverski detektovati smetnje i (ukoliko je to moguće) ukloniti ih iz korisnog signala. Taj princip naziva se provera ukupnog zbira (eng. Kompjuter bi nakon prijema sabrao sve podatke i uporedio dobijeni rezultat sa primljenim. 15. Umesto provere bita parnosti može se određeni broj primljenih bajtova sabrati i uporediti njihov zbir.

) koji se koristi. FSK. audio) veza mogu primenjivati RTTY. a nije ni moguć u slučaju jednosmerne komunikacije. Svakako da je ovaj način prilično vremenski zahtevan. Zbog toga se za modulaciju sporijih (npr. Oni će biti detaljnije objašnjeni u narednom poglavlju.U slučaju dvosmerne komunikacije (mikrokontroler ka kompjuteru i kompjuter ka mikrokontroleru) moguće je nakon detektovane greške u suprotnom smeru poslati podatak o rednom broju neispravnog podatka. ili u daljini preko I2C i RS485 veze! 121 . Za modulaciju bržih (npr. audio ili optička komunikacija nesumnjivo interesantna. CMI. Uglavnom je potrebno pronaći kompromis između najčešćih vrsta grešaka i količine prenetih podataka za spojni put (provodnici. Miller. Iako je radio. i dalje se oni tako modulisani prenose kroz provodnike. optičkih) veza najčešće vrste modulacije su Manchesster. PSK i razni drugi načini.. Pogledajte samo kolike su razlike u brzini prenosa podataka preko RS232 i SPI veze. ali se oni uglavnom izbegavaju). radio talasi. Uz neodgovarajući izbor modulacije neće Vam pomoći ni najbolji korektivni algoritam. audio veza. i na taj način zatražiti jedino njegovo ponovno slanje. DTMF. Kod USB ili I2C veze naponski nivoi su 0V i +5V. tako da će nadalje biti objašnjena jedino veza žičanim provodnicima. MCMI i 5B6B. Prilikom RS232 komunikacije signali se modulišu preko odgovarajućeg drajvera (MAX232) koji pretvara naponske nivoe od +5V i 0V u +15V i -15V. Pri tome mnogo može pomoći odgovarajući izbor modulacije signala. Da ti problemi prevazišli primenjuju se algoritmi za korekciju grešaka.. ili pak ponovno slanje cele grupe podataka (tačnije za signalizaciju greške pri RS232 vezi koriste se dodatni provodnici. prevazilazi okvire ovog uputstva. Kod ostalih vrsta spojnih puteva uglavnom je neophodno eliminisati jednosmernu komponentu napona (dužu pojavu logičke 0 i logičke 1). optička veza.

onda važi i A=C/B i B=C/A. Pretpostavimo da je potrebno RS232 vezom preneti dva bajta (nazovimo ih A i B). ovaj princip pogodan je jedino za regeneraciju jednog bita unutar 3 poslata bajta (A. i u slučaju da su oba bajta ista zaključio da je pogrešno primljen upravo bit parnosti. jer su preneti podaci tri puta duži od originalnih. potrebno je koristiti drugačije algoritme. jer su nam bitni jedino A i B. B i C). 0110 1011 B XOR 1101 0010 C = 1011 1001 A Da je pogrešno primljen bajt B izvršila bi se XOR operacija nad bajtovima C i A. Da bi ga regenerisao primenjuje XOR nad ispravno primljenim bajtovima B i C. pa i prenos podataka traje tri puta duže. Algoritam za korekciju jednog bita u tri poslata bajta mogao bi se realizovati po sledećem principu. Specijalan slučaj predstavljao bi pogrešno primljen bit parnosti A ili B bajta. Neposredno nakon njih pošalje se i bajt C koji predstavlja rezultat XOR operacije nad bajtovima A i B. taj princip je prilično neefikasan. Radi detekcije grešaka šalje se i bit parnosti. Međutim. pri čemu bi se za ispravno primljene podatke uzeli samo oni koji su bar u dva slučaja ista. Kako je proverom bita parnosti moguće ispravno detektovati korupciju samo jednog bita unutar bajta. događa se sledeće: 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 pogrešno primljen bajt A. 122 . Algoritmi za korekciju grešaka Najjednostavniji algoritam za korekciju poslatih podataka zahtevao bi prenos podataka 3 puta. Na taj način istovremeno je realizovana i detekcija i korekcija grešaka. a da je pogrešno primljen bajt C. Ispravna situacija izgledala bi ovako: A P 1011 1001 1 B P 0110 1011 1 C P 1101 0010 0 Međutim ukoliko bi u prenosu podataka došlo do greške u bajtu A. Onda bi se regenerisani bajt uporedio sa originalnim. Ovo je slično zakonima u matematici: Ukoliko je A*B=C.47. ne bi se ni izvršavala korekcija. U slučaju korupcije više bitova.

Multimaster) od kojih svaki može upravljati dodatnim Slave I2C hardverom. Njom je teško povezati PIC sa više uređaja istovremeno (npr. 2 bajta za adresu i čita se 1 bajt. 123 . 2 bajta za adresu (za memorije do 64Kb) i 1 bajt podatka. već predajnik prilikom predaje logičke 1 prelazi u stanje ulaza (visoke impedanse). Jedan deo adrese mu fabrički dodeljen na osnovu funkcije. ili pak više glavnih mikrokontrolera (eng. a logička 1 se javlja pod uticajem (eksternog ili internog) pull up otpornika. 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).48. Postoji ograničenje njegove maksimalne brzine. i ti uređaji moraju imati mogućnost (softversku ili hardversku) I2C komunikacije. Isto kao RS232 i I2C protokol je hardverski implementovan u moćnijim PIC mikrokontrolerima. AN554 i AN578. U nastavku će biti opisan jedino prvi slučaj. Svakom Slave hardveru povezanom sa Masterom treba inicirati slanje ili prijem podataka. dodatnom EEPROM memorijom i još jednim mikrokontrolerom). ali to troši njihove dragocene pinove. Na taj način omogućena je komunikacija preko jedne linije. i preduzima traženu akciju (obično slanje ili prijem par bajtova). sa A/D konvertorom. STOP i još par kontrolnih bitova. ali on (za razliku od predajnika) vodi računa o signalu koji prima. I2C (eng. AN541. Zadnjih godina pojavljuje se sve više hardverskih dodataka koji proširuju upotrebu mikrokontrolera. neprestano bi se izvršavala njihova prozivka (kao u Vojsci). Takt mora biti strogo sinhronizovan sa slanjem signala. Preko druge linije Master obezbeđuje takt neophodan za sinhronizaciju prijemnika signala. Za više detalja pogledajte AN515. I2C RS232 komunikacija pogodna je jedino za direktno povezivanje dva uređaja. U slučaju da je potrebno neprekidno testiranje Slave hardvera. i komplikuje softver zbog različitih komunikacionih algoritama. Master) koji upravlja dodatnim I2C hardverom (eng. Naravno. Prijemnik je za to vreme takođe u stanju ulaza. svaki Slave ima svoju jedinstvenu adresu preko koje mu se pristupa. Slave). a drugi deo bira se fizičkim prespajanjem pinova. Početak. Svaki Slave hardver ima svoje specifičnosti tako da se moraju proučiti njegovi tehnički podatci. Kako je algoritam I2C protokola razvijen tako da je nemoguće da dva uređaja istovremeno šalju podatke. uz nemogućnost kratkog spoja. Za čitanje se šalje 7 bita za adresiranje Slave hardvera (setovan LSB inicira čitanje). a za komunikaciju koriste upravo I2C vezu (umesto ranije adresne i magistrale podataka). kraj kao i razdvajanje bajtova realizovani su slično kao u RS232 komunikaciji preko START. I2C veza je specifična po tome što se logička 1 ne šalje na uobičajeni način. U I2C vezi moguće je imati jedan glavni mikrokontroler (eng. tako da će Slave prilikom slanja podataka po potrebi čekati dok Master ne bude slobodan za njihov prijem (tj. i I2C komunikacioni protokol. Svakako da je takvu komunikaciju moguće ostvariti direktnim povezivanjem pinova mikrokontrolera. ali ne i minimalne. Prilikom prijema bajta za adresiranje Slave hardvera svaki od priključenih Slave detektuje da li se radi o njemu. dok Master ne pošalje takt). Inter Integrated Circuit bus) veza omogućava povezivanje mikrokontrolera sa jednim ili više dodatnih uređaja koristeći za to samo dva pina.

Kod diferencijalnog primopredajnika umesto linije za signal i mase koriste se dve linije (A i B) za signal. ali preko četiri linije (dupleks). Budući da je preko PIC mikrokontrolera moguće jedino predati. DS1487 ili SN75176 drajveri. Zbog toga je za veće daljine praktičnije koristiti diferencijalni predajnik i prijemnik. radi boljih rezultata i većih daljina poželjno je izabrati provodnike čija je impedansa približno jednaka ulaznoj impedansi prijemnika. telefonske parice). i zajednička masa. TI 75175. Logičku 0 predstavlja 0V na A i +5V na B liniji. Početni i krajnji drajver trebaju na svojim ulaznim / izlaznim pinovima imati „terminatorske“ otpornike kojima se eliminiše refleksija signala sa krajeva linija. Pre projektovanja kola. ili 100kb/S do 1. U prijemniku se detektuje razlika napona na ove dve linije. dok je MAX488 i MAX490 kolom moguć istovremen prijem i predaja. poželjno je i za to koristiti ova kola. jer su ona projektovana tako da smanjuju električne smetnje. ali drajveri će po RS485 standardu raditi i sa bilo kojim naponima od -7V do +12V. U protivnom. najbolje je u tim slučajevima ukopati linije ili koristiti koaksijalne ili optičke kablove (još kada bi i Telekom Srbije to shvatio). npr. I2C napone od +5V i 0V. i ostavi na toj vrednosti. MAX483. i +4 i više. Na primer uz MAX481. čak i u slučaju nepostojanja terminatorskih otpornika. jer se njihove karakteristike prilično razlikuju. za detekciju signala moraju se koristiti MAX485.49. Za detekciju bi se mogli koristiti integrisani komparatori napona ili A/D konvertori prisutni u moćnijim mikrokontrolerima. Smetnje koje mogu biti indukovane (u odnosu na masu) mogu na strani prijemnika uticati na pogrešnu detekciju napona. RS423 napone od -4 i niže. Međutim. MAX488 ili MAX491 drajverom moguće je realizovati repetitor signala koji postavljen na polovini linije regeneriše signal i tako omogućava duplo duže linije. Za detekciju grešaka mogu se koristiti ranije opisani algoritmi.2V. MAX253 i MAX1480. Postoje i galvanski izolovani drajveri (pogodni za područja sa jakim smetnjama – grmljavinom). Iako je primenom RS485 komunikacionog protokola moguće postići velike daljine koristeći jeftine linije (npr. ali sa lošijim rezultatima). Iako je sasvim moguće direktno sa pinova mikrokontrolera proizvoditi potrebne predajne napone. 124 . softver se podešava za najmanju (a ipak dovoljnu) brzinu. Onda se brzina malo smanji. MAX487 i MAX1487 moguće je ostvariti dvosmernu naizmeničnu komunikaciju (simpleks) preko samo dve linije. a ne i primiti signale sa RS485 veze (Ovo nije sasvim tačno. tako da i pored tolike razlike napona nisu pogodni za veće daljine zbog mogućih smetnji. Ipak. Kada je na liniji A +5V na B je 0V i to predstavlja logičku 1. i +3V i više. Zbog uspešne detekcije razlika napona mora biti bar 0. Za manje brzine i daljine ovo ne bi trebalo predstavljati problem. proučite tehničke podatke odgovarajućih kola. MAX485. postepeno se povećava brzina do pojave grešaka. omogućavajući brzinu prenosa od 10Mb/S do 10m daljine. njihovi drajveri koriste zajedničku masu. RS485. one se potiru.2km. RS422 RS232 zahteva napone od -3V i niže. Kako se indukovane smetnje javljaju na svim provodnicima. U slučaju da brzina nije bitna.

Ovo je moguće jer RS485 standardom nije propisan komunikacioni softver. to veće kašnjenje. algoritme detekcije i korekcije grešaka.Kako je RS485 protokolom moguće da se pinovi predajnika isključe (tako što pređu u visokoimpedansno stanje – slično ulazima mikrokontrolera). samim tim i manja brzina. Najveća razlika između RS485 i RS422 protokola je u predajniku. jednom rečju da koristeći standardan stabilan komunikacioni hardver softverom komunicira na koji god način želi. tako da mikrokontroler može jedino slati signal preko dve linije. mora se povesti računa o sprečavanju istovremene predaje (npr. kao i da se retko kada koriste. Naravno. pojedinačnim asdresiranjem kao u I2C protokolu). dok bi taj signal moglo istovremeno primati do 10 prijemnika. međutim budući da oni predstavljaju varijaciju već opisanih principa. 125 . Međutim uz veće daljine i više povezanih mikrokontrolera (pogotovu uz repetitore) kašnjenje signala može biti preveliko. RS422 predajnik ne može se naći u stanju visoke impedanse. ovde neće biti razmatrani. To znači da možete napisati sopstveni komunikacioni protokol (ili koristiti gotovi RS232 – pogotovu ukoliko je hardverski implementovan u mikrokontroleru) koji će zadovoljiti vaše konkretne potrebe. Za više detalja pogledajte AN1076. postoji još par RS (eng. To pruža slobodu programeru da unutar protokola ugradi sopstvene algoritme „prozivke“ više dodatnih mikrokontrolera (do 32 ili uz više drajvera u jednom integrisanom kolu do 256). Recommended Standard) protokola poput RS449 i RS530. moguće je na taj način kao u I2C protokolu preko istih linija paralelno povezati više mikrokontrolera. već jedino hardver. Osim ovih. Što duže linije. Korišćenjem repetitora moguće je realizovati virtuelno beskonačne mreže.

esta. Za povezivanje se koriste RS485 drajveri. Više detalja imate u AN1076 i na www. a protokol predstavlja softver za upravljanje tim drajverima. Modifikacija se sastoji u drugačijem obliku START bita (dosta duža logička 0 pa 1).org. Prijemnici bi morali redom brojati primljene bajtove kako bi videli koji je bajt za njih. DMX512 Ponekad je dovoljno slati informacije samo u jednom smeru. Konkretno za slučaj rasvete. Pošto 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. to im nije ni potrebno. ionako će naredni podatak sadržati ispravnu vrednost jačine svetla. Broj poslatih bajtova mogao bi se smanjiti za slučaj manjeg broja prijemnika. DMX512 (eng. Čak i da dođe do greške. prijemnici nemaju način signalizacije neispravno primljenog podatka. Kako se DMX512 protokolom povezuje jedan predajnik sa više prijemnika samo u jednom smeru. Digital MultipleX) predstavlja komunikacioni protokol sposoban za adresiranje do 512 prijemnika i koji se uglavnom koristi za upravljanje rasvetom.50. STOP bita (dve logičke 1) i rednom slanju svih 512 bajtova sa STOP bitovima između njih. 126 . DMX512 protokol napravljen je tako da se podaci neprestano (tačnije bar jednom u sekundi) šalju prijemnicima.

tako da i oni mogu otići u sleep mod. podaci se kroz provodnik prenose asinhrono. Ostali nodovi po prijemu ove komande trebaju podesiti interapt po promeni stanja na pinu na liniji. Master može poslati sve nodove u sleep mod. master mora obezbediti povremenu prozivku nodova u slučaju da su njihovi podaci potrebni ostalim nodovima. LIN protokol nije stekao veliku popularnost zbog kašnjenja u proizvodnji odgovarajućih integrisanih drajvera. tako da dodatna intervencija mastera u tom slučaju nije potrebna. Ipak. Svi nodovi mogu primati poruke od ostalih nodova direktno. Nakon sinhronizacionog bajta sledi jednobajtno zaglavlje. osim SLEEP komande i checksuma informacija. kao kod RS232 veze. Protokol je nastao ukrštanjem I2C i RS232 protokola. Za više detalja pogledajte AN729. Zbog toga kao sinhronizacioni impuls pre svake poruke master šalje bajt b'01010101'. u kome se saopštava kakvi podaci slede. Napon na liniji (generisan pull-up otpornikom) iznosi od 9 do 18V u odnosu na masu. nod) može na liniju poslati logičku 0. master može u delu sa informacijama zatražiti prijemni status od pojedinačnih nodova. Bilo koji član mreže (eng. 2 bita (bitovi 4 i 5) određuju dužinu informacija (2. Za razliku od I2C veze umesto linije za takt. 4 ili 8 bajtova). LIN protokolom nije specifiran format narednih informacija. slanjem identifikacionog bajta 0x80. AN235 i AN237. 127 .51. Napon na liniji je u neaktivnom stanju na nivou logičke 1 generisane (kao kod I2C) pull up otpornikom. Bilo koji nod može probuditi ostale slanjem 0x80 koda. i zadnja 2 bita (6 i 7) služe za proveru parnosti zaglavlja. koja na taj način prelazi u dominantno stanje i briše postojeću logičku 1. U njemu 4 bita (bit 0 do bit 3) adresiraju nodove na liniji. pri čemu se svi slave nodovi softverski sinhronizuju sa masterom po prijemu njegovog signala. LIN protokol je zbog većeg broja nodova napravljen tako da mikrokontrolerima omogući što jeftiniji hardver. Tako je svakom slave nodu omogućena sinhronizacija korekcijom sopstvenih vremenskih rutina u skladu sa primljenim bitskim vremenima logičke 0 i 1. male daljine i podložnosti smetnjama usled direktno polarisane linije. Kako nakon pojave greške LIN protokolom nije omogućena njena prijava. LIN LIN komunikacioni protokol podržava dvosmernu komunikaciju preko jednog provodnika (+ masa). pa je zato moguće koristiti RC oscilatore. Po njegovom prijemu svi nodovi se bude i čekaju dalje informacije od mastera.

Digitally Addressable Lighting Interface) protokol je namenjen upravljanju pre svega fluo cevima. Imam ih u svim prostorijama osim kupatila (zbog vlage). DALI DMX512 komunikacija je jednosmerna. Iako se regulacija svetlosti sijalica sa užarenim vlaknom lako implementira faznom regulacijom. njen princip je nepraktičan u slučaju kvara sijalice (reflektora). Dimerom je omogućeno da se potrošnja električne energije još više smanji. implementirani su diskretnom tehnologijom. 128 . podešavalje svetla po grupama i slično. Što se tiče početnih investicija. ali logaritamskog odnosa. DALI dimming ballast). kod fluo cevi sa prigušnicama je to mnogo teže izvesti. kriogenske i retki Luxeon eksperimentalni tipovi LED. Na DALI interfejs moguće je povezati do 64 nodova. Tek su se oko 2000-te godine pojavili tranzistori dovoljno jeftini i dovoljno velikog probojnog napona da mogu poslužiti kao konvertori mrežnog napona u napon potreban za rad fluo cevi. vremenom će se isplatiti kroz manji račun za električnu energiju. DALI (eng. Tačnije. za prijem i predaju signala koriste se optokapleri. Kako je DALI protokol rezultat saradnje Microchipa i International Rectifiera. Zato joj je primena ograničena na upravljanje rasvetom. i da po potrebi obavesti master o kvaru.com/product-info/lighting/. Taj princip koristi DALI za funkciju dimera (eng. Zbog čega baš njima? Zbog toga za istu potrošnju električne energije jaču svetlost od njih (Lm/W) daju jedino metal-halidne. DALI protokol nema posebne integrisane drajvere.3€ (u odnosu na sijalicu sa užarenim vlaknom koja je oko 0. sodijumske (i niskog i visokog pritiska) sijalice. od svih ovih tipova jedino fluo cevi se mogu nabaviti po povoljnoj ceni. dodatne informacije o DALI protokolu mogu se jedino naručiti na CD-u sa sajta http:// www. Verujte mi na reč. Za više detalja pogledajte AN809 i AN811. Takođe je moguće proizvesti i moćne efekte postepenog pojačanja ili smanjenja svetla.2€). čime je pored niske cene drajvera omogućeno i galvansko odvajanje linije od mrežnog napona.52. Regulacija svetlosti postignuta je u 255 koraka. On pruža prirodniji odnos pojačanja i smanjenja svetlosti. Iako jedna fluo cev košta oko 1. Međutim. Zgodnije bi bilo kada bi bilo moguće da drajver za sijalicu detektuje da li ona zaista radi.irf. Umesto njih.

imajte u vidu da je proces formiranja sistema za podršku fajlova (eng. Iako SPI protokol nema ograničenje najmanje brzine. Obično se koristi prilikom komunikacije sa serijskim EEPROM memorijama. omogućavajući adresiranje ostalih slave SPI hardvera. Isto kao i RS232 i I2C kod moćnijih mikrokontrolera je SPI hardverski implementovan. tako da PIC16 serija mikrokontrolera obično nema dovoljno resursa za njeno efektno korišćenje. Ukoliko je na CS pinu povezanom na odgovarajući slave SPI hardver prisutna logička 0. Preko druge (SI) linije sinhronizovano sa taktom šalju se podatci u ili iz mikrokontrolera. FAT32 ili NTFS) u memorijskim karticama kao i sistem snimanja i čitanja fajlova iz takvog fajl sistema prilično komplikovan. Za jedan SPI slave hardver dovoljne su tri linije. SPI protokol sličan je I2C protokolu. niti na MP3 plejeru ne možete slušati muziku dok je povezan sa kompjuterom. Filesystem npr. AN648 i AN909. Interesantna je mogućnost istovremenog slanja podataka svim Slave hardverima ukoliko su sve CS linije na logičkoj 0 (svi slave očekuju podatke).). a svaki naredni mora imati svoj CS (eng. sa glavnom razlikom adresiranja raznih slave uređaja preko posebnog pina. 129 . kao i memorijskim karticama (MMC. Iako memorijske kartice u osnovi predstavljaju veliku EEPROM memoriju..53. Isto kao kod I2C protokola. Serial Peripheral Interface) predstavlja komunikacioni protokol namenjen brzom prenosu signala. Za više detalja pogledajte AN248.. xD. U protivnom. ali mikrokontroler mora obezbediti po jedan pin za adresiranje svakog slave hardvera ponaosob. CF. SPI SPI (eng. a ne prozivkom njihove adrese. FAT16. Na taj način slave hardver ne mora imati dodatne pinove za formiranje svoje adrese. Upravo zbog toga Vaš digitalni foto aparat ne možete istovremeno koristiti kao web kameru. zbog bržeg prenosa veće količine podataka se mikrokontroleru obično zabranjuje izvršavanje ostalih operacija. Chip Select) pin. na kratkim odstojanjima. mikrokontroler (master) je uvek zadužen za generisanje takta preko SCK linije. SD. onda će on reagovati na signale sa ostale dve linije. ignorisaće ih i njegovi pinovi biće neprestano u stanju visoke impedanse.

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 moguća je dvosmerna komunikacija. Iako je INKnet protokol prvenstveno razvijen za 8052 mikroprocesor (tih godina su mikrokontroleri bili retki i skupi), protokol se može iskoristiti ili prilagoditi bilo kom današnjem mikrokontroleru. Komunikaciju inicira centralni mikrokontroler (master), šaljući zahtev za informacijama pojedinačnim ćelijama (nodovima - eng. node). Oblik poruke je takav da se u njoj pre informacije šalje desetobajtno zaglavlje, a nakon njega informacije sve do maksimalne veličine poruke od 255 bajtova. bajt 0 – rezervisano, mora biti 0 bajt 1 – dužina poruke sa zaglavljem (9 do 255) bajt 2 – adresa noda primaoca informacije bajt 3 – komanda primaocu bajt 4 – adresa noda pošaljioca informacije bajt 5 – adresa rezervisanog noda bajt 6 – MSB bajt status flagova noda bajt 7 – LSB bajt status flagova noda bajt 8 – LSB bajt checksuma bajt 9 – MSB bajt checksuma bajtovi 10 do 255 – informacije Uočavate da je ovim načinom moguće poslati maksimalno 245 bajtova informacija. Više informacija moralo bi se poslati unutar više poruka (kao SMS poruke). Iako svi nodovi mogu istovremeno primiti informacije, master je taj koji će na osnovu zaglavlja (i informacija) regulisati rad i komunikaciju između nodova. Slično kao adresa noda primaoca i pošaljioca, rezervisani nod će nadalje odgovarati na poruke pošaljioca koji ga je rezervisao. Komanda primaocu ukazuje šta nod primaoc poruke treba uraditi sa informacijom. Ovde su prikazane standardne komande, ali mogu se po potrebi proširiti, što zavisi od konkretnih zahteva mreže. 80 - POLL Poll from master to 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, takođe (kao kod STATUS registra mikrokontrolera) određeni flagovi opisuju funkcije noda. Flagovi su sledeći: 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 omogućava efikasnu integraciju standardnog RS485 drajvera i namenskog softvera za pravljenje sopstvene mreže mikrokontrolera. Detekcija grešaka implementirana je checksumom, a korekcija ponovnim slanjem informacije ukoliko prijemni nod pošalje zaglavlje sa setovanim CSUM bitom njegovog status bajta. Za više detalja pogledajte časopise Circuit Cellar broj 10 (avg/sep 1989), 11 i 12. U njima možete pronaći i objašnjenja interesantnih principa komunikacija bez mastera (detekcijom kolizije ili rednim transferom dozvole predaje od jednog ka drugom nodu). Unutar istih časopisa možete videti i organizacionu strukturu složenijih komunikacionih protokola, formiranu po slojevima (eng. Layers) u CEBus protokolu. Za jednostavniji komunikacioni protokol preko RS485 drajvera pogledajte časopis Circuit Cellar broj 21.

131

55. S-ARTnet
INKnet protokol sa RS485 drajverima pored očiglednih prednosti ima i par mana. Pored signala, svakom nodu potrebno je dovesti i napon napajanja (+5V i 0V). Bilo bi svakako jeftinije ako bi se broj provodnika mogao na neki način smanjiti. S-ARTnet (eng. Serial, Addressable, Receive/Transmitter) protokol rešava ovaj problem, tako što se kroz dva provodnika prenosi i napon napajanja i koristan signal. Ovo je omogućeno tako što izlazni napon drajvera može biti 15V, 7,5V ili 0V. Prijemnik na osnovu ovih napona detektuje da li je poslata logička 0 ili logička 1. Kako napon od 0V traje prilično kratko, nodovima će za to vreme napajanje obezbeđivati kondenzator. S-ARTnet protokolom moguće je adresirati do 30 slave nodova. S-ARTnet protokol kao i INKnet ima master koji za komunicira sa pojedinim slave nodovima. Međutim, njegovi slave nodovi nisu dodatni mikrokontroleri, već ih predstavlja specijalizovano integrisano kolo CS212. Ono u sebi ima objedinjen komunikacioni protokol, dva ulazna i dva izlazna pina i ulazno izlazni drajver. Adresa odgovarajućeg slave noda hardverski se postavlja povezujući pinove CS212 kola ka masi ili naponu napajanja (slično kao kod I2C). Master i slave nodovi komuniciraju preko 10-bitnih poruka. Poruka može biti jedna od 3 sledeća tipa: 1. Sinhronizacija – Master šalje poruku 0111111110. Na osnovu nje svi slave nodovi sinhronizuju svoj takt. 2. Piši – Master šalje poruku tipa A0 A1 A2 A3 A4 Pa Wr D0 D1 Pd gde A0 do A4 bitovi sadrže adresu željenog noda, D0 i D1 logičko stanje koje se treba postaviti 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 logička stanja na njegovim ulaznim pinovima, a Pd je bit provere parnosti. S-ARTnet kao ni DALI ne sadrži integrisane drajvere za master, ali ih ima u CS212 kolima. Neophodna konverzija logičkih nivoa se za master obezbeđuje odgovarajućim konvertorima signala. Preko ovog protokola master može adresirati do 30 slave nodova, odnosno očitavati 60 udaljenih ulaznih pinova, i postavljati do 60 udaljenih izlaznih pinova slave nodova. Po potrebi, master može periodično vršiti prozivku svih nodova. Zbog male dužine poruka i trostepenog stanja na liniji, moguće je prozivati svih 30 nodova 6 do 7 puta u sekundi. Više o ovom protokolu imate u časopisu Circuit Cellar broj 21.

132

56. CAN
Svi raniji principi zahtevaju softversku detekciju i/ili korekciju grešaka u okruženju podložnom smetnjama. Naravno da je to moguće uraditi (kao u INKnet protokolu), ali Microchip se potrudio pa je softver koji bi inače opterećivao mikrokontroler prebacio u hardver. Tako jedno integrisano kolo (MCP2510 ili MCP2515) obavlja komunikacionu funciju (u kojoj je implementirana CRC detekcija grešaka, korekcija grešaka, izazivanje interapta po prijemu signala...), a drugo predstavlja drajver za spojni put (MCP2550 ili MCP2551). Drajverom upravlja komunikacioni čip, a komunikacionim čipom mikrokontroler preko SPI protokola. Isto kao RS485, i CAN standard koristi diferencijalne signale. Međutim, za razliku od RS485, CAN standardom propisan je i komunikacioni protokol. U njemu je mikrokontroler rasterećen od komunikacionih algoritama, i može svu svoju snagu upotrebiti za ono za šta je i namenjen. Po CAN protokolu ne vrši se (kao kod I2C ili INKnet) prozivka svakog pojedinačnog noda. Ne. Nodovi se ne adresiraju ni posebnim pinovima kao kod SPI protokola. Umesto toga, nodovi su ravnopravni. Svi oni moraju određeno vreme „osluškivati“ stanje na liniji pre nego što počnu sa predajom, kako ne bi upali u već postojeću vezu. Ukoliko se ipak dogodi da dva ili više nodova istovremeno započnu predaju podataka, na scenu stupa kolo za detekciju kolizije (eng. Collision Detection). Po detekciji kolizije nod koji je prvi predao logičku 0 unutar podatka nastavlja sa predajom, dok ostali (čim detektuju 0 dok u stvari šalju 1) momentalno prestaju sa predajom, čekaju dok se ne završi sa slanjem kao i neko vreme nakon toga (da se ne bi javilo novo preplitanje), i tek onda pokušavaju novu predaju. Kako je logička 0 „dominantna“, ona će uvek prebrisati logičku 1 (slično kao u I2C). Na taj način podatak će stići do prijemnika neizmenjen i bez ikakvog kašnjenja ili korekcije, a za komunikaciju se (zbog iste linije za slanje i prijem podataka) koriste samo dva provodnika (i zajednička masa). U CAN mreži pojedinačni nodovi nemaju adrese. CAN protokol nije adresno već komandno orjentisan sistem. Zbog toga nodovi obično komuniciraju između sebe periodično šaljući poruke po liniji. Ako je nekome potrebna, eto mu je. Ukoliko nije, ignorisaće se. Struktura CAN protokola omogućava upotrebu hardverskih CAN ekspandera (kao kod S-ARTnet veze). Microchip je zaključio da se veliki broj nodova sastoji jedino od odgovarajućeg U/I hardvera (U/I pinova, A/D konvertora ili PWM modulatora), pa je proizveo seriju U/I ekspandera koji se mogu direktno povezati na CAN mrežu, i čijim je hardverom moguća direktna manipulacija od strane ostalih (inteligentnijih) nodova. Za više detalja pogledajte datasheetove drajvera, komunikacionog čipa, CAN I/O ekspandera, AN215, AN228 i AN754. Razvitkom CAN mreže originalni protokol pretrpeo je izmene softvera, pa je moguće sresti verzije CAN 1.2, CAN 2.0A, CAN 2.0B i ECAN. Na sreću, novije verzije podržavaju starije (eng. backward compatibile). Za više detalja pogledajte AN916. 133

bit-banging) kao što je ilustrovano u RS232 vezi. Taj način nekada može biti i neophodan (na primer prilikom istovremene upotrebe 3 RS232 veze jednim mikrokontrolerom).Jedan deo do sada opisanih komunikacionih protokola je hardverski integrisan u jačim serijama mikrokontrolera. zatim ISDN. I sami verovatno znate da se nekada mogao koristiti jedino dial-up. Komunikacioni protokoli ne prestaju da se razvijaju. Mikrokontroleri su u potpuno istoj situaciji. i na taj način ostvariti softversku implementaciju hardverskih komunikacionih rutina (eng. Uvek je moguće (u slučaju da je mikrokontroler dovoljno brz) pravovremeno direktno manipulisati ulazno izlaznim pinovima. To ipak ne znači da se slabiji mikrokontroleri (čitaj PIC16F84) ne mogu koristiti za određene vrste komunikacija. 134 . Brzina i dalje raste. a onda ADSL.

od hardv. asinhroni simpl. +12V -7V. ne -7V. od mag. bez Preko 9V preko ?V 15V softvera razlike u + takta razlike u + razlike zav. impedansa zav. 1 + masa 2 + masa / 3k do 7k zav. max. +40V +-0. od soft. 15V hardverska -40V. +5V checksum zav. gresaka ne bit parnosti zav. članova magistrale prij. kapaciteta linije 16 slave slave slave 112 prij.57. 1 + masa 2 / / / / zav. od drajv. max.od hardv. od soft. od hardv. implement.2Mbita/S max daljina mala. 32 1 pred. +5V ne 0V. malo zavisi od 1 master + 1 master + 64 1 master + 30 112 pred. od mag. ne ne ne parnost +? dva bita hardverska korek. 400kbita/S 20kbita/S ? ? 1Mbit/S hardverom do 3Mbita/S ili 3. zav. 512 1 pred. U sledećoj tabeli dat je uporedni pregled ovde opisanih vrsta komunikacije sa svojim specifičnostima: 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. 7. ne ne implement. asinhroni sinhroni sinhroni asinhroni asinhroni asinhroni 2 + masa 4 + masa da >=12k 2 + masa / da >=12k 4 + masa / / zav. broj zavisi od adr. implement. zav... prij. Sve zavisi od toga za šta Vam je potrebna.. / zav.br.2km 1. od drajv. 1 pred. +18V ? parnosti ne 0V. 1+masa / / zav.gresaka ne zav. ne hardverski MCP2510 max.2V zavisi od zavisi od zav. +-?V trostepena diferencijalni diferencijalni hardvera hardvera diferencijalni zavisi od preko 0.od hardv. od soft. od soft. +25V drajvera osetljivost zavisi od +-3V. brzina ograničena 20kbita/S 100kbita/S 100kbita/S 5Mbita/S 100. 160 . Koju vezu odabrati? Ne postoji univerzalan odgovor na ovo pitanje. zav.5m 0.od hard. prij.5m 1Mbit/S detek. ? 0V. prij. napon 0V..oko 15m 1. od optok. repetitor ul..4V nema takta visoka imp. 2 + masa / / zav. +5V -25V.2km mala. 1 32 pred.oko 20cm 40m ? ? 40m pri 0.prov.br.oko mala.5V diferencijalni nema signala asinhroni 2 + masa / 100k +-0. +12V ne 0V. od soft.5V. Dobar uporedni prikaz imate u časopisu Circuit Cellar broj 26.prov dupl. prijemnika hardvera prema masi neaktivno 0V preko +3V stanje način pren.2V +-0.

87V 1.21V 1.51V. Paralelna D/A konverzija za razliku od serijske zauzima više pinova. to zbog standardnih vrednosti otpornika poskupljuje realizaciju.20V Kako je impedansa izlaznih pinova (pri oba logička stanja) PIC mikrokontrolera prilično niska (manja od 75Ω pri naponu napajanja od 5V) daljim širenjem otporne mreže ne bi se postigli zadovoljavajući rezultati. Decimalni Bitovi broj RB3 RB0 0 1 2 3 4 Ovde je primenjena binarna otporna mreža kod koje je otpornost povezana na pinove bita veće težine dva puta manja. binary weighted DAC). bitovi veće težine više utiču na stanje izlaznog napona od bitova manje težine. pre svega u pogledu linearnosti izlaznog napona. preciznost ovog kola u velikoj meri zavisi od tačnih vrednosti i tolerancije upotrebljenih otpornika.58. i na izlazu će se odmah javiti stabilno analogno stanje. Pogledajte najpre hardversku realizaciju paralelnog D/A konvertora principom binarne težinske otporne mreže (eng.79V 1. To može biti od koristi kod povećanja dinamičkog opsega govora u sistemima za digitalizaciju zvuka.85V 2. 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.17V 2. U situacijama kada je neophodna veća rezolucija D/A konvertora može se koristiti D/ A konvertor sa R-2R otpornim nizom (eng.ke4nyv. 136 . Za više detalja ovakve težinske mreže pogledajte http://www. Paralelna D/A konverzija Ovde će biti prikazana dva hardverska načina realizacije paralelnog D/A konvertora. Po potrebi binarna težinska mreža može se napraviti sa logaritamskom a ne linearnom karakteristikom izlaznog signala.99V 2.48V 0.12V 3.63V 2. R-2R ladder DAC). Zbog bolje linearnosti idealno bi bilo upotrebiti otpornike sa dupliranom vrednošću prethodnih. Zbog karakteristika ove mreže.51V 2.55V 1.htm.05V 3. Osim toga.com/index2. a RB0 za samo 0.48V. jer po Laplacianovoj distribuciji oblast oko napona bliskog 0 nosi više informacija od oblasti sa većim amplitudama. Tako setovanje RB3 pina podiže napon za 2.96V 3. ali daje stabilniji generisani napon i ne opterećuje mikrokontroler.75V 2. Međutim. Na PORTB dovoljno je dovesti željenu binarnu kombinaciju.

a zavisi jedino od tolerancije upotrebljenih otpornika. Ukoliko mikrokontroler treba izvršavati i druge operacije za vreme generisanja signala. najpraktičnije je uzimati bajtove za POTRB iz tabele. To znači da se ovim kolom može (za razliku od prethodnog) dobiti čak 255 stabilnih analognih stanja.5V 1V 1.com/. trouglasti.5V 5 00000000 00011011 00110101 01001111 01101001 10011101 11010001 11101011 11111111 Linearnost ovog kola je skoro idealna. Za kompletnu tablicu izlaznih napona i detalje pogledajte AN655 sa http:// www. Rezolucija ovog kola je osmobitna. umesto dupliranja vrednosti otpornosti koriste se otpornici istih vrednosti. I sinusni signal možete dobiti korišćenjem matematičkih funkcija. Tako se mogu sa lakoćom realizovati testerasti. u interapt rutini možete neprekidno povećavati stanje PORTB registra. Naizmeničnim povećavanjem i smanjivanjem stanja PORTB registra dobijate testerasti signal.microchip. 137 . sinusoidni oblici napona.5V 2V 3V 4V 4. pa čak i DTMF tonovi.Kod ove šeme. Na primer. U tablici možete videti neke tipične vrednosti izlaznog napona u zavisnosti od postavljenog binarnog stanja na PORTB. možete jednostavnije funkcije realizovati i softverski. Tako dobijate testerasti signal. kolo sa ovakvom šemom može čak imati manje dimenzije. Decimalni broj 0 27 53 79 105 157 209 235 255 RB7 RB0 Izlazni napon 0V 0. Korišćenjem integrisanog otpornog niza. Za generisanje složenijih talasnih oblika izlaznih napona.

održavajući tako napon na njemu u željenim granicama. ali u tom slučaju gubite na preciznosti generisanog signala. poželjno je na izlazu D/A konvertora staviti analogni filter. Serijska D/A konverzija Serijska D/A konverzija koristi drugačiji princip. Pogledajte http://en. u PIC16F84 može se implementirati softverski. a polovina kada se na 50% periode naizmenično menja logičko stanje pina. Na primer četvorobitna rezolucija D/ A konvertora sasvim je dovoljna za generisanje prilično čistog sinusoidnog signala. Svakako da je možete povećati manjim brojem različitih semplova koje koristite za generisanje željenog talasnog oblika. 138 . maksimum kada je neprekidno prisutna logička 1. Minimum napona postojaće kada je na pinu neprekidno prisutna logička 0. Sve zavisi od toga kakav signal želite generisati.org/wiki/Analog-to-digital_converter za više detalja. Za PIC16F84 od značaja bi mogao biti interesantan način modulacije tona sa download sekcije sajta www. Kod nje se kondenzator na izlazu naizmenično puni i prazni tačno određenim odnosom. Iako je hardverski realizovana u nekim savremenijim PIC mikrokontrolerima. 6 i 9V. efektivni napon biće 3. propusnik željenog opsega frekvencije.ba (picsound).59. 50 ili 75% vremena. Postupak kojim se puni i prazni kondenzator naziva se modulacijom širine impulsa (eng. Gornja granična frekvencija koju možete dobiti bilo kojim od prikazanih načinina D/ A konverzije zavisi isključivo od brzine oscilatora mikrokontrolera. Posebno je to poželjno kod serijskih D/A konvertora zbog harmonika i smetnji koje oni generišu. Ovaj način D/A konverzije uglavnom se upotrebljava za regulaciju brzine motora jednosmerne struje. Na primer ukoliko je napon +12V a tranzistor provodi 25. Ukoliko se mikrokontrolerom generišu sinusoidalni naponi stalne frekvencije.wikipedia.elektronika. Nastavak sledi Pored ovih. ali je za generisanje DTMF tonova neophodna bar osmobitna rezolucija. Ova tehnika često se koristi za uključenja i isključenja prekidačkog tranistora određeno vreme. Nije pogodan za primene u kojima je potrebna veća stabilnost izlaznog signala zbog generisanja smetnji i harmonika. postoji još mnogo. PWM – Pulse Width Modulation). mnogo principa po kojima se može implementovati D/ A konverzija.

Da biste shvatili rad raznih vrsta A/D konvertora morate se najpre upoznati sa principom rada naponskog komparatora. Kako on nije vezan za takt mikrokontrolera. kompletnu A/D konverziju može obaviti trenutno. 139 . Glavna prednost Flash konvertora je kako mu ime kaže (eng. Flash A/D konvertor Verovatno Vam je već poznato da PIC16F84 nema u sebi integrisan A/D konvertor za razliku od nekih savremenijih mikrokontrolera. a na drugom ulazu se napon polako povećava od 0 do 5V. može mu se dodati spolja. Međutim. Zato se ovaj tip A/D konvertora retko koristi. Na jedan ulaz svih komparatora doveden je mereni napon. izlaz komparatora biće u stanju logičke 0 sve dok napon na drugom ulazu ne pređe zadatih 3V. munja) njegova brzina. morate ga napajati istim naponom napajanja kao i PIC (+5V). Ka kom će izlazu (logička 0 ili logička 1) tada biti naklonjen uglavnom zavisi od stanja izlaza neposredno pre jednakih napona. Najteže će se naponski komparator snaći ukoliko se pogodi da je napon na oba ulaza potpuno isti (3V). Međutim. Iako je problem velikog broja ulaznih pinova moguće prevazići upotrebom određenih digitalnih konvertora u binarni format. U narednim poglavljima biće prikazano par principa A/D konverzije. i ukoliko je jedan veći od drugog. 4 naponska komparatora u sebi sadrži popularno analogno integrisano kolo LM339. Ako želite flash A/D konvertorom realizovati četvorobitnu konverziju. Šta u stvari radi naponski komparator? On poredi (eng. menja stanje svog izlaza. Compare) napone svoja dva ulaza. ukoliko se na jedan njegov ulaz dovede se referentni napon od 3V. Pri tom smanjivanju može se (menjanjem vrednosti otpornika) koristiti logaritamski ili linearni odnos napona. On je realizovan pomoću više naponskih komparatora.60. a sa dva 9 stanja. a na drugi su dovedeni referentni naponski nivoi koji se redom smanjuju od najvećeg do najmanjeg. da biste na njegovom izlazu dobili naponske nivoe logičke 0 i logičke 1. Broj upotrebljenih naponskih komparatora direktno određuje broj stanja izlaza. Jedini predstavnik potpuno paralelnog A/D konvertora je Flash A/D convertor. Međutim. Za osmobitnu konverziju potrebno je 255 ulaza. Pinovi RB4 do RB7 upotrebljeni su jer se njima može izazvati interapt pri promeni ulaznog napona. iako ga PIC16F84 nema. biće Vam potrebno 16 ulaza (i 16 ulaznih pinova mikrokontrolera). Naponski komparator nalazi se integrisan u savremenijim verzijama PIC mikrokontrolera. uz jednostavan interfejs sa njim je moguće meriti odgovarajuće vrednosti napona. Kako je LM339 potpuno analogno kolo. Sa jednim kolom moguće je detektovati 5 decimalnih stanja. ima on svoje mane. ovoliki broj naponskih komparatora nije baš najjeftiniji. Na primer.

Ovaj A/D konvertor specifičan je po tome što mu je za rad potreban D/A konvertor. Izlazni napon D/A konvertora se povećava korak po korak (od 0V do 5V). . Verovatno će mu dosaditi mnogo pre nego što se uopšte približite zamišljenom broju. Zamislio je. Izlaz D/A konvertora vodi se na jedan ulaz eksternog naponskog komparatora.. btfsc PORTA. Verovatno i sami uviđate manu ovog principa. Krenite redom sa pitanjima: Da li je to broj 0? Nije. Jesu. . To stanje odgovara merenom analognom naponu. pa u PORTB – tako povećaj izlazni napon. Zamolite svog prijatelja da zamisli broj između 0 i 1000. Da li je to broj 1? Nije. Nisu.F . 140 .. movf SPORTB. Mikrokontroleru neće. Brojački A/D konvertor Ovaj tip A/D konvertora u stranoj literaturi (eng. Povećaj Shaddow registar.. U trenutku kada naponski komparator promeni stanje. Glavna rutina programa sa ovakvim principom izgledala bi ovako: Pet incf SPORTB. a na drugi ulaz dovodi se mereni napon.. To može potrajati.RA0 . movwf PORTB . Ukoliko je mereni napon blizu svoje maksimalne vrednosti. Da bi se vreme merenja što više skratilo. Jesu li se ovi naponi sada izjednačili? goto Pet . mikrokontroler mora D/A konvertorom povećavati napon od 0V pa sve do merenog napona. Taj D/ A konvertor u šemi je realizovan R/2R otpornim nizom. očita se trenutno stanje na izlaznim pinovima D/A konvertora.61. Prebaci u W. primenjuje se princip opisan u narednom poglavlju.W . . Njemu će dosaditi. Da li je to broj 2? Nije. povećavaj i dalje. W sadrži vrednost A/D konverzije.) se još sreće sreće pod nazivima Counting ili Digital ramp. Sasmim tim preciznost A/D konvertora u najvećoj meri zavisi od preciznosti D/A konvertora.

Da li je veći od [94+((125-94)/2) = 109. Iseče se na pola. Znači broj je između 0 i 250. ovaj pin ostavi se setovan ili se resetuje. resetuj ga. Ukoliko ovaj princip primenite umesto (kao u brojačkom A/ D konvertoru) postepenog povećanja napona korak po korak. vreme utrošeno na merenje biće mnogo. Broj je između 94 i 125.. Da li je veći od [0+((125-0)/2) = 62. Broj je između 112 i 114. bsf PORTB. Da li je veći od [110+((114-110)/2) = 112] 112? Jeste. zatim na četvrtine. Sukcesivno aproksimativni A/D konvertor Da bih Vam ilustrovao princip rada ove A/D konverzije obrazložiću Vam princip algoritma binarne pretrage unutar sortiranog niza podataka. i tako sve do najmanjeg parčeta. Da li je veći od [110+((118-110)/2) = 114] 114? Nije. Onda se prelazi na RB6. Najpre se setuje bit najveće težine (MSB . Ovaj princip možete zamisliti kao sečenje pice. I tako sve do RB0 pina. Zamislio je.0 . Broj je između 110 i 114. a u pravim programima bi se koristio i Shaddow registar. Ukoliko je napon preveliki.5] 63? Jeste. Znači njegov broj je između 0 i 500.5 .RB7) na PORTB registru. Kod je dat ilustrativno. RB5. Da li je veći od [112+((114-112)/2) = 113] 113? Jeste. Opet zamolite svog prijatelja da zamisli broj između 0 i 1000. Vidite da ste za razliku od prethodnog slučaja sa samo 10 pitanja uspeli da dođete do tačnog rezultata.5] 118? Nije.6 . Broj je između 0 i 125. Onda je to broj 114. U zavisnosti od stanja naponskog komparatora. Broj je između 110 i 118. Setuj naredni btfss PORTA. uz potpuno istu električnu šemu. bcf PORTB. Sada ga pitajte je li njegov broj veći od [0+((1000-0)/2) = 500] 500. Na kraju će PORTB sadržati izmerenu vrednost napona. Da li je veći od [110+((125-110)/2) = 117. clrf PORTB . Ukoliko je napon preveliki. Da li je veći od [0+((500-0)/2) = 250] 250? Nije.7 .5] 110? Jeste. mnogo kraće. Program je prilično jednostavan. Broj je između 63 i 125.62. Nije. resetuj ga. Da li je veći od [63+((125-63)/2) = 94] 94? Jeste. Inicijalizuj PORTB bsf PORTB. 141 . pa na osmine.0 . Da li je veći od [0+((250-0)/2) = 125] 125? Nije. Setuj MSB btfss PORTA. bsf PORTB.7 ... E sada..6 . bcf PORTB. Broj je između 110 i 125. Setuj naredni . RB4.

naizmenično se vrši postavljanje pina na logičku 0 (pražnjenje kondenzatora). Možda Vam čudno deluje taj skok na interapt rutinu. Wilkinsonov A/D konvertor Ranije šeme zbog upotrebe D/A konvertora zauzimaju previše dragocenih pinova mikrokontrolera. možete umesto naizmeničnog menjanja stanja pina (ulaz/izlaz) možete koristiti neku od sledećih šema: Ovo kolo najpre drži RB0 na logičkoj 0 dovoljno dugo da se kondenzator isprazni. Ovo vreme je 5*R*C. One Vam mogu poslužiti za merenje otpornosti. Broj ciklusa pražnjenja / testiranja ili proteklo vreme direktno određuje vrednost merene otpornosti. Međutim. ovo vreme direktno će zavisiti od trenutne vrednosti otpornosti. Na primer u vreme. Ukoliko Vam je potrebno brže merenje. Sa njegove strane mnogo je zgodnije mereni napon konvertovati u neku drugu fizičku veličinu. a zatim se meri vreme koje je potrebno da se na pinu javi logička 0. Zatim se pin RB0 postavlja u stanje ulaza. temperature (upotrebom NTC ili PTC otpornika). intenziteta svetlosti (upotrebom fotootpornika) ili kapacitivnosti (upotrebom kapacitivnih senzora).63. Prekid programa interaptima za vreme merenja dovešće do nepreciznog očitavanja vrednosti. Prednost ove šeme nad prethodnom je mogućnost pojave interapta po promeni stanja na RB0/INT pinu. odnosno da mu oba pola budu na potencijalu od 0V. RB0 se postavi na logičku 1. Očigledno je da se PIC16F84 takav kakav je ne snalazi najbolje sa merenjem i poređenjem napona. kondenzator se napuni. Čim se kondenzator u potpunosti napuni. Taj princip primenjen je u sledećim šemama. Još jednim interaptom izazvanim tajmerom. one zahtevaju upotrebu naponskog komparatora za svoj rad. konfigurisanje pina kao ulaz i testiranje da li se kondenzator dovoljno ispraznio (prazan je kada na pinu mikrokontrolera javi logicka 0). Zato se oni moraju isključiti dok se merenje ne završi. Ove tehnike mogu se primeniti za bilo koju vrednost otpornika i kondenzatora. Kako se kondenzator sada puni preko otpornika. Kako radi ovaj interfejs? Najpre drži RB0 na logičkoj 1 dovoljno dugo da bi se kondenzator napunio. odnosno za maksimalnu vrednost testiranog otpornika od 10kΩ oko 5mS. I sa ovom šemom moguće je po završenom merenju otići na interapt rutinu. ukoliko se koristi kondenzator kapacitivnosti veće od 100nF između 142 . i meri se vreme za koje će se na pinu javiti logička jedinica. Osim toga. što rasterećuje mikrokontroler za ostale potrebe. Sa ovim kolom se uglavnom dobijaju najbolji rezultati. Kako će onda program meriti vreme? Jednostavno.

u šemu je potrebno postaviti običan otpornik što manjeg stepena tolerancije. a ne napona! U pravu ste. Pri kristalu od 4MHz sasvim je moguće koristiti vrednosti od 33pF. Možda smatrate da ovo nije prava A/D konverzija zbog ograničenja na merenje otpornosti i kapacitivnosti.uva. Za princip rada i detalje pogledajte http://www. Kako vreme za koje se kondenzator napunio ili isprzanio nema direktne veze sa celzijusovim stepenima ili svetlosnim luksom. u tom slučaju umesto promenljivog. Za detalje pogledajte AN512. Microchip čak navodi da se usled prevelike struje na pinovima portova može promeniti stanje TRISA ili TRISB registra.ele. uz male izmene električne šeme moguće je realizovati pravu desetobitnu A/D konverziju. pa ga je stoga poželjno povremeno softverski „osvežiti”. Naravno. AN513 i AN863 sa http://www. On sprečava preveliku struju na pinu mikrokontrolera u trenutku naglog punjenja ili pražnjenja kondenzatora.kondenzatora i pina potrebno je postaviti zaštitni otpornik od oko 220Ω. 143 . vrednosti ovih veličina najjednostavnije je dobiti iz odgovarajuce tabele. Međutim. Sa njima nije moguće dobiti veću preciznost zbog promene radnih karakteristika upotrebljenog kondenzatora usled promene radne temperature.com/. Što manji kondenzator upotrebljavate.pdf. Donja granica kapacitivnosti kondenzatora zavisi jedino od brzine vašeg mikrokontrolera. Na taj način može se na primer izmeriti položaj osovine promenljivog kondenzatora.es/~jesus/adsd. Ove šeme zbog svoje jednostavnosti imaju jedan veliki nedostatak. Zbog toga se može koristiti kompenzacija ovih nedostataka koristeći kalibracioni otpornik i merenjem njegove vrednosti neposredno pre merenja otpornosti senzora.microchip. Bilo koja izobličenja pri merenju (poput nelinearne karakteristike upotrebljenog senzora) mogu se odmah kompenzovati u samoj tabeli. Ovakav princip merenja u literaturi se naziva još i Single Slope A/D konvertor. merenje će biti kraće. Još jedna mogućnost gornjih šema ogleda se u mogućnošću merenja kapacitivnosti umesto otpornosti.

Konverzija otpornosti i kapacitivnosti u frekvenciju Raniji principi A/D konverzije bili su pogodni za merenje raznih fizičkih veličina jedino u slučaju da senzori nisu previše udaljeni od mikrokontrolera.64. 0. morali bi razvući bar oko 5m provodnika. Nije li upravo to rasipništvo u efikasnom iskorišćenju datih nam resursa dovelo do opšteg povećanja zagađenja planete Zemlje! Kao što ste ranije videli PIC16F84 se ne snalazi najbolje sa direktnim merenjem napona. Tu se nalaze podaci o frekvencijama u zavisnosti od kapacitivnosti i otpornosti. a onda mu dodati senzor čija je prosečna potrošnja 12mA. pa se ponašaju kao kondenzator) ili usled indukovanih električnih smetnji (što duži kablovi. Algoritam programa trebao bi u fiksnom vremenskom intervalu (npr.5S – što duži interval to veća preciznost) brojati impulse. Što je otpornost promenljivog otpornika manja.htm. U stvari kako je ovde potreban jedino predajnik. PIC16F84 je prilično mali potrošač električne energije. 144 . Ukoliko je daljina od mikrokontrolera do NE555 previše velika. to bolja antena). temperaturu na terasi. Za još veće daljine može se kombinovati NE555 sa RS485 drajverom. ova frekvencija će biti veća. Kako je za eliminaciju smetnji poželjno koristiti ulaz sa šmitovim okidačem. Nema svrhe napraviti kolo za merenje spoljne temperature. Detalje o ovom principu imate na http://www. Šta najlakše radi? Meri vreme i broji. impulse je najpraktičnije dovesti na RA4 (ukoliko se ne koriste interapti za brojanje) ili RB0 (ukoliko se koriste interapti za brojanje) pin. usled povećanja kapacitivnosti na vodovima (provodnici su uglavnom bliski jedan drugom. Na primer usled sopstvene zavisnosti otpornosti od temperature (ponašaju se kao mini senzor temperature). Ukoliko biste želeli da merite npr. tačno određenom frekvencijom. možete povećati napon napajanja NE555. Tako povezano. Ti provodnici otpornosti senzora dodaju svoju otpornost koja zavisi od njihovog poprečnog preseka i dužine. U ovoj šemi upotrebljeno je popularno integrisano kolo NE555 povezano kao astabilni multivibrator. deo integrisanog invertora signala (7406) biće dovoljan.globu. ono će u zavisnosti od kapacitivnosti elektrolitskog kondenzatora od 1μF i otpornosti merenog otpornika od 10kΩ u mikrokontroler slati impulse.net/pp/english/PP/ne555. ubaciti mu čak i SLEEP mod. RB0 pin se ponaša kao ulaz sa šmitovim okidačem jedino kada je podešen za interapte. U industriji se upravo iz tih razloga udaljeni senzori umesto sa promenljivim naponom prave sa promenljivom strujom (4-20mA). Osim toga usled svojih fizičkih veličina uvode povećanje mogućnosti pogrešnog merenja. Ukoliko umesto promenljivog otpornika postavite stalan otpornik malog stepena tolerancije dobijate odličan merač kapacitivnosti upotrebljenog kondenzatora.

Konverzija napona u frekvenciju Konvertor napona u frekvenciju (eng.65. Nastavak sledi! 145 .Voltage Controlled Oscilator – naponski kontrolisani oscilator) u frekvenciju pretvara mereni napon. VCO .

9mV rezolucijom od 0.1mV. Integrisani A/D konvertori Pretpostavimo da Vam je potreban A/D konvertor koji bi brzo merio željeni napon. MAX134 je specijalno namenjen za ugradnju u mernim instrumentima. 146 . Ponekad je potrebno meriti veliki dinamički opseg napona. prilikom snimanja i kompresije zvuka). Tipični predstavnici integrisanih A/D konvertora su ADC0831. pa se njegov opseg merenja može menjati u širokim granicama.66. U tom slučaju najpraktičnije je koristiti integrisane A/D konvertore žrtvujući određen broj pinova za očitavanje podataka iz njih.1V. omogućavajući na taj način merenje napona u opsezima od 0 do 399. MAX 190 ili MAX 191.9V rezolucijom od 0. ne zahtevajući pri tome intervenciju mikrokontrolera (npr. Većina integrisanih A/D konvertora sposobna je meriti jedino napone od 0 do +5V. LTC1298. pa sve do 0 do 399.

pri 30oC 4kΩ i pri 40oC 8kΩ. 0 do 50 rezolucijom od 1oC ili 0 do 100 rezolucijom od ½oC za temperaturni opseg od 0oC do 50oC). Steinhart-Hart ili metodom linearizacije kao u AN942) može ispraviti njegov opseg. pri 20oC 2kΩ. On na osnovu par zadatih tačaka računa vrednosti preostalog broja potrebnih tačaka. Lazar Pančić i dipl. Očigledno je da je radi bolje preciznosti grafika neophodno da merenja budu što preciznija. i sa što više mernih tačaka. dipl. često razni drugi faktori utiču na pogoršanje linearnosti. Izlazni . Besplatan je (dat je čak i izvorni kod) i nalazi se na mom sajtu čiji link možete naći na kraju ovog uputstva. Dalje je potrebno softverski svakoj vrednosti sa X ose pridružiti (najčešće preko tabele) odgovarajuću vrednost sa Y ose. ing. 147 . Da bi se dobila što tačnija merenja potrebno je na odgovarajući način kompenzovati nelinearna izobličenja kako upotrebljenog senzora tako i svih ostalih činilaca.67. a dostupna je i njegova Linux verzija. Kako bi smanjili broj potrebnih merenja. Te faktore izaziva princip A/D konverzije. Bojan Mitić su Vam pripremili program za interpolaciju merenih vrednosti.txt fajl programa možete editovati prema svojim potrebama i iskopirati ga u sopstveni program. Program je ispitan pod Win98 i Win2000. a na Y osi vrednost fizičke veličine izmerene mikrokontrolerom i kalibrisane instrumentom veće klase preciznosti. Jedan od načina kompenzacije nelinearnosti je crtanje grafika izmerenih vrednosti. ing. promena temperature oscilatora. Na X osi postavlja se redni broj merenja koji će na odgovarajući način biti prikazan mikrokontrolerom (npr. Iako se matematičkim formulama (npr. Na primer NTC otpornik će pri 10oC imati otpornost od 1kΩ. Očigledno je da on umesto linearne ima logaritamsku karakteristiku. kablova do senzora ili upotrebljenog VCO konvertora. Pri tome niste ograničeni samo na upotrebu PIC mikrokontrolera. Kompenzacija nelinearnih karakteristika Senzori koje upotrebljavate pri merenju obično nemaju linearnu karakteristiku.

Sada i nije teško zamisliti meteorološku stanicu sa anemometrom (meračem brzine vetra). Uz više istovremeno povezanih sistema (više udaljenih merača) mogla bi se sa priličnom tačnošću predvideti mikroklima određenih područja. U ranijim primerima videli ste kako se može meriti nivo reke. Datalodger Datalodger predstavlja uređaj koji snima semplovane podatke (obično u eksterni EEPROM) i iz koga je potrebno povremeno spolja iščitavati podatke. 148 . dovoljno je dovesti ih u A/D konvertor i nakon toga u PIC.68. Kompjuter bi onda mogao analizirati dobijene podatke i predvideti na primer pojavu suše ili kiše. Semplovi svih konvertovanih napona povremeno se snimaju u eksternu EEPROM memoriju preko I2C veze. a ona se periodično prazni preko RS232 veze u kompjuter. U međuvremenu ste naučili i upotrebu A/D konvertora. termometrom i meračem smera vetra. U slučaju da se sve ove veličine dobijaju u analognom obliku. hidrometrom (meraćem vlažnosti vazduha). I2C i RS232 komunikacionog protokola.

Sa njim će pri istoj temperaturi rezultat A/D konverzije jednom biti 170. i dalje će se relej previše brzo uključivati i isključivati. i da ga isključi ukoliko je očitana vrednost 185 i veća. Kontakti običnih releja jednostavno nisu namenjeni za takav rad. i zadati mikrokontroleru graničnu vrednost rezultata A/D konverzije.175). i brzo će uključivati i isključivati relej. Ne mora to obavezno biti LED displej. Njegov takt oscilatora proizvešće malo smanjenje i povećanje napona napajanja. jedan deo će se svakako preneti i do senzora.175 . umesto merenja temperature prostorije.175 (ili veći) koji odgovara temperaturi od 25oC isključiće se relej.175 uključiće se relej grejača. AD >= . tako da se postigne kompromis između češćeg rada releja i spoljnih smetnji. W = AD . Ovo se može rešiti udaljavanjem senzora na mesto gde neće direktno osećati temperaturu grejača. Ukoliko je senzor temperature postavljen u blizini grejača. odnosno.C Ukljuci Iskljuci . meriće se temperatura grejača. Šta je rešenje? Reći mikrokontroleru da promeni stanje jedino ukoliko se izmerena temperatura dovoljno (npr. tu su uređaji koji se kontrolišu mikrokontrolerom. Ovo bi moglo biti dovoljno dobro rešenje za ON/OFF (uključi/isključi) kontrolu grejača (relejom). Ilustracija ovoga mogla bi ovako izgledati: movlw subwf btfss goto goto . Iako će dekapling kondenzator u dobroj meri eliminisati ove smetnje. Šta može izazvati te smetnje? Za početak. i tu će proizveti šum. a najmanje onaj sa brojem 1 (uključena samo dve LED). i relej će posle par nedelja stradati. tu je sam mikrokontroler.. Kontrola temperature Ništa lakše. Dalje. Zadata vrednost temperature . Sledeća je vaša komšinica sa svojim (made in China) usisivačem. za . Znači. a za broj .175 . Dovoljno je povezati senzor na A/D kontroler. Međutim. slično kao što to šmitov okidač radi hardverski. a drugi put 180. U 149 . Ukoliko na primer senzor kao rezultat A/ D konverzije broj manji od . Isti efekat prouzrokovaće i relej grejača. AD < .W STATUS. Upravo je taj šum poguban za uspešnu kontrolu temperature.255. Da li je sada sve u redu? I dalje ne mora da bude. što će mikrokontroler shvatiti kao odgovarajuću promenu temperature.175 AD. Ovde je najbolje radi što manjeg variranja temperature podesiti granične vrednostzi. nekada ON/OFF kontrola jednostavno nije dovoljna. Pri multipleksu LED displeja najviše struje trošiće displej na kome se prikazuje broj 8 (tada su sve pojedinačne LED uključene). da uključi grejač ukoliko je očitana vrednost 165 i manja. Tako će pri uključenju grejača rezultat A/D konverzije veoma brzo postati .10) udaljila od zadate vrednosti (.69.175 Da li je ovo dobar način kontrole? Nije! Svi senzori podložni su smetnjama. Testiraj prekoračenje .

faznim pomakom triaka (slično kao PWM za jednosmerni napon). šta sa situacijom kada napolju počne da pada kiša (odjednom zahladni)? Uz dovoljno dobro toplotno izolovan inkubator. Međutim. Uzmimo za primer da želite u dvorištu napraviti inkubator za jaja. U ovom slučaju potrebno je mikrokontroleru dodati još malo logike. 17 i 19.tim situacijama koristi se kontinualna regulacija snage. Ovde je radi što manjih oscilacija temperature poželjno koristiti kontinualnu regulaciju. neće biti nikakvih problema. Više o ovim kontrolnim procesima imate u časopisima Circuit Cellar br. Osim temperature potpuno isti principi primenjuju se za kontrolu bilo koje fizičke veličine. 150 . Ali nekada jednostavno nemamo dovoljno stiropora (i opet je sneg iznenadio naše putare).

čitanjem iz EEPROM-a). On menja svoju otpornost u zavinosti od položaja osovine.org/wiki/Rotary_encoder. optički i magnetski. 8-bitni). Otuda krčanje pri pojačavanju i smanjenju zvuka. Grey code) i enkoderi sa relativnim adresiranjem. ili koji koriste malo drugačiji format brojanja (tzv. Oni su kao i kontakti mehaničkih prekidača podložni varničenju (eng. Po načinu konstrukcije mogu biti mehanički. Za detaljniji opis posetite http://en. Ovo uvodi značajnu prednost rotacionih enkodera u tome što kod njih nema graničnih položaja. Ionako će je inicijalizovati po uključenju (npr. sivi eng. ukoliko upotrebite A/D konvertor da prevedete stanje analognog potenciometra u digitalni oblik. a mikrokontroler će to stanje softverski uporediti sa prethodnim i na osnovu rezultata izvršiti predviđenu operaciju. Međutim. Postoji više vrsta rotacionih enkodera. za razliku od apsolutnog enkodera PIC ne mora znati kolika je njegova trenutna vrednost u svakom trenutku. Po obliku signala koji se može dobiti na izlazu digitalnih potenciometra postoje enkoderi sa apsolutnim adresiranjem koji na svom izlazu direktno daju binarni kod (4bitni. Na taj način realizovano je na primer pojačanje zvuka na kasetofonu. Bolje stavite manju kapicu na osovini. Kao prvo njihovi kontakti nisu večni. što će prouzrokovati očitavanje maksimalne otpornosti. Još gore. Koliko puta ste morali menjati gumicu na slavini jer je neko previše zavrnuo? Isto je i sa analognim potenciometrom. Relativni rotacioni enkoder treba sprovesti odgovarajuće obrtno kretanje osovine u mikrokontroler. kao kod Nautilus slavina. Dovoljno je dati mu podatak u kom smeru se okreće osovina enkodera (kao kod običnih taster prekidača – levo-desno).wikipedia. incremental rotary encoder ili quadrature encoder). možete okretati njihovu osovinu koliko god želite. Neće se moći previše jako pritisnuti. Čemu to. Drugim rečima. Ne možete očekivati od korisnika da će biti „nežan“ prema svojim uređajima. Rotacioni enkoder Verovatno Vam je poznata uloga potenciometra u analognoj elektronici. Bouncing). U daljem opisu biće opisana jedino upotreba rotacionih enkodera sa relativnim adresiranjem (eng. 6-bitni.70.Rotacija suprotno od smera kazaljke <-151 . Signal dobijen sa relativnog rotacionog enkodera u jednom trenutku može imati stanja prikazana u sledećoj tabeli: --> Rotacija u smeru kazaljke na satu --> 00 01 11 10 00 <-. Analogni potenciometri imaju par mana. Sledeća mana analognog potenciometra odnosi se na položaj njegove osovine pri graničnim vrednostima. Mehanički imaju najviše nedostataka zbog varničenja svojih kontakata i manje rezolucije. pomeranjem kontakta klizača preko otporne površine. moguće je da kontakti potenciometra baš u trenutku merenja usled lošeg spoja budu odvojeni od otporne površine. relative rotary encoder.

pri previše brzom okretanju npr. 00) osovina enkodera se okreće u suprotnom smeru. Kod mehaničkih rotacionih enkodera situacija je još složenija. 152 . TDA8551). Kako će se stanje osovine enkodera najverovatnije retko kada menjati. U slučaju da je potrebno snimanje trenutne (apsolutne) vrednosti položaja osovine rotacionog enkodera u EEPROM. Na taj način je postignuta ispravna detekcija žtrvovanjem rezolucije enkodera. Ukoliko ne želite izgubiti na rezoluciji možete između mehaničkog enkodera i mikrokontrolera postaviti hardverski debouncing (sa rednim otpornikom između pina mikrokontrolera i enkodera i kondenzatorom između izlaza enkodera i mase). 01. Što je veća kapacitivnost kondenzatora. Više detalja o upotrebi relativnih rotacionih enkodera imate http://www. ali će maksimalna brzina okretanja osovine enkodera biti srazmerno manja. 10 to znači da se osovina okreće u smeru kazaljke na satu. jer se mora izvršavati i debouncing rutina. 11.Kao što vidite. praktičnije je snimiti je tek nakon što se osovina prestane pomerati (na primer 6S nakon zadnjeg signala). to ne znači da se (u kombinaciji sa mikrokontrolerom) ne mogu upotrebiti kao potenciometar. Na primer DF1704.html. veća će biti imunost na smetnje varničenja. Dovoljno je očitanu vrednost dovesti na D/A konvertor i imate izlazni napon proporcionalan položaju osovine enkodera. 01. Upotrebljeni kondenzatori moraju biti odabrani prema maksimalnoj rezoluciji i maksimalnoj procenjenoj brzini okretanja osovine enkodera. A ukoliko ste baš rešeni da dobijete promenljivu otpornost povežite na PIC bilo koji pretvarač digitalnog signala u otpornost. to nije slučaj. u smeru kazaljke na satu moguće je da nakon stanja 01 ne očita (zbog sporoti) sledeća 2 stanja (11 i 10). na sajtu Trebate shvatiti da rotacioni enkoderi ne mogu zameniti analogne potenciometre u pravom smislu te reči. Još gore. već tek treće (00). Takvo stanje signala omogućava da poređenjem prethodnog i sadašnjeg stanja lako otkrijemo u kojem se smeru okreće osovina. čime ste dobili odličan regulator jačine zvuka. To su samo digitalni davači položaja osovine. Obično je dovoljna vrednost od 10nF. Na taj način štiti se EEPROM. Postoje integrisana kola koja izvršavaju upravo tu operaciju bez upotrebe D/A konvertora (DS1669. osovina se okreće suprotno od kazaljke na satu. Ona se uglavnom može uprostiti tako što se umesto nje za jednu promenu stanja enkodera traži uzastopan sled 2 ili više ispravnih stanja. ukoliko se signal menja u smeru 00. Oni mogu imati i preko 255 položaja za samo 1 okretaj osovine. najpraktičnije je povezati izlaze rotacionog enkodera na interapt ulaze mikrokontrolera.com/chuck/robotics/projects/lab-x3/quadratrak. ukoliko je prethodno stanje bilo 11 a sadašnje je 01. Iako Vam može izgledati da su rotacioni enkoderi spori. U suprotnom (10. pa na osnovu toga može zaključiti da je osovina okrenuta u suprotnom smeru. Taj analogni izlazni napon možete koristiti kao izvor napajanja za predpojačavač kasetofona. Međutim. Oni nemaju nikakvu vezu sa promenom otpornosti. Na primer. 11.mcmanis. Može se desiti da zbog sporosti mikrokontrolera (ukoliko izvršava i druge operacije za vreme okretanja potenciometra) PIC nakon stanja 10 detektuje stanje 01 što je očigledno greška.

Oba problema uspešno su rešena električnom šemom sa sajta: www. da bi im se promenio (smanjio) broj obrtaja nije baš praktično koristiti D/A konvertor za smanjenje tog napona. Umesto toga koristi se PWM princip D/A konverzije. Više o ovome imate na sajtu: www. Na taj način motoru neće biti smanjena snaga obrtanja osovine (usled smanjenog napona napajanja).mcmanis.com/chuck/Robotics/tutorial/h-bridge/bjt-circuit. Ukoliko ovo ne ispoštujete (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. ali bez integratora (otpornika i kondenzatora). pa sve do motora za viljuškare. Iz tog razloga potrebno je promeniti smer napona napajanja motoru.1S. poželjno je galvanski ga odvojiti od mikrokontrolera. potrebno je osigurati se da kvar mikrokontrolera ili nepravilna sekvenca na njegovim izlazima ne može dovesti do kratkog spoja kroz tranzistore zaobilazeći motor. koji obezbeđuje neophodnu promenu polariteta. Princip njihovog rada je isti. Takođe. Pre testiranja na hardveru simulirajte program i proverite da li ste motoru ostavili dovoljno vremena za zaustavljanje. Usporavanje. H-mosta (eng. motorima ventilatora za hladnjak automobila. Regulacija smera i brzine kolektorskih DC motora Pod kolektorskim DC motorima podrazumjevaju se motori jednosmerne struje sa četkicama.mcmanis. Velikom broju kolektorskih motora jednosmerne struje moguće je menjati smer i brzinu. 153 . Za promenu smera okretanja osovine motora koristi se poznata osobina kolektorskih motora da im se rotor može okretati u suprotnom smeru prilikom promene polariteta napona napajanja (oprez – neki motori pri tome imaju smanjenu snagu). Stoga se izlazi mikrokontrkora povezuju sa drajverom u obliku tzv. već će se snaga regulisati PWM odnosom punog napona napajanja. H-bridge).html Kako kolektorski motor može u trenutku uključenja povući mnogo veću struju od nominalne. a razlikuju se jedino po svojoj potrošnji i dimenzijama. Na primer malim motorima iz vokmena ili kasetofona. a tek onda polako ubrzavati (povećanjem PWM odnosa) u suprotnom smeru. zatim ga zakočiti. kočenje i ubrzavanje neće imati svoju funkciju ukoliko se završe za samo 0.html Radi manjeg opterećenja motora. drajvera i mehaničkih elemenata.71. prilikom promene smera potrebno je postepeno usporiti motor (smanjivanjem PWM odnosa).com/chuck/Robotics/tutorial/h-bridge/index. Kako motori najbolje iskorišćenje imaju pri svom nominalnom naponu napajanja.

D/A konvertorom kalibrisati brzina motora. Sijalica je povezana direktno na +5V i na relej. kome je senzor temperature njegov sopstveni grejač. Volframova sijalica ima pozitivni temperaturni koeficijent otpornosti (eng. profesor električnih mašina Elektrotehničke škole u Aleksincu postavio je nama učenicima to pitanje. tek kupljena sijalica po prvom uključenju pregori? Nemojte se mučiti. Ukoliko u proizvodnom procesu volframovo vlakno nije pravilno dimenzionisano (npr.t-com. a akumulatoru omogućiti naizmenično punjenje i testiranje napunjenosti. Resetovanjem RA0 pina isključuje se relej i sijalica se (i dalje vruća) prebacuje na A/ D konvertor. ali možete li to uraditi direktno? Uz mikrokontroler i ovo je moguće. što ograničava dalje povećanje struje. To znači da joj je otpornost dok kroz nju ne protiče struja niska. Na njihovim kontaktima može se A/D konvertorom izmeriti generisani napon. uključuje se relej. Nijedan ponuđeni odgovor nije bio tačan. po potrebi. current limiter) ili postepenim povećanjem struje (eng. Čak se može merenjem proteklog vremena do minimalne otpornosti sijalice grubo izmeriti spoljna temperatura (sijalica će se brže hladiti ukoliko je spoljna temperatura niža)! Zazmislite bojler. verovatno će Vas zanimati kako možete običnu LED upotrebiti za senzor osvetljenosti. Pinom RA0 se preko prekidačkog tranzistora uključuje i isključuje relej. njegov mirni kontakt (isključen relej) povezan je na paralelni A/D konvertor na PORTB. i sačeka se da sijalica zasvetli. Pretpostavimo da želite izmeriti električnu otpornost sijalice dok je volframovo vlakno još usijano. a radni kontakt (uključen relej) na masu. pri propuštanju ove struje volframovo vlakno se zagreje i poveća svoju otpornost na više desetina oma. struja se neće dovoljno ograničiti i ono će se zato istopiti. Po istom principu vetrenjači se može fino regulisati ugao zakretanja krila u zavisnosti od generisanog napona (čime bi se sprečio njihov lom pri prejakom vetru). U trenutku uključenja (dok je još hladna). Posle pola školskog časa. Međutim. Setovanjem RA0 pina. kroz nju prođe i do 10 puta veća struja. Struja koja prolazi kroz interne otpornosti A/D konvertora je toliko mala da ne može u velikoj meri uticati na dalje zagrevanje sijalice. prekratko je). pri tome radeći u generatorskom režimu. Brzim nizom merenja može se u registre mikrokontrolera primenom indirektnog adresiranja snimiti grafik opadanja otpornosti usled hladjenja sijalice. Detalje imate na sajtu http://free-vz.hr/Ivica-Novakovic/index. morao je sam odgovoriti na njega. Iako nema direktne veze sa potrošačima. Pretpostavimo da se sijalica napaja sa 5V jednosmerne struje (ne pokušavajte ovo uraditi sijalicom od 220V iz bezbednosnih razloga). i na osnovu njega. Iz tog razloga se kod skupljih halogenih sijalica ponekad primenjuje elektronsko kolo sa ograničenjem maksimalne struje (eng. Jasno je da to možete uraditi primenom omovog zakona i merenjem napona i struje. Potrošač kao senzor Znate li zašto nova. reda oma. PTC). Električni motori jednosmerne struje prilikom isključenja inercijom nastavljaju svoj rad. njegova otpornost neće se po prvom uključenju dovoljno povećati. Samo kad ne bi imao toliko kamenca! Ovaj princip nije ograničen samo na sijalicu.html. 154 .72. Miki. soft start).

odgovarajuće davače položaja osovine motora nije teško napraviti uz par odgovarajućih senzora.73. 155 . Na sreću. kočenje pa ubrzanje. Više o tome imate u AN569 i AN894. prilikom redukcije kaiševima kao kod starijih veš mašina). Za ostale primene možda bi pogodniji bio način sa rotacionim enkoderom. moguće je osovinu reduktora povezati na običan analogni potenciometar. najpraktičnije je uzimati signal sa osovine reduktora. odnosno brzine. konstrukcije CNC mašine. Ukoliko osovina reduktora ne zatvara pun krug (npr. Servo motori obično imaju reduktore preko kojih im se smanjuje brzina (a povećava snaga) u određenom opsegu. ili precizne regulacije brzine motora. Na taj način možete biti sigurni da je motor napravio tačno toliko i toliko obrtaja. Ovo bi Vam moglo biti potrebno prilikom regulacije protoka vode ili vazduha pomičnim pregradama. Taj princip objašnjen je u AN531. za pozicioniranje antene). On je objašnjen u AN718. Kako se osovina motora okreće prilično brzo. Servo motori Servo motori predstavljaju obične kolektorske DC motore kojima je dodat odgovarajući davač položaja. Motori koji se i pored reduktora ne mogu dovoljno brzo zaustaviti (imaju veliki zamajac) moraju pored rotacionog enkodera primenjivati usporavanje. On je tu i precizniji zbog zazora koji može eventualno postojati (npr. To je objasnjeno u AN532 Ponekad se rotacioni enkoder ne može upotrebiti zbog prevelike maksimalne brzine motora. Signal se sa osovine može dovesti u PIC na više načina.

Za svoje upravljanje koriste odgovarajuće sekvence slične onima iz rotacionih enkodera.8o. ugao između dva koraka je 360o / 200 = 1. Ukupnim brojem koraka određen je ugao pomeranja osovine. Dovoljno je prilikom inicijalizacije vratiti osovinu step motora do početnog položaja. Po samom principu njihovog rada očigledno je da im za razliku od servo motora nije potreban ikakav oblik povratne informacije o položaju. 156 . Uz 200 koraka. step). Step motori Step motori predstavljaju specijalan oblik motora prilagođenih preciznoj regulaciji položaja osovine.74. Nisu namenjeni za rad sa većim brzinama već im se osovina u svakom trenutku može naći u jednom od tačno definisanih položaja (koraka eng. a zatim je okrenuti za željeni broj koraka.

Da li će to biti signal sa termometra. Ukoliko ne postoji način da se oni očitaju i da se na osnovu dobijenih informacija preduzme određena akcija (npr. dioda i par otpornika. nema nikakvih problema. džabe ste kupovali PIC. Detekcija prolaska napona kroz 0 Često se javlja potreba da se mikrokontrolerom treba detektovati prolazak naizmeničnog napona kroz 0. ovaj način nije moguće koristiti zbog prevelikog napona na bazi tranzistora i iz bezbednosnih razloga. Da bi radio išta korisno potrebno je dovesti mu spolja neke signale. tahometra. Bitno je da senzori ove signale uglavnom daju u analognom obliku. Na primer pri konstrukciji dimera volframske sijalice ili pri konstrukciji sata taktovanog mrežnom frekvencijom od 50Hz. PIC16F84 sam po sebi ne ne može mnogo toga. Slika Međutim. 157 . Da bi se ovaj problem prevazišao.75. može se koristiti sledeća električna šema: Slika Možda se pitate zbog čega je ovoliko gradiva posvećeno upravo analognoj elektronici. ukoliko mikrokontroler treba detektovati prolazak kroz 0 za 220V. navodnjavanje povrća u plasteniku ili aktiviranje alarma). Ukoliko je u pitanju nizak napon. hidrometra. Dovoljan će Vam biti jedan tranzistor. barometra ili termopara u ovom trenutku nije bitno. aeromerta.

U ovim kolima su na hardverskom nivou implementirane jednostavne logičke operacije. 158 . toliko postupno izlaže gradivo.76.ibiblio. Njihova glavna prednost je niska cena i laka dostupnost. displej drajveri i dr. Iako je izdata još 1981. da je njen sadržaj i dalje aktuelan. PIC16F84 se može bez problema povezivati sa obe serije integrisanih kola. koje realizuje pomenutu funkciju. ali će se i za najjednostavnije operacije morati utrošiti veći broj pinova. brojači. Neki od programa koji Vam mogu pomoći u simuliranju osnovnih logičkih kola su: ● ● ● Logisim Digital Simulator Digital Works Kako obe serije za povezivanje sa mikrokontrolerom koriste adresnu magistralu. Uputstvo koje detaljno objašnjava funkcije osnovnih logičkih kola možete naći na http://www. pomerački registri.org/obp/electricCircuits/Digital/index. 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). Ukoliko Vam iz bilo kog razloga zatreba neka funkcija koja nije implementirana u PIC16F84. možete ga direktno povezati sa odgovarajućim integrisanim kolom. tako da su mnogo brža od mikrokontrolera. brzina komunikacije će biti ograničena jedino hardverom.html sajtu. multiplekseri. Knjiga koja isto tako detaljno obrađuje ovu temu je „Elektronika digitalnih računara“ Alberta Paula Malvina. Jedini zastareli deo u knjizi jeste opis odavno prevaziđenih magnetskih memorija.

najpraktičnije je realizovati u interapt rutini izazvanoj tajmerom. Onda se postavlja stanje LED druge kolone. Diode na koje je dovedena logička 1 će na trenutak zasvetleti. Sa ovom šemom omogućeno je upravljanje matricom od 32 LED. Znate i sami da je televizijski prikaz moguć jedino zbog tromosti ljudskog oka. i na kratko (obično oko 20mS da se prosečan intenzitet svetlosti ne bi previše smanjio) uključiti prekidački tranzistor na RA0 pinu. 159 . RA4 pin PORTA registra se ovde ne koristi. Samim tim izgleda nemoguće spojiti direktno na mikrokontroler više od 13 LED. tako da se postigne kompromis između jačine svetla dioda i njihovog treperenja. tako da se taj način ne praktikuje. kada se celokupan proces ponavlja. Anode LED spojene su na PORTB. a katode na tranzistore. Najpre je potrebno isključiti sve prekidačke tranzistore dovođenjem logičke 0 u PORTA. i na kratko uključuje tranzistor na RA1 pinu. Ovde je primenjen sličan pristup. primenom multipleksiranja moguće je direktno na mikrokontroler spojiti mnogo veći broj LED.77. Postupak se ponavlja dok se ne prikaže stanje i na zadnjoj (četvrtoj) koloni. izgledaće kao da LED neprekidno svetle. ali to se može nadoknaditi propuštanjem veće struje kroz njih (smanjivanjem vrednosti otpornika na pinovima PORTB registra). ili podešavanjem dužine uključenog stanja. U praksi se uglavnom sreće potreba za bar jednim ulazom. Rutinu za ispis stanja na displeju. jer ne može dati na svom izlazu logičku jedinicu. LED će svetleti manjim intenzitetom nego inače. Na isti način moguće je prikazati odgovarajuće cifre na više sedmosegmentnih displeja. Kako radi multipleksiranje. Multipleksiranje izlaza PIC16F84 ima 13 ulazno izlaznih pinova. Zbog tromosti oka. Pogledajte sledeću šemu. Zatim je potrebno na PORTB registru postaviti stanje 8 LED u prvoj koloni. Međutim uz malo trikova (zamenom polariteta LED i povezivanjem tranzistora na naponu napajanja) i on može biti u funkciji. Međutim. Na taj način prikaz stanja LED ne utiče (previše) na rad glavnog programa.

odnosno direktnim povezivanjem displeja na PIC. 160 . U praksi se može videti ovakav princip realizovan bez ikakvih opornika i prekidačkih tranzistora. sa tim što umesto odgovarajućeg obrasca za prikaz na displeju. Kada mu se na ulaz dovode binarni brojevi od 0 do 9. g. Za detaljni opis povezivanja 4511 ili 7447 integrisanih kola. pa samim tim intenzitet svetla nije isti kada je na displeju prikazan broj 8 (uključeni svi segmenti) i broj 1 (uključeni segmenti b i c). Umesto 4511. i dp – ukupno 8 izvoda) spojeni su preko otpornika za PORTB mikrokontrolera. f. Njegova mana je povećana potrošnja.Svi izvodi svih zajedničkih segmenata (a. i kratko uključiti prekidački tranzistor na RA0 pinu. Zatim je potrebno na PORTB registru postaviti sliku cifre prvog displeja. e. Onda se postavlja slika cifre drugog displeja. na izlazu uključuje određene segmente LED displeja. može se koristiti 7447. jer 4511 (i 7447) ima mogućnost prikaza samo jedne cifre. dobićete još jedan slobodan pin. 4511 integrisano kolo predstavlja drajver za sedmosegmentni LED displej. Postupak se ponavlja dok se ne prikaže cifra i na zadnjem (četvrtom) displeju. d. Najpre se isključuju svi prekidački tranzistori dovođenjem logičke 0 u PORTA. na ulaze 4511 treba dovesti binarni broj od 0 do 9. Zajedničke katode displeja spajaju se preko prekidačkog tranzistora na PORTA. Ukoliko se decimalna tačka ne koristi. skinite sa interneta njihove tehničke podatke. Postupak je isti kao i ranije. Segment decimalne tačke (dp). samim tim i grejanje mikrokontrolera kao i nejednakost svetla pojedinih cifara. morao je biti doveden direktno na mikrokontroler. c. Broj pinova može se smanjiti upotrebom LED drajvera 4000 ili 7400 serije. b. i na kratko uključuje tranzistor na RA1 pinu. kada se celokupan proces ponavlja. Ovo stoga što pin za prekidanje displeja mora kroz sebe propustiti struju svih segmenata displeja.

a uključenje obe LED neprestanim naizmeničnim dovođenjem logičke 0 i 1 na pin (za to je najpraktičnije koristiti interapt izazvan tajmerom). kao izlaz na niskom logičkom nivou.5mA u stanju isključenih LED. Sledeće kolo koristi sva tri stanja jednog pina. R3=1. ovo kolo troši čak 2. 161 . Približne vrednosti otpornika (za struju od 8mA po uključenoj LED) su sledeće: R1=300Ω. Za razliku od standardnih multipleksa.2kΩ. Ovde je ilustrovano samo kao primer onoga što trebate izbegavati u svojim aplikacijama. 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 uključenom stanju Ion2 – željena struja kroz LED2 pri uključenom stanju Vcc – napon napajanja Potrebni proračuni su sledeći: Ion1 = [ (Vcc-Von1)/R1 ] . Da bi se ovo kolo moglo primenjivati. LED2 na logičku 1. Za detalje pogledajte TB029 sa http://www. R2=300Ω.com/.[ Von2/(R1+R3) ] (Voff1+Voff2)/R3=Vcc-Voff1-Voff2/(R1+R2) Da bi se smanjila nepotrebna potrošnja struje potrebno je za R3 izabrati što veću vrednost. bez uključivanja LED pri ulaznom stanju pina. Komplementarno povezivanje LED Poznato vam je da pin može biti postavljen kao izlaz na visokom logičkom nivou. isključenje obe LED prelaskom pina u visokoimpedansno stanje (postavljen kao ulaz).[ Von1/(R2+R3) ] Ion2 = [ (Vcc-Von2)/R2 ] . i kao ulaz kada je u stanju visoke impedanse. pa nije pogodno za baterijsko napajanje.microchip. za pogon 2 LED. Na sličan način možete povezivati i mnogo veći broj LED. potrebno je izmeriti određene parametre. Praktičnije je koristiti multipleks.78. U literaturi se ovaj princip može naći i pod nazivom Charlieplexing. Uključenje LED1 postiže se postavljanjem pina na logičku 0.

Na taj način PIC treba poslati jedino ASCII kod odgovarajhućeg karaktera. Alfanumerički i grafički. Jednosmerni napon će ih uništiti. ali u dosta drugačijem obliku. njima se za razliku od LED segmenata ne sme dovesti jednosmeran napon da bi postali vidljivi. Obično se inteligentni LCD proizvode sa 8*2. Mala slova takođe su imala nesuglasica. Svakako da je bilo potrebno na neki način standardizovati elektronski oblik zapisa teksta u računarima. pattern) karaktera u svakoj pojedinačnoj ćeliji. Više o principu direktnog pogona LCD-a imate u AN563 sa http://www. Pacom. kod nekih 0x21 a kod nekih 0x41. Atari. 16*2 20*2. i LCD može raditi u multipleksu. U ostatku teksta biće opisani alfanumerički inteligentni displeji. za multipleks. Postoje dve opšte vrste ovih displeja. Integrisani kontroler alfanumeričkih inteligentnih displeja zadužen je za generisanje naizmeničnog napona neophodnog za rad dispeja. Tako je nastao ASCII kod. za ispis skraćenog seta ASCII ili generisanje sopstvenog seta karaktera. pa čak i za treperenje i rotaciju teksta na displeju. digitronu ili video igricama. LCD u svom najosnovnijem obliku možete videti na digitalnom satu. Predstavljanje cifara brojeva i znakova interpunkcije je opet poseban slučaj. Tu obavezu na sebe preuzima integrisani kontroler inteligentnog displeja. Na sreću. Kod nekih je veliko slovo A u memoriji bilo predstavljano brojem 0x00. U nekim kompjuterima nisu ni postojala. kako bi se podatci sa jednih računara mogli bez konverzije koristiti na drugim. 16*1. Pri tome broj pinova za uključenje pojedinih displeja ostaje isti. Na alfanumeričkim se mogu prikazati jedino slova i brojevi (videli ste ih na halo govornicama). LCD . Međutim.com/. On ima ROM memoriju u kojoj se nalaze slike svakog karaktera.pojam Pre svega trebate znati da postoji više vrsta LCD (Liquid Crystal Display). 20*4. 162 . Šta predstavlja ASCII set karaktera? U rano doba informatike svaki kompjuter (Commodore. Galaksija) imao je sopstveni format predstavljanja teksta. 24*2 ili 40*1 ćelija.79. Štaviše. Zatamnjivanjem određenih piksela dobija se slika (eng. Da bi se ovo ograničenje prevazišlo izmišljeni su tzv. a na grafičkim šta god želite (imate ih na mobilnim telefonima). inteligentni LCD. Spectrum. Oric Nova. ali jedan osmobitni port može kontrolisati maksimalno dva sedmosegmentna LCD displeja (zajedno sa decimalnom tačkom). 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 pojedinačnog karaktera. Ukoliko pažljivo zagledate alfanumerički LCD možete videti da mu se mesta za karaktere (ćelije) sastoje od sitnih tačkica (piksela). Uglavnom se kao kontroler koristi integrisano kolo Hitachi HD48770 ili neki od njegovih kompatibilnih klonova. Oni pored displeja imaju integrisano kolo koje služi da se preko manjeg broja pinova može upravljati većim brojem segmenata LCD-a. Cifre na LCD-u sastoje se (kao i kod LED displeja) od segmenata. To znači da se određenom segmentu da bi postao vidljiv mora neprekidno dovoditi naizmenični napon (kao kod multipleksa pojedinih LED). Amstrad.microchip. Po njemu svaki karakter (slovo. PIC16F84 bi prema tome mogao da direktno kontroliše jednu do dve cifre displeja vašeg digitrona. broj ili znak interpunkcije) ima svoj jedinstven redni broj.

vrsti. Ušteda 4 pina se svakako isplati. ili posebno izdvojena. Obično su brojevima obeleženi bar krajnji pinovi. Na LCD-u na slici vidite jedan red pinova. Kako integrisani kontroler LCD-a nema EEPROM memoriju.) nisu povezana. 14 pina koristi se za upravljanje LCD-om. načinu i boji pozadinskog osvetljenja. ali sa 16 pinova. 5*10 piksela. To može biti nedostatak ukoliko želite na displeju prikazati naša slova (npr.a displej će se sam pobrinuti za sve ostalo. 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 (DB0–DB7). Pinovi 15 i 16 povezani su (odozdo) na LED kao izvor pozadinskog svetla (beli pravougaonik sa desne strane). Slika karaktera u ROM-u LCD-a obično se čuva u matrici od 5*7 ili 5*8 piksela. a još 2 pina za pozadinsko osvetljenje. Register selection) (eng. Funkcija pinova je sledeća: 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. i 16. PIC16F84 treba određenim protokolom (kao RS-232) u njega slati podatke. Pinovi LCD-a mogu biti postavljeni u jednom (16*1) ili u dva (8*2) reda. njihovo povezivanje na mikrokontroler je prilično standardizovano. Iako se displeji mogu razlikovati po broju i rasporedu ćelija. kontrolerom LCD-a je predviđena mogućnost upotrebe samo 4 pina (DB4-DB7) a osmobitni bajt se u LCD šalje u 2 grupe niblova. Nama ti dodatni pikseli mogu biti od koristi radi prikaza npr. sliku ovih karaktera je neophodno čuvati u memoriji mikrokontrolera i inicijalizovati u LCD-u po svakom uključenju. ŠĐŽČ). upotrebljenim fontovima za karaktere. Isključeni gornji i donji pikseli jednostavno se neće videti. Pri tome zadnja dva pina (15. Dobro je što (sa izuzetkom 163 . slova Š. Moguće je naći i LCD bez pozadinskog osvetljenja. Ona mogu biti u istom redu sa ostalim pinovima. ali na displeju je kod ponekih LCD-a moguće prikazati i proširenu matricu od npr. Kako je kontroler LCD displeja u stvari jedan mali mikrokontroler. Iz tog razloga predviđena je mogućnost da programer promeni sliku par specijalnih karaktera.

startnog pulsa) ne postoji maksimalno vreme za koje se ovi podatci trebaju poslati. Dok je na njemu prisutna logička 1. Dok je startni Nastavak sledi 164 . LCD neće reagovati na ostale signale. Na taj način mikrokontroleru ostaje prilično vremena za ostale operacije koje treba obavljati. jer ih u tom slučaju kontroler LCD-a neće moći ispravno primiti. Enable (startni) pin možete smatrati pinom za isključenje LCD-a. Impuls za inicijalizaciju integrisanog kontrolera LCD-a mora trajati bar 450nS. Ipak. podatci se na LCD ne smeju slati previše velikom brzinom. Na taj način moguće je ostale pinove LCD-a (kao u multipleksu) koristiti za neke druge operacije.

Zatim se RA0 pin postavi na logičku 0. U ovom primeru na PORTB registar spojeni su pinovi RB0. utvrditi koji bit je izazvao interapt. Ukoliko nijedan nije resetovan. Onda se RA0 setuje. mogu se izostaviti. Zbog njih se testiranje obavlja za logičku 0. Na taj način realizovana je matrica sa 12 ulaza. Izvodi pinova mikrokontrolera spajaju se u matricu tako da su taster prekidači spojeni između čvorova. 4. Ukoliko je potrebno obaviti određenu operaciju po otpuštanju tastera. 6. Najpre se PORTA registar postavi na b'00000111'. RA1 i RA2. Ukoliko se tastarura nalazi blizu (<2m) mikrokontrolera. 9 i 12. RB1. Radi lakšeg razumevanja pretpostavimo da su prekidači obeleženi brojevima od 1 do 12. možete koristiti sledeću šemu. čime se u prvu kolonu dovodi nivo logičke 0. a na PORTA RA0. Interapt rutina treba detektovati stanje pinova PORTA i PORTB registra. Ona se inače najčešće koristi. i po promeni stanja izazvati interapt. Ponovo se testiraju bitovi PORTB registra.80. RB2 i RB3. i testiraju bitovi koji odgovaraju prekidačima 3. telefonske tastature (sa 12 tastera) koriste isti princip. i izvršiti zadatu operaciju. U tom slučaju praktičnije bi bilo povezati pinove RB4 do RB7 u matricu. a resetuje RA2. nisu pritisnuti prekidači označeni sa 1. Redom se testiraju bitovi RB0 do RB3 PORTB registra. program mora pamtiti zadnje stanje odgovarajućeg tastera. A ukoliko želite postići još više ulaza uz minimalni broj upotrebljenih pinova. 7 i 10. ali ovoga puta za grupu prekidača 2. Multipleksiranje ulaza Na sličan način kao u prethodnom poglavlju. Otpornici od 100Ω su povezani radi zaštite od lažnog okidanja usled elektrostatičkih smetnji. a RA1 resetuje. U zadnjem prolazu setuje se RA1. Pull up otpornici moraju biti uključeni kako se na ulaznim pinovima ne bi javilo nedefinisano stanje. 165 . moguće je realizovati više od 13 ulaza mikrokontrolera. jer npr. 8 i 11. 5.

Pretpostavimo da su upotrebljeni pinovi RB0 do RB3, i da su prekidači obeleženi decimalno (1 – 12), kao u prošlom primeru. Pre svega, potrebno je uključiti pull-up otpornike. Onda treba definisati pin RB0 kao izlazni, a RB1, RB2 i RB3 kao ulazne i postaviti RB0 na logičku 0. Redom se testiraju stanja na RB1 (za pritisnut broj 6), RB2 (za broj 9) i RB3 (za broj 12). Zatim se RB0, RB2 i RB3 definišu kao ulazni, a RB1 kao izlazni sa logičkom 0, i testiraju se stanja na RB0 (za broj 3), RB2 (za broj 8) i RB3 (za broj 11). Postupak se ponavlja za pinove RB2 i RB3. Ovaj način je softverski malo teži za implementaciju, jer se u istom registru mora vršiti manipulacija između ulaznih i izlaznih stanja pinova (što povlači za sobom prelazak između banki). Međutim, njim je moguće testirati 12 prekidača sa samo 4 pina. I u ovom slučaju mora se pamtiti zadnje stanje odgovarajućeg tastera ukoliko je potrebno obaviti određenu operaciju po njegovom otpuštanju. Ovakvi načini testiranja tastera mogući su jer je (kao tromost oka kod multipleksa sa LED) ovde primenjena tromost prsta kojim se pritiska prekidač. Naime, prosečno minimalno vreme za koje korisnik drži taster prekidač pritisnutim je oko 50 do 100mS. Lično sam imao zadovoljstvo da na kratko popričam sa prvakom Srbije u kucanju na teleprinteru (sprava poput električne pisaće mašine). Kuca 600 slova za 1 minut, odnosno 10 slova za 1S. Kod njega je ovo prosečno vreme sigurno nešto kraće. Može li se još smanjiti broj potrebnih pinova? Naravno da može. Više o tome u narednim poglavljima.

166

81. Dupli multipleks
Sledećom šemom realizovana je kombinacija multipleksa ulaza sa multipleksom izlaza. Na taj način pinovi PORTB registra imaju duplu funkciju.

Setite se multipleksa izlaza. Pic periodično postavlja stanje na LED segmentima i preko zajedničke katode uključuje kompletan displej. Zatim ga isključuje, pa postavlja stanje na sledećem. Duplim multipleksom bi se u trenutku dok je su svi displeji isključeni testirali taster prekidači povezani paralelno sa displejima po principu multipleksa ulaza. Otpornici od 220Ω postavljeni su zbog ograničavanja 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 prekidača dok je uključen neki od displeja. Najpre je da se ne bi javilo nedefinisano stanje na ulazima potrebno uključiti pull up otpornike. To se može uraditi prilikom inicijalizacije, na početku programa. Kako su LED displeji aktivni samo kada je PORTB definisan kao izlazni, ovo im neće smetati. U multipleks rutini se u pauzi između uključenja displeja (dok su svi displeji preko PORTA registra isključeni) RB0 do RB3 definišu kao ulazni, a RB4-RB7 kao izlazni pinovi. Redom se na RB4 do RB7 postavlja logička 0, i testiraju stanja na RB0, RB1, RB2 i RB3 pinovima. Ukoliko je na nekom od njih prisutna logička 0, to indikuje pritisnut odgovarajući prekidač. Po testiranju svih prekidača, pinovi PORTB registra definišu se kao izlazni, na PORTB se postavlja slika koja će se pojaviti na LED displeju i uključuje se odgovarajući displej. Testiranje se može obavljati između cifara pojedinih displeja ili nakon što je prikazana slika na svim displejima. Koji ćete način odabrati zavisi od željene brzine testiranja prekidača. Za detalje pogledajte AN529 i AN557 sa http://www.microchip.com/. 167

82. Kapacitivni prekidači
U ovom poglavlju naučićete kako se unutar PIC mikrokontrolera može implementirati detekcija prisustva prsta korisnika u blizini određenog polja. Sećate se principa rada wilkinsonovog A/D konvertora? On (pored otpornosti) može biti iskorišćen i za merenje kapacitivnosti. Dovoljno je umesto promenljivog postaviti otpornik stalne vrednosti i što manje tolerancije. Kao jedna obloga kondenzatora koristi se veća površina pločice pertinaksa, a kao druga približen prst korisnika. Promena izmerene kapacitivnosti ukazuje na prisustvo druge obloge ovakvog kondenzatora (prsta) u blizini prve obloge. Kako je promena kapacitivnosti previše mala (5pF-15pF) da bi se mogla dovoljno uspešno detektovati A/D konvertorom, obično se umesto jednog koristi 255 ciklusa merenja, pri čemu se za njihovo brojanje može koristiti T0CKI pin. Frekvencija ovakvog oscilatornog kola direktno zavisi od kapacitivnostu između 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 ponaša kao provodnik. Uz dovoljnu veliku površinu obloge i dovoljno malo rastojanje između obloge i prsta korisnika detekcija je prilično pouzdana. Naravno da je zbog svog principa rada podložnija smetnjama, ali eliminacija mehaničkih prekidača utiče na smanjenje cene i lepši izgled projekta. Željeni oblik tastature može se odštampati na hartiji ili termootpornoj foliji (može se nabaviti u knjižarama), i takva slika može se postaviti između stakla i obloge. Kako se u ovom slučaju trebaju detektovati samo dva stanja (mala kapacitivnost – nema prsta i velika kapacitivnost – ima prsta) softver treba detektovati samo ova dva stanja. Uz dovoljno tanak izolator (staklo, pleksiglas, termootporna folija...) moguće je detektovati približavanje i odaljavanje prsta od obloge, naravno u dosta ograničenom dometu. I sami možete zaključiti da najveći efekat na da ispravnu detekciju ima upravo oblik i površina oplate. Zato se njenoj konstrukciji mora posvetiti posebna pažnja. Za detalje pogledajte AN1101, AN1102 , AN1103 i AN1104 sa http://www.microchip.com/ i www.microchip.com/mTouch. Kapacitivni prekidači imaju i par mana. Oni imaju malo veću potrošnju energije, odašilju elektromagnetne talase (zbog veće površine obloge se ponaša kao antena) na maloj daljini, jaki elektromagnetni talasi mogu izazvati pogrešnu detekciju ( http://www.youtube.com/watch?v=_gL2VhAPEbA&amp;watch_response ) pritisnutosti tastera, za svaki prekidač zahtevaju najmanje jedan U/I pin i zbog pouzdanog merenja traže da PIC radi na što većoj frekvenciji. Sleep mod ni multipleks jednostavno nisu mogući.

168

83. Do 16 ulaza na 1 pinu
Odmah da napomenem da Vam ne preporučujem upotrebu ovog kola. Dovoljno je da upotrebljene komponente usled starenja malo promene svoje vrednosti i detekcija više neće biti uspešna. Osim toga, skoro svaka elektronska komponenta menja svoje parametre pri promeni temperature. Moguće da će sa ovim kolom ispravna detekcija vremenom biti moguća jedino pri niskoj temperaturi. Zato je za ovu šemu neophodno koristiti komponente male tolerancije.

Princip rada je sledeći. Pin RB0 povezan je kao wilkinsonov A/D konvertor, ali umesto merene otpornosti, ovde se pojavljuje otporna mreža. Rezultujuća otpornost na pinu zavisi od toga koji taster je pritisnut u određenom trenutku. Najmanja je (1kΩ) kada je pritisnut taster 1, povećava se do tastera 16 (1kΩ + 4k7 + 4k7 + 4k7 + 1kΩ + 1kΩ + 1kΩ = 18,1KΩ), a najveća je (teorijski beskonačna) kada nije pritisnut ijedan taster. Softver treba po izmeriti vrednost otpornosti po principu A/D konvertora i na osnovu dobijene vrednosti pronaći koji taster je pritisnut. Za razliku od ostalih šema sa više ulaza, ovom šemom je skoro nemoguće realizovati detekciju više istovremeno pritisnutih tastera zbog većeg broja rednih i paralelnih spojeva otpornika. Više o ovom principu imate na http://www.romanblack.com/keypad.htm . http://www.josepino.com/ i na

169

dozvoliti interapt po promeni stanja na RB4 do RB7 pinovima sa setovanim GIE bitom i otići u sleep mod. Ovde se najpre uključe pull up otpornici. ali mikrokontroler u trenutku interapta ne zna koji prekidač ga je probudio. Buđenje iz sleep moda po pritisnutom tasteru Ako je potreban 1 taster prekidač. i skenirati RB4 do RB7 pinove da bi se utvrdilo koji je taster i dalje pritisnut. Zajednički interapt flag prekidača će se po pritisku bilo kog prekidača setovati. Izgleda da je nemoguće buđenje iz sleep moda izazvati korišćenjem većeg broja prekidača. Kako onda napraviti daljinski upravljač? Postoji kao i uvek više rešenja. podesi se intarapt i ode se u sleep mod. a zatim se RB0 do RB3 pinovi deklarišu kao izlazni sa logičkom 0.microchip. Pritiskom na bilo koji prekidač PIC će se probuditi iz sleep moda. dovoljno je postaviti prekidače na RB4 do RB7 pinovima. Nakon buđenja moguće je testirati RB4RB7 pinove kako da bi se utvrdilo na kom pinu je i dalje pritisnut taster. Jedno koristi interapte a drugo reset mikrokontrolera. 170 . Šta ćete koristiti zavisi od vaših konkretnih potreba. Drugim načinom mikrokontroler se resetuje po pritisku prekidača. a RB4 do RB7 kao ulazni. nema problema. Za više detalja pogledajte AN552 sa http://www.com/. i onda je potrebno redom postavljati RB0 do RB4 pinove na logičku 0 (držeći ostale na logičkoj 1). Koristite buđenje interaptom na RB0 pinu.84. Ukoliko vam je potrebno buđenje uz do 4 prekidača.

Vrednosti otpornika i kondenzatora izabrane su tako da je trajanje ciklusa pražnjenja i punjenja kondenzatora manje od vremena reseta mikrokontrolera (oko 18mS). i vratiti pinove RB0 do RB4 na logičku 1. potrebno je uključiti Pull up otpornike. Prebacivanje izlaza na logičku 0 ne može prouzrokovati ponovni reset mikrokontrolera ukoliko je vreme testiranja previše brzo (reda 10μS).Na ovoj šemi svi izlazi (RB0 do RB3) postavljeni su na logičku 0. na RB0 do RB3 pinovima redom na kratko postaviti logičku 0 (držeći ostale izlaze na logičkoj 1). Čim se bilo koji taster pritisne. C se isprazni kroz jedan od 4k7 otpornika (zavisi od toga koji se taster pritisnuo). što sprečava dalje pražnjenje kondenzatora. napon na kondenzatoru opada (oko 1mS) sve dok se PIC zbog pojavljivanja logičke 0 na MCLR pinu ne resetuje. Kondenzator C se napunio preko otpornika od 47kΩ i dovodi logičku 1 na MCLR pin mikrokontrolera. Čim se reset završi. Po resetu se svi U/I pinovi u hardverskoj inicijalizaciji mikrokontrolera definišu kao ulazi. Za više detalja o ovome pogledajte AN528 sa http://www. što brže testirati stanje prekidača na RA0 do RA3 pinovima.com/.microchip. 171 .

i dovoljan broj pinova za povezivanje na LED displeje. a EDE1144 i EDE1188 se mogu povezati tako da po pritisnutom tasteru preko jednog pina izazovu interapt (ovo se može upotrebiti za buđenje iz SLEEP moda). 6. 2. 8. 1. 6. d. Prikaz cifara 0. EDE707 integrisano kolo će nastaviti sa prikazom po jednom dovedenom stanju. A. Serijska detekcija preko 2 pina. d. 172 . Prikaz cifara 0. d. C. E i F. Prikaz cifara 0. 3.85. EDE1144 . 9. 5. 5. 3. 2. ICM7218A – LED displej drajver za 8 sedmosegmentnih displeja sa zajedničkom anodom (bez decimalne tačke). – LED displej drajver za 8 sedmosegmentnih displeja (bez decimalne tačke). b. 8.Dekoder za 16 tastera. A. Serijska detekcija preko 2 pina. ali uz upotrebu specijalizovanih integrisanih kola koja u sebi već imaju integrisanu multipleks rutinu. i (45mS nakon interapta – dovoljno za stabilizaciju oscilatora mikrokontrolera) serijski preko drugog pina u mikrokontroler pošalju kôd tastera. 6. 9. Može li još manje? Može. C.Dekoder za 64 tastera. b. 8. 9. Upravljanje preko 1 pina. 1. b. odnosno prekidačku matricu. 4. 7. 4. E i F sa mogućnošću direktnog adresiranja pojedinih LED Uz njih je za razliku od multipleksa izazivanog mikrokontrolerom bez problema moguće otići u SLEEP mod. 2. C. 5. E i F sa mogućnošću direktnog adresiranja pojedinih LED ICM7218B – LED displej drajver za 8 sedmosegmentnih displeja sa zajedničkom katodom (bez decimalne tačke). ili paralelna preko 4 pina (+1 za signalizaciju ispravno primljenog stanja prekidača) EDE1188 . Upravljanje preko 4 pina. 4. Tipični predstavnici ovih integrisanih kola su: EDE702 EDE707 – LCD displej drajver. bez ikakve naknadne intervencije mikrokontrolera. 7. 7. 1. 3. A.

ali je moguć SLEEP mod. Na taj način možete koristeći samo PORTB dobiti do 64 ulaznih ili izlaznih pinova. tako da se njihovim rednim vezivanjem i povezivanjem preko samo 3 pina mikrokontrolera može realizovati proizvoljno veliki broj ulaza / izlaza. Ovi registri imaju još po jedan serijski izlaz (74595) i ulaz (74597). Sa njim je multipleks teže ostvariti. možete koristiti PCF8574. Softver mikrokontrolera morao bi regulisati pomeranje i serijske ulazno / izlazne rutine. Povećanje broja U/I pinova Ponekad nije moguće koristiti multipleks zbog potrebe za stalnim (neisprekidanim) logičkim nivoima. U praksi se ovi načini veoma retko koriste. ili 74597 za 8 ulaza.86. U SLEEP mod je moguće otići. Očigledno je da bi u tom slučaju trebali na odgovarajući način izvršiti povećanje broja ulazno izlaznih pinova. možete koristiti pomeračke (šift) registre 74595 za 8 izlaza. i u kombinaciji sa 74251 ili 4512 kao izlaznim kolima. Multipleks korišćenjem ovako proširenog broja ulazno / izlaznih pinova je moguć jedino u slučaju da nije potrebno menjati stanje pinova od ulaznog u izlazni i obrnuto. jedino ukoliko se istovremeno ne primenjuje multipleks. Jednostavnije (i jeftinije) je uzeti mikrokontroler sa većim brojem ulazno izlaznih pinova. Ukoliko Vam je ovo preskupo. ali uz dosta komplikovaniji program. Ukoliko Vam je potrebno 8 ulaza ili izlaza. Za to se može koristiti standardno integrisano kolo 74138 u kombinaciji sa 74259 ili 4099 kao ulaznim kolima. 173 .

16-bit binary to 5 digit BCD conversion . Oduzmite od decimalnog broja maksimalni umnožak broja 2 (1. Prilikom promene bez digitrona.32.64. Odabir i konverzija brojnih sistema Binarni brojni sistem ne mora uvek biti najpoželjniji. a onda se pronađe odgovarajuća cifra za svaki nibl : 1 C 4 8 8 4 = 1C48x84. a zatim na kraju proračuna konvertovati rezultat u oblik pogodan za prikazivanje preko konverzionih algoritama. najpoželjniji je BCD oblik.8-bit binary to 2 digit BCD conversion . Za broj .5-bit BCD to 16-bit binary conversion AN575 . Ukoliko Vam je na primer potrebno prikazivanje 2 cifre na LED displeju..512.com/ dat je određeni broj konverzionih rutina.16. To su: AN526 . Isto tako.float to integer conversion .integer to float conversion AN670 . Za prikaz na LCD-u pogodniji Vam je ASCII oblik brojeva. Bitovi čiji umnožak broja 2 se koristi.4.BCD (Binary Coded Decimal) to binary conversion routines . moguće je konverziju obavljati po sledećim principima: Binarni u heksadecimalni oblik Najpre se binarni broj podeli u niblove: 1 1100 0100 1000 1000 0100. a donji nibl tog istog registra za prikaz druge cifre. za komplikovane matematičke operacije praktičnije bi bilo korišćenje operacija sa pokretnim zarezom (eng.128. Floating Point ili skraćeno float). a onda saberite vrednosti za svaku 1 1 0 1 1 0 1 0 1 1 0 0 = 1024+256+128+32+8+4 = .1024.Floating Point to ASCII Conversion Za manji broj vrednosti promene brojnih sistema možete ručno izvršiti koristeći integrisan Linuxov ili Windowsov digitron.) koji može biti oduzeti od njega.Binary to BCD conversion routines AN554 . bez prelaska u negativnu vrednost. Heksadecimalni u binarni oblik Moguće je promeniti svaku cifru u nibl: 5 F 3 7 B = 5F3x7B po sledećem: 101 1111 0011 0111 1011 Binarni u decimalni oblik Ovo je malo problematično. biće na logičkoj 1.582 to izgleda ovako: 174 . dok će ostali biti na logičkoj 0.2. Na sajtu http://www..256. U zavisnosti od konkretne primene možda Vam je lakše sve operacije izvršavati u obliku koji vama odgovara. U BCD obliku čak možete gornji nibl koristiti za prikaz jedne.1452 Decimalni u binarni oblik Ovo je takođe komplikovano. Najpre napišite decimalnu vrednost iznad svakog bita: 1024 512 256 128 64 32 16 8 4 2 1.8.microchip.87..

i dalje je jednostavnije koristiti digitron.4= 2 2. Za raniji slučaj to bi izgledalo ovako: 5F3x7B = b'1011111001101111011'=. Ipak.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. a zatim iz binarnog u decimalni.909. Heksadecimalni u decimalni oblik Konvertujte iz heksadecimalnog u binarni oblik.390011 Postoji i način direktne konverzije množenjem umnožaka maksimalne vrednosti jednog nibla.64 = 6 6.582 . 582 / 256 = 2 sa ostatkom 70 70 / 16 = 4 sa ostatkom 6 6 / 1 = 6 sa ostatkom 0 Rezultat je 2x46. 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 pomnožen) 13 = .512 = 70 70 . 175 .582 = b'10 0100 0110' = 2x46 Postoji i način direktne konverzije deljenjem umnošcima maksimalne vrednosti jednog nibla. Za gornji slučaj to bi izgledalo ovako: .

88. Šesnaestobitna aritmetika
Ranije ste naučili upotrebu instrukcija sabiranja i oduzimanja. Moguce je da osmobitne operacije nisu dovoljne za određene primene. Iako PIC16F84 nema hardverske instrukcije za rad sa šesnaestobitnim brojevima, nije ih previše teško implementovati softverski. Pre svega, brojeve kao i rezultat operacije morate držati u dva bajta. Od ta dva bajta jedan će biti bajt veće težine (eng. MSB – Most Significant Byte), a drugi manje (eng. LSB – Least Significant Byte). Brojevi se sabiraju tako što se najpre saberu LSB, u zavisnosti od stanja Carry flaga doda se 0x01 na jedan od MSB, a onda se saberu oba MSB. Sledećim potprogramom ilustrovano je sabiranje šesnaestobitnih brojeva. cblock 0x1C LSB1 ; Promenljiva 1, bajt manje težine MSB1 ; Promenljiva 1, bajt veće težine LSB2 ; Promenljiva 2, bajt manje težine MSB2 ; Promenljiva 2, bajt veće težine LSBRES ; Rezultat, bajt manje težine MSBRES ; Rezultat, bajt veće težine endc 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 težine prvog operanda ; saberi sa bajtom manje težine drugog operanda. ; Rezultat u bajt manje težine rezultata. ; Uzmi bajt veće težine prvog operanda ; Da li je došlo do prekoračenja? ; Jeste, dodaj Carry flag. ; saberi sa bajtom veće težine drugog operanda. ; Rezultat u bajt veće težine rezultata.

Rezultat će biti tačan jedino u slučaju da da se zbir može predstaviti sa 16 bita (0 do 65535 u slučaju neoznačenih ili -32768 do 32767 u slučaju označenih brojeva). U protivnom, biće obavezan još jedan registar za čuvanje stanja Carry flaga. Na sličan način može se realizovati i oduzimanje dva šesnaestobitna broja. Pored ovih operacija, unutar PIC16F84 mikrokontrolera moguće je realizovati množenje, deljenje, kvadratni koren, generisanje pseudoslučajnog niza brojeva pa čak i mnogo, mnogo komplikovanije operacije. Po potrebi, ove funkcije mogu se proširiti za veću 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 matematičke operacije
Pretpostavimo da želite izračunati kvadratni koren. Unutar AN526, AN544 i AN660 datasheeta tvrdi se da će se za njegovo računanje utrošiti oko 3000 instrukcijskih ciklusa (3mS pri 4MHz taktu), kao i da će za njegovo računanje biti utrošeno skoro svih 8 nivoa steka. U ovom poglavlju naučićete par trikova koji Vam mogu poslužiti za brzo računanje. Pretpostavimo da želite izračunati kvadratni koren nad osmobitnim brojem (.0 do . 255). Ništa lakše. Koristićete tabelu. Tab1 addwf 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. ;0–0 ;1–1 ;2–1 ;3–1 ;4–2 ;5–2 ; 254 – 15 ; 255 – 15

Tabelom koja Vam vraća celobrojnu vrednost možete dobiti tačan celobrojni rezultat u samo 5-6 instrukcijskih ciklusa. I sami uočavate da je preciznost rezultata previše mala za ikakav ozbiljniji rad. Nema problema. Vrednost prve decimale rezultata naći će se u sledećoj tabeli. 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 načini izuzetno brzi, nisu ekonomični u pogledu utroška programske memorije. Dobar kompromis između brzine i veličine programa predstavljao bi čuvanje decimala u binarnom ili BCD obliku. Na taj način gornje dve tabele mogle bi se kompresovati u jednu, tako što bi gornji nibl sadržao celobrojnu vrednost (0 do 15), a donji vrednost prve decimale. Za prikaz celobrojne vrednosti na LED displeju pozvala bi se odgovarajuća konverziona rutina za gornji nibl, a donji nibl (decimalna vrednost) bi se ionako nalazila u BCD formatu. Tabela bi mogla izgledati ovako:

177

Tabl addwf 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 veći broj decimala pogodnije bi bilo koristiti binarni oblik zapisa (makar samo za decimale) i odgovarajuće konverzione rutine. Sve zavisi od toga kolika Vam je brzina računanja potrebna. Dobro poznavanje oblika signala odgovarajuće matematičke operacije može Vam pomoći prilikom kompresije njene tabele. Kompresija opisana ranije ne bi bila moguća da je celobrojni rezultat operacije nad brojem 255 veći od 15, jer se broj veći od 15 ne može naći u jednom niblu. Pogledajte na primer sinusnu funkciju. Slika Umesto čuvanja vrednosti cele periode unutar više tabela, mogli biste koristiti označene brojeve i naknadno dodatim MSB bitom pokazivali pripadnost gornjoj, odnosno donjoj poluperiodi. Na taj način prepolovili biste broj potrebnih tabela za isti broj decimala. Slika Još veću kompresiju dobili biste ukoliko se ograničite samo na četvrtinu periode, jer zbog simertičnosti poluperiode drugi deo možete regenerisati oduzimanjem indeksa tabele od maksimalne vrednosti. Tako je broj potrebnih tabela smanjen na četvrtinu. Jedan način računanja sinusne (i kosinusne) funkcije za uglove od 0 do 45 stepeni i sa tačnošću od 6 decimala dobiti obrascima: SIN(X) = 1.7453293 * X * (1 – 0.50758 * X * X * (1 – 0.149 * X * X)) COS(X) = l – 1.523087 * X * X * (1 – 0.25382 * X * X * (1 – 0.1 * X * X)) Za uglove od 45 do 90 stepeni, setite se da je SIN(X) = COS(90 – X). Sledeći način brzog računanja podrazumeva upotrebu eksterne EEPROM memorije. Na primer uz odgovarajuću I2C EEPROM memoriju moguće je unutar EEPROM-a čuvati rezultate svih potrebnih matematičkih operacija. Brzina računanja bila bi jednaka brzini I2C veze, a program ne imao duge tabele. Maksimalnu brzinu dobili bi 178

upotrebom eksterne EPROM memorije, ali ona troši najveći broj pinova. Budući da je njena cena danas izuzetno niska, to bi ipak moglo predstavljati dobro rešenje. Ukoliko Vam ni ovaj princip ne može 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 izvršavanje složenih matematičkih operacija, tako da će na primer rezultat kvadratnog korena zavisiti jedino od brzine komunikacije. U praksi se matematički proračuni uz eksterni hardver retko kada koriste. Isto kao kod povećanja broja U/I pinova, daleko je jednostavnije (i jeftinije) koristiti moćniji mikrokontroler.

179

Zbog toga Vas vaš kompjuter pita za prelazak na letnji ili zimski način računanja vremena. Interapt bi Vam ionako bio potreban zbog multipleksa LED displeja. Njegov takt može se višestrukim uzastopnim deljenjem sa dva smanjiti na ravno 1Hz.90.768kHz. praktičnije je na T0CKI ulaz dovesti signale sa 32. februara za slučaj prestupne godine (Leap year) i automatsko ažuriranje prilikom promene vremena (eng. Sa njim je moguće direktno na pinove mikrokontrolera povezati kristal (sa pripadajućim kondenzatorima).024kHz – 2. Srećom. Možda smatrate da je to idealno! 1Hz – 10Hz – 100Hz – 1MHz.768kHz. Ne verujete? Zato što razmišljate decimalno.048kHz – 4.. Još bolje. ali nakog 6 meseci primećujete da on žuri 5 minuta. Osim toga kvarcni kristali ove frekvencije fabrički imaju manje odstupanje frekvenije od ostalih. Daylight savings). možete softverski kalibrisati vreme 180 . samo kada bi PIC mogao lako deliti sa 10. Naravno. evo šta bi se desilo u tom slučaju: 1Hz – 2Hz – 4Hz – 8Hz – 16Hz – 32Hz – 64Hz – 128Hz – 256Hz – 512Hz – 1. Merenje vremena Već znate kako možete meriti vreme. ovo malo komplikuje hardver zbog potrebe za eksternim kristalnim oscilatorom. i tako dobiti takt nezavisan od frekvencije mikrokontrolera. Mnogo je praktičnije uzeti kristal (kakav se i inače koristi u digitalnim časovnicima) od 32. Tu su napredniji mikrokontroleri u prednosti nad PIC16F84 zbog postojanja šesnaestobitnog TIMER1 modula.. ovaj tajmer aktivan je i u SLEEP modu. Međutim uz kristalni oscilator od 4MHz morali bi se malo pomučiti dok dođete do vremena od tačno 1S. za proces deljenja može se koristiti integrisani preskaler tajmera sa skokom na interapt po dostignutom odnosu deljenja. Kako je mikrokontroleru osnova za deljenje 2 a ne 10. ne uspevaju uvek u tome. RTC – Real Time Clock) ubaciti i kalendar.384kHz – 32. I bilo bi tako. Ukoliko planirate u sat (eng. Ukoliko mikrokontroler treba (pored sata) obavljati i neke druge operacije. a ne binarno! Sećate se da se jedna instrukcija izvrši za 4 takta mikrokontrolera. upravo zbog njihove primene u generatorima preciznih vremenskih intervala. Još bolje. Uz kristal od 4MHz instrukcija se izvrši za 1 mikrosekundu. ili kristal sa nekom od frekvencija iz niza. morate pre svega odlučiti da li ćete mu implementirati korekciju 29.096kHz – 8. i deljenje njegovih taktova.768kHz kristala i podesiti postskaler da impulse za brojanje uzima sa ovog pina umesto sa takta oscilatora. Tako PIC može raditi svojom maksimalnom brzinom. Iako se fabrike trude da im kristali budu sa što preciznijom frekvencijom.192kHz – 16. Obavezan je kristalni oscilator. odnosno (ukoliko se zbog lakšeg razumevanja pretpostavi da se jedna instrukcija izvrši za vreme jednog takta oscilatora) kao da je korišćen kristal od 1MHz. Da li ste ikada podesili sat na svom kompjuteru. uz isto tako maksimalnu preciznost vremena.

com/homepages/Bill_Bowden/homepage. Najbolje je svakako ovu korekciju ubaciti za određeni (fiksni) broj sekundi. Pravljenje najobičnijeg digitalnog časovnika mikrokontrolerom nije baš praktično. Verovatno ste ga već instalirali uz MPLAB paket. ali to dosta komplikuje program i samim tim nameće potrebu za njegovim sporijim izvršavanjem.fi/jap i http://ourworld.bobblick. a potpuno isti kristal se koristi i u tim kolima. kao na primer sa sajta http://www.htm#menu. Gotove softverske rutine za sat možete naći širom interneta. Drugačiji način (hardverski) kalibracije vremena sastojao bi se u menjanju kapacitivnosti jednog od kondenzatora pored kristala od 32KHz.compuserve. A ukoliko je mala potrošnja imperativ. mogu se specijalizovana integrisana kola povezati sa mikrokontrolerom.iki. Preciznost takta direktno zavisi od upotrebljenog kristala (i njegove kalibracije).com/techref/projects/propclock/propclock. zajedno sa proračunima prestupnih godina. dana. PCF8593 i NJU6355. 181 . Verovatno će Vam biti potrebno par meseci za tačnu kalibraciju upotrebljenog kristala. Digitalni časovnici imaju svoja specijalizovana integrisana kola. Već imate asemblersku rutinu u Microchip Maestro programu. Nemojte misliti da bi upotrebom tih kola dobili veću preciznost. Još neke su na adresama http://www. Najlakše štelovanje postiže se trimer kondenzatorom. Zbog njihove minimalne potrošnje direktno na štampanu pločicu može se zalemiti mala litijumska baterija preko koje bi se sat napajao električnom energijom u slučaju nestanka struje (isto kao kod matičnih ploča kompjutera). Tipični predstavnici ovakvih integrisanih kola su DS1307. Dodatnu preciznost možete postići temperaturno kontrolisanim oscilatorom.html.tako što satu dodate (ili oduzmete) 1 sekundu svakih par sati. Pored toga ova kola (isto kao i gore pomenuti Maestro softver) u sebi sadrže kalendar. nedelja ili meseci. Nema svrhe trošiti novac na skuplji mikrokontroler. povezivanje sa kompjuterom). Isplati se to raditi jedino u slučaju da je potrebno napraviti sat specifičnih osobina (više alarma.

6. Povratak iz potprograma Drajver bi se mogao dodatno kombinovati sa glavnim programom tako da se vrednost b'00000011' zadaje jednom pre inicijalizacije (npr. u PORTA . Poziv potprograma za ispis .4 .W PORTB . 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. Obrazac za crtanje cifre 5 . ovo nije šala. Poziv za sliku LED displeja .W andlw b'00000011' return . Slika cifre u shaddow registar za port B. Obrazac za crtanje cifre 6 .91. Jedan LED displej na portu B. .W PORTA SPORTB. štampač ili grafičku karticu. Shaddow registar porta A . Ovde se doduše ne radi o drajverima za skener. Maskiranje bitova 2 do 7 (izlazni) . a zatim da se inicijalno podešavanje TRISB registra kao i andlw instrukcije unutar drajvera podesi ovako imenovanom vrednošću. Pogledajte sada sledeći primer. Pretpostavljam da Vam je lakše i razumljivije da testirate prekidače tako da pri njihovoj pritisnutosti očekujete pojavu logičke 1. prekidače ili step motor. Invertovani PORTB u W . Pogledajte najjednostavniji primer. Povratak iz potprograma Potprogram Update može se ovako pozivati i za port A. Povratak iz potprograma . 182 .1 . . Obrazac za crtanje cifre 3 . Drajver za ispis W broja na LED displej .2 . U W se nalazi se vrednost od . Drajver_za_prekidace comf PORTB. Obrazac za crtanje cifre 4 . već o drajverima za LED. a ne logičke 0 (što bi se sigurno desilo pri upotrebi pull-up otpornika).1 do .f b'00001100' b'10110110' b'10011110' b'11001100' b'11011010' b'11111010' SPORTA. Najjednostavnije je u tom slučaju invertovati sve ulaze. Ta vrednost se dodaje na PCL. odnosno može služiti kao posebna celina. Obrazac za crtanje cifre 1 . LCD displej. u PORTB .5 . Drajver bi se sastojao od već ranije naučene tabele i potprograma za ispis. Shaddow registar porta B . Stanje prekidača u bitovima 0 i 1 u W . Obrazac za crtanje cifre 2 . sa B_ULAZI equ b'00000011').6 . Drajveri Iako Vam može tako izgledati. .3 .

Kad god je moguće standardizujte softver za uobičajeni hardver drajverima. za osvežavanje više LED displeja. po zadatim kriterijumima pozivati ove delove. pri dodavanju još jednog ulaznog pina) biti dovoljno izmeniti samo jedan jedini red programa. glavni program treba periodično. manje grešaka. 183 . Drajveri koji su vremenski kritični (npr. debouncing ili kontrolu step motora) mogu se pozivati u određenim trenutcima iz interapta. Manje izmena. Da bi se takvi delovi mogli izvršavati bez dodatnih usložnjavanja. Potrudite se da određene standardne vrednosti (ulazi u prvom drajveru) imenujete i podesite samo jednom u programu. Više o takvom principu naučićete u narednom poglavlju. Ipak. rad sa više ovakvih vremenski kritičnih delova unutar jednog programa dodatno komplikuje osnovni algoritam programa. Tako će pri kasnijoj izmeni softvera (npr.

Na primer kod duplog multipleksa jedan task brinuo bi se o osvežavanju LED displeja preko njegovog drajvera. na primer. To je najlakše postići interaptima izazvanim tajmerom. najviše procesorske snage troši trenutno aktivan prozor. drugi o debouncingu prekidača. To je prilično neekonomično rasipanje resursa. Mikrokontroler će sve taskove morati da izvršava malo dužim vremenom od taska najdužeg trajanja. ima primera kada je jednostavnije podeliti program u više nezavisnih celina od kojih se svaka treba izvršavati nezavisno od drugih. Taskovi uglavnom zahtevaju pozivanje u različitim intervalima (npr. i mora biti pozivano u tačnim vremenskim intervalima. Sadržaj W i STATUS registra bi se morao snimati (kao kod interapta) za svaki pojedinačni task. Taskovi se mogu razlikovati po zahtevima za opsluživanjem. U kompjuterskim operativnim sistemima. Na primer osvežavanje displeja mora imati prioritet nad ostalim taskovima. Svakako da tako jednostavan OS ima dosta mana.92. AN777 i časopis Elektor Electronics broj 5/98. i počeo bi sledeći task. AN585. 184 . Složeniji princip davao bi određeno fiksno vreme za svakom pojedinačnom tasku. a treći bi u stvari radio ono za šta je mikrokontroler i namenjen. Iako to vreme ne mora biti dovoljno za završetak taska. u tačno određeno vreme). Svakako da je u ovom slučaju poželjno napraviti mali OS koji bi regulisao pozivanje pojedinih celina po unapred zadatim parametrima (npr. po isteku vremena njegovo izvršavanje bi se prekinulo. Pojedinačni taskovi redom bi se mogli pozivati on W goto principom opisanim ranije. tako da se može izvršavati kad god se ne izvršava task većeg prioriteta. Najjednostavniji multitasking OS bio bi redom pozivao taskove po prekoračenju tajmera. bit 1-taster2. Redni broj taska koji se trenutni izvršava kao i status pojedinačnih taskova (npr. zauzet ili završio) mogao bi se snimiti u par kontrolnih registara. registar DISPLEJ1 i DISPLEJ2 za prikaz na LED displejima i registar TASTERI sa flagovima bit 0-taster1. Interapti moraju trajati što kraće kako ne bi previše kočili taskove. task) pri čemu su pojedinačni taskovi u osnovi jednostavni. Za više detalja pogledajte AN514. Na taj način dobija se jedan pravi mali multitasking sistem. Operativni Sistem Da li je mikrokontroleru potreban operativni sistem? Uglavnom nije. Preskaler treba biti tako podešen da omogući i najzahtevnijem tasku siguran završetak pre novog prekoračenja tajmera.).. U nastavku teksta biće opisani osnovni principi takvih sistema. Za razliku od njega task za izračunavanje kvadratnog korena nema zahteva za određenim vremenom. task za osvežavanje LED displeja treba češće pozivati od taska za testiranje prekidača). Taskovi mogu efektno međusobno komunicirati preko namenskih registara opšte namene i flegova unutar njih (npr. Program na taj način može biti sastavljen od mnogo nezavisnih (tačnije uslovno nezavisnih) delova (eng.. Međutim.

.. Fazna modulacija (eng. CRC algoritma. zbog interpolacije. ADPCM ili Speex algoritmom) bez značajnijeg gubitka kvaliteta.. konverzija otpornosti i kapacitivnosti. Programiranje mikrokontrolera se (za razliku od programiranja kompjutera) ne može posmatrati kao usamljen.. može Vam itekako pomoći prilikom povezivanja kompjutera i mikrokontrolera. a kompjuter bi ih mogao na miru svom svojom snagom analizirati. Međutim. Elektronika. Svest o nejednakoj propustljivosti atmosfere za različite talasne dužine svetlosti omogućiće vam pravilan izbor talasne dužine predajne i prijemne fotodiode. princip rada kapacitivnih prekidača. Na primer primenom doplerovog efekta omogućeno je (zvučno ili optičko za brže mikrokontrolere) merenje brzine pokretnog objekta. matematika. povećanje broja U/I pinova. operacija sa negativnim ili brojevima sa pokretnim zarezom. Ranije pomenute metode (multipleks i dupli multipleks. a samim tim veću izlaznu snagu radio predajnika. Phase Shift Keying) tona omogućava uzak audio frekventni opseg. iako se to uglavnom ne spominje u literaturi poznavanje fizičkih zakona može Vam itekako pomoći u pravilnom dizajniranju uređaja. Takođe je i najosetljivija sa strane prijemnika. komplementa dvojke.) zahtevaju poznavanje osnovnih principa elektronike. U najčešćem broju slučajeva mikrokontroler će obrađivati spoljne signale. Poznavanje karakteristika ljudskog oka omogućava multipleks izlaza a ljudskog uva kompresiju muzike ili govora (npr. fizika..). 185 . Mikrokontroler bi mogao skupljati podatke na terenu.93. principi A/D i D/A konverzije. Poznavanje informatike. sortiranja podataka. izdvojen proces.. Matematički principi su takođe bitni (npr.

morate shvatiti princip i potrebu za straničenjem memorije. Kako je PC trinaestobitan.PIC16F84 ima 68 opštih i 12 specijalnih registara u BANK0) koriste se registri na drugim stranicama RAM memorije (BANK1. To opet rađa nove probleme. Kod CALL instrukcije to izgleda ovako: kod adresa 100 xxxxxxxxxxx Kao što vidite. Većina registara dostupna je samo iz pojedinih banki. Ukoliko želite jednom preći i na savremenije (ili starije a jeftinije) mikrokontrolere. Ista situacija je i sa GOTO instrukcijom. Naime. Da bi se problem bar donekle ublažio. To onemogućava efektno korišćenje celokupne RAM memorije. unutar jedne četrnaestobitne instrukcije nalazi se i kod instrukcije i operand. odnosno maksimalno 8Kb programske memorije. Da bi se ovo prevazišlo. unutar četrnaestobitne instrukcije za adresu preostaje maksimalno 11 bitova. 186 . Sa 8 bitova koji se mogu naći u njima moguće je adresirati do 256 registara. odnosno maksimalno 2Kb. potrebno je kao kod tabele pre skoka podesiti odgovarajuće bitove PCLATH registra. RAM memorija takođe pati od sličnog problema. Iz tog razloga ni GOTO ni CALL instrukcija ne mogu kao odredište koristiti adrese veće od strane (eng. Još komplikacija može izazvati indirektno adresiranje preko INDF i FSR registara. program će verovatno krahirati. Zato se unutar STATUS registra nalazi IRP bit kojim se omogućava indirektno adresiranje ostatka RAM memorije. Ovo ograničenje proističe iz sintakse samih instrukcija. Sa tih 11 bitova mogu se direktno adresirati jedino memorijske adrese od 0 do 2047 (7xFF).94. Međutim. sve instrukcije su četrnaestobitne. Page) od 2Kb unutar programske memorije. U potpuno istoj situaciji nalaze se mikrokontroleri PIC16 serije sa više od 2Kb memorije. Straničenje memorije U poglavlju sa tabelama upoznali ste se sa problemom straničenja programske memorije u blokovima od po 256 bajtova. Evo kako izgleda kod ANDWF instrukcije: kod odredište adresa 000101 d fffffff Sa 7 bita dostupnih za adresu moguće je adresirati maksimalno 128 registra unutar jedne banke. Kod mikrokontrolera iz PIC16 serije koji imaju više od 2Kb programske memorije (PIC16F84 ima 1Kb) instrukcije CALL i GOTO mogu adresirati maksimalno 2Kb memorije. Kod mikrokontrolera PIC16 serije sa više od 128 registara (uključujući i specijalne registre . on može direktno adresirati programske adrese od 0 do 8191 (1FxFF). Prelazak sa banke na banku obavlja se preko RP0 i RP1 bitova. BANK2 i BANK3). Ukoliko deo tabele izađe iz bloka od 256 bajtova. postoji par registara koji su zajednički za sve banke. Tabelama je kao što ste već naučili neophodno straničenje u programskoj (ROM) memoriji.

Kod PIC18 serije na primer ukinuto je straničenje programske memorije. dok je prostor za registare u bankama povećan na 256. Mora se voditi računa o previše sitnica.Iz svih ovih razloga PIC16 familija mikrokontrolera je prilično nezahvalna za pravljenje programa većih od 2Kb. 187 .

Ne postoji disasembler koji može . Nažalost autor ga je napisao u PIC Basic ili C jeziku umesto u asembleru.hex fajl i videti način realizacije iz asemblerskog listinga. Te instrukcije mikrokontroler ne razume. možete disasemblirati njegov . i u učenju novih softverskih tehnika. pa su stoga implementovane upotrebom dve ili više običnih instrukcija. Analiza disasembliranih programa uopšte nije laka. Neuobičajeno rešene operacije (npr. ali je na sajtu ostavio i . Zato je preporučljivo u disasemblirani listing ubaciti odgovarajuće komentare. Neki od najpoznatijih disasemblera za PIC16F84 su Mikado PIC DIS LITE DISASM84 Već ranije pominjani PIC Simulator IDE. ne ostavlja program na internetu. skok upotrebom PCL registra) mogu biti izuzetno komplikovane za analizu. a registrima adresom (tipa Label4 i Reg2A). Komentara nema (osim onih koje disasembler eventualno postavi). a oni koji jesu. ukoliko ste sigurni u funkciju određenih registra ili labela.asm fajlovima. Onaj ko želi naplatiti svoj trud. i podeliti ih u logičke celine (blokove). registri i bitovi nisu uvek imenovani. Analiza tuđih programa pomoći će Vam u razvijanju sopstvenog stila programiranja. već prodaje programirane i zaštićene mikrokontrolere (uključen CP konfiguracioni bit).hex kôd pretvoriti u asemblerski listing. Veliki broj mikrokontrolerskih projekata sa interneta je dat kao potpuno besplatan. U tome je jedna od prednosti asemblera nad višim programskim jezicima. Ovde je potrebno napomenuti da MPLAB asembler omogućuje korišćenje dodatnog seta instrukcija.hex kôd. Disasembler Sigurno Vam se desilo da ste na internetu naišli na program koji radi upravo ono što je Vama potrebno.hex fajl prebaciti u PIC Basic ili C.95. Isto tako. Osim toga. Binarni brojevi ili ASCII karakteri uvek su prikazani u heksadecimalnom formatu. ali biste mu dodali još par mogućnosti. nema svrhe ponovo izmišljati toplu vodu. Replace opcije). koji se kasnije može editovati. 188 . Budući da je ovaj način zaštite programa mikrokontrolera sasvim dovoljan za sprečavanje piraterije. Disasemblerom je moguće . imaće imena iz banke 0 (iako se možda realno nalaze u banci 1). i Vi možete biti sigurni da Vam se dugo pisani program neće odjednom pojaviti na internetu. Ukoliko želite saznati na koji način mikrokontroler izvršava takav program. možete im izmeniti naziv u svim mestima u kojima se pojavljuju u programu (preko Edit. Labelama disasembler dodeljuje onake redom. Ovaj set instrukcija moguće je naći u nekim (retkim) .

F endif nego: movf sublw btfsc goto btfsc goto Uvecaj Test incf goto movf sublw btfss goto decf . realizovanje odgovarajuće programske strukture i izmišljanje naziva labela.. Preprocesor predstavlja program kojim je moguće ubrzati razvojh programa.Z Test STATUS. Za najobičnije testiranje dvobajtnog broja i izvršavanje različitog koda u zavisnosti od rezultata.asm fajl standardno bi se kompajlirao MPLAB asemblerom. Svakako da se ove strukture mogu realizovati ručno u asembleru.. (primeri su iz Paskal jezika. 189 . čak i uz komentare. iako se ista struktura sreće u svim višim programskim jezicima). ili do.F Smanji Kraj Prvi slučaj je razumljiviji (opet su komentari namerno izostavljeni)..C Smanji BROJ. Nakon što se preprocesorom dobije odgovarajući asemblerski kod..F Kraj LO_GODINA.. Kako je to moguće? Pretpostavimo da imate već razvijene drajvere za standardne periferije.C Uvecaj BROJ.96.W 0x07 STATUS. Preprocesor U programima se često javlja potreba za standardnim programskim strukturama tipa if. zadržavajući pri tome svu snagu asemblera. Utoliko bolje po Vas..then. Potrebno je naravno prethodno definisati da je GODINA dvobajtna vrednost. ali u većim programima njihov kod je teško pratiti. nije baš lako povezati ih u celinu.while... Što više ručno pisanog koda.F else decf BROJ.W 0xD8 STATUS. tako dobijen . morali bi napisati dosta koda.. Međutim. Nije li lakše pisati: if GODINA > .else. to veća mogućnost pojave grešaka.2008 then incf BROJ.. HI_GODINA. i njime je preprocesoru prepuštena briga oko računanja konkretnih vrednosti (0x07 i 0xD8) za poređenje...

njihov kod je duži i sporije se izvršava. lako je naknadno ga izmeniti direktno u MPLAB-u. i ne ostavlja programeru mogućnost naknadne izmene dobijenog koda (dobija se samo .hex fajl).Možda smatrate da je lakše koristiti C ili PIC Basic. Čista je šteta što se mogućnosti preprocesora nedovoljno iskorišćavaju.html. Preprocesor pak dodaje samom asembleru (osnovne) mogućnosti viših programskih jezika. Preprocesor će ih jednostavno ignorisati. Problem je što viši programski jezici ne ostavljaju programeru mogućnost simuliranja programa instrukciju po instrukciju (bar ne na način kojim bi programer mogao uticati na program na instrukcijskom nivou).picbook.embedinc. Delimično ste u pravu. Nakon što preprocesor generiše osnovni asemblerski kod. tako da se asemblerske instrukcije slobodno mogu nalaziti u okviru koda koji izvršava preprocesor. ukoliko Vam dobijeni kod iz bilo kojih razloga ne odgovara. Prepic preprocesor možete skinuti sa http://www.htm. Uz preprocesor je razvoj programa skoro isto toliko brz kao kod viših programskih jezika. SASM (Jessica Meremonte's Structural PIC Assembler preprocessor) preprocesor nalazi se na http://www. Kako on nema GUI (Graphical User Interface) problem će Vam verovatno predstavljati prenošenje parametara unutar komandne linije.com/pic/dload. 190 . On je skromnijih mogućnosti. a opet je korisniku omogućena maksimalna moguća kontrola programa.com/downloads.

Iako se u njemu ne može izabrati PIC16F84. Proizvode najduži (i najsporiji) mogući kod. Osim toga nemaju dovoljno kontrole u odnosu na bilo koji drugi programski jezik.asm već jedino .97. Jedan od najboljih grafički orjentisanih programskih jezika je LDmicro sa http://cq. može se koristiti PIC16F628 koji mu je najsličniji. Zašto su onda uopšte navedeni ovde? Zato što omogućavaju veoma brzu izradu jednostavnijih programa. kasnije će biti neophodno i njegovo disasembliranje radi prevođenja koda za PIC16F84. 191 .pl.hex fajl. kojima je moguće definisati odgovarajuća stanja.cx/ ladder. Grafički orjentisani programski jezici Za razliku od asemblera i viših programskih jezika grafički orjentisani programski jezici sastoje se iz blokova (logičkih celina). Kako ni on ne proizvodi . i uopšte neracionalno rasipaju resurse mikrokontrolera.

ali zapitajte se po kojoj ceni Vam je potrebna. Iako je sasvim moguće koristiti digitalne senzore temperature (npr. Osim toga LED displej se može posmatrati pod svim uglovima i odlično se vidi po mraku.768kHz kristala! Posebna situacija je LCD displej. One mogu odlično poslužiti u kontroli procesa ili u upravljanju raznim analognim uređajima. Digitalna kola sa integrisanim satom i kalendarom sigurno Vam deluju primamljivo. Pre svega u ceni finalnog proizvoda. Ovako. Obično se rešenje nalazi u raznim kompromisima. Video igrice! DVD možete gledati i na kompjuteru sa manje od 800MHz. koje bi upotrebom LED displeja mogli mnogo jeftinije realizovati. DS1820). Uostalom. zapitajte se šta pokreće industriju kompjutera.98. Uporedite cenu XT sa cenom RC oscilatora. Radiće stabilnije. Neka bar radi nešto korisno. Nemojte misliti da su digitalne stvari one najbolje. jedina prednost joj je kompatibilnost između svih PC konfiguracija. Nema svrhe na LCD displeju prikazati 2 ili 3 cifre. 192 . Bila bi sasvim u redu. pogledajte koliko koštaju pre nego što ih kupite. Još jedna moderna novotarija je USB konekcija. bez uticaja na pravovremeno izvršavanje programa. ali za regulaciju temperature prostorije svakako hoće. pogotovu ukoliko se time može uštedeti. kada bi prosečan PIC mikrokontroler imao koji megabajt memorije. probajte mikrokontroleru što više smanjiti takt. Ne kažem da je to mala prednost. Nemojte misliti da će Vam sa njim izgrađeni uređaji izgledati profesionalnije. Uglavnom se može bez nje. trošiće manje struje i duže će trajati. ali pitanje je koliko Vam je ona u stvari potrebna. Nije li mnogo jeftinije koristiti NTC otpornik i A/D konvertor? Preciznost koju biste sa njim mogli dobiti možda Vam neće biti dovoljna za inkubator ili razvijanje filmova. A koliko to košta? Kao programer morate odabrati najoptimalnije softversko / hardversko rešenje za Vaš projekat. Ionako Vam mikrokontroler u većini slučajeva bespotrebno troši dragocene taktove. manje će se grejati. Ukoliko je to moguće. Kristalni oscilator daje mnogo precizniju frekvenciju od RC oscilatora. Mala brzina takta oscilatora u većini slučajeva uopšte ne predstavlja nedostatak. Uglavnom je toliko malih dimenzija i toliko slabo osvetljen da se u praksi prilično malo koristi. Ali pogledajte njihovu cenu! Uporedite je sa cenom 32. ali analogna elektronika i dalje drži veliko vođstvo.

Tu se pre svega misli na spoljne fizičke veličine koje mogu ometati rad mikrokontrolera. Ovi problemi mogu se efektno rešiti upotrebom oklopljenih (koaksijalnih) kablova i galvanskim odvajanjem mikrokontrolera od izvora smetnji optokaplerima. temperature. što bi uzrokovalo reset mikrokontrolera usled spuštanja njegovog napona napajanja ispod određene granice. Definisanje pinova kao izlaza pre nego što se promeni nepoznata vrednost u PORTA i PORTB registru može dovesti do kratkog neželjenog pojavljivanja logičke 0 ili 1 na pinovima mikrokontrolera. morate pre podešavanja TRISA i TRISB registra podesiti PORTA i PORTB. podesićete TRISA i TRISB. Ukoliko se pin RA4 ne koristi potrebno je pored toga postaviti ga na logičku 0 jer u stanju logičke 1 prelazi u visokoimpedansno stanje. poželjno je da u . U visokoimpedansnom stanju napon na pinovima može zaoscilovati. Imajte u vidu da iako mikrokontroler može bez problema obavljati jako komplikovane operacije. morate znati da bi prevelika struja koju povuče taj potrošač u trenutku uključenja mogla izazvati pad napona u mreži. Da biste se osigurali od ovoga.99. budite uvereni da će poći. U nastavku teksta će biti opisane situacije koje (ukoliko se na njih ne obrati pažnja) mogu dovesti do nepravilnog rada programa. Mnogo teže greške nastaju usled loše napisanog softvera. što znači da stanje bitova u njima može biti bilo kakvo. Isti slučaj može uzrokovati i običan relej zbog induktivne komponente njegovih namotaja. Ne verujete da može toliko uticati? Uključite mobilni u blizini radio prijemnika.asm 193 . Na Vama je da predupredite što više verovatnih grešaka. U praksi se čak javljaju i slučajevi korupcije programske memorije (moćnijim mikrokontrolera) zbog njihove mogućnosti programiranja niskim )+5V umesto +12V) naponom. Druga tipična greška je napon indukovan na štampanoj pločici i priključnim kablovima. Jedna od najčešćih grešaka je direktno uključenje većih potrošača. da ni ne govorim. Pinovi koji se ne koriste trebaju biti konfigurisani kao izlazi da ne bi prešli u visokoimpedansno stanje. ni on nije svemoguć. Svakako Vam je jasno da mikrokontroler ne smete koristiti u uslovima vlage. Ukoliko to ne uradite. Ukoliko nešto može poći po zlu. Ukoliko na spoljni hardver želite odmah po uključenju mikrokontrolera dovesti logičku 1. Vi mu trebate obezbediti optimalne uslove za rad. ili njegovih dodatnih sklopova. O stabilnosti oscilatora u ovakvim slučajevima. Pinovi PORTA i PORTB registra su nakon uključenja preko TRISA i TRISB registra definisani kao ulazni. Ukoliko već imate neki potrošač (2-3kW) koji želite uključivati i isključivati mikrokontrolerom. i na pinovima PORTA i PORTB registra javiće se nepoznato stanje. Marfijev zakon U raznim projektima sa mikrokontrolerima mnogo šta može poći naopako. mehaničkih vibracija ili elektromagnetnog zračenja koje izlazi iz granica postavljenih u njegovom tehničkom uputstvu. Nemojte se zavaravati. Vrednosti u PORTA i PORTB registrima po uključenju mikrokontrolera nisu inicijalizovane.

Ne bi smeli dozvoliti programu snimanje preko vrednosti specificirane u tehničkom uputstvu.zaglavlju koje koristite za razvoj novih programa unapred inicijalizujete stanje na PORTA i PORTB registrima pre promene TRISA registra. resetovati bit 2 i postaviti dobijeno stanje u PORTA. Ipak. Budite sigurni da će bar neko od njih to i učiniti. EEPROM memorija mikrokontrolera ima svoj radni vek. Modify Write). From: "nepe_yu" To: mikroelektronika@yahoogroups. INTCON i OPTION_REG) zajedno sa njihovim kratkim objašnjenjima. Program bez debouncing rutine radiće bez problema dok su kontakti prekidača novi. Takođe dobra je praksa testiranje maksimalnog vremena snimanja i nastavak programa ukoliko je ono mnogo duže od normalnog ignorišući pri tome stanje flaga. Međutim. morate na ulaznim pinovima postaviti pull up ili pull down otpornike. pojačana aktivnost sunčevih pega pa čak i komšničin upravo uključen usisivač mogu dovesti do prelaska ulaznog pina u nedefinisano stanje i lažnu detekciju pritisnutog tastera. ukoliko je na primer pin RA0 definisan kao izlazni sa logičkom 1. Da bi se ovo izbeglo. Na taj način sigurni ste da će program ispravno raditi čak i da mikrokontroler (iz bilo kog razloga) ne setuje pravovremeno flag. Evo dobrog primera sa jedne mailing liste. i nakon 194 . Poseban slučaj predstavljaju greške izazvane internim ciklusom čitanja i upisa stanja sa porta (eng. Korisnici uvek mogu pritisnuti 2. i da mu na taj način greškom prilikom upisa promeni stanje. poželjno je ne izvršavati operacije direktno nad portovima. već sve operacije obavljati nad shaddow registrom. ali se iz bilo kog razloga (previše mala impedansa na liniji) pin RA0 trenutno nalazi u stanju u kome nije postavljen. Čim se oni iskrzaju. Program mora biti napisan tako da predvidi i tu mogućnost. Bolje po inicijalizaciji mikrokontrolera obavite sve potrebne operacije u običnoj (RAM) memoriji. U stvari poželjno je ubaciti inicijalizaciju u zaglavlje za sve najkorišćenije registre (npr. moguće je da mikrokontroler pri RMW ciklusu sa njega očita logičku 0 umesto logičku 1. Umesto čekanja na setovanje flaga kraja upisa u EEPROM možete (ukoliko vam brzina nije imperativ) jednostavno sačekati dovoljno dugo da se upis sigurno završi. program će detektovati više uzastopnih pritisaka prekidača. samo kada je to neophodno. vršio na 100mS neprekidno. u interni EEPROM PIC18F452 mikrokontrolera. da se njihova inicijalizacija ne bi previdela. Prilikom izmene stanja porta instrukcijom bcf PORTA. sam PIC je prilično izdržljiv. RMW – Read. zračenje vašeg mobilnog telefona. Najpraktičnije je koristiti integrisane pull up otpornike na PORTB. kada je to neophodno kopirati rezultat u odgovarajući port. U protivnom. 3 ili više tastera istovremeno. Ukoliko su direktno na mikrokontroler povezani prekidači. a tek kasnije.com Subject: [mikroelektronika] Re: Pouzdanost PIC-ova (WDT) A evo i mog skromnog iskustva :) Naime greškom sam u jednom projektu upis.2 mikrokontroler će očitati trenutno stanje svih pinova PORTA registra. a snimajte u EEPROM.

14x20. Na taj način bliže određujete mesto kvara. Na primer digitalni senzor temperature je očigledno neispravan ukoliko prijavljuje temperaturu apsolutne nule (-273oC). jer će se ona ponašati kao da je u njoj mapirana obična (radna) programska memorija. Ipak. Potpuno je isto adresiranje lokacija 0x20. 8x20. Detekciju bilo kakvog kvara mikrokontroler može signalizirati treperenjem displeja ili pojedinačnih LED uz eventualni opis greške (npr trepereća oznaka E1 na LED displeju signalizira prekid veza do senzora osvetljenosti utvrđenu njegovom prevelikom otpornošću. 4x20. ima i pozitivnih iskustava :))) Dobru praksu predstavlja kratko uključenje svih LED za vreme inicijalizacije mikrokontrolera. Na taj način odmah po uključenju mikrokontrolera možete primetiti da li su svi segmenti LED displeja kao i pojedinačne LED ispravne. 18x20 i 1Cx20. Nakon maksimalne programske adrese 3xFF program se nastavlja od početka (0x00).više meseci rada ta lokacija EEPROMa je stradala. a trepereća oznaka E2 neispravnost digitalnog senzora temperature utvrđenu izlaskom merene temperature iz njenog uobičajenog . 195 .radnog opsega). što vam može pomoći prilikom opravke. 10x20. problem može izazvati adresiranje memorije koja nije implementovana u PIC16F84 mikrokontroleru (4x00 – 1FxFF). Cx20. Ovo su ipak ekstremni slučajevi i ne bi Vas trebali brinuti. Microchip je takođe imao Marfija na umu kada je projektovao mikrokontrolere pa asembler u sve neiskorišćene adrese programske memorije snima kod NOP instrukcije. Ukoliko je moguće. "Obdukcijom" je utvrđeno da je više od 12000000 (12 miliona) puta izvršen upis pre nego što se javio problem :) Eto. u toku inicijalizacije testirajte i eksterne komponente.

a ne više njih istovremeno. a Vi sami procenite koji bi spadali u dobar dizajn. Možete li (kao kod pisaće mašine) odgovarajućim prstom pritisnuti bilo koje dugme na njoj. Ovo je za korisnika najlogičniji način podešavanja vremena. Na taj način se jednim jedinim pokretom ruke može fino podesiti željeno vreme. ponaša se kao da je protekla. Pogledajte broj 5 na vašem mobilnom telefonu i numeričkom delu tastature kompjutera. Zato se i koristi kod npr. 2. Postoji mali milion načina na koje možete realizovati ovakav zadatak. Ovim je podešavanje olakšano (zbog smanjenja brzine inicijalnog ponavljanja). Ali jeste osobama sa oštećenim vidom. nakon čega se izvršava nova detekcija. Detekcija pritisnutosti se obavlja softverski. Pogledajte sledeći primer. Dobar (user frendly) dizajn Pogledajte Vaš daljinski za TV! Trebaju li vam svi ti dugmići? Da li ste ikada uspeli da programirate svoj klima uređaj tako da se automatski uključuje svakoga dana u 6:00? Jeste li se iznervirali što vam instaliran Office paket zauzima cak 1Gb hard diska. mikrotalasnih pećnica. Moj otac i dalje koristi mehaničku „Unix“ pisaću mašinu. a da se zatim (ukoliko je prekidač i dalje pritisnut) u sledećih par pozivanja smanjuje do npr. Rutina za pauzu prepravljena je tako da pauza nakon prvog pritiska iznosi 0. Zbog nepostojanja debouncing rutine. iako je poznato da prosečan korisnik iskoristi jedva 2% mogućnosti programa za obradu teksta? Pogledajte tastaturu Vašeg kompjutera. Željeni broj trebate podesiti preko ulaznog interfejsa.75S. i dalje je moguće je da se jednim pritiskom preskoči koji broj. a majci sam morao kupiti pravu „ciglu“ od mobilnog. jedino sa pauzom od trećine sekunde po pritisnutom tasteru. Po otpuštanju i ponovnom pritiskanju prekidača. Ovde je prikazano par primera. a vreme za podešavanje smanjeno je (zbog veće brzine ponavljanja) na oko 19S. Za prebacivanje sa 00 na 99 na ovakav način potrebno je čekati čak 30 sekundi. Umesto dva prekidača postavljen je rotacioni enkoder. da bi uspela pritiskati jedan po jedan taster. 1. Dodata je debouncing rutina. Potrebno je na LED displeju prikazati broj od 00 do 99. 4. Tako se može bržim uzastopnim pritiskanjem prekidača smanjiti vreme podešavanja. 3. Softver je prepravljen tako da se i za vreme pauze testira prekidač. 0. jer ne uspeva napraviti dupli klik. ne pomerajući celu šaku? U osnovi svakog dobrog dizajna leži jednostavnost i maksimalno prilagođenje motorici i intelektualnim sposobnostima krajnjeg korisnika.100. 5. 196 . Primećujete li da se razlikuje od ostalih? Nama to nije potrebno. Dva prekidača (+ za povećanje broja i – za smanjenje) vezani su kao ulazi sa svojim pull-up otpornicima. Ukoliko se pritisne a da još nije istekla trećina sekunde.15S. bez debouncing rutine. pauza bi opet počela od maksimalne vrednosti. i nadalje ostaje na toj vrednosti. Vreme potrebno za podešavanje smanjeno je na oko 5S.

Umesto rotacionog enkodera postavljena je tastatura sa ciframa „0“ do „9“ i tasterom „DALJE“ bez debouncing rutine. a danju jako. ali sa pauzom od trećine sekunde po pritisnutom tasteru. Koji način će se koristiti zavisi jedino od broja slobodnih pinova i cene odgovarajućeg interfejsa. Dodata je debouncing rutina. displej će Vam duže trajati. Vreme potrebno za podešavanje iznosi oko 3S. Osim što lepše izgleda (ne blješti). Osim ulaznih. nije teško ostvariti poboljšanja ni na izlaznom hardveru. Vreme za podešavanje iznosi samo 2S. 197 . Ukoliko imate česte nestašice struje. pa ste zbog toga za sat predvideli dodatno napajanje baterijom. Šta mislite o LED displeju koji menja jačinu svog svetla u zavisnosti od spoljnog osvetljenja? Noću bi svetleo slabo. Sigurno ste i Vi došli do zaključka da bi jedino načini pod tačkom 4.6. Ako ga već morate uključivati kada nema napajanja iz mreže. neka to bude po pritisku taster prekidača i na kratko. 5 i 7 bili najprilagođeniji korisniku. nema potrebe da LED displej bude svo vreme uključen. 7.

servisni mod Vam može odlično poslužiti za testiranje kraćih potprograma ili rutina pre njihove implementacije u glavni program. 198 . ili u toku samog ispitivanja programa. Ove stvari realizovane su upravo upotrebom tzv. Ukoliko Vam je to bitno. Čak to možete raditi po pojavi interapta ili iz samog programa postavljajući na željenim mestima tačke prekida (eng. Na taj način možete podesiti mikrokontroler direktno na završenom projektu. dovoljno je na njegovoj tastaturi otkucati sigurnosni kod da bi se odblokirao. Ukoliko vaš program koristi multitasking operativni sistem. Ukoliko već imate gotov i proveren program.101. Ne zaboravite jedino da pre povratka na glavni program vratite ranija stanja registra (obično STATUS i W) kao u interaptima. Servisni mod nije (bar kod PIC16F84) poput SLEEP moda integrisan u sam mikrokontroler. in-circuit debugging). Potrebno je da ga sami osmislite. čime izbegavate češće premeštanje i programiranje mikrokontrolera. možda bi Vam bila interesantna mogućnost njegove kasnije nadogradnje. brza kombinacija određenih tastera (kao upis šifre) ili pritiskanjem (za korisnika nedostupnog) prekidača kojim bi se izazvao interapt na RB0/INT pinu. A možete i poslati stanje svih registara u kompjuter preko RS232 veze (eng. servisnog moda. najpraktičnije je predvideti ulaz u program preko njega. upotrebom servisnog moda postaje moguće. Sa strane programiranja. Servisni mod Pogledajte svoj mobilni telefon. Ono što (zbog spoljnih interfejsa) nije moguće testirati u simulatoru. Uz par jeftinih elemenata na štampanoj pločici i odgovarajućeg konektora možete projektovati svoj proizvod tako da mu omogućite lakšu zamenu programa (eng. Naravno. Da li ste znali da kombinacijom određenih tastera možete proveriti tačno stanje brojača minuta i prenešenih GPRS podataka? Prilikom blokade auto radia. Šta raditi u servisnom modu? To zavisi jedino od Vas. break points) sa pozivom potprograma za servisni mod. ili za „spoljno“ podešavanje stanja određenih registra sa snimanjem u EEPROM. Servisni mod namenjen je pre svega Vama. možete stanje određenih registra ili flagova prikazati na već postojećim LED. eksterni hardver programatora je i dalje neophodan. kako bi vam olakšao testiranje mikrokontrolera u praksi. Zove se servisni jer mu pristup imaju jedino programeri i serviseri (tačnije svi oni koji znaju tajni postupak ulaska). To može biti držanje određenog tastera pritisnutog 10S. U njega se ulazi postupcima koji nisu uobičajeni za običnog korisnika. In Circuit Serial Programming) kasnije.

199 . Nažalost. Radi bolje čitljivosti programa pre objavljivanja podesite labele i operande razmacima umesto tabulatorom i postavite listing između [code] i [/code] tagova. ali Vam uz postojeće . Naravno. To je to.ba. samo ako se lepo zamole. Ukoliko i Vi spadate u takve osobe. nemaju straničenje programske (ne i RAM) memorije.elektronika. a umesto jednog radnog (W) registra uvedeno je čak 16. www. hardverske razlike su svakako prisutne i samim tim registri imaju različite adrese i namene. Ipak. PIC16F84 je već zastareo. zbog minijaturnih kućišta i male cene mogu predstavljati dobar izbor za manje zahtevne aplikacije. Internet je pun entuzijasta voljnih da vam pomognu. Imaju samo dva nivoa steka. Možete ih naći na forumima www. Najbolje je opisati šta želite da vaš program radi. dokle ste do sada stigli i na koji način se mogu reprodukovati greške koje dobijate u radu programa. U PIC24 i dsPIC seriji stek je umesto hardverski. PIC10 i PIC12 serija ima dosta ograničenja u primeni. Zbog namenskog hardvera PIC24 serija prilagođena je upravljanju motorima a dsPIC digitalnom procesiranju signala (eng. Ukoliko ne podelite sa ostalima detaljan opis problema koji Vas muči (sa primerom koda i električnom šemom) svakako da se ne možete nadati pravom. U celoj PIC16 seriji mikrokontrolera imate iste instrukcije objašnjene u ovom uputstvu. Dobro je što vam uz naučeno gradivo prelazak na jače (ili slabije) familije neće teško pasti. X puta mi se dogodilo (x teži beskonačnosti) da jednostavno nemam ni najmanju predstavu o tome šta je neko hteo da me pita. budite strpljivi (niko ne dežura pored kompjutera da bi eto baš vama momentalno odgovorio) i iscrpni u opisu svog problema. PIC18 serije su još naprednije (uz 42 nove instrukcije u odnosu na PIC16 seriju). trenutna situacija u našoj zemlji je takva da malo ko želi da podeli svoje znanje (makar i fragmente znanja) sa drugima. Poželjno je da ukoliko je to potrebno postavite svoj program (ili njegove delove za koje tražite savet) na sajt. ali eto zapeli ste kod neke greške i nikako da je otklonite. imaju 31 nivo steka. implementovan softverski. pitajte. Naravno. DSP . ne možete očekivati da će vam besplatno napraviti program koji vam je potreban. i nude nove hardverske dodatke (npr. ali ukoliko zapnete negde.elitesecurity. malu memoriju i komplikovano straničenje memorije. olakšano čitanje tabela i dodatni set instrukcija.org.kazus. možda mnogo konstruktivnijem odgovoru. Nije na odmet ni postaviti sliku ili opis električne šeme. tu su. tako da možete imati problema prilikom njene nabavke.microchip. www.102.inc fajlove to nije preterano bitno. www. Šta sada? Sada imate odlične polazne osnove za dalji rad sa mikrokontrolerima. PIC17 serija uvodi 16 nivoa steka. Da biste uopšte mogli očekivati odgovor. integrisani USB2 kontroler). Instrukcijski set je dosta izmenjen. Mikrokontroleri se neprestano razvijaju. bolje se nemojte ni javljati po forumima. pa smatrate da će Vam vaš program doneti milione. Ukoliko vam i danje nešto nije jasno.ru i raznim drugim sajtovima.Digital Signal Processing). Ona nije stekla popularnost među programerima.com.

Stepenični automat za svetlo. zvono. Ono što čini mikrokontrolere toliko moćnim nije njihova brzina. digitalni podsetnik. 200 . počnite od svog domaćinstva. tajmer za osvetljenje akvarijuma. Deluje jednostavno? Setite se svog prvog programa. Trenutno su aktuelne serije AVR i Motorola. brzinomer za biciklu. Ukoliko već nemate uslova da mikrokontrolerima poboljšate industrijske mašine. elektronska brava. ali nažalost instrukcije su joj potpuno različite od ranijih serija. automatska hranilica za kućne ljubimce. Izgleda da je Microchip rešio da prilagodi svoje proizvode i za programski jezik C koji u ranijim serijama nije bio efektno zastupljen. tajmer za prehranu pčela zimi. Mogućnost za nadogradnju uvek postoji. a i dostava im može biti problematična za našu zemlju. memorija ni integrisani hardver.Najnovija Microchip familija mikrokontrolera PIC32mx omogućuje rad sa tridesetdvobitnim instrukcijama. integrisani PWM i RS232 i još dva tajmera uz duplo manju cenu. Nažalost motorolini mikrokontroleri (iako odlični i jeftini) imaju prilično skup softver. sve su to mali projekti koji Vam mogu pomoći u svakodnevnom životu. već ideja o njihovoj mogućoj upotrebi u svakodnevnom životu. Uz ovakve osnove možete isprobati i druge familije mikrokontrolera. i poboljšanja koja bi se njihovom upotrebom mogla ostvariti. Ukoliko su Vam bitni A/D konvertori idealno rešenje predstavljaju 18-pinski PIC16F88 i 40-pinski PIC16F877. Umesto PIC16F84 mikrokontrolera možete uz odgovarajuće izmene softvera koristiti PIC16F628 koji ima duplo više memorije.

Možete ih koristiti kako bi se brzo podsetili tačnog naziva instrukcija ili banke registara. 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 . 01101011 AND 10100101 = 00100001 Rezultat AND operacije biće logička 1 samo ukoliko su oba operanda na logičkoj 1. rezultat će biti logička 0. COM 01101011 = 10010100 Komplement ili invertovanje predstavlja logičku operaciju u kojoj svaki bit u bajtu menja svoju vrednost. Ukoliko bar jedan nije. kako bi Vam uvek bili na dohvatu ruke. Prilozi Priloge na narednim stranama poželjno je štampati posebno.103. 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 logička 1 samo ukoliko su mu oba operanda različita. Ukoliko su oba na logičkoj 0. i rezultat će biti jednak logičkoj 0. 01101011 IOR 10100101 = 11101111 Rezultat IOR operacije biće logička 1 ukoliko je bar na jednom operandu prisutna logička 1. rezultat će biti logička 0. Ukoliko su ista (obe 0 ili obe 1).

56 0x38 b'0011 1000' .29 +.40 +.27 0x1B b'0001 1011' .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 +.30 +.45 0x2D b'0010 1101' .31 Ozn +.2 .42 0x2A b'0010 1010' .29 0x1D b'0001 1101' .19 0x13 b'0001 0011' .5 +.9 +.17 +.49 +.54 +.23 0x17 b'0001 0111' .25 0x19 b'0001 1001' .33 0x21 b'0010 0001' .41 +.14 +.13 0x0D b'0000 1101' .44 0x2C b'0010 1100' .53 0x35 b'0011 0101' .55 +.24 0x18 b'0001 1000' .39 0x27 b'0010 0111' .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' .22 0x16 b'0001 0110' .50 0x32 b'0011 0010' .1 .43 +.60 0x3C b'0011 1100' .16 +.12 0x0C b'0000 1100' .7 .12 +.37 +.15 Ozn +.27 +.24 +.51 +.46 +.4 .41 0x29 b'0010 1001' .39 +.59 +.62 0x3E b'0011 1110' .3 .55 0x37 b'0011 0111' .8 +.20 0x14 b'0001 0100' .18 +.51 0x33 b'0011 0011' .40 0x28 b'0010 1000' .53 +.52 +.0 .59 0x3B b'0011 1011' .33 +.46 0x2E b'0010 1110' .48 0x30 b'0011 0000' .26 +.35 0x23 b'0010 0011' .18 0x12 b'0001 0010' .5 .43 0x2B b'0010 1011' .21 0x15 b'0001 0101' .36 +.11 0x0B b'0000 1011' .34 0x22 b'0010 0010' .11 +.38 +.10 +.52 0x34 b'0011 0100' .6 .38 0x26 b'0010 0110' .19 +.28 0x1C b'0001 1100' .16 0x10 b'0001 0000' .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 +.10 0x0A b'0000 1010' .25 +.6 +.61 +.63 0x3F b'0011 1111' 202 .Dec Hex .26 0x1A b'0001 1010' .20 +.30 0x1E b'0001 1110' .3 +.56 +.32 0x20 b'0010 0000' .44 +.8 .34 +.14 0x0E b'0000 1110' .2 +.58 +.15 0x0F b'0000 1111' Dec Hex Bin .60 +.47 0x2F b'0010 1111' .45 +.61 0x3D b'0011 1101' .36 0x24 b'0010 0100' .48 +.23 +.7 +.22 +.13 +.57 +.35 +.17 0x11 b'0001 0001' .49 0x31 b'0011 0001' .62 +.28 +.21 +.54 0x36 b'0011 0110' .57 0x39 b'0011 1001' .37 0x25 b'0010 0101' .31 0x1F b'0001 1111' Dec Hex Bin .4 +.42 +.32 +.58 0x3A b'0011 1010' .1 +.50 +.

89 +.77 0x4D b'0100 1101' .64 0x40 b'0100 0000' .102 .111 .108 .65 0x41 b'0100 0001' .67 0x43 b'0100 0011' .116 0x74 b'0111 0100' +.83 +.108 0x6C b'0110 1100' .87 0x57 b'0101 0111' .69 0x45 b'0100 0101' .124 +.126 +.76 0x4C b'0100 1100' .96 0x60 b'0110 0000' .79 Ozn +.85 0x55 b'0101 0101' .96 +.79 0x4F b'0100 1111' Dec Hex Bin .111 0x6F b'0110 1111' .85 +.109 0x6D b'0110 1101' .80 0x50 b'0101 0000' .87 +.70 0x46 b'0100 0110' .123 0x7B b'0111 1011' +.105 0x69 b'0110 1001' .125 +.107 .100 0x64 b'0110 0100' .117 +.73 +.71 0x47 b'0100 0111' .106 0x6A b'0110 1010' .78 0x4E b'0100 1110' .90 0x5A b'0101 1010' .82 +.98 0x62 b'0110 0010' .71 +.116 +.121 0x79 b'0111 1001' +.66 +.91 0x5B b'0101 1011' .95 0x5F b'0101 1111' Dec Hex Bin .114 +.107 0x6B b'0110 1011' .73 0x49 b'0100 1001' .81 0x51 b'0101 0001' .92 +.92 0x5C b'0101 1100' .95 Ozn +.104 0x68 b'0110 1000' .93 +.126 0x7E b'0111 1110' +.97 +.122 +.66 0x42 b'0100 0010' .90 +.103 0x67 b'0110 0111' .74 0x4A b'0100 1010' .118 +.93 0x5D b'0101 1101' .78 +.86 +.97 0x61 b'0110 0001' .115 +.94 +.101 0x65 b'0110 0101' .72 +.106 .119 0x77 b'0111 0111' +.80 +.114 0x72 b'0111 0010' .91 +.99 0x63 b'0110 0011' .113 +.74 +.69 +.77 +.101 .65 +.117 0x75 b'0111 0101' +.68 +.64 +.98 +.123 +.70 +.109 .120 +.75 +.127 0x7F b'0111 1111' 203 .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 +.84 0x54 b'0101 0100' .112 0x70 b'0111 0000' .125 0x7D b'0111 1101' +.127 .120 0x78 b'0111 1000' +.121 +.118 0x76 b'0111 0110' +.68 0x44 b'0100 0100' .76 +.94 0x5E b'0101 1110' .119 +.112 +.102 0x66 b'0110 0110' .104 .110 .88 0x58 b'0101 1000' .105 .82 0x52 b'0101 0010' .81 +.72 0x48 b'0100 1000' .113 0x71 b'0111 0001' .75 0x4B b'0100 1011' .115 0x73 b'0111 0011' +.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 +.88 +.67 +.103 .84 +.83 0x53 b'0101 0011' .110 0x6E b'0110 1110' .122 0x7A b'0111 1010' +.89 0x59 b'0101 1001' .124 0x7C b'0111 1100' +.86 0x56 b'0101 0110' .100 .

152 0x98 b'1001 1000' .5 -.24 -.153 0x99 b'1001 1001' .178 0xB2 b'1011 0010' .167 0xA7 b'1010 0111' .159 0x9F b'1001 1111' Dec Hex Bin .174 0xAE b'1010 1110' .155 0x9B b'1001 1011' .176 0xB0 b'1011 0000' .31 -.13 -.47 -.140 0x8C b'1000 1100' .157 0x9D b'1001 1101' .172 0xAC b'1010 1100' .23 -.180 0xB4 b'1011 0100' .138 0x8A b'1000 1010' .49 -.150 0x96 b'1001 0110' .16 Ozn -.158 0x9E b'1001 1110' .37 -.165 0xA5 b'1010 0101' .52 -.162 0xA2 b'1010 0010' .149 0x95 b'1001 0101' .43 -.63 -.44 -.45 -.40 -.145 0x91 b'1001 0001' .181 0xB5 b'1011 0101' .173 0xAD b'1010 1101' .35 -.57 -.29 -.141 0x8D b'1000 1101' .25 -.187 0xBB b'1011 1011' .21 -.18 -.188 0xBC b'1011 1100' .139 0x8B b'1000 1011' .8 -.59 -.135 0x87 b'1000 0111' .142 0x8E b'1000 1110' .132 0x84 b'1000 0100' .163 0xA3 b'1010 0011' .1 -.33 -.38 -.6 -.146 0x92 b'1001 0010' .22 -.12 -.3 -.19 -.147 0x93 b'1001 0011' .17 -.129 0x81 b'1000 0001' .191 0xBF b'1011 1111' 204 .62 -.144 0x90 b'1001 0000' .60 -.190 0xBE b'1011 1110' .2 -.36 -.168 0xA8 b'1010 1000' .136 0x88 b'1000 1000' .186 0xBA b'1011 1010' .50 -.179 0xB3 b'1011 0011' .39 -.7 -.164 0xA4 b'1010 0100' .56 -.28 -.183 0xB7 b'1011 0111' .14 -.10 -.185 0xB9 b'1011 1001' .161 0xA1 b'1010 0001' .169 0xA9 b'1010 1001' .171 0xAB b'1010 1011' .189 0xBD b'1011 1101' .4 -.160 0xA0 b'1010 0000' .32 Ozn -.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 -.34 -.156 0x9C b'1001 1100' .41 -.134 0x86 b'1000 0110' .58 -.55 -.30 -.64 .130 0x82 b'1000 0010' .143 0x8F b'1000 1111' Dec Hex Bin .42 -.27 -.131 0x83 b'1000 0011' .128 0x80 b'1000 0000' .26 -.170 0xAA b'1010 1010' .53 -.148 0x94 b'1001 0100' .20 -.133 0x85 b'1000 0101' .154 0x9A b'1001 1010' .46 -.137 0x89 b'1000 1001' .54 -.184 0xB8 b'1011 1000' .182 0xB6 b'1011 0110' .11 -.9 -.177 0xB1 b'1011 0001' .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 -.15 -.166 0xA6 b'1010 0110' .61 -.151 0x97 b'1001 0111' .51 -.175 0x2F b'1010 1111' .

92 -.213 0xD5 b'1101 0101' .86 -.68 -.96 Ozn -.127 -.204 0xCC b'1100 1100' .117 -.228 0xE4 b'1110 0100' .202 0xCA b'1100 1010' .198 0xC6 b'1100 0110' .107 .244 0xF4 b'1111 0100' -.216 0xD8 b'1101 1000' .102 .229 0xE5 b'1110 0101' .254 0xFE b'1111 1110' -.80 Ozn -.83 -.226 0xE2 b'1110 0010' .95 -.115 -.93 -.246 0xF6 b'1111 0110' -.255 0xFF b'1111 1111' 205 .224 0xE0 b'1110 0000' .208 0xD0 b'1101 0000' .247 0xF7 b'1111 0111' -.76 -.222 0xDE b'1101 1110' .72 -.243 0xF3 b'1111 0011' -.119 -.196 0xC4 b'1100 0100' .120 -.103 .74 -.235 0xEB b'1110 1011' .219 0xDB b'1101 1011' .231 0xE7 b'1110 0111' .65 -.123 -.206 0xCE b'1100 1110' .77 -.217 0xD9 b'1101 1001' .248 0xF8 b'1111 1000' -.214 0xD6 b'1101 0110' .218 0xDA b'1101 1010' .110 .203 0xCB b'1100 1011' .118 -.221 0xDD b'1101 1101' .225 0xE1 b'1110 0001' .87 -.201 0xC9 b'1100 1001' .98 -.236 0xEC b'1110 1100' .90 -.70 -.193 0xC1 b'1100 0001' .252 0xFC b'1111 1100' -.66 -.89 -.67 -.111 .124 -.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 -.238 0xEE b'1110 1110' .105 .71 -.104 .81 -.75 -.239 0xEF b'1110 1111' .230 0xE6 b'1110 0110' .121 -.207 0xCF b'1100 1111' Dec Hex Bin .241 0xF1 b'1111 0001' .101 .194 0xC2 b'1100 0010' .108 .112 .253 0xFD b'1111 1111' -.126 -.210 0xD2 b'1101 0010' .195 0xC3 b'1100 0011' .82 -.199 0xC7 b'1100 0111' .205 0xCD b'1100 1101' .240 0xF0 b'1111 0000' .234 0xEA b'1110 1010' .220 0xDC b'1101 1100' .113 -.211 0xD3 b'1101 0011' .85 -.232 0xE8 b'1110 1000' .249 0xF9 b'1111 1001' -.78 -.100 .242 0xF2 b'1111 0010' -.116 -.114 -.106 .84 -.245 0xF5 b'1111 0101' -.200 0xC8 b'1100 1010' .237 0xED b'1110 1101' .97 -.128 .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 -.223 0xDF b'1101 1111' Dec Hex Bin .73 -.250 0xFA b'1111 1010' -.215 0xD7 b'1101 0111' .192 0xC0 b'1100 0000' .91 -.227 0xE3 b'1110 0011' .251 0xFB b'1111 1011' -.88 -.233 0xE9 b'1110 1001' .122 -.125 -.197 0xC5 b'1100 0101' .212 0xD4 b'1101 0100' .79 -.209 0xD1 b'1101 0001' .109 .69 -.94 -.

12 001000 dfffffff Z 000000 1fffffff 1100xx kkkkkkkk 000001 1fffffff Z 000001 0xxxxxxx Z 001110 dfffffff Upiši konstantu u W Upiši 0 u f Upiši 0 u W Prepiši unakrsno niblove iz f u d Saberi W i f Saberi W sa konstantom Oduzmi W od f Oduzmi W od konstante Uvećaj f Smanji f Logičko ILI W sa f Logičko ILI W sa konstantom Logičko I W sa f Logičko I W sa konstantom Logičko ISKLJUČUVO 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.d BCF f. preskoči ako je = 0 Inicijalizuj watchdog tajmer Prelazak u sleep mod 206 .d IORWF f.d ADDLW k SUBWF f.d GOTO k CALL k RETURN RETLW k RETFIE Ostalo NOP CLRWDT SLEEP Bez operacije Prepiši f u d Prepiši W u f Opis Cik.d MOVWF f MOVLW k CLRF f CLRW SWAPF f.b BTFSS f. preskoči ako je = 0 Idi na adresu Pozovi potprogram Vrati se iz potprograma Vrati se sa konstantom u W Vrati se iz interapta 2 12 Aritmetičko logičke 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 Logičko ISKLJUČUVO ILI W sa kon.b INCFSZ f.b BSF f. preskoči ako je bit = 1 Uvećaj f.Instrukcija Prepis podataka MOVF f.d SUBLW k INCF f.b RLF f.d DECF f.d IORLW k ANDWF f. 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.d ADDWF f. preskoči ako je bit = 0 Test bita b u f.d XORLW k COMF f. 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 BTFSC f.d RRF f.d Smanji f.d ANDLW k XORWF f.

2 – Ukoliko se ova instrukcija izvršava nad TMR0 registrom (i ukoliko je odredište d = 1 ako se koristi). movf PORTB. 3 – Ukoliko je test ispravan.f). 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 očitan pa modifikovan od strane jedne instrukcije (npr.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 ignoriše. stanje preskalera će biti obrisano ukoliko je pridruženo tajmeru. 207 . vrednost koja je uzeta za početnu biće vrednost koja je očitana sa samih pinova. Asembler ga automatski resetuje) odredište: d=0 rezultat u W.com. Ovo može izazvati probleme zbog RMW ciklusa. Za detaljnija objašnjenja pogledajte DS33023A sa www. instrukcija će se izvršiti za 2 instrukcijska ciklusa.microchip.

---1111 1111 0000 0000 0001 1xxx xxxx xxxx ---1 1111 1111 1111 0000 0000 ---0 x000 ---.255 Nižih 8 bitova programskog brojača 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 ---.------0 0000 INTF RBIF 0000 000x INTF RBIF 0000 000x 166 .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 Sadržaj željenog RAM registra u indirektnom adresiranju Tajmer 0.0 do . Povećava se od .---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 Sadržaj ž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 Viših 5 bitova programskog brojača PCLATH + PCL = PC INTCON Interapt kontroler INDF PCL FSR TRISA TRISB / EECON1 EEPROM kontroler EECON2 Otključavanje upisa u EEPROM PCLATH Viših 5 bitova programskog brojača PCLATH + PCL = PC INTCON Interapt kontroler GIE EEIE T0IE PC INTE PC RBIE PC T0IF PC PC Sadržaj željenog RAM registra u indirektnom adresiranju RBPU INTEDG T0CS T0SE PC PC PC RP0 EEIF RD PC TO PS1 PC DC PS0 PC C Nižih 8 bitova programskog brojača 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 ---.

pinova.rs/ objavljeni u časopisu PC Press http://www. kako bi kardiovaskularni hirurg mogao objasniti svoju profesiju laiku bez upotrebe latinskih izraza? Primetili ste grešku? Nepostojeći link? Prvo proverite da li je to ispravljeno u najnovijem uputstvu (na sajtu kao i u uputstvu uvek objavljujem i datum izlaska nove verzije).uk za multipleks Neka objašnjenja sa http://www.btinternet.ba/ Časopis Elektor 7-8 2001 http://www. gomilu elektronskih komponenti ili najnoviji Macintosh laptop. tel. Kako je ovo prvenstveno početničko uputstvo. E-mail adresa neće Vam biti objavljena.uk/index. Ako spržite PIC.mstracey.co. molim Vas da me o tome obavestite.htm Datasheetovi sa http://www. tajminga i sličnih stvari. sajt.html Slike D/A konverzije sa http://www. naučite engleski i čitajte Microchipova tehnička uputstva (Datasheet). Za profesionalan rad sa PIC mikrokontrolerima.geocities.2008. baner.Molio bih prodavce PIC mikrokontrolera da mi se jave radi objavljivanja njihovih kontakt podataka (adresa.html 2 LED na 1 pinu sa download sekcije sajta http://www.net/avr_en/AVR_DAC.rs/korisnici/t/r/trifunov/ 209 . mob. Možete se prijaviti i preko knjige utisaka na sajtu. Želite li da Vas obaveštavam o objavljivanju nove verzije uputstva na sajtu? Može. Bez brige.microchip.. U uputstvu ima izvesnih nedorečenosti u pogledu funkcija pojedinih registara. U izradi ovog uputstva korišćena je sledeća literatura: – – – – – – – – – Najveći deo sa http://www. Međutim. Pošaljite mi svoj e-mail sa naznakom da želite da budete obaveštavani. i ukoliko nije kontaktirajte me preko knjige utisaka ili mailom objavljenim na sajtu. mail.com Uputstvo postavljeno 21.co.htm Primer izdržljivosti PIC-a sa mailing liste mikroelektronika@yahoogroups. kupite novi.) u ovom uputstvu po njegovom završetku.nomad.co.ee/PIC/picprog.avr-asm-tutorial.rs/ novembra 1997 za I/O hardver Serijska i rutina za kašnjenje sa http://www.elektor-electronics.ptt. Šta mislite. Delimično kopiranje uputstva je dozvoljeno uz navođenje linka do mog sajta.elektronika..com/ Tekstovi Voje Antonića http://www. na sajtu http://www. e-mail će biti prikazan u obliku slike. na flopiju od kolege sa posla – pirata.pcpress. Autor ne snosi ni najmanju odgovornost za korišćenje informacija sa ovog uputstva. datih linkova ili programa.com/sinelyu/pic/pic_kontroleri.8. ali nije preporučljivo zbog novih verzija uputstva i eventualnih grešaka.paralaxa.co. ne smatram da je bitno opterećivati čitaoca znanjem koje mu verovatno nikada neće ni koristiti. Ne krivite me zbog upotrebe stranih reči. Ukoliko ste ovo uputstvo kupili bilo gde i u bilo kom obliku (na CD-u na buvljaku. od lokalnog TV servisera u štampanom izdanju). prodaja ovog uputstva je zabranjena. Zbog zaštite od spama. ali o svom trošku. Uputstvo se može slobodno kopirati i distribuirati pod uslovom da se u njega ne unose izmene. Takođe ga pošaljite i za eventualnu kasniju odjavu.

Sign up to vote on this title
UsefulNot useful