Professional Documents
Culture Documents
PIC16F84 Uputstvo PDF
PIC16F84 Uputstvo PDF
UPUTSTVO ZA RUKOVANJE
1. Predgovor
Zato ba PIC16F84? Taj mikrokontroler je zastareo, veliki, spor, skup... Meutim da li je ba sve tako. Star? Pa ta. Nijedan moj kompjuter nije (u trenutku kupovine) bio mlai od 4 godina. Prvi put sam na internet izaao mainom sa 100MHz i 16Mb. Ukoliko i dalje moe posluiti, godine mu nisu bitne. ak zato ima i jednu prednost: ima ga na svakom oku! Njegova veliina za poetnike moe predstavljati samo pogodnost. Poetniku je daleko lake lemljenje osamnaestopinskog DIP nego ezdesetetvoropinskog TQFP kuita, naravno na jednoslojnoj tampanoj ploici. Brzina mikrokontrolera pri uenju ne igra nikakvu ulogu. tavie, na vie mesta u programima datim u uputstvu namerno se moralo izazivati kanjenje. Cena mikrokontrolera! Jeste skup. Danas se mogu kupiti mnogo moniji mikrokontroleri po manjoj ceni. Ali ukoliko se uzme u obzir i cena odgovarajueg programatora (pogotovu mogunost samogradnje), PIC16F84 je i dalje najjeftiniji mikrokontroler. Poetniku u svetu mikrokontrolera najtee je napraviti onaj prvi korak. Nadam se da e mu ovo uputstvo e pomoi u tom putu. A posle? Lako e se sa steenim znanjem nauiti i mnogo komplikovaniji i savremeniji mikrokontroleri. Iako se hardverske mogunosti mikrokontrolera neprekidno usavravaju, softver uglavnom ostaje isti. Za lake razumevanje ovog uputstva poeljan je pristup internetu i potrebna su odreena predznanja:
Osnovno poznavanje elektronskih kola (anoda i katoda LED, povezivanje LED displeja, funkcija taster prekidaa, obeleavanje izvoda integrisanih kola, pojam pina, funkcija diode u logikim kolima, naponski nivoi logike 0 i 1, visokoimpedansno stanje, mitov okida) Osnovno poznavanje binarnih sistema (bit, bajt, binarno, decimalno, heksadecimalno, BCD i oznaavanje negativnih brojeva) Osnovne logike operacije (Bulova algebra) Pojam multipleksa Princip serijskog prenosa podataka
Nemojte dozvoliti da Vas ovaj spisak obeshrabri. Veliki deo ovoga je objanjen u uputstvu. Gradivo u uputstvu izloeno je od poznatih ka nepoznatim i od lakih ka teim lekcijama. Za dosta specifinosti dati su primeri programa u kojima se upotrebljavaju. Trudio sam se da gradivo to interesantnije izloim. Nadam se da sam uspeo. 2
Ukoliko stavite ; (taku-zarez) bilo gde u Vaem programu, kompajler e ignorisati sve karaktere iza njega sve dok ne doe do znaka za novi red. Ovo znai da moete staviti komentar unutar programa kako bi Vas podsetio ta se uopte u njemu radi. Ovo je dobra praksa, ak i za najjednostavnije programe. Moda sada u potpunosti razumete ta program radi, ali za par meseci, samo ete se ekati po glavi. Zbog toga, komentariite to vie. Nema ogranienja. Moete pridruiti imena konstantama i registrima (vie o ovome kasnije). Dosta je lake itati na srpskom u ta upisujete, ili ta oznaava broj, nego da pokuavate da se setite ta znae svi ti brojevi. Zbog toga, koristite opisna imena kao npr. ZBIR. Primetili ste da sam napisao ime velikim slovima. Ono se tako istie. Napravite zaglavlje programa koristei taku-zarez. Primer je dat ispod. ;********************************************************* ; Autor : Pera dera Datum : 12.4.2008. ; Verzija : 0.5 Naslov : Test ; ; Opis hardvera : ; - RC oscilator 200KHz. ; - Svi tasteri su povezani od pinova ka masi. ; T1 na RB0, T2 na RB1. Ukljueni su interni Pull-up otpornici. ; - Sve LED od +5V ka pinovima. LED1 na RA0, LED2 na RA2. ; ; Opis softvera : ; - Stanje LED1 menja se prilikom svakog interapta sa T1 ; - Stanje LED2 menja se tajmerom na svakih 0,5S jedino ; ukoliko je istovremeno pritisnut T2 ; ; Dodatni fajlovi : p16F84.inc ;********************************************************* Uoili ste da je napravljena neka vrsta kocke. Ovako izgleda preglednije.
Izdvojite instrukcije od poetka reda i labela sa par razmaka ili Tab dugmetom. Na taj nain asembler prepoznaje da li je re o instrukciji ili labeli, a program izgleda preglednije. Najzad, isprobajte i dokumentujte Va program i na papiru. Moete koristiti grafike, algoritme ili ta god elite. To e vam pomoi u pisanju programa, korak po korak, kao i u njegovoj kasnijoj analizi.
3. Registri
Registar je RAM memorijska lokacija unutar mikrokontrolera u koju se moe upisivati, sa koje se moe itati, ili obavljati obe ove funkcije. Najlake je da svaki od njih zamislite kao kutiju u koju moe stati do 255 klikera (razliitih stanja). Sledea skica prikazuje raspored registara unutar PIC16F84 mikrokontrolera. Slika prikazuje adrese na kojima je smetema RAM memorija (u obliku osmobitnih registara) unutar mikrokontrolera, to e Vam pomoi pri razumevanju njihovog adresiranja. Adresa 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C . . . . . 0x4F 0x50 . . . 0x7F / / 68 Registra opte namene (statika RAM memorija) Mapirani u BANK0 BANK0 INDF(1) TMR0 PCL STATUS FSR PORTA PORTB / EEDATA EEADR PCLATH INTCON BANK1 INDF(1) OPTION_REG PCL STATUS FSR TRISA TRISB / EECON1 EECON2
(1)
Adresa 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B 0x8C . . . . . 0xCF 0xD0 . . . 0xFF
PCLATH INTCON
(1)
Primeujete da su registri podeljeni u dve grupe, oznaene sa BANK0 i BANK1. BANK1 se uglavnom koristi za konfigurisanje trenutnog hardverskog stanja mikrokontrolera. Uglavnom mu je (za jednostavnije programe) dovoljno pristupiti samo prilikom poetne inicijalizacije mikrokontrolera. Kako se najbitniji registri (PORTA i PORTB) nalaze u BANK0, program e uglavnom biti u njoj. Sledeu specifinost predstavljaju prvih 12 registara u bankama (0x00 0x0B). Njima se direktno upravlja radom mikrokontrolera to ih ini povlaenim (eng. Special Function Registers - registri specijalne namene), dok je obina RAM memorija (eng. General Purpose Registers - registri opte namene) dostupna u registrima od 0x0C do 0x4F, a istovremeno joj se moe pristupiti i preko 0x8C do 0xCF adresa. Sigurno ste ve videli rampe za prolaznike po supermarketima ili autobuskim stanicama. One proputaju prolaznike samo u jednom smeru. Unutar mikrokontrolera TRIS (TRISA i TRISB) registri izvravaju ovu funkciju. Oni se nalaze na adresama 0x85 i 0x86, respektivno. Da biste programirali eljeni pin tako da bude ulazni ili izlazni (proputa prolaznike unutra ili napolje), poaljete 1 ili 0 na njegov bit u odgovarajuem TRIS registru. Pri tome moete koristiti bilo koji (binarni, decimalni ili heksadecimalni) format brojeva, meutim binarnim se slikovitije predstavlja stanje eljenog pina. Ukoliko niste vini pretvaranju binarnih u decimalne ili heksadecimalne brojeve i obratno, koristite bilo koji napredniji kalkulator. Svi RA (RA0 do RA4) i RB (RB0 do RB7) pinovi mikrokontrolera imaju dvojaku fuknciju. Oni mogu biti ulazni ili izlazni. Da li e biti ulazni ili izlazni podeava se u odgovarajuem TRIS registru. Na primer ukoliko se u TRISB nalazi sledea binarna vrednost: b'00101111' pinovi e biti konfigurisani kao na slici. Primeujete da bit 7 (eng. MSB Most Single Bit - bit najvee teine ) odgovara pinu RB7 i da se on prilikom binarnog oznaavanja nalazi sa leve strane. Nasuprot njemu bit 0, bit najmanje teine (eng LSB Low Single Bit) odgovara pinu RB0. Potpuno ista situacija je i sa TRISA registrom, sa tom razlikom to su njemu gornji bitovi neiskorieni (jer nemaju pripadajuih pinova). Na gornjoj slici pinovi su konfigurisani po sledeem: pin RB7 RB6 6 0 I RB5 5 1 U RB4 4 0 I RB3 3 1 U RB2 2 1 U RB1 1 1 U RB0 0(LSB) 1 U
Kako se TRISB nalazi u banci 1 (BANK1) potrebno je prebaciti se tamo. Da bi se prebacili iz banke u banku koristi se bit 5 STATUS registra. Za prebacivanje iz banke 0 u banku 1 potrebno ga je setovati, a za vraanje u banku 0, resetovati. STATUS registar se nalazi na adresi 0x03 (0x03 ili h'03' oznaava brojeve u heksadecimalnom formatu. Binarni format se pie kao b'00000011', a decimalni kao .03 ili d'03'). 5
emu konfigurisanje pinova? Ukoliko je odgovarajui pin konfigurisan (preko svog TRIS registra) kao izlazni, na njega se iz mikrokontrolera mogu poslati naponski nivoi od 0V i +5V, odnosno na njemu e se u svakom trenutku nalaziti jedan od ovih napona. Pri tome se naponski nivo od 0V predstavlja kao logika 0, a napon od +5V kao logika 1. Ukoliko je pak pin konfigurisan kao ulazni, mikrokontroler e u svakom trenutku moi da oita gore pomenute vrednosti napona na pinu, i u zavisnosti od logikog nivoa na pinu preduzme odgovarajuu akciju. Pinove koji se ne upotrebljavaju u elektrinoj emi potrebno je konfigurisati kao izlazne. U protivnom varijacije napona na njima prouzrokuju poveanu potronju i grejanje mikrokontrolera, a eventualno i njegovu neispravnost. Da biste postavili jedan od izlaznih pinova na visoki logiki nivo, jednostavno treba poslati 1 na njemu odgovarajui bit u PORTA ili PORTB registru. Format zapisa je isti kao i za TRIS registre. Slino tome, da biste proitali da li se neki pin (ranije konfigurisan kao ulazni) nalazi na logikoj 0 ili 1, treba da proverite da li je odgovarajui bit u PORTA ili PORTB registru u setovanom ili resetovanom stanju. Pre nego to prouite primer asemblerskog kda, treba objasniti funkciju jo jednog registra: W. W (eng. Working - radni) registar je registar opte namene u koji moete smestiti bilo koju brojanu vrednost (u opsegu od .0 do .255) sa kojom elite raditi. Nakon to ste pridruili odreenu vrednost registru W, moete mu pridruiti neku drugu vrednost (oprez time biste automatski obrisali prethodnu) ili zapamenu vrednost iz njega premestiti na neku drugu memorijsku lokaciju (registar). Za razliku od ostalih registara on nema svoju adresu, ve je integrisan u sklopu samog mikrokontrolera. U opisima instrukcija se mogu sresti oznake f, k, b i d. Pri tome je sa f (eng. file) oznaena adresa jednog od registra iz tabele sa poetka ovog poglavlja, k oznaava konstantnu vrednost, b je redni broj bita u registru a d oznaava odredite (eng. destination) rezultata operacije. Ilustrovaemo sve do sada naueno. Nemojte jo uvek isprobavati ni kompajlirati kd - to ete uraditi kada doete do prvog celovitog programa. Za sada pokuajte da prepoznate nain na koji se konfiguriu portovi, i pripremite se da nauite par asemblerskih instrukcija. Za pisanje kda moete koristriti bilo koji tekst editor koji snima ist .txt fajl bez ikakvih formatiranja. Na primer odlian Notepad++ (ugradio sam mu prepoznavanje i naglaavanje asemblerskih instrukcija), Code Edit Pro (sam naglaava instrukcije), Windowsov Notepad ili Linuxov Leafpad. U jednom od narednih poglavlja, upoznaete se sa MPLAB razvojnim okruenjem, i njegovim editorom. Najpre je potrebno prebaciti program iz banke 0 u banku 1. Ovo se radi setujui bit 5 STATUS registra, ija je adresa 0x03. bsf 0x03,5 BSF f,b znai setuj bit b u registru f (eng. Bit Set f). Ovde je f=0x03 to je adresa STATUS registra (pogledajte raniju tabelu) i b=5 to oznaava redni broj bita u STATUS registru. Dakle ovim je reeno setuj bit 5 na adresi 0x03. 6
Sada se, dakle, program nalazi u banci 1. movlw b'00101111' Ovom instrukcijom smeta se binarni broj b'00101111' u W registar. Ovo isto mogli ste da uradite sa heksadecimalnim brojem i tada bi instrukcija izgledala ovako: movlw 0x2F Obe instrukcije rade potpuno istu stvar. MOVLW k znai ubaci vrednost koja sledi direktno u registar W (eng. Move Literal to W). Sada treba premestiti ovu vrednost u TRISB registar, da bi se konfigurisali pinovi PORTB registra. movwf 0x86 Instrukcija MOVWF f znai: premesti vrednost registra W u f registar (eng. Move W to f). U ovom sluaju adresa f je adresa registra TRISB (vidite u tabeli). Bitno je primetiti da ovo nije premetanje u svom bukvalnom znaenju, jer je W registar nakon instrukcije ostao nepromenjen. Pre bi joj odgovarao prevod kopiraj (eng. copy). TRISB registar sada sadri eljenu vrednost, ime su konfigurisani ulazno/izlazni (skraeno U/I) pinovi. Sada je potrebno prebaciti program u banku 0, kako bi se dalje moglo manipulisati signalima na U/I pinovima. bcf 0x03,5 Ova instrukcija je suprotna od BSF. BCF f,b znai resetuj bit b u registru f (eng. Bit Clear f). Brojevi koji slede su adresa registra (f), u ovom sluaju STATUS registra i broj bita (b), u ovom sluaju bit 5. Dakle ovim je u stvari resetovan bit 5 STATUS registra. Posledica poslednje instrukcije je da se program ponovo nalazi u BANK0. Primeujete da je adresa STATUS registra ista, iako bi u BANK1 trebala biti 0x83. Nemoj da vas to buni. Svim registrima u BANK1 moe se pristupati preko adresa registra u BANK0, jedino je bitno pravilno podesiti u kojoj se banci nalazi program. Ipak, ne preterujte sa ovim. Razumljivije je itati program sa normalnim adresama. Za registre koji su zajedniki za obe banke, ovo je potpuno svejedno. Ceo prethodni kd zapisan u jednom bloku izgleda ovako: bsf movlw movwf bcf 0x03,5 b'00101111' 0x86 0x03,5 ; Idi u BANK1 ; Stavi b'00101111' u W ; Prebaci b'00101111' u TRISB ; Vrati se u BANK0
Nakon to snimite fajl, promenite mu txt ekstenziju u asm. Za ovo e vam u Windowsu trebati Total Commander, a u Linuxu npr. Gnome Commander. Prouite prethodni primer nekoliko puta, sve dok ne budete u stanju da ga u potpunosti razumete. Za sada ste nauili 4 instrukcije. Jo samo 31! 7
4. Izlazi
U prethodnom poglavlju ste nauili kako da konfiguriete U/I pinove porta tako da budu ulazni ili izlazni. U ovom poglavlju ete nauiti kako da poaljete odgovarajui logiki nivo na portove. U primeru koji sledi cilj e Vam biti da omoguite treptanje jedne LED (eng. Light Emitting Diode), i u njemu ete videti jedan potpuni program. Nemojte jo uvek isprobavati, kompajlirati ni programirati Va PIC listinzima koji slede, jer su oni dati samo kao ilustracija. Najpre treba podesiti drugi bit PORTA registra tako da bude izlazni: bsf movlw movwf bcf 0x03,5 ; Idi u banku 1 b'00000000' ; Stavi 00000 u W 0x85 ; Prebaci 00000 u TRISA svi pinovi su izlazni 0x03,5 ; Vrati se u BANK0
Ovo bi trebalo da Vam bude poznato iz prethodnog primera. Jedina razlika je u tome to ste sada podesili sve pinove PORTA registra kao izlazne, aljui 0x00 u TRISA registar. Zatim treba ukljuiti LED. Zato treba na jedan od pinova (onaj na kome je povezana LED) poslati logiku 1. Evo kako se to radi. (Obratite panju na komentare kda): movlw movwf b'00000100' ; Upii .4 u W registar.
0x05 ; Prebaci sadraj iz W (.4) u PORTA, ija adresa je ; 0x05. To postavlja logiku 1 samo na pinu RA2.
; Poto je LED ukljuena, treba je iskljuiti. movlw movwf b'00000000' ; Upii .0 u W registar.
Ovim ste postigli da jednom ukljuite, i zatim iskljuite LED. Ono to elite da postignete jeste da LED neprekidno treperi. To se moe implementirati vraajui izvrenje programa na poetak. Postavite labelu (oznaku) na poetak programa, i zatim recite programu da nastavi svoje izvravanje sa tako oznaene pozicije. Labela se postavlja veoma jednostavno: upiite ime, recimo Poc, i zatim prepiite sledei kd: Poc movlw movwf b'00000100' ; Upii .4 u W registar.
0x05 ; Prebaci sadraj iz W (.4) u PORTA, ija adresa je ; 0x05. To postavlja logiku 1 samo na pinu RA2.
; Poto je LED ukljuena, treba je iskljuiti. movlw movwf goto b'00000000' ; Upii .0 u W registar.
0x05 ; Prebaci sadraj iz W (.0) u PORTA, ija adresa je 0x05 ; To postavlja logiku 0 na sve pinove (RA0 do RA4) Poc ; Nastavi dalje izvravanje programa od labele Poc
Kao to primeujete, najpre je ispred instrukcije na poetku reda stavljena labela Poc. Na samom kraju programa je goto Poc instrukcijom nastavljeno dalje izvravanje programa od labele. Instrukcija GOTO k znai idi na (eng. Go-idi, Tona) adresu (k) ili labelu. Program e sada neprekidno ukljuivati i iskljuivati LED od trenutka dovoenja napona napajanja, a prestae po njegovom nestanku. Pogledajte jo jednom isti program: bsf movlw movwf bcf movlw movwf movlw movwf goto 0x03,5 b'00000000' 0x85 0x03,5 b'00000100' 0x05 b'00000000' 0x05 Poc
Poc
Komentari su namerno izostavljeni i sve to moete videti jesu nizovi instrukcija i brojeva. Ovo moe da bude krajnje zbunjujue ukoliko kasnije pokuavate da ispravite eventualno otkrivenu greku u programu, ali ve i tokom prvobitnog pisanja programa, kada treba zapamtiti sve te pojedinane adrese. ak i kada biste dodali komentare, program bi i dalje delovao nejasno. Zbog toga treba svim brojevima dati imena. Ovo moe da se uradi naredbom equ, koja jednostavno znai jednako neemu drugom (eng. Equal jednak). Vano je da primetite da ovo nije instrukcija za PIC ve tzv. direktiva koja ima uticaj na sam asembler (vie o njemu kasnije). Program koji sadri equ direktivu e, dakle, nakon asembliranja u mainski kd PIC-a, biti identian programu bez equ direktive. Ovom direktivom samo zamenjujete eljeni broj imenom. Postupite ovako: izbacite sve komentare ali imenujte registre u Vaem programu, a zatim ocenite itljivost takvog programa. STATUS TRISA equ equ 0x03 ; Ovo pridruuje naziv STATUS broju 0x03, koji ; predstavlja adresu STATUS registra 0x85 ; Ovo pridruuje naziv TRISA broju 0x85, koji ; predstavlja adresu TRISA registra
PORTA RP0
equ equ
0x05 ; Ovo pridruuje naziv PORTA broju 0x05, koji ; predstavlja adresu PORTA registra 0x05 ; Ovo pridruuje re RP0 broju 0x05, koji predstavlja ; redni broj bita unutar STATUS registra.
Imena moraju biti definisana pre nego to budu upotrebljena, i zbog toga ih uvek definiite na poetku svakog programa. Nakon imenovanja registara, unesite njihova imena i u aktivni deo programa. Ukoliko sada prepiete program bez komentara, ali sa imenovanim registrima, moi ete da uporedite preglednost i itljivost takvog listinga sa prethodnim: STATUS TRISA PORTA RP0 equ equ equ equ 0x03 0x85 0x05 0x05 STATUS,RP0 b'00000000' TRISA STATUS,RP0 b'00000100' PORTA b'00000000' PORTA Poc
Poc
Sigurno ste primetili da imenovani registri ine praenje programa znatno lakim, ak i bez ikakvih komentara. Takoe moete primetiti da se imenovani registri razlikuju od labele po tome to su im sva slova velika. Na taj nain ne moete doi u situaciju da kasnije razmiljate da li je neka takva oznaka labela ili imenovani registar. Moda vam deluje udno to PORTA registar i RP0 bit STATUS registra imaju istu vrednost (0x05). Meutim, razlika je oigledna. PORTA predstavlja adresu registra, a RP0 bit 5 STATUS registra. Asembler ne pravi razliku izmeu njih jer im je vrednost ista (ak se mogu i zameniti), ali vodi rauna o njihovom redosledu unutar instrukcije. Takoe moete videti da su instrukcije odvojene od poetka reda. To je obavezno, da ih asembler ne bi preveo kao labele.
10
5. Prazne petlje
U prethodnom programu postoji mala greka. Skoro svaka instrukcija zahteva jedan instrukcijki ciklus da bi se izvrila. Instrukcijski ciklus je 4 puta vei od takta oscilatora. Ukoliko kao oscilator za takt za PIC16F84 koristite kvarcni kristal od 4MHz trajanje svake instrukcije e biti 4MHz/4ciklusa, ili 1S. Kako se koristi samo 5 instrukcija, LED e se ukljuiti i iskljuiti u samo 6S. Zbog ega 6 a ne 5? Zbog toga to instrukcije koje menjaju stanje programskog brojaa (eng. Program Counter vie o njemu kasnije) poput GOTO za svoje izvrenje troe 2 instrukcijska ciklusa. Kako je to treptanje previe brzo da biste ga uopte mogli primetiti, zbog sporosti oka delovae Vam kao da LED svetli konstantno, ali sa pola snage. Dakle potrebno je napraviti adekvatno kanjenje izmeu trenutka ukljuenja i iskljuenja LED. Uobiajeni princip po kome se implementira kanjenje jeste da mikrokontroleru zadate da odbrojava od prethodno postavljenog broja do nule, i da u trenutku dostizanja nule prekine odbrojavanje. Nulta vrednost, dakle, predstavlja kraj i izlazak iz petlje, nakon ega PIC nastavlja sa izvravanjem daljeg programa. Najpre treba definisati konstantnu vrednost koja e predstavljati inicijalnu vrednost brojaa. Nazovite je BROJAC. Zatim treba odluiti kolika e biti stvarna vrednost ovog broja. Najvei broj koji se moe zadati je d'255' odnosno 0xFF. Meutim, kao to je napomenuto u prethodnom poglavlju, naredba equ pridruuje imena obinim brojevima, ne pravei razliku izmeu adresa registra i bitova. Zato ete, ukoliko probate njom pridruiti vrednost 0xFF, dobiti greku pri kompajliranju programa. Ovo se deava jer memorijska adresa 0xFF nije implementovana u PIC16F84, i zbog toga joj ne moete pristupiti. Pa kako onda pridruiti eljeni broj? Za to je potrebno da sa strane sagledate situaciju. Ukoliko imenu BROJAC pridruite, na primer adresu 0x0C, ona e ukazivati na adresu registra opte namene (RAM memoriju koju moete slobodno koristiti). Prilikom dobijanja napona napajanja, svi neiskorieni registri u mikrokontroleru (osim registara specijalne namene) postavljaju se na vrednost 0xFF. Zato e BROJAC imati vrednost 0xFF. Ali, kako onda podesiti BROJAC na drugu vrednost? Sve to trebate uraditi je da ubacite eljenu vrednost u taj registar. Na primer, ukoliko elite da BROJAC sadri vrednost 0x85, ne moete napisati BROJAC equ 0x85, jer e onda BROJAC sadrati adresu TRISA registra. Zato trebate uraditi sledee: movlw movwf 0x85 0x0C ; Najpre stavite broj 0x85 u W registar, ; a onda ga prebacite u 0x0C registar
Sada moete slobodno napisati BROJAC equ 0x0C. Vrednost unutar imenovanog registra BROJAC koji se nalazi na adresi 0x0C e biti 0x85. Korienje neinicijalizovanih (0xFF) vrednosti moe dovesti do zabune prilikom kasnije analize programa. Verovatno ete se pitati kako ste mogli smanjiti vrednost u registru bez njegove prethodne inicijalizacije. U primerima u ovom uputstvu one su koriene iskljuivo zbog tednje prostora. Ukoliko ih Vi budete koristili u svojim programima obavezno to naglasite odgovarajuim komentarima. 11
Dalje se treba smanjivati vrednost registra BROJAC sve dok ne dostigne vrednost 0x00. Unutar PIC postoji instrukcija kojom se moe ovo uraditi, uz malu pomo instrukcije goto i labele. Ta instrukcija ima sledei oblik: decfsz BROJAC,1
Instrukcija DECFSZ f,d (eng. Decrement f, Skip if zero) znai Smanji vrednost registra f (u ovom sluaju BROJAC odnosno 0x0C) i stavi dobijenu vrednost u W ako je d=0, odnosno u registar f ako je d=1. Ukoliko je rezultat nakon smanjenja jednak 0 preskoi sledeu instrukciju. Kako se odredite rezultata koristi u dosta instrukcija, a kao to ste ve nauili lake je pamtiti imena umesto brojeva, mogue je i bitu odredita dati ime, na sledei nain: W F equ .0 equ .1
Mnogo rei, za jednu instrukciju. Pogledajte njenu primenu u praksi. BROJAC Pet equ 0x0C decfsz BROJAC,F goto Pet Nastavi odavde
Ovde je najpre (inicijalno) postavljena konstanta BROJAC na 0xFF. U sledeem redu definisana je labela nazvana Pet, i zadana je decfsz instrukcija. Decfsz BROJAC,F smanjuje vrednost registra BROJAC za 1, i rezultat vraa u registar BROJAC. Ona istovremeno proverava da li je nova vrednost registra BROJAC jednaka 0. Ukoliko nije, program se nastavlja od sledee linije. U sledeoj liniji imamo instrukciju goto, koja vraa izvrenje programa na decfsz instrukciju. To se ponavlja sve dok vrednost registra BROJAC ne bude jednaka nuli. Onda program preskae sledeu instrukciju (u ovom primeru goto) i nastavlja od mesta gde je napisano Nastavi odavde. Kao to vidite, ovim se program vrti u jednom mestu tano odreeno vreme (kao brojanje u murkama), pre nego to nastavi dalje. To se naziva prazna petlja. Kako bi se jednom petljom postiglo maksimalno kanjenje od 3S * 256 = 768S, bie Vam potrebne bar dve petlje (jedna unutar druge) ukupnog kanjenja od 3S * 256 * 256 = 0,2S da biste mogli primetiti kako LED treperi. U prolom poglavlju to nije naglaeno, ali svakom programu potrebno je definisati poetak (adresu unutar PIC16F84 sa koje poinje snimanje kda) i kraj (posle koga nema vie instrukcija). Poetak programa se definie sledeom direktivom ORG 0x00 Sada ubacite ove petlje u program, i dovrite ga pravei pravi program sa komentarima: 12
; ****** Imenovanje registra ****** STATUS equ 0x03 ; Adresa STATUS registra TRISA equ 0x85 ; Adresa TRISA registra PORTA equ 0x05 ; Adresa PORTA registra BROJAC1 equ 0x0C ; Prvi broja za praznu petlju. Inicijalno 0xFF BROJAC2 equ 0x0D ; Drugi broja za praznu petlju. Inicijalno 0xFF RP0 equ 0x05 ; Oznaka bita 5 STATUS registra F equ .1 ; Oznaka odredita rezultata instrukcije ; ****** Podeavanje porta ****** org 0x00 bsf STATUS,RP0 movlw b'00000000' movwf TRISA movwf TRISB bcf STATUS,RP0 ; ****** Ukljui LED ****** Poc movlw movwf b'00000100' ; Ukljuuje LED stavljajui vrednost PORTA ; b'00000100' u W, a zatim i u PORTA
; Prebacuje program u banku 1 ; Postavlja sve pinove ; kao izlazne ; ; Vraa program u banku 0
; ****** Prva petlja aktivna pri ukljuenoj LED oko 0,2S ****** Pet1 decfsz goto decfsz goto BROJAC1,F Pet1 BROJAC2,F Pet1 ; Smanji BROJAC1 za 1 ; Ukoliko je BROJAC1 jednak 0, nastavi dalje ; Smanji BROJAC2 za 1 ; Ukoliko je BROJAC2 jednak 0, nastavi dalje, ; u suprotnom vrati se na poetak petlje. ; Ovaj broja broji nadole od 255 do 0, 255 puta ; To je tzv. petlja unutar petlje.
; ****** Kanjenje zavreno. Sada iskljui LED ****** movlw movwf b'00000000' ; Iskljui LED stavljajui 0 u W registar, PORTA ; a zatim u PORTA
; ****** Druga petlja aktivna pri iskljuenoj LED oko 0,2S ****** Pet2 decfsz goto decfsz goto BROJAC1,F Pet2 BROJAC2,F Pet2 ; Druga petlja dri LED iskljuenom ; dovoljno dugo da bi se to moglo primetiti ; ;
; ****** Sada se program vraa na poetak ****** goto Poc ; Vraanje na poetak programa ; ****** Kraj programa ****** end ; Direktiva za oznaavanje kraja programa. 13
Naravno, eleete da isprobate program da bi videli da li zaista radi. Evo elektrine eme koju trebate napraviti za test ovog programa. Takt mikrokontrolera odreen je upotrebljenim RC oscilatornim kolom (otpornik od 10k i kondenzator od 33pF). Iako za dati primer nije potrebno konfigurisati pinove oba porta, to je poeljno ukoliko su pinovi na PORTB nepovezani. Bolje je utroiti instrukciju vie nego rizikovati nepouzdan rad ili oteenje mikrokontrolera. Isto tako LED je mogue povezati direktno na pin (bez otpornika), poto PIC16F84 ima interno ogranienje izlazne struje na max. 25mA. Meutim to nije poeljno. Cena otpornika je zanemarljiva u odnosu na cenu mikrokontrolera. U praksi se ee sree inverzna logika za povezivanje LED tako to se anoda LED povee na +5V, a katoda (preko otpornika) na pin. Pri tome e LED svetleti po dovoenju logike 0 na pin. Ovo je mogue jer pin pri logikoj 0 moe upijati struju do 25mA, a i poeljno zbog manjeg grejanja i potronje mikrokontrolera. estitamo. Upravo ste napravili svoj prvi program, i napravili kolo kojim se LED ukljuuje i iskljuuje. Za sada ste sledei ova uputstva nauili 7 od ukupno 35 instrukcija, i ve kontroliete ulazno izlazni port. U sledeem poglavlju nauiete kako da svoj kd kompajlirate i snimite u PIC.
14
6. MPLAB Asembler
U ovom poglavlju upoznaete se sa MPLAB razvojnim okruenjem, i specijalnim funkcijama njegovog editora. Sa sajta http://www.microchip.com/ trebate skinuti programski paket MPLAB. On ima integrisan editor (umesto Windows Notepada), asembler, simulator i drajvere za svoje programatore. Na alost nas sa dial-up vezom, sam paket tei oko 65Mb. Funkcija editora bi trebalo da vam je jasna. Generisanje istog .asm fajla. Asembler slui da tekstualne instrukcije iz .asm fajla pretvori u mainski kd koji PIC razume. U protivnom, umesto instrukcije movlw 0x01 trebali bi pisati binarni mainski kd 110000 00000001. Verovatno Vam je ve dosadilo da iznova i iznova piete STATUS equ 0x03 i ostala standardna imena. MPLAB asembler ima mogunost uitavanja fajla koji sadri sva ova imena. Jo bolje, u sebi ima i predefinisane obrasce (eng. standard code template) za upis asemblerskog programa sa zaglavljem, uobiajenim direktivama, posebnim delom za interapte (vie o njima kasnije)... MPLAB ima jedan poznat bag koji se ogleda u nemogunosti rada sa putanjom do foldera duom od 51 karaktera. Zato direktno u C: napravite folder Moji programi. U njega kopirajte sledei fajl: P16f84.inc - sadri sve standardne labele
Ovaj fajl trebalo bi da se nalazi u folderu C:\Program Files\Microchip\MPASM Suite\P16f84.inc Onda u Vaem tekst editoru napravite sledee zaglavlje, ;********************************************************** ; Autor : ; Datum : ; Verzija : ; Naslov : ; ; Opis hardvera : ; Opis softvera : ; Potrebni fajlovi : p16F84.inc ; ;********************************************************** list #include p=16F84 <p16F84.inc> ; Definie upotrebljeni mikrokontroler ; Ubacuje nazive registra u program
15
__CONFIG
_CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. ; Vie o njima kasnije. ; Definie start programa
ORG
0x00
i snimite ga u folder C:\Moji programi sa nazivom Zagl.asm. Unutar foldera C:\Moji programi napravite folder Proba. Ovo zaglavlje moete koristiti za svaki novi program koji pravite, meutim uvek ga moete promeniti, tako da odgovara Vaim specifinim potrebama. Ukoliko zavirite u strukturu p16F84.inc fajla (F3 iz Total Commandera), moete primeriti da su u njemu imenovani svi registri, pa ak i bitovi pojedinih registra. Ukoliko Vam njegova trenutna struktura iz bilo kog razloga ne odgovara, i ovaj fajl moete editovati po sopstvenim potrebama. U tom sluaju uvek ga uvajte zajedno sa .asm programom. Sada ukljuite MPLAB IDE. Ne obazirite se na prozore koje je otvorio, ve sledite sledeu proceduru: Project, Project Wizard, Next, izaberite PIC16F84, Next Izaberite (ukoliko ve nije) Microchip MPASM Toolsuite. Kliknite na MPASM Assebmler (Mpasmwin.exe), i proverite da li se nalazi u folderu C:\Program Files\Microchip\MPASM Suite. Ukoliko ga nema, locirajte ga runo klikom na Browse. Ostala dva fajla Vam (za sada) nisu bitna. Next, Upiite ime projekta (npr. Proba) i izaberite putanju do ranije napravljenog foldera C:\Moji programi\Proba Next, Uite u C:\Moji programi. Kliknite naizmenicno na P16f84.inc, Zagl.asm, i na Add, tako da se oba fajla pojave u desnom prozoru. Kliknite na slova A pored njih dok se ne promene u C (Copy). Na taj nain se odabrani fajlovi kopiraju u trenutni projekat (u folderu Proba), tako da originali ostaju nepromenjeni za idui put. Ostale mogue opcije su U (User) relativna putanja do fajlova, S (System) apsolutna putanja i A (Auto) MPLAB sam odluuje. Next i kliknite na Finish. U novootvorenom prozoru Proba.mcw duplo kliknite na Zagl.asm. Otvara se prozor editora u kome moete pisati Va program. Moda vam ovaj postupak trenutno izgleda komplikovano, ali u praksi je potrebno ponoviti ga 2 do 3 puta da bi postao to to i jeste. Obina rutina.
16
Sa svim ovim podeavanjima kompletan program bi trebao izgledati otprilike ovako: ;********************************************************** ; Autor Pera Detli ; Datum 23.3.2008 ; Verzija 7,8 ; Naslov Treptanje LED ; ; Opis hardvera : - RC oscilator, LED od pina RA2 ka masi ; Opis softvera : - Ovim programom omogueno je treptanje LED ; ; Potrebni fajlovi : p16F84.inc ;********************************************************** ; ****** Inicijalizacija asemblera ****** list #include __CONFIG p=16F84 ; Definie upotrebljeni mikrokontroler <p16F84.inc> ; Ubacuje nazive registra u program _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove.
; ****** Imenovanje registra ****** BROJAC1 BROJAC2 equ equ 0x0C ; Prvi broja za praznu petlju. Inicijalno 0xFF 0x0D ; Drugi broja za praznu petlju. Inicijalno 0xFF
; ****** Podeavanje porta ****** org bsf movlw movwf movwf bcf 0x00 STATUS,RP0 b'00000000' TRISA TRISB STATUS,RP0 ; Prebacuje program u BANK1 ; Postavlja sve pinove ; kao izlazne ; Vraa program u BANK0
; ****** Ukljui LED ****** Poc movlw movwf b'00000100' PORTA ; Ukljui LED stavljajui b'00100' ; u W registar, a zatim i u PORTA
; ****** Prve petlja aktivna pri ukljuenoj LED oko 0,2S ****** Pet1 decfsz goto decfsz goto BROJAC1,F Pet1 BROJAC2,F Pet1 ; Smanji BROJAC1 ; Ukoliko je BROJAC1 jednak 0, nastavi dalje ; Smanji BROJAC2 ; Ukoliko je BROJAC2 jednak 0, nastavi dalje, ; u suprotnom vrati se na poetak petlje. ; Ovaj broja broji nadole od 255 do 0, 255 puta ; To je tzv. petlja unutar petlje.
17
; ****** Kanjenje zavreno. Sada iskljui LED ****** movlw movwf b'00000000' PORTA ; Iskljui LED stavljajui 0 u W registar, ; a zatim u PORTA
; ****** Druga petlja aktivna pri iskljuenoj LED oko 0,2S ****** Pet2 decfsz goto decfsz goto BROJAC1,F Pet2 BROJAC2,F Pet2 ; Druga petlja dri LED iskljuenom ; dovoljno dugo da bi se to moglo primetiti ; ;
; ****** Vraanje programa na poetak ****** goto Poc ; Vraanje na poetak programa
Kao to ste i sami pretpostavili direktiva #include <p16F84.inc> ubacuje fajl p16F84.inc ispred vaeg asemblerskog programa. Sam asembler e pri konverziji instrukcija u mainski kd uzeti iz fajla nazive samo onih imenovanih registra koji se koriste u programu. Na taj nain program je pregledniji, Vama je skraeno vreme pisanja programa (za imenovanje registra), a program nije nita dui nego inae. Sada moete kompajlirati program. Za kompajliranje pritisnite taster F10 na tastaturi. U novootvorenom prozoru Output videete kratak opis uspenosti operacije. Moete slobodno ignorisati Message [302]. Ona Vas podsea da upotrebljeni registri (npr. TRISA) nisu u BANK0. Ukoliko Vas ova poruka nervira, moete pre prve instrukcije napisati "ERRORLEVEL -302". U Output prozoru najbitnija je zadnja poruka. Ona mora biti BUILD SUCCEEDED. U folderu Proba sada se nalazi par fajlova. Bitni su vam jedino oni sa ekstenzijom .err, .lst i .hex. U fajlu sa .err ekstenzijom, moete videti spisak greaka i upozorenja nastalih pri asembliranju programa. Fajl sa .lst ekstenzijom predstavlja detaljan pregled svih upotrebljenih instrukcija, komentara... Iz njega moete videti u kom trenutku je tano nastupila greka u asembliranju. Fajl sa .hex ekstenzijom predstavlja fajl spreman za snimanje u PIC. Postupak snimanja, nauiete u narednim poglavljima.
18
7. Programatori
Za snimanje .hex fajla u PIC neophodan vam je programator kao hardverski deo i odreeni softver u kompjuteru preko koga se vri programiranje. Nemojte se zaleteti pa odmah kupiti najskuplji Microchipov programator. Funkcija programatora je programiranje PIC mikrokontrolera moda 5-6 puta dnevno. Da li e on biti na USB ili paralelnom portu uopte Vam nije bitno. Ionako ete uglavnom snimati manje od 1KB programa. Jedino bih preporuio izbegavanje programatora sa serijskim portom, zbog nejednakosti njegovih karakteristika na raznim matinim ploama (uglavnom na laptopovima). Ukoliko imate iskustva u pravljenju elektronskih kola, moete napraviti jedan od programatora sa sajta http://www.icprog.com/. Na istom sajtu nalazi se i pripadajui softver za programiranje. Proguglajte malo. Moda naiete i na neto lake. Ukoliko elite kupiti programator, moete pogledati sledee sajtove:
AllPic programator
I opet pre kupovine pretraite internet. Va novac je u pitanju. Unutar mikrokontrolera nalaze se takozvani konfiguracioni bitovi. Njima se odreuju hardverske specifinosti mikrokontrolera. Iako su inicijalno ubaeni u __CONFIG diirektivu, neki programatori je ignoriu i postupaju po sopstvenim setovanjima. Za PIC16F84 konfiguracioni bitovi su: Watchdog Timer dozvoljava odnosno zabranjuje upotrebu WDT u programu Power Up Timer Enable prouzrokuje kanjenje pri dovoenju napona napajanja da bi se oscilator mikrokontrolera stabilizovao Code Protection onemoguava iitavanje kda iz PIC kopiranje programa Oscillator omoguuje izbor jednog od 4 standardna tipa oscilatora, odnosno RC (eng. Resistor Condensator) 1 otpornik i 1 kondenzator LP (eng. Low Power) Za kristalne oscilatore male potronje 32KHz-200KHz XT Za klasine kristalne oscilatore 100KHz-4MHz HS (eng. High Speed) Za kristalne oscilatore vee brzine 4MHz-10MHz Upotrebu Watchdog Timera nauiete kasnije. Za skoro sve primere u ovom uputstvu, on treba biti iskljuen WDT OFF. Power Up Timer Enable bit je (osim kada imate kvalitetan oscilator i kada vam je potreban brz start mikrokontrolera) preporuljivo ostaviti ukljuenim PWRTE ON. Code Protection je poeljno iskljuiti, kako biste mogli verifikovati program nakon programiranja. Meutim, ukoliko trebate prodati PIC sa Vaim programom na koji ste utroili 3 meseca rada, obavezno ga ukljuite. U ovom uputstvu, neka bude iskljuen CP OFF. 19
Vrste oscilatora nauiete kasnije. Za sada je bitno da znate da ovde koristite RC (Resistor Capacitor) oscilator. Dosta je toga o asembleru i hardveru. Vreme je za uenje novih instrukcija. U sledeem poglavlju nauiete upotrebu potprograma koji e Vam pomoi da program bude manji i jednostavniji.
20
8. Potprogrami
Potprogram je deo kda, ili program, koji moemo pozvati kao takav kad god je potreban. Potprogrami se koriste u sluajevima viestrukog izvravanja jedne iste funkcije, kao na primer rutine sa praznom petljom za kanjenje. Prednosti korienja potprograma su u lakoi menjanja vrednosti brojaa jednom unutar potprograma, nego npr. deset puta kroz glavni program, i u smanjenju koliine memorije koju program zauzima unutar PIC. Pogledajte strukturu jednostavnog potprograma: BROJAC Pet equ 0x0C decfsz goto return ; Uzima inicijalnu vrednost 0xFF BROJAC,F Pet ; Smanjuje i proverava ; sve do 0 ; Povratak iz potprograma
Prvo trebate labelom dati potprogramu ime, i u ovom sluaju izabrano je da to bude Pet. Onda se upisuje kd koji se izvrava u okviru potprograma. U ovom sluaju, to je kanjenje za program sa LED. Na kraju se potprogram zavrava RETURN instrukcijom. Da biste pozvali potprogram iz glavnog programa, jednostavno upiite CALL instrukciju i labelu poetka potprograma. Kada glavni program doe do dela sa instrukcijom CALL k (eng. Call Subroutine) pozovi potprogram, gde je k adresa ili labela potprograma, on skae na mesto na kojem se nalazi potprogram. Tamo nastavlja sa izvravanjem komandi unutar potprograma sve do nailaska na instrukciju RETURN (eng. Return from Subroutine) povratak iz potprograma. Po nailasku na RETURN program nastavlja izvravanje od instrukcije koja se nalazi iza CALL instrukcije. Moete pozvati potprogram koliko god puta elite, i zbog toga se korienjem potprograma smanjuje ukupna duina programa. Ipak postoje dve stvari na koje morate obratiti panju. Prvo, u glavnom programu, svi registi moraju biti imenovani i inicijalizovani pre nego to se upotrebe. Oni se mogu imenovati u samom potprogramu, ili na poetku glavnog programa. Najpraktinije je imenovati ih na poetku programa. Na taj nain ete znati da su su svi na istom mestu. Drugo, morate biti sigurni da e izvravanje glavnog programa zaobii potprogram. Ukoliko stavite potprogram na kraj Vaeg programa i zaboravite da stavite instrukciju goto koja bi nastavila izvravanje dalje od potprograma, program e nastaviti sa izvravanjem i izvriti i potprogram eleli Vi to ili ne. PIC ne pravi razliku izmeu potprograma i glavnog programa. Ovde treba napomenuti i mogunost istovremenog imenovanja vie registara. To se izvodi cblock i endc direktivama. Ukoliko u programu imate dve promenljive, trebate ih pamtiti u dva registra opte namene. Meutim, za vei broj registara, praktinije je definisati ih unutar jednog bloka. Na taj nain mikrokontroler preuzima obavezu odreivanja adresa pojedinanih registara (odreujete mu samo prvu), i poboljavate portabilnost programa za monije serije mikrokontrolera. Oigledno da ovo nije velika uteda pri korienju samo dva registra. Meutim, pri vie registara ovo moe biti od pomoi. 21
Prepravite program za treperenje LED tako da koristi potprogram. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. cblock 0x0C ; Poetak slobodnih registara BROJAC1 ; Prvi broja za petlju. Inicijalno 0xFF BROJAC2 ; Drugi broja za petlju. Inicijalno 0xFF endc ; Kraj bloka registara ; ****** Podeavanje porta ****** org 0x00 bsf STATUS,RP0 movlw b'00000000' movwf TRISA movwf TRISB bcf STATUS,RP0 ; ****** Ukljui LED ****** Poc movlw b'00000100' movwf PORTA ; ****** Dodaj kanjenje ****** call Pet ; ****** Kanjenje zavreno, sada iskljui LED ****** movlw b'00000000' ; Iskljui LED stavljajui b'00000' movwf PORTA ; u W registar, a zatim i u PORTA ; ****** Dodaj jo jedno kanjenje ****** call Pet ; ****** Sada se vrati na poetak programa ****** goto Poc ; ****** Potprogram za kanjenje od oko 0,2S ****** Pet decfsz BROJAC1,F ; Ove dve petlje slue za brojanje nadole od goto Pet ; 255 do 0, 255 puta, omoguavajui da decfsz BROJAC2,F ; se moe primetiti kako LED treperi goto Pet return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa.
; Prebacuje program u BANK1 ; Postavlja sve pinove ; kao izlazne ; Vraa program u BANK0 ; Ukljui LED stavljajui b'00100' ; u W registar, a zatim i u PORTA
Moete videti da je korienjem potprograma smanjena veliina programa. Svaki put kada je potrebno napraviti pauzu, bez obzira svetli li LED ili ne, pozove se potprogram. Na kraju potprograma program se vraa na red iza CALL instrukcije. 22
U primeru se najpre ukljuuje LED. Onda se poziva potprogram. Nakon povratka iz potprograma moe se iskljuiti LED. Opet se poziva potprogram, i po povratku iz njega, izvrava se sledea instrukcija, odnosno goto Poc. Bitno je napomenuti i to da je mogue pozivanje drugog potprograma unutar prvog. Na primer ovo je potpuno mogue: Pocetak Prog1 Prog2 call Prog1 goto Pocetak call Prog2 return return ; Pozivanje prvog potprograma ; Neprekidno vraanje na poetak u mrtvoj petlji ; Pozivanje drugog potprograma ; Povratak iz prvog potprograma ; Povratak iz drugog potprograma
Ovako se moe ii samo do osmog nivoa dubine na ta se mora obratiti panja. Za one koje interesuje, originalan program bio je dug 121 bajtova. Korienjem potprograma, smanjen je na 104 bajta. Ovo moda i ne izgleda mnogo, ali imajte u vidu da memorija PIC16F84 mikrokontrolera iznosi samo 1024 bajta. Svaki bajt je bitan. U sledeem poglavlju nauiete kako da PIC oita spoljne signale.
23
9. Ulazi
Do sada ste samo pisali po portu A da bi se ukljuivala i iskljuivala LED. U ovom poglavlju nauiete upotrebu ulaznih pinova. Na taj nain mogue je na pinove mikrokontrolera povezati spoljno elektronsko kolo, i programirati PIC da razliito reaguje u zavisnosti od spoljnih signala. Kao to Vam je poznato, da bi konfigurisali U/I pinove treba prebaciti program iz banke 0 u banku 1. Najpre to uradite: bsf STATUS,RP0 ; Banka 1
Da bi se konfigurisao odgovarajui pin na portu A kao izlazni, treba poslati 0 na njemu odgovarajue mesto u TRISA registru. Da bi se konfigurisao kao ulazni, treba poslati 1. movlw movwf bcf b'00000001' ; Stavi b'00001' u W, a zatim u TRISA ; TRISA registar. Tako je pin RA0 ulazni. STATUS,RP0 ; Banka 0
Ovim je RA0 pin konfigurisan kao ulazni. Sada je potrebno proveriti da li je na njemu prisutan nivo logike jedinice ili nule. Za ovo se koristi instrukcija BTFSC ili BTFSS. BTFSC f,b (eng. Bit Test f, Skip if Clear) instrukcija znai Testiraj bit b registra f. Ako je bit jednak 0, preskoi sledeu instrukciju. BTFSS f,b (eng. Bit Test f, Skip if Set) znai Testiraj bit b registra f. Ako je bit jednak 1, preskoi sledeu instrukciju. Koju instrukciju ete koristiti zavisi od toga kako elite da program reaguje kada testirate eljeni bit. Na primer, ukoliko ekate da se na ulaznom pinu javi nivo logike 1, moete iskoristiti instrukciju BTFSS ovako: Poetak programa Test btfss PORTA,0 goto Test Nastavi odavde
Program e nastaviti izvravanje od Nastavi odavde samo ukoliko je bit 0 PORTA registra setovan, odnosno ukoliko je na pinu RA0 prisutan nivo logike 1 (+5V). Napiite sada program kojim e LED treptati jednom brzinom, a ukoliko se pritisne prekida, ona e treptati duplo sporije. Moete probati da sami napiete ceo program, da biste videli da li ste shvatili postupak.
24
; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. BROJAC1 equ 0x0C ; Prvi broja petlje. Inicijalno 0xFF BROJAC2 equ 0x0D ; Drugi broja petlje. Inicijalno 0xFF org 0x00 ; ****** Podeavanje porta ****** bsf STATUS,RP0 movlw b'00000001' movwf TRISA movlw b'00000000' movwf TRISB bcf STATUS,RP0 ; ****** Ukljuenje LED ****** Poc movlw b'00000100' movwf PORTA ; Banka 1 ; Stavi b'00001' u TRISA. Tako je pin ; RA0 ulazni, a RA2 izlazni. ; Stavi b'00000000' u TRISB. Tako su ; svi pinovi izlazni. ; Banka 0 ; Ukljui LED stavljajui b'00100' u ; W registar, a zatim i u port A
; ****** Proveri da li je prekida zatvoren ****** btfsc PORTA,0 ; Testiraj stanje bita 0 porta A. Ako je 0 ; preskoi prvu pauzu. Ako je 1 proi kroz call Pet ; obe pauze, kao da se nita ne dogaa ; ****** Dodavanje jo jedne pauze ****** call Pet ; Ova pauza se uvek izvrava
25
; ****** Pauza zavrena. Sada iskljui LED ****** movlw b'00000000' ; Iskljui LED stavljajui b'00000' movwf PORTA ; u W registar, a zatim i u port A ; ****** Proveri da li je prekida i dalje zatvoren ****** btfsc PORTA,0 ; Testiraj stanje RA0 pina. Ako je na logikoj 0 ; preskoi prvu pauzu. Ako je na 1 proi kroz call Pet ; obe pauze, kao da se nita ne dogaa ; ****** Dodavanje jo jedne pauze ****** call Pet ; Ova pauza se uvek izvrava ; ****** Pauza zavrena. Sada se vrati na poetak ****** goto Poc ; Vrati se na poetak ; ****** Potprogram za kanjenje od oko 0,2S ****** Pet decfsz BROJAC1,F ; Ove dve petlje slue za brojanje nadole od goto Pet ; 255 do 0, 255 puta, omoguavajui da decfsz BROJAC2,F ; se moe primetiti da LED treperi goto Pet return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa.
Otpornik od 4k7 obavezan je da bi pin RA0 i pri otvorenom prekidau bio u stabilnom logikom stanju (logika 0). U protivnom, pin bi zbog svoje visoke ulazne impedanse postao previe osetljiv na spoljnje smetnje (npr. grmljavinu), ili bi pak neprestano bio u logikoj 1 bez obzira na stanje prekidaa. U praksi se umesto otpornika prema masi, ee sree otpornik prema naponu napajanja. Vie o potrebi za ovim (pull-up i pull-down) otpornicima nauiete u narednim poglavljima. Program najpre ukljuuje LED. Onda proverava da li je prekida zatvoren. Ukoliko nije (na ulazu je logicka 0), program se izvrava kao da se nita nije desilo, i prolazi kroz oba poziva za potprogram. Ukoliko jeste (na ulazu je nivo logike 1), prvi poziv za potprogram se preskae, pa je pauza u tom sluaju ista kao kod ranije napisanih programa. Isto se deava i nakon to se iskljui LED. Moete kompajlirati i isprobati ovaj program. Ipak da Vas odmah upozorim. Kolo i program nee impresionirati nekog koga ne interesuje programiranje mikrokontrolera. Zato se nemojte uznemiravati kada svojoj porodici i prijateljima pokaete kako moete menjati brzinu treptanja LED prekidaem, a oni za to pokau veoma malo interesovanja. Ukoliko ste iz poetka pratili ova uputstva, onda biste moda voleli da znate da ste do sada nauili 10 od ukupno 35 instrukcija za PIC16F84! Sve su nauene ukljuivanjem i iskljuivanjem LED i testiranjem prekidaa.
26
10. Simulator
Simulacija je proces virtuelnog simuliranja izvravanja instrukcija iako jo nita konkretno nije hardverski napravljeno. Jedan od najpopularnijih (i najjednostavnijih) simulatora je svakako PIC Simulator IDE. U njemu je dovoljno kliknuti na eljeni pin mikrokontrolera da bi se logiko stanje na njemu promenilo. Naalost, moe se koristiti samo 30 dana pre isteka probnog perioda. Jo jedan odlian simulator je Proteus. On prua mogunost integracije mikrokontrolera sa eksternim hardverom. Ni on nije besplatan. Besplatan je jedino Misim, ali nije dovoljno upotrebljiv. MPLAB IDE ima u sebi odlian a besplatan simulator. U ovom poglavlju bie opisane njegove specifinosti. Da biste ukljuili simulator idite na Debugger, Select Tool, MPLAB SIM. U toolbaru e se pojaviti nekoliko novih ikonica. Kliknite na treu (Animate - dve strelice nadesno) i pratite izvravanje programa u prozoru sa .asm fajlom. Vidite kako je doao do petlje i kako neprestano izvrava dve iste instrukcije. Na drugoj ikoni (Halt) pauzirate program. Na prvoj (Run - jedna strelica nadesno) se program izvrava maksimalnom brzinom, ali bez animiranosti njegovog izvravanja. etvrtom ikonom (Step Into) se kada je program u pauziranom stanju vri prelaz na sledeu instrukciju, korak po korak. Petom (Step Over) se maksimalnom brzinom izvrava potprogram ili naredna instrukcija. estom ikonom (Step Out) nasilno se izlazi iz potprograma. Zadnjom ikonom se vri reset programa, i tako njegovo izvravanje moe poeti iz poetka. Registri opte namene pri tome zadravaju svoje vrednosti. Da biste videli aktuelni sadraj registara BROJAC1 i BROJAC2 moete zadrati mi iznad njih, ili ii na View, File Registers. U prozoru koji se otvorio moete videti da se registar na adresi 0x0C (koja je izabrana za BROJAC1) u koracima smanjuje do 0. Kada dostigne 0, smanjuje se BROJAC2 na adresi 0x0D. Verovatno e Vam laki biti prikaz labela, a ne adresa. Promenite prikaz klikom na Symbolic tab. Donji deo MPLAB prozora prua Vam korisne informacije o trenutnom stanju banke, W registra i pojedinih bitova STATUS registra. Velika slova Z, DC i C pri dnu ekrana oznaavaju da su ti bitovi setovani. Upotrebu ovih bitova nauiete kasnije. Detaljnije praenje promena registara, moete ukljuiti preko View, Watch opcije. Osenite eljeni registar, i prevucite ga u Watch prozor. Desnim klikom preko registra unutar Watch prozora i izborom opcije Properties dobijate mogunost podeavanja eljenog formata brojeva. Za BROJAC1 i BROJAC2 najpregledniji bi bio decimalni format. Duplim klikom na vrednosti pored registara, moete ih nasilno promeniti. Moda vam je animacija brzine izvravanja programa previe spora? Poveajte je na Debugger, Settings, Animation / Realtime Updates pod Animate step time. Umesto 500mS stavite npr. 50. Brzina simuliranja ograniena je brzinom vaeg kompjutera. 27
Ukoliko Vas interesuje realna brzina (eng. Real Time) kojom bi program radio, moete je proveriti preko Debugger, Stopwatch (eng. stopwatch toperica) opcije. Dovoljno je izabrati brzinu oscilatora u Debugger, Setings, Osc / trace opciji. Za date vrednosti RC oscilatora (10k i 33pF), ona je oko 3,5MHz. Nekada nema svrhe ekati da se zavri odreeni proces (npr. prazna petlja). MPLAB simulator Vam omoguava da u programu postavite take prekida (eng. Breakpoint) duplim klikom na eljenu instrukciju. Crvena oznaka B pojavljuje se leve strane prozora editora. im simulator naie na taj deo, zaustavie dalju simulaciju to e Vam omoguiti pregled stanja registara ili proraun vremena (preko toperice) potrebnog za izvravanje instrukcija. Upotreba toperice moe biti izuzetno korisna. Na primer da biste tano odredili vreme za koje je LED aktivna, dovoljno je postaviti jednu taku prekida na call instrukciju. Onda se program izvri (Run - bez animiranja) do prve take prekida, i tu se resetuje toperica i klikne na Step Over. Potprogram se izvrava maksimalnom brzinom (bez animiranja) i nakon to se zavri iita se proteklo vreme iz toperice. Iako je prikaz svih izlaznih pinova portova veoma lako implementirati, ukoliko je potrebno simulirati program koji treba reagovati na signale sa ulaznih pinova (tipa pritisnut prekida T1) stanje se iz osnova menja. Da bi to bilo mogue mora se definisati odreeni stimulans (eng. Stimulus) po kome e se odvijati promene. eljeni scenario promena definiete sa Debugger, Stimulus Controller, New Scenario. Na primer, ukoliko je prekida na RA0 pinu svo vreme pritisnut (a pin je definisan kao ulazni), potrebno je izabrati asinhroni (Asynch) tab, a zatim u jednom od redova ubaciti RA0 i Set High akciju. Da bi se menjalo ulazno stanje odreenog pina potrebno je izabrati eljeni pin (npr. isto RA0) i Toggle akciju. Pri njoj se klikom na Fire polje pored eljenog pina menja njegovo logiko stanje, to moete pratiti u File Registers ili Watch prozoru. Ukoliko je potrebno da pin u odreenom logikom stanju bude tano odreeno vreme, moete izabrati Pulse High ili Pulse Low akciju. U tom sluaju trebate odrediti i eljenu duinu impulsa datu u vremenu ili broju instrukcijskih ciklusa. Poetak impulsa se takoe odreuje klikom na Fire polje pored eljenog pina. U asinhronom tabu potrebno je u eljenom trenutku fiziki kliknuti na polje za pokretanje odreenih opcija. U Register Injection tabu eljeni trenutci promene stanja pinova (bitova) mogu se definisati eksternim fajlom, a u Register Trace tabu moe se definisati eksterni fajl koji e snimati stanje odreenih bitova po unapred zadatim kriterijumima. Clock Stimulus tabom definiu se logika stanja pinova koja e se javljati u tano odreenim trenutcima. Za sloenija stanja, morao bi se koristiti Register Injection tab. Pin / Register Actions i Advanced Pin / Register tabovima definiu se sloenije akcije koje e se odvijati po promeni ili dostizanju unapred zadatog stanja bita ili registra. Za poetak, koristite jedino asinhroni tab. U sledeem poglavlju nauiete kako se programska memorija mikrokontrolera moe efikasnije iskoristiti.
28
Najpre je ubaena vrednost 0x04 u W registar, zatim je prosleena na PORTA da bi se ukljuila LED. Da bi se iskljuila obrisan je W registar, i ponovo je njegova vrednost prosleena na PORTA. Izmeu ovih rutina pozivan je potprogram za kanjenje da bi se moglo primetiti da LED treperi. Znai dva puta su prebacivana 2 seta podataka (jednom u W registar, a onda u PORTA) i dva puta je pozivan potprogram (jednom nakon ukljuenja i jednom nakon iskljuenja LED). Kako se ovo moe efektnije reiti? Koristei logiku operaciju zvanu XOR. XOR (eng. Exclusive Or) operacija izvrava logiku operaciju ekskluzivno ili na registru koji odredite, sa vrednou koju mu date. Trebalo bi ovo malo bolje objasniti. XOR 0 0 1 1 0 1 0 1 0 1 1 0 00101110 XOR 10010110 = 10111000 Rezultat XOR operacije e biti logika 1 samo ukoliko su mu oba operanda razliita. Ukoliko su ista (obe 0 ili obe 1), rezultat e biti logika 0.
XOR (kao i sve ostale logike instrukcije) se moe izvriti jedino nad celim bajtovima, pri emu se vodi rauna o njihovom poloaju. LSB bit rezultata sadrae rezultat XOR operacije nad LSB bitovima prvog i drugog operanda.
29
Uoavate li da XOR operacijom nad bitom koji je stalno na logikoj 1 i prethodnim stanjem bita menja stanje rezultata sa 0 na 1 i sa 1 na 0? I 00000000 XOR 00000001 = 00000001 II 00000001 XOR 00000001 = 00000000
Ta specifinost XOR operacije moe biti iskoriena za naizmenino ukljuivanje i iskljuivanje LED. Jo jedna interesantna osobina XOR operacije je da bilo koja vrednost dva puta XORovana istim brojem vraa originalnu vrednost. I 00101110 XOR 10010110 = 10111000 II 10111000 XOR 10010110 = 00101110
XOR operacija moe se nai u instrukcijama PIC16F84 u dva oblika. 1. XORLW k gde se XOR operacija izvrava nad W i konstantnom vrednou k. Vrednost k mora biti u opsegu od 0 do 255 (0x00 0xFF). Rezultat operacije e biti u W registru. 2. XORWF f,d gde se XOR operacija izvrava nad W i vrednosti unutar registra ija je adresa oznaena sa f. Sa d je oznaeno gde e biti smeten rezultat XOR operacije. Ukoliko je d=0, rezultat e biti u W registru, a ukoliko je d=1, rezultat e biti smeten u f registru. Upotrebom ove instrukcije su za naizmenino ukljuenje i iskljuenje LED dovoljne samo dve linije kda: movlw xorwf b'00000100' PORTA,F ; b'00000100' u W ; Promeni stanje bita 2 u PORTA registru
Ovde je vrednost 0x04 (b'00100') XOR-ovana sa ranijim sadrajem porta A. Ukoliko je bit 2 u portu A bio 1, postae 0, a ukoliko je bio 0 postae 1. ak nema ni potrebe za inicijalizacijom vrednosti u portu A. Zbog ega? Pa ukoliko je njegov bit 2 bio 0, promenie se. Ukoliko je bio 1, opet e se promeniti. Meutim, nedostatak inicijalizacije porta A moe uticati na stanje ostalih pinova, tako da je ona svakako preporuljiva. Iako je direktna manipulacija nad portovima sasvim mogua, direktno menjanje PORTA (ili PORTB) registra ne spada u dobru programersku praksu. Zbog ega? Zbog internog RMW (eng. Read Modify Write) ciklusa mikrokontrolera. RMW ciklus znai da mikrokontroler prilikom promene stanja nekog od bitova odgovarajueg registra najpre oita ceo registar (svih 8 bitova), zatim izvri eljenu operaciju nad njim, i na kraju vrati rezultat u taj isti registar. 30
Zamislite da je korisnik reio da izvue LED na neko udaljenije mesto (kao to mnogi izvlae signalizaciju jeftine struje sa strujomera). Kablovi preko kojih je povezana LED ponaaju se usled svoje velike duine i male daljine jedan od drugog kao kondenzator male kapacitivnosti. Zato je ukoliko elite brzo ukljuiti i iskljuiti LED mogue da ona neposredno nakon ukljuenja ne zasvetli zbog previe male otpornosti na njenim vodovima (dok se takav virtuelni kondenzator ne napuni). Ukoliko odmah po ukljuenju oitate stanje sa PORTB registra, videete da LED i dalje nije ukljuena. PORTB (i PORTA) se pri oitavanju stanja ponaaju kao da su povezani kao ulazi, bez obzira na ranije konfigurisano stanje pinova. To moe dovesti do oitavanja pogrenog stanja, a samim tim i nepravilnog rada programa. PIC je hardverski konstruisan tako da je mogue ak i da se oitavanje stanja sa portova moe zavriti i pre ranije zadate promene njihovih stanja. Zbog toga je pouzdanije sve operacije izvravati nad odreenim registrom opte namene (obino se taj registar naziva shaddow registar (eng. Shaddow senka)), a tek onda kada je to neophodno kopirati rezultat iz njega u odgovarajui port. Vie o shaddow registrima moete nauiti na http://www.piclist.com/tecHREF/readmodwrite.htm sajtu. Pogledajte sada novi asemblerski kd. Prvi je originalni program za treperenje LED, a u drugom je dodat prekida. U oba programa kao shaddow registar upotrebljen je W registar, jer se njegovo stanje ne menja u ostalim delovima programa. Da se menja, koristio bi se neki od registara opte namene. Treptua LED ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. BROJAC1 equ 0x0C ; Prvi broja petlje. Inicijalno 0xFF BROJAC2 equ 0x0D ; Drugi broja petlje. Inicijalno 0xFF org 0x00 ; ****** Inicijalizacija i podeavanje porta ****** bsf STATUS,RP0 ; Banka 1 clrf TRISA ; Postavlja sve pinove clrf TRISB ; kao izlazne. bcf STATUS,RP0 ; Banka 0 clrw ; W je inicijalizovan na 0x00 ; ****** Ukljuenje i iskljuenje LED ****** Poc xorlw b'00000100' ; Promeni stanje bita 2 u W registru movwf PORTA ; Kopiraj W u PORTA ; ****** Pauza ****** call Pet ; ****** Pauza zavrena. Vrati se na poetak programa ****** goto Poc ; Vrati se na poetak
31
; ****** Potprogram za kanjenje od oko 0,2S ****** Pet decfsz BROJAC1,F ; Ove dve petlje slue za brojanje nadole od goto Pet ; 255 do 0, 255 puta, omoguavajui da se decfsz BROJAC2,F ; moe primetiti kako LED treperi goto Pet return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa
Treptua LED sa prekidaem ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. BROJAC1 equ 0x0C ; Prvi broja petlje. Inicijalno 0xFF BROJAC2 equ 0x0D ; Drugi broja petlje. Inicijalno 0xFF org 0x00 ; ****** Podeavanje porta ****** bsf STATUS,RP0 movlw b'00000001' movwf TRISA clrf TRISB bcf STATUS,RP0 clrw ; Banka 1 ; Stavi b'00001' u TRISA. Tako je bit 0 ; porta A ulazni, a bit 2 izlazni. ; Svi pinovi na portu B su izlazni. ; Banka 0 ; W je inicijalizovan na 0x00
; ****** Ukljuenje i iskljuenje LED ****** Poc xorlw b'00000100' ; Promeni stanje bita 2 u W registru movwf PORTA ; Kopiraj W u port A ; ****** Proveri da li je prekida zatvoren ****** btfsc PORTA,0 ; Uzmi vrednost sa pina RA0. Ukoliko je 0 ; preskoi prvu pauzu. Ukoliko je 1 proi kroz call Pet ; obe pauze, kao da se nita ne dogaa ; ****** Dodavanje jo jedne pauze ****** call Pet ; Ova pauza se uvek izvrava ; ****** Pauza zavrena. Vrati se na poetak programa ****** goto Poc ; Vrati se na poetak
32
; ****** Potprogram za kanjenje od oko 0,2S ****** Pet decfsz BROJAC1,F ; Ove dve petlje slue za brojanje nadole od goto Pet ; 255 do 0, 255 puta, omoguavajui da se decfsz BROJAC2,F ; moe primetiti kako LED treperi goto Pet return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa
Nadam se da ste uoili da je upotrebom novih instrukcija prilino smanjena veliina programa. Da biste lake uoili ovu razliku, ispod su prikazni nazivi programa, izmene koje su izvrene, i njihove veliine. Program Treptua LED Treptua LED Treptua LED LED sa prekidaem LED sa prekidaem Izmena Veliina (instrukcija) 18 17 14 22 17
Original Dodat potprogram Dodata ekskluzivno ili funkcija Original Dodata ekskluzivno ili funkcija
Vidite da ste ne samo nauili nove instrukcije, ve ste i smanjili veliinu programa.
33
Kao i XOR i AND operacija se moe nai u dva oblika. 1. ANDLW k koja izvrava AND operaciju nad registrom W i konstantnom vrednou k. Rezultat operacije e biti u W registru. 2. ANDWF f,d koja izvrava AND operaciju nad vrednou W i vrednou f registra. Sa d je oznaeno gde e biti smeten rezultat operacije. Ukoliko je d=0, rezultat e biti u W registru, a ukoliko je d=1, rezultat e biti u f registru. Sledi IOR operacija: IOR 0 0 1 1 0 1 0 1 0 1 1 1 01101011 IOR 10100101 = 11101111 Rezultat IOR operacije bie logika 1 ukoliko je bar na jednom operandu prisutna logika 1. Ukoliko su oba na logikoj 0, i rezultat e biti jednak logikoj 0.
I ona se javlja u dva oblika. 1. IORLW k koja izvrava IOR operaciju nad registrom W i konstantnom vrednou k. Rezultat operacije e biti u W registru. 2. IORWF f,d koja izvrava IOR operaciju nad vrednou W registra i f registra. Ukoliko je d=0, rezultat e biti u W registru, a ukoliko je d=1, rezultat e biti u f registru. Zadnja logika operacija koju podrava PIC16F84 je komplement. COM 0 1 1 0 COM 01101011 = 10010100 Komplement, negacija ili invertovanje je logika operacija u kojoj svaki bit unutar bajta menja svoje stanje. 34
Za razliku od ostalih logikih operacija komplemen se izvrava nad samo jednim bajtom. Zbog toga ova operacija ima samo jedan oblik instrukcije. COMF f,d instrukcijom se invertuju svi bitovi u registru f. Ukoliko je d=0 rezultat e biti u W, a ukoliko je 1 u f registru. Verovatno uoavate da ste ovu logiku operaciju mogli upotrebiti u ranijem programu umesto XOR. Jedina razlika je u tome to bi se onda invertovali svi bitovi PORTA registra, a ne samo onaj koji je potreban. Slino kao XOR operacija, duplo komplementovana vrednost vraa originalnu: I COM 01101011 = 10010100 II COM 10010100 = 01101011
Sve do sada nauene logike operacije menjaju vrednost bita 2 STATUS registra u sluaju da je rezultat njihove operacije jednak nuli. Kako je bit 2 po tome specifian on ima svoju posebnu oznaku nulti bit (eng. Zero flag). Termin flag koristi se za oznaavanje bitova koje mikrokontroler sam setuje ili resetuje u zavisnosti od svog trenutnog stanja (u ovom sluaju rezultata prethodne logike instrukcije). Dakle ukoliko je rezultat XOR operacije sledei: XOR = 00011010 00011010 00000000
Zero flag STATUS registra e biti setovan. Ovo se moe iskoristiti za brzo poreenje vrednosti u registru tako to se u W registar postavite eljeni oblik bitova a onda izvri XOR operaciju nad njim i eljenim registrom. Ukoliko je stanje unutar registra jednako stanju u W registru, Zero flag e biti setovan. Iako nema mnogo smisla Zero flag moete setovati ak i operacijom komplementovanja. COM = 11111111 00000000
U prilogu ovog uputstva moete videti uporedni prikaz instrukcija u kome je navedeno koje sve instrukcije menjaju stanje Zero flaga.
35
13. Rotacija
RLF (Rotate Left f Through Carry) instrukcija rotira ulevo bitove unutar zadatog registra. Sintaksa instrukcije je sledea: RLF f,d pri emu je f registar nad ijim sadrajem se obavlja rotacija. Ukoliko je d=0, rezultat operacije e biti u W registru, a ukoliko je d=1, rezultat e biti u registru f. ta radi ova instrukcija? Ukoliko npr. u registru 0x0C imate vrednost b'00011001' nakon instrukcije RLF 0x0C,F registar 0x0C e dobiti vrednost b'00110010'. Nakon jo jedne iste instrukcije u registru e biti vrednost b'01100100'. Kao to vidite ova instrukcija rotira sadraj registra ulevo. A ta kada 1 doe do kraja pitate se vi. Nee se izgubiti. Za vreme rotacije ulevo MSB se smeta se u tzv. bit prekoraenja (eng. Carry flag). On se nalazi na mestu bita 0 STATUS registra.
Dakle kada jedinica doe do kraja, dogaa se sledee: Carry flag 0 0 1 0 0 Bitovi 0x0C registra 76543210 01000000 10000000 00000000 00000001 00000010 .
Vidite da je Carry flag ovde iskorien kao osmi bit registra. Ukoliko vam je to potrebno moete ubaciti 0 ili 1 u Carry flag pre rotacije instrukcijama bsf STATUS,C i bcf STATUS,C (C je imenovani bit 0 STATUS registra). Tako e se vrednost iz Carry flaga pojaviti na bitu 0 nakon rlf instrukcije. Preporuljivo je ovo uraditi neposredno pre rotacije kako na bitu 0 nakon rotacije ne bi dobili nepoznatu vrednost. Ne utie samo RLF instrukcija na Carry flag. Interensantno je da se rotacijom ulevo (sa prethodno resetovanim Carry flagom) broj unutar registra mnoi sa 2. C 0 0 1 76543210 01011001 10110010 01100100 = = = 89 178 356 (raunajui i Carry flag)
Ukoliko vam je potrebno mnoenje sa 2 veih brojeva moete koristiti uzastopnu rotaciju dva ili vie registra. Carry flag iz prvog registra prenee se na poetak drugog. Kada ve postoji instrukcija za rotaciju ulevo, logino bi bilo da postoji i instrukcija za rotaciju bitova udesno. Postoji! 36
RRF (Rotate Right f Through Carry) Sintaksa instrukcije je ista kao i kod RLF. Kako se rlf instrukcijom sadraj u registru mnoi sa 2, rrf instrukcijom (i resetovanim Carry flagom) se sadraj registra deli sa 2. LSB se premeta u Carry flag po sledeem: Carry flag 0 0 1 0 Bitovi 0x0Ch registra 76543210 00000010 00000001 00000000 10000000
Instrukcije RLF i RRF mogu se upotrebiti za simulaciju treeg svetla. U tom sluaju mogui algoritam bi bio: SPORTB equ rlf movf movwf 0x0C SPORTB,F SPORTB,W PORTB ; Rotacija u SHADDOW registru ; Kopiranje iz SHADDOW u W ; Kopiranje iz W u PORTB.
Instrukcija movf f,d. (eng. Move f) vrednost iz registra f prebacuje u W (pri d=0) ili u taj isti registar f (pri d=1). Zbog ega bi iko eleo da sadraj registra upie u taj isti registar? U praksi se ta mogunost koristi jedino pri testiranju sadraja registra na vrednost 0x00, jer movf instrukcija utie na Zero flag. Sledeom emom ilustrovana je upotreba logikih i instrukcija rotacije:
37
Upotreba logikih i instrukcija rotacije ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. DATA equ 0x0C ; Registar za privremene podatke org 0x00 ; ****** Podeavanje porta ****** bsf STATUS,RP0 movlw b'00000011' movwf TRISA clrf TRISB bcf STATUS,RP0 ; Prebacuje program u BANK1 ; Stavi b'00011' u TRISA. Tako su bit 0 i ; bit 1 ulazni, a bit 2 izlazni. ; Svi pinovi na PORTB su izlazni. ; Vraa program u BANK0
; ****** Testiranje prekidaa ****** Poc rlf PORTA,W ; Rotiraj sadraj PORTA i stavi rezultat u W ; registar, Tako je bit 0 doao na mesto bita 1 xorwf PORTA,W ; Izvri XOR nad PORTA i W registrom, ; i stavi rezultat u W (interesuje nas ; XOR nad bitom 1 ova dva registra). ; ****** Prebacivanje rezultata na izlaz ****** movwf DATA ; Premesti sadraj iz W u DATA jer se rotacija ; ne moe izvriti direktno nad W registrom rlf DATA,W ; Rotiraj sadraj. Tako je bit 1 doao na mesto ; bita 2 (na mesto izlaznog bita) i vrati rezultat ; u W registar. movwf PORTA ; Stavi rezultat u PORTA. Kako su bit 0 i bit 1 ; ulazni, nee reagovati, a na bitu 2 e se ; pojaviti rezultat XOR operacije nad ; postavljenim stanjem prekidaa. goto Poc ; Povratak na poetak. ; ****** Kraj ****** end ; Kraj programa.
Kompajlirajte program, programirajte PIC i isprobajte njegov rad. Iz komentara se moe lako zakljuiti ta program radi. Evo ta e se dogoditi u programu u sluaju da su oba prekidaa zatvorena: PIC uzima vrednost iz PORTA. Kako su oba tastera pritisnuta ona je b'00011'. Ta vrednost se rotira, i postaje b'00110'. Rezultat se smeta u W registar. Dalje se izvrava ekskluzivno ili nad tom vrednou i trenutnom vrednou PORTA koji je i dalje b'00011'.
38
Sada se rezultat b'00101' prebacuje u privremeni registar DATA gde se rotira. Rotirana vrednost je b'01010', i ona se preko W registra smeta u PORTA. Kako su na PORTA bit 0 i bit 1 ulazni, vrednost koja e doi na njih bie ignorisana, a bit 3 nas ionako ne interesuje i njegova vrednost se moe ignorisati. Kao to vidite na kraju svega bit 2 sadri vrednost XOR operacije (u ovom sluaju 0). Kako je ovaj bit izlazni, LED nee svetleti. Moete proveriti rezultat funkcije pritiskanjem prekidaa po tablici XOR operacije. Program je napisan tako da inicijalna vrednost Carry flaga nema uticaja na njegovo izvravanje, pa njegovo brisanje ovde nije potebno. bitovi PORTA W posle rotacije PORTA W posle XOR PORTA posle rotacije 43210 00011 00110 00011 00101 01011
Kako je ovaj program dat kao ilustracija korienja instrukcija nema potrebe za ogranienjem setovanja bita 3 PORTA registra. U praksi taj pin ne bi bio povezan, ili bi se bit 3 maskirao. Prepravite sada program po sledeem: Umesto napiite xorwf andwf PORTA,W PORTA,W ; Izvri XOR nad PORTA i W ; Izvri AND nad PORTA i W
Program radi isto to i ranije, s tom razlikom to umesto XOR primenjuje AND operaciju. Pritiskanjem prekidaa moete videti da e LED svetleti jedino ukoliko su oba prekidaa (T1 i T2) zatvorena (na oba ulaza dovedena logika jedinica). Ukoliko u programu zamenite instrukciju ANDWF instrukcijom IORWF moete isprobati rad ove operacije. LED1 e svetleti ukoliko je ukljuen bar jedan prekida. A ukoliko upotrebite COMF instrukciju, LED e svetleti suprotno od stanja prekidaa T1 ignoriui stanje prekidaa T2. Do sada ste nauili 22 od 35 instrukcija. estitamo. To je vie od polovine.
39
Ukoliko vam je potrebna inkrementacija do veih vrednosti moete detektovati stanje Zero flaga, i onda pokrenuti sledei registar za inkrementaciju. Ili za jo vee brojeve moete kao u primeru sa praznom petljom staviti petlju unutar petlje. Instrukcija suprotna ovoj je DECF f,d (eng. Decrement f). Ova instrukcija smanjuje vrednost registra f za 1, odnosno dekrementuje ga. Sintaksa joj je ista kao kod INCF instrukcije. U sluaju da broja doe do 0 desie se sledee: Bitovi 76543210 00000001 00000000 11111111 11111110 STATUS Zero flag 0 1 0 0
Dva specijalna oblika ovih instrukcija su: DECFSZ f,d koju ste ve nauili u praznoj petlji i INCFSZ f,d (Increment f, Skip if zero) koja poveava sadraj registra f za 1 po istom principu kao INCF instrukcija, i koja preskae sledeu instrukciju u sluaju da je rezultat operacije jednak 0. Poc incfsz 0x0C,F goto Poc Nastavi odavde Ove instrukcije za razliku od obinih INCF i DECF ne utiu na Zero flag. ; Poveaj vrednost u registru 0x0C za 1, ; i vrati se na poetak. Ukoliko se nakon poveanja ; dobije 0, preskoi goto instrukciju i nastavi dalje.
40
ADD (eng. saberi) operacija sabira dva broja. Pogledajte kako se izvrava operacija sabiranja u binarnom brojnom sistemu: ADD 0 0 1 1 0 1 0 1 0 1 1 10 ADD = C 1 11001101 10111000 10000101 .205 .184 .389
Prilikom sabiranja dve logike 1 javlja se prenos u bit vee teine. Ukoliko ni MSB nije dovoljan za prenos, setovae se Carry flag.
Kod ovakvih sluajeva bit prekoraenja smeta se u Carry flag. Ukoliko je potrebno sabirati brojeve iji zbir moe biti vei od 255, Carry flag mora se uzeti u obzir pri prenosu u bajt vee teine. U instrukcijama za PIC operacija sabiranja ima dva oblika: ADDLW k sabira sadraj W registra i konstantne vrednosti k. Rezultat e se nai u W registru. ADDWF f,d sabira sadraj W registra i registra f. Sa d se odreuje gde e se nai rezultat. Aritmetike operacije sabiranja (i oduzimanja) pored Carry i Zero flaga utiu jo i na tzv. DC flag (eng. Digit Carry), odnosno bit 1 STATUS registra. On e biti setovan pri prekoraenju donjeg etvorobitnog dela bajta (tzv. nibla). Menja se po istom principu kao i Carry flag. C DC ADD = 1 1 1111 1111 0000 0001 0000 0000 ADD = C DC 0000 1111 0000 0001 0 1 0001 0000
Deljenje bajta na niblove ima smisla ukoliko je potrebno jednim niblom prikazivati jednu cifru, a drugim drugu (npr u digitalnom asovniku za minute gornji nibl od 0 do 5, a donji od 0 do 9). Uveanje samo gornjeg nibla reava se sabiranjem sa b'00010000'.
41
Kao to vidite, ovako postoji samo jednostruko predstavljanje broja 0. Takav postupak naziva se drugi komplement ili komplement dvojke. Raunanje drugog komplementa broja moe se izvriti sledeim algoritmom: comf BROJ,F incf BROJ,F ; Prvi komplement ; Dodaj broj 1
Runo pretvaranje pozitivnih u negativne brojeve najlake moete izvriti raunajui drugi komplement broja. Raunanje e vam biti utoliko lake ukoliko se prisetite obinog komplementovanja (ili invertovanja ako vam je tako lake). Drugi komplement predstavlja obian komplement kome je dodat broj 1. COM 01011011 10010000 + 1 = 10100101 +.91 -.91
Kao to vidite, MSB ima ulogu znaka (0-pozitivan, 1-negativan). Za prikazivanje rezultata ostaje vam jo 7 bitova, tako da se unutar osmobitnog bajta mogu nai pozitivni (0 do 127) i negativni (-1 do -128) brojevi. Ovakvi brojevi nazivaju se oznaenim, za razliku od obinih neoznaenih (0-255) brojeva. Zato je bitno unapred odrediti da li ete raditi sa oznaenim ili neoznaenim brojevima. Granice oznaenih brojeva ne smeju se prekoraiti, jer PIC ne pravi razliku izmeu oznaenih i neoznaenih brojeva, pa moe doi do netanog rezultata operacije. Operacija suprotna sabiranju je SUB (eng. Substract) oduzmi. Oduzimanje se unutar mikrokontrolera izvrava upravo sabiranjem prvog broja sa komplementom dvojke drugog broja. Za razliku od sabiranja, kod koga se Carry flag setuje pri prekoraenju, kod oduzimanja je primenjena negativna logika, tako da je Carry flag setovan ukoliko nema prekoraenja (tanije pozajmice). Znai kod oduzimanja manjeg broja od veeg (i u sluaju da su brojevi jednaki), Carry flag e biti setovan. Njegovo stanje se tada treba ignorisati. Pogledajte to na sledeem primeru: 100-55. 42
C 1
+.55 -.55
00110111 11001001
Kod oduzimanja veeg od manjeg broja, prilikom sabiranja sa komplementom dvojke nema prekoraenja, pa se Carry flag ne setuje. Pogledajte to na primeru: 56-87. +.56 +(-.87) = -.31 C 0 00111000 10101001 11100001 +.87 -.87 01010111 10101001
Testiranjem MSB moete utvrditi da li je oznaeni rezultat pozitivan ili negativan, a testiranjem Zero flaga da li je rezultat 0. Isto kao i sabiranje, i instrukcija za oduzimanje moe se javiti u dva oblika. SUBLW k oduzima sadraj W registra od konstantne vrednosti k. Rezultat e se nai u W registru. SUBWF f,d oduzima sadraj W registra od registra f. Sa d se odreuje gde e se nai rezultat. Ukoliko Vam je oduzimanje i testiranje Carry flaga naporno, uradite isto to i mikrokontroler. Saberite jedan broj sa drugim komplementom dvojke drugog broja. Ukoliko se rotacijom izvrava mnoenje ili deljenje sa 2 nad oznaenim brojevima, obavezno se mora obratiti panja na MSB, jer on oznaava pripadnost pozitivnim, odnosno negativnim brojevima. U praksi se retko kada sree potreba za primenom oznaenih brojeva. Skoro sve operacije izvravaju se nad neoznaenim brojevima. Oznaeni brojevi mogli bi imati primenu u funkciji mikrokontrolera kao termometra, kada je potrebno izmeriti i prikazati temperature iznad i ispod nule.
43
Kod mikrokontrolera nema sivog stanja. Stanje na njegovom pinu mora biti ili crveno ili belo (navijam za Zvezdu). Ukoliko se ulaznom pinu mikrokontrolera dovede ovako nedefinisan napon, on moe proitati 0, a moe i 1. Nema pravila. Ukoliko ulazni pin (u najgorem moguem sluaju) nije povezan na eksterno kolo, napon na njemu moe zaoscilovati, pa ak prouzrokovati unitenje mikrokontrolera. U praksi se nekad javi situacija da je potrebno na mikrokontroler dovesti upravo ovakav sivi napon. U tom sluaju poeljno je koristiti uzlaze sa mitovim okidaem (eng. Schmitt trigger), ili ih dodati eksterno (npr. preko 7414 estostrukog invertora). U PIC16F84 mitov okida nalazi se na RA4 pinu. Na RB0 pinu nalazi se samo kada je ovaj definisan kao izvor interapta (vie o njima kasnije). Kod ulaza sa mitovim okidaem nema nedefinisanih stanja ulaznog pina. Stanje na pinu promenie se tek kada se signal dovoljno priblii njegovoj definisanoj oblasti. Ako se nakon toga vrati ka srednjoj (sivoj) oblasti, ulaz e i dalje javljati njegovo poslednje stabilno definisano stanje. Vie o ovome imate na sajtu http://en.wikipedia.org/wiki/Schmitt_trigger. Oigledno je da e pri povezivanju taster prekidaa na ulaze PIC16F84 mikrokontrolera biti potrebno da njegovi ulazi budu u svakom trenutku na tano definisanom logikom nivou. Ovo se hardverski realizuje Pull-up (povui nagore) ili Pull-down (povui nadole) otpornicima. Pull up otpornik je otpornik povezan izmeu napona napajanja mikrokontrolera i ulaznog pina, pri emu se taster prekida vezuje izmeu pina i mase. Kada je taster otputen, pull up otpornik dovodi napon napajanja direktno na pin, postavljajui ga tako u stanje logike jedinice, sve dok se ne pritisne taster. Bez njega bi napon na pinu verovatno zaao u nedefinisano stanje. Ovaj otpornik ne treba biti previe male vrednosti zbog manje potronje struje pri pritisnutom taster prekidau. Preporuene vrednosti su od 4,7k do 10k. Na isti nain na eljeni pin mikrokontrolera moe se postaviti pull down otpornik prema masi, kada bi se prekida postavio prema naponu napajanja, to je ilustrovano u ranijim emama. Vie o pull-up otpornicima moete saznati na http://en.wikipedia.org/wiki/Pull-up_resistor. Postavljanje eksternih pull up otpornika komplikuje izradu tampane ploice. Stoga su na pinovima PORTB registra oni hardverski implementirani, a ukljuuju se resetovanjem bita 7 (Port B Pull Up) OPTION_REG registra. Primeujete da je ovo suprotno od onoga to biste mogli oekivati! Zato se takvi nelogini bitovi oznaavaju sa crticom iznad njih ili NOT_ predznakom. To oznaava da je logika 0 njihovo aktivno stanje. Resetovanjem NOT_RBPU bita povezuju se interni otpornici mikrokontrolera na svaki od ulaza PORTB registra prema naponu napajanja mikrokontrolera. Interni otpornici spajaju se na sve ulazne pinove porta B. Pored te, OPTION_REG registar ima i razne druge funkcije, pa je stoga najpraktinije ne menjati sadraj njegovih ostalih bitova. Jo jedna stvar vredna panje je elekrtomagnetna interferencija. Da bi se zatitili od nje, poeljno je na svaki pin pre bilo kakvog hardvera povezati redni otpornik. 45
46
; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. BROJ equ 0x0C ; Promenljiva za broj koji se prikazuje (0x00-0x09) BROJAC equ 0x0D ; Broja za pauzu. Inicijalno 0xFF org 0x00 ; ****** Podeavanje porta ****** bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw 0x01 ; Konfigurie pinove tako da su RB1 do movwf TRISB ; RB7 izlazni, a da je RB0 ulazni. clrf TRISA ; Svi pinovi na PORTA su izlazni. bcf OPTION_REG,NOT_RBPU ; Ukljueni interni pull up ; otpornici na PORTB bcf STATUS,RP0 ; Vraa program u BANK0 ; ****** Inicijalizacija ****** Ini clrf BROJ call Disp ; Postavljanje na 0 ; Prikaz broja na displeju
47
; ****** Testiranje prekidaa ****** Cek1 btfss PORTB,0 ; Testiranje otputenosti prekidaa goto Cek1 ; Nije otputen call Pau ; Jeste otputen. Pozovi pauzu. btfss PORTB,0 ; Jo jedno testiranje zbog imunosti na goto Cek1 ; eventualna varnienja kontakta. Cek2 btfsc PORTB,0 ; Testiranje pritisnutosti prekidaa goto Cek2 ; Nije pritisnut call Pau ; Jeste pritisnut. Pozovi pauzu. btfsc PORTB,0 ; Jo jedno testiranje zbog imunosti na goto Cek2 ; eventualna varnienja kontakta. ; ****** Brojanje ****** movlw 0xF6 addwf BROJ,W btfsc STATUS,C goto Ini incf BROJ,F call Disp goto Cek1 ; .246 u W (.246+.9+.1 = setovan Carry flag) ; Saberi sa BROJ, rezultat u W ; Da li je dolo do prekoraenja (Carry flag)? ; Jeste, resetuj broja ; Nije, uveaj broja, ; prikai rezultat i. ; nastavi sa testiranjem i brojanjem
; ****** Potprogram za prikaz na LED displeju ****** Disp call Tabl ; Obrazac za prikaz u W movwf PORTB ; Prikai na displeju return ; Povratak iz potprograma ; ****** Tabela ****** Tabl movf BROJ,W ; U promenljivoj BROJ nalazi se vrednost od addwf PCL,F ; .0 do .9. Ta vrednost se dodaje na PCL. retlw b'01111110' ; Obrazac za crtanje cifre 0 - 0 retlw b'00001100' ; Obrazac za crtanje cifre 1 - 1 retlw b'10110110' ; Obrazac za crtanje cifre 2 - 2 retlw b'10011110' ; Obrazac za crtanje cifre 3 - 3 retlw b'11001100' ; Obrazac za crtanje cifre 4 - 4 retlw b'11011010' ; Obrazac za crtanje cifre 5 - 5 retlw b'11111010' ; Obrazac za crtanje cifre 6 - 6 retlw b'00001110' ; Obrazac za crtanje cifre 7 - 7 retlw b'11111110' ; Obrazac za crtanje cifre 8 - 8 retlw b'11011110' ; Obrazac za crtanje cifre 9 - 9 ; ****** Pauza ****** Pau decfsz BROJAC,F goto Pau return ; ****** Kraj programa ****** end ; Pauza zbog debouncing ; rutine ; Povratak iz potprograma ; Kraj programa.
48
Duplim testiranjem pritisnutosti taster prekidaa sa pauzom izmeu testiranja realizovana je debouncing rutina. Testiranje na otputenost, a zatim na pritisnutost spreava nastavak brojanja ukoliko se prekida neprekidno dri pritisnut, i omoguava promenu stanja prilikom pritiska, a ne prilikom otpusta tastera. Testiranje prekoraenja realizovano je sabiranjem vrednosti sa brojem 246 i testiranjem Carry flaga. Za vrednosti od 0 do 9 sabrane sa .249 Carry flag nee biti setovan, ali hoe za vrednosti vee od njih (.10). One e prouzrokovati ponovnu inicijalizaciju brojaa, i ciklus brojanja e ponovo poeti od 0. Prikaz dekadnog broja realizovan je direktnim dovoenjem napona na pojedine segmente LED displeja. Ovi segmenti su na LED displeju oznaeni su slovima a, b, c, d, e, f i g. Segment dp (eng. decimal point) decimalna taka ovde nije iskorien. Iako je program je napravljen za rad sa displejem sa zajednikom katodom, moe moe se prepraviti za rad sa displejem sa zajednikom anodom prepravkom tabele na taj nain to se svi bitovi u tabeli (LSB nema uticaja na rad programa jer je pin RB0 povezan na taster) invertuju: retlw retlw retlw b'01111110' b'00001100' b'10110110' ; 0 promeniti u b'10000001' ; 1 promeniti u b'11110011' ; 2 promeniti u b'01001001'
U tom sluaju potrebno je prepraviti elektrinu emu tako da se zajednika anoda povee na +5V. U potprogramu za prikaz moete videti klasian primer pozivanja drugog potprograma iz prvog. MPLAB asembler ima direktivu DT (eng. Define Table) kojom se mogu bre unositi eljene vrednosti u tabelu. Njen oblik je sledei: addwf PCL,F ; Saberi sa PCL dt d'10', d'18', d'0', d'253', d'84', d'5' ; Vrednosti Iako na prvi pogled deluje da se na ovaj nain tedi memorija mikrokontrolera, to nije sluaj. Asembler e dt direktivom naredne memorijske lokacije napuniti retlw instrukcijama koje sadre vrednosti navedene iza direktive. Pri tome se mogu primenjivati svi naini oznaavanja brojeva (decimalni, heksadecimalni...). Ova pogodnost najvie dolazi do izraaja pri upisivanju ASCII karaktera: addwf PCL,F ; Saberi sa PCL dt Proba ispisa teksta ; ASCII karakteri u tabeli U radu sa tabelama morate obratiti panju na dve stvari. 1. Morate biti sigurni da je broj koji sabirate sa PCL u tano odreenim granicama. U sluaju prekoraenja izvravanje programa e se nastaviti sa sluajne memorijske adrese to e prouzrokovati nepravilan rad ili blokadu programa.
49
2. Kako je PC trinaestobitni registar iji donji deo (0-255) je u PCL, a gornji (>255) u bitovima 0-5 PCLATH, potrebno je osigurati da tabela ne izae iz bloka od 256 bajtova. Kod programa navedenog kao primer, to nije problem, jer je on ionako dug samo 43 bajta. Ukoliko je neophodno koristiti tabele sa veom koliinom podataka, reenje bi moglo biti u postavljanju vie tabela. Veliinu bloka najjednostavnije moete proveriti brojanjem upotrebljenih instrukcija (bez direktiva), ili analizom .lst fajla generisanog prilikom asembliranja. Za postavljanje poetka tabele na eljeno mesto (poetak bloka) moete koristiti ORG direktivu. Umesto tabele mogue je napraviti skok na proraunate memorijske lokacije addwf PCL,F instrukcijom, pri emu se adresa na koju se treba skoiti uva u W registru u obliku broja instrukcija koje se trebaju preskoiti da bi se dolo do eljene. Ogranenja vezana za tabele vae i u ovom sluaju. Da biste ih prevazili, pogledajte AN548 sa http://www.microchip.com/.
50
51
Upamtite da su ova vremena nezavisna od takta oscilatora mikrokontrolera. Mislite o ovim vremenima kao stvarnim (eng. real time), nasuprot taktu mikrokontrolera koji moete menjati fizikom zamenom par delova u oscilatoru. Pretpostavimo da elite da WDT resetuje PIC nakon pola sekunde. Najblia standardna vrednost je 576mS, odnosno 0,576S, pa je dovoljno poslati vrednost b101 u OPTION_REG registar. movlw movwf b'101' 0x81 ; Ovo je 0x05 ; Adresa OPTION_REG registra.
Meutim nije ba sve tako jednostavno. Po inicijalizaciji PIC-a postskaler je pridruen internom tajmeru mikrokontrolera (vie o njemu kasnije). To znai da je potrebno prebaciti ga na WDT. Kako i interni i watchdog tajmer koriste iste bitove OPTION_REG registra Microchip preporuuje sledeu proceduru kako ne bi dolo do nehotinog reseta PIC. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC org 0x00 ; Podeava konfiguracione bitove. ; ****** Podeavanje WDT ****** * bsf STATUS,RP0 * movlw b'xx0x0111' * movwf OPTION_REG * bcf STATUS,RP0 clrf TMR0 bsf movlw movwf clrwdt movlw movwf bcf STATUS,RP0 b'xxxx1111' OPTION_REG b'xxxx1xxx' OPTION_REG STATUS,RP0 ; Obrii WDT ; Izaberi WDT, i postavi zeljeni odnos ; preskalera xxx. ; Za 0,576S to je b'xxxx1101' ; BANK0 ; BANK1 ; Izaberi tajmer i preskaler razliit od 000 ; BANK0 ; Brisanje vrednosti internog tajmera i ; preskalera pri upisu u tajmer, ; BANK1 ; Izaberi WDT, bez menjanja odnosa ; preskalera
U sluaju eljenog odnosa razliitog od 1:1 (vrednost preskalera 000) mogu se izbaciti instrukcije oznaene zvezdicom. Vrednosti u OPTION_REG registru levo od preskalera oznaene sa x imaju specijalne funkcije (poput ukljuenja Pull-Up otpornika) koje ete nauiti u delu sa tajmerom i interaptima. Iz tog razloga im ovde nisu dodeljene konkretne vrednosti. Za sada je dovoljno da znate da se bitom 3 OPTION_REG registra vri selekcija tajmera kome e biti pridruen delitelj po sledeem: 1 postskaler WDT 0 preskaler internog tajmera. 52
U primeru ste nauili upotrebu CLRWDT (eng. Clear Watchdog timer) instrukcije. Nakon nje, TO bit (eng. Time Out isteklo vreme) STATUS registra bie iznova setovan, a nai e se u resetovanom stanju jedino prilikom WDT reseta. Vie o tome nauiete u poglavlju sa reset funkcijom. Vreme izvravanja instrukcija Kao to se seate, PIC deli takt oscilatora sa 4. Ovo vreme naziva se instrukcijski ciklus. Ukoliko je kao izvor takta upotrebljen kristal od 4MHz, PIC e izvravati instrukcije brzinom od 4MHz/4=1MHz, odnosno za jednu instrukciju koja traje 1 instrukcijski ciklus e mu trebati 1S, dok e mu za instrukciju koja traje 2 instrukcijska ciklusa trebati 2S. Nain da zapamtite broj instrukcijskih ciklusa za sve instrukcije je prilino lak. Pretpostavite da sve instrukcije traju 1 instrukcijski ciklus. Ali, ukoliko instrukcija prouzrokuje nastavak programa sa neke druge adrese (promenjen je sadraj PC), onda e ona trajati 2 instrukcijska ciklusa. Na primer MOVWF instrukcija traje 1 instrukcijski ciklus, jer samo premeta podatak sa jednog na drugo mesto. GOTO instrukcija traje 2 ciklusa jer prouzrokuje da PC skoi na neko drugo mesto u programu. RETURN instrukcija traje 2 ciklusa, jer se PC vraa na glavni program. Meutim, postoje 4 instrukcije koje mogu trajati 1 ili 2 instrukcijska ciklusa. To su DECFSZ, INCFSZ, BTFSC i BTFSS. One e preskoiti sledeu instrukciju u sluaju da je odreeni uslov ispunjen i onda e trajati 2 ciklusa. Ukoliko taj uslov nije ispunjen, izvrie se naredna instrukcija kao da se nita nije ni desilo, i onda e trajati 1 ciklus. Pogledajte sada sledei program. movlw movwf decfsz goto end 0x02 BROJAC BROJAC,F Pet
Pet
Prva instrukcija postavlja vrednost 0x02 u W. Ovo ne prouzrokuje menjanje PC, pa ona traje 1 instrukcijski ciklus. Sledea instrukcija je slina. Ona takoe ne menja stanje PC, pa i ona traje 1 ciklus. Sada e sledea instrukcija izvriti prvo smanjenje registra BROJAC za 1 i rezultat testa na vrednost 0 = 0 pridruiti PC. Na ovaj nain PC se ne menja, pa instrukcija traje 1 ciklus. Sledea instrukcija je GOTO, i ona traje 2 ciklusa. Onda se ponovo vri smanjenje registra BROJAC za 1, ali kako je sada rezultat testa na vrednost 0 = 1, PC e promeniti svoju vrednost na PC+1, to troi 2 instrukcijska ciklusa. Znai ovaj program zauzee ukupno 7 instrukcijskih ciklusa. Uz kristal od 4MHz program e trajati 4MHz / 4takta = 1S po instrukcijskom ciklusu, to za 7 ciklusa iznosi 7 * 1S = 7S. Vidite koliko zbunjujui moe biti instrukcijski ciklus instrukcija uslovnog skoka. Softver programatora Seate se __CONFIG direktive? Za korienje WDT, on se mora preko nje ukljuiti sa WDT ON. A poto je neki programatori ignoriu, potrebno je i unutar njihovog softvera podesiti konfiguracione bitove. Postupak njihovog podeavanja razlikuje se od programatora, do programatora (softvera). Uglavnom se trai njihov upis neposredno pre programiranja mikrokontrolera. 53
Sledeim programom namerno se dozvoljava prekoraenje WDT. Njegov takt koristi se za treptanje LED. Primeujete da je LED povezana tako da svetli pri dovoenju logike 0 na pin, a da joj se napon dovodi direktno sa napajanja! To je bolje zbog manjeg grejanja i potronje. Osim toga PIC pored ogranienja struje po pojedinanim pinovima (20mA) ima i ogranienje struje koju moe dati ceo port (do 50mA za PORTA i do 100mA za PORTB), kao i ogranienje ukupne struje koju prima i kojom moe napajati eksterne potroae (150mA). PIC pri ovakvom povezivanju podnosi do 25mA po pinu, do 80mA za PORTA i do 150mA za PORTB. Za pin RA4 ovo je i jedino mogue reenje, jer on na svom izlazu ne moe dati logiku 1. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove. org 0x00 ; ****** Test WDT reseta ****** btfss STATUS,TO goto Led ; ****** Podeavanje porta ****** bsf STATUS,RP0 clrf TRISA clrf TRISA clrf TMR0 ; ****** Podeavanje WDT ****** bcf STATUS,RP0 clrf TMR0 bsf movlw movwf STATUS,RP0 b'10001111' OPTION_REG 54 ; Testiraj stanje TO bita ; Resetovan je, znai WDT reset ; Prebacuje program u BANK1 ; Svi pinovi ; su izlazni. ; Brisanje vrednosti internog tajmera i ; preskalera pri upisu u tajmer, ; Vraa program u BANK0 ; Brisanje vrednosti internog tajmera i ; preskalera pri upisu u tajmer, ; Prebacuje program u BANK1 ; Iskljui Pull-up otpornike i ; izaberi WDT, sa maksimalnim ; vremenom preskalera
; ****** Inicijalizacija W i prvo prekoraenje WDT ****** clrw ; Obrii W Pet goto Pet ; Mrtva petlja. Vrti se ovde do ; prvog WDT reseta ; ****** Naredna prekoraenja WDT ****** Led xorlw b'00000100' ; Izmeni stanje bita 2 u W movwf PORTA ; Prebaci stanje iz W u PORTA Pet2 goto Pet2 ; Mrtva petlja. Vrti se ovde do ; sledeeg WDT reseta ; ****** Kraj programa ****** end ; Kraj programa. Nakon poetne inicijalizacije program e se vrteti u prvoj mrtvoj petlji. Kako u njoj nema CLRWDT instrukcije, nakon 1,1S nastupie WDT reset. Po resetu program e se izvriti od poetka, ali e deo sa testiranjem TO bita detektovati je li nastupio WDT reset ili ne, i ukoliko jeste dalje izvravanje programa nastavie se od labele Led gde e se izmeniti stanje RA2 pina. Nestabilnost WDT oscilatora usled promene temperature moe biti efektno iskoriena za merenje temperature mikrokontrolera (samim tim i spoljne temperature) bez ikakvih eksternih senzora. Za detalje pogledajte AN828.
55
19. Tajmer
U sluaju da piete program koji mora imati veliku ali tano definisanu pauzu sigurno vam se nee svideti mogunost postavljanja jedne petlje unutar druge i proraunavanja broja ciklusa za eljenu duinu pauze. Postoji elegantniji nain reavanja ovog problema. PIC16F84 ima u sebi integrisan tajmer. Impulsi ovog tajmera mogu biti sinhronizovan sa taktom izvravanja instrukcija mikrokontrolera ili sa taktom eksternog oscilatora iji impulsi se dovode na pin 3 (RA4/T0CKI). Glavna funkcija tajmera je brojanje (.0-.255) koje je za razliku od WDT sinhronizovano sa ovim taktom. U trenutku prekoraenja maksimalne vrednosti, flag tajmera se setuje, i ciklus brojanja opet poinje od nule. Prednost tajmera nad obinom petljom za kanjenje je u injenici da je brojanje interni proces mikrokontrolera, i da ni na koji nain ne utie na brzinu izvravanja glavnog programa. Dovoljno je povremeno proveriti stanje flaga tajmera, kako bi program znao da je ciklus brojanja zavren. Kako na ovaj nain nije mogue dobiti vee periode, tajmer isto kao i WDT moe koristiti preskaler. Budui da se za korienje i WDT i internog tajmera preteno vri manipulacija nad OPTION_REG registrom, vreme je da se blie upoznate sa njegovom unutranjom strukturom. bit7 RBPU
INTEDG
T0CS
T0SE
PSA
PS2
PS1
bit0 PS0
NOT_RBPU (eng. Port B Pull Up) bit OPTION_REG registra slui za povezivanje internih otpornika PORTB registra na napon napajanja. Upotrebu INTEDG (eng. Interrupt edge) bita nauiete u sledeem poglavlju. T0CS (eng. Timer0 Clock Select) bit omoguava izbor takta tajmera. Ukoliko je resetovan, brojanje e se odvijati sinhronizovano sa taktom izvravanja instrukcija koji je etiri puta manji od takta oscilatora. Ovaj takt se moe dobiti sa CLKOUT pina mikrokontrolera. Ukoliko je T0CS bit setovan, brojanje e biti sinhronizovano sa eksternim taktom koji se treba dovesti na pin 3 (RA4/T0CKI).
T0SE (eng. Timer0 Source Edge) bit ima smisla jedino pri upotrebi eksternog takta. Njime se bira hoe li se brojanje vriti pri prelasku sa logike 0 na 1 (resetovan T0SE) ili sa logike 1 na 0 (setovan T0SE). PSA (eng. Prescaller Assigment) bit se koristi za selekciju pridruenosti preskalera. Ukoliko je setovan, postskaler e biti pridruen WDT, a ukoliko je resetovan preskaler e biti pridruen tajmeru. Bitovima PS0 do PS2 bira se odnos deljenja preskalera po sledeoj tablici.
56
Bit 2, 1, 0 0, 0, 0 0, 0, 1 0, 1, 0 0, 1, 1 1, 0, 0 1, 0, 1 1, 0, 1 1, 1, 1
TMR0 odnos 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256
WDT odnos 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128
Primeujete da se i ovde pominje WDT odnos. On je tu jer se odnos tajmera od 1:1 moe dobiti jedino pridruivanjem preskalera WDT, setovanjem PSA bita. Za takvo podeavanje primenjuje se kd opisan u prolom poglavlju sa instrukcijama oznaenim zvezdicama. Budui da se pri samom programiranju PIC16F84 vri ukljuenje ili iskljuenje WDT (podeavanjem konfiguracionih bitova), ne moe se doi u situaciju da se WDT sam ukljui, i tako izazove reset mikrokontrolera, iako mu je pridruen preskaler.
Registar tajmera TMR0 (eng. Timer0) nalazi se na adresi 0x01, a njegov flag T0IF (eng. Timer0 Overflow Interrupt Flag) nalazi se u INTCON registru. Vie o ovom registru nauiete u delu sa interaptima. Sledi program koji ilustuje upotrebu tajmera. On e instrukcijski ciklus preskalerom deliti sa 256, zatim softverski jo sa 6, a onda e heksadecimalne brojeve (0x00 do 0x0F) prikazivati na LED displeju. Deljenje sa dva se kao to se seate moe realizovati rotacijom bitova unutar registra. U programu e biti upotrebljen ranije ilustrovani princip prikaza na LED displeju. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove DISP equ 0x0C ; Promenljiva za broj koji se prikazuje ; na displeju (0x00-0x0F) DEL equ 0x0D ; Promenljiva za rotaciju ORG 0x00 ; Definie start programa ; ****** Inicijalizacija tajmera i displeja ****** clrf TMR0 ; Inicijalizacija tajmera clrf INTCON ; Brisanje flaga tajmera bsf STATUS,RP0 ; Prelazak u BANK1 clrf PORTA ; Postavlja sve pinove clrf TRISB ; kao izlazne movlw b'10000111' ; Tajmer je sinhronizovan sa ; instrukcijskim ciklusom, i preskaler je movwf OPTION_REG ; podeen za odnos 1:256 ; Pull up otpornici su iskljueni bcf STATUS,RP0 ; Povratak u BANK0
57
; ****** Inicijalizacija brojaa ****** Ini movlw 0x00 movwf DISP movlw b'00100000' movwf DEL
; ****** ekanje na prekoraenje tajmera ****** Taj bcf INTCON,T0IF ; Resetovanje flaga tajmera Cek btfss INTCON,T0IF ; ekanje na setovanje flaga tajmera, goto Cek ; odnosno prekoraenje tajmera ; ****** Deljenje sa 6 ****** rrf DEL btfss STATUS,C goto Taj ; Rotiraj DEL registar nadesno. Kada se Carry ; flag setuje, nastavi dalje. Ukoliko i dalje nije ; setovan, ekaj na jo jedan ciklus tajmera.
; ****** Prikaz cifre na displeju ****** call Tabl ; Uzmi obrazac iz tabele, movwf PORTB ; i prikai cifru na displeju. ; ****** Testiranje prekoraenja vrednosti cifre na displeju ****** movlw 0x01 ; .1 u W addwf DISP,F ; Saberi DISP sa W. Rezultat u DISP btfsc STATUS,DC ; Da li je dolo do prekoraenja vrednosti 0x0F? goto Ini ; Jeste, poni brojanje od poetka (cifre 0) goto Taj ; Nije, nastavi dalje sa brojanjem. ; ****** Tabela ****** Tabl movf DISP,W ; U promenljivoj DISP nalazi se vrednost od addwf PCL,F ; 0x00 do 0x0F. Ta vrednost se dodaje na PCL. retlw b'01111110' ; Obrazac za crtanje cifre 0 - 0 retlw b'00001100' ; Obrazac za crtanje cifre 1 - 1 retlw b'10110110' ; Obrazac za crtanje cifre 2 - 2 retlw b'10011110' ; Obrazac za crtanje cifre 3 - 3 retlw b'11001100' ; Obrazac za crtanje cifre 4 - 4 retlw b'11011010' ; Obrazac za crtanje cifre 5 - 5 retlw b'11111010' ; Obrazac za crtanje cifre 6 - 6 retlw b'00001110' ; Obrazac za crtanje cifre 7 - 7 retlw b'11111110' ; Obrazac za crtanje cifre 8 - 8 retlw b'11011110' ; Obrazac za crtanje cifre 9 - 9 retlw b'11101110' ; Obrazac za crtanje cifre A- A retlw b'11111000' ; Obrazac za crtanje cifre B - B retlw b'01110010' ; Obrazac za crtanje cifre C - C retlw b'10111100' ; Obrazac za crtanje cifre D - D retlw b'11110010' ; Obrazac za crtanje cifre E - E retlw b'11100010' ; Obrazac za crtanje cifre F - F ; ****** Kraj programa ****** end ; Kraj programa 58
Moda Vam izgleda udno upotreba sabiranja umesto inkrementovanja registra DISP. Svakako da se njegovo uveanje moglo izvriti i inkrementacijom, ali na ovaj nain lake je nakon poveanja testirati njegovo prekoraenje. Jedino instrukcije sabiranja i oduzimanja menjaju stanje DC flaga, i jedino pri prekoraenjima donjih niblova (tanije vrednosti 0x0F donjeg nibla). Za krae periode mogue je nakon svakog prekoraenja postaviti inicijalnu vrednost tajmera na npr. .100. U tom sluaju tajmer e brojati od .100 do .255, kada e se setovati njegov flag. Isto tako mogue je primeniti drugaiji pristup, pa inicijalizovati TMR0 na .0, i testirati ga na vrednost npr. .100. Povedite rauna o instrukcijama koje koristite za podeavanje tajmera, jer e veina instrukcija ije je odredite TMR0 registar obrisati preskaler.
59
Ukoliko elite koristiti vie eksternih izvora interapta, moete koristiti pinove RB4 do RB7. Oni se razlikuju od RB0/INT pina u tome to se interapt javlja pri promeni stanja na pinovima. To znai da e se interapt javiti pri prelasku sa logike 0 na logiku 1, ali i sa logike 1 na logiku 0. Podeavanje ovih pinova za izvore interapta vri se setovanjem bita 3 INTCON registra nazvanog RBIE (eng. Po rt B Change Interrupt Enable) ukljui interapte pri promeni stanja na portu B. Kako se kod njih interapt izvrava pri svakoj promeni stanja pinovi RB4 do RB7 nemaju svoj bit za odreivanje ivice signala pri kojoj e se izazivati interapt. Interapt flag Seate li se kako se vri setovanje Carry flaga? Pri nailasku na interapt na RB0/INT pinu na slian nain se setuje bit 1 (INTF eng.Interrupt flag), odnosno bit 0 (RBIF eng. Port B Interrupt flag) pri interaptu na RB4 do RB7 pinovima u INTCON registru. Kada interapta nema, interapt flag je resetovan. To je cela njegova funkcija. Sada se verovatno pitate kakva je njihova svrha. Ukoliko je interapt flag setovan PIC ne moe i nee odgovarati na druge interapte. Pretpostavimo da je izazvan interapt. Odgovarajui interapt flag e biti setovan, i mikrokontroler e izvriti potprogram za obradu interapta. Ukoliko interapt flag nije setovan, PIC e prihvatati nove interapte to moe dovesti do neprestanog vraanja programa na poetak rutine za obradu interapta koja se usled toga nikada ne moe izvriti do kraja. Ukoliko se setite primera sa mobilnim, to je kao da Vam za vreme odgovora na SMS stigne nova poruka i prekine upis odgovora. Daleko je praktinije zavriti sa jednom porukom, i onda dozvoliti prijem novih. Interapt flagovi imaju jo jednu funkciju, a to je omoguavanje interapt rutini detekciju izvora interapta (RB0/INT pin odnosno RB4 do RB7 pinovi) u sluaju korienja vie izvora interapta. Iako PIC automatski setuje interapt flagove pri nailasku interapta, on ih ne resetuje pri povratku iz rutine za obradu interapta. Ovaj posao mora programer sam izvriti (siguran sam da ve znate kako), i treba se odraditi nakon zavretka rutine za obradu interapta, a neposredno pre izlaska iz nje.
Start i interapt vektor programske memorije U trenutku dovoenja napona napajanja ili prilikom reseta, programski broja (PC) pokazuje na adresu 0x00, na poetak programske memorije. Meutim, pri pojavi interapta PC e adresu sledee instrukcije staviti na stek, i skoie na adresu 0x04. Dakle, kada piete programe koji e koristiti interapte, pre svega trebate rei mikrokontroleru da preskoi preko adrese 0x04, i zadri interapt rutinu koja poinje na adresi 0x04 odvojenu od ostatka programa. Ovo se veoma lako implementira. Najpre je potrebno da program standardno zapone direktivom ORG 0x00. Dalje je potrebno preskoiti preko adrese 0x04. Ovo se radi postavljanjem GOTO instrukcije, nakon koje sledi labela pozicionirana za start glavnog programa. Nakon ove goto instrukcije sledi jo jedna ORG direktiva, ovoga puta sa adresom 0x04, a nakon nje rutina za obradu interapta. Na kraju programa za obradu interapta potrebno je staviti RETFIE (eng. Return from interrupt) instrukciju. Ova instrukcija oznaava povratak iz interapt rutine. Kada PIC naie na ovu instrukciju PC uzima sa steka lokaciju na kojoj je PIC bio pre nego to se pojavio interapt. Sledi deo kda koji ilustruje navedeno. org 0x00 goto Main org 0x04 : : : : : : retfie Main ; PIC poinje odavde pri ukljuenju i resetu ; Idi na glavni program ; PIC dolazi ovde pri pojavi interapta ; Ovde se nalazi rutina za obradu interapta koju ; PIC izvrava jedino pri nailasku na interapt. ; Na njenom kraju potrebno je obrisati odgovarajui ; interapt flag. ; Zavretak rutine za obradu interapta ; Poetak glavnog programa
Postoji par stvari na koje trebate obratiti panju prilikom korienja interapta. 1. Ukoliko koristite isti registar u glavnom programu i u rutini za obradu interapta imajte u vidu da e se sadraj tog registra verovatno promeniti pri izvrenju rutine za obradu interapta. Na primer, recimo da koristite W registar da biste poslali podatak na PORTA, i takoe koristite W registar u rutini za obradu interapta za neku drugu operaciju. Ukoliko ne pazite, W registar e pri povratku iz rutine za obradu interapta zadrati vrednost koju je imao u interapt rutini, i pri povratku iz nje, ovaj podatak bie poslat na PORTA umesto vrednosti koju je W registar imao ranije. Reenje ovoga je privremeno uvanje vrednosti W registra u nekom od slobodnih registara, i vraanje njegove stare vrednosti po zavretku interapt rutine. Isto vai i za ostale registre (obino za STATUS) iji sadraj se menja u interapt rutini. 2. Potrebno je obratiti panju na minimalno vreme izmeu dve uzastopne pojave interapta. Ukoliko se za takt mikrokontrolera koristi kvarc od 4MHz, PIC e izvravati instrukcije brzinom od 1S po instrukciji. Ovo vreme naziva se instrukcijskim ciklusom. U tehnikom uputstvu (eng. Datasheet) za PIC 62
3.
4.
5.
6.
7.
8.
navedeno je da se treba ostaviti najmanje 3 do 4 instrukcijska ciklusa (znai bar 3-4S) izmeu dve uzastopne pojave interapta. Razlog za je vreme koje je potrebno mikokontroleru za skok na rutinu za obradu interapta, setovanje interapt flaga i povratak iz potprograma za obradu interapta. Imajte ovo na umu ukoliko koristite eksterne izvore interapta. Na kraju interapt rutine bit GIE INTCON registra se automatski setuje. Automatsko setovanje GIE bita moe da bude i nedostatak u jednom sluaju, tj. mogue je da instrukcija za resetovanje ovog bita (zabranu svih interapta) u glavnom programu uopte ne bude izvrena. Naime, ukoliko interapt nastupi u trenutku izvravanja instrukcije koja resetuje GIE bit, prvo e ta instrukcija biti zavrena do kraja (resetovae se GIE bit), a zatim e poeti izvravanje interapt rutine koja e na svom kraju da automatski setuje bit GIE. Tako e GIE bit biti setovan iako je neposredno pre interapta bio resetovan. Da bi se zatitili od ove situacije, Microchip preporuuje da se nakon resetovanja GIE bita proveri da li je bit zaista resetovan i da se, ukoliko nije, operacija ponovi. Seate se da se bitovi 4 do 7 na PORTB registru mogu koristiti kao izvori interapta. Ne moete izabrati pojedinane pinove na PORTB za interapte. Dakle, ukoliko ukljuite ove pinove, svi postaju dostupni. U emu je svrha korienja 4 bita kao izvora interapta? Primer moe biti kuni alarm, ija 4 senzora su povezana na pinove na PORTB registru. Bilo koji senzor moe okinuti PIC za ukljuenje alarma, a rutina za alarm je rutina za obradu interapta. Ovo tedi neprekidno testiranje portova, i rastereuje mikrokontroler za druge namene. Naalost njihovim interapt flagom (RBIF INTCON registra) nije mogue izvriti detekciju interapta na pojedinanim pinovima, ve jedino na svim. U sluaju korienja vie izvora interapta mogue je da se za vreme interapt rutine izazvane RB0/INT pinom pojavi i interapt na bitovima 4-7 PORTB registra. Stoga je potrebno u samoj interapt rutini testirati prvi interapt flag, u zavisnosti od negovog stanja otii na rutinu za njegovu obradu, i tamo resetovati samo taj interapt flag. Odmah nakon povratka iz potprograma za obradu interapta, izvrie se interapt izazvan drugim izvorom. Interapt flagovi setuju se bez obzira na stanje GIE bita, kao i pojedinanih dozvola za interapte (kao u programu sa tajmerom). To moe biti iskorieno za detekciju njihovih stanja iz samog programa bez korienja interapta. Naravno, odgovarajui interapt flag je kao i kod interapta potrebno runo resetovati nakon detekcije. Budite oprezni prilikom korienja potprograma unutar interapt rutine. Ukoliko je u glavnom programu stek skoro pun (a bie pri pozivanju potprograma iz potprograma), jo par takvih pozivanja unutar interapt rutine sigurno e izazvati njegovo prekoraenje. Uvek uzmite u obzir najgoru moguu varijantu, tj. da se interapt rutina javlja ba prilikom izvravanja potprograma najvee dubine. Ne pozivajte iz rutine za obradu interapta potprograme koje ve pozivate iz glavnog programa. Ukoliko je to neophodno, prilikom ulaska u interapt rutinu snimite sadraj svih registara modifikovanih u potprogramu, i vratite ih natrag prilikom izlaska iz interapt rutine.
63
Najpre se mikrokontroler treba podesiti tako da pri izvravanju programa preskoi deo na koji PC skae pri pojavi interapta. org goto org ; ; ; retfie Main 0x00 Main 0x04 ; Ovde PC dolazi pri ukljuenju i resetu ; Odlazak na glavni program ; Ovde e poeti rutina za obradu interapta ; Rutina za obradu interapta. Upisae se kasnije ; Ova instrukcija oznaava kraj rutine za obradu ; interapta, i vraa PC na glavni program. ; Poetak glavnog programa
Onda je potrebno podesiti PIC za korienje interapta na pinu 6: bsf bsf INTCON,GIE INTCON,INTE ; Global interrupt enable (1 ukljui) ; RB0 Interrupt enable (1 ukljui)
64
Za svaki sluaj potrebno je resetovati interapt flag (nikad ne veruj mikrokontroleru): bcf INTCON,INTF ; Obrii interapt flag
Kako su ovde iskoriene ak 3 instrukcije za menjanje vrednosti samo jednog registra praktinije je u pogledu tednje memorije i brzine izvravanja programa zameniti ih sa dve. movlw movwf b'10010000' INTCON ; bit 7 GIE Global interrupt enable (1 ukljui) ; bit 4 INTE RB0 Interrupt enable (1 ukljui) ; bit 1 INTF Interrupt flag (0 obrii) ; Inicijalizuj INTCON registar
Sada je potrebno podesiti portove. Seate se da zbog korienja RB0 kao interapt pina, on mora biti postavljen kao ulazni; bsf movlw movwf clrf bcf bcf bcf STATUS,RP0 ; Prebacuje nas u BANK1 0x01 ; b'00000001' u TRISB TRISB ; RB0/INT kao ulaz, a ostali kao izlaz TRISA ; Svi pinovi na PORTA su izlazni OPTION_REG,INTEDG ; Interapt se izaziva pri ; opadajuoj ivici signala OPTION_REG,NOT_RBPU ; Ukljueni interni pull up ; otpornici na PORTB STATUS,RP0 ; Povratak u BANK0
Kako interapt elimo izazivati pri opadajuoj ivici signala (sa +5V na 0V) mora se podesiti i INTEDG bit OPTION_REG registra. Takoe su resetovanjem NOT_RBPU bita ukljueni pulll up otpornici. Program e koristiti promenljivu TEMPW za privremeno uvanje W registra dok se izvrava interapt rutina i promenljivu BROJAC za pamenje broja pritisnutih prekidaa. BROJAC e u programu imati sledee vrednosti: bitovi 76543210 00000000 .0 00000001 .1 00000010 .2 00000011 .3 00000100 .4 00000101 .5 00000110 .6 00000111 .7 00001000 .8 - prekoraenje Stoga je najpre potrebno imenovati registre i inicijalizovati vrednost BROJAC registra. TEMPW equ BROJAC equ clrf 0x0C 0x0D BROJAC ; TEMPW na adresi 0x0C ; BROJAC na adresi 0x0D ; Stavi 0x00 u BROJAC 65
Dalje je potrebno u glavnom programu napraviti petlju koja e vrednost promenljive BROJAC neprestano prikazivati na PORTA registru. Pri comf movwf goto BROJAC,W PORTA Pri ; Invertovani BROJAC u W registar (zbog LED) ; a odatle u PORTA ; Vrati se na poetak petlje
Budui da prva pojava interapta nastaje tek kada se program nae u glavnoj programskoj petlji (Pri), i da u sama petlja ne reaguje na stanje bitova STATUS registra, u interapt rutini nema potrebe za privremenim uvanjem njegove vrednosti. U interapt rutini potrebno je najpre sauvati vrednost W registra. movwf TEMPW ; Privremeno uvanje sadraja W registra
Onda je potrebno inkrementovati sadraj BROJAC registra. incf BROJAC,F ; Uveaj registar BROJAC.
Dalje je potrebno proveriti da li je promenljiva BROJAC prekoraila maksimalnu vrednost .7 (b'00000111') i dola do .8 (b'00001000'). Najpraktinije je izvriti testiranje treeg bita BROJAC registra. btfsc clrf ; Testiraj trei bit 00001000 BROJAC registra. ; Ukoliko nije setovan, preskoi sledeu ; instrukciju BROJAC ; Upisi 0x00 u BROJAC ; Ukoliko je BROJAC nakon inkrementacije ; prekoraio maksimalnu vrednost (b'00000111') ; sada je jednak .0 ; Ukoliko nije, sada je inkrementovan. TEMPW,W ; Vrati prethodni sadraj W registra INTCON,INTF ; Obrii INTF dozvoli nove interapte ; Kraj interapt rutine. BROJAC,3
Pogledajte sada celokupan program: ; ****** Inicijalizacija i imenovanje ****** list #include __CONFIG ORG TEMPW BROJAC p=16F84 ; Definie upotrebljeni mikrokontroler <p16F84.inc> ; Ubacuje nazive registra u program _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove ; Definie start programa ; uvanje sadraja W registra na adresi 0x0C ; BROJAC na adresi 0x0D
66
; ****** Interapt rutina ****** org goto org movwf incf btfsc clrf 0x00 Main 0x04 TEMPW BROJAC,F BROJAC,3 ; Ovde PC dolazi pri ukljuenju i resetu ; Odlazak na glavni program
; Ovde e poeti rutina za obradu interapta ; Privremeno uvanje sadraja W registra ; Inkrementuj BROJAC. ; Testiraj trei bit b'00001000' BROJAC registra. ; Ukoliko nije setovan, preskoi sledeu ; instrukciju BROJAC ; Upisi .0 u BROJAC ; Ukoliko je BROJAC nakon inkrementacije ; prekoraio maksimalnu vrednost (.7) ; sada je .0 ; Ukoliko nije, sada je inkrementovan. TEMPW,W ; Vrati prethodni sadraj W registra INTCON,INTF ; Obrii INTF dozvoli nove interapte ; Kraj interapt rutine.
; ****** Glavni program inicijalizacija ****** Main movlw movwf bsf movlw movwf clrf bcf bcf bcf clrf b'10010000' ; bit 7 GIE Global interrupt enable (1 ukljui) ; bit 4 INTE RB0 Interrupt enable (1 ukljui) ; bit 1 INTF Interrupt flag (0 obrii) INTCON ; Inicijalizuj INTCON registar STATUS,RP0 ; Prebacuje program u BANK1 0x01 ; b'00000001' u TRISB TRISB ; RB0/INT kao ulaz, a ostali kao izlaz TRISA ; Svi pinovi na PORTA su izlazni OPTION_REG,INTEDG ; Interapt se izaziva pri ; opadajuoj ivici signala OPTION_REG,NOT_RBPU ; Ukljueni interni pull up ; otpornici na PORTB STATUS,RP0 ; Povratak u BANK0 BROJAC ; Stavi .0 u BROJAC
; ****** Glavni program petlja ****** Pri comf movwf goto BROJAC,W PORTA Pri ; Invertovani BROJAC u W registar (zbog LED) ; a odatle u PORTA ; Vrati se na poetak petlje
Kao to je ranije reeno RA4 pin ne moe na svom izlazu dati logiku jedinicu. U sluaju da se na njega poalje logika 0, ponaae se isto kao i ostali pinovi, a u 67
sluaju jedinice, prei e u stanje visoke impedanse (kao da nije ni povezan). Pin RA4 razlikuje se od ostalih i po svom ulazu. Ulaz mu je sa mitovim okidaem. To omoguava bolji prijem signala sa prisustvom uma (npr. sa udaljenog senzora). Kako je ovaj program dat samo ilustrativno, njim nije realizovana debouncing rutina. Prilikom pritiskanja prekidaa moete primetiti da se umesto jednog ponekad javi preskok brojeva. Do sada ste nauili 32 instrukcije. Verovatno i sami uoavate da Vam sada vei problem od uenja novih instrukcija predstavlja uenje funkcija registara specijalne namene. U registare koje ste u potpunosti nauili spadaju PORTA, TRISA, PORTB, TRISB, PCL, PCLATH, TMR0 i OPTION_REG. To je osam potpuno i dva delimino (STATUS i INTCON) nauena registra. Sledi jo jedan deo sa interaptima, a onda neto novo.
68
EEIE
T0IE
INTE
RBIE
T0IF
INTF
bit0 RBIF
GIE (eng. Global Interrupt Enable) omoguava ili zabranjuje upotrebu svih interapta. Njegovim setovanjem, dozvoljena je upotreba interapta. Setovanjem EEIE (EEPROM Interrupt Enable) omoguen je zavretak snimanja u EEPROM kao izvor interapta. Setovanjem T0IE (eng. Timer0 Interrupt Enable) bita tajmer je upotrebljen kao izvor interapta. INTE (eng. RB0/INT INTerrupt Enable) bit setovanjem dozvoljava korienje RB0 pina mikrokontrolera kao izvora interapta. Setovanjem RBIE (eng. Port B Change Interrupt Enable) bita, omoguena je upotreba PORTB registra kao izvora interapta pri promeni logikog stanja na RB4 do RB7 pinovima. T0IF (eng. Timer0 Interrupt Flag) bit setuje se pri prekoraenju tajmera. INTF (eng. Interrupt Flag) bit setuje se pri dolasku odgovarajueg logikog nivoa (odabranog INTEDG bitom OPTION_REG registra) na RB0 pin mikrokontrolera. RBIF (eng. Port B Interrupt Flag) setuje se pri promeni logikog stanja na pinovima RB4 do RB7.
Interapt flagovi se ne resetuju automatski nakon oitavanja. Da bi se dozvolili novi interapti, neophodno je resetovati eljeni flag pre izlaska iz interapt rutine. Da bi se tajmer upotrebio kao izvor interapta, dovoljno je dozvoliti njegovo korienje setovanjem GIE i T0IE bitova, i resetovanjem njegovog flaga. Sva podeavanja vezana za obian tajmer (preskaler, eksterni takt) vae i u ovom sluaju. Kako je u interapt potprogramima uglavnom neophodno uvati stanje STATUS registra posebna panja mora se obratiti na instrukcije koje prilikom njegovog vraanja ne utiu (iznova) na promenu njegovog stanja kao to npr. MOVF instrukcija 69
moe uticati na izmenu Zero flaga. Zbog toga se preporuuje upotreba SWAPF instrukcije. Swapf (eng. Swap F - zameni) instrukcija menja mesta gornjem i donjem niblu u registru. bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
bit3
bit2
bit1
bit0
bit7
bit6
bit5
bit4
Sintaksa instrukcije je swapf f,d pri emu je f registar nad kojim se izvrava operacija, a sa d je odreeno odredite rezultata operacije. Sledi program koji ilustruje upotrebu 3 nezavisna dela. Elektrina ema ista je kao u prethodnom poglavlju. Prvim delom e LED1 treperiti. To e biti glavni program. Drugim delom e se pri pritisku tastera izazvati interapt koji e menjati stanje LED2. Treim delom e se tajmerom izazivati interapt koji e menjati stanje LED3. Ova tri dela su samo uslovno nezavisna. Interapt potprogram troi vreme potrebno za izvravanje svojih instrukcija, pa e u zavisnosti od brzine izvravanja interapt potprograma (i brzine njenog pojavljivanja) glavni program raditi sporije. Meutim, interapt rutina se uglavnom pravi tako da njeno trajanje bude to krae, pa tako njeno izvravanje ne utie u velikoj meri na brzinu glavnog programa. ; ****** Inicijalizacija i imenovanje ****** list p=16F84 ; Definie upotrebljeni mikrokontroler #include <p16F84.inc> ; Ubacuje nazive registra u program __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; Podeava konfiguracione bitove ORG 0x00 ; Definie start programa cblock 0x0C TEMPW ; uvanje sadraja W registra TEMPSTATUS ; uvanje sadraja STATUS registra BROJAC1 ; BROJAC1. Inicijalno 0xFF BROJAC2 ; BROJAC2. Inicijalno 0xFF BROJAC3 ; BROJAC3. Inicijalno 0xFF SPORTA ; Shaddow registar za PORTA endc ; ****** Interapt rutina ****** org goto org movwf 0x00 Main 0x04 TEMPW ; Ovde PC dolazi pri ukljuenju i resetu ; Odlazak na glavni program ; Ovde e poeti rutina za obradu interapta ; uvanje sadraja W registra u TEMPW 70
; ****** Test interapta izazvanog prekidaem ****** btfss INTCON,INTF ; Interapt izazvan prekidaem? goto Taj ; Nije, idi na deo za tajmerski interapt. ; ****** Rutina za obradu interapta izazvanog prekidaem ****** xorlw b'00000010' ; Promeni stanje bita za LED2 u W ; ****** Izlazak iz interapt rutine izazvane prekidaem ****** call Vrat ; Updatuj PORTA i SHADDOW i ; Vrati stanja W i STATUS registra bcf INTCON,INTF ; Dozvoli nove interapte prekidaa retfie ; Povratak iz interapt rutine. ; ****** Update PORTA i SHADDOW i vraanje ****** ; ****** originalnog stanja W i STATUS registra ****** Vrat movwf PORTA ; Kopiraj W u PORTA movwf SPORTA ; Kopiraj W u Shaddow registar swapf TEMPSTATUS,W ; TEMPSTATUS sa okrenutim niblovima ; u W. Dva puta okrenuti niblovi daju movwf STATUS ; prvobitno stanje koje ide u STATUS swapf TEMPW,F ; Jednom okreni niblove u samom ; TEMPW registru, swapf TEMPW,W ; a drugi put sa W kao odreditem. return ; Kraj potprograma. ; ****** Rutina za obradu interapta izazvanog tajmerom ****** Taj decfsz BROJAC3,f ; Smanji BROJAC3. xorlw b'00000100' ; Promeni stanje bita za LED3 u W ; Gornja instrukcija izvrava se u svim sluajevima kada je vrednost BROJAC3 ; registra od .1 do .255. Kako je i naredna instrukcija ista, dva puta XOR-ovana ; vrednost daje originalno stanje W registra (kao pre XOR operacije). ; Kada je BROJAC3 = 0 gornja instrukcija ona se preskae i izvrava se samo ; jedna (naredna) XOR operacija, koja prouzrokuje eljenu promenu stanja bita. xorlw b'00000100' ; Promeni stanje bita za LED3 u W. ; Ova instrukcija se uvek izvrava.
; ****** Izlazak iz interapt rutine izazvane tajmerom ****** call Vrat ; Updatuj PORTA i SHADDOW i ; vrati stanja W i STATUS registra bcf INTCON,T0IF ; Dozvoli nove interapte tajmera retfie ; Povratak iz interapt rutine.
71
; ****** Glavni program inicijalizacija ****** Main bsf movlw movwf clrf movlw STATUS,RP0 ; Prebacuje program u BANK1 0x01 ; b'00000001' u TRISB TRISB ; RB0/INT kao ulaz, a ostali kao izlaz TRISA ; b'00000' u TRISA, svi pinovi PORTA su izlazni b'00000111' ; T0CS=0 - Tajmer je sinhronizovan sa ; instrukcijskim ciklusom ; Preskaler - PSA=111 je podeen za odnos 1:256 ; INTEDG=0 - Interapt se izaziva pri ; opadajuoj ivici signala (sa 1 na 0) ; NOT_RBPU=0 - Ukljueni interni pull up ; otpornici na PORTB OPTION_REG ; STATUS,RP0 ; Povratak u BANK0 TMR0 ; Inicijalizacija tajmera SPORTA ; Inicijalizacija Shaddow registra b'10110000' ; bit 7 GIE Global interrupt enable (1 ukljui) ; bit 4 INTE RB0 Interrupt enable (1 ukljui) ; bit 1 INTF Interrupt flag (0 obrii) ; bit 5 T0IE Timer interrupt enable (1 ukljui) ; bit 2 T0IF Timer interrupt flag (0 obrii) INTCON ; Inicijalizuj INTCON registar
movwf
; ****** Glavni program treptanje LED1 ****** Poc bcf INTCON,GIE ; Zabrani nove interapre btfsc INTCON,GIE ; Proveri jesu li interapti zaista zabranjeni goto Poc ; Nisu, zabrani ih opet. movf SPORTA,W ; SHADDOW u W xorlw b'00000001' ; Promeni stanje bita za LED1 u W movwf PORTA ; Kopiraj W u PORTA movwf SPORTA ; Kopiraj W u Shaddow registar bsf INTCON,GIE ; Dozvoli nove inerapte call Pet ; Ubaci kanjenje goto Poc ; Vrati se na poetak ; ****** Potprogram za kanjenje od oko 0,2S ****** Pet decfsz BROJAC1,F ; Ove dve petlje slue za brojanje nadole od goto Pet ; 255 do 0, 255 puta, omoguavajui nam da decfsz BROJAC2,F ; moemo videti kako LED1 treperi goto Pet return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa
Moete se zapitati zato su upotrebljene dve swapf instrukcije pri vraanju TEMPW u W, kada se isto moglo realizovati i movf TEMPW,W instrukcijom. Razlog je taj to e mowf instrukcija setovati Zero flag u sluaju da je u W bila vrednost 0x00, dok je 72
swapf instrukcija neutralna prema svim flagovima. Slino vai i za STATUS registar. Ukoliko je odredite instrukcije koja menja stanje flagova STATUS registra sam STATUS registar, njegovi flagovi postavie se u zavisnosti od rezultata instrukcije, bez obzira na stanje bajta koji elimo poslati u njega. U delu sa testiranjem interapta moete primetiti da je testiran samo interapt flag prekidaa. To je sasvim normalno, jer neto mora da je izazvalo interapt kada se ve ulo u interapt rutinu. Ukoliko to nije bio prekida, onda je sigurno bio tajmer Ukoliko su oba interapta nastupila istovremeno (setovana oba interapt flaga), najpre e se izvriti interapt rutina prekidaa, ali po povratku iz interapt potprograma odmah e se izazvati novi interapt jer je interapt flag tajmera i dalje setovan. Sigurno ste u delu za obradu tajmerskog interapta uoili neobinu realizaciju kanjenja. Ono se moralo izvesti na taj nain (u prolazu) jer se ne sme dozvoliti da preveliko kanjenje interapt potprograma koi izvrenje glavnog programa. U glavnom programu interapti su privremeno zabranjeni da se stanje SPORTA registra ne bi promenilo interapt rutinom za vreme njegove promene od strane glavnog programa. Testiranje zabrane svih interapta takoe je neophodno (pogledajte napomene uz interapte). Dosta je bilo interapta. Sledi neto sasvim drugaije.
73
Pet
; Jeste, nastavak programa. Za razliku od tabele, zbog malog broja registara kod upotrebe indirektnog adresiranja nema ogranienja u smislu blokova podataka (bar kod PIC16F84 mikrokontrolera kod mikrokontrolera sa veim brojem registara ovo nije sluaj). Indirektno adresiranje se u programima najee upotrebljava jedino u sluaju vee koliine podataka. Do sada ste nauili 33 od 35 instrukcija, potpunu upotrebu deset registra i deliminu upotrebu dva registra od ukupno 15. Preli ste najvei (i najtei interapti) deo gradiva, meutim ima se jo mnogo toga nauiti.
74
EEIF
WRERR
WREN
WR
bit0 RD
Bitovi 5 do 7 se ne koriste u EECON1 registru. Trebaju biti na logikoj nuli. EEIF (eng. EEPROM Interrupt Flag) bit predstavlja flag interapta izazvanog zavretkom procesa snimanja bajta. Ovaj interapt moe se dozvoliti setovanjem EEIE (eng. EEPROM Interrupt Enable) bita INTCON registra. Potrebno ga je runo obrisati pre povratka iz interapt rutine. 75
WRERR (eng. Write Error) bit indikuje prekid snimanja bajta u EEPROM, usled isteka vremena WDT ili eksternog reseta mikrokontrolera. Program moe nakon reseta testirati ovaj bit (uz to mora otkriti i da li je reset nastao usled nestanka napona napajanja ili ne), i na osnovu njegovog stanja dovriti proces snimanja (sadraj EEADR i EEDATA registra ne menja se nakon reseta). WREN (eng. Write Enable) bit mora biti setovan, da bi bio mogu upis u EEPROM. WR (eng. Write) bit koristi se za iniciranje upisa u EEPROM memoriju. RD (eng. Read) bit koristi se za iniciranje itanja iz EEPROM memorije.
Pogledajte najpre primer itanja memorijske adrese 0x10 iz EEPROM memorije. bcf movlw movwf bsf bsf bcf movf STATUS,RP0 0x10 EEADR STATUS,PR0 EECON1,RD STATUS,RP0 EEDATA,W ; Prebacuje nas u BANK0 zbog EEADR ; elimo proitati sadraj EEPROM ; memorije sa adrese 0x10 ; Prebacuje nas u BANK1 ; Inicira proces itanja ; EEPROM memorije ; Prebacuje nas u BANK0 ; Sadraj bajta sa adrese 0x10 ; iz EEPROM memorije je u EEDATA, ; odakle se moe prebaciti u W
Ovaj program trebao bi da Vam je u potpunosti jasan. Setovanjem RD bita iniciran je proces itanja, a zatim se RD bit automatski nakon itanja vraa na 0. Podatak iz EEPROM memorije dostupan je u EEDATA registru odmah u narednom instrukcijskom ciklusu, odakle je premeten u W registar. Pogledajte sada kako je realizovano snimanje bajta 0x24 u EEPROM adresu 0x10. bcf movlw movwf movlw movwf bsf bcf bsf movlw movwf movlw movwf bsf bsf bcf STATUS,RP0 0x24 EEDATA 0x10 EEADR STATUS,RP0 INTCON,GIE EECON1,WREN 0x55 EECON2 0xAA EECON2 EECON1,WR INTCON,GIE EECON1,WREN ; Prebacuje nas u BANK0 ; Bajt za snimanje ; u EEDATA ; na adresu ; 0x10 ; Prelaz u BANK1 zbog EECON1 ; Zabrana svih interapta (ukoliko ih ima) ; Dozvola pisanja u EEPROM ; ; ; Inicijalizacija upisa u EEPROM ; ; ; Dozvola interapta (ukoliko se koriste) ; Zabrana daljeg pisanja u EEPROM 76
Snimanje u EEPROM nee se inicirati ukoliko nije tano ispotovana procedura (0x55 u EECON2, 0xAA u EECON2, setovan WR) i to bez pauza (otud zabrana interapta) za svaki pojedinani bajt. Microchip navodi da je ta procedura uvedena kako bi se spreio nehotian upis u EEPROM zbog moguih greaka u programu. Iz istog razloga WREN bit je potrebno drati setovanim jedino za vreme upisa u EEPROM. WR bit se automatski resetuje po zavretku upisa. U sluaju serijskog snimanja podataka u EEPROM, potrebno je pre sledeeg snimanja proveriti stanje ovog bita, kako se ne bi desilo iniciranje novog upisa u EEPROM a da prethodno snimanje jo nije zavreno. To je obavezno, jer snimanje u EEPROM nije sinhronizovano sa instrukcijskim ciklusom, ve se za upis u EEPROM koristi poseban interni oscilator, koji odreuje vreme upisa od oko 10mS. Kod itanja podataka iz EEPROM memorije nema ovakvih problema. Umesto testiranja flaga mogue je i jednostavno saekati dovoljno dugo (npr. 12mS). Moda Vam se mere inicijalne procedure i WRERR bita ine preteranim. Ali zapitajte se ta bi se desilo ukoliko bi u EEPROM memoriji uvali npr. obrasce za prikaz broja na LED displeju. U sluaju korupcije EEPROM memorije PIC ni nakon reseta ne bi mogao nastaviti sa normalnim radom. Morao bi se odlemiti sa tampane ploice i ponovo programirati (u mikrokontroler se sa programom snima i sadraj EEPROM memorije). U sledeem poglavlju upoznaete se sa programom koji koristi EEPROM memoriju i nauiete upotrebu EEIF bita i proces upisa podataka u EEPROM iz samog asemblera. Na taj nain se sadraj EEPROM memorije moe uvati zajedno sa programom u jednom .asm ili .hex fajlu.
77
; ****** Test prekidaa ****** bcf STATUS,RP0 Cek1 btfss goto goto btfss goto Cek2 btfsc goto goto btfsc goto PORTB,0 Cek1 Pau PORTB,0 Cek1 PORTB,0 Cek2 Pau PORTB,0 Cek2
; Povratak u BANK0 u glavnom ; programu pre skoka na interapt rutinu ; program se izvravao u BANK1 ; Testiranje otputenosti prekidaa ; Nije otputen ; Jeste otputen. Idi na pauzu. ; Jo jedno testiranje zbog imunosti na ; eventualna varnienja kontakta. ; Testiranje pritisnutosti prekidaa ; Nije pritisnut ; Jeste pritisnut. Idi na pauzu. ; Jo jedno testiranje zbog imunosti na ; eventualna varnienja kontakta.
; ****** Prikaz cifre na displeju ****** movf DISP,W ; DISP u W call Tabl ; Uzmi obrazac iz tabele, movwf PORTB ; i prikai cifru na displeju. ; ****** Testiranje prekoraenja vrednosti cifre na displeju ****** decf DISP,F ; Smanji DISP za 1. Rezultat u DISP btfss DISP,7 ; Testiraj MSB. On e biti 1 jedino ukoliko je ; dolo do prekoraenja sa 0x00 na 0xFF goto Povr ; Nije, izai iz interapt rutine movlw 0x09 ; Jeste, inicijalizuj brojac na movwf DISP ; vrednost 0x09 Povr swapf movwf swapf swapf bcf retfie TEMPSTATUS,W STATUS TEMPW,F TEMPW,W EECON1,EEIF ; TEMPSTATUS sa okrenutim niblovima ; u W. Dva puta okrenuti niblovi daju ; prvobitno stanje koje ide u STATUS ; Jednom okreni niblove u samom ; TEMPW registru, ; a drugi put sa W kao odreditem. ; Dozvola novih interapta ; Kraj interapt rutine.
; ****** Glavni program inicijalizacija ****** Main bsf STATUS,RP0 ; Prebacuje program u BANK1 bcf EECON1,EEIF ; Reset interapt flaga movlw b'11000000' ; GIE=1 Global interrupt enable movwf INTCON ; EEIE=1 EEPROM interrupt enable movlw b'00000000' ; NOT_RBPU=0 - Ukljueni interni movwf OPTION_REG ; pull up otpornici na PORTB movlw 0x01 ; b'00000001' u TRISB movwf TRISB ; RB0/INT kao ulaz, a ostali kao izlaz clrf TRISA ; Svi pinovi na PORTA su izlazni bcf STATUS,RP0 ; Povratak u BANK0
79
; ****** itanje iz EEPROM memorije ****** movlw 0x00 ; elimo proitati sadraj EEPROM movwf EEADR ; memorije sa adrese 0x00 bsf STATUS,PR0 ; Prebacuje program u BANK1 bsf EECON1,RD ; Inicira proces itanja ; EEPROM memorije bcf STATUS,RP0 ; Prebacuje program u BANK0 movf EEDATA,W ; Sadraj bajta sa adrese 0x00 iz ; EEPROM memorije u W ; ****** Inicijalizacija brojaa i LED displeja ****** movwf DISP ; Inicijalizacija brojaa call Tabl ; Uzmi obrazac iz tabele i movwf PORTB ; Prikai cifru na displeju ; ****** Snimanje u EEPROM ****** Gla movf DISP,W movwf EEDATA movlw 0x00 movwf EEADR bsf STATUS,RP0 bsf EECON1,WREN movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR Kraj btfss goto EECON1,WR Kraj ; DISP u W ; pa u EEDATA ; na adresu ; 0x00 ; Prebacuje nas u BANK1 zbog EECON1 ; Dozvola pisanja u EEPROM ; ; ; Otkljuavanje upisa u EEPROM ; ; ; Test zavretka snimanja
; U ovom trenutku snimanje je zavreno pa se interapt flag setuje i nastaje interapt. U interapt rutini ekae se na pritisak prekidaa, smanjie se vrednost na displeju i tek onda e se izai iz nje i nastaviti dalji program. bcf bcf goto EECON1,WREN STATUS,RP0 Gla ; Zabrana pisanja u EEPROM ; Povratak u BANK0 ; Povratak na poetak programa
; ****** Tabela ****** Tabl movf DISP,W ; U promenljivoj DISP nalazi se vrednost od addwf PCL,f ; .0 do .9. Ta vrednost se dodaje na PCL. retlw b'01111110' ; Obrazac za crtanje cifre 0 - 0 retlw b'00001100' ; Obrazac za crtanje cifre 1 - 1 retlw b'10110110' ; Obrazac za crtanje cifre 2 - 2 retlw b'10011110' ; Obrazac za crtanje cifre 3 - 3 retlw b'11001100' ; Obrazac za crtanje cifre 4 - 4 retlw b'11011010' ; Obrazac za crtanje cifre 5 - 5 retlw b'11111010' ; Obrazac za crtanje cifre 6 - 6 80
7 8 9
; ****** Pauza zbog debouncing rutine ****** Pau decfsz BROJAC,F ; Pauza zbog debouncing goto Pau ; rutine return ; Povratak iz potprograma ; ****** Kraj programa ****** end ; Kraj programa
Prilikom snimanja kda u PIC16F84 mora se sadraj memorijske adrese 0x00 u EEPROM memoriji podesiti na proizvoljan broj izmeu 0x00 i 0x09. U protivnom e mikrokontroler uzeti inicijalno stanje iz EEPROM memorije (0xFF) i pri nailasku na tabelu izvravanje programa e se nastaviti za 245 bajtova iza same tabele, to e izazvati nepravilan rad (tanije resetovanje) mikrokontrolera. To je u programu uinjeno upotrebom DE (eng. Define EEPROM) direktive. Njom se jedan (ili vie) bajtova smetaju u EEPROM. Budui da je za nju potrebno prethodno definisati poetak upisa u EEPROM memoriju (org direktivom i adresama od 21x00 do 21x3h), najpraktinije je staviti je ispred ili iza programa, kako se ne bi desilo da se i program grekom upie u EEPROM. Pri smetanju vie bajtova u EEPROM, moete bajt po bajt iza DE direktive odvojiti zarezom, ovako: de 0x05, 0xA8, 0x79... Iako izgleda da je EEPROM na neki nain produetak programske memorije, razlika svakako postoji. U EEPROM memoriji nije mogue izvravati programe, isto kao to se ni iz programa ne moe itati (a ni menjati) sadraj programske memorije (bar kod PIC16 serije). Moda ste primetili da u rutini za snimanje u EEPROM nije izvrena zabrana korienja svih interapta resetovanjem GIE bita. Ukoliko bi se interapti zabranili, program ne bi skoio na interapt rutinu, i neprestano bi se vrteo u petlji snimajui jedan isti bajt u EEPROM adresu 0x00. Ukoliko bi se ovo dovoljno dugo ponavljalo, ova EEPROM adresa bi se usled starenja pokvarila (kao ogrebotina na DVD disku). Jedna EEPROM memorijska lokacija moe se menjati do 1 milion puta. Sve preko ove vrednosti poveava verovatnou nastupa kvara adrese. Naravno, ukoliko se koristi vie izvora interapta, ostali bi se morali privremeno zabraniti. Budui da ete se u iduem poglavlju upoznati sa uspavanim stanjem mikrokontrolera, vreme je da nauite jednu lenju instrukciju. To je NOP (eng. No Operation). Ova instrukcija, osim to traje jedan instrukcijski ciklus ne radi nita korisno. Kada program mikrokontrolera naie na nju, utroie jedan instrukcijski ciklus nizata. Prei e preko nje, kao da je nema. Uglavnom se koristi u situacijama kada je potrebno realizovati tano odreeno, ili kratko kanjenje (npr. u petljama kanjenja ili debouncing rutini).
81
Interapt izazvan tajmerom ne moe se koristiti za buenje iz SLEEP moda, jer je u SLEEP modu i tajmer uspavan. Ulaskom u SLEEP mod, menja se stanje odreenih bitova STATUS registra. Vreme je da napokon prouite i njegovu unutranju strukturu. bit7 /
RP0
TO
PD
DC
bit0 C
Bitovi 7 i 6 ne koriste se u PIC16F84. Trebaju biti u stanju logike 0. Bit 5 (RP0) koristi se kod direktnog adresiranja za izbor banke podataka po sledeem : 0 - BANK0 0x00-0x7F 1 - BANK1 0x80-0xFF TO (eng. Time-Out) prekoraenje vremena bit je na stanju logike 0 nakon isteka WDT, a u stanju logike 1 po dolasku napona napajanja, i izvrenju CLRWDT ili SLEEP instrukcije. Na osnovu stanja ovog bita program moe detektovati da je reset mikrokontrolera nastao usled prekoraenja WDT. PD (eng. Power-Down) bit postavlja se na 1 po dolasku napona napajanja ili izvrenju CLRWDT instrukcije, a na 0 po izvrenju SLEEP instrukcije. Logika jedinica na Zero nultom bitu pokazuje da je rezultat zadnje aritmetike ili logike operacije jednak 0. Logika nula na ovom bitu ukazuje da je rezultat razliit od 0. DC (eng. Digit Carry/borrow) bit bit prekoraenja/pozajmice cifre indikuje prekoraenje ili pozajmicu donjem niblu nastalu zbog izvravanja instrukcija sabiranja ili oduzimanja. Logika jedinica na C (eng. Carry/borrow) bitu bitu prekoraenja/pozajmice ukazuje da je dolo do prekoraenja ili pozajmice u bajtu nad kojim su se izvrile operacije sabiranja, oduzimanja ili rotacije.
Kao to vidite iz samog STATUS registra, izvrenje SLEEP instrukcije prouzrokuje resetovanje PD bita i setovanje TO bita. Moda vam udno izgleda buenje iz SLEEP moda istekom WDT. On se u mikrokontroleru koristi za povremeno buenje iz SLEEP moda, obavljanje odreene operacije, i ponovni ulazak u SLEEP mod. Tako mikrokontroler moe povremeno izvriti poneku operaciju, a opet e veinu vremena provesti spavajui (i troei manje struje). Kako istek WDT prouzrokuje softverski reset mikrokontrolera program mora po resetu testirati TO bit, i na osnovu njegovog stanja zakljuiti da li se radi o prvom ukljuenju mikrokontrolera, ili o prekidu nastalom istekom WDT, kako bi se mogao nastaviti zapoeti program. U praksi se mnogo ee sree buenje interaptima. U sledeem poglavlju upoznaete se sa specifinostima upotrebe interapta u SLEEP modu. 83
; ****** Interapt rutina za prvi deo programa normalne interapte ****** org 0x04 ; Ovde e poeti interapt rutina movwf TEMPW ; uvanje sadraja W registra u TEMPW swapf STATUS,W ; STATUS sa okrenutim niblovima u W movwf TEMPSTATUS ; i zatim u TEMPSTATUS registar swapf andlw PORTB,W ; Uzmi stanje sa porta i zameni stanje niblova. b'00001111' ; Maskiraj neeljene bitove
; ****** Test interapta izazvanog prekidaem ****** btfss INTCON,INTF ; Interapt izazvan prekidaem T5? goto T14 ; Nije, idi na deo za prekidae T1 do T4. ; ****** Interapti izazvani prekidaem T5 ****** movwf INDF ; Indirektno snimanje u eljeni registar incf FSR,F ; Pozicioniranje pointera na sledei registar call Vrat ; Vrati sadraj W i STATUS registra bcf INTCON,INTF ; Obrii interapt flag prekidaa T5 retfie ; Vrati se iz interapt potprograma ; ****** Interapti izazvani prekidaima T1 do T4 ****** call Tabl ; Uzmi sliku za displej iz tabele. 85
call call bcf retfie Vrat swapf movwf swapf swapf return
Nacr ; Nacrtaj sliku. Vrat ; Vrati sadraj W i STATUS registra INTCON,RBIF ; Obrii interapt flag prekidaa T1 do T4 ; Vrati se iz interapt potprograma TEMPSTATUS,W STATUS TEMPW,F TEMPW,W ; TEMPSTATUS sa okrenutim niblovima ; u W. Dva puta okrenuti niblovi daju ; prvobitno stanje koje ide u STATUS ; Jednom okreni niblove u samom ; TEMPW registru, ; a drugi put sa W kao odreditem. ; Povratak iz potprograma.
; ****** Tabela ****** Tabl addwf PCL,F retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw
; Vrednost u W od b'00000000' do b'00001111' ; (0x00 do 0x0F) se dodaje na PCL ; bez decimalne take b'00011000' ; Obrazac za crtanje cifre 0 - 0 b'00111111' ; Obrazac za crtanje cifre 1 - 1 b'10010100' ; Obrazac za crtanje cifre 2 - 2 b'00010110' ; Obrazac za crtanje cifre 3 - 3 b'00110011' ; Obrazac za crtanje cifre 4 - 4 b'01010010' ; Obrazac za crtanje cifre 5 - 5 b'01010000' ; Obrazac za crtanje cifre 6 - 6 b'00011111' ; Obrazac za crtanje cifre 7 - 7 b'00010000' ; Obrazac za crtanje cifre 8 - 8 b'00010010' ; Obrazac za crtanje cifre 9 - 9 b'00010001' ; Obrazac za crtanje cifre A- A b'01110000' ; Obrazac za crtanje cifre B - B b'11010000' ; Obrazac za crtanje cifre C - C b'00110100' ; Obrazac za crtanje cifre D - D b'11010000' ; Obrazac za crtanje cifre E - E b'11010001' ; Obrazac za crtanje cifre F - F
; ****** Potprogram za crtanje slike na displeju ****** Nacr movwf PORTA ; Poalji u PORTA bitove RA0 do RA4 movwf TEMP ; Poalji u TEMP registar zbog zamene niblova swapf TEMP,W ; Zameni mesta niblovima tako da RB1 bit dodje ; na mesto bita 1 (isto se moglo realizovati ; i sa 4 RRF instrukcije) movwf PORTB ; Poalji u PORTB bitove RB1 do RB3 return ; Povratak iz potprograma. ; ****** Glavni program inicijalizacija ****** Main bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw b'11110001' ; pinovi RB0 i RB4 do RB7 ulazni, movwf TRISB ; a RB1, RB2 i RB3 izlazni. clrf TRISA ; Svi pinovi porta A izlazni movlw b'00000000' ; INTEDG=0 - Interapt se izaziva pri 86
; opadajuoj ivici signala (sa 1 na 0) ; NOT_RBPU=0 - Ukljueni interni ; pull up otpornici na PORTB ; Povratak u BANK0
; ******* Postavi sliku na displeju pre ukljuenja interapta ****** swapf PORTB,W ; Uzmi stanje sa porta i zameni stanje niblova. andlw b'00001111' ; Maskiraj neeljene bitove call Tabl ; Uzmi sliku za displej iz tabele. call Nacr ; Nacrtaj sliku. ; ****** Ukljui interapte ****** bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw b'10011000' ; GIE Global interrupt enable (1 ukljui) ; INTE RB0 Interrupt enable (1 ukljui) ; RBIE RB Interrupt enable (1 ukljui) ; INTF Interapt flag za T5 (0 obrii) movwf INTCON ; RBIF Interapt flag za T1-T4 (0 obrii) bcf STATUS,RP0 ; Povratak u BANK0 ; ****** Prvi deo programa setovan GIE, normalni interapti ****** Poc sleep ; Ukljui SLEEP mod ; U ovom trenutku program se vratio iz interapt rutine. Sada je potrebno proveriti da li ; je snimljeno svih 5 vrednosti. Meutim, bolje je ovde proveriti vrednost FSR ; registra sabiranjem, jer je mogue da se (npr. usled debouncinga na T5) izazove vie ; uzastopnih interapta i tako snime vrednosti u jo par narednih RAM adresa. ak i ; da se to dogodi, testom Carry flaga moe se detektovati taj sluaj za razliku od ; testa Zero flaga. movf addlw btfss goto FSR,W .219 STATUS,C Poc ; FSR u W ; Test prekoraenja. FSR treba biti od .32 do .36 ; .37 i vie + .219 = setovan Carry ; Jo nema prekoraenja. Spavaj i dalje.
; U ovom trenutku snimljeno je svih 5 vrednosti u RAM adrese od .32 do .36 ; Sada se treba zabraniti odlazak na interapt potprogram. Zabr bcf btfsc goto INTCON,GIE INTCON,GIE Zabr ; Jeste. Zabrani nove interapre ; Proveri jesu li interapti zaista zabranjeni ; Nisu, zabrani ih opet.
; ** Drugi deo programa resetovan GIE, interaptima se nastavlja glavni program ** movlw 0xFF ; movwf PORTA ; Obrii LED displej (segmenti na PORTA). movwf PORTB ; Obrii LED displej (segmenti na PORTB) 87
; Ukljui segment decimalne take. ; Inicijalizacija pointera RAM memorije ; na registar .32
; ****** Zabrani buenje iz sleep moda prekidaima T1 do T4 ****** bsf STATUS,RP0 ; Prebacuje program u BANK1 movlw b'00010000' ; GIE Global interrupt enable (0 iskljui) ; INTE RB0 Interrupt enable (1 ukljui) ; RBIE RB Interrupt enable (0 iskljui) ; INTF Interapt flag za T5 (0 obrii) movwf INTCON ; RBIF Interapt flag za T1-T4 (0 obrii) bcf STATUS,RP0 ; Povratak u BANK0 ; ****** Ponovo uspavaj mikrokontroler ****** Spa sleep ; Uspavaj mikrokontroler do pojave interapta. ; Po njegovoj pojavi, nastavi program bez skoka ; na interapt potprogram nop ; Utroi jedan instrukcijski ciklus ; Preporuljivo nakon buenja
; U ovom trenutku pritisnut je prekida T5. movf call call bcf incf INDF,W Tabl Nacr PORTA,4 FSR,F ; Indirektno itanje eljenog registra ; Uzmi sliku za displej iz tabele. ; Nacrtaj sliku. ; Ukljui segment decimalne take. ; Pozicioniranje pointera na sledei registar
; Test prekoraenja je isti kao i ranije, iako bi sada slobodno mogao biti sa XOR ; operacijom movf addlw btfss goto goto FSR,W .219 STATUS,C Spa Opet ; FSR u W ; Test prekoraenja. FSR treba biti od .32 do .36 ; .37 i vie + .219 = setovan Carry ; Jo nema prekoraenja. Spavaj i dalje. ; Ima prekoraenja. Poni program iz poetka. ; Kraj programa
U Sleep modu oscilator je nestabilan prilikom buenja. Naime, poto je oscilator za vreme spavanja blokiran, nije mu ba lako da odjednom pone proizvoditi iste taktove. Buenje nee biti mogue dok se oscilator ne stabilizuje. Zato se pri korienju SLEEP moda ne moe vriti merenje vremena brojanjem instrukcijskih ciklusa instrukcija u programu, ak iako se buenje interaptom deava tano odreeno vreme nakon ulaska u Sleep mod. Kako RC oscilator najlake poinje sa oscilacijama, vreme za njegovu stabilizaciju je skoro trenutno, dok je kod upotrebe ostalih vrsta oscilatora potrebno 1024 takta oscilatora za kompletnu stabilizaciju. Sve dok se stabilizacija takta ne zavri, mikrokontroler se nee moi probuditi iz SLEEP moda. 88
28. Broja
Kako moete brojali spoljne signale? Jedan od moguih naina predstavlja neprekidno testiranje pina na logiku 0 pa na logiku 1 iz glavnog programa (eng. pooling). Oigledno je da bi ovakaj princip brojanja zauzeo najvie resursa mikrokontrolera. Drugi nain je interaptima. Njima je mikrokontroleru ostavljeno dovoljno vremena za glavni program, a ipak moe pravovremeno odgovoriti na spoljne impulse. U praksi se esto javlja potreba za brojanjem veih vrednosti, pri emu se rezolucija brojaa zaokruuje na dovoljan broj decimala. Da li Vam je toliko bitna razlika u brzini od 0,0025km/h ukoliko ve vozite biciklu preko 30km/h? Teko da e biti ukoliko ne idete na Tour de France (poznata biciklistika trka u Francuskoj). Dakle, kako brojati sa zaokruenjem? Potrebno je podesiti tajmer tako da umesto instrukcijskih ciklusa broji impulse sa RA4/T0CKI pina, setovanjem T0CS bita OPTION_REG registra. U sluaju odnosa preskalera 1:1, trajanje logike 0 i 1 eksternog takta mora biti due od 3 takta oscilatora PIC16F84 (tanije oko 2 takta + 20nS), a u sluaju bilo kog drugog odnosa due od 5 takova (tanije 4 takta + 40nS). Osim promene izvora takta tajmera, sve je ostalo isto. Preskaler se podeava kao kod tajmera, interapt se izaziva kao kod tajmera, ak se i upisivanjem u TMR0 registar inicijalizuje tajmer i preskaler. Na taj nain Timer0 ima funkciju brojaa (eng. Counter). ta se dobija upotrebom ovakvog brojaa? Umesto da se interapt izaziva prilikom svakog impulsa, izazivae se tek prilikom prekoraenja brojaa. Za odnos preskalera od 1:1 to znai da e se interapt izazivati nakon svakog 255-og impulsa. Tako za glavni program ostaje mnogo vie resursa. Ogranienjem minimalnog trajanja logike 0 i logike 1 ogranien je i maksimalni takt koji moe meriti mikrokontroler. Meutim, ovo se moe efikasno reiti korienjem eksternih integrisanih delitelja signala (npr. 74390 ili 4040), koji dodatno hardverski dele ulazni signal. Ovde su moniji mikrokontroleri u prednosti zbog postojanja vie tajmera. Na primer, jedan bi se iskoristio za brojanje eksternih impulsa, a drugi za to vreme moe generisati stabilnu vremensku bazu. Poreenjem ove dve vrednosti moe se lako dobiti frekvencija eksternog signala. Za vie detalja pogledajte AN689 Voje Antonia i AN592.
89
29. Reset
Najjednostavnije reeno, reset slui da izvravanje programa pone iz poetka. PIC16F84 ima 3 izvora reseta. Prvi je svakako reset prilikom dovoenja napona napajanja (eng. POR Power-on Reset). Unutar mikrokontrolera nalazi se malo elektrino kolo koje detektuje porast napona napajanja do napona dovoljnog za rad mikrokontrolera. U trenutku dostizanja nominalnog napona, mikrokontroler se resetuje. Ovim se spreava rad mikrokontrolera pri preniskom naponu napajanja. Ukoliko je potrebno, moe se ukljuiti PWRTE (eng. Power-up Timer Enable) konfiguracioni bit koji dri mikrokontroler u stanju reseta oko 72mS od dovoenja napona napajanja. Ovo kanjenje realizovano je internim RC oscilatorom nezavisnim od takta oscilatora. To je dovoljno da se napon napajanja podigne na nominalnu vrednost i da oscilator mikrokontrolera pone proizvoditi iste nepriguene oscilacije. Nakon to se ovo kanjenje zavri, mikrokontroler (za svaki sluaj) eka jo 1024 takta oscilatora pre nego to pone izvravati program. Drugi izvor reseta je MCLR pin mikrokontrolera. On mora uvek biti dran na logikoj jedinici. Obino se to realizuje povezivanjem sa naponom napajanja preko otpornika od 10k. U emama u ovom uputstvu on je spojen direktno zbog vee preglednosti eme, i jer se ne koristi. Pri dovoenju logike 0 na ovaj pin (spajanje sa masom), mikrokontroler se resetuje. Za svaki sluaj u ulaznom stepenu ovog pina postavljen je mitov okida koji ima ulogu filtriranja slabih impulsa, koji bi mogli prouzrokovati nehotini reset mikrokontrolera. Poslednji izvor reseta nauili ste u delu sa WDT. Moete izvriti softverski reset namernim izostavljanjem CLRWDT instrukcije u eljenom delu programa. Iako reset prvenstveno slui za ponovni start programa, testiranjem stanja TO i PD bitova STATUS registra, mogue je utvrditi na koji nain je izazvan reset, i na osnovu toga nastaviti rad programa. TO 1 1 0 0 1 1 1 PD 1 0 0 1 0 1 1 Stanje Stanje nakon izvrenja CLRWDT instrukcije Stanje nakon izvrenja SLEEP instrukcije WDT reset za vreme SLEEP moda WDT reset za vreme normalnog izvravanja programa MCLR reset za vreme SLEEP moda ili buenje interaptom MCLR reset za vreme normalnog izvravanja programa POR reset pri dolasku napona napajanja
U prilogu ovog uputstva moete videti inicijalno stanje svih registara nakon reseta.
90
Ovaj tip oscilatora moe se koristiti za pun opseg frekvencija mikrokontrolera (DC do 4MHz, odnosno do 20MHz za bre verzije PIC16F84 mikrokontrolera). Mana mu je loa stabilnost frekvencije i etanje frekvencije usled promene temperature. Preporuene vrednosti otpornosti su od 3k do 100k, a kapacitivnosti preko 20pF. Gornja granica kapacitivnosti zavisi iskljuivo od eljene maksimalne frekvencije. to se tie mikrokontrolera, on e bez problema raditi ak i sa taktom oscilatora manjim od 1Hz. Kao lenjivac. U nekim PIC mikrokontrolerima (naalost ne u PIC16F84) nalazi se integrisani hardverski RC oscilator. Zbog preciznijeg takta, Microchip kalibracioni niz snima u deo programske memorije. Kasnije se ovaj niz moe proitati i softverski podesiti. Na OSC2 pinu pri radu RC oscilatora dobija se etvrtina takta oscilatora, to se moe iskoristiti za sinhronizaciju dodatnih eksternih ureaja sa mikrokontrolerom. U SLEEP modu oscilator se blokira, pa ni ovaj signal vie nije dostupan. Iako je oscilator mikrokontrolera nezavistan od ostatka hardvera, mogue je primenjujui male softversko hardverske trikove indirektno uticati na njegovu frekvenciju. Dovoljno je npr. jednim pinom mikrokontrolera ukljuivati paralelno povezivanje otpornika u RC lanu. Postavljanjem pina na logiku 0 ili 1, dodatni otpornik e se paralelno spojiti sa ve postojeim otpornikom, smanjujui rezultujuu vrednost otpornosti. Tako se moe grubo menjati frekvencija oscilatora. Ovaj princip moe biti iskorien za smanjenje frekvencije oscilatora u periodima kada mikrokontroleru nije potrebna puna brzina ime bi se istovremeno smanjila potronja mikrokontrolera. Meutim, zbog preporuenih vrednosti otpornosti (do 100k) nije 91
preporuljivo ovim nainom menjati frekvenciju u veim opsezima. Zbog toga se moe umesto samo otpornika ukljuivati dodatni RC lan. Vie o ovom principu imate na sajtu http://www.romanblack.com/ u delu PIC with 2 clock speeds! Ukoliko je potrebno rad mikrokontrolera sinhronizovati sa eksternim ureajima, moe mu se spolja obezbediti spoljni takt. Konfiguracioni bitovi trebaju u tom sluaju biti podeeni na LP, XT ili HS. OSC2 pin je poeljno povezati na masu mikrokontrolera preko otpornika vee vrednosti (10k), zbog smanjenja interferencije, iako to poveava potronju mikrokontrolera. Ukoliko nije potrebna velika brzina izvravanja instrukcija, a bitna je potronja i stabilnost frekvencije, (npr. sat na baterije) PIC treba raditi sa 32KHz-200KHz kristalom. Na manjem taktu zbog manjeg pojaanja integrisanog oscilatornog kola PIC troi manje struje nego inae. Za ovakvu vrstu oscilatora treba podesiti konfiguracioni bit oscilatora na OSC LP. Ukoliko je bitna stabilna frekvencija a i cena PIC16f84, dobar izbor bi bio kristalni oscilator do 4MHz. Za njega je potrebno konfiguracioni bit podesiti kao - OSC XT. A ukoliko je brzina imperativ, mogu se kupiti verzije PIC16F84 mikrokontrolera koje mogu bez problema raditi na taktu veem od 4MHz. Naalost, one su i skuplje. Njihov konfiguracioni bit potrebno je podesiti kao OSC HS. U ovom modu zbog najveeg pojaanja integrisanog oscilatornog kola PIC16F84 troi najvie elektrine energije. Za ova 3 naina sa kristalnim oscilatorom primenjuje se sledea ema: Frekv. (Khz) 32 200 100 455 2000 Otpornik je potreban samo za retke tipove kristala. U najveem broju sluajeva moe se izostaviti. HS mod mogu koristiti jedino tipovi PIC16F84 mikrokontrolera predvieni za rad na visokim frekvencijama. 4000 8000 16000 20000 Kapac. (pF) 68-100 15-30 68-150 22-100 15-68 15-68 10-68 10-22 5-10 Konfig. bitovi LP LP XT XT XT XT HS HS HS
Dizajn internog oscilatora zahteva upotrebu paralelno rezanog kristala. Meutim, i redno rezani kristali mogu se koristiti kao izvor takta, ali jedino uz eksterno oscilatorno kolo. Njihova upotreba u emi kristalnog oscilatora dovee do frekvencije koja odstupa od specifikacija u karakteristikama proizvoaa kristala. 92
Ukoliko elite imati izuzetno stabilnu frekvenciju moete umesto obinih koristiti OCXO (eng. Oven Controlled Xtal Oscillator) kristale koji u istom kuitu imaju kristal, greja i termostat. Za napajanje grejaa potrebno je dovesti spoljni izvor napajanja koji naalost dodatno poveava potronju kola. Grejaem i termostatom regulie se konstantna temperatura kristala iznad sobne temperature, tako da je temperaturni drift frekvencije kristala minimalan. Kako su takvi kristali (i takva kuita) dosta skuplji od obinih, moete ih sami napraviti sledei uputstva sa sajta http://www.romanblack.com/ u delu Simple xtal oven for accurate clocks. Keramiki oscilator obino je zajedno sa kondenzatorima spakovan u zajedniko tropinsko kuite. Takvi elementi nazivaju se keramiki rezonatori. Vea kapacitivnost kondenzatora poveava stabilnost oscilatora, ali takoe poveava i vreme potrebno za stabilizaciju oscilatornog kola pri ukljuenju mikrokontrolera ili buenju iz SLEEP moda. U principu, ova 3 stanja konfiguracionih bitova (LP, XT i HS) razlikuju se jedino u pojaanju internog invertora oscilatornog kola to omoguava razliit opseg frekvencija. Ukoliko Vam se desi da neki kristal ne moe proraditi u jednom modu, probajte promeniti konfiguracione bitove oscilatora. Najbolje je koristiti oscilator sa najmanjim moguim pojaanjem, uz uslov da se njime moe postii eljena brzina oscilatora. Za detalje o tipovima oscilatora, pogledajte AN588 sa http://www.microchip.com/. estitam! Sada znate funkcije svih pinova mikrokontrolera, upotrebu svih 35 instrukcija i svih 15 registara. Meutim, tek ste poeli sa uenjem. Skoro svaki softverski problem moe se reiti na vie naina. Ukoliko elite da se odreeni deo programa izvrava 5 puta, potrebno brojanje moete implementovati sabiranjem, oduzimanjem, inkrementacijom, dekrementacijom pa ak i rotacijom. U sledeim poglavljima upoznaete se sa najee korienim softversko hardverskim tehnikama za realizaciju odreenih zadataka.
93
Na isti nain za duplo krau pauzu moete napisati: movlw call PAUZA / 2 ; PAUZA / 2 = .50 Cekaj ; Idi na potprogram
Asembler u oba sluaja za vreme asembliranja rauna vrednosti koje se trebaju nai na odreenim mestima. One u svakom sluaju moraju biti poznate pre raunanja. Neke od aritmetikih operacija koje moe izvriti asembler su sledee:
* / % + -
negacija (po drugom komplementu) mnoenje deljenje moduo (ostatak pri deljenju) sabiranje oduzimanje
eljeni prioritet operacija moe se definisati zagradama. Npr. (8-6)*5. Osim matematikih, asembler moe izraunati i vrednosti odreenih logikih operacija. Na primer:
~ komplement << rotacija ulevo (bez Carry Flaga) >> rotacija udesno (bez Carry Flaga) & AND ^ XOR | IOR
Prilikom ovakvih vrednosti morate biti sigurni da parametar ne moe izai izvan dozvoljenih granica. Isto tako, morate obratiti panju na mogue zaokruivanje broja (na primer prilikom deljenja). Sledea pogodnost koju prua MPLAB asembler je zamena teksta. Ukoliko u programu imate ovakav deo: TASTER equ btfsc goto goto 3 PORTA,TASTER Prit Otpu ; Taster je povezan na RA3 pin ; Da li je taster pritisnut? ; Jeste ; Nije
i dalje je potrebno pamtiti na kom je portu povezan taster. Zamenom dela teksta za tim nema potrebe. #define btfsc goto goto TASTER TASTER Prit Otpu PORTA,3 ; Zameni izraz ; PORTA,3 reju TASTER ; Da li je taster pritisnut? ; Jeste ; Nije
#define direktivom nije mogue zameniti vei deo koda (2 ili vie instrukcija). Za to se koriste makroi. ak je mogue u makro preneti odreene parametre ranije definisane. #define Test macro extern btfsc goto goto endm TASTER PORTA,3 ; Imenuje nazive port,pin ; Odreuje ulazne parametre Prit,Otpu ; Oznaava da su labele ili registri ; definisani izvan makroa port,pin ; Da li je taster pritisnut? Prit ; Jeste Otpu ; Nije ; Direktiva za oznaku kraja makroa
Kad god je unutar programa potrebno na osnovu pritisnutog tastera otii na Prit ili Otpu delove, dovoljno je kasnije umesto gornjeg koda napisati samo oznaku labele makroa i parametra Test TASTER. Kako je imenom TASTER zamenjena oznaka odgovarajueg porta i pina, vrednosti port i pin unutar makroa uzee ove vrednosti. Na taj nain se u makro ubacuju eljeni parametri. Unutar makroa mogue je koristiti sve instrukcije kao i u glavnom programu. Meutim, kako se makro poziva iz spoljnog programa, poeljno je da labele i registri unutar makroa ne dou u konflikt sa delovima programa izvan makroa. Zbog toga je potrebno unutar makroa definisati koriene unutranje i spoljne labele i registre. Na taj nain mogue je i unutar glavnog programa i unutar makroa imati labelu istog naziva. U makrou ona mora biti definisana kao interna, to znai da joj program spolja ne moe pristupiti. Labele definisane kao eksterne mogu se pozivati i iz makroa. Za kompletno uputstvo o upotrebi makroa, direktiva i aritmetiko logikih operacija pogledajte DS33014J sa http://www.microchip.com/.
95
32. Komentari
Na poetku ovog uputstva, malo se prialo o komentarima. U ovom poglavlju upoznaete se sa modifikacijama zaglavlja tako da Vam bude prilagoenije, i sa nainima komentarisanja registara koji imaju bitove razliitih funkcija. Seate se zaglavlja koje ste do sada koristili. Prepravite ga po sledeem: ;********************************************************** ; Autor : ; Datum : ; Verzija : ; Naslov : ; ; Opis hardvera : ; Opis softvera : ; Potrebni fajlovi : p16F84.inc ; ;********************************************************** list #include __CONFIG p=16F84 ; Definie upotrebljeni mikrokontroler <p16F84.inc> ; Ubacuje nazive registra u program _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ; CP - zatita od itanja ; WDT - watchdog tajmer ; PWRTE - kanjenje po ukljuivanju ; XT OSC - kristalni oscilator ; LP OSC - oscilator male potronje ; HS OSC - brzi oscilator ; RC OSC - otpornik i kondenzator
; ****** Inicijalizacija registara ****** cblock 0x0C TEMPW ; Privremeno uvanje W registra TEMPSTATUS ; Privremeno uvanje STATUS registra SPORTA ; Shaddow registar za PORTA SPORTB ; Shaddow registar za PORTB endc ; ****** Inicijalizacija vrednosti u EEPROM memoriji ****** org 21x00 ; Poetak EEPROM memorije ; de 0x00 ; Inicijalizacija prvog bajta ; ****** Start programa ****** ORG 0x00 goto Main ; Start programa ;
96
; ****** Interapt potprogram ****** ORG 0x04 movwf TEMPW swapf STATUS,W movwf TEMPSTATUS ; Prostor za interapt potprogram. Back bcf bcf bcf bcf INTCON,T0IF INTCON,INTF INTCON,RBIF INTCON,EEIF
; Dozvoli nove interapte tajmera ; Dozvoli nove interapte prekidaa ; Dozvoli nove interapte po promeni stanja ; Dozvoli nove interapte EEPROM-a ; TEMPSTATUS sa okrenutim niblovima ; u W. Dva puta okrenuti niblovi daju ; prvobitno stanje koje ide u STATUS ; Jednom okreni niblove u samom ; TEMPW registru, ; a drugi put sa W kao odreditem. ; Povratak iz interapt rutine.
; ****** Poetak programa ****** Main banksel TRISA movlw movwf movlw movwf movlw b'00000000' TRISA b'00000000' TRISB
b'00000000' ; ; !!!!! +------ PS0-PS2 - 000=1:2 001=1:4... ; !!!!+-------- PSA - 1=WDT 0=tajmer ; !!!+--------- T0SE eksterni takt 1=\ 0=/ ; !!+---------- T0CS - 1= eksterni takt 0=takt tajmera ; !+----------- INTEDG - 1=/ 0=\ ; +------------ RBPU - 0=uklj. 1=iskljueni otpornici OPTION_REG ; PORTA b'00000000' PORTA SPORTA b'00000000' PORTB SPORTB ; BANK0 ; ; Inicijalizacija stanja portova i ; Shaddow registara ; ; ; 97
movlw
movwf Start
b'00000000' ; ; !!!!!!!+----- RBIF ; !!!!!!+------ INTF ; !!!!!+------- T0IF ; !!!!+-------- RBIE ; !!!+--------- INTE ; !!+---------- T0IE ; !+----------- EEIE ; +------------ GIE INTCON ;
Na ovaj nain program je pregledniji nego ranije, razumljivije je znaenje bitova u OPTION_REG i INTCON registru, a najee korieni registri su unapred inicijalizovani pravilnim redosledom, to smanjuje mogunost nepravilne inicijalizacije. Delove koji se ne koriste lake je odjednom obrisati, nego ih po potrebi iznova pisati za svaki novi program. Po potrebi u zaglavlje se mogu dodati i najkorieniji delovi programa (npr. za pauzu, za korienje EEPROM memorije ili RS232 veze), ali je praktinije odvojiti ih u zasebne celine u sklopu potprograma, na primer ovako: ;*********************************************** ; Tabela za ispis cifre na LED displeju ; Mora se nalaziti u bloku od 256 bajtova. Tabl movf CIFRA,W addwf PCL,F retlw b'01111110' ;0 retlw b'00001100' ;1 retlw b'10110110' ;2 retlw b'10011110' ;3 retlw b'11001100' ;4 retlw b'11011010' ;5 retlw b'11111010' ;6 retlw b'00001110' ;7 retlw b'11111110' ;8 retlw b'11011110' ;9 Moete ih takoe ubaciti i u formi makroa, to listing programa ini preglednijim. Prilikom pisanja programa neki put ete koristiti TAB a neki put par razmaka. MPLAB za razliku od ostalih tekst editora za TAB postavlja 4 (umesto 8) razmaka. Zato je dobro pre tampanja listinga programa dodatno srediti .asm fajl. Za to moete koristiti ASPIC_FIX program sa http://www.embedinc.com/ . 98
33. Maskiranje
Pod maskiranjem se podrazumeva izdvajanje eljenog bita prepisivanjem niza nula ili jedinica u ostale. Pretpostavimo da je potrebno dovesti trei bit registra PRIKAZ na trei bit PORTA registra, ali tako da se ne promeni stanje ostalih bitova PORTA registra. movf movwf movlw andwf bcf iorwf movwf movwf PORTA,W ; PORTA u W, SPORTA ; a odatle u Shaddow registar b'00001000' ; Maskiranje svih osim treeg bita PRIKAZ,W ; Rezultat b'00001000' ili b'00000000' u W, ; u zavisnosti od stanja treeg bita ; PRIKAZ registra SPORTA,3 ; Resetovanje ranijeg stanja treeg bita SPORTA,W ; Postavljanje samo treeg bita na novu vrednost ; Rezultat u W, PORTA ; a odatle u PORTA registar i SPORTA ; u SHADDOW registar.
Rezultat AND operacije nad bitovima, bie 1 samo ako je na oba bita prisutna logika 1. Ukoliko se ostali bitovi maskiraju, u W e se nai jedino stanje treeg bita PRIKAZ registra. Nasuprot AND operaciji, rezultat IOR operacije daje 1 ukoliko je bar 1 bit na logikoj 1. U tom sluaju (budui da je trei bit resetovan BCF instrukcijom), stanje treeg bita SPORTA registra zavisie jedino od stanja treeg bita W registra, koje je preuzeto iz PRIKAZ registra. Ostali bitovi u SPORTA registru zadrae svoja stanja, jer IOR operacija sa bilo kojom vrednou bita i nulom, daje sam taj bit.
99
34. Kompresija
Kompresija je postupak kojim se troi manje memorije za uvanje veeg broja podataka efikasnijim smetanjem podataka u memoriji. Osnovni preduslov je da se u podatcima nalaze prazni (neiskorieni) bitovi. Na primer, ukoliko je potrebno u EEPROM snimati grupe od dva bita (kao u primeru sa buenjem iz SLEEP moda), teta je ne iskoristiti i ostatak bitova u bajtu. A ukoliko nije poznata konana veliina (kraj) memorisanih podataka, mogu se brojati ciklusi snimanja i po zavretku snimanja snimiti u npr. zadnjoj EEPROM adresi (0x3F). Ukoliko se snimaju samo 2 bita, onda je raspoloiva memorija u kompresovanom stanju 4 puta (8 bita / 2 bita) vea od maksimalne. Za EEPROM to znai da umesto 64 osmobitna, postaje dostupno 128 etvorobitna (128 nibla) ili 256 dvobitna dela. Kompresija, nije ograniena samo na EEPROM memoriju. Moe se bez problema koristiti u obinoj kao i u programskoj memoriji u tabelama. Normalno, u sluaju programske memorije podatke u tabeli nije mogue menjati, ve samo itati. Pretpostavimo da je potrebno prva dva bita iz registara STANJE1, STANJE2, STANJE3 i STANJE4 kompresovati u registar STANJE. movlw andwf movwf rlf rlf movlw andwf iorwf rlf rlf rlf rlf movlw andwf iorwf rrf rrf rrf movlw andwf iorwf bit7 ST4.1 ST4.0 00000011b STANJE1,W STANJE STANJE2,F STANJE2,F 00001100b STANJE2,W STANJE,F STANJE3,F STANJE3,F STANJE3,F STANJE3,F 00110000b STANJE3,W STANJE,F STANJE4 STANJE4 STANJE4 11000000b STANJE4,W STANJE,F ST3.1 ; Maskiranje nepotrebnih bitova ; Prva dva bita iz STANJE1 registra u W ; a odatle u STANJE registar ; Rotacija bitova tako da ; dou na pravo mesto ; Maskiranje nepotrebnih bitova ; Sledea dva bita iz STANJE2 registra u W ; a odatle u STANJE registar ; Rotacija bitova tako da ; dou na ; pravo ; mesto ; Maskiranje nepotrebnih bitova ; Sledea dva bita iz STANJE3 registra u W ; a odatle u STANJE registar ; Rotacija bitova ; tako da dou ; na pravo mesto ; Maskiranje nepotrebnih bitova ; Zadnja dva bita iz STANJE4 registra u W ; a odatle u STANJE registar bit0 ST1.0
ST2.0
ST1.1
100
Proces vraanja u prvobitno stanje (iz STANJE u STANJE1, STANJE2, STANJE3 i STANJE4) naziva se dekompresija. movf movwf rlf rlf movf movwf rlf rlf movf movwf rlf rlf movwf STANJE,W STANJE1 STANJE,F STANJE,F STANJE,W STANJE2 STANJE,F STANJE,F STANJE,W STANJE3 STANJE,F STANJE,W STANJE4 ; STANJE u W ; Prva dva bita u STANJE1 ; Rotacija bajtova tako da ; dou na pravo mesto ; STANJE u W ; Sledea dva bita u STANJE2 ; Rotacija bajtova tako da ; dou na pravo mesto ; STANJE u W ; Sledea dva bita u STANJE3 ; Rotacija bajtova tako da ; dou na pravo mesto ; Zadnja dva bita u STANJE4
U ovoj dekompresiji na tanu vrednost postavljeni su samo nulti i prvi bit u svakom registru, a stanje ostalih bitova zavisi od stanja bitova u ostalim registrima. Ukoliko je to nepoeljno, ostali bitovi mogu se setovati ili resetovati maskiranjem. Bitova za Potreban kompresiju broj delova 1 2 3 4 5 6 7 8 8 4 8 2 8 4 8 1 Bitova za pune bajtove 8 (1) 8 (1) 24 (3) 8 (1) 40 (5) 24 (3) 56 (7) 8 (1) Na isti nain mogue je izvriti kompresiju i dekompresiju podataka koji sadre vie od 8 bitova, sa tim to se onda podatci uvek snimaju u vie od jednog bajta. Osim ovog, postoje i mnogo komplikovaniji naini kompresije (npr. ZIP algoritam). Budui da oni prevazilaze okvire ovog uputstva, ovde nee biti razmatrani. Sa kompresijom broja bitova sa kojima osmobitni bajt nije deljiv, postupak je malo tei. Potrebno je odrediti minimalan broj punih bajtova, kompresovati bitove u njih, a zatim ih redom snimati u memoriju.
Imajte na umu da se EEPROM memorija troi za vreme snimanja. Zbog toga nije poeljno snimati svaki dvobitni deo posebno. Sigurnije je saekati da broj delova dostigne celobrojni broj bajtova, i tek onda snimiti ceo bajt u EEPROM.
101
Z=0? STATUS,Z ; If Z = 0 Isti ; else goto Isti Razliciti ; then goto Razliciti Ne Isti
Razliiti
Kao to primeujete, u programu se ne testira realno stanje registara, ve jedino logiko stanje odgovarajueg flaga (odnosno bita) unutar registra. Kako e stanje flaga direktno zavisiti od rezultata prethodne instrukcije (5 XOR 5 = 0 pa je Z setovan) koja utie na njegovo stanje, upravo je njegovim testiranjem omogueno grananje. Probleme moe izazvati i razumevanje preskoka naredne instrukcije. Naime, prilikom izvrenja btfsc ili btfss instrukcije, nema realne potrebe (osim lake itljivosti takvog programa) za dve goto instrukcije, jer e program u sluaju da je odgovarajui uslov ispunjen (setovan ili resetovan flag) preskoiti narednu instrukciju. movlw xorwf btfss goto Isti ... .12 BROJ,W ; Broj 12? ; Uporedi Da STATUS,Z ; If Z = 1 Razliciti ; else goto Razliciti ; then Isti Z=1? Ne Razliiti
Razliciti ...
; Razliciti
Isti
Iako je jednostavnije algoritme testiranja mogue napraviti bez dve goto instrukcije, dok ne usavrite programiranje upotrebljavajte prvi oblik (sa dve GOTO instrukcije). Pored btfsc i btfss instrukcija, teko je razumeti i incfsz i decfsz instrukcije. Pogledajte ilustraciju njihove primene u algoritmu koji broji od 25 do 0: movlw movwf Sman decfsz goto Broj0 .25 BROJ BROJ,F Sman ; .25 ; u BROJ ; BROJ=0? ; Nije, vrati se ; Jeste. Da
102
103
Postupak je mogue skratiti poreenjem viestruko XOR-ovanih vrednosti: movf xorlw btfsc goto xorlw btfsc goto xorlw btfsc goto goto SLOVO,W 'G' STATUS,Z Label1 ; Broj u W ; Da li je to slovo G? ; Da li su isti? ; Jesu, idi na Label1
'G' ^ 'R' ; Da li je to slovo R (G XOR (G XOR R) = R) STATUS,Z ; Da li su isti? Label2 ; Jesu, idi na Label2 'R' ^ 'Z' ; Da li je to slovo Z (R XOR (R XOR Z) = Z) STATUS,Z ; Da li su isti? Label3 ; Jesu, idi na Label3 Label4 ; Nije nijedna vrednost od ponuenih. ; Idi na Label4
U ovom sluaju asembler e prilikom asembliranja programa izraunati vrednost G XOR R (oznaka ^ oznaava XOR logiku operaciju) i postavie dobijenu vrednost na rezultat. Na taj nain uteeno je vreme potrebno za runo XOR-ovanje. Jednom XOR-ovana vrednost ponovo se XOR-uje i takva se uporeuje sa ostalim. 104
Osim XOR operacije testiranje jednakosti moe se izvriti i oduzimanjem dva broja i testiranjem Zero flaga. movlw subwf btfss goto goto 'G' SLOVO,W STATUS,Z Razliciti Isti ; Slovo G? ; W = SLOVO - 30 ; Da li je W = 0 (bie kada su vrednosti iste)? ; Vrednosti se razlikuju ; Vrednosti su iste
Testiranje oduzimanjem vie se sree u programima. Verovatno jer je jednostavnije za razumevanje. Ukoliko imate estu promenu vrednosti registra koji testirate bez mogunosti testiranja njene jednakosti sa zadatom vrednou neposredno nakon promene (npr. test TMR0 registra), pouzdanije je testirati prekoraenje vrednosti testom Carry (umesto Zero) flaga. Ovo je bolji nain jer je mogue da izmeu dve uzastopne provere (pogotovu ukoliko koristite due interapte ili retko testirate jednakost) registar doe a zatim i pree preko zadate vrednosti pre provere. Carry flag bi (za razliku od Zero flaga) bio setovan i pri dostizanju vrednosti .0, a i pri prekoraenju. Detaljniji postupak prekoraenja nauiete u narednom poglavlju.
105
Prilikom oduzimanja broj 2 se menja u svoj drugi komplement (0xFE) i ova vrednost se sabira sa vrednou iz registra BROJ. Stoga, ukoliko je BROJ manji od 2 nee biti setovan Carry flag, pa e se dalje izvravanje nastaviti od labele Manji. Kako se Carry flag setuje i kada su brojevi jednaki, ukoliko je BROJ vei ili jednak broju 2 program e se nastaviti od labele Veci. Ukoliko se okrene formula W = BROJ - 2 u W = 2 - BROJ mogue je testirati malo drugaija stanja. Na primer: movf sublw btfss goto goto BROJ, W .2 STATUS,C Veci Manji ; BROJ u W ; W = 2 - BROJ ; Testiraj prekoraenje ; W<0; BROJ > 2 ; W>=0; BROJ <= 2
I u ovom sluaju Carry flag e biti setovan kada su brojevi jednaki. Da bi eliminisali jednakost mogue je kombinovati jedan od ovih algoritama sa proverom jednakosti: movlw xorwf btfsc goto xorwf subwf btfss goto goto .2 BROJ,W STATUS,Z Isti BROJ,W BROJ,W STATUS,C Manji Veci ;2uW ; Uporedi ; Da li su isti? ; BROJ = 2 ; Vrati inicijalnu vrednost (2) u W duplim XOR ; Umesto ovoga moglo se pisati i movlw .2 ; W = BROJ - 2 ; Testiraj prekoraenje ; BROJ < 2 ; BROJ > 2
Dupla XOR operacija upotrebljena je da bi vrednost sa kojom se testira BROJ mogla biti uneta u samo jednoj instrukciji, to omoguava laku izmenu testirane vrednosti.
106
Testiranjem jednakosti oduzimanjem umesto XOR-ovanjem, postignuta je uteda dve instrukcije. movlw subwf btfsc goto btfss goto goto .2 BROJ,W STATUS,Z Isti STATUS,C Veci Manji ; ; W = BROJ - 2 ; Da li je rezultat 0? ; BROJ = 2 ; Nije. Testiraj Carry flag. ; BROJ < 2 ; BROJ > 2
107
Na sledei nain moete direktno izvriti njihovu zamenu bez upotrebe dodatnog registra. movf xorwf xorwf xorwf BROJ1,W BROJ2,W BROJ1,F BROJ2,F ; BROJ1 u W ; BROJ1 ^ BROJ2 u W ; W ^ BROJ1 u BROJ1, W se ne menja ; W ^ BROJ2 u BROJ2
Ovaj algoritam mogu je jer se duplo XOR-ovana vrednost bilo kojim brojem ne menja. Potpuno istim nainom mogue je promeniti sadfraj BROJ i W registra. xorwf xorwf xorwf BROJ,F BROJ,W BROJ,F ; ; ;
108
Svakako moete zapaziti da se ovaj postupak ne razlikuje mnogo od tabele. Ogranienja vezana za njih vae i u ovom sluaju. U gornjem programu umesto zadnje intrukcije (goto Program8) moglo se odmah nastaviti sa izvravanjem osmog programa. Ipak, ovako program izgleda preglednije i laki je za analizu. Iako je time utroena jedna instrukcija vie, analiza ovakvog programa je prilino jednostavnija. Morate imati u vidu da e se u programu verovatno javljati greke. Razumljiv i dobro komentarisan program olakava njegovu naknadnu ispravku. U protivnom, nai ete se u gomili naizgled besmislenih instrukcija. esta je pojava da se prilikom kasnijeg razvoja programa vie vremena utroi na njegovu analizu, nego na pisanje novog programa iz poetka. Nije ni udo to se kod nerazumljivih programa naziva pageti kod.
109
Svaki prolazak kroz petlju troi 4S. Addlw traje 1, btfss 1 i goto 2S. I u trenutku izlaska iz petlje (W=0) kanjenje je takoe 4S. Potprogram za svoj rad ne koristi registre. Jedino W. U sluaju da je to potebno, mogue je u W zadati eljenu duinu pauze (4S * W) i skoiti direktno na Pau4. Imajte na umu da je i Call instrukciji potrebno 2S. Za due pauze, mora se koristiti registar (u ovom sluaju PAUZA). Pre poziva potprograma je u W potrebno zadati eljeni broj milisekundi kanjenja. Njim je mogue realizovati pauze od 1 do 255mS ( S). Kas movwf Pet1 movlw call nop nop decfsz goto return PAUZA 0xF8 Pau4 PAUZA,F Pet1 ; W u PAUZA registar ; Inicijalizacija vrednosti ; 248 * 4 + 2 = 994 ovde ; Ostatak, ; za jo 6S ; Smanji vrednost u registru ; Jo petlji. ; Povratak iz potprograma
Ukoliko Vam se ovaj nain ini previe teak, moete isprobati PicLoops program koji generie deo potrebnog kda u zavisnosti od unetog vremena kanjenja i brzine oscilatora. Autor tog programa prestao je da programira mikokontrolere, izbrisao je PicLoops sa svog sajta i sada kolekcionira stare video igrice. Program sam postavio na svom sajtu iji link moete nai na kraju ovog uputstva. Ukoliko ne elite ita instalirati online generator kanjenja imate na linku http://www.piclist.com/cgi-bin/delay.exe. Iako izgleda kao program, radi se o linku. 110
42. Semplovanje
Pretpostavimo da je potrebno odreeno vreme pratiti promene na ulaznim pinovima, i dobijene podatke snimati redom (bit po bit) u RAM registre ili EEPROM memoriju. Takav postupak naziva se semplovanje, a pojedinani dobijeni podaci (logika stanja pinova u odreenom trenutku) semplovi. Kod semplovanja se javljaju etiri problema. Prvi se odnosi na maksimalan broj semplova, drugi na duinu pauze izmeu semplova, trei na rezoluciju semplova, a etvrti na preciznost pauze. Pretpostavimo da je potrebno promenom logikog stanja na jednom pinu pratiti nivo reke (periode plime i oseke). Iako se semplovi mogu uzimati svake milisekunde, tolika preciznost jednostavno nije potrebna. Bie sasvim dovoljno ukoliko se izmeu semplova ubaci pauza od 10 minuta, tako da za 1 sat mikrokontroler dobije 6 sempla, odnosno 6*24 = 144 sempla dnevno. Ovde se javlja prvi problem. Maksimalna raspoloiva koliina memorije. Pogledajte kako se ona moe odrediti. Kako su semplovi jednobitni, oni se mogu kompresovati i tako zauzeti samo 144/8 = 18 EEPROM adresa. Kako EEPROM PIC16F84 mikrokontrolera ima 64 adresa, to znai da bi u njega bilo mogue snimati semplove maksimalno (64*8)/144 = 3,5 dana! Ukoliko Vam je ovaj period previe kratak (idete na odmor u Egipat), morate neto rtvovati. Ili ete kupiti dodatnu EEPROM memoriju, ili ete poveati pauzu izmeu semplova. Pogledajte ta se dogaa ukoliko izaberete drugo reenje. U zavisnosti od raspoloivog vremena (i dubine novanika), odmor u Egiptu moe trajati i do 15 dana (nakon toga postaje dosadno). Znai, za 15 dana moete u EEPROM snimiti maksimalno (64*8)/15 = 34 sempla dnevno. Semplovi bi se uzimali (otprilike) svakih (24*60)/34 = 42 minuta. Ovo je i dalje sasvim dovoljno. Ovde se javlja drugi problem. Dokle e biti dovoljno? Objanjenje daje teorija semplova. Po njoj je bilo koji signal mogue predstaviti semplovima uzetih na frekvenciji koja je bar duplo vea od maksimalne frekvencije originalnog signala. ta to znai? Ukoliko je za period od 24 asa mogua pojava maksimalno dve plime i dve oseke, to predstavlja maksimalno 4 promene logikog stanja na pinu. Da bi se svaka promena sigurno detektovala, semplovanje mora biti bar duplo bre od tih promena, odnosno bie potrebno bar 8 sempla dnevno. Ovo je minimalni dovoljan broj semplova, ali vie semplova e svakako vernije prikazati signal. Na primer, po istoj teoriji svaki analogni audio signal (20Hz 20 kHz) moe se predstaviti digitalnim signalom semplovanim na (dovoljnih) 40kHz, meutim tako malim brojem semplova je teko razlikovati violinu od bas gitare. Dovoljan kvalitet postie se tek pri desetostruko veoj frekvenciji (200kHz). Postoji li jo neki nain? Postoji i odnosi se na poveanje rezolucije semplova. To je trei problem. 111
Do sada je rezolucija semplova bila jednobitna, odnosno omoguavala je samo dva logika stanja (ima/nema vode). Seate se da je pri uenju interapta predlagan metod merenja nivoa reke preko vie ulaznih pinova. Ukoliko se za merenje koriste 3 pina, mogue je dobiti sledea stanja: 000, 001, 011 i 111. Ona se mogu konvertovati u binarni oblik, i tada se dobija 00, 01, 10 i 11. Vidite da je dvobitnom rezolucijom mogue predstaviti 4 nivoa reke. Znai, ukoliko se za merenje nivoa vode koriste tri ulazna pina (umesto jednog), mogue je prikazati etiri nivoa reke uz dva bita unutar sempla. Duplo vie bitova donosi i duplo poveanje memorije. Uglavnom je potrebno odabrati kompromis izmeu dovoljnog broja semplova i njihove rezolucije, a to opet zavisi od konkretnih potreba merenja. Na primer za poetni sluaj (merenje na svakih 10 minuta) uz tri sonde bie potrebno (6*24)*2 = 288 sempla, odnosno 288/8 = 36 bajtova dnevno. Meutim, sada e biti mogue dosta (etiri puta) preciznije pratiti poveanje i smanjenje nivoa. Pauzu izmeu semplova treba to preciznije odrediti. To je etvrti problem. Greka od jedne sekunde unutar jednog sata za petnaest dana narasla bi na greku od 6 minuta. Nekada to moe biti zanemarljivo, ali nekada ne. Zbog to preciznijeg vremena semplovanje se uglavnom izvrava nakon prekoraenja tajmera (ili unutar interapta izazvanih tajmerom). Semplovanje nije ogranieno samo na merenje egzotinih signala kao to je nivo reke. U iduem poglavlju nauiete kako se semplovanje moe efektno iskoristiti unutar debouncinga.
112
43. Debouncing
Ranije ste videli da se debouncing moe realizovati testiranjem tastera, pa kratkim ekanjem, i onda ponovnim testiranjem. Bolji nain predstavlja testiranje tastera vie puta, i izmenu jedino ukoliko je u svim sluajevima testiranja dobijeno novo stanje. Za testiranje se bez problema moe iskoristiti semplovanje, sa tom pogodnou to tada ranije opisanih problema nema. Dovoljno je napraviti petlju (ili petlju unutar petlje), uzeti sempl i resetovati petlju ukoliko se sempl promenio, kako bi testiranje ponovo poelo iz poetka. Ukoliko se petlja zavri, to znai da se stanje prekidaa nije promenilo svo vreme trajanja petlje, pa tako zadnji sempl moe biti uzet kao stabilno stanje prekidaa. Ovako jednostavan princip ima naravno i par mana. Program se treba bar 20mS vrteti u petlji, i za to vreme nee moi da izvrava ostale operacije. Ukoliko kontakti prekidaa neprestano varnie, program nee moi da izae iz petlje. Osim toga interapti mogu izazvati privremen prestanak ili due vreme testiranja prekidaa. Dobar je jedino za programe gde se moe dozvoliti ekanje na pritisnutost (ili otputenost) tastera. U ostalim situacijama trebalo bi koristiti testiranje prekidaa unutar interapta izazvanih tajmerom. Kako se interapti izazvani tajmerom pozivaju prilino retko, potrebno je da semplovanje traje to krae, odnosno da se u jednom prolazu uzme samo jedan sempl, uporedi sa prethodnim i smanji (uvea) unapred zadat broja semplova. Ukoliko je sadanje stanje sempla drugaije od prethodnog, broja bi se ponovo inicijalizovao. Kada broja (napokon) istekne, potrebno je saoptiti glavnom programu da je prekida pritisnut (otputen). Komunikacija izmeu glavnog programa i interapta nije ba jednostavna. Uglavnom se primenjuje komunikacija preko par registara opte namene. Na primer setovan bit 0 registra TASTERI znaio bi da je pritisnut taster LEVO, a setovan bit 1 da je pritisnut taster DESNO. Glavni program trebao bi periodino testirati ove bitove, i u zavisnosti od njihovog stanja preduzimati odreene akcije. U sledeim poglavljima upoznaete se sa par komunikacionih protokola. Jedan deo je hardverski integrisan u savremenijim PIC mikrokontrolerima. Sigurno ete primetiti kompromis izmeu broja pinova koji se koriste za komunikaciju i brzine komunikacije.
113
Kroz takvu mreu probija se na glavni junak nervozni potar. On sa koverte ita dve informacije. Naziv (broj) ulice i broj zgrade. Za oitavanje kompletne adrese memorija bi morala imati ak 16 ulaznih pinova (8 za ulicu i 8 za broj). Ovo se uglavnom reava multipleksom adresne magistrale (vie o principu multipleksa nauiete kasnije), tako da se u memoriju najpre alje broj reda, a za njim i broj kolone. Neophodna sinhronizacija obezbeuje se preko dva (ovo je svakako manje od osam) dodatna pina. Potar kao to sigurno ve znate moe obavljati dve operacije. Moe doneti penziju, ili (doneti raun i) odneti penziju. Da li potar doneti ili odneti penziju (itati ili upisivati podatke u memoriju) zavisi od logikog stanja WE (eng. Write Enable) pina. I na kraju memorija ima ulazni DIN (eng. Data In) i izlazni DOUT (eng. Data Out) pin. Njih je mogue povezati direktno na dva U/I pina mikrokontrolera. Meutim, kako je samo jedan od njih trenutno u funkciji u zavisnosti od stanja WE pina, oni se bez problema mogu spojiti jedan za drugi. Ukoliko se spoje, dobija se jedan U/I pin preko koga je mogue upisati ili proitati jedan bit podataka sa predate adrese. Tako se jedan pin koristi i za ulaz i za izlaz (isto kao i pinovi mikrokontrolera). Naravno, prilikom itanja podatka U/I pin mikrokontrolera povezan za magistralu podataka (spojeni DIN i DOUT pin) morao bi biti definisan kao ulazni (preko TRISA ili TRISB registra), a prilikom upisivanja kao izlazni.
114
To bi bilo to za itanje i pisanje jednog bita. Za itanje i pisanje jednog bajta mogue je redom itati (ili pisati) u grupama od 8 bitova, ili kao kod Commodore 64 kompjutera paralelno adresnoj magistrali dodati jo sedam 4164 DRAM memorija. U tom sluaju veliina adresne magistrale ostaje ista, a magistrala podataka umesto jednog zauzima ak 8 provodnika (ili 16 ukoliko se ulazni i izlazni pinovi memorije ne spoje jedan za drugi). Mogu se koristiti i 4464 memorije koje imaju u sebi 64Kbita * 4 (65536 * 4 bitova), odnosno uz istu adresnu magistralu imaju 4 pina na magistrali podataka (spojeni DIN i DOUT formiraju D1, D2, D3 i D4). Sada ono teko. Svaka bitska DRAM elija sastoji se od jednog kondenzatora i jednog tranzistora. Kako bi se kondenzator posle par mS potpuno ispraznio, ne bi vie bio u stanju uvati podatak, pa se morao povremeno (npr. svake druge milisekunde) osveavati. Tako unutar Spectrum kompjutera Z80 mikroprocesor paralelno sa izvravanjem instrukcija povremeno osveava DRAM memoriju, dok kod C64 video kontroler osveava memoriju za vreme dela instrukcijskog ciklusa u kome mikroprocesor ne pristupa memoriji. Mikrokontroler bi znai morao povremeno proitati sadraj celokupne memorije (ili bar onih memorijskih lokacija koje koristi), a zatim ih ponovo upisati. Teoretski, DRAM memoriju kapaciteta jednog bita moete dobiti povezivanjem kondenzatora direktno na U/I pin mikrokontrolera. Ukoliko mu se najpre odreeno vreme dovede logika 1, kondenzator e se napuniti, i ukoliko se kasnije oita njegovo stanje taj pin e davati logiku 1. Ukoliko mu se pak dovede logika 0, kondenzator e se isprazniti, i kasnije e pri oitavanju davati logiku 0. Da se ne bi vremenom ispraznio, mora se povremeno oitati i osveiti. DRAM memorija ima vie mana nego prednosti. Punjenje i pranjenje kondenzatora zahteva odreeno vreme, tako da je vreme pristupa (eng. access time) elijama sporije od ostalih vrsta memorija. Memorija nee raditi u sluaju pokuaja oitavanja ili upisa veom brzinom od dozvoljene. Osveavanje memorije troi dosta mikrokontrolerskog vremena. Zbog toga se DRAM memorija sve ree koristi i pored niske cene. Razvojem elektronike pojavljuje se SRAM (statika RAM memorija) po pristupanoj ceni. U njoj se memorijske elije sastoje od nekoliko tranzistora povezanih u formi Flip Flopa, tako da im osveavanje nije potrebno, a jednom upisan podatak ostaje u SRAM memoriji sve do upisa sledeeg ili do gubitka napona napajanja. Za razliku od DRAM, u SRAM memoriji je naputen princip multipleksa adresne magistrale (zbog vee brzine), tako da se adresa eljenog bita moe zadati u jednom koraku. Klasian njen predstavnik bila bi npr. 5564 memorija (SRAM 8Kbita * 8). Nezaobilazna je i EPROM memorija. Ona na sebi ima mali stakleni prozor preko koga se moe brisati. Naime, podaci se u EPROM mogu snimati preko odgovarajuih programatora specijalnom procedurom (kao snimanje koda u PIC). Taj proces obino zahteva vie napone od radnih (+12V umesto +5V). Kada se podaci jednom snime u EPROM memoriju, ne mogu se snimiti naredni sve dok se EPROM odreeno vreme ne izloi ultraljubiastoj svetlosti. Taj proces ubrzava curenje naelektrisanja isprogramirane EPROM memorije, i na taj nain se EPROM obrie. Tek onda je mogue ponovno programiranje. Veinu EPROM memorija mogue je postaviti u sleep mod, dovoenjem logike 1 na njen CE (eng. Chip Enable) pin. 115
Ukoliko je na OE (eng. Output Enable) pinu EPROM memorije prisutna logika 1, svi pinovi magistrale podataka (D0 pa nadalje) nai e se u stanju visoke impedanse. To omoguava multipleks magistrale podataka, i njeno deljenje izmeu EPROM i RAM memorije (Commodore 64 koristi isti princip sa svojom ROM memorijom). Pri radu sa bilo kojim eksternim memorijama morate obratiti panju na brzinu pristupa podacima (obino od 45nS do 450nS). Iako je uglavnom mogue donekle overklokovati memoriju, to ne predstavlja dobru praksu. Jednom e svakako stradati. Bolje da to bude to kasnije. Kao to uoavate za upotrebu adresne i magistrale podataka potreban je veliki broj pinova, ali joj je i brzina maksimalna. Zbog toga se najvie koristi u kompjuterima. Mikrokontroleri se zbog velikog broja potrebnih pinova uglavnom uopte ne povezuju sa eksternim hardverom adresnom magistralom, ve se sve vie razvija specifian hardver, kojim se odreenim komunikacionim protokolima moe upravljati manjim brojem pinova, uz manju brzinu pristupa. Za vie detalja pogledajte TB011 sa http://www.microchip.com/.
116
Serijski prenos podataka sastoji se od postavljanja odgovarajueg pina na logiku 0 i logiku 1 u tano odreenim trenutcima. Njegovo uobiajeno stanje je visok logiki nivo (1), a nizak nivo (0) pri tome oznaava startni bit. Pri brzini prenosa podataka od 4800 boda, vreme koje bit provede u stanju logike 0 treba biti 1/4800 = 208S. 8 bita podataka svaki trajanja jednog perioda slede za ovim startnim bitom. Visok logiki 117
nivo dui od perioda jednog bita oznaava stop bit. Bitovi se alju sa prvim bitom najmanje teine (LSB). Podatci se u kompjuteru itaju na polovini bitskog perioda, da bi se pouzdanije detektovalo da li je odgovarajui bit na logikoj 0 ili 1. Prilikom slanja ASCII koda slova A (b'0100 0001') u kompjuter bi se poslala ovakva sekvenca: START 0 0123 4567 1000 0010 STOP 1
Start i stop bit neophodni su radi sinhronizacije prijemnika sa predajnikom. Naponski nivoi RS232 porta su -3V ili nie za logiku jedinicu, i +3V i vie za logiku 0. Ovo se uglavnom moe zaobii, tako to se koriste nivoi od +5V za logiku 0 i 0V za logiku 1, ukoliko je kabl za povezivanje dovoljno kratak. Primeujete da je ovo obrnuto od onoga to biste mogli oekivati! Za tano odreivanje potrebnih pauza moe se koristiti ranije opisan potprogram za kanjenje sa 52 * 4S petljom za jednu bitsku periodu pri 4800 boda. Kako sam program za slanje traje 12S, u W e se nai broj 49. U potprogram se ulazi sa eljenim karakterom u W. Izlaz za kompjuter je na PORTA registru, bit 2 (pin 1). Izl movwf movlw movwf bsf movlw call rrf btfsc goto bsf goto Obr bcf nop TXREG 0x08 BITOVI PORTA,2 .49 Pau4 TXREG,F STATUS,C Obr PORTA,2 Kraj PORTA,2 BITOVI,F Pet .52 Pau4 PORTA,2 .104 Pau4 ; Stavi W u registar predaje ; 8 bitova podataka ; Brojac za bitove ; Startni bit (invertovan, seate se) +5V na RA2 ; 49 decimalno, vreme za kasnjenje ; U potprogramu za pauzu cekaj 49*4=196S ; Prebaci zadnji desni bit u Carry flag. ; Ako je Carry flag = 0, eli se setovanje bita ; (nizak naponski nivo) ; u protivnom je bit = 0 (visok nivo) ; +5V na pinu 1 (RA2) ; Je li gotovo? ; 0V na pinu 1 (RA2) ; da bi obe opcije trajale tano 12S ; 1 bit manje. Preskoi kada doe do 0 ; ima jo bitova. Kanjenje za slanje ovog. ; 52 decimalo, vreme za kanjenje 208S ; Kanjenje za zadnji bit podataka ; 0V (visoko stanje) za stop bitove ; 104 decimalno ; za dva puta dui stop bit ; Povratak
Pet
U ovim potprogramima prikazane su skoro sve potrebne rutine potrebne da bi PIC poslao poruku Zdravo! u kompjuter preko serijskog porta. Ostalo je jo njihovo povezivanje. Program koji sve to povezuje, mogao bi izgledati ovako: 118
Slan bsf movlw movwf bcf clrf movlw call movlw call Blok goto
STATUS,RP0 0x00 TRISA STATUS,RP0 PORTA .50 Kas 0x00 Izl Blok
; Prebacuje u BANK1 ; Postavlja sve pinove kao izlazne ; na PORTA ; Vraa u BANK0 ; RA2 = 0 (RS232 visoko stanje) ; Kasnjenje od 50 mS ; preko potprograma za due pauze ; Ofset za prvi karakter poruke ; Slanje poruke u kompjuter ; Kraj u beskonanoj petlji
Malo komentara o programu: Svi bitovi na PORTA registru su postavljeni kao izlazi. Kako program koristi tabelu, potrebno je testirati njeno prekoraenje. Redosled potprograma, naravno, nije bitan. Bitno je jedino da glavni program (Slan) bude prvi. Za ispravan rad programa, potrebno je osigurati dovoljnu preciznost takta oscilatora, pa se ovaj program moe upotrebiti jedino uz kristalni oscilator od 4MHz. Za povezivanje sa kompjuterom dovoljno je pin 1 mikrokontrolera (RA2) povezati sa pinom 2 (RX) devetopinskog enskog SUB D konektora, i masu (GND) na pin 5 konektora. Kabl ne bi trebao biti dui od 1,5m. U protivnom, morali bi se koristiti odgovarajui drajveri (obino se to radi integrisanim kolom MAX232) namenjeni pretvaranju logikih nivoa sa pinova mikrokontrolera u nivoe pogodne za RS232 komunikaciju. Na strani kompjutera ukljuite Va terminalski program. U samom Windowsu imate Hyper terminal. Izaberite odgovarajui COM port i u podeavanjima izaberite 4800 bita u sekundi, 8 bita podataka, bez provere parnosti i jedan stop bit. Spojite konektor sa kompjuterom i ukljuite mikrokontroler. Svaki put kada ga ukljuite (ili resetujete), poruka Zdravo! e se prikazati na ekranu. U programu nije korien Shaddow registar zbog jasnije ilustracije. Meutim, u realnoj situaciji bilo bi ga korisno implementirati. Iako je za serijsku komunikaciju neophodan tano odreen takt oscilatora, postoje softverske tehnike koje omoguavaju RS232 komunikaciju merenjem signala sa kompjutera, i kalibrisanjem sopstvenog vremena signala i pauze po ovom signalu. Time je omoguena upotreba jeftinijeg RC oscilatora dovoljne brzine. Za detalje pogledajte tehnika uputstva AN510, AN555, AN593 i AN712 sa http://www.microchip.com/. Savremeniji PIC mikrokontroleri imaju hardverski reenu RS-232 komunikaciju. Kod RS423 drajvera prijemnik i predajnik su (kao kod RS232) polarizovani u odnosu na masu. Meutim, naponski nivoi su mu od -4 do -6 za logiku 1 i +4 do +6V za logiku 0. To omoguava da je (uz korienje istog komunikacionog protokola) RS423 kompatibilan sa RS232 drajverom, ali da moe postii brzinu prenosa podataka do 100kB/S, kao i da signal sa jednog predajnika mogu istovremeno primati 10 prijemnika. 119
Terminalski program u kompjuteru nakon prijema sabira redom bitove 0-7 i uporedjuje njihovu parnost sa primljenim bitom parnosti. U sluaju neslaganja prijavie greku ili e jednostavno ignorisati primljeni karakter. Ovaj princip je dovoljno pouzdan za detekciju greke nad jednim bitom poslatog podatka. Meutim, u sluaju pojave greke nad vie bitova bit parnosti nije dovoljan. Umesto provere bita parnosti moe se odreeni broj primljenih bajtova sabrati i uporediti njihov zbir. Na primer ukoliko se u kompjuter alju sledei podatci: 3, 8, 15, 4, 26, 87 u mikrokontroleru bi se izraunao njihov zbir 3+8+15+4+26+87=143 koji bi se poslao nakon podataka unutar par dodatnih bajtova. Kompjuter bi nakon prijema sabrao sve podatke i uporedio dobijeni rezultat sa primljenim. Taj princip naziva se provera ukupnog zbira (eng. checksum). Naalost sa njim su preneeni podatci dui, a ni on nije pouzdan u sluaju pogreno primljena 2 (ili vie) bita (ukoliko na primer nije primljen nijedan bit podataka niti kontrolne vrednosti, svi primljeni bajtovi kao i njihov zbir bie jednaki 0, to pogreno indikuje ispravno primljene podatke). Ovo je ipak mnogo pouzdanije od provere parnosti. Vie o checksumu imate u TB026. Najpraktiniji nain detekcije greaka u prenosu postie se primenom CRC (eng. Cyclic Redundancy Check) algoritma, koji prua najbolji kompromis izmeu brzine algoritma, pouzdanosti detekcije greke i veliine dodatno prenetih podataka. Vie o njegovom principu imate u AN730. 120
U sluaju dvosmerne komunikacije (mikrokontroler ka kompjuteru i kompjuter ka mikrokontroleru) mogue je nakon detektovane greke u suprotnom smeru poslati podatak o rednom broju neispravnog podatka, i na taj nain zatraiti jedino njegovo ponovno slanje, ili pak ponovno slanje cele grupe podataka (tanije za signalizaciju greke pri RS232 vezi koriste se dodatni provodnici, ali se oni uglavnom izbegavaju). Svakako da je ovaj nain prilino vremenski zahtevan, a nije ni mogu u sluaju jednosmerne komunikacije. Da ti problemi prevazili primenjuju se algoritmi za korekciju greaka. Oni e biti detaljnije objanjeni u narednom poglavlju. Uglavnom je potrebno pronai kompromis izmeu najeih vrsta greaka i koliine prenetih podataka za spojni put (provodnici, optika veza, audio veza, radio talasi...) koji se koristi. Pri tome mnogo moe pomoi odgovarajui izbor modulacije signala. Prilikom RS232 komunikacije signali se moduliu preko odgovarajueg drajvera (MAX232) koji pretvara naponske nivoe od +5V i 0V u +15V i -15V, i dalje se oni tako modulisani prenose kroz provodnike. Kod USB ili I2C veze naponski nivoi su 0V i +5V. Kod ostalih vrsta spojnih puteva uglavnom je neophodno eliminisati jednosmernu komponentu napona (duu pojavu logike 0 i logike 1). Zbog toga se za modulaciju sporijih (npr. audio) veza mogu primenjivati RTTY, DTMF, FSK, PSK i razni drugi naini. Za modulaciju brih (npr. optikih) veza najee vrste modulacije su Manchesster, CMI, Miller, MCMI i 5B6B. Iako je radio, audio ili optika komunikacija nesumnjivo interesantna, prevazilazi okvire ovog uputstva, tako da e nadalje biti objanjena jedino veza ianim provodnicima. Uz neodgovarajui izbor modulacije nee Vam pomoi ni najbolji korektivni algoritam. Pogledajte samo kolike su razlike u brzini prenosa podataka preko RS232 i SPI veze, ili u daljini preko I2C i RS485 veze!
121
Meutim ukoliko bi u prenosu podataka dolo do greke u bajtu A, dogaa se sledee: A P 1010 1001 1 B P 0110 1011 1 C P 1101 0010 0
Prijemnik bi najpre na osnovu bita parnosti detektovao da je pogreno primljen bajt A. Da bi ga regenerisao primenjuje XOR nad ispravno primljenim bajtovima B i C. Ovo je slino zakonima u matematici: Ukoliko je A*B=C, onda vai i A=C/B i B=C/A. 0110 1011 B XOR 1101 0010 C = 1011 1001 A Da je pogreno primljen bajt B izvrila bi se XOR operacija nad bajtovima C i A, a da je pogreno primljen bajt C, ne bi se ni izvravala korekcija, jer su nam bitni jedino A i B. Specijalan sluaj predstavljao bi pogreno primljen bit parnosti A ili B bajta. Onda bi se regenerisani bajt uporedio sa originalnim, i u sluaju da su oba bajta ista zakljuio da je pogreno primljen upravo bit parnosti. Kako je proverom bita parnosti mogue ispravno detektovati korupciju samo jednog bita unutar bajta, ovaj princip pogodan je jedino za regeneraciju jednog bita unutar 3 poslata bajta (A, B i C). U sluaju korupcije vie bitova, potrebno je koristiti drugaije algoritme.
122
48. I2C
RS232 komunikacija pogodna je jedino za direktno povezivanje dva ureaja. Njom je teko povezati PIC sa vie ureaja istovremeno (npr. sa A/D konvertorom, dodatnom EEPROM memorijom i jo jednim mikrokontrolerom). Svakako da je takvu komunikaciju mogue ostvariti direktnim povezivanjem pinova mikrokontrolera, ali to troi njihove dragocene pinove, i komplikuje softver zbog razliitih komunikacionih algoritama. I2C (eng. Inter Integrated Circuit bus) veza omoguava povezivanje mikrokontrolera sa jednim ili vie dodatnih ureaja koristei za to samo dva pina, i I2C komunikacioni protokol. Naravno, i ti ureaji moraju imati mogunost (softversku ili hardversku) I2C komunikacije. Zadnjih godina pojavljuje se sve vie hardverskih dodataka koji proiruju upotrebu mikrokontrolera, a za komunikaciju koriste upravo I2C vezu (umesto ranije adresne i magistrale podataka). U I2C vezi mogue je imati jedan glavni mikrokontroler (eng. Master) koji upravlja dodatnim I2C hardverom (eng. Slave), ili pak vie glavnih mikrokontrolera (eng. Multimaster) od kojih svaki moe upravljati dodatnim Slave I2C hardverom. U nastavku e biti opisan jedino prvi sluaj. I2C veza je specifina po tome to se logika 1 ne alje na uobiajeni nain, ve predajnik prilikom predaje logike 1 prelazi u stanje ulaza (visoke impedanse), a logika 1 se javlja pod uticajem (eksternog ili internog) pull up otpornika. Prijemnik je za to vreme takoe u stanju ulaza, ali on (za razliku od predajnika) vodi rauna o signalu koji prima. Na taj nain omoguena je komunikacija preko jedne linije, uz nemogunost kratkog spoja. Preko druge linije Master obezbeuje takt neophodan za sinhronizaciju prijemnika signala. Takt mora biti strogo sinhronizovan sa slanjem signala. Postoji ogranienje njegove maksimalne brzine, ali ne i minimalne, tako da e Slave prilikom slanja podataka po potrebi ekati dok Master ne bude slobodan za njihov prijem (tj. dok Master ne poalje takt). Kako je algoritam I2C protokola razvijen tako da je nemogue da dva ureaja istovremeno alju podatke, svaki Slave ima svoju jedinstvenu adresu preko koje mu se pristupa. Jedan deo adrese mu fabriki dodeljen na osnovu funkcije, a drugi deo bira se fizikim prespajanjem pinova. Svakom Slave hardveru povezanom sa Masterom treba inicirati slanje ili prijem podataka. U sluaju da je potrebno neprekidno testiranje Slave hardvera, neprestano bi se izvravala njihova prozivka (kao u Vojsci). Prilikom prijema bajta za adresiranje Slave hardvera svaki od prikljuenih Slave detektuje da li se radi o njemu, i preduzima traenu akciju (obino slanje ili prijem par bajtova). Svaki Slave hardver ima svoje specifinosti tako da se moraju prouiti njegovi tehniki podatci. Na primer prilikom snimanja bajta u I2C EEPROM memoriju potrebno je poslati 7 bita za adresiranje ba tog Slave hardvera (resetovan LSB u njemu inicira upis), 2 bajta za adresu (za memorije do 64Kb) i 1 bajt podatka. Za itanje se alje 7 bita za adresiranje Slave hardvera (setovan LSB inicira itanje), 2 bajta za adresu i ita se 1 bajt. Poetak, kraj kao i razdvajanje bajtova realizovani su slino kao u RS232 komunikaciji preko START, STOP i jo par kontrolnih bitova. Isto kao RS232 i I2C protokol je hardverski implementovan u monijim PIC mikrokontrolerima. Za vie detalja pogledajte AN515, AN541, AN554 i AN578. 123
Kako je RS485 protokolom mogue da se pinovi predajnika iskljue (tako to preu u visokoimpedansno stanje slino ulazima mikrokontrolera), mogue je na taj nain kao u I2C protokolu preko istih linija paralelno povezati vie mikrokontrolera. Naravno, mora se povesti rauna o spreavanju istovremene predaje (npr. pojedinanim asdresiranjem kao u I2C protokolu). Ovo je mogue jer RS485 standardom nije propisan komunikacioni softver, ve jedino hardver. To znai da moete napisati sopstveni komunikacioni protokol (ili koristiti gotovi RS232 pogotovu ukoliko je hardverski implementovan u mikrokontroleru) koji e zadovoljiti vae konkretne potrebe. To prua slobodu programeru da unutar protokola ugradi sopstvene algoritme prozivke vie dodatnih mikrokontrolera (do 32 ili uz vie drajvera u jednom integrisanom kolu do 256), algoritme detekcije i korekcije greaka, jednom reju da koristei standardan stabilan komunikacioni hardver softverom komunicira na koji god nain eli. Korienjem repetitora mogue je realizovati virtuelno beskonane mree. Meutim uz vee daljine i vie povezanih mikrokontrolera (pogotovu uz repetitore) kanjenje signala moe biti preveliko. to due linije, to vee kanjenje, samim tim i manja brzina. Najvea razlika izmeu RS485 i RS422 protokola je u predajniku. RS422 predajnik ne moe se nai u stanju visoke impedanse, tako da mikrokontroler moe jedino slati signal preko dve linije, dok bi taj signal moglo istovremeno primati do 10 prijemnika. Za vie detalja pogledajte AN1076. Osim ovih, postoji jo par RS (eng. Recommended Standard) protokola poput RS449 i RS530, meutim budui da oni predstavljaju varijaciju ve opisanih principa, kao i da se retko kada koriste, ovde nee biti razmatrani.
125
50. DMX512
Ponekad je dovoljno slati informacije samo u jednom smeru. DMX512 (eng. Digital MultipleX) predstavlja komunikacioni protokol sposoban za adresiranje do 512 prijemnika i koji se uglavnom koristi za upravljanje rasvetom. Za povezivanje se koriste RS485 drajveri, a protokol predstavlja softver za upravljanje tim drajverima. Kako se DMX512 protokolom povezuje jedan predajnik sa vie prijemnika samo u jednom smeru, prijemnici nemaju nain signalizacije neispravno primljenog podatka. Konkretno za sluaj rasvete, to im nije ni potrebno. ak i da doe do greke, ionako e naredni podatak sadrati ispravnu vrednost jaine svetla. DMX512 protokol napravljen je tako da se podaci neprestano (tanije bar jednom u sekundi) alju prijemnicima. Poto je RS232 komunikacioni protokol integrisan u novijim mikrokontrolerima, DMX512 predstavlja modifikaciju RS232 protokola kako bi se njim preko RS485 drajvera moglo adresirati do 512 prijemnika. Modifikacija se sastoji u drugaijem obliku START bita (dosta dua logika 0 pa 1), STOP bita (dve logike 1) i rednom slanju svih 512 bajtova sa STOP bitovima izmeu njih. Broj poslatih bajtova mogao bi se smanjiti za sluaj manjeg broja prijemnika. Prijemnici bi morali redom brojati primljene bajtove kako bi videli koji je bajt za njih. Vie detalja imate u AN1076 i na www.esta.org.
126
51. LIN
LIN komunikacioni protokol podrava dvosmernu komunikaciju preko jednog provodnika (+ masa). Protokol je nastao ukrtanjem I2C i RS232 protokola. Napon na liniji je u neaktivnom stanju na nivou logike 1 generisane (kao kod I2C) pull up otpornikom. Bilo koji lan mree (eng. nod) moe na liniju poslati logiku 0, koja na taj nain prelazi u dominantno stanje i brie postojeu logiku 1. Za razliku od I2C veze umesto linije za takt, podaci se kroz provodnik prenose asinhrono, kao kod RS232 veze. Napon na liniji (generisan pull-up otpornikom) iznosi od 9 do 18V u odnosu na masu. LIN protokol je zbog veeg broja nodova napravljen tako da mikrokontrolerima omogui to jeftiniji hardver, pa je zato mogue koristiti RC oscilatore, pri emu se svi slave nodovi softverski sinhronizuju sa masterom po prijemu njegovog signala. Zbog toga kao sinhronizacioni impuls pre svake poruke master alje bajt b'01010101'. Tako je svakom slave nodu omoguena sinhronizacija korekcijom sopstvenih vremenskih rutina u skladu sa primljenim bitskim vremenima logike 0 i 1. Nakon sinhronizacionog bajta sledi jednobajtno zaglavlje, u kome se saoptava kakvi podaci slede. U njemu 4 bita (bit 0 do bit 3) adresiraju nodove na liniji, 2 bita (bitovi 4 i 5) odreuju duinu informacija (2, 4 ili 8 bajtova), i zadnja 2 bita (6 i 7) slue za proveru parnosti zaglavlja. LIN protokolom nije specifiran format narednih informacija, osim SLEEP komande i checksuma informacija. Kako nakon pojave greke LIN protokolom nije omoguena njena prijava, master moe u delu sa informacijama zatraiti prijemni status od pojedinanih nodova. Svi nodovi mogu primati poruke od ostalih nodova direktno, tako da dodatna intervencija mastera u tom sluaju nije potrebna. Ipak, master mora obezbediti povremenu prozivku nodova u sluaju da su njihovi podaci potrebni ostalim nodovima. Master moe poslati sve nodove u sleep mod, slanjem identifikacionog bajta 0x80. Ostali nodovi po prijemu ove komande trebaju podesiti interapt po promeni stanja na pinu na liniji, tako da i oni mogu otii u sleep mod. Bilo koji nod moe probuditi ostale slanjem 0x80 koda. Po njegovom prijemu svi nodovi se bude i ekaju dalje informacije od mastera. LIN protokol nije stekao veliku popularnost zbog kanjenja u proizvodnji odgovarajuih integrisanih drajvera, male daljine i podlonosti smetnjama usled direktno polarisane linije. Za vie detalja pogledajte AN729, AN235 i AN237.
127
52. DALI
DMX512 komunikacija je jednosmerna. Zato joj je primena ograniena na upravljanje rasvetom. Meutim, njen princip je nepraktian u sluaju kvara sijalice (reflektora). Zgodnije bi bilo kada bi bilo mogue da drajver za sijalicu detektuje da li ona zaista radi, i da po potrebi obavesti master o kvaru. DALI (eng. Digitally Addressable Lighting Interface) protokol je namenjen upravljanju pre svega fluo cevima. Zbog ega ba njima? Zbog toga za istu potronju elektrine energije jau svetlost od njih (Lm/W) daju jedino metal-halidne, sodijumske (i niskog i visokog pritiska) sijalice, kriogenske i retki Luxeon eksperimentalni tipovi LED. to se tie poetnih investicija, od svih ovih tipova jedino fluo cevi se mogu nabaviti po povoljnoj ceni. Iako jedna fluo cev kota oko 1,3 (u odnosu na sijalicu sa uarenim vlaknom koja je oko 0,2), vremenom e se isplatiti kroz manji raun za elektrinu energiju. Verujte mi na re. Imam ih u svim prostorijama osim kupatila (zbog vlage). Iako se regulacija svetlosti sijalica sa uarenim vlaknom lako implementira faznom regulacijom, kod fluo cevi sa prigunicama je to mnogo tee izvesti. Tek su se oko 2000-te godine pojavili tranzistori dovoljno jeftini i dovoljno velikog probojnog napona da mogu posluiti kao konvertori mrenog napona u napon potreban za rad fluo cevi. Taj princip koristi DALI za funkciju dimera (eng. DALI dimming ballast). Dimerom je omogueno da se potronja elektrine energije jo vie smanji. Na DALI interfejs mogue je povezati do 64 nodova. Regulacija svetlosti postignuta je u 255 koraka, ali logaritamskog odnosa. On prua prirodniji odnos pojaanja i smanjenja svetlosti. Takoe je mogue proizvesti i mone efekte postepenog pojaanja ili smanjenja svetla, podeavalje svetla po grupama i slino. DALI protokol nema posebne integrisane drajvere. Umesto njih, implementirani su diskretnom tehnologijom. Tanije, za prijem i predaju signala koriste se optokapleri, ime je pored niske cene drajvera omogueno i galvansko odvajanje linije od mrenog napona. Kako je DALI protokol rezultat saradnje Microchipa i International Rectifiera, dodatne informacije o DALI protokolu mogu se jedino naruiti na CD-u sa sajta http:// www.irf.com/product-info/lighting/. Za vie detalja pogledajte AN809 i AN811.
128
53. SPI
SPI (eng. Serial Peripheral Interface) predstavlja komunikacioni protokol namenjen brzom prenosu signala, na kratkim odstojanjima. Iako SPI protokol nema ogranienje najmanje brzine, zbog breg prenosa vee koliine podataka se mikrokontroleru obino zabranjuje izvravanje ostalih operacija. Upravo zbog toga Va digitalni foto aparat ne moete istovremeno koristiti kao web kameru, niti na MP3 plejeru ne moete sluati muziku dok je povezan sa kompjuterom. Obino se koristi prilikom komunikacije sa serijskim EEPROM memorijama, kao i memorijskim karticama (MMC, SD, xD, CF...). Iako memorijske kartice u osnovi predstavljaju veliku EEPROM memoriju, imajte u vidu da je proces formiranja sistema za podrku fajlova (eng. Filesystem npr. FAT16, FAT32 ili NTFS) u memorijskim karticama kao i sistem snimanja i itanja fajlova iz takvog fajl sistema prilino komplikovan, tako da PIC16 serija mikrokontrolera obino nema dovoljno resursa za njeno efektno korienje. SPI protokol slian je I2C protokolu, sa glavnom razlikom adresiranja raznih slave ureaja preko posebnog pina, a ne prozivkom njihove adrese. Na taj nain slave hardver ne mora imati dodatne pinove za formiranje svoje adrese, ali mikrokontroler mora obezbediti po jedan pin za adresiranje svakog slave hardvera ponaosob. Za jedan SPI slave hardver dovoljne su tri linije, a svaki naredni mora imati svoj CS (eng. Chip Select) pin. Ukoliko je na CS pinu povezanom na odgovarajui slave SPI hardver prisutna logika 0, onda e on reagovati na signale sa ostale dve linije. U protivnom, ignorisae ih i njegovi pinovi bie neprestano u stanju visoke impedanse, omoguavajui adresiranje ostalih slave SPI hardvera. Interesantna je mogunost istovremenog slanja podataka svim Slave hardverima ukoliko su sve CS linije na logikoj 0 (svi slave oekuju podatke). Isto kao kod I2C protokola, mikrokontroler (master) je uvek zaduen za generisanje takta preko SCK linije. Preko druge (SI) linije sinhronizovano sa taktom alju se podatci u ili iz mikrokontrolera. Za vie detalja pogledajte AN248, AN648 i AN909. Isto kao i RS232 i I2C kod monijih mikrokontrolera je SPI hardverski implementovan.
129
54. INKnet
RS485 standardom propisan je jedino hardver. INKnet predstavlja softver razijen od strane Ed Nisley-ja, a iji su principi opisani u Circuit Cellar asopisu. Za razliku od DMX512 protokola, INKnet protokolom mogua je dvosmerna komunikacija. Iako je INKnet protokol prvenstveno razvijen za 8052 mikroprocesor (tih godina su mikrokontroleri bili retki i skupi), protokol se moe iskoristiti ili prilagoditi bilo kom dananjem mikrokontroleru. Komunikaciju inicira centralni mikrokontroler (master), aljui zahtev za informacijama pojedinanim elijama (nodovima - eng. node). Oblik poruke je takav da se u njoj pre informacije alje desetobajtno zaglavlje, a nakon njega informacije sve do maksimalne veliine poruke od 255 bajtova. bajt 0 rezervisano, mora biti 0 bajt 1 duina poruke sa zaglavljem (9 do 255) bajt 2 adresa noda primaoca informacije bajt 3 komanda primaocu bajt 4 adresa noda poaljioca informacije bajt 5 adresa rezervisanog noda bajt 6 MSB bajt status flagova noda bajt 7 LSB bajt status flagova noda bajt 8 LSB bajt checksuma bajt 9 MSB bajt checksuma bajtovi 10 do 255 informacije Uoavate da je ovim nainom mogue poslati maksimalno 245 bajtova informacija. Vie informacija moralo bi se poslati unutar vie poruka (kao SMS poruke). Iako svi nodovi mogu istovremeno primiti informacije, master je taj koji e na osnovu zaglavlja (i informacija) regulisati rad i komunikaciju izmeu nodova. Slino kao adresa noda primaoca i poaljioca, rezervisani nod e nadalje odgovarati na poruke poaljioca koji ga je rezervisao. Komanda primaocu ukazuje ta nod primaoc poruke treba uraditi sa informacijom. Ovde su prikazane standardne komande, ali mogu se po potrebi proiriti, to zavisi od konkretnih zahteva mree. 80 - POLL Poll from master to node 81 - STATUS Status response from node to master 82 - UNBUSY Force node "unbusy" regardless of actual status (use with caution!) 88 - RESERVE Reserve node for exclusive use of "from" node (except for polls & responses) 89 - RELEASE Release node for general use (may be sent by any node) 90 - CONSOUT Console output (to display) 91 - CONSIN Console input (from keyboard) 92 - CONSECHO Echo of console input message 93 - CONSFILE Console input (from file) 130
Unutar status bajta noda, takoe (kao kod STATUS registra mikrokontrolera) odreeni flagovi opisuju funkcije noda. Flagovi su sledei: 15 - BUSY Node is busy handling previous message 14 - OVERRUN At least one previous message was lost 13 - ECHO Node will echo all CONSIN messages 12 - LFSTRIP Node strips LF after CR on CONSIN msgs 11 - CSUM Node detected a checksum error 10 - reserved 09 - reserved 08 - MASTER Node is network master Flagovi od 0 do 7 su rezervisani. Ovakav princip omoguava efikasnu integraciju standardnog RS485 drajvera i namenskog softvera za pravljenje sopstvene mree mikrokontrolera. Detekcija greaka implementirana je checksumom, a korekcija ponovnim slanjem informacije ukoliko prijemni nod poalje zaglavlje sa setovanim CSUM bitom njegovog status bajta. Za vie detalja pogledajte asopise Circuit Cellar broj 10 (avg/sep 1989), 11 i 12. U njima moete pronai i objanjenja interesantnih principa komunikacija bez mastera (detekcijom kolizije ili rednim transferom dozvole predaje od jednog ka drugom nodu). Unutar istih asopisa moete videti i organizacionu strukturu sloenijih komunikacionih protokola, formiranu po slojevima (eng. Layers) u CEBus protokolu. Za jednostavniji komunikacioni protokol preko RS485 drajvera pogledajte asopis Circuit Cellar broj 21.
131
55. S-ARTnet
INKnet protokol sa RS485 drajverima pored oiglednih prednosti ima i par mana. Pored signala, svakom nodu potrebno je dovesti i napon napajanja (+5V i 0V). Bilo bi svakako jeftinije ako bi se broj provodnika mogao na neki nain smanjiti. S-ARTnet (eng. Serial, Addressable, Receive/Transmitter) protokol reava ovaj problem, tako to se kroz dva provodnika prenosi i napon napajanja i koristan signal. Ovo je omogueno tako to izlazni napon drajvera moe biti 15V, 7,5V ili 0V. Prijemnik na osnovu ovih napona detektuje da li je poslata logika 0 ili logika 1. Kako napon od 0V traje prilino kratko, nodovima e za to vreme napajanje obezbeivati kondenzator. S-ARTnet protokolom mogue je adresirati do 30 slave nodova. S-ARTnet protokol kao i INKnet ima master koji za komunicira sa pojedinim slave nodovima. Meutim, njegovi slave nodovi nisu dodatni mikrokontroleri, ve ih predstavlja specijalizovano integrisano kolo CS212. Ono u sebi ima objedinjen komunikacioni protokol, dva ulazna i dva izlazna pina i ulazno izlazni drajver. Adresa odgovarajueg slave noda hardverski se postavlja povezujui pinove CS212 kola ka masi ili naponu napajanja (slino kao kod I2C). Master i slave nodovi komuniciraju preko 10-bitnih poruka. Poruka moe biti jedna od 3 sledea tipa: 1. Sinhronizacija Master alje poruku 0111111110. Na osnovu nje svi slave nodovi sinhronizuju svoj takt. 2. Pii Master alje poruku tipa A0 A1 A2 A3 A4 Pa Wr D0 D1 Pd gde A0 do A4 bitovi sadre adresu eljenog noda, D0 i D1 logiko stanje koje se treba postaviti na izlaznim pinovima CS212 kola, Wr bit (1 za indikaciju upisa) i Pa i Pd bitove za proveru parnosti adrese i ostatka poruke 3. itaj Master alje poruku A0 A1 A2 A3 A4 Pa Rd gde su A0 A4 bitovi adrese, Pa bit za proveru parnosti adrese i Rd bit (0 za indikaciju itanja). Po prijemu, CS212 alje poruku I0 I1 Pd gde su I0 i I1 logika stanja na njegovim ulaznim pinovima, a Pd je bit provere parnosti. S-ARTnet kao ni DALI ne sadri integrisane drajvere za master, ali ih ima u CS212 kolima. Neophodna konverzija logikih nivoa se za master obezbeuje odgovarajuim konvertorima signala. Preko ovog protokola master moe adresirati do 30 slave nodova, odnosno oitavati 60 udaljenih ulaznih pinova, i postavljati do 60 udaljenih izlaznih pinova slave nodova. Po potrebi, master moe periodino vriti prozivku svih nodova. Zbog male duine poruka i trostepenog stanja na liniji, mogue je prozivati svih 30 nodova 6 do 7 puta u sekundi. Vie o ovom protokolu imate u asopisu Circuit Cellar broj 21.
132
56. CAN
Svi raniji principi zahtevaju softversku detekciju i/ili korekciju greaka u okruenju podlonom smetnjama. Naravno da je to mogue uraditi (kao u INKnet protokolu), ali Microchip se potrudio pa je softver koji bi inae optereivao mikrokontroler prebacio u hardver. Tako jedno integrisano kolo (MCP2510 ili MCP2515) obavlja komunikacionu funciju (u kojoj je implementirana CRC detekcija greaka, korekcija greaka, izazivanje interapta po prijemu signala...), a drugo predstavlja drajver za spojni put (MCP2550 ili MCP2551). Drajverom upravlja komunikacioni ip, a komunikacionim ipom mikrokontroler preko SPI protokola. Isto kao RS485, i CAN standard koristi diferencijalne signale. Meutim, za razliku od RS485, CAN standardom propisan je i komunikacioni protokol. U njemu je mikrokontroler rastereen od komunikacionih algoritama, i moe svu svoju snagu upotrebiti za ono za ta je i namenjen. Po CAN protokolu ne vri se (kao kod I2C ili INKnet) prozivka svakog pojedinanog noda. Ne. Nodovi se ne adresiraju ni posebnim pinovima kao kod SPI protokola. Umesto toga, nodovi su ravnopravni. Svi oni moraju odreeno vreme oslukivati stanje na liniji pre nego to ponu sa predajom, kako ne bi upali u ve postojeu vezu. Ukoliko se ipak dogodi da dva ili vie nodova istovremeno zaponu predaju podataka, na scenu stupa kolo za detekciju kolizije (eng. Collision Detection). Po detekciji kolizije nod koji je prvi predao logiku 0 unutar podatka nastavlja sa predajom, dok ostali (im detektuju 0 dok u stvari alju 1) momentalno prestaju sa predajom, ekaju dok se ne zavri sa slanjem kao i neko vreme nakon toga (da se ne bi javilo novo preplitanje), i tek onda pokuavaju novu predaju. Kako je logika 0 dominantna, ona e uvek prebrisati logiku 1 (slino kao u I2C). Na taj nain podatak e stii do prijemnika neizmenjen i bez ikakvog kanjenja ili korekcije, a za komunikaciju se (zbog iste linije za slanje i prijem podataka) koriste samo dva provodnika (i zajednika masa). U CAN mrei pojedinani nodovi nemaju adrese. CAN protokol nije adresno ve komandno orjentisan sistem. Zbog toga nodovi obino komuniciraju izmeu sebe periodino aljui poruke po liniji. Ako je nekome potrebna, eto mu je. Ukoliko nije, ignorisae se. Struktura CAN protokola omoguava upotrebu hardverskih CAN ekspandera (kao kod S-ARTnet veze). Microchip je zakljuio da se veliki broj nodova sastoji jedino od odgovarajueg U/I hardvera (U/I pinova, A/D konvertora ili PWM modulatora), pa je proizveo seriju U/I ekspandera koji se mogu direktno povezati na CAN mreu, i ijim je hardverom mogua direktna manipulacija od strane ostalih (inteligentnijih) nodova. Za vie detalja pogledajte datasheetove drajvera, komunikacionog ipa, CAN I/O ekspandera, AN215, AN228 i AN754. Razvitkom CAN mree originalni protokol pretrpeo je izmene softvera, pa je mogue sresti verzije CAN 1.2, CAN 2.0A, CAN 2.0B i ECAN. Na sreu, novije verzije podravaju starije (eng. backward compatibile). Za vie detalja pogledajte AN916. 133
Jedan deo do sada opisanih komunikacionih protokola je hardverski integrisan u jaim serijama mikrokontrolera. To ipak ne znai da se slabiji mikrokontroleri (itaj PIC16F84) ne mogu koristiti za odreene vrste komunikacija. Uvek je mogue (u sluaju da je mikrokontroler dovoljno brz) pravovremeno direktno manipulisati ulazno izlaznim pinovima, i na taj nain ostvariti softversku implementaciju hardverskih komunikacionih rutina (eng. bit-banging) kao to je ilustrovano u RS232 vezi. Taj nain nekada moe biti i neophodan (na primer prilikom istovremene upotrebe 3 RS232 veze jednim mikrokontrolerom). Komunikacioni protokoli ne prestaju da se razvijaju. I sami verovatno znate da se nekada mogao koristiti jedino dial-up, zatim ISDN, a onda ADSL. Brzina i dalje raste. Mikrokontroleri su u potpuno istoj situaciji.
134
drajver
softver nije potreban implement. ne ne implement. implement. implement. ne hardverski MCP2510 max. broj zavisi od adr. 1 pred., 1 32 pred., 32 1 pred., 512 1 pred., malo zavisi od 1 master + 1 master + 64 1 master + 30 112 pred., lanova magistrale prij. prij. prij. prij. kapaciteta linije 16 slave slave slave 112 prij. max. brzina ograniena 20kbita/S 100kbita/S 100kbita/S 5Mbita/S 100, 400kbita/S 20kbita/S ? ? 1Mbit/S hardverom do 3Mbita/S ili 3,2Mbita/S max daljina mala,oko 15m 1,2km 1,2km mala,oko mala,oko 20cm 40m ? ? 40m pri 0.5m 0.5m 1Mbit/S detek. gresaka ne bit parnosti zav. od soft. ne ne ne parnost +? dva bita hardverska korek.gresaka ne zav. od soft. max. napon 0V, +5V -25V, +25V drajvera osetljivost zavisi od +-3V, prijemnika hardvera prema masi neaktivno 0V preko +3V stanje nain pren. zav.od hard. asinhroni simpl.br.prov dupl.br.prov. repetitor ul. impedansa zav. od mag. zav. od mag. / zav.od hardv. 1 + masa 2 + masa / 3k do 7k zav. od soft. ne -7V, +12V -7V, +12V
ne
0V, +5V
ne
0V, +5V
parnosti ne
0V, 7.5V, 15V
hardverska
-40V, +40V +-0,5V diferencijalni nema signala asinhroni 2 + masa / 100k
+-0.2V +-0.2V zavisi od zavisi od zav. od drajv. +-?V trostepena diferencijalni diferencijalni hardvera hardvera diferencijalni zavisi od preko 0,4V nema takta visoka imp. bez Preko 9V preko ?V 15V softvera razlike u + takta razlike u + razlike zav. od soft. asinhroni sinhroni sinhroni asinhroni asinhroni asinhroni 2 + masa 4 + masa da >=12k 2 + masa / da >=12k 4 + masa / / zav.od hardv. 2 + masa / / zav.od hardv. 1 + masa 2 / / / / zav. od drajv. zav. od optok. 1+masa / / zav. od hardv.
160
Kako je impedansa izlaznih pinova (pri oba logika stanja) PIC mikrokontrolera prilino niska (manja od 75 pri naponu napajanja od 5V) daljim irenjem otporne mree ne bi se postigli zadovoljavajui rezultati, pre svega u pogledu linearnosti izlaznog napona. Osim toga, preciznost ovog kola u velikoj meri zavisi od tanih vrednosti i tolerancije upotrebljenih otpornika. Po potrebi binarna teinska mrea moe se napraviti sa logaritamskom a ne linearnom karakteristikom izlaznog signala. To moe biti od koristi kod poveanja dinamikog opsega govora u sistemima za digitalizaciju zvuka, jer po Laplacianovoj distribuciji oblast oko napona bliskog 0 nosi vie informacija od oblasti sa veim amplitudama. Za vie detalja ovakve teinske mree pogledajte http://www.ke4nyv.com/index2.htm. U situacijama kada je neophodna vea rezolucija D/A konvertora moe se koristiti D/ A konvertor sa R-2R otpornim nizom (eng. R-2R ladder DAC). 136
Kod ove eme, umesto dupliranja vrednosti otpornosti koriste se otpornici istih vrednosti. Korienjem integrisanog otpornog niza, kolo sa ovakvom emom moe ak imati manje dimenzije. Rezolucija ovog kola je osmobitna. To znai da se ovim kolom moe (za razliku od prethodnog) dobiti ak 255 stabilnih analognih stanja. U tablici moete videti neke tipine vrednosti izlaznog napona u zavisnosti od postavljenog binarnog stanja na PORTB. Decimalni broj 0 27 53 79 105 157 209 235 255 RB7 RB0 Izlazni napon 0V 0,5V 1V 1,5V 2V 3V 4V 4,5V 5
Linearnost ovog kola je skoro idealna, a zavisi jedino od tolerancije upotrebljenih otpornika. Za kompletnu tablicu izlaznih napona i detalje pogledajte AN655 sa http:// www.microchip.com/.
Za generisanje sloenijih talasnih oblika izlaznih napona, najpraktinije je uzimati bajtove za POTRB iz tabele. Tako se mogu sa lakoom realizovati testerasti, trouglasti, sinusoidni oblici napona, pa ak i DTMF tonovi. Ukoliko mikrokontroler treba izvravati i druge operacije za vreme generisanja signala, moete jednostavnije funkcije realizovati i softverski. Na primer, u interapt rutini moete neprekidno poveavati stanje PORTB registra. Tako dobijate testerasti signal. Naizmeninim poveavanjem i smanjivanjem stanja PORTB registra dobijate testerasti signal. I sinusni signal moete dobiti korienjem matematikih funkcija.
137
Nastavak sledi
Pored ovih, postoji jo mnogo, mnogo principa po kojima se moe implementovati D/ A konverzija. Pogledajte http://en.wikipedia.org/wiki/Analog-to-digital_converter za vie detalja. Za PIC16F84 od znaaja bi mogao biti interesantan nain modulacije tona sa download sekcije sajta www.elektronika.ba (picsound). Gornja granina frekvencija koju moete dobiti bilo kojim od prikazanih nainina D/ A konverzije zavisi iskljuivo od brzine oscilatora mikrokontrolera. Svakako da je moete poveati manjim brojem razliitih semplova koje koristite za generisanje eljenog talasnog oblika, ali u tom sluaju gubite na preciznosti generisanog signala. Sve zavisi od toga kakav signal elite generisati. Na primer etvorobitna rezolucija D/ A konvertora sasvim je dovoljna za generisanje prilino istog sinusoidnog signala, ali je za generisanje DTMF tonova neophodna bar osmobitna rezolucija. Ukoliko se mikrokontrolerom generiu sinusoidalni naponi stalne frekvencije, poeljno je na izlazu D/A konvertora staviti analogni filter, propusnik eljenog opsega frekvencije. Posebno je to poeljno kod serijskih D/A konvertora zbog harmonika i smetnji koje oni generiu.
138
Da li je vei od [94+((125-94)/2) = 109,5] 110? Jeste. Broj je izmeu 110 i 125. Da li je vei od [110+((125-110)/2) = 117,5] 118? Nije. Broj je izmeu 110 i 118. Da li je vei od [110+((118-110)/2) = 114] 114? Nije. Broj je izmeu 110 i 114. Da li je vei od [110+((114-110)/2) = 112] 112? Jeste. Broj je izmeu 112 i 114. Da li je vei od [112+((114-112)/2) = 113] 113? Jeste. Onda je to broj 114. Ovaj princip moete zamisliti kao seenje pice. Isee se na pola, zatim na etvrtine, pa na osmine, i tako sve do najmanjeg pareta. Vidite da ste za razliku od prethodnog sluaja sa samo 10 pitanja uspeli da doete do tanog rezultata. E sada. Ukoliko ovaj princip primenite umesto (kao u brojakom A/ D konvertoru) postepenog poveanja napona korak po korak, vreme utroeno na merenje bie mnogo, mnogo krae, uz potpuno istu elektrinu emu. Program je prilino jednostavan. Najpre se setuje bit najvee teine (MSB - RB7) na PORTB registru. U zavisnosti od stanja naponskog komparatora, ovaj pin ostavi se setovan ili se resetuje. Onda se prelazi na RB6, RB5, RB4... clrf PORTB ; Inicijalizuj PORTB bsf PORTB,7 ; Setuj MSB btfss PORTA,0 ; Ukoliko je napon preveliki, bcf PORTB,7 ; resetuj ga. bsf PORTB,6 ; Setuj naredni btfss PORTA,0 ; Ukoliko je napon preveliki, bcf PORTB,6 ; resetuj ga. bsf PORTB,5 ; Setuj naredni ... I tako sve do RB0 pina. Na kraju e PORTB sadrati izmerenu vrednost napona. Kod je dat ilustrativno, a u pravim programima bi se koristio i Shaddow registar. 141
kondenzatora i pina potrebno je postaviti zatitni otpornik od oko 220. On spreava preveliku struju na pinu mikrokontrolera u trenutku naglog punjenja ili pranjenja kondenzatora. Microchip ak navodi da se usled prevelike struje na pinovima portova moe promeniti stanje TRISA ili TRISB registra, pa ga je stoga poeljno povremeno softverski osveiti. Donja granica kapacitivnosti kondenzatora zavisi jedino od brzine vaeg mikrokontrolera. Pri kristalu od 4MHz sasvim je mogue koristiti vrednosti od 33pF. to manji kondenzator upotrebljavate, merenje e biti krae. Kako vreme za koje se kondenzator napunio ili isprzanio nema direktne veze sa celzijusovim stepenima ili svetlosnim luksom, vrednosti ovih veliina najjednostavnije je dobiti iz odgovarajuce tabele. Bilo koja izoblienja pri merenju (poput nelinearne karakteristike upotrebljenog senzora) mogu se odmah kompenzovati u samoj tabeli. Jo jedna mogunost gornjih ema ogleda se u mogunou merenja kapacitivnosti umesto otpornosti. Na taj nain moe se na primer izmeriti poloaj osovine promenljivog kondenzatora. Naravno, u tom sluaju umesto promenljivog, u emu je potrebno postaviti obian otpornik to manjeg stepena tolerancije. Ove eme zbog svoje jednostavnosti imaju jedan veliki nedostatak. Sa njima nije mogue dobiti veu preciznost zbog promene radnih karakteristika upotrebljenog kondenzatora usled promene radne temperature. Zbog toga se moe koristiti kompenzacija ovih nedostataka koristei kalibracioni otpornik i merenjem njegove vrednosti neposredno pre merenja otpornosti senzora. Za detalje pogledajte AN512, AN513 i AN863 sa http://www.microchip.com/. Moda smatrate da ovo nije prava A/D konverzija zbog ogranienja na merenje otpornosti i kapacitivnosti, a ne napona! U pravu ste. Meutim, uz male izmene elektrine eme mogue je realizovati pravu desetobitnu A/D konverziju. Za princip rada i detalje pogledajte http://www.ele.uva.es/~jesus/adsd.pdf. Ovakav princip merenja u literaturi se naziva jo i Single Slope A/D konvertor.
143
Nastavak sledi!
145
146
Program je ispitan pod Win98 i Win2000, a dostupna je i njegova Linux verzija. Besplatan je (dat je ak i izvorni kod) i nalazi se na mom sajtu iji link moete nai na kraju ovog uputstva. 147
68. Datalodger
Datalodger predstavlja ureaj koji snima semplovane podatke (obino u eksterni EEPROM) i iz koga je potrebno povremeno spolja iitavati podatke. U ranijim primerima videli ste kako se moe meriti nivo reke. U meuvremenu ste nauili i upotrebu A/D konvertora, I2C i RS232 komunikacionog protokola. Sada i nije teko zamisliti meteoroloku stanicu sa anemometrom (meraem brzine vetra), hidrometrom (meraem vlanosti vazduha), termometrom i meraem smera vetra. U sluaju da se sve ove veliine dobijaju u analognom obliku, dovoljno je dovesti ih u A/D konvertor i nakon toga u PIC. Semplovi svih konvertovanih napona povremeno se snimaju u eksternu EEPROM memoriju preko I2C veze, a ona se periodino prazni preko RS232 veze u kompjuter. Kompjuter bi onda mogao analizirati dobijene podatke i predvideti na primer pojavu sue ili kie. Uz vie istovremeno povezanih sistema (vie udaljenih meraa) mogla bi se sa prilinom tanou predvideti mikroklima odreenih podruja.
148
Da li je ovo dobar nain kontrole? Nije! Svi senzori podloni su smetnjama. ta moe izazvati te smetnje? Za poetak, tu je sam mikrokontroler. Njegov takt oscilatora proizvee malo smanjenje i poveanje napona napajanja. Dalje, tu su ureaji koji se kontroliu mikrokontrolerom. Pri multipleksu LED displeja najvie struje troie displej na kome se prikazuje broj 8 (tada su sve pojedinane LED ukljuene), a najmanje onaj sa brojem 1 (ukljuena samo dve LED). Ne mora to obavezno biti LED displej. Isti efekat prouzrokovae i relej grejaa. Sledea je vaa kominica sa svojim (made in China) usisivaem. Iako e dekapling kondenzator u dobroj meri eliminisati ove smetnje, jedan deo e se svakako preneti i do senzora, i tu e proizveti um. Upravo je taj um poguban za uspenu kontrolu temperature. Sa njim e pri istoj temperaturi rezultat A/D konverzije jednom biti 170, a drugi put 180, to e mikrokontroler shvatiti kao odgovarajuu promenu temperature, i brzo e ukljuivati i iskljuivati relej. Kontakti obinih releja jednostavno nisu namenjeni za takav rad, i relej e posle par nedelja stradati. ta je reenje? Rei mikrokontroleru da promeni stanje jedino ukoliko se izmerena temperatura dovoljno (npr. za .10) udaljila od zadate vrednosti (.175), slino kao to to mitov okida radi hardverski. Znai, da ukljui greja ukoliko je oitana vrednost 165 i manja, i da ga iskljui ukoliko je oitana vrednost 185 i vea. Ovde je najbolje radi to manjeg variranja temperature podesiti granine vrednostzi, tako da se postigne kompromis izmeu eeg rada releja i spoljnih smetnji. Da li je sada sve u redu? I dalje ne mora da bude. Ukoliko je senzor temperature postavljen u blizini grejaa, umesto merenja temperature prostorije, merie se temperatura grejaa. Tako e pri ukljuenju grejaa rezultat A/D konverzije veoma brzo postati .255, odnosno, i dalje e se relej previe brzo ukljuivati i iskljuivati. Ovo se moe reiti udaljavanjem senzora na mesto gde nee direktno oseati temperaturu grejaa. Ovo bi moglo biti dovoljno dobro reenje za ON/OFF (ukljui/iskljui) kontrolu grejaa (relejom). Meutim, nekada ON/OFF kontrola jednostavno nije dovoljna. U 149
tim situacijama koristi se kontinualna regulacija snage, faznim pomakom triaka (slino kao PWM za jednosmerni napon). Uzmimo za primer da elite u dvoritu napraviti inkubator za jaja. Ovde je radi to manjih oscilacija temperature poeljno koristiti kontinualnu regulaciju. Meutim, ta sa situacijom kada napolju pone da pada kia (odjednom zahladni)? Uz dovoljno dobro toplotno izolovan inkubator, nee biti nikakvih problema. Ali nekada jednostavno nemamo dovoljno stiropora (i opet je sneg iznenadio nae putare). U ovom sluaju potrebno je mikrokontroleru dodati jo malo logike. Osim temperature potpuno isti principi primenjuju se za kontrolu bilo koje fizike veliine. Vie o ovim kontrolnim procesima imate u asopisima Circuit Cellar br. 17 i 19.
150
Kao to vidite, ukoliko se signal menja u smeru 00, 01, 11, 10 to znai da se osovina okree u smeru kazaljke na satu. U suprotnom (10, 11, 01, 00) osovina enkodera se okree u suprotnom smeru. Takvo stanje signala omoguava da poreenjem prethodnog i sadanjeg stanja lako otkrijemo u kojem se smeru okree osovina. Na primer, ukoliko je prethodno stanje bilo 11 a sadanje je 01, osovina se okree suprotno od kazaljke na satu. Iako Vam moe izgledati da su rotacioni enkoderi spori, to nije sluaj. Oni mogu imati i preko 255 poloaja za samo 1 okretaj osovine. Moe se desiti da zbog sporosti mikrokontrolera (ukoliko izvrava i druge operacije za vreme okretanja potenciometra) PIC nakon stanja 10 detektuje stanje 01 to je oigledno greka. Jo gore, pri previe brzom okretanju npr. u smeru kazaljke na satu mogue je da nakon stanja 01 ne oita (zbog sporoti) sledea 2 stanja (11 i 10), ve tek tree (00), pa na osnovu toga moe zakljuiti da je osovina okrenuta u suprotnom smeru. Kod mehanikih rotacionih enkodera situacija je jo sloenija, jer se mora izvravati i debouncing rutina. Ona se uglavnom moe uprostiti tako to se umesto nje za jednu promenu stanja enkodera trai uzastopan sled 2 ili vie ispravnih stanja. Na taj nain je postignuta ispravna detekcija trvovanjem rezolucije enkodera. Ukoliko ne elite izgubiti na rezoluciji moete izmeu mehanikog enkodera i mikrokontrolera postaviti hardverski debouncing (sa rednim otpornikom izmeu pina mikrokontrolera i enkodera i kondenzatorom izmeu izlaza enkodera i mase). to je vea kapacitivnost kondenzatora, vea e biti imunost na smetnje varnienja, ali e maksimalna brzina okretanja osovine enkodera biti srazmerno manja. Obino je dovoljna vrednost od 10nF. Upotrebljeni kondenzatori moraju biti odabrani prema maksimalnoj rezoluciji i maksimalnoj procenjenoj brzini okretanja osovine enkodera. Kako e se stanje osovine enkodera najverovatnije retko kada menjati, najpraktinije je povezati izlaze rotacionog enkodera na interapt ulaze mikrokontrolera. U sluaju da je potrebno snimanje trenutne (apsolutne) vrednosti poloaja osovine rotacionog enkodera u EEPROM, praktinije je snimiti je tek nakon to se osovina prestane pomerati (na primer 6S nakon zadnjeg signala). Na taj nain titi se EEPROM. Vie detalja o upotrebi relativnih rotacionih enkodera imate http://www.mcmanis.com/chuck/robotics/projects/lab-x3/quadratrak.html. na sajtu
Trebate shvatiti da rotacioni enkoderi ne mogu zameniti analogne potenciometre u pravom smislu te rei. Oni nemaju nikakvu vezu sa promenom otpornosti. To su samo digitalni davai poloaja osovine. Meutim, to ne znai da se (u kombinaciji sa mikrokontrolerom) ne mogu upotrebiti kao potenciometar. Dovoljno je oitanu vrednost dovesti na D/A konvertor i imate izlazni napon proporcionalan poloaju osovine enkodera. Taj analogni izlazni napon moete koristiti kao izvor napajanja za predpojaava kasetofona, ime ste dobili odlian regulator jaine zvuka. Postoje integrisana kola koja izvravaju upravo tu operaciju bez upotrebe D/A konvertora (DS1669, TDA8551). A ukoliko ste ba reeni da dobijete promenljivu otpornost poveite na PIC bilo koji pretvara digitalnog signala u otpornost. Na primer DF1704.
152
153
154
155
156
Slika
Meutim, ukoliko mikrokontroler treba detektovati prolazak kroz 0 za 220V, ovaj nain nije mogue koristiti zbog prevelikog napona na bazi tranzistora i iz bezbednosnih razloga. Da bi se ovaj problem prevaziao, moe se koristiti sledea elektrina ema: Slika
Moda se pitate zbog ega je ovoliko gradiva posveeno upravo analognoj elektronici. PIC16F84 sam po sebi ne ne moe mnogo toga. Da bi radio ita korisno potrebno je dovesti mu spolja neke signale. Da li e to biti signal sa termometra, tahometra, aeromerta, hidrometra, barometra ili termopara u ovom trenutku nije bitno. Bitno je da senzori ove signale uglavnom daju u analognom obliku. Ukoliko ne postoji nain da se oni oitaju i da se na osnovu dobijenih informacija preduzme odreena akcija (npr. navodnjavanje povra u plasteniku ili aktiviranje alarma), dabe ste kupovali PIC.
157
Kako obe serije za povezivanje sa mikrokontrolerom koriste adresnu magistralu, brzina komunikacije e biti ograniena jedino hardverom, ali e se i za najjednostavnije operacije morati utroiti vei broj pinova.
158
Sa ovom emom omogueno je upravljanje matricom od 32 LED. RA4 pin PORTA registra se ovde ne koristi, jer ne moe dati na svom izlazu logiku jedinicu. Meutim uz malo trikova (zamenom polariteta LED i povezivanjem tranzistora na naponu napajanja) i on moe biti u funkciji. U praksi se uglavnom sree potreba za bar jednim ulazom, tako da se taj nain ne praktikuje. Najpre je potrebno iskljuiti sve prekidake tranzistore dovoenjem logike 0 u PORTA. Zatim je potrebno na PORTB registru postaviti stanje 8 LED u prvoj koloni, i na kratko (obino oko 20mS da se prosean intenzitet svetlosti ne bi previe smanjio) ukljuiti prekidaki tranzistor na RA0 pinu. Diode na koje je dovedena logika 1 e na trenutak zasvetleti. Onda se postavlja stanje LED druge kolone, i na kratko ukljuuje tranzistor na RA1 pinu. Postupak se ponavlja dok se ne prikae stanje i na zadnjoj (etvrtoj) koloni, kada se celokupan proces ponavlja. Zbog tromosti oka, izgledae kao da LED neprekidno svetle. LED e svetleti manjim intenzitetom nego inae, ali to se moe nadoknaditi proputanjem vee struje kroz njih (smanjivanjem vrednosti otpornika na pinovima PORTB registra), ili podeavanjem duine ukljuenog stanja, tako da se postigne kompromis izmeu jaine svetla dioda i njihovog treperenja. Rutinu za ispis stanja na displeju, najpraktinije je realizovati u interapt rutini izazvanoj tajmerom. Na taj nain prikaz stanja LED ne utie (previe) na rad glavnog programa. Na isti nain mogue je prikazati odgovarajue cifre na vie sedmosegmentnih displeja.
159
Svi izvodi svih zajednikih segmenata (a, b, c, d, e, f, g, i dp ukupno 8 izvoda) spojeni su preko otpornika za PORTB mikrokontrolera. Zajednike katode displeja spajaju se preko prekidakog tranzistora na PORTA.
Najpre se iskljuuju svi prekidaki tranzistori dovoenjem logike 0 u PORTA. Zatim je potrebno na PORTB registru postaviti sliku cifre prvog displeja, i kratko ukljuiti prekidaki tranzistor na RA0 pinu. Onda se postavlja slika cifre drugog displeja, i na kratko ukljuuje tranzistor na RA1 pinu. Postupak se ponavlja dok se ne prikae cifra i na zadnjem (etvrtom) displeju, kada se celokupan proces ponavlja. U praksi se moe videti ovakav princip realizovan bez ikakvih opornika i prekidakih tranzistora, odnosno direktnim povezivanjem displeja na PIC. Njegova mana je poveana potronja, samim tim i grejanje mikrokontrolera kao i nejednakost svetla pojedinih cifara. Ovo stoga to pin za prekidanje displeja mora kroz sebe propustiti struju svih segmenata displeja, pa samim tim intenzitet svetla nije isti kada je na displeju prikazan broj 8 (ukljueni svi segmenti) i broj 1 (ukljueni segmenti b i c). Broj pinova moe se smanjiti upotrebom LED drajvera 4000 ili 7400 serije. 4511 integrisano kolo predstavlja drajver za sedmosegmentni LED displej. Kada mu se na ulaz dovode binarni brojevi od 0 do 9, na izlazu ukljuuje odreene segmente LED displeja. Umesto 4511, moe se koristiti 7447.
Postupak je isti kao i ranije, sa tim to umesto odgovarajueg obrasca za prikaz na displeju, na ulaze 4511 treba dovesti binarni broj od 0 do 9. Segment decimalne take (dp), morao je biti doveden direktno na mikrokontroler, jer 4511 (i 7447) ima mogunost prikaza samo jedne cifre. Ukoliko se decimalna taka ne koristi, dobiete jo jedan slobodan pin. Za detaljni opis povezivanja 4511 ili 7447 integrisanih kola, skinite sa interneta njihove tehnike podatke. 160
Da bi se ovo kolo moglo primenjivati, potrebno je izmeriti odreene parametre. Voff1 maksimalni napon pri kome LED1 ne emituje svetlo Voff2 maksimalni napon pri kome LED2 ne emituje svetlo Von1 miniminalni napon pri kome LED1 emituje svetlo Von2 miniminalni napon pri kome LED2 emituje svetlo Ion1 eljena struja kroz LED1 pri ukljuenom stanju Ion2 eljena struja kroz LED2 pri ukljuenom stanju Vcc napon napajanja Potrebni prorauni su sledei: Ion1 = [ (Vcc-Von1)/R1 ] - [ Von1/(R2+R3) ] Ion2 = [ (Vcc-Von2)/R2 ] - [ Von2/(R1+R3) ] (Voff1+Voff2)/R3=Vcc-Voff1-Voff2/(R1+R2) Da bi se smanjila nepotrebna potronja struje potrebno je za R3 izabrati to veu vrednost, bez ukljuivanja LED pri ulaznom stanju pina. Pribline vrednosti otpornika (za struju od 8mA po ukljuenoj LED) su sledee: R1=300, R2=300, R3=1,2k. Ukljuenje LED1 postie se postavljanjem pina na logiku 0, LED2 na logiku 1, iskljuenje obe LED prelaskom pina u visokoimpedansno stanje (postavljen kao ulaz), a ukljuenje obe LED neprestanim naizmeninim dovoenjem logike 0 i 1 na pin (za to je najpraktinije koristiti interapt izazvan tajmerom). Za razliku od standardnih multipleksa, ovo kolo troi ak 2,5mA u stanju iskljuenih LED, pa nije pogodno za baterijsko napajanje. Praktinije je koristiti multipleks. Ovde je ilustrovano samo kao primer onoga to trebate izbegavati u svojim aplikacijama. Na slian nain moete povezivati i mnogo vei broj LED. Za detalje pogledajte TB029 sa http://www.microchip.com/. U literaturi se ovaj princip moe nai i pod nazivom Charlieplexing. 161
a displej e se sam pobrinuti za sve ostalo. To moe biti nedostatak ukoliko elite na displeju prikazati naa slova (npr. ). Iz tog razloga predviena je mogunost da programer promeni sliku par specijalnih karaktera. Kako integrisani kontroler LCD-a nema EEPROM memoriju, sliku ovih karaktera je neophodno uvati u memoriji mikrokontrolera i inicijalizovati u LCD-u po svakom ukljuenju. Slika karaktera u ROM-u LCD-a obino se uva u matrici od 5*7 ili 5*8 piksela, ali na displeju je kod ponekih LCD-a mogue prikazati i proirenu matricu od npr. 5*10 piksela. Iskljueni gornji i donji pikseli jednostavno se nee videti. Nama ti dodatni pikseli mogu biti od koristi radi prikaza npr. slova . Iako se displeji mogu razlikovati po broju i rasporedu elija, upotrebljenim fontovima za karaktere, vrsti, nainu i boji pozadinskog osvetljenja, njihovo povezivanje na mikrokontroler je prilino standardizovano. 14 pina koristi se za upravljanje LCD-om, a jo 2 pina za pozadinsko osvetljenje. Ona mogu biti u istom redu sa ostalim pinovima, ili posebno izdvojena. Mogue je nai i LCD bez pozadinskog osvetljenja, ali sa 16 pinova. Pri tome zadnja dva pina (15. i 16.) nisu povezana. Pinovi LCD-a mogu biti postavljeni u jednom (16*1) ili u dva (8*2) reda. Obino su brojevima obeleeni bar krajnji pinovi. Na LCD-u na slici vidite jedan red pinova. Pinovi 15 i 16 povezani su (odozdo) na LED kao izvor pozadinskog svetla (beli pravougaonik sa desne strane). Funkcija pinova je sledea: Pin 1 2 3 4 5 6 7-14 15 16 Simbol VSS VDD VO RS R/W E DB0-DB7 A K Masa Napajanje za kontroler Napajanje za LCD displej (eng. Register selection) (eng. Read/write Selection) Enable pin Signal for LCM Linije za podatke (0-7) Napajanje za LED (+) Napajanje za LED (-) Opis
Kako LCD zahteva ak 8 pinova za prenos bajtova u LCD (DB0DB7), kontrolerom LCD-a je predviena mogunost upotrebe samo 4 pina (DB4-DB7) a osmobitni bajt se u LCD alje u 2 grupe niblova. Uteda 4 pina se svakako isplati. Kako je kontroler LCD displeja u stvari jedan mali mikrokontroler, PIC16F84 treba odreenim protokolom (kao RS-232) u njega slati podatke. Dobro je to (sa izuzetkom 163
startnog pulsa) ne postoji maksimalno vreme za koje se ovi podatci trebaju poslati. Na taj nain mikrokontroleru ostaje prilino vremena za ostale operacije koje treba obavljati. Ipak, podatci se na LCD ne smeju slati previe velikom brzinom, jer ih u tom sluaju kontroler LCD-a nee moi ispravno primiti. Enable (startni) pin moete smatrati pinom za iskljuenje LCD-a. Dok je na njemu prisutna logika 1, LCD nee reagovati na ostale signale. Na taj nain mogue je ostale pinove LCD-a (kao u multipleksu) koristiti za neke druge operacije. Impuls za inicijalizaciju integrisanog kontrolera LCD-a mora trajati bar 450nS. Dok je startni
Nastavak sledi
164
Radi lakeg razumevanja pretpostavimo da su prekidai obeleeni brojevima od 1 do 12. Najpre se PORTA registar postavi na b'00000111'. Zatim se RA0 pin postavi na logiku 0, ime se u prvu kolonu dovodi nivo logike 0. Redom se testiraju bitovi RB0 do RB3 PORTB registra. Ukoliko nijedan nije resetovan, nisu pritisnuti prekidai oznaeni sa 1, 4, 7 i 10. Onda se RA0 setuje, a RA1 resetuje. Ponovo se testiraju bitovi PORTB registra, ali ovoga puta za grupu prekidaa 2, 5, 8 i 11. U zadnjem prolazu setuje se RA1, a resetuje RA2, i testiraju bitovi koji odgovaraju prekidaima 3, 6, 9 i 12. Pull up otpornici moraju biti ukljueni kako se na ulaznim pinovima ne bi javilo nedefinisano stanje. Zbog njih se testiranje obavlja za logiku 0. Ukoliko je potrebno obaviti odreenu operaciju po otputanju tastera, program mora pamtiti zadnje stanje odgovarajueg tastera. U tom sluaju praktinije bi bilo povezati pinove RB4 do RB7 u matricu, i po promeni stanja izazvati interapt. Interapt rutina treba detektovati stanje pinova PORTA i PORTB registra, utvrditi koji bit je izazvao interapt, i izvriti zadatu operaciju. Otpornici od 100 su povezani radi zatite od lanog okidanja usled elektrostatikih smetnji. Ukoliko se tastarura nalazi blizu (<2m) mikrokontrolera, mogu se izostaviti. A ukoliko elite postii jo vie ulaza uz minimalni broj upotrebljenih pinova, moete koristiti sledeu emu.
165
Pretpostavimo da su upotrebljeni pinovi RB0 do RB3, i da su prekidai obeleeni decimalno (1 12), kao u prolom primeru. Pre svega, potrebno je ukljuiti pull-up otpornike. Onda treba definisati pin RB0 kao izlazni, a RB1, RB2 i RB3 kao ulazne i postaviti RB0 na logiku 0. Redom se testiraju stanja na RB1 (za pritisnut broj 6), RB2 (za broj 9) i RB3 (za broj 12). Zatim se RB0, RB2 i RB3 definiu kao ulazni, a RB1 kao izlazni sa logikom 0, i testiraju se stanja na RB0 (za broj 3), RB2 (za broj 8) i RB3 (za broj 11). Postupak se ponavlja za pinove RB2 i RB3. Ovaj nain je softverski malo tei za implementaciju, jer se u istom registru mora vriti manipulacija izmeu ulaznih i izlaznih stanja pinova (to povlai za sobom prelazak izmeu banki). Meutim, njim je mogue testirati 12 prekidaa sa samo 4 pina. I u ovom sluaju mora se pamtiti zadnje stanje odgovarajueg tastera ukoliko je potrebno obaviti odreenu operaciju po njegovom otputanju. Ovakvi naini testiranja tastera mogui su jer je (kao tromost oka kod multipleksa sa LED) ovde primenjena tromost prsta kojim se pritiska prekida. Naime, proseno minimalno vreme za koje korisnik dri taster prekida pritisnutim je oko 50 do 100mS. Lino sam imao zadovoljstvo da na kratko popriam sa prvakom Srbije u kucanju na teleprinteru (sprava poput elektrine pisae maine). Kuca 600 slova za 1 minut, odnosno 10 slova za 1S. Kod njega je ovo proseno vreme sigurno neto krae. Moe li se jo smanjiti broj potrebnih pinova? Naravno da moe. Vie o tome u narednim poglavljima.
166
Setite se multipleksa izlaza. Pic periodino postavlja stanje na LED segmentima i preko zajednike katode ukljuuje kompletan displej. Zatim ga iskljuuje, pa postavlja stanje na sledeem. Duplim multipleksom bi se u trenutku dok je su svi displeji iskljueni testirali taster prekidai povezani paralelno sa displejima po principu multipleksa ulaza. Otpornici od 220 postavljeni su zbog ograniavanja struje kroz LED segmente i smanjenja uticaja indukovanih napona na ulazima mikrokontrolera (samo 4 gornja), a otpornici od 2,2k da ostali segmenti displeja ne bi zasvetleli pri pritiskanju prekidaa dok je ukljuen neki od displeja. Najpre je da se ne bi javilo nedefinisano stanje na ulazima potrebno ukljuiti pull up otpornike. To se moe uraditi prilikom inicijalizacije, na poetku programa. Kako su LED displeji aktivni samo kada je PORTB definisan kao izlazni, ovo im nee smetati. U multipleks rutini se u pauzi izmeu ukljuenja displeja (dok su svi displeji preko PORTA registra iskljueni) RB0 do RB3 definiu kao ulazni, a RB4-RB7 kao izlazni pinovi. Redom se na RB4 do RB7 postavlja logika 0, i testiraju stanja na RB0, RB1, RB2 i RB3 pinovima. Ukoliko je na nekom od njih prisutna logika 0, to indikuje pritisnut odgovarajui prekida. Po testiranju svih prekidaa, pinovi PORTB registra definiu se kao izlazni, na PORTB se postavlja slika koja e se pojaviti na LED displeju i ukljuuje se odgovarajui displej. Testiranje se moe obavljati izmeu cifara pojedinih displeja ili nakon to je prikazana slika na svim displejima. Koji ete nain odabrati zavisi od eljene brzine testiranja prekidaa. Za detalje pogledajte AN529 i AN557 sa http://www.microchip.com/. 167
168
Princip rada je sledei. Pin RB0 povezan je kao wilkinsonov A/D konvertor, ali umesto merene otpornosti, ovde se pojavljuje otporna mrea. Rezultujua otpornost na pinu zavisi od toga koji taster je pritisnut u odreenom trenutku. Najmanja je (1k) kada je pritisnut taster 1, poveava se do tastera 16 (1k + 4k7 + 4k7 + 4k7 + 1k + 1k + 1k = 18,1K), a najvea je (teorijski beskonana) kada nije pritisnut ijedan taster. Softver treba po izmeriti vrednost otpornosti po principu A/D konvertora i na osnovu dobijene vrednosti pronai koji taster je pritisnut. Za razliku od ostalih ema sa vie ulaza, ovom emom je skoro nemogue realizovati detekciju vie istovremeno pritisnutih tastera zbog veeg broja rednih i paralelnih spojeva otpornika. Vie o ovom principu imate na http://www.romanblack.com/keypad.htm . http://www.josepino.com/ i na
169
Ovde se najpre ukljue pull up otpornici, a zatim se RB0 do RB3 pinovi deklariu kao izlazni sa logikom 0, a RB4 do RB7 kao ulazni, podesi se intarapt i ode se u sleep mod. Pritiskom na bilo koji prekida PIC e se probuditi iz sleep moda, i onda je potrebno redom postavljati RB0 do RB4 pinove na logiku 0 (drei ostale na logikoj 1), i skenirati RB4 do RB7 pinove da bi se utvrdilo koji je taster i dalje pritisnut. Za vie detalja pogledajte AN552 sa http://www.microchip.com/. Drugim nainom mikrokontroler se resetuje po pritisku prekidaa.
170
Na ovoj emi svi izlazi (RB0 do RB3) postavljeni su na logiku 0. Kondenzator C se napunio preko otpornika od 47k i dovodi logiku 1 na MCLR pin mikrokontrolera. im se bilo koji taster pritisne, C se isprazni kroz jedan od 4k7 otpornika (zavisi od toga koji se taster pritisnuo), napon na kondenzatoru opada (oko 1mS) sve dok se PIC zbog pojavljivanja logike 0 na MCLR pinu ne resetuje. Po resetu se svi U/I pinovi u hardverskoj inicijalizaciji mikrokontrolera definiu kao ulazi, to spreava dalje pranjenje kondenzatora. Vrednosti otpornika i kondenzatora izabrane su tako da je trajanje ciklusa pranjenja i punjenja kondenzatora manje od vremena reseta mikrokontrolera (oko 18mS). im se reset zavri, potrebno je ukljuiti Pull up otpornike, na RB0 do RB3 pinovima redom na kratko postaviti logiku 0 (drei ostale izlaze na logikoj 1), to bre testirati stanje prekidaa na RA0 do RA3 pinovima, i vratiti pinove RB0 do RB4 na logiku 1. Prebacivanje izlaza na logiku 0 ne moe prouzrokovati ponovni reset mikrokontrolera ukoliko je vreme testiranja previe brzo (reda 10S). Za vie detalja o ovome pogledajte AN528 sa http://www.microchip.com/.
171
EDE1144 - Dekoder za 16 tastera. Serijska detekcija preko 2 pina, ili paralelna preko 4 pina (+1 za signalizaciju ispravno primljenog stanja prekidaa) EDE1188 - Dekoder za 64 tastera. Serijska detekcija preko 2 pina. ICM7218A LED displej drajver za 8 sedmosegmentnih displeja sa zajednikom anodom (bez decimalne take). Prikaz cifara 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E i F sa mogunou direktnog adresiranja pojedinih LED ICM7218B LED displej drajver za 8 sedmosegmentnih displeja sa zajednikom katodom (bez decimalne take). Prikaz cifara 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E i F sa mogunou direktnog adresiranja pojedinih LED Uz njih je za razliku od multipleksa izazivanog mikrokontrolerom bez problema mogue otii u SLEEP mod. EDE707 integrisano kolo e nastaviti sa prikazom po jednom dovedenom stanju, bez ikakve naknadne intervencije mikrokontrolera, a EDE1144 i EDE1188 se mogu povezati tako da po pritisnutom tasteru preko jednog pina izazovu interapt (ovo se moe upotrebiti za buenje iz SLEEP moda), i (45mS nakon interapta dovoljno za stabilizaciju oscilatora mikrokontrolera) serijski preko drugog pina u mikrokontroler poalju kd tastera.
172
Na taj nain moete koristei samo PORTB dobiti do 64 ulaznih ili izlaznih pinova. Ukoliko Vam je ovo preskupo, moete koristiti pomerake (ift) registre 74595 za 8 izlaza, ili 74597 za 8 ulaza. Ovi registri imaju jo po jedan serijski izlaz (74595) i ulaz (74597), tako da se njihovim rednim vezivanjem i povezivanjem preko samo 3 pina mikrokontrolera moe realizovati proizvoljno veliki broj ulaza / izlaza. Softver mikrokontrolera morao bi regulisati pomeranje i serijske ulazno / izlazne rutine. Multipleks korienjem ovako proirenog broja ulazno / izlaznih pinova je mogu jedino u sluaju da nije potrebno menjati stanje pinova od ulaznog u izlazni i obrnuto, ali uz dosta komplikovaniji program. U SLEEP mod je mogue otii, jedino ukoliko se istovremeno ne primenjuje multipleks. Ukoliko Vam je potrebno 8 ulaza ili izlaza, moete koristiti PCF8574. Sa njim je multipleks tee ostvariti, ali je mogu SLEEP mod. U praksi se ovi naini veoma retko koriste. Jednostavnije (i jeftinije) je uzeti mikrokontroler sa veim brojem ulazno izlaznih pinova.
173
582 - 512 = 70 70 - 64 = 6 6- 4= 2 2- 2= 0
Decimalni u heksadecimalni oblik Najpre konvertujte decimalni oblik u binarni, a zatim binarni u heksadecimalni. Za gornji sluaj to bi izgledalo ovako: .582 = b'10 0100 0110' = 2x46 Postoji i nain direktne konverzije deljenjem umnocima maksimalne vrednosti jednog nibla. 582 / 256 = 2 sa ostatkom 70 70 / 16 = 4 sa ostatkom 6 6 / 1 = 6 sa ostatkom 0 Rezultat je 2x46. Heksadecimalni u decimalni oblik Konvertujte iz heksadecimalnog u binarni oblik, a zatim iz binarnog u decimalni. Za raniji sluaj to bi izgledalo ovako: 5F3x7B = b'1011111001101111011'=.390011 Postoji i nain direktne konverzije mnoenjem umnoaka maksimalne vrednosti jednog nibla. Na primer za broj 3x8D to je: 3 x 256 = 768 8 x 16 = 128 Dx 1 = 13 Rezultat je 768 + 128 + (ostatak koji nije mogao biti pomnoen) 13 = .909. Ipak, i dalje je jednostavnije koristiti digitron.
175
Rezultat e biti taan jedino u sluaju da da se zbir moe predstaviti sa 16 bita (0 do 65535 u sluaju neoznaenih ili -32768 do 32767 u sluaju oznaenih brojeva). U protivnom, bie obavezan jo jedan registar za uvanje stanja Carry flaga. Na slian nain moe se realizovati i oduzimanje dva esnaestobitna broja. Pored ovih operacija, unutar PIC16F84 mikrokontrolera mogue je realizovati mnoenje, deljenje, kvadratni koren, generisanje pseudosluajnog niza brojeva pa ak i mnogo, mnogo komplikovanije operacije. Po potrebi, ove funkcije mogu se proiriti za veu rezoluciju, kao i za rad sa pokretnim zarezom (eng. floating point). Za detalje pogledajte AN526, AN544, AN575, AN617, AN660 sa http://www.microchip.com/ i http://www.piclist.com/cgi-bin/constdivmul.exe link.
176
Tabelom koja Vam vraa celobrojnu vrednost moete dobiti taan celobrojni rezultat u samo 5-6 instrukcijskih ciklusa. I sami uoavate da je preciznost rezultata previe mala za ikakav ozbiljniji rad. Nema problema. Vrednost prve decimale rezultata nai e se u sledeoj tabeli. Tab2 addwf retlw retlw retlw retlw retlw retlw . . retlw retlw PCL,F .0 .0 .4 .7 .0 .2 . .9 .9 ; U W se nalazi broj od .0 do .255. ; 0 0,0 ; 1 1,0 ; 2 1,4 ; 3 1,7 ; 4 2,0 ; 5 2,2 ; 254 15,9 ; 255 15,9
Za drugu decimalu koristila bi se naredna tabela, i tako dalje. Iako su ovi naini izuzetno brzi, nisu ekonomini u pogledu utroka programske memorije. Dobar kompromis izmeu brzine i veliine programa predstavljao bi uvanje decimala u binarnom ili BCD obliku. Na taj nain gornje dve tabele mogle bi se kompresovati u jednu, tako to bi gornji nibl sadrao celobrojnu vrednost (0 do 15), a donji vrednost prve decimale. Za prikaz celobrojne vrednosti na LED displeju pozvala bi se odgovarajua konverziona rutina za gornji nibl, a donji nibl (decimalna vrednost) bi se ionako nalazila u BCD formatu. Tabela bi mogla izgledati ovako:
177
Tabl addwf retlw retlw retlw retlw retlw retlw . . retlw retlw
; U W se nalazi broj od .0 do .255. ; 0 0,0 ; 1 1,0 ; 2 1,4 ; 3 1,7 ; 4 2,0 ; 5 2,2 ; 254 15,9 ; 255 15,9
Za vei broj decimala pogodnije bi bilo koristiti binarni oblik zapisa (makar samo za decimale) i odgovarajue konverzione rutine. Sve zavisi od toga kolika Vam je brzina raunanja potrebna. Dobro poznavanje oblika signala odgovarajue matematike operacije moe Vam pomoi prilikom kompresije njene tabele. Kompresija opisana ranije ne bi bila mogua da je celobrojni rezultat operacije nad brojem 255 vei od 15, jer se broj vei od 15 ne moe nai u jednom niblu. Pogledajte na primer sinusnu funkciju. Slika Umesto uvanja vrednosti cele periode unutar vie tabela, mogli biste koristiti oznaene brojeve i naknadno dodatim MSB bitom pokazivali pripadnost gornjoj, odnosno donjoj poluperiodi. Na taj nain prepolovili biste broj potrebnih tabela za isti broj decimala. Slika Jo veu kompresiju dobili biste ukoliko se ograniite samo na etvrtinu periode, jer zbog simertinosti poluperiode drugi deo moete regenerisati oduzimanjem indeksa tabele od maksimalne vrednosti. Tako je broj potrebnih tabela smanjen na etvrtinu. Jedan nain raunanja sinusne (i kosinusne) funkcije za uglove od 0 do 45 stepeni i sa tanou od 6 decimala dobiti obrascima: SIN(X) = 1.7453293 * X * (1 0.50758 * X * X * (1 0.149 * X * X)) COS(X) = l 1.523087 * X * X * (1 0.25382 * X * X * (1 0.1 * X * X)) Za uglove od 45 do 90 stepeni, setite se da je SIN(X) = COS(90 X). Sledei nain brzog raunanja podrazumeva upotrebu eksterne EEPROM memorije. Na primer uz odgovarajuu I2C EEPROM memoriju mogue je unutar EEPROM-a uvati rezultate svih potrebnih matematikih operacija. Brzina raunanja bila bi jednaka brzini I2C veze, a program ne imao duge tabele. Maksimalnu brzinu dobili bi 178
upotrebom eksterne EPROM memorije, ali ona troi najvei broj pinova. Budui da je njena cena danas izuzetno niska, to bi ipak moglo predstavljati dobro reenje. Ukoliko Vam ni ovaj princip ne moe zadovoljiti apetit, razmislite o eksternom kooprocesoru. Integrisano kolo uM-FPU V3.1 predstavlja 32-bitni kooprocesor sa pokretnim zarezom i integrisanom I2C i SPI vezom. Za razliku od mikrokontrolera on je specijalno razvijen za brzo izvravanje sloenih matematikih operacija, tako da e na primer rezultat kvadratnog korena zavisiti jedino od brzine komunikacije. U praksi se matematiki prorauni uz eksterni hardver retko kada koriste. Isto kao kod poveanja broja U/I pinova, daleko je jednostavnije (i jeftinije) koristiti moniji mikrokontroler.
179
tako to satu dodate (ili oduzmete) 1 sekundu svakih par sati, dana, nedelja ili meseci. Verovatno e Vam biti potrebno par meseci za tanu kalibraciju upotrebljenog kristala. Najbolje je svakako ovu korekciju ubaciti za odreeni (fiksni) broj sekundi, ali to dosta komplikuje program i samim tim namee potrebu za njegovim sporijim izvravanjem. Drugaiji nain (hardverski) kalibracije vremena sastojao bi se u menjanju kapacitivnosti jednog od kondenzatora pored kristala od 32KHz. Najlake telovanje postie se trimer kondenzatorom. Dodatnu preciznost moete postii temperaturno kontrolisanim oscilatorom. Gotove softverske rutine za sat moete nai irom interneta. Ve imate asemblersku rutinu u Microchip Maestro programu. Verovatno ste ga ve instalirali uz MPLAB paket. Jo neke su na adresama http://www.iki.fi/jap i http://ourworld.compuserve.com/homepages/Bill_Bowden/homepage.htm#menu. Pravljenje najobinijeg digitalnog asovnika mikrokontrolerom nije ba praktino. Digitalni asovnici imaju svoja specijalizovana integrisana kola. Nema svrhe troiti novac na skuplji mikrokontroler. Isplati se to raditi jedino u sluaju da je potrebno napraviti sat specifinih osobina (vie alarma, povezivanje sa kompjuterom), kao na primer sa sajta http://www.bobblick.com/techref/projects/propclock/propclock.html. A ukoliko je mala potronja imperativ, mogu se specijalizovana integrisana kola povezati sa mikrokontrolerom. Tipini predstavnici ovakvih integrisanih kola su DS1307, PCF8593 i NJU6355. Zbog njihove minimalne potronje direktno na tampanu ploicu moe se zalemiti mala litijumska baterija preko koje bi se sat napajao elektrinom energijom u sluaju nestanka struje (isto kao kod matinih ploa kompjutera). Pored toga ova kola (isto kao i gore pomenuti Maestro softver) u sebi sadre kalendar, zajedno sa proraunima prestupnih godina. Nemojte misliti da bi upotrebom tih kola dobili veu preciznost. Preciznost takta direktno zavisi od upotrebljenog kristala (i njegove kalibracije), a potpuno isti kristal se koristi i u tim kolima.
181
91. Drajveri
Iako Vam moe tako izgledati, ovo nije ala. Ovde se dodue ne radi o drajverima za skener, tampa ili grafiku karticu, ve o drajverima za LED, LCD displej, prekidae ili step motor. Pogledajte najjednostavniji primer. Pretpostavljam da Vam je lake i razumljivije da testirate prekidae tako da pri njihovoj pritisnutosti oekujete pojavu logike 1, a ne logike 0 (to bi se sigurno desilo pri upotrebi pull-up otpornika). Najjednostavnije je u tom sluaju invertovati sve ulaze. Drajver_za_prekidace comf PORTB,W andlw b'00000011' return ; Stanje prekidaa u bitovima 0 i 1 u W ; Invertovani PORTB u W ; Maskiranje bitova 2 do 7 (izlazni) ; Povratak iz potprograma
Drajver bi se mogao dodatno kombinovati sa glavnim programom tako da se vrednost b'00000011' zadaje jednom pre inicijalizacije (npr. sa B_ULAZI equ b'00000011'), a zatim da se inicijalno podeavanje TRISB registra kao i andlw instrukcije unutar drajvera podesi ovako imenovanom vrednou. Pogledajte sada sledei primer. Jedan LED displej na portu B. Drajver bi se sastojao od ve ranije nauene tabele i potprograma za ispis. To bi moglo izgledati ovako: Drajver_za_led call Tabl movf SPORTB call Update return Tabl addwf retlw retlw retlw retlw retlw retlw Update movf movwf movf movwf return PCL,f b'00001100' b'10110110' b'10011110' b'11001100' b'11011010' b'11111010' SPORTA,W PORTA SPORTB,W PORTB ; Drajver za ispis W broja na LED displej ; Poziv za sliku LED displeja ; Slika cifre u shaddow registar za port B. ; Poziv potprograma za ispis ; Povratak iz potprograma ; U W se nalazi se vrednost od ; .1 do .6. Ta vrednost se dodaje na PCL. ; Obrazac za crtanje cifre 1 - 1 ; Obrazac za crtanje cifre 2 - 2 ; Obrazac za crtanje cifre 3 - 3 ; Obrazac za crtanje cifre 4 - 4 ; Obrazac za crtanje cifre 5 - 5 ; Obrazac za crtanje cifre 6 - 6 ; Shaddow registar porta A ; u PORTA ; Shaddow registar porta B ; u PORTB ; Povratak iz potprograma
Potprogram Update moe se ovako pozivati i za port A, odnosno moe sluiti kao posebna celina. 182
Kad god je mogue standardizujte softver za uobiajeni hardver drajverima. Potrudite se da odreene standardne vrednosti (ulazi u prvom drajveru) imenujete i podesite samo jednom u programu. Tako e pri kasnijoj izmeni softvera (npr. pri dodavanju jo jednog ulaznog pina) biti dovoljno izmeniti samo jedan jedini red programa. Manje izmena, manje greaka. Drajveri koji su vremenski kritini (npr. za osveavanje vie LED displeja, debouncing ili kontrolu step motora) mogu se pozivati u odreenim trenutcima iz interapta. Ipak, rad sa vie ovakvih vremenski kritinih delova unutar jednog programa dodatno komplikuje osnovni algoritam programa. Da bi se takvi delovi mogli izvravati bez dodatnih uslonjavanja, glavni program treba periodino, po zadatim kriterijumima pozivati ove delove. Vie o takvom principu nauiete u narednom poglavlju.
183
184
185
186
Iz svih ovih razloga PIC16 familija mikrokontrolera je prilino nezahvalna za pravljenje programa veih od 2Kb. Mora se voditi rauna o previe sitnica. Kod PIC18 serije na primer ukinuto je stranienje programske memorije, dok je prostor za registare u bankama povean na 256.
187
95. Disasembler
Sigurno Vam se desilo da ste na internetu naili na program koji radi upravo ono to je Vama potrebno, ali biste mu dodali jo par mogunosti. Naalost autor ga je napisao u PIC Basic ili C jeziku umesto u asembleru, ali je na sajtu ostavio i .hex kd. Disasemblerom je mogue .hex kd pretvoriti u asemblerski listing, koji se kasnije moe editovati. U tome je jedna od prednosti asemblera nad viim programskim jezicima. Ne postoji disasembler koji moe .hex fajl prebaciti u PIC Basic ili C. Neki od najpoznatijih disasemblera za PIC16F84 su Mikado PIC DIS LITE DISASM84 Ve ranije pominjani PIC Simulator IDE. Ovde je potrebno napomenuti da MPLAB asembler omoguuje korienje dodatnog seta instrukcija. Te instrukcije mikrokontroler ne razume, pa su stoga implementovane upotrebom dve ili vie obinih instrukcija. Ovaj set instrukcija mogue je nai u nekim (retkim) .asm fajlovima. Ukoliko elite saznati na koji nain mikrokontroler izvrava takav program, moete disasemblirati njegov .hex fajl i videti nain realizacije iz asemblerskog listinga. Analiza disasembliranih programa uopte nije laka. Komentara nema (osim onih koje disasembler eventualno postavi), registri i bitovi nisu uvek imenovani, a oni koji jesu, imae imena iz banke 0 (iako se moda realno nalaze u banci 1). Labelama disasembler dodeljuje onake redom, a registrima adresom (tipa Label4 i Reg2A). Binarni brojevi ili ASCII karakteri uvek su prikazani u heksadecimalnom formatu. Neuobiajeno reene operacije (npr. skok upotrebom PCL registra) mogu biti izuzetno komplikovane za analizu. Zato je preporuljivo u disasemblirani listing ubaciti odgovarajue komentare, i podeliti ih u logike celine (blokove). Isto tako, ukoliko ste sigurni u funkciju odreenih registra ili labela, moete im izmeniti naziv u svim mestima u kojima se pojavljuju u programu (preko Edit, Replace opcije). Analiza tuih programa pomoi e Vam u razvijanju sopstvenog stila programiranja, i u uenju novih softverskih tehnika. Osim toga, nema svrhe ponovo izmiljati toplu vodu. Veliki broj mikrokontrolerskih projekata sa interneta je dat kao potpuno besplatan. Onaj ko eli naplatiti svoj trud, ne ostavlja program na internetu, ve prodaje programirane i zatiene mikrokontrolere (ukljuen CP konfiguracioni bit). Budui da je ovaj nain zatite programa mikrokontrolera sasvim dovoljan za spreavanje piraterije, i Vi moete biti sigurni da Vam se dugo pisani program nee odjednom pojaviti na internetu.
188
96. Preprocesor
U programima se esto javlja potreba za standardnim programskim strukturama tipa if...then...else... ili do...while... (primeri su iz Paskal jezika, iako se ista struktura sree u svim viim programskim jezicima). Svakako da se ove strukture mogu realizovati runo u asembleru, ali u veim programima njihov kod je teko pratiti, ak i uz komentare. Preprocesor predstavlja program kojim je mogue ubrzati razvojh programa, zadravajui pri tome svu snagu asemblera. Kako je to mogue? Pretpostavimo da imate ve razvijene drajvere za standardne periferije. Utoliko bolje po Vas. Meutim, nije ba lako povezati ih u celinu. Za najobinije testiranje dvobajtnog broja i izvravanje razliitog koda u zavisnosti od rezultata, morali bi napisati dosta koda. to vie runo pisanog koda, to vea mogunost pojave greaka. Nije li lake pisati: if GODINA > .2008 then incf BROJ,F else decf BROJ,F endif nego: movf sublw btfsc goto btfsc goto Uvecaj Test incf goto movf sublw btfss goto decf ... HI_GODINA,W 0x07 STATUS,Z Test STATUS,C Smanji BROJ,F Kraj LO_GODINA,W 0xD8 STATUS,C Uvecaj BROJ,F
Smanji Kraj
Prvi sluaj je razumljiviji (opet su komentari namerno izostavljeni), i njime je preprocesoru preputena briga oko raunanja konkretnih vrednosti (0x07 i 0xD8) za poreenje, realizovanje odgovarajue programske strukture i izmiljanje naziva labela. Potrebno je naravno prethodno definisati da je GODINA dvobajtna vrednost. Nakon to se preprocesorom dobije odgovarajui asemblerski kod, tako dobijen .asm fajl standardno bi se kompajlirao MPLAB asemblerom. 189
Moda smatrate da je lake koristiti C ili PIC Basic. Delimino ste u pravu. Problem je to vii programski jezici ne ostavljaju programeru mogunost simuliranja programa instrukciju po instrukciju (bar ne na nain kojim bi programer mogao uticati na program na instrukcijskom nivou), njihov kod je dui i sporije se izvrava. Preprocesor pak dodaje samom asembleru (osnovne) mogunosti viih programskih jezika, tako da se asemblerske instrukcije slobodno mogu nalaziti u okviru koda koji izvrava preprocesor. Preprocesor e ih jednostavno ignorisati. Nakon to preprocesor generie osnovni asemblerski kod, lako je naknadno ga izmeniti direktno u MPLAB-u, ukoliko Vam dobijeni kod iz bilo kojih razloga ne odgovara. Prepic preprocesor moete skinuti sa http://www.embedinc.com/pic/dload.htm. Kako on nema GUI (Graphical User Interface) problem e Vam verovatno predstavljati prenoenje parametara unutar komandne linije. SASM (Jessica Meremonte's Structural PIC Assembler preprocessor) preprocesor nalazi se na http://www.picbook.com/downloads.html. On je skromnijih mogunosti, i ne ostavlja programeru mogunost naknadne izmene dobijenog koda (dobija se samo .hex fajl). ista je teta to se mogunosti preprocesora nedovoljno iskoriavaju. Uz preprocesor je razvoj programa skoro isto toliko brz kao kod viih programskih jezika, a opet je korisniku omoguena maksimalna mogua kontrola programa.
190
191
192
zaglavlju koje koristite za razvoj novih programa unapred inicijalizujete stanje na PORTA i PORTB registrima pre promene TRISA registra. U stvari poeljno je ubaciti inicijalizaciju u zaglavlje za sve najkorienije registre (npr. INTCON i OPTION_REG) zajedno sa njihovim kratkim objanjenjima, da se njihova inicijalizacija ne bi previdela. Ukoliko su direktno na mikrokontroler povezani prekidai, morate na ulaznim pinovima postaviti pull up ili pull down otpornike. Najpraktinije je koristiti integrisane pull up otpornike na PORTB. U protivnom, zraenje vaeg mobilnog telefona, pojaana aktivnost sunevih pega pa ak i komniin upravo ukljuen usisiva mogu dovesti do prelaska ulaznog pina u nedefinisano stanje i lanu detekciju pritisnutog tastera. Program bez debouncing rutine radie bez problema dok su kontakti prekidaa novi. im se oni iskrzaju, program e detektovati vie uzastopnih pritisaka prekidaa. Korisnici uvek mogu pritisnuti 2, 3 ili vie tastera istovremeno. Budite sigurni da e bar neko od njih to i uiniti. Program mora biti napisan tako da predvidi i tu mogunost. Poseban sluaj predstavljaju greke izazvane internim ciklusom itanja i upisa stanja sa porta (eng. RMW Read, Modify Write). Prilikom izmene stanja porta instrukcijom bcf PORTA,2 mikrokontroler e oitati trenutno stanje svih pinova PORTA registra, resetovati bit 2 i postaviti dobijeno stanje u PORTA. Meutim, ukoliko je na primer pin RA0 definisan kao izlazni sa logikom 1, ali se iz bilo kog razloga (previe mala impedansa na liniji) pin RA0 trenutno nalazi u stanju u kome nije postavljen, mogue je da mikrokontroler pri RMW ciklusu sa njega oita logiku 0 umesto logiku 1, i da mu na taj nain grekom prilikom upisa promeni stanje. Da bi se ovo izbeglo, poeljno je ne izvravati operacije direktno nad portovima, ve sve operacije obavljati nad shaddow registrom, a tek kasnije, kada je to neophodno kopirati rezultat u odgovarajui port. Umesto ekanja na setovanje flaga kraja upisa u EEPROM moete (ukoliko vam brzina nije imperativ) jednostavno saekati dovoljno dugo da se upis sigurno zavri. Takoe dobra je praksa testiranje maksimalnog vremena snimanja i nastavak programa ukoliko je ono mnogo due od normalnog ignoriui pri tome stanje flaga. Na taj nain sigurni ste da e program ispravno raditi ak i da mikrokontroler (iz bilo kog razloga) ne setuje pravovremeno flag. EEPROM memorija mikrokontrolera ima svoj radni vek. Ne bi smeli dozvoliti programu snimanje preko vrednosti specificirane u tehnikom uputstvu. Bolje po inicijalizaciji mikrokontrolera obavite sve potrebne operacije u obinoj (RAM) memoriji, a snimajte u EEPROM, samo kada je to neophodno. Ipak, sam PIC je prilino izdrljiv. Evo dobrog primera sa jedne mailing liste. From: "nepe_yu" To: mikroelektronika@yahoogroups.com Subject: [mikroelektronika] Re: Pouzdanost PIC-ova (WDT) A evo i mog skromnog iskustva :) Naime grekom sam u jednom projektu upis, u interni EEPROM PIC18F452 mikrokontrolera, vrio na 100mS neprekidno, i nakon 194
vie meseci rada ta lokacija EEPROMa je stradala. "Obdukcijom" je utvreno da je vie od 12000000 (12 miliona) puta izvren upis pre nego to se javio problem :) Eto, ima i pozitivnih iskustava :))) Dobru praksu predstavlja kratko ukljuenje svih LED za vreme inicijalizacije mikrokontrolera. Na taj nain odmah po ukljuenju mikrokontrolera moete primetiti da li su svi segmenti LED displeja kao i pojedinane LED ispravne. Ukoliko je mogue, u toku inicijalizacije testirajte i eksterne komponente. Na primer digitalni senzor temperature je oigledno neispravan ukoliko prijavljuje temperaturu apsolutne nule (-273oC). Detekciju bilo kakvog kvara mikrokontroler moe signalizirati treperenjem displeja ili pojedinanih LED uz eventualni opis greke (npr treperea oznaka E1 na LED displeju signalizira prekid veza do senzora osvetljenosti utvrenu njegovom prevelikom otpornou, a treperea oznaka E2 neispravnost digitalnog senzora temperature utvrenu izlaskom merene temperature iz njenog uobiajenog - radnog opsega). Na taj nain blie odreujete mesto kvara, to vam moe pomoi prilikom opravke. Microchip je takoe imao Marfija na umu kada je projektovao mikrokontrolere pa asembler u sve neiskoriene adrese programske memorije snima kod NOP instrukcije. Nakon maksimalne programske adrese 3xFF program se nastavlja od poetka (0x00). Ipak, problem moe izazvati adresiranje memorije koja nije implementovana u PIC16F84 mikrokontroleru (4x00 1FxFF), jer e se ona ponaati kao da je u njoj mapirana obina (radna) programska memorija. Potpuno je isto adresiranje lokacija 0x20, 4x20, 8x20, Cx20, 10x20, 14x20, 18x20 i 1Cx20. Ovo su ipak ekstremni sluajevi i ne bi Vas trebali brinuti.
195
6. Umesto rotacionog enkodera postavljena je tastatura sa ciframa 0 do 9 i tasterom DALJE bez debouncing rutine, ali sa pauzom od treine sekunde po pritisnutom tasteru. Vreme potrebno za podeavanje iznosi oko 3S. 7. Dodata je debouncing rutina. Vreme za podeavanje iznosi samo 2S. Sigurno ste i Vi doli do zakljuka da bi jedino naini pod takom 4, 5 i 7 bili najprilagoeniji korisniku. Koji nain e se koristiti zavisi jedino od broja slobodnih pinova i cene odgovarajueg interfejsa. Osim ulaznih, nije teko ostvariti poboljanja ni na izlaznom hardveru. ta mislite o LED displeju koji menja jainu svog svetla u zavisnosti od spoljnog osvetljenja? Nou bi svetleo slabo, a danju jako. Osim to lepe izgleda (ne bljeti), displej e Vam due trajati. Ukoliko imate este nestaice struje, pa ste zbog toga za sat predvideli dodatno napajanje baterijom, nema potrebe da LED displej bude svo vreme ukljuen. Ako ga ve morate ukljuivati kada nema napajanja iz mree, neka to bude po pritisku taster prekidaa i na kratko.
197
198
Najnovija Microchip familija mikrokontrolera PIC32mx omoguuje rad sa tridesetdvobitnim instrukcijama, ali naalost instrukcije su joj potpuno razliite od ranijih serija. Izgleda da je Microchip reio da prilagodi svoje proizvode i za programski jezik C koji u ranijim serijama nije bio efektno zastupljen. Umesto PIC16F84 mikrokontrolera moete uz odgovarajue izmene softvera koristiti PIC16F628 koji ima duplo vie memorije, integrisani PWM i RS232 i jo dva tajmera uz duplo manju cenu. Ukoliko su Vam bitni A/D konvertori idealno reenje predstavljaju 18-pinski PIC16F88 i 40-pinski PIC16F877. Uz ovakve osnove moete isprobati i druge familije mikrokontrolera. Trenutno su aktuelne serije AVR i Motorola. Naalost motorolini mikrokontroleri (iako odlini i jeftini) imaju prilino skup softver, a i dostava im moe biti problematina za nau zemlju. Ono to ini mikrokontrolere toliko monim nije njihova brzina, memorija ni integrisani hardver, ve ideja o njihovoj moguoj upotrebi u svakodnevnom ivotu, i poboljanja koja bi se njihovom upotrebom mogla ostvariti. Ukoliko ve nemate uslova da mikrokontrolerima poboljate industrijske maine, ponite od svog domainstva. Stepenini automat za svetlo, elektronska brava, zvono, tajmer za osvetljenje akvarijuma, tajmer za prehranu pela zimi, automatska hranilica za kune ljubimce, digitalni podsetnik, brzinomer za biciklu, sve su to mali projekti koji Vam mogu pomoi u svakodnevnom ivotu. Deluje jednostavno? Setite se svog prvog programa. Mogunost za nadogradnju uvek postoji.
200
103. Prilozi
Priloge na narednim stranama poeljno je tampati posebno, kako bi Vam uvek bili na dohvatu ruke. Moete ih koristiti kako bi se brzo podsetili tanog naziva instrukcija ili banke registara. XOR 0 1 0 1 AND 0 1 0 1 IOR 0 1 0 1 COM 0 1 1 0 00101110 XOR 10010110 = 10111000 Rezultat XOR operacije e biti logika 1 samo ukoliko su mu oba operanda razliita. Ukoliko su ista (obe 0 ili obe 1), rezultat e biti logika 0. 01101011 AND 10100101 = 00100001 Rezultat AND operacije bie logika 1 samo ukoliko su oba operanda na logikoj 1. Ukoliko bar jedan nije, rezultat e biti logika 0. 01101011 IOR 10100101 = 11101111 Rezultat IOR operacije bie logika 1 ukoliko je bar na jednom operandu prisutna logika 1. Ukoliko su oba na logikoj 0, i rezultat e biti jednak logikoj 0. COM 01101011 = 10010100 Komplement ili invertovanje predstavlja logiku operaciju u kojoj svaki bit u bajtu menja svoju vrednost.
0 0 1 1
0 1 1 0
0 0 1 1
0 0 0 1
0 0 1 1
0 1 1 1
201
Dec Hex .0 .1 .2 .3 .4 .5 .6 .7 .8 .9
Bin
BCD 00 01 02 03 04 05 06 07 08 09 0x 0x 0x 0x 0x 0x BCD 20 21 22 23 24 25 26 27 28 29 2x 2x 2x 2x 2x 2x
Ozn 0 +.1 +.2 +.3 +.4 +.5 +.6 +.7 +.8 +.9 +.10 +.11 +.12 +.13 +.14 +.15 Ozn +.32 +.33 +.34 +.35 +.36 +.37 +.38 +.39 +.40 +.41 +.42 +.43 +.44 +.45 +.46 +.47
Dec Hex
Bin
BCD 10 11 12 13 14 15 16 17 18 19 1x 1x 1x 1x 1x 1x BCD 30 31 32 33 34 35 36 37 38 39 3x 3x 3x 3x 3x 3x
Ozn +.16 +.17 +.18 +.19 +.20 +.21 +.22 +.23 +.24 +.25 +.26 +.27 +.28 +.29 +.30 +.31 Ozn +.48 +.49 +.50 +.51 +.52 +.53 +.54 +.55 +.56 +.57 +.58 +.59 +.60 +.61 +.62 +.63
0x00 b'0000 0000' 0x01 b'0000 0001' 0x02 b'0000 0010' 0x03 b'0000 0011' 0x04 b'0000 0100' 0x05 b'0000 0101' 0x06 b'0000 0110' 0x07 b'0000 0111' 0x08 b'0000 1000' 0x09 b'0000 1001'
.16 0x10 b'0001 0000' .17 0x11 b'0001 0001' .18 0x12 b'0001 0010' .19 0x13 b'0001 0011' .20 0x14 b'0001 0100' .21 0x15 b'0001 0101' .22 0x16 b'0001 0110' .23 0x17 b'0001 0111' .24 0x18 b'0001 1000' .25 0x19 b'0001 1001' .26 0x1A b'0001 1010' .27 0x1B b'0001 1011' .28 0x1C b'0001 1100' .29 0x1D b'0001 1101' .30 0x1E b'0001 1110' .31 0x1F b'0001 1111' Dec Hex Bin
.10 0x0A b'0000 1010' .11 0x0B b'0000 1011' .12 0x0C b'0000 1100' .13 0x0D b'0000 1101' .14 0x0E b'0000 1110' .15 0x0F b'0000 1111' Dec Hex Bin
.32 0x20 b'0010 0000' .33 0x21 b'0010 0001' .34 0x22 b'0010 0010' .35 0x23 b'0010 0011' .36 0x24 b'0010 0100' .37 0x25 b'0010 0101' .38 0x26 b'0010 0110' .39 0x27 b'0010 0111' .40 0x28 b'0010 1000' .41 0x29 b'0010 1001' .42 0x2A b'0010 1010' .43 0x2B b'0010 1011' .44 0x2C b'0010 1100' .45 0x2D b'0010 1101' .46 0x2E b'0010 1110' .47 0x2F b'0010 1111'
.48 0x30 b'0011 0000' .49 0x31 b'0011 0001' .50 0x32 b'0011 0010' .51 0x33 b'0011 0011' .52 0x34 b'0011 0100' .53 0x35 b'0011 0101' .54 0x36 b'0011 0110' .55 0x37 b'0011 0111' .56 0x38 b'0011 1000' .57 0x39 b'0011 1001' .58 0x3A b'0011 1010' .59 0x3B b'0011 1011' .60 0x3C b'0011 1100' .61 0x3D b'0011 1101' .62 0x3E b'0011 1110' .63 0x3F b'0011 1111'
202
Dec Hex
Bin
BCD 40 41 42 43 44 45 46 47 48 49 4x 4x 4x 4x 4x 4x BCD 60 61 62 63 64 65 66 67 68 69 6x 6x 6x 6x 6x 6x
Ozn +.64 +.65 +.66 +.67 +.68 +.69 +.70 +.71 +.72 +.73 +.74 +.75 +.76 +.77 +.78 +.79 Ozn +.96 +.97 +.98 +.99
Dec Hex
Bin
BCD 50 51 52 53 54 55 56 57 58 59 5x 5x 5x 5x 5x 5x BCD 70 71 72 73 74 75 76 77 78 79 7x 7x 7x 7x 7x 7x
Ozn +.80 +.81 +.82 +.83 +.84 +.85 +.86 +.87 +.88 +.89 +.90 +.91 +.92 +.93 +.94 +.95 Ozn +.112 +.113 +.114 +.115 +.116 +.117 +.118 +.119 +.120 +.121 +.122 +.123 +.124 +.125 +.126 +.127
.64 0x40 b'0100 0000' .65 0x41 b'0100 0001' .66 0x42 b'0100 0010' .67 0x43 b'0100 0011' .68 0x44 b'0100 0100' .69 0x45 b'0100 0101' .70 0x46 b'0100 0110' .71 0x47 b'0100 0111' .72 0x48 b'0100 1000' .73 0x49 b'0100 1001' .74 0x4A b'0100 1010' .75 0x4B b'0100 1011' .76 0x4C b'0100 1100' .77 0x4D b'0100 1101' .78 0x4E b'0100 1110' .79 0x4F b'0100 1111' Dec Hex Bin
.80 0x50 b'0101 0000' .81 0x51 b'0101 0001' .82 0x52 b'0101 0010' .83 0x53 b'0101 0011' .84 0x54 b'0101 0100' .85 0x55 b'0101 0101' .86 0x56 b'0101 0110' .87 0x57 b'0101 0111' .88 0x58 b'0101 1000' .89 0x59 b'0101 1001' .90 0x5A b'0101 1010' .91 0x5B b'0101 1011' .92 0x5C b'0101 1100' .93 0x5D b'0101 1101' .94 0x5E b'0101 1110' .95 0x5F b'0101 1111' Dec Hex Bin
.96 0x60 b'0110 0000' .97 0x61 b'0110 0001' .98 0x62 b'0110 0010' .99 0x63 b'0110 0011' .100 0x64 b'0110 0100' .101 0x65 b'0110 0101' .102 0x66 b'0110 0110' .103 0x67 b'0110 0111' .104 0x68 b'0110 1000' .105 0x69 b'0110 1001' .106 0x6A b'0110 1010' .107 0x6B b'0110 1011' .108 0x6C b'0110 1100' .109 0x6D b'0110 1101' .110 0x6E b'0110 1110' .111 0x6F b'0110 1111'
.112 0x70 b'0111 0000' .113 0x71 b'0111 0001' .114 0x72 b'0111 0010' .115 0x73 b'0111 0011'
+.100 .116 0x74 b'0111 0100' +.101 .117 0x75 b'0111 0101' +.102 .118 0x76 b'0111 0110' +.103 .119 0x77 b'0111 0111' +.104 .120 0x78 b'0111 1000' +.105 .121 0x79 b'0111 1001' +.106 .122 0x7A b'0111 1010' +.107 .123 0x7B b'0111 1011' +.108 .124 0x7C b'0111 1100' +.109 .125 0x7D b'0111 1101' +.110 .126 0x7E b'0111 1110' +.111 .127 0x7F b'0111 1111'
203
Dec Hex
Bin
BCD 80 81 82 83 84 85 86 87 88 89 8x 8x 8x 8x 8x 8x BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx
Ozn -.1 -.2 -.3 -.4 -.5 -.6 -.7 -.8 -.9 -.10 -.11 -.12 -.13 -.14 -.15 -.16 Ozn -.33 -.34 -.35 -.36 -.37 -.38 -.39 -.40 -.41 -.42 -.43 -.44 -.45 -.46 -.47 -.48
Dec Hex
Bin
BCD 90 91 92 93 94 95 96 97 98 99 9x 9x 9x 9x 9x 9x BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx
Ozn -.17 -.18 -.19 -.20 -.21 -.22 -.23 -.24 -.25 -.26 -.27 -.28 -.29 -.30 -.31 -.32 Ozn -.49 -.50 -.51 -.52 -.53 -.54 -.55 -.56 -.57 -.58 -.59 -.60 -.61 -.62 -.63 -.64
.128 0x80 b'1000 0000' .129 0x81 b'1000 0001' .130 0x82 b'1000 0010' .131 0x83 b'1000 0011' .132 0x84 b'1000 0100' .133 0x85 b'1000 0101' .134 0x86 b'1000 0110' .135 0x87 b'1000 0111' .136 0x88 b'1000 1000' .137 0x89 b'1000 1001' .138 0x8A b'1000 1010' .139 0x8B b'1000 1011' .140 0x8C b'1000 1100' .141 0x8D b'1000 1101' .142 0x8E b'1000 1110' .143 0x8F b'1000 1111' Dec Hex Bin
.144 0x90 b'1001 0000' .145 0x91 b'1001 0001' .146 0x92 b'1001 0010' .147 0x93 b'1001 0011' .148 0x94 b'1001 0100' .149 0x95 b'1001 0101' .150 0x96 b'1001 0110' .151 0x97 b'1001 0111' .152 0x98 b'1001 1000' .153 0x99 b'1001 1001' .154 0x9A b'1001 1010' .155 0x9B b'1001 1011' .156 0x9C b'1001 1100' .157 0x9D b'1001 1101' .158 0x9E b'1001 1110' .159 0x9F b'1001 1111' Dec Hex Bin
.160 0xA0 b'1010 0000' .161 0xA1 b'1010 0001' .162 0xA2 b'1010 0010' .163 0xA3 b'1010 0011' .164 0xA4 b'1010 0100' .165 0xA5 b'1010 0101' .166 0xA6 b'1010 0110' .167 0xA7 b'1010 0111' .168 0xA8 b'1010 1000' .169 0xA9 b'1010 1001' .170 0xAA b'1010 1010' .171 0xAB b'1010 1011' .172 0xAC b'1010 1100' .173 0xAD b'1010 1101' .174 0xAE b'1010 1110' .175 0x2F b'1010 1111'
.176 0xB0 b'1011 0000' .177 0xB1 b'1011 0001' .178 0xB2 b'1011 0010' .179 0xB3 b'1011 0011' .180 0xB4 b'1011 0100' .181 0xB5 b'1011 0101' .182 0xB6 b'1011 0110' .183 0xB7 b'1011 0111' .184 0xB8 b'1011 1000' .185 0xB9 b'1011 1001' .186 0xBA b'1011 1010' .187 0xBB b'1011 1011' .188 0xBC b'1011 1100' .189 0xBD b'1011 1101' .190 0xBE b'1011 1110' .191 0xBF b'1011 1111'
204
Dec Hex
Bin
BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx
Ozn -.65 -.66 -.67 -.68 -.69 -.70 -.71 -.72 -.73 -.74 -.75 -.76 -.77 -.78 -.79 -.80 Ozn -.97 -.98 -.99
Dec Hex
Bin
BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx BCD x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xx xx xx xx xx xx
Ozn -.81 -.82 -.83 -.84 -.85 -.86 -.87 -.88 -.89 -.90 -.91 -.92 -.93 -.94 -.95 -.96 Ozn -.113 -.114 -.115 -.116 -.117 -.118 -.119 -.120 -.121 -.122 -.123 -.124 -.125 -.126 -.127 -.128
.192 0xC0 b'1100 0000' .193 0xC1 b'1100 0001' .194 0xC2 b'1100 0010' .195 0xC3 b'1100 0011' .196 0xC4 b'1100 0100' .197 0xC5 b'1100 0101' .198 0xC6 b'1100 0110' .199 0xC7 b'1100 0111' .200 0xC8 b'1100 1010' .201 0xC9 b'1100 1001' .202 0xCA b'1100 1010' .203 0xCB b'1100 1011' .204 0xCC b'1100 1100' .205 0xCD b'1100 1101' .206 0xCE b'1100 1110' .207 0xCF b'1100 1111' Dec Hex Bin
.208 0xD0 b'1101 0000' .209 0xD1 b'1101 0001' .210 0xD2 b'1101 0010' .211 0xD3 b'1101 0011' .212 0xD4 b'1101 0100' .213 0xD5 b'1101 0101' .214 0xD6 b'1101 0110' .215 0xD7 b'1101 0111' .216 0xD8 b'1101 1000' .217 0xD9 b'1101 1001' .218 0xDA b'1101 1010' .219 0xDB b'1101 1011' .220 0xDC b'1101 1100' .221 0xDD b'1101 1101' .222 0xDE b'1101 1110' .223 0xDF b'1101 1111' Dec Hex Bin
.224 0xE0 b'1110 0000' .225 0xE1 b'1110 0001' .226 0xE2 b'1110 0010' .227 0xE3 b'1110 0011' .228 0xE4 b'1110 0100' .229 0xE5 b'1110 0101' .230 0xE6 b'1110 0110' .231 0xE7 b'1110 0111' .232 0xE8 b'1110 1000' .233 0xE9 b'1110 1001' .234 0xEA b'1110 1010' .235 0xEB b'1110 1011' .236 0xEC b'1110 1100' .237 0xED b'1110 1101' .238 0xEE b'1110 1110' .239 0xEF b'1110 1111'
.240 0xF0 b'1111 0000' .241 0xF1 b'1111 0001' .242 0xF2 b'1111 0010'
-.100 .243 0xF3 b'1111 0011' -.101 .244 0xF4 b'1111 0100' -.102 .245 0xF5 b'1111 0101' -.103 .246 0xF6 b'1111 0110' -.104 .247 0xF7 b'1111 0111' -.105 .248 0xF8 b'1111 1000' -.106 .249 0xF9 b'1111 1001' -.107 .250 0xFA b'1111 1010' -.108 .251 0xFB b'1111 1011' -.109 .252 0xFC b'1111 1100' -.110 .253 0xFD b'1111 1111' -.111 .254 0xFE b'1111 1110' -.112 .255 0xFF b'1111 1111'
205
Instrukcija Prepis podataka MOVF f,d MOVWF f MOVLW k CLRF f CLRW SWAPF f,d ADDWF f,d ADDLW k SUBWF f,d SUBLW k INCF f,d DECF f,d IORWF f,d IORLW k ANDWF f,d ANDLW k XORWF f,d XORLW k COMF f,d BCF f,b BSF f,b RLF f,d RRF f,d BTFSC f,b BTFSS f,b INCFSZ f,d GOTO k CALL k RETURN RETLW k RETFIE Ostalo NOP CLRWDT SLEEP Bez operacije Prepii f u d Prepii W u f
Opis
Cik. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Kod
Flagovi Nap. 12
001000 dfffffff Z 000000 1fffffff 1100xx kkkkkkkk 000001 1fffffff Z 000001 0xxxxxxx Z 001110 dfffffff
Upii konstantu u W Upii 0 u f Upii 0 u W Prepii unakrsno niblove iz f u d Saberi W i f Saberi W sa konstantom Oduzmi W od f Oduzmi W od konstante Uveaj f Smanji f Logiko ILI W sa f Logiko ILI W sa konstantom Logiko I W sa f Logiko I W sa konstantom Logiko ISKLJUUVO ILI W sa f Invertuj f Resetuj bit b u f Setuj bit b u f Rotiraj nalevo kroz CARRY Rotiraj nadesno kroz CARRY Test bita b u f, preskoi ako je bit = 0 Test bita b u f, preskoi ako je bit = 1 Uveaj f, preskoi ako je = 0 Idi na adresu Pozovi potprogram Vrati se iz potprograma Vrati se sa konstantom u W Vrati se iz interapta
2 12
Aritmetiko logike operacije 000111 dfffffff C DC Z 1 2 11111x kkkkkkkk C DC Z 000010 dfffffff C DC Z 1 2 11110x kkkkkkkk C DC Z 001010 dfffffff Z 001011 dfffffff Z 000100 dfffffff Z 111000 kkkkkkkk Z 000101 dfffffff Z 11111x kkkkkkkk Z 000110 dfffffff Z 111010 kkkkkkkk Z 001001 dfffffff Z 0100bb bfffffff 0101bb bfffffff 001101 dfffffff C 001100 dfffffff C 12 12 12 12 12 3 3 123 123 12 12 12 12 12
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
206
Legenda: f W b k x d C DC Z TO PD adresa registra W registar adresa bita unutar osmobitnog registra konstantna (nepromenljiva) vrednost ili labela nebitan bit (njegova vrednost se ignorie. Asembler ga automatski resetuje) odredite: d=0 rezultat u W, d=1 rezultat u f Carry flag STATUS registra Digit Carry flag STATUS registra Zero flag STATUS registra Time out bit STATUS registra Power down bit STATUS registra
Napomene: 1 Ukoliko je izlazni pin oitan pa modifikovan od strane jedne instrukcije (npr. movf PORTB,f), vrednost koja je uzeta za poetnu bie vrednost koja je oitana sa samih pinova. Ovo moe izazvati probleme zbog RMW ciklusa. 2 Ukoliko se ova instrukcija izvrava nad TMR0 registrom (i ukoliko je odredite d = 1 ako se koristi), stanje preskalera e biti obrisano ukoliko je pridrueno tajmeru. 3 Ukoliko je test ispravan, instrukcija e se izvriti za 2 instrukcijska ciklusa. Za detaljnija objanjenja pogledajte DS33023A sa www.microchip.com.
207
Adresa 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B
Opis Sadraj eljenog RAM registra u indirektnom adresiranju Tajmer 0. Poveava se od .0 do .255 Niih 8 bitova programskog brojaa PCLATH + PCL = PC Pointer indirektnog adresiranja Ulazno izlazni port A Ulazno izlazni port B -
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1 Bit 0
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
RB7 -
EEDATA Sadraj eljene EEPROM memorije EEADR Adresa unutar EEPROM memorije GIE EEIE T0IE PC INTE PC RBIE PSA PC PD PC T0IF PS2 PC Z PC PC PCLATH Viih 5 bitova programskog brojaa PCLATH + PCL = PC INTCON Interapt kontroler INDF PCL FSR TRISA TRISB / EECON1 EEPROM kontroler EECON2 Otkljuavanje upisa u EEPROM PCLATH Viih 5 bitova programskog brojaa PCLATH + PCL = PC INTCON Interapt kontroler GIE EEIE T0IE PC INTE PC RBIE PC T0IF PC PC Sadraj eljenog RAM registra u indirektnom adresiranju RBPU INTEDG T0CS T0SE PC PC PC RP0 EEIF RD PC TO PS1 PC DC PS0 PC C Niih 8 bitova programskog brojaa PCLATH + PCL = PC Pointer indirektnog adresiranja Registar smera podataka za PORTA Registar smera podataka za PORTB WRERR WREN WR OPTION Konfigurisanje hardverskog stanja mikrokontrolera STATUS Registar stanja mikrokontrolera
---0 0000 ---- ---1111 1111 0000 0000 0001 1xxx xxxx xxxx ---1 1111 1111 1111 0000 0000 ---0 x000 ---- ------0 0000
166
Molio bih prodavce PIC mikrokontrolera da mi se jave radi objavljivanja njihovih kontakt podataka (adresa, tel, mob, mail, sajt, baner...) u ovom uputstvu po njegovom zavretku. Zbog zatite od spama, e-mail e biti prikazan u obliku slike. U uputstvu ima izvesnih nedoreenosti u pogledu funkcija pojedinih registara, pinova, tajminga i slinih stvari. Kako je ovo prvenstveno poetniko uputstvo, ne smatram da je bitno optereivati itaoca znanjem koje mu verovatno nikada nee ni koristiti. Za profesionalan rad sa PIC mikrokontrolerima, nauite engleski i itajte Microchipova tehnika uputstva (Datasheet). Ne krivite me zbog upotrebe stranih rei. ta mislite, kako bi kardiovaskularni hirurg mogao objasniti svoju profesiju laiku bez upotrebe latinskih izraza? Primetili ste greku? Nepostojei link? Prvo proverite da li je to ispravljeno u najnovijem uputstvu (na sajtu kao i u uputstvu uvek objavljujem i datum izlaska nove verzije), i ukoliko nije kontaktirajte me preko knjige utisaka ili mailom objavljenim na sajtu. elite li da Vas obavetavam o objavljivanju nove verzije uputstva na sajtu? Moe. Poaljite mi svoj e-mail sa naznakom da elite da budete obavetavani. Takoe ga poaljite i za eventualnu kasniju odjavu. Moete se prijaviti i preko knjige utisaka na sajtu. Bez brige. E-mail adresa nee Vam biti objavljena. Uputstvo se moe slobodno kopirati i distribuirati pod uslovom da se u njega ne unose izmene. Delimino kopiranje uputstva je dozvoljeno uz navoenje linka do mog sajta, ali nije preporuljivo zbog novih verzija uputstva i eventualnih greaka. Meutim, prodaja ovog uputstva je zabranjena. Ukoliko ste ovo uputstvo kupili bilo gde i u bilo kom obliku (na CD-u na buvljaku, na flopiju od kolege sa posla pirata, od lokalnog TV servisera u tampanom izdanju), molim Vas da me o tome obavestite. Autor ne snosi ni najmanju odgovornost za korienje informacija sa ovog uputstva, datih linkova ili programa. Ako sprite PIC, gomilu elektronskih komponenti ili najnoviji Macintosh laptop, kupite novi, ali o svom troku. U izradi ovog uputstva koriena je sledea literatura:
Najvei deo sa http://www.mstracey.btinternet.co.uk/index.htm Datasheetovi sa http://www.microchip.com/ Tekstovi Voje Antonia http://www.paralaxa.co.rs/ objavljeni u asopisu PC Press http://www.pcpress.co.rs/ novembra 1997 za I/O hardver Serijska i rutina za kanjenje sa http://www.nomad.ee/PIC/picprog.html Slike D/A konverzije sa http://www.avr-asm-tutorial.net/avr_en/AVR_DAC.html 2 LED na 1 pinu sa download sekcije sajta http://www.elektronika.ba/ asopis Elektor 7-8 2001 http://www.elektor-electronics.co.uk za multipleks Neka objanjenja sa http://www.geocities.com/sinelyu/pic/pic_kontroleri.htm Primer izdrljivosti PIC-a sa mailing liste mikroelektronika@yahoogroups.com Uputstvo postavljeno 21.8.2008. na sajtu http://www.ptt.rs/korisnici/t/r/trifunov/ 209