M.Nedeljkovic - GENERATOR PSEUDO-SLUČAJNE BINARNE SEKVENCE PRNG

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 113

Elektronski fakultet u Niu Katedra za elektroniku

GENERATOR PSEUDO-SLUAJNE BINARNE SEKVENCE (PRNG)

Student: Miodrag Nedeljkovi 10741 Mentor: prof. dr Mile Stojev

-0-

SADRAJ

UVOD____________________________________________________________________2

PSEUDO-SLUAJNI BINARNI GENERATOR (PRNG)_________________________3 Uopteno o PRNG-u _ _______________________________________________________3 Karakteristini polinomi______________________________________________________3 Primitivni polinomi _________________________________________________________3 Ne primitivni polinomi_______________________________________________________4 Oblast primene PRNG-a _____________________________________________________4 II IMPLEMENTACIJA PRNG-A ______________________________________________6 Fibonacci-jev metod implementacije____________________________________________6 Galois metod implementacije_________________________________________________10 III PIC16F877A_____________________________________________________________12 Osnovne karakteristike mikrokontrolera_________________________________________13 Arhitektura mikrokontrolera__________________________________________________13 Oscilator ________________________________________________________________14 Reset____________________________________________________________________17 Watchdog tajmer _________________________________________________________21 Prekidi __________________________________________________________________21 Tajmeri _________________________________________________________________22 Portovi _________________________________________________________________24 Organizacija memorije _____________________________________________________30 A/D konvertor ____________________________________________________________33 Periferijske jedinice ________________________________________________________35 IV PROGRAMIRANJE MIKROKONTROLERA _________________________37 Softver za PIC mikrokontrolere mikro-C________________________________________37 ALLPIC_________________________________________________________________38 Softver IC-prog ___________________________________________________________39 V SIMULACIJA PRNG-a PREKO MIKROKONTROLERA _____________________45 Blok ema________________________________________________________________45 Elektrina ema ___________________________________________________________46 Izgled ploice ____________________________________________________________47 Listing koda u c-u ________________________________________________________48 Listing asemblerskog koda __________________________________________________51 VI LABORATORIJSKA VEBA _____________________________________________85 VII ZAKLJUAK___________________________________________________________87 VIII SPISAK AKRONIMA ____________________________________________________88 IX LITERATURA__________________________________________________________89 X PRILOZI_______________________________________________________________90 C_____________________________________________________________________90 AllPic __________________________________________________________________92 PIC 16F877A____________________________________________________________95 MAX232 _______________________________________________________________104 Led____________________________________________________________________110 XI BIOGRAFIJA AUTORA __________________________________________112

-1-

UVOD
Ideja autora ovog rada je da se predstavi pseudo-sluajni binarni generator (PRNG) i da se izvri simulacija PRNG pomou mikrokontrolera. Ovaj rad je koncipiran iz nekoliko poglavlja koja svako za sebe ini jednu posebnu celinu i bez kojih bi bilo nemogue ostvariti i razumeti ideju autora. U prvom poglavlju date su opte smernice vezane za PRNG. Te smernice se uglavnom odnose na objanjenja vezana za PRNG, pojanjenja iz ega se sastoji PRNG kao i kratke teorije o karakteristinim, primitivnim i ne primitivnim polinomima ija primena u PRNG-u je od izuzetne vanosti. Kroz drugo poglavlje dati su metodi implementacije PRNG-a i to Fibonacci-jev i Galois metod. Tree poglavlje opisuje PIC16F877A mikrokontroler i to njegove najbitnije karakteristike. Programiranje mikrokontrolera je opisano u etvrtom poglavlju i tu je objanjen nain pisanja koda u C-u za mikroipove mikrokontrolere kao i kompajliranje koda. Peto poglavlje sadri simulaciju PRNG sa svim potrebnim objanjenjima, opis praktinih delova, i opis programiranja PIC16F877A mikrokontrolera pomou programatora. U estom poglavlju je definisana laboratorijska veba za samostalan rad studenata gde e moi da se upoznaju sa PRNG-om i njegovim karakteristikama. Kroz sedmo poglavlje je dat kratak osvrt na najbitnije karakteristike PRNG-a. Osmo poglavlje ini spisak koriene literature koja je potrebna za bolje upoznavanje problematike vezane za PRNG. I na kraju u devetom poglavlju je dat originalan opis za komponenete, hardver, i softver korien u izradi ovog seminarskog a koji daje proizvoa.

U Niu, 15. 06. 2008. godine

-2-

PSEUDO-SLUAJNI BINARNI GENERATOR (PRNG)

UOPTENO O PRNG-u Pseudo-sluajni binarni generator je generator pseudo sluajne sekvence koja se sastoji od binarnh brojeva (0 i 1). Skraenica PRNG potie od poetnih slova engleskog naziva za ovaj generator koji glasi pseudo-random number generator. Najednostavniji i najei metod implementacije PRNG-a je pomou pomerakog registra sa linearnom povratnom spregom (linear feedback shift register-LFSR), tako da je svaki element izlazne sekvence linearna funkcija n prethodnih elemenata. LFSR je izgradjen od prostih pomerakih registara sa dodatkom malog broja XOR kola (mali hardver, velika brzina) to ga ini veoma pogodnim za primene u ugradjenim sistemima. Kod generisan pomou LFSR-a je u stvari pseudo sluajan zato to se posle isteka odredjenog vremenskog perioda sluajni brojevi (sekvenca) ponavljaju. Ovo je dobra osobina za odredjene primene, naroito tamo gde je potrebna ponovna upotreba iste sluajne sekvence. Bitna stvar kod implementacije je u upotrebi pomerakog registra dovoljne duine tako da se generisana sekvenca ponavlja posle isteka odredjenog, dugog, vremenskog perioda. Ovako kolo nam je potrebno gde god postoji potreba za primenu ponovljivih sluajnih podataka, male memorije, ogranienog vremena generisanja i drugih slinih zahteva, gde generatori pravih sluajnih podataka nebi bili primenljivi. Praktini razlozi takoe ograniavaju primenu pravih sluajnih podataka a samim tim i generatora koji ih proizvode. KARAKTERISTINI POLINOMI Ve je pomenuto da se PRNG sastoji od pomerakog registra sa linearnom povratnom spregom (LFSR-a). Opet LFSR je sainjen od prostih pomerakih registara, sastavljenih od flipflopova, i XOR kola preko kojih se zavaraju povratne sprege. Ako imamo n D flip-flopova, onda postoji mogunost za postojanje n+1 povratne sprege. Izbor potrebnih povratnih sprega za LFSR od mogue n+1 opisuje se karakteristinim polinomom. Karakteristini polinom za LFSR sa n flip-flopova ima sledeu uoptenu formu: C01+C1X+C2X2+...+Cn-2Xn-2+Cn-1Xn-1+CnXn gde su koeficijenti Ci binarni koeficijenti (Ci(0,1)) i 1 znai da je odgovarajua povratna sprega prisutna a 0 da ona ne postoji. Poto se sa C01 i CnXn opisuju ulaz i izlaz LFSR-a oni su prisutni u izrazu uvek. Ovako definisan polinom se moe definisati i u drugom obliku i to preko binarne liste koeficijenata i liste eksponenata (stepena). Uzmimo na primer karakteristini polinom 1+X3+X4. Njegova odgovarajua predsava pomou binarne liste koeficijenata je C0 =1, C1=0, C2=0, C3=1, C4=1. Alternativna notacija binarne liste koeficijenata je (1, 0, 0, 1, 1). Ovaj polinom definisan preko liste eksponenata glasi (0, 3, 4). Napomenimo jo jednom da su C0 i Cn uvek jednaki jedinici, jer predstavljaju ulaz i izlaz sistema, respektivno. Izostanak bilo kog od njih smanjuje stepen PRNG-a. PRIMITIVNI POLINOMI Primitivni polinomi su oni koji ne mogu biti prikazani kao proizvod dva ne trivijalna polinoma. Za bilo koji stepen polinoma postoji bar jedan primitivni polinom. Nalaenje ovih polinoma je teko pa se oni uglavnom koriste iz ve postojeih tablica. U tabeli 1. su dati primitivni polinomi od stepena n=2 do stepena n=5. Primitivni polinomi uvek dolaze u paru. Ako je polinom primitivan onda je i njegov reciproan polinom primitivan.

-3-

Tabela 1. Primitivni polinomi u polju sa dva elementa (0,1) do petog stepena n-stepen polinoma 2 3 4 5 Primitivni polinomi 1+X+X
2

1+X+X3; 1+X2+X3 1+X+X4; 1+X3+X4; 1+X2+X5; 1+X3+X5; 1+X+X2+X3+X5; 1+X+X3+X4+X5; 1+X2+X3+X4+X5; 1+X+X2+X4+X5

Na primer za polinom 1+X3+X4 njegov reciproni polinom je 1+X+X4, ili zapisan preko liste eksponenata (0, 1, 4). Nalaenje recipronog polinoma je dosta lagano. Opet razmotrimo primer polinoma n=4 stepena koji glasi 1+X3+X4 ili dat preko binarne liste koeficijenata kao (1, 0, 0, 1, 1). Njegov reciproni polinom je (1, 1, 0, 0, 1). Znai za dobijanje recipronog polinoma potrebno je samo izvriti invertovanje koeficijenata, naravno izuzev zadnjeg i prvog koji su uvek prisutni i predstavljaju ulaz i izlaz. Napomenimo da se sve operacije odvijaju u matematikom polju sa dva elementa (0, 1). Ovi polinomi su bitni zato to omoguavaju generisanje sekvenci najdueg trajanja. LFRS stepena n ima 2n-1 moguih karakteristinih polinoma a samo veoma mali broj njih je primitivan. Najjednostavniji primitivni polinomi su oni koji imaju samo jo jedan dodatni Ci pored C0 i Cn a nazivaju se trinomi. Veina karakteristinih polinoma stepena n ima bar jedan primitivni trinom. Ovo je bitno iz razloga to oni omoguavaju najjednostavniju implementaciju PRNG-a sa najmanje XOR kola, a tako koriste najmanji mogui hardver za implementaciju. Za velike vrednosti stepena n polinoma, imamo previe moguih primitivnih polinoma, pa iz te grupe trebamo odabrati onaj koji nam omoguava ispunjenje potrebnih zahteva, kao to je duina sekvence, uz najmanji potreban hardver za implementaciju. Za testiranja i merenja obino se koriste polinomi niih stepena od n=40. Recimo jo i to da je u raznim tabelama primitivnih polinoma prikazan mali broj njih i da su u veini tabela uvek prisutne povratne sprege C0 i Cn izostavljene pa je potreban oprez pri njihovom korienju. NE PRIMITIVNI POLINOMI LFRS implementacija a samim tim i implementacija PRNG-a sa ne primitivnim polinomima nije mnogo u upotrebi sa izuzetkom LFSR-a koji sadri samo trivijalne povratne sprege C0 i Cn a koji slui samo za ponavljanje inicijalne vrednosti iz registara. C0 i Cn su trivijalni u smislu da se podrazumeva da su stalno prisutni. Predhodna injenica se koristi za inplementaciju jednostavnih generatora koji proizvode kratke uzorke podataka. Ovako dobijen generator se ne upotrebljava u testiranjima i merenjima. OBLAST PRIMENE PRNG-a Primena PRBS-a zasnovanog na LFSR-u je velika i prostire se kroz razne oblasti elektronike, kao to su: - kriptografija (sigurnosni sistemi,sigurnosno ifrovanje/deifrovanje, ifrovanje/deifrovanje podataka) - kompijuterska grafika (skremblovanje/deskremblovanje podataka,digitalno procesiranje podataka) - samotestiranje ugradjenih sistema-BIST (ek suma, testiranje veza u realnim uslovima, testiranje sistema u uslovima najgoreg sluaja) - detekcija greke i korekcija -4-

- navigacioni sistemi - CDMA mobilni komunikacioni sistemi - kompresija podataka i dr. Neke od navedenih primena su ilustrovane na slici 1.

Slika 1. Oblasti primene PRNG-a

-5-

II

IMPLEMENTACIJA PRNG-a

U praksi postoje dve veoma jednostavne implementacije PRNG-a zasnovane na LFSR-u i to: - Fibonacci-jev metod implementacije i - Galois metod mplementacije Bilo koji od ova dva metoda je mogue implementirati i hardverski i softverski. Softverska implementacija, za praktine primene, nije mnogo popularna i ne koristi se sem u izuzetnim sluajevima. Za razliku od nje hardverska implementacija ova dva metoda se skoro iskljuivo koristi zato to je ona veoma jednostavna za sintezu na FPGA. FIBONACCI-jev METOD IMPLEMENTACIJE Fibonacci 1175-1250

Slika 2. Fibonacci i Fibonacci-jev princip implementacije Fibonacci-jeva implementacija PRNG-a se sastji iz linearnog pomerakog registra sa povratnom spregom. Ovaj registar je sainjen od n D flip-flopova i na njega se prikljuuje n+1 povratna sprega. Mehanizam povratne sprege je realizovan na taj nain to se izlazi D flip-flopa (koeficijenti Ci na slici 2) sprovode na ulaze XOR kola a izlaz XOR kola vraa na ulaz jednog od flip-flpova (najee prvog/zadnjeg). Ovo vai u sluaju korienja XOR kola sa n ulaza. U sluaju korienja dvoulaznih XOR kola izlazi sa D flip-flopova se takoe vode na ulaze XOR kola a izlazi XOR kola se vode na drugi ulaz prethodog XOR kola. LFSR, samim tim i PRNG realizovan ovim metodom radi na taj nain da kada se taktuje sistem on provodi signal kroz registre sa prvog bita na sledei bit vee teine. Slika 2. prikazuje princip fibonacci-jevog metoda implementacije. Prisustvo ili odsustvo povratne sprege opisano je tkz. generatorom polinoma odnosno polinomom to je opisano u prethodnom poglavlju. PRNG ima 2n moguih stanja, meutim njegova primena je ograniena na maksimalnu duinu od 2n -1 gde je n duina PRNG-a odnosno broj flipflopova. Stanje sa svim nulama je zabranjeno stanje ako se primenjuju XOR kola za povratnu spregu, a ako se primenjuji NXOR kola zabranjeno stanje je sa svim jedinicama. Tada se sistem zakljuava u tom stanju i ne moe doi do generisanja sekvence. Ipak stvarna duina zavisi od izabranog polinoma a u sluaju kada nije implementiran primitivni polinom i od poetnog stanja. Kada je primenjen primitivni polinom izbor razliitog poetnog stanja samo vremenski pomera sekvencu. Samo karakteristini polinomi koji su primitivni (u matematikom smislu) omoguavaju da PRNG proe kroz sva mogua stanja. Sekvenca dobijena primenom inverznog primitivnog polinoma je vremenski pomerena inae je ista u odnosu na sekvencu dobijenu primenom obinog primitivnog polinoma. Za bolje razumevanje kako se primitivnim polinomom implementira u hardver po Fibonacci-jevom principu razmotrimo primer polinoma petog stepena datog sa: 1+x2+x5 ili kao c0=1,c1=0,c2=1,c3=0,c4=0,c5=1, (1,0,1,0,0,1) ili kao (0,2,5). -6-

Poto implementiramo PRNG pomocu polinoma petog stepena n=5, onda je duina generatora sekvenci m=5, to znai da nam je potreban pomeraki registar od 5 D flip-flopova za njegovu realizaciju (slika 3).

Slika 3. Primer Fibonacci-jeve implementacije polinoma petog stepena Duina binarne sekvence, za ovaj primer je mb=2n_ 1=25_ 1=31. Binarna sekvenca se ita sa flip-flopa najveceg stepena a to je u ovom sluaju na izlazu Q5. Kao to se sa slike 3 vidi, za implementaciju ovog polinoma ulazi XOR kola su vezani na izlaz flip-flopa 2 (Q2) i izlaz flip-flopa 5 (Q5) a izlaz na ulaz prvog flip-flopa. Q5 je izlaz celog sistema a ulaz prvog flip-flopa je ulaz celog sistema. XOR kolo slui da promeni vrednost ulaznog bita (flip-flopa). Za generisanje povratne sprege koristili smo primitivni polinom petog stepena f(x)= 1+x2+x5 koji omoguava sekvencu najdueg trajanja, bez ponavljanja. Iz sledea dva primera uoimo ta nam to u polinomu odreuje koliko nam je potrebno flip-flopova i XOR kola za implementaciju nekog polinoma.

n pokazuje koliko je potrebno flip-flopova (pet) f(x)=x5 +x2 +1 + pokazuje koliko nam je potreno xor kola (jedno) ili u drugom sluaju: osam flip-flopova f(X) =x8 +x6 +x5 +x4 + 1 tri povratne sprege pored dve stalno prisutne na ulazu i izlazu (tri dvoulazna xor ili jedno etvoroulazno)

U tabeli 2 su date sekvence kroz koje prolazi PRNG za primer polinoma petog stepena. Kao inicijalno stanje je uzeto stanje sa svim jedinicama. Koje stanje dolazi sledee zavisi od predhodnog stanja i poloaja povratne sprege. Ako se povratna sprega ne menja u toku rada, sekvenca je potpuno odreena. Kada se izlistaju svih 31 vrednosti ciklus se ponavlja. Specijalno stanje PRNG-a je kada imamo sve nule u registru. Kada je prisutno stanje sa svim nulama, nije mogue iz njega izai pa se ono jo naziva i zakljuano stanje. To se deava zato to XOR kolo na izlazu daje -7-

logiku nulu kada su mu svi ulazi na istoj logikoj vrednosti. U normalnom radu ovo stanje treba onemoguiti. Sekvence dobijamo na Q1-Q5 a binarnu sekvencu itamo na izlazu flip-flopa najveeg stepena to kada se primeni na na primer znai da je to na Q5. U zadnjoj koloni tabele 2 je data i decimalni ekvivalent vrednosti sekvence Q1-Q5 za odreeni trenutak. Tabela 2. Sekvence kroz koje prolazi sistem realizovan Fibonacci-jevim metodom sa sledeim polinomom 1+x2+x5. korak 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Q1Q2Q3Q4Q5 11111 po.st. 01111 00111 10011 11001 01100 10110 01011 00101 10010 01001 00100 00010 00001 10000 01000 10100 01010 10101 11010 11101 01110 10111 11011 01101 00110 00011 10001 11000 11100 11110 11111 ponovo 01111 Q5 1 1 1 1 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0 1 1 Decimalni ekvivalent 31 poetno st. 15 7 19 25 12 22 11 3 18 9 4 2 1 16 8 20 10 21 26 29 14 23 27 13 6 3 17 24 28 30 31ponovo 15

-8-

GALOIS METOD IMPLEMENTACIJE Evariste Galois 1811-1832

Slika 4. E. Galois i Galois princip implementacije Galois implementacija PRNG-a, takoe, sadri n D flip-flopova koji ine pomeraki registar i n+1 povratnu spregu. Razlika u odnosu na Fibonacci-jevu implementaciju je u tome sto se povratna sprega sa izlaza zadnjeg flip-flopa u nizu dovodi na XOR kola koja se nalaze izmeu ulaza i izlaza pojedinih susednih flip-flopova to je prikazano na slici 4. Galois implementacija koristi xor-ovanje unutranjih povratnih sprega. XOR kola kod ove implementacije se vezuju izmeu svaka dva susedna flip-flopa na taj nain to im se na jedan ulaz dovede izlaz zadnjeg flip-flopa u nizu, saglasno generatoru povratne sprege a na drugi ulaz im se dovodi izlaz flip-flopa koji mu predhodi, dok mu se izlaz vezuje na ulaz flip-flopa koji sledi. Prikaz ovog metoda dat je na slici 4. Prisustvo ili otsustvo povratne sprege je opisano generatorom polinoma na isti nain kao u Fibonacci-jevom metodu. I ovde faktori Ci uzimaju vrednost Ci(0,1), kao kod Fibonacci-jevog metoda. Galois PRNG ima 2n moguih stanja, meutim njegova primena je ograniena na maksimalnu duinu od 2n -1 gde je n duina PRNG-a odnosno broj flip-flopova. Stanje sa svim nulama je zabranjeno stanje ako se primenjuju XOR kola za povratnu spregu, a ako se primenjuji NXOR kola zabranjeno stanje je sa svim jedinicama. Tada se sistem zakljuava u tom stanju i ne moe doi do generisanja sekvence. Ipak stvarna duina sekvence zavisi od izabranog polinoma a u sluaju kada nije implementiran primitivni polinom i od poetnog stanja. Kada je primenjen primitivni polinom izbor razliitog poetnog stanja samo vremenski pomera sekvencu. Samo karakteristini polinomi koji su primitivni (u matematikom smislu) omoguavaju da Galois PRNG proe kroz sva mogua stanja. Sekvenca dobijena primenom inverznog primitivnog polinoma je vremenski pomerena inae je ista u odnosu na sekvencu dobijenu primenom obinog primitivnog polinoma. Za bolje razumevanje kako se primitivnim polinomom implementira u hardver po Galois principu razmotrimo primer polinoma petog stepena datog sa: 1+x2+x5 ili kao c0=1,c1=0,c2=1,c3=0,c4=0,c5=1, (1,0,1,0,0,1) ili kao (0,2,5). Poto implementiramo PRNG pomocu polinoma petog stepena n=5, onda je duina generatora sekvenci m=5, to znai da nam je potreban pomeraki registar od 5 D flip-flopova za njegovu realizaciju (slika 5). Duina binarne sekvence, za ovaj primer je mb=2n_ 1=25_ 1=31. Binarna sekvenca se ita sa flip-flopa najveceg stepena a to je u ovom sluaju na izlazu Q5. Kao to se sa slike 5 vidi, za implementaciju ovog polinoma jedan ulaz XOR kola je vezan na izlaz flipflopa 2 (Q2) a drugi ulaz na izlaz flip-flopa 5 (Q5) a izlaz XOR kola je vezan na ulaz treeg flipflopa. Izlaz zadnjeg flip-flopa Q5 je takoe odveden i na ulaz prvog flip-flopa (izlaz/ulaz). Q5 je izlaz celog sistema a ulaz prvog flip-flopa je ulaz celog sistema. XOR kolo slui da promeni -9-

vrednost ulaznog bita (flip-flopa). I kod Galois implementacije za generisanje povratne sprege koristili smo primitivni polinom petog stepena f(x)= 1+x2+x5 koji omoguava sekvencu najdueg trajanja, bez ponavljanja.

Slika 5. Primer Galois implementacije polinoma petog stepena I ovde kao i kod Fibonacci-jevog metoda isti parametri polinoma kazuju koliko nam je potrebno flip-flopova i XOR kola, kao i gde se XOR kola vezuju pa ih neemo ponovo razmatrati. Koje stanje dolazi sledee zavisi od predhodnog stanja i poloaja povratne sprege. Ako se povratna sprega ne menja u toku rada sekvenca je potpuno odreena. Kada se izlistaju sve vrednosti, proces se ponavlja iz poetka. Za na primer to s deava nakon 31 koraka. U tabeli 3 su date sekvence koje generie Galois PRNG generisan sa polinomom iz gore navedenog primera. U tabeli je data i binarna generisana sekvenca koja se ita sa Q5 kao i decimalni ekvivalenti za vrednost svake sekvence. Poetno stanje iz kojeg se kree je stanje sa svim jedinicama. Slino kao i kod Fibonacci-jevog metoda i ovde je stanje sa svim nulama zakljuano stanje i sistem ostaje u njemu sve dok se ne upiu druge poetne vrednosti u registar (bilo koje ne nulto stanje). Pre nego to damo par poreenja Fibonacci-jevog i Galois metoda implementacije, recimo da se svaka Fibonacci-jeva implementacija PRNG moe jednostavno transformisati u Galois PRNG. To se izvodi tako to se prvo otkae svi XOR ulazi, zatim se izvri inverzija eksponenata (flip-flopova) ali ne i smer u kom teku podaci. Sada veemo XOR ulaze u prethodne XOR izlaze (povratne sprege) i dovedemo na jedan ulaz XOR kola izlaz odgovarajueg flip-flopa a na drugi ulaz XOR kola izlaz celog sisema, i to je sve. Koju implementaciju emo da koristimo je stvar ukusa. Fibonacci-jeva implementacija je koncepcijski laka zato to se samo ulazni bit u pomerakom registru menja pri promeni kloka. Meutim Galois implementacija se moe koristiti pri veim frekvencijama. To je naroito izraeno gde imamo vie XOR kola, zato to kod ove implementacije XOR kola nisu redno vezana, ve se operacije izvravaju paralelno. Recimo jo i to da je sekvenca generisana sa ova dva metoda korienjem istog primitivnog polinoma razliita, dok je binarni izlaz isti stim to je vremenski pomeren.

- 10 -

Tabela 3. Sekvence kroz koje prolazi sistem reakizovan Galois metodom sa sledeim polinomom 1+x2+x5. korak 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Q1Q2Q3Q4Q5 11111 po.st. 11011 11001 11000 01100 00110 00011 10101 11110 01111 10011 11101 11010 01101 10010 01001 10000 01000 00100 00010 00001 10100 01010 00101 10110 01011 10001 11100 01110 00111 10111 11111ponov. Q5 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 Decimalni ekvivalent 31 27 25 24 12 6 3 21 30 15 19 29 26 13 18 9 16 8 4 2 1 20 10 5 22 11 17 28 14 7 23 31 ponovo

- 11 -

III

PIC16F877A

Veina dananjih mikrokontrolera je bazirano na Harvard arhitekturi, koja jasno definie etiri osnovne komponente potrebne za ugraen sistem. To ukljuuje CPU jezgro, memoriju za program (ROM, EPROM ili FLASH memoriju), memoriju za podatke (RAM), jedan ili vie tajmera (podesive i watchdog tajmere), kao i I/O linije za komunikaciju sa eksternim periferijama i dopunskim resursima a sve to treba da bude smeteno u jedno integrisano kolo. Mikrokontroler se u osnovi razlikuje od optenamenskog mikroprocesorskog ipa po tome to ga je izuzetno lako pretovoriti u radni kompjuter, sa minimumom eksternih ipova za podrku. Ideja je da se mikrokontroler isprogramira, postavi u ure-aj za kontrolu, povee na napajanje i stavi u funkciju. Mikrokontroler PIC16F877A firme Microchip predstavlja integraciju mikroprocesora (CPU), memorije i periferija, pa zato ne zahteva sloeni eksterni hardver da bi se realizovao mikroraunarski sistem. Ovaj mikrokontroler je izraen u CMOS tehnologiji sa ugraenom FLASH i EEPROM memorijom za memorisanje programa i podataka. PIC16F877A ima tipinu RISC arhtekturu. Ova arhitektura, kao to je poznato, karakterie se manjim skupom instrukcija koje se bre izvavaju od instrukcija kod CISC arhitekture. PIC16F877A se izrauje u 40-to pinskom DIP kuitu i 44-ro pinskom QFP i PLCC kuitu. U ovom radu je korien PIC16F877A sa 40 pinova u PID kuitu a prikazan je na slici 6.

Slika 6. Raspored pinova kod mikrokontrolera PIC16F877 u kuitu DIP40

- 12 -

OSNOVNE KARAKTERISTIKE MIKROKONTROLERA -RISC mikroprocesor visokih performansi -35 instrukcija obima jedne rei -Radna frekvencija do 20 MHz -Trajanje taktnog intervala 200 ns, pri frekvenciji 20 MHz -Opkd obima 14 bita -Harverski magacin sa osam nivoa -Tri naina adresiranja (direktno,indirektno i relativno) -Programska flash memorija kapaciteta 8 k X 14-bitnih rei -Memorije za podatke tipa RAM kapaciteta 368 X 8 bita -Memorije za podatke EEPROM tipa kapaciteta 256 X 8 bita -Prekidi (do 14 izvora prekida) -U/I portovi: A, B, C, D, E -Tri tajmera: Timer0 (TMR0): 8-bitni tajmer/broja dogaaja Timer1 (TMR1): 16-bitni tajmer/broja dogaaja Timer2 (TMR2): 8-bitni tajmer/broja dogaaja -10-bitni 8-kanalni analogno-digitalni (A/D) konvertor -Serijska komunikacija: MSSP, USART -Paralelna komunikacija: PSP -Power-on Reset - reset pri ukljuenju napajanja (POR) -Power-up timer - unoenje kanjenja nakon ukljuenja napajanja (PWRT) -Oscillator Start-up Timer - unoenje kanjenja nakon stabilizovanja radne frekvencije oscilatora (OST) -Sleep mode - reim rada sa malim utrokom energije -Watchdog tajmer sa sopstvenim integrisanim RC oscilatorom za nezavisni rad -Izbor tipa oscilatora -Radni napon od 2V do 5.5V -Mala potronja energije: <0.6 mA pri naponu od 3V i radnoj frekvenciji od 4 MHz 20A pri naponu od 3V i radnom taktu od 32kHz <1A u standby reimu rada. ARHITEKTURA MIKROKONTROLERA Kao to je istaknuto, mikrokontroler PIC16F877A poseduje tipinu RISC arhitekturu, koja je prikazana na slici 7. Arhitektura poseduje odvojene magistrale za podatke i programski kd. Obim podataka je 8-bitni, dok je programski kd 14-bitni. Mogue je protono izvrenje (eng. pipelining). Sve instrukcije su istog obima (osim instrukcija grananja) i izvavaju se za etiri taktna intervala. Dakle, ukoliko se koristi oscilator od 20 MHz, ciklus instrukcije traje 200 ns. Na slici 7 prikazani su gradivni blokovi mikrokontrolera PIC16F877A: -FLASH programska memorija 8 k rei obima 14 bita -RAM (File Registers) 368 bajtova -Aritmetiko-logika jedinica (ALU) -Akumulator (Working Register) -Hardverski magacin (STACK) organizivan u 8 nivoa -EPROM memorija podataka obima 256 bajtova -Viekanalni A/D konvertor, USART (univerzalni sinhroni i asinhroni primo-predajnik), tajmere, portove itd.

- 13 -

Slika 7. Arhitektura mikrokontrolera PIC16F877A OSCILATOR Kod mikrokontrolera PIC16F877A postoje etiri konfiguracije oscilatora: -RC -XT -LP -HS Resistor/Capacitor Crystal / Resonator Low Power Crystal High Speed Crystal / Resonator. - 14 -

Najjednostavnija varijanta je RC oscilator, a to je ilustrovano na slici 8. Ovakav pristup je ispravan u aplikacijama u kojima se ne zahteva precizna procena vremenskih intervala. Ovde emo naglasiti kako je mogue koristiti i interni RC oscilator, koji je integrisan u mikrokontroleru.

Slika 8. Povezivanje eksternog RC oscilatora Frekvencija oscilovanja zavisi ne samo od vrednosti Rext i Cext, ve i od napona napajanja kao i radne temperature. Vrednost otpornika Rext treba da bude u opsegu od 3 K do 100K K. Izvan ovog opsega rad oscilatora nije stabilan i osetljiv je na spoljane uticaje. Kondenzator Cext se moe ak i izostaviti. Meutim, zbog stabilnosti preporuuje se vrednost oko 20pF. Na pinu OSC2/CLKOUT generie se taktni impuls ija je perioda etiri puta vea od periode rada oscilatora. Kod vremenski kritinih aplikacija treba ugraivati kvarcni oscilator ili keramiki rezonator. Vrednosti kondenzatora C1 i C2 (slika 9), treba da budu identine.

Slika 9. Povezivanje eksternog kvarca (LP, XT, HS)

Mikrokontroleru PIC16F877A moe da se dovede i spoljanji takt, to je prikazano na slici 10.

Slika 10. Dovoenje spoljanjeg takta - 15 -

U Tabeli 4. dat je izbor vrednosti kondenzatora za razliite vrednosti frekvencije kristalnog kvarca, dok je u Tabeli 5 predloen izbor vrednosti kondenzatora pri razliitim vrednostima frekven-cije rezonatora. Na kraju emo istai kako mikrokontroler PIC16F877A moe da radi i na frekvenciji 32 kHz, kada ima izuzetno malu potronju. Tabela 4. Izbor vrednosti kondenzatora za kvarcni kristal

Tabela 5. Izbor vrednosti kondenzatora za rezonator

- 16 -

Pojasnimo sada odnos izmeu takta i instrukcijskog ciklusa.Takt koji se dovodi na pin OSC1 oscilatora u mikrokontroleru deli se na etiri vremenski nepreklapajua taktna signala nazvana Q1, Q2, Q3 i Q4. Skup ovih signala ine jedan instrukcijski ciklus . U zavisnosti od trenutka generisanja u okviru ciklusa instrukcija, taktni signali Q1-Q4 se koriste za sledee namene: Q1 - pribavljanje instrukcije iz programske memorije Q2 - dekodiranje naredbe iz prethodnog instrukcijskog ciklusa Q3 - izvrenje naredbe iz prethodna dva instrukcijska ciklusa Q4 - prenos opkda naredbe pozvane u Q1 u instrukcijski registar. RESET Uloga Reseta je da sve registre mikrokontrolera dovede u poetno stanje. Ako se mikrokontroler blokira , ili smo ga tek ukljuili, neophodno je da se resetuje. Kako bi se spreilo sluajno dovoenje logike 0 na MCLR, potrebno je da se ovaj pin preko otpornika (npr. vrednosti 10K) povee na pin napajanja Vdd (slika11). Postoji nekoliko tipova reseta kod mikrokontrolera PIC16F877A i to su: -Power-on reset (POR) -MCLR Reset pri normalnom reimu radu -MCLR Reset prilikom SLEEP reima rada -WDT Reset pri normalnom radu -WDT Wake-up (buenje iz SLEEP reima rada) -Brown-out Reset (BOR).

- 17 -

Slika 11. Povezivanje MCLR pina na napajanje

Power-on reset (POR) impuls se generie u samom kolu kada se detektuje porast napona napajanja (oko 1.2-1.7 V). Da bi se POR iskoristio, dovoljno je da MCLR pin prikljuimo na Vdd direktno ili preko otpornika (slika 11). Ukoliko je porast napona napajanja spor, neophodno je na MCLR postaviti spoljnje kolo za reset. Prikaz kola za POR reset je dat na slici 12.

Slika 12. Spoljanje kolo za POR

Slika 13. Kolo za BROWN-OUT RESET (prva varijanta) Interno POR kolo nee generisati reset signal kad napon napajanja padne ispod minimuma. Za situacije kada je mogua pojava BROWN-OUT-a (privremeni pad napona ispod minimalne vrednosti), neophodno je da se prikljui spoljanje Brown-out reset kolo, koje je prikazano na slici 13.

- 18 -

Slika14. Kolo za BROWN-OUT RESET (druga varijanta) Power-up Timer (PWRT) generie impuls fiksne irine (nominalno 72 ms) od pojave impulsa POR-a. Za to vreme e mikrokontroler biti u reset stanju. Za ovaj vremenski period obezbeuje se da napon napajanja dostigne nominalnu vrednost. Tajmeru PWRT dozvoljava se rad setovanjem PWRTE bita koji pripada konfiguracionoj rei u fazi programiranja ipa. PWRT se taktuje internim RC oscilatorom. Oscilator Start-up Timer (OST) obezbeuje kasnjenje od 1024 taktnih intervala nakon isteka kvazistabilne periode PWRT-a (vidi Tabelu 6). Ovo obezbeuje da kristalni oscilator ili rezonator startuju stabilnom frekvencijom. OST se aktivira samo kod XT, LP i HS reima rada i to pri: POR i buenju iz SLEEP reima rada. Mikrokontroler PIC16F877A ima implementiran dvobitni statusni registar nazvan PCON (Power Control Register). Prvi bit nazvan POR setuje se kada se aktivira Power-on-Reset, a resetuje se kada se aktivira neki drugi reset. Drugi bit (BOR) kada je setovan ukazuje da je aktivno Brown-out stanje (nedozvoljena naponska stanja u napajanju mikrokontrolera), zbog kojeg takoe moe da se aktivira reset. Tabela 6. Kanjenja OST-a
Power-up Konfiguracija oscilatora XT, HS, LP RC

PWRT omoguen

PWRT onemoguen 1024 Tosc -

Buenje iz SLEEP reima rada 1024 Tosc -

72 ms + 1024 Tosc 72 ms

Stanja na kojima se postavljaju interni registri CPU-a nakon reseta zavisi od vrste reseta i reima rada u kojima se nalazi mikroprocesor (Sleep i normalni). Stanje nekih registara ostaje nedifinisano, neki zadravaju svoje stanje, a ostali se postavljaju u unapred definisana stanja (vidi Tabele 7 i 8).

- 19 -

Tabela 7. Postavljanje registara nakon reseta


Program Counter 000h 000h 000h 000h PC+1 004h STATUS register 0001 1XXX 000U UUUU 0001 0UUU 0000 1UUU UUU0 0UUU UUU1 0UUU

Power-on reset (POR) MCLR reset pri normalnom radu MCLR reset prilikom SLEEP reima rada WDT Reset pri normalnom radu WDT Wake-up (buenje iz SLEEP reima rada) Interrupt

Tabela 8. Postavljanje registara nakon reseta


MCLR reset pri: - normalnom reimu - SLEEP mod WDT reset pri normalnom reimu ---UUUU 0000 000Q UUUU ---U UUUU UUUU UUUU ---0 0000 ---1111 0000 000Q UUUU ---1 1111 ---0 ------0 0000 ---UUUU 0000 QUUU UUUU UUUU UUUU UUUU UUUU 0000 000U ---1111 0000 QUUU UUUU 1111 1111 Q000 ---0000 000U Buenje iz SLEEP reima - interrupt - WDT time out ---- ---UUUU UUUU PC+1 UUUQ QUUU UUUU UUUU ---U UUUU UUUU UUUU UUUU UUUU UUUU UUUU ---U UUUU UUUU UUUU ---- ---UUUU UUUU PC+1 UUUU UUUU UUUU UUUU ---U UUUU UUUU UUUU ---0 UUUU ---- ------U UUUU UUUU UUUU

Registar

Power-on reset

00h 01h 02h 03h 04h 05h 06h 08h 09h 0Ah 0Bh 80h 81h 82h 83h 84h 85h 86h 88h 89h 8Ah 8Bh

INDF TMR0 PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLATH INTCON INDF OPTION PCL STATUS FSR TRISA TRISB EECON1 EECON2 PCLATH INTCON

---XXXX 0000 0001 XXXX ---X XXXX XXXX XXXX ---0 0000 ---1111 0000 0001 XXXX ---1 1111 ---0 ------0 0000

---XXXX 0000 1XXX XXXX XXXX XXXX XXXX XXXX 0000 000X ---1111 0000 1XXX XXXX 1111 1111 X000 ---0000 000X

- 20 -

Legenda: X (nepoznato stanje) U (nepromenjeno stanje) Q (stanje zavisi od uslova) (ne postoji fiziki, ita se kao logika 0). WATCHDOG TAJMER Watchdog timer (WDT) se taktuje nezavisanim RC oscilatorom koji radi ak i kad je zaustavljen rad glavnog oscilatora, u sleep reimu rada. Prekoraenje intervala brojanja WDT-a, prilikom nor-malnog rada, izaziva reset mikrokontrolera. Ako je mikrokontroler bio u sleep reimu rada, pre-koraenje tajmera e probuditi mikrokontroler i program e nastaviti sa normalnim radom. Iskljui-vanje WDT-a se vri resetovanjem WDTE bita u konfiguracionoj rei. Nominalno vreme WDT-a je 18 ms bez uptrebe preskalera. Ovo vreme moe da varira od kola do kola, zbog temperature i slino. Ukoliko je potrebno due vreme moze se WDT-u pridruiti preskaler sa faktorom deljenja do 1:128, tako da se vreme moe produiti do 2.3s. Instrukcije CLRWDT i SLEEP resetuju WDT. PREKIDI Mikrokontroler PIC16F877A podrava tehniku rada sa prekidima (eng. interrupts) i moe da opslui ukupno 14 izvora prekida, to internih, to eksternih. Napomenuemo kako svaki prekid ne poseduje sopstveni vektor-broj. Onog trenutka kada se prihvati zahtev za prekid, sledi izvrenje prekidnog programa poev od adrese 0x0004. Tada se programskim putem testira stanje markera, koji se postavljaju kada se aktivira odgovarajui prekid (interrupt flags polling). Kada se ustanovi koji je od ureaja zahtevao prekid, prelazi se na izvrenje odgovarajue rutine za obradu tog prekida. Povratna adresa prekinutog programana uva se automatski u hardverskom magacinu. Povratak iz prekidnog programa se vri instrukcijom RETFIE. Upravljaki registar INTCON se koristi za maskiranje prekida. Znaenje pojedinih markera emo sada navesti: -T0IF (INTCON:2) setuje (postavlja) se na prekoraenje TMR0 -INTF (INTCON:1) setuje se u sluaju da nastupi spoljni prekid na pinu RBO/INT -RBIF (INTCON:0) setuje se kada se dogodi promena stanja na nekom od pinova RB4-RB7 -PSPIF (PIR1:7) PSP marker bit koji se koristi u operaciji itanja i upisa na PORTD, kada je on konfigurisan kao PSP -ADIF (PIR1:6) marker koji se koristi za vreme analogno-digitalne konverzije -RCIF (PIR1:5) marker koji oznaava da je prijemni bafer koji koristi USART blok, pun -TXIF (PIR1:4) marker koji pokazuje da je bafer za slanje podataka koji koristi USART prazan -SSPIF (PIR1:3) marker koji se koristi za rad sinhronog serijskog porta -CCP1IF (PIR1:2) marker koji koristi CCP1 blok -TMR2IF (PIR1:1) marker koji setuje TMR2 kada doe do prekoraenja -TMR1IF (PIR1:0) marker koji setuje TMR2 kada doe do prekoraenja -EEIF (PIR2:4) marker koji se setuje kada se zavri upis u interni EEPROM -BCLIF (PIR2:3) marker koji koristi SSP blok kada je konfigurisan da radi u I2C master reimu -CCP2IF (PIR2:0) marker koji koristi CCP2 blok. Pored bita za dozvolu rada svih prekida General Interrupt Enable (GIE) i bita za dozvolu rada prekida generisanih od strane periferija (PEIE), ovom registru pripadaju i markeri prekida (eng. interrupt flags) i bitovi koji dozvoljavaju prekid koji izaziva Tajmer0 (TMR0), spoljanji prekid na pinu RB0/INT i prekida porta B na promenu stanja. Osim ova tri osnovna prekida, postoji jo 11 periferij-skih prekida. Bitovi za njihovu dozvolu nalaze se u registrima PIE1 i PIE2, a - 21 -

odgovarajui flegovi u registrima PIR1 i PIR2.Ovi se flegovi setuju im se ispuni uslov prekida bez obzira na stanje njihovog bita dozvole, a po izvrenju servisne rutine potrebno ih je soverski resetovati. TAJMERI U arhitekturi mikrokontrolera PIC16F877A su ugraena tri tajmera (TMR0, TMR1 i TMR2) i njihov zadatak je da mere vreme i broje eksterne dogaaje. Svaki od pomenutih tajmera poseduje odreene specifinosti. TMR0 (Tajmer0) poseduje itava familija PICmicro kontrolera. To je, zapravo, obian 8-bitni broja koji generie prekid pri prelasku sa stanja 0xFF na stanje 0x00 (overflow). Izvor takta za TMR0 moe da bude bilo interni sistemski sat (frekvencije Fosc/4) ili bilo kakav spoljni generator takta spojen na pin RA4/T0CKI. Naravno, moe da se podesi da se TMR0 inkrementira na rastuu ili opadajuu ivicu spoljanjeg signala. U kombinaciji sa modulom Tajmera0 moe da se koristi za programabilni preskaler (delilac frekvencije) sa odnosima deljenja od 1:2 do 1:256. Ako deljenje nije potrebno, preskaler se dodeljuje watchdog tajmeru. Kada je preskaler u upotrebi, maksimalna frekvencija eksternog izvora iznosi 50MHz. Na slici 15 prikazan je blokdijagram TMR0/WDT preskalera.

Slika 15. Blok-dijagram TMR0/WDT preskalera TMR1 je 16-bitni tajmer i moe da radi kao broja ili moe da se koristi za merenje vremena. Blok-ema ovog tajmera data je na slici 16. TMR1 moe da ima tri izvora takta: sistemski sat (Fosc/4), spoljanji takt ili spoljanji kristal. Broja eksternih dogaaja moe se sinhronizovati sa internim oscilatorom, a postoji i asinhroni nain rada koji omoguava da se broja inkrementira i u SLEEP reimu rada. Preskaliranje je mogue sa vrednostima deljenja 1:1, 1:2, 1:4 i 1:8.

- 22 -

Slika 16. Blok-dijagram tajmera TMR1 TMR2 je 8-bitni tajmer sa programabilnim preskalerom i postskalerom. Moe da bude tajmer ili broja opte namene. Meutim, potreban je CCP modulu prilikom generisanja PWM signala i modulu za sinhronu serijsku komunikaciju (SSP) kao Baud Rate generator. Zajedno sa TMR2 koristi se registar PR2 (Period Register). Kada se vrednost brojaa izjednai sa vrednou upisanom u registar PR2, generie se odgovarajui prekid. Struktura TMR2 prikazana je na slici 17.

Slika 17. Blok-dijagram tajmera TMR2

- 23 -

PORTOVI PIC16F877A poseduje pet portova (PORTA, PORTB, PORTC, PORTD i PORTE) i oni predtavljaju vezu njegove interne strukture sa spoljanjim svetom. Svaki od njih moe da se konfigurie kao ulazni ili kao izlazni. Pomenuti portovi su razliitog obima: -8-pinski (PORTB, PORTC, PORTD) -6-pinski (PORTA) -3-pinski (PORTE). Svakom pinu bilo kojeg porta, u zavisnosti od reima rada, mogu da se dodele fiksne ili promenljive funkcije. Konfiguracija smera prenosa ostvaruje se upisom na odgovarajuu bit poziciju u pripadajuem TRIS registru (0 - pin je izlazni, 1 pin je ulazni). Svakom portu je dodeljen registar podataka (PORTX), preko kojeg se programski pristupa U/I pinovima. Upis u neki od tih registara inicirae upis u latch tog porta, a njegovo itanje rezultirae itanjem logikih stanja direktno sa pinova. Sve instrukcije upisivanja su tipa readmodify-write . To znai da se pri upisu u port najpre oitaju stanja pinova, zatim izvri modifikacija, a potom korigovana vrednost upie u latch porta. Ne postoji velika razlika u konstrukciji pomenutih pet portova. Jedino se PortB od ostalih razlikuje zbog posebne opcije koju nude etiri MSB. Ukoliko se setuje bit RBIE u registru INTCON, svaka promena stanja na ovim pinovima, generisae prekid mikrokontrolera. PortA PortA je 6-bitni (RA5-RA0) bidirekcioni port (podaci mogu da se alju u oba smera). Sadraj registra TRISA odreuje smer (ulazni ili izlazni) pinova na portu. Blok-dijagrami za pin RA4 je prikazan na slici 18, a za ostale pinove na slici 19.

Slika 18. Blok-dijagram pina RA4

- 24 -

Sada emo kroz nekoliko primera ilustrovati postavljanje smerova na portu: -TRISA = 0b000000 (PORTA je izlazni) -TRISA = 0b111111 (PORTA je ulazni) -TRISA = 0b101000 (RA5 i RA3 pinovi su ulazni, a RA4, RA2, RA1 i RA0 su izlazni) -TRISA = 0b111000 (RA5-RA3 su ulazni, a RA2-RA0 su izlazni) itd.

Slika 19. Blok-dijagram pinova RA5, RA3-RA0 PortA ima mogunost analogno-digitalne konverzije i prvenstveno se koristi u te svrhe. A/D konvertor, koji je integrisan u mikrokontroleru, je 10-bitni sa 8 ulaznih kanala, jer se u ove svrhe koriste i svi pinovi PortaE (i pinovi PortaA izuzev RA4). Pin RA4 je sa otvorenim drejnom i moe da se iskoristi za ulazni takt za tajmer TMR0.

- 25 -

Tabela 9. Funkcije PortaA i registri

U tabeli 9 dati su prikaz funkcija pojedinanih pinova PortaA i registri koji se koriste za konfigurisanje porta. Port B Port B je 8-bitni bidirekcioni port. Svakom pinu porta korespondira odgovarajui bit u registru TRISB, kojim se definie smer. Svi pinovi unutar PortB poseduju pull-up otpornike. Ovi otpornici mogu da se ukljue jednim kontrolnim bitom. To se postie postavljanjem RBPU' bita na 0. Pull-up otpornici se automatski iskljuuju kada se pin konfigurie kao izlazni. Otpornici su iskljueni i kod Power-on reseta. etiri pina na PORTB (RB7-RB4) imaju mogunost generisanja prekida. Samo pinovi koji su definisani kao ulazni mogu da prouzrokuju prekid. Kombinacija prekida na promenu stanja PortaB i pull-up otpornik mogu se iskoristiti kao jednostavan interfejs za tastaturu. Na slikama 20 i 21 prikazana je struktura PORTB.

- 26 -

Slika 20. Blok-dijagram pinova RB3-RB0

Slika 21. Blok-dijagram pinova RB7-RB4

- 27 -

U tabeli 10 dati su prikaz funkcija pojedinanih pinova PortaB i registri koji se koriste za konfigurisanje porta. Tabela 10. Funkcije PortaB i registri

Port C Port C je 8-bitni bidirekcioni port. Posebnost ovog porta se ogleda u tome to poseduje ugraen USART modul, koji slui za serijsku komunikaciju (npr. sa racunarom ili drugim mikrokontrolerom). Modulu se pristupa preko pinova RC7 i RC6. Pinove treba softverski konfigurisati da budu u funkciji USART modula. Na Slikama 22 i 23 prikazana je struktura PortaC, dok je funkcionalna tabela registara koji se koriste za konfigurisanje samog porta data u tabeli 11.

- 28 -

Slika 22. Blok-dijagram pinova RC7-RC5, RC2-RC0

Slika 23. Blok-dijagram pinova RC7-RC5, RC2-RC0 Tabela 11. Funkcije PortaC i registri

- 29 -

Portovi D i E Port D je 8-bitni bidirekcioni port. Ovaj port moe da se konfigurie kao 8-bitni paralelni mikroprocesorski port (parallel slave port-PSP) i to podeavanjem konfiguracionog bita PSPMOTE (TRISC<4>). U ovom reimu rada ulazni bafer je TTL tipa. Port E je bidirekcioni veliine 3 bita. Ima mogunost A/D konverzije.Ulazni bafer je tipa Schmitt Trigger. Pinovi mogu da se konfiguriu kao digitalni ili analogni, kao i u sluaju PortaA, o emu je ve bilo rei. ORGANIZACIJA MEMORIJE Memorije mikrokontrolera ine tri odvojene celine: -Programska memorija -Memorija podataka -EEPROM memorija podataka. Inae, u mikrokontroleru postoji i stack (magacin), koji radi na principu ciklinog bafera, to znai da se u njega mogu staviti osam razliitih adresa, dok se sa upisom devete adrese brie prva i tako redom. Programski se ne moe utvrditi da li je dolo do prepunjeja stack-a. Programska memorije PIC16F877A poseduje 13-bitni programski broja (PC) koji je u mogunosti da adresira memorijski prostor od 8K programskih rei od 14 bita. Reset vektor je 0x0000 i od njega poinje izvravanje programa. Prekidni (eng. interrupt) vektor je 0x0004. Mapa programske memorije i magacin prikazani su na slici 24. Organizacija memorije podataka

- 30 -

Memorija za podatke je podeljena u vie banki (banks), a sastoji se od registara opte namene (General Purpose Registers) i registara specijalne funkcije (Special Function Registers). U jednom od specijalnih registara, tzv. STATUS registru postoje dva bita RP1 i RP0 koji slue za izbor eljene banke podataka po principu prikazanom na slici 25. Svaka banka moe da sadri do 128 registara (0x7F). Nie lokacije u banci zauzimaju specijalni registri, a ostatak prostora popunjavaju registri opte namene implementirani kao statiki RAM. Neki specijalni registri koji se esto koriste mapirani su u sve banke da bi se omoguio brzi pristup i redukcija kda. Mapa registara mikrokontrolera PIC16F877 prikazana je na slici 26. Nekoliko specijalnih registara su registri jezgra, uskopovezani sa funkcionisanjem mikroprocesora kontrolera. Ostali registri su vezani za periferne module i slue za njihovo upravljanje i kontrolu statusa. Programski broja (PC) odreuje adresu naredne instrukcije u programskom flash-u. U pitanju je 13-bitni registar. Simboliko ime nieg bajta je PCL. To je registar u koji se moe i upisivati i iitavati. Viih pet bita programskog brojaa smeteni su u izolovani registar PCH kojem se pristupa samo preko latch-a PCLATH, mapiranom u internom RAM-u na adresi 0x0A.

Slika 24. Mapa programske memorije i stack

Slika 25. Izbor eljene banke preko bitova RP0 i RP1 - 31 -

STATUS registar je veoma bitan i zato je predvieno da se moe adresirati iz bilo koje banke. On pokazuje status aritmetiko-logike jedinice, reset status mikrokontrolera i sadrzi bite za selekciju banki internog RAM-a. Od navedenih flegova posebno treba izdvojiti Zero bit (Z), koji se postavlja kad je rezultat aritmetike operacije jednak nuli i bit prenosa/pozajmice Carry (C). Registar OPTION_REG se koristi za konfiguraciju preskalera za TMR0 ili Watchdog, za upravljanje TMR0, selekciju ivice okidanja eksternog prekida, i za omoguavanje Pull-up otpornika na PortaB. Kada je re o registrima jezgra, ne treba zaboraviti par FSR (File Select Register) i INDF (Indirect File), koji slue za indirektno adresiranje memorije podataka. Bilo koja instrukcija koja se obraa INDF registru predstavlja indirektan pristup onoj lokaciji internog RAM-a ija je adresa trenutno u registru FSR.

Slika 26. Mapa registara mikrokontrolera PIC16F877

- 32 -

Interni EEPROM za podatke Ukoliko je potrebno sauvati neke podatke i nakon ukidanja napajanja mikrokontrolera, treba ih prethodno zapisati u interni EEPROM. Ova memorija je obima 256 bajtova. A/D KONVERTOR Svi signali u prirodi su kontinualni, a veoma teko je upravljati nekim procesom bez digitalizacije analognih veliina. Kao to je napomenuto, PORTA i PORTE imaju mogunost A/D konverzije to podrazumeva da se mogu konfigurisati kao analogni ili digitalni. Da bi se iskoristio 10-bitni A/D konveror integrisan u mikrokontroleru, neophodno je podesiti registre ADCON0 i ADCON1. U tabelama 12 i 13 dati su prikazi pomenutih registara. Inae, registar ADCON0 slui za podeavanje A/D konverzije (frekvencije odabiranja konvertora, kanal koji se koristi za konverziju, poetak konverzije i ukljuivanje modula za konverziju). Registrom ADCON1 odreuje se uloga pojedinih pinova (analogni ili digitalni). Modul za A/D konverziju se bazira na sa sukcesivnoj aproksimaciji. Tabela 12. Registar za podeavanje A/D konverzije

Tabela 13. Registar za podeavanje tipa kanala (analogno-digitalni)

- 33 -

Blok-dijagram A/D konvertora mikrokontrolera PIC16F877A prikazan je na slici 24. Algoritam A/D konverzije 1. 2. 3. 4. 5. 6. 7. Konfiguracija A/D konvertora (preko ADCON0 i ADCON1) Konfigurisanje A/D prekida ukoliko se zahtevaju (ADIF, ADIE, PEIE, GIE) ekanje da proe zahtevano akviziciono vreme Poetak procesa A/D konverzije Zavretak procesa A/D konverzije itanje rezultata A/D konverzije iz registra ADRES Za sledeu konverziju, skoiti na korak 1 ili korak 2.

- 34 -

Slika 24. Blok-dijagram A/D konverrota PERIFERNE JEDINICE Mikrokontroler PIC16F877 poseduje nekoliko korisnih periferijskih modula. S obzirom da mikrokontroler treba da razmenjuje podatke sa ostalim komoponentama (registrima, memorijama, drugim mikrokontrolerima itd.) u tu svrhu je opremljen sa tri hardverska komunikaciona modula. Prvi od njih je SSP modul (Synchronous Serial Port), koji slui za komunikaciju sa serijskim EEPROM-ima, pomerakim registrima, displej-drajverima itd. Ovaj modul moe da radi u jednom od dva reima: -Serial Peripheral Interface (SPI) -Inter-Integrated Circuit (I2C). Drugi serijski komunikacioni modul je USART (Universal Synchronous Asynchronous Receiver Transmiter). On uglavnom slui za povezivanje sa personalnim raunarom, mada to nije jedina njegova mogunost primene.

- 35 -

USART moe da se konfigurie u neki od sledeih reima rada: -Asinhroni rad (full duplex) -Sinhroni master rad (half duplex) -Sinhroni slave rad (half duplex). Osim serijskih, postoji i jedan paralelni komunikacioni modul. U pitanju je modul PSP (Parallel Slave Port). Njegov zadatak je da PIC16F877 direktno povee na 8-bitnu magistralu podataka drugog mikroprocesora. Eksterni mikroprocesor tada, preko linija Read (RD) i Write (WR) moe da ita i upisuje u registar PortD kao u svaki drugi 8-bitni latch.

- 36 -

IV

PROGRAMIRANJE MIKROKONTROLERA

SOFTVER ZA MIKROKONTROLERE- C C prestavlja moan softverski alat, koji je razvila beogradska Mikroelektronika, i namenjen je pisanju kda za Microchip-ove PIC mikrokontrolere. Koristei C, programeru je omoguen jednostavan nain da kontrolie proces programiranja i napravi kvalitetan firmware. Osnovne karakteristike programa C su sledee: -Pisanje C kda korienjem kvalitetnog editora, to se ogleda automatskom kontrolom i upozorenjima vezanim za sintaksu kda, korienih parametara, kao i automatskoj korekciji pojedinih greaka -Preglednost strukture programa (kda), promenljivih i funkcija omoguava Code explorer -Jasan asemblerski kd i standardna kompatibilnost generisanih HEX datoteka toka programa preko ugraenog debagera (debugger) -Programer ima na raspolaganju veliki broj integrisanih biblioteka i rutina, koje znaajno ubrzavaju pisanje programa -Detaljan izvetaj i grafiko predstavljanje RAM i ROM mape, statistike kda i slino. Moramo da napomenemo kako C odstupa od ANSI standarda u nekoliko segmenata. Neka odstupanja su nainjena su u cilju da se olaka programiranje, dok su druge rezultat hardverskih ogranienja PIC mikrokontrolera. Pomenuemo neke specifinosti: -Rekurzivne funkcije (function recursion) su podrane sa izvesnim ogranienjima, koja su posledica neto sloenijeg pristupa magacinu (stack) i ogranienja vezana za memoriju -Pokazivai (pointers) promenljivih i pokazivai konstanti nisu kompatibilni, tj. nije mogua meusobna dodela ili uporeivanje -C tretira oznaavanje const kao true constans (kod C++), to omoguava korienje const objekta na mestima gde ANSIC oekuje constant izraz .Ukoliko se tei ka prenosivosti programa, treba koristiti tradicionalno pretprocesorsko definisanje konstanti -C dozvoljava C++ stil jednolinijskih komentara, koristei dve kose crte (//). Komentar moe da pone bilo gde i traje do sledee nove linije programskog kda -Brojne standardne C biblioteke (ctype, math, stdlib, string ) implementirane su u C, uz individualna odstupanja. Napominjemo da C podrava gotovo sve PIC mikrokontrolere serija 12, 16 i 18. Izuzetak su mikrokontroleri koji imaju staro hardversko jezgro kao na primer PIC12C508, PIC12F508, PIC12C509, PIC12F509 itd. Inae, ograniena verzija (do 2KB programa) moe da s preuzme sa sajta Mikroelektronike (www.mikroe.com). U sliaju ako se eli potpuna verzija (neogranien kapacitet programa), mora da se plati licenca od 250$. Izgled editora po po startovanju programa C je dat na sledeoj slici (slika 25).

- 37 -

Slika 25. Izgled editora po startovanju programa C ALLPIC Da bi se heksadecimalni kd dobijen iz kompilatora/kompajlera (eng. compiler) upisao u mikrokontroler, neophodno je posedovati programator. Programator ine dve celine: bootstrap loader (hardverski deo) i softver (za programiranje firmware-a). Uloga bootstrap loader-a je da transformie naponske nivoe porta (DB9, DB25 ili USB) na nivoe standardne logike, dok je uloga softvera da upie heksadecimalni kd u programsku (najee: EPROM ili flash) memoriju mikrokontrolera. Za potrebe ovog rada korieni su bootstrap loader ALLPIC i softver IC-Prog. Elektrina ema bootstrap loader-a, iji je autor Danijel Dabi, prikazana je na slici 26, a izgled ploice i gotov ureaj na slikama 27 i 28, respektivno. U ovom poglavlju neemo opisivati loader ALLPIC, s obzirom da se kompletan lanak nalazi u poglavlju PRILOZI.

Slika 26. Elektrina ema ALLPIC bootstrap loader-a - 38 -

Slika 27. Izgled tampane ploice ALLPIC-a SOFTVER IC-PROG

Slika 28. Izgled ALLPIC-a

Za programiranje mikrokontrolera PIC16F877A moe da se koristi softver IC-Prog. Inae, ovaj softver je kompatibilan sa mnogim bootstrap loader-ima, kao to su JDM Programmer, TAFE Programmer, TAIT Programmer, Conquest Programmer, ProPIC 2 Programmer itd. ICProg poseduje mogunost itanja, upisa i verifikacije (Read, Write, Verify) sadraja mikrokontrolera. Naravno, softver dozvoljava mogunost podeavanja parametara (WDT, PWRT, BODEN, LVP, CPD, CO, Debugger), kao i izbor oscilatora (RC, LP, XT, HS). Program IC-Prog se ne instalira na raunaru, ve se pokree direktno tanije, klikom na fajl ICPROG.EXE (slika 29).

Slika 29. Pokretanje softvera IC-Prog Ako programer ima raunar sa verzijom Windows-a viom od Windows-a 98, odmah po startovanju programa IC-Prog na ekranu e se pojaviti prozor sa upozorenjem, koji je prikazan na slici 30. Razlog je to su kod svih Windows-a sa platformom NT zatieni portovi. Zbog toga je neophodno da se instalira odgovarajui drajver.

Slika 30. Upozorenje prilikom pokretanja programa 39

Korak 1. Instaliranje drajvera Ulaskom u podmeni Misc, koji se nalazi u meniju Options, ostvaruje se instaliranje/ukljuivanje drajvera icprog.sys (Settings Options Misc: Enable 2000/NT/XP), to je ilustrovano na slici 31. Na taj nain omoguava se pristup serijskom portu raunara. Isto tako, neophodno je da se prioritet programiranja postavi ili na High ili na Realtime, a nikako na Normal. Ovo potonje je veoma bitno. Naime, program po startovanju automatski podesi normalan prioritet i ukoliko se ne promeni na High ili Realtime, raunar ne moe da pristupi PIC mikrokontrolerima preko serijskog porta.

Slika 31. Ukljuivanje drajvera i prioriteta

40

Slika 32. Podeavanje parametara programa Korak 2. Podeavanje hardverskih parametara Nakon to je instaliran/ukljuen drajver, program e se restartovati i ponudie opciju podeavanja hardverskih parametara, koji treba da budu postavljeni kao na slici 32. IC-Prog ima slinu konfigura-ciju kao JDM Programmer, signali su bez inverzije dok se komunikacija obavlja preko, na primer, serijskog porta COM2. Ako raunar ima samo jedan serijski port, podrazumeva se da je to COM1. Korak 3. Izbor mikrokontrolera i ulitavanje kda u bafer programa Najpre treba izabrati mikrokontroler PIC16F877A (obeleeni padajui meni u gornjem desnom uglu osnovnog prozora programa), a potom uitati heksadecimalni kd klikom na opciju Open File iz menija File - to je ilustrovano na slikama 33, 34 i 35. (Napomena: Heksadecimalni kd se dobija kompilacijom programa koji je napisan na nekom viem programskom jeziku (C, Pascal, Basic itd.) ili na asembleru. Vii programski jezici za mikrokontrolere imaju izvesne specifinosti u odnosu na standardne programske jezike, ali ovde te specifinosti nee biti razmatrane.)

41

Slika 33. Upisivanje/uitavanje kda u bafer programa

Slika 34. Upisivanje/uitavanje fajla projekat.hex koji sadri kd 42

Korak 4. Programiranje mikrokontrolera Ulaskom u meni Command i startovanjem opcije Program All (slika 35). Zapravo, proces programiranja podrazumeva da se sadraj bafera programa (slika 34) upie u flash memoriju naeg mikrokontrolera. Naravno program e postaviti pitanje, tj. mogunost da se izabere da li da otpone proces programiranja ili da se od njega odustane (slika 36). Ukoliko se izabere programiranje, program e obrisati prethodni sadraj flash memorije mikrokontrolera i u nju prepisati sadraj bafera programa, iji se jedan deo vidi na slici 35. Napredak proces programiranja, a potom i verifikacije programiranja je ilustrovan na slici 37. Ukoliko je proces uspeno okonan, na ekranu e se pojaviti prozor kao na slici 38 u suprotnom, izgled prozora e biti kao na slici 39.

Slika 35. Startovanje programiranja mikrokontrolera PIC16F877A

43

Slika 36. Mogunost da se prekine proces programiranja

Slika 37. Proces programiranja, a zatim i verifikacije

Slika 38. Poruka nakon uspenog programiranja

Slika 39. Poruka nakon neuspenog programiranja

44

SIMULACIJA PRNG-a PREKO MIKROKONTROLERA

Na Slici 40 je prikazana blok ema PRNG-a (Pseudo-sluajni generator sekvenci). Kao to se vidi, PRNG je simuliran preko PIC16F877 (ovde radi na frekvenciji 4MHz). Omoguena je serijska veza mikrokontrolera sa PC raunarom, a za konverziju naponskih nivoa (RS232C-TTL i obrnuto) koristi se interfejsno IC MAX232. Cela elektronika se napaja sa naponom 5V, koji se obezbeuje preko stabilizator napona L7805 (u kuitu TO-220). Elektrina ema je prikazano na Slici 42, dok je izgled tampane ploe dat na Slici 44.

Slika 40. Blok-ema PRNG-a realizovanog sa mikrokontrolerom PIC16F877 Definisanje stanja logikih nula i jedinica preko tropoloajnih prekidaa je prikazano na slici 41. Dakle, krajnji poloaji definiu logiku 1, a srednji logiku 0.

Slika 41.Definisanje stanja logikih nula i jedinica preko tropoloajnih prekidaa

45

DC POWER

D8

1N4007

IK1

Gnd

1 2

Vin

Vout

3
C11 220nF IK3 1 C1+ 2 V+ 3 C14 C2+ 5 C26 V7 T2out 8 R2in

LM7805 220nF

C1 220uF

C2 2.2nF

C3 220uF

C4 C10 220nF

C9

Vcc Gnd T1out R1in R1out T1in T2in R2out

16 15 14 13 12 11 10 9
C7 220nF

1 6 2 7 3 8 4 9 5
DB9/F

C8 220nF

220nF

MAX232

ON1 ResPack_2K2

ON2 ResPack_8x2K2

1 2 3 4 5 6 7 8
T1 T2

1 2 3 4 5 6 7 8
IK2

C5 22pF C6 22pF Qu1

4MHz

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

MCLR PB7 PA0 PB6 PA1 PB5 PA2 PB4 PA3 PB3 PA4 PB2 PA5 PB1 RD PB0 WR VDD CS VSS VDD PD7 VSS PD6 OSC1 PD5 OSC2 PD4 PC0 PC7 PC1 PC6 PC2 PC5 PC3 PC4 PD0 PD3 PD1 PD2
PIC16F877-04

40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

D10 LED

D11 LED

D12 LED

D13 LED

D14 LED

D15 LED

D16 LED

D17 LED ON3

1 2 3 4 5 6 7 8

ResPack_8x1K5

1 2 3 4 5 6 7 8 9 10 11
P1 D0 NP11 LED LED LED LED LED LED LED LED ON4 D1 D2 D3 D4 D5 D6 D7

1 2 3 4 5 6 7 8

0 0 0 0 0 0 0 0 0 0 0

ResPack_8x1K5

Slika 42. Elektrina ema PRNG-a realizovanog sa mikrokontrolerom Funkcije prekidaa, tastera i LED su prikazani su na Slici 43.

Slika 43. Raspored prekidaa, taster i LED

46

Slika 44. tampana ploa PRNG-a realizovanog sa mikrokontrolerom

47

PROGRAM U mikroC-u

unsigned short k, DD, X, Y void main() TRISA PORTA TRISB PORTB TRISC PORTC TRISD PORTD TRISE = = = = = = = = = {

= 0;

// Definisanje varijabli

0b111111; 0b000000; 0b00000000; 0b00000000; 0b10111111; 0b00000000; 0b00000000; 0b00000000; 0b000;

// Definisanje i inicijalizacija // pinova PORTOVA A, B, C, D, E

CMCON = 7; ADCON1 = 0x06; // Zadavanje polinoma PORTD.F0 = PORTA.F1; PORTD.F1 = PORTA.F2; PORTD.F2 = PORTA.F3; PORTD.F3 = PORTA.F4; // Pocetna stanja PORTD.F4 = PORTA.F5; DD.F0 = PORTA.F5; PORTD.F5 = PORTC.F0; DD.F1 = PORTC.F0; PORTD.F6 = PORTC.F1; DD.F2 = PORTC.F1; PORTD.F7 = PORTC.F2; DD.F3 = PORTC.F2; PORTB.F5 = PORTC.F3; PORTB.F4 = !PORTC.F3;

// Definisanje pinova A porta kao // digitalnih

do {

// Galois 2. stepen while (PORTC.F5==0 && PORTC.F4==1 && PORTC.F3 == 0) PORTB.F7 = PORTC.F5; PORTB.F6 = PORTC.F4; if (PORTA.F0==1) { k = 0; } if ((PORTA.F0==0)&& (k==0)) { delay_ms(250); k=1; PORTB.F0 = DD.F0; PORTB.F1 = DD.F1; Y.F0 = PORTB.F1; 48

X.F0 = PORTD.F0 && Y.F0; DD.F0 = Y.F0; DD.F1 = (PORTB.F0 && !X.F0)||(!PORTB.F0 && X.F0); } } // Galois 3. stepen while (PORTC.F5==1 && PORTC.F4==0 && PORTC.F3 == 0) PORTB.F7 = PORTC.F5; PORTB.F6 = PORTC.F4; if (PORTA.F0==1) { k = 0; } if ((PORTA.F0==0) && (k==0)) { delay_ms(250); k=1; PORTB.F0 = DD.F0; PORTB.F1 = DD.F1; PORTB.F2 = DD.F2; Y.F0 = PORTB.F2; X.F0 = PORTD.F0 && Y.F0; X.F1 = PORTD.F1 && Y.F1; DD.F0 = Y.F0; DD.F1 = (PORTB.F0 && !X.F0)||(!PORTB.F0 && X.F0); DD.F2 = (PORTB.F1 && !X.F1)||(!PORTB.F1 && X.F1); } } // Galois 4. stepen while (PORTC.F5==1 && PORTC.F4==1 && PORTC.F3 == 0) PORTB.F7 = PORTC.F5; PORTB.F6 = PORTC.F4; if (PORTA.F0==1) { k = 0; } if ((PORTA.F0==0) && (k==0)) { delay_ms(250); k = 1; PORTB.F0 = DD.F0; PORTB.F1 = DD.F1; PORTB.F2 = DD.F2; PORTB.F3 = DD.F3; Y.F0 = PORTB.F3; X.F0 = PORTD.F0 && Y.F0; X.F1 = PORTD.F1 && Y.F1; X.F2 = PORTD.F2 && Y.F2; DD.F0 = Y.F0; DD.F1 = (PORTB.F0 && !X.F0)||(!PORTB.F0 && X.F0); DD.F2 = (PORTB.F1 && !X.F1)||(!PORTB.F1 && X.F1); DD.F3 = (PORTB.F2 && !X.F2)||(!PORTB.F2 && X.F2); } }

// Fibonacci 2. stepen while (PORTC.F5==0 && PORTC.F4==1 && PORTC.F3 == 1) 49

PORTB.F7 = PORTC.F5; PORTB.F6 = PORTC.F4; if (PORTA.F0==1) { k = 0; } if ((PORTA.F0==0) && (k==0)) { delay_ms(250); k = 1; PORTB.F0 = DD.F0; PORTB.F1 = DD.F1; X.F0 = PORTD.F0 && PORTB.F0; X.F1 = PORTD.F1 && PORTB.F1; DD.F0 =(X.F0 && !X.F1)||(!X.F0 && DD.F1 = PORTB.F0; } } // Fibonacci 3. stepen while (PORTC.F5==1 && PORTC.F4==0 PORTB.F7 = PORTC.F5; PORTB.F6 = PORTC.F4; PORTB.F3 = 0; if (PORTA.F0==1) { k = 0; } if ((PORTA.F0==0) && (k==0)) { delay_ms(250); k = 1; PORTB.F0 = DD.F0; PORTB.F1 = DD.F1; PORTB.F2 = DD.F2; X.F0 = PORTD.F0 && PORTB.F0; X.F1 = PORTD.F1 && PORTB.F1; X.F2 = PORTD.F2 && PORTB.F2; X.F4 = (X.F0 && !X.F1)||(!X.F0 && DD.F0 =(X.F4 && !X.F2)||(!X.F4 && DD.F1 = PORTB.F0; DD.F2 = PORTB.F1; } }

X.F1);

&& PORTC.F3 == 1) {

X.F1); X.F2);

// Fibonacci 4. stepen while (PORTC.F5==1 && PORTC.F4==1 && PORTC.F3 == 1) PORTB.F7 = PORTC.F5; PORTB.F6 = PORTC.F4; if (PORTA.F0==1) { k = 0; } if ((PORTA.F0==0) && (k==0)) { delay_ms(250); k = 1; PORTB.F0 = DD.F0; PORTB.F1 = DD.F1; PORTB.F2 = DD.F2; PORTB.F3 = DD.F3; X.F0 = PORTD.F0 && PORTB.F0; 50

X.F1 = PORTD.F1 && PORTB.F1; X.F2 = PORTD.F2 && PORTB.F2; X.F3 = PORTD.F3 && PORTB.F3; X.F4 = (X.F0 && !X.F1)||(!X.F0 && X.F1); X.F5 = (X.F2 && !X.F3)||(!X.F2 && X.F3); DD.F0 =(X.F4 && !X.F5)||(!X.F4 && X.F5); DD.F1 = PORTB.F0; DD.F2 = PORTB.F1; DD.F3 = PORTB.F2; } } // "Brisanje" stanja PORTD = 0; PORTB = 0; DD = 0; X = 0; Y = 0; k=0; delay_ms(500);

} while (1); }//~

// Kraj Petlje

PROGRAM U ASEMBLERU

; ASM code generated by mikroVirtualMachine for PIC - V. 8.1.0.0 ; Date/Time: 23.8.2008 13:20:28 ; Info: http://www.mikroe.com

; ADDRESS OPCODE ASM ; ---------------------------------------------$0000 $2804 GOTO _main $06C4 $ GlobalIniFibonacci_Galoas: $06C4 $3000 MOVLW 0 $06C5 $1303 BCF STATUS, RP1 $06C6 $1283 BCF STATUS, RP0 $06C7 $00A0 MOVWF _Y+0 $06C8 $0008 RETURN $0004 $ _main: ;Fibonacci_Galoas.c,2 :: void main() { ;Fibonacci_Galoas.c,5 :: TRISA = 0b111111; // Definisanje i inicijalizacija $0004 $26C4 CALL GlobalIniFibonacci_Galoas $0005 $303F MOVLW 63 $0006 $1683 BSF STATUS, RP0 $0007 $0085 MOVWF TRISA ;Fibonacci_Galoas.c,6 :: PORTA = 0b000000; // pinova PORTOVA A, B, C, D, E $0008 $1283 BCF STATUS, RP0 $0009 $0185 CLRF PORTA, 1 ;Fibonacci_Galoas.c,7 :: TRISB = 0b00000000;

51

$000A $1683 BSF STATUS, RP0 $000B $0186 CLRF TRISB, 1 ;Fibonacci_Galoas.c,8 :: PORTB = 0b00000000; $000C $1283 BCF STATUS, RP0 $000D $0186 CLRF PORTB, 1 ;Fibonacci_Galoas.c,9 :: TRISC = 0b10111111; $000E $30BF MOVLW 191 $000F $1683 BSF STATUS, RP0 $0010 $0087 MOVWF TRISC ;Fibonacci_Galoas.c,10 :: PORTC = 0b00000000; $0011 $1283 BCF STATUS, RP0 $0012 $0187 CLRF PORTC, 1 ;Fibonacci_Galoas.c,11 :: TRISD = 0b00000000; $0013 $1683 BSF STATUS, RP0 $0014 $0188 CLRF TRISD, 1 ;Fibonacci_Galoas.c,12 :: PORTD = 0b00000000; $0015 $1283 BCF STATUS, RP0 $0016 $0188 CLRF PORTD, 1 ;Fibonacci_Galoas.c,13 :: TRISE = 0b000; $0017 $1683 BSF STATUS, RP0 $0018 $0189 CLRF TRISE, 1 ;Fibonacci_Galoas.c,15 :: CMCON = 7; $0019 $3007 MOVLW 7 $001A $009C MOVWF CMCON ;Fibonacci_Galoas.c,16 :: ADCON1 = 0x06; // Definisanje pinova A porta kao $001B $3006 MOVLW 6 $001C $009F MOVWF ADCON1 ;Fibonacci_Galoas.c,19 :: PORTD.F0 = PORTA.F1; $001D $3000 MOVLW 0 $001E $1283 BCF STATUS, RP0 $001F $1885 BTFSC PORTA, 1 $0020 $3001 MOVLW 1 $0021 $00F1 MOVWF STACK_1 $0022 $3000 MOVLW 0 $0023 $1871 BTFSC STACK_1, 0 $0024 $3001 MOVLW 1 $0025 $0608 XORWF PORTD, 0 $0026 $3901 ANDLW 1 $0027 $0688 XORWF PORTD, 1 ;Fibonacci_Galoas.c,20 :: PORTD.F1 = PORTA.F2; $0028 $3000 MOVLW 0 $0029 $1905 BTFSC PORTA, 2 $002A $3001 MOVLW 1 $002B $00F1 MOVWF STACK_1 $002C $3000 MOVLW 0 $002D $1871 BTFSC STACK_1, 0 $002E $3002 MOVLW 2 $002F $0608 XORWF PORTD, 0 $0030 $3902 ANDLW 2 $0031 $0688 XORWF PORTD, 1 ;Fibonacci_Galoas.c,21 :: PORTD.F2 = PORTA.F3; $0032 $3000 MOVLW 0 $0033 $1985 BTFSC PORTA, 3 $0034 $3001 MOVLW 1 $0035 $00F1 MOVWF STACK_1 $0036 $3000 MOVLW 0 $0037 $1871 BTFSC STACK_1, 0 $0038 $3004 MOVLW 4 $0039 $0608 XORWF PORTD, 0 $003A $3904 ANDLW 4

52

$003B $0688 ;Fibonacci_Galoas.c,22 $003C $3000 $003D $1A05 $003E $3001 $003F $00F1 $0040 $3000 $0041 $1871 $0042 $3008 $0043 $0608 $0044 $3908 $0045 $0688 ;Fibonacci_Galoas.c,25 $0046 $3000 $0047 $1A85 $0048 $3001 $0049 $00F1 $004A $3000 $004B $1871 $004C $3010 $004D $0608 $004E $3910 $004F $0688 ;Fibonacci_Galoas.c,26 $0050 $3000 $0051 $1A85 $0052 $3001 $0053 $00F1 $0054 $3000 $0055 $1871 $0056 $3001 $0057 $0621 $0058 $3901 $0059 $06A1 ;Fibonacci_Galoas.c,27 $005A $3001 $005B $0507 $005C $00F0 $005D $3000 $005E $1870 $005F $3020 $0060 $0608 $0061 $3920 $0062 $0688 ;Fibonacci_Galoas.c,28 $0063 $3001 $0064 $0507 $0065 $00F0 $0066 $3000 $0067 $1870 $0068 $3002 $0069 $0621 $006A $3902 $006B $06A1 ;Fibonacci_Galoas.c,29 $006C $3000 $006D $1887 $006E $3001 $006F $00F1 $0070 $3000 $0071 $1871

XORWF PORTD, 1 :: PORTD.F3 = PORTA.F4; MOVLW 0 BTFSC PORTA, 4 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 8 XORWF PORTD, 0 ANDLW 8 XORWF PORTD, 1 :: PORTD.F4 = PORTA.F5; MOVLW 0 BTFSC PORTA, 5 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 16 XORWF PORTD, 0 ANDLW 16 XORWF PORTD, 1 :: DD.F0 = PORTA.F5; MOVLW 0 BTFSC PORTA, 5 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 1 XORWF _DD, 0 ANDLW 1 XORWF _DD, 1 :: PORTD.F5 = PORTC.F0; MOVLW 1 ANDWF PORTC, 0 MOVWF STACK_0 MOVLW 0 BTFSC STACK_0, 0 MOVLW 32 XORWF PORTD, 0 ANDLW 32 XORWF PORTD, 1 :: DD.F1 = PORTC.F0; MOVLW 1 ANDWF PORTC, 0 MOVWF STACK_0 MOVLW 0 BTFSC STACK_0, 0 MOVLW 2 XORWF _DD, 0 ANDLW 2 XORWF _DD, 1 :: PORTD.F6 = PORTC.F1; MOVLW 0 BTFSC PORTC, 1 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0

53

$0072 $3040 $0073 $0608 $0074 $3940 $0075 $0688 ;Fibonacci_Galoas.c,30 $0076 $3000 $0077 $1887 $0078 $3001 $0079 $00F1 $007A $3000 $007B $1871 $007C $3004 $007D $0621 $007E $3904 $007F $06A1 ;Fibonacci_Galoas.c,31 $0080 $3000 $0081 $1907 $0082 $3001 $0083 $00F1 $0084 $3000 $0085 $1871 $0086 $3080 $0087 $0608 $0088 $3980 $0089 $0688 ;Fibonacci_Galoas.c,32 $008A $3000 $008B $1907 $008C $3001 $008D $00F1 $008E $3000 $008F $1871 $0090 $3008 $0091 $0621 $0092 $3908 $0093 $06A1 ;Fibonacci_Galoas.c,34 $0094 $3000 $0095 $1987 $0096 $3001 $0097 $00F1 $0098 $3000 $0099 $1871 $009A $3020 $009B $0606 $009C $3920 $009D $0686 ;Fibonacci_Galoas.c,35 $009E $3001 $009F $1987 $00A0 $3000 $00A1 $00F0 $00A2 $3000 $00A3 $1870 $00A4 $3010 $00A5 $0606 $00A6 $3910 $00A7 $0686 ;Fibonacci_Galoas.c,38 $00A8 $ L_main_0:

MOVLW 64 XORWF PORTD, 0 ANDLW 64 XORWF PORTD, 1 :: DD.F2 = PORTC.F1; MOVLW 0 BTFSC PORTC, 1 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 4 XORWF _DD, 0 ANDLW 4 XORWF _DD, 1 :: PORTD.F7 = PORTC.F2; MOVLW 0 BTFSC PORTC, 2 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 128 XORWF PORTD, 0 ANDLW 128 XORWF PORTD, 1 :: DD.F3 = PORTC.F2; MOVLW 0 BTFSC PORTC, 2 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 8 XORWF _DD, 0 ANDLW 8 XORWF _DD, 1 :: PORTB.F5 = PORTC.F3; MOVLW 0 BTFSC PORTC, 3 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 32 XORWF PORTB, 0 ANDLW 32 XORWF PORTB, 1 :: PORTB.F4 = !PORTC.F3; MOVLW 1 BTFSC PORTC, 3 MOVLW 0 MOVWF STACK_0 MOVLW 0 BTFSC STACK_0, 0 MOVLW 16 XORWF PORTB, 0 ANDLW 16 XORWF PORTB, 1 :: do {

54

;Fibonacci_Galoas.c,42 :: while (PORTC.F5==0 && PORTC.F4==1 && PORTC.F3 == 0) { $00A8 $ L_main_2: $00A8 $3000 MOVLW 0 $00A9 $1A87 BTFSC PORTC, 5 $00AA $3001 MOVLW 1 $00AB $00F1 MOVWF STACK_1 $00AC $0871 MOVF STACK_1, 0 $00AD $3A00 XORLW 0 $00AE $1D03 BTFSS STATUS, Z $00AF $295B GOTO L_main_3 $00B0 $3000 MOVLW 0 $00B1 $1A07 BTFSC PORTC, 4 $00B2 $3001 MOVLW 1 $00B3 $00F1 MOVWF STACK_1 $00B4 $0871 MOVF STACK_1, 0 $00B5 $3A01 XORLW 1 $00B6 $1D03 BTFSS STATUS, Z $00B7 $295B GOTO L_main_3 $00B8 $3000 MOVLW 0 $00B9 $1987 BTFSC PORTC, 3 $00BA $3001 MOVLW 1 $00BB $00F1 MOVWF STACK_1 $00BC $0871 MOVF STACK_1, 0 $00BD $3A00 XORLW 0 $00BE $1D03 BTFSS STATUS, Z $00BF $295B GOTO L_main_3 $00C0 $ L100_ex_L_main_3: ;Fibonacci_Galoas.c,43 :: PORTB.F7 = PORTC.F5; $00C0 $3000 MOVLW 0 $00C1 $1A87 BTFSC PORTC, 5 $00C2 $3001 MOVLW 1 $00C3 $00F1 MOVWF STACK_1 $00C4 $3000 MOVLW 0 $00C5 $1871 BTFSC STACK_1, 0 $00C6 $3080 MOVLW 128 $00C7 $0606 XORWF PORTB, 0 $00C8 $3980 ANDLW 128 $00C9 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,44 :: PORTB.F6 = PORTC.F4; $00CA $3000 MOVLW 0 $00CB $1A07 BTFSC PORTC, 4 $00CC $3001 MOVLW 1 $00CD $00F1 MOVWF STACK_1 $00CE $3000 MOVLW 0 $00CF $1871 BTFSC STACK_1, 0 $00D0 $3040 MOVLW 64 $00D1 $0606 XORWF PORTB, 0 $00D2 $3940 ANDLW 64 $00D3 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,45 :: if (PORTA.F0==1) { $00D4 $3001 MOVLW 1 $00D5 $0505 ANDWF PORTA, 0 $00D6 $00F1 MOVWF STACK_1 $00D7 $0871 MOVF STACK_1, 0 $00D8 $3A01 XORLW 1 $00D9 $1D03 BTFSS STATUS, Z $00DA $28DC GOTO L_main_6 ;Fibonacci_Galoas.c,46 :: k = 0; $00DB $01A2 CLRF _k, 1 ;Fibonacci_Galoas.c,47 :: }

55

$00DC $ L_main_6: ;Fibonacci_Galoas.c,48 :: if ((PORTA.F0==0) && (k==0)) { $00DC $3001 MOVLW 1 $00DD $0505 ANDWF PORTA, 0 $00DE $00F1 MOVWF STACK_1 $00DF $0871 MOVF STACK_1, 0 $00E0 $3A00 XORLW 0 $00E1 $1D03 BTFSS STATUS, Z $00E2 $295A GOTO L_main_9 $00E3 $0822 MOVF _k, 0 $00E4 $3A00 XORLW 0 $00E5 $1D03 BTFSS STATUS, Z $00E6 $295A GOTO L_main_9 $00E7 $ L129_ex_L_main_9: ;Fibonacci_Galoas.c,49 :: delay_ms(250); $00E7 $3002 MOVLW 2 $00E8 $00FC MOVWF STACK_12 $00E9 $30FF MOVLW 255 $00EA $00FB MOVWF STACK_11 $00EB $30FF MOVLW 255 $00EC $00FA MOVWF STACK_10 $00ED $0BFC DECFSZ STACK_12, F $00EE $28F0 GOTO $+2 $00EF $28F7 GOTO $+8 $00F0 $0BFB DECFSZ STACK_11, F $00F1 $28F3 GOTO $+2 $00F2 $28F6 GOTO $+4 $00F3 $0BFA DECFSZ STACK_10, F $00F4 $28F3 GOTO $-1 $00F5 $28F0 GOTO $-5 $00F6 $28ED GOTO $-9 $00F7 $3046 MOVLW 70 $00F8 $00FB MOVWF STACK_11 $00F9 $30FF MOVLW 255 $00FA $00FA MOVWF STACK_10 $00FB $0BFB DECFSZ STACK_11, F $00FC $28FE GOTO $+2 $00FD $2901 GOTO $+4 $00FE $0BFA DECFSZ STACK_10, F $00FF $28FE GOTO $-1 $0100 $28FB GOTO $-5 $0101 $30CF MOVLW 207 $0102 $00FA MOVWF STACK_10 $0103 $0BFA DECFSZ STACK_10, F $0104 $2903 GOTO $-1 $0105 $0000 NOP ;Fibonacci_Galoas.c,50 :: k = 1; $0106 $3001 MOVLW 1 $0107 $00A2 MOVWF _k ;Fibonacci_Galoas.c,51 :: PORTB.F0 = DD.F0; $0108 $3001 MOVLW 1 $0109 $0521 ANDWF _DD, 0 $010A $00F0 MOVWF STACK_0 $010B $3000 MOVLW 0 $010C $1870 BTFSC STACK_0, 0 $010D $3001 MOVLW 1 $010E $0606 XORWF PORTB, 0 $010F $3901 ANDLW 1 $0110 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,52 :: PORTB.F1 = DD.F1; $0111 $3000 MOVLW 0

56

$0112 $18A1 BTFSC _DD, 1 $0113 $3001 MOVLW 1 $0114 $00F1 MOVWF STACK_1 $0115 $3000 MOVLW 0 $0116 $1871 BTFSC STACK_1, 0 $0117 $3002 MOVLW 2 $0118 $0606 XORWF PORTB, 0 $0119 $3902 ANDLW 2 $011A $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,53 :: Y.F0 = PORTB.F1; $011B $3000 MOVLW 0 $011C $1886 BTFSC PORTB, 1 $011D $3001 MOVLW 1 $011E $00F1 MOVWF STACK_1 $011F $3000 MOVLW 0 $0120 $1871 BTFSC STACK_1, 0 $0121 $3001 MOVLW 1 $0122 $0620 XORWF _Y, 0 $0123 $3901 ANDLW 1 $0124 $06A0 XORWF _Y, 1 ;Fibonacci_Galoas.c,54 :: X.F0 = PORTD.F0 && Y.F0; $0125 $3001 MOVLW 1 $0126 $0508 ANDWF PORTD, 0 $0127 $00F0 MOVWF STACK_0 $0128 $1903 BTFSC STATUS, Z $0129 $2932 GOTO L_main_11 $012A $3001 MOVLW 1 $012B $0520 ANDWF _Y, 0 $012C $00F0 MOVWF STACK_0 $012D $1903 BTFSC STATUS, Z $012E $2932 GOTO L_main_11 $012F $3001 MOVLW 1 $0130 $00F0 MOVWF STACK_0 $0131 $2933 GOTO L_main_10 $0132 $ L_main_11: $0132 $01F0 CLRF STACK_0, 1 $0133 $ L_main_10: $0133 $3000 MOVLW 0 $0134 $1870 BTFSC STACK_0, 0 $0135 $3001 MOVLW 1 $0136 $0623 XORWF _X, 0 $0137 $3901 ANDLW 1 $0138 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,55 :: DD.F0 = Y.F0; $0139 $3001 MOVLW 1 $013A $0520 ANDWF _Y, 0 $013B $00F0 MOVWF STACK_0 $013C $3000 MOVLW 0 $013D $1870 BTFSC STACK_0, 0 $013E $3001 MOVLW 1 $013F $0621 XORWF _DD, 0 $0140 $3901 ANDLW 1 $0141 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,56 :: DD.F1 = (PORTB.F0 && !X.F0)||(!PORTB.F0 && X.F0); $0142 $3001 MOVLW 1 $0143 $0506 ANDWF PORTB, 0 $0144 $00F0 MOVWF STACK_0 $0145 $1903 BTFSC STATUS, Z $0146 $2949 GOTO L202_ex_L_main_17 $0147 $1C23 BTFSS _X, 0

57

$0148 $2952 GOTO L_main_17 $0149 $ L202_ex_L_main_17: $0149 $1806 BTFSC PORTB, 0 $014A $2950 GOTO L214_ex_L_main_17 $014B $3001 MOVLW 1 $014C $0523 ANDWF _X, 0 $014D $00F0 MOVWF STACK_0 $014E $1D03 BTFSS STATUS, Z $014F $2952 GOTO L_main_17 $0150 $ L214_ex_L_main_17: $0150 $01F0 CLRF STACK_0, 1 $0151 $2954 GOTO L_main_16 $0152 $ L_main_17: $0152 $3001 MOVLW 1 $0153 $00F0 MOVWF STACK_0 $0154 $ L_main_16: $0154 $3000 MOVLW 0 $0155 $1870 BTFSC STACK_0, 0 $0156 $3002 MOVLW 2 $0157 $0621 XORWF _DD, 0 $0158 $3902 ANDLW 2 $0159 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,57 :: } $015A $ L_main_9: ;Fibonacci_Galoas.c,58 :: } $015A $28A8 GOTO L_main_2 $015B $ L_main_3: ;Fibonacci_Galoas.c,61 :: while (PORTC.F5==1 && PORTC.F4==0 && PORTC.F3 == 0) { $015B $ L_main_18: $015B $3000 MOVLW 0 $015C $1A87 BTFSC PORTC, 5 $015D $3001 MOVLW 1 $015E $00F1 MOVWF STACK_1 $015F $0871 MOVF STACK_1, 0 $0160 $3A01 XORLW 1 $0161 $1D03 BTFSS STATUS, Z $0162 $2A4C GOTO L_main_19 $0163 $3000 MOVLW 0 $0164 $1A07 BTFSC PORTC, 4 $0165 $3001 MOVLW 1 $0166 $00F1 MOVWF STACK_1 $0167 $0871 MOVF STACK_1, 0 $0168 $3A00 XORLW 0 $0169 $1D03 BTFSS STATUS, Z $016A $2A4C GOTO L_main_19 $016B $3000 MOVLW 0 $016C $1987 BTFSC PORTC, 3 $016D $3001 MOVLW 1 $016E $00F1 MOVWF STACK_1 $016F $0871 MOVF STACK_1, 0 $0170 $3A00 XORLW 0 $0171 $1D03 BTFSS STATUS, Z $0172 $2A4C GOTO L_main_19 $0173 $ L250_ex_L_main_19: ;Fibonacci_Galoas.c,62 :: PORTB.F7 = PORTC.F5; $0173 $3000 MOVLW 0 $0174 $1A87 BTFSC PORTC, 5 $0175 $3001 MOVLW 1 $0176 $00F1 MOVWF STACK_1 $0177 $3000 MOVLW 0

58

$0178 $1871 BTFSC STACK_1, 0 $0179 $3080 MOVLW 128 $017A $0606 XORWF PORTB, 0 $017B $3980 ANDLW 128 $017C $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,63 :: PORTB.F6 = PORTC.F4; $017D $3000 MOVLW 0 $017E $1A07 BTFSC PORTC, 4 $017F $3001 MOVLW 1 $0180 $00F1 MOVWF STACK_1 $0181 $3000 MOVLW 0 $0182 $1871 BTFSC STACK_1, 0 $0183 $3040 MOVLW 64 $0184 $0606 XORWF PORTB, 0 $0185 $3940 ANDLW 64 $0186 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,64 :: if (PORTA.F0==1) { $0187 $3001 MOVLW 1 $0188 $0505 ANDWF PORTA, 0 $0189 $00F1 MOVWF STACK_1 $018A $0871 MOVF STACK_1, 0 $018B $3A01 XORLW 1 $018C $1D03 BTFSS STATUS, Z $018D $298F GOTO L_main_22 ;Fibonacci_Galoas.c,65 :: k = 0; $018E $01A2 CLRF _k, 1 ;Fibonacci_Galoas.c,66 :: } $018F $ L_main_22: ;Fibonacci_Galoas.c,67 :: if ((PORTA.F0==0) && (k==0)) { $018F $3001 MOVLW 1 $0190 $0505 ANDWF PORTA, 0 $0191 $00F1 MOVWF STACK_1 $0192 $0871 MOVF STACK_1, 0 $0193 $3A00 XORLW 0 $0194 $1D03 BTFSS STATUS, Z $0195 $2A4B GOTO L_main_25 $0196 $0822 MOVF _k, 0 $0197 $3A00 XORLW 0 $0198 $1D03 BTFSS STATUS, Z $0199 $2A4B GOTO L_main_25 $019A $ L279_ex_L_main_25: ;Fibonacci_Galoas.c,68 :: delay_ms(250); $019A $3002 MOVLW 2 $019B $00FC MOVWF STACK_12 $019C $30FF MOVLW 255 $019D $00FB MOVWF STACK_11 $019E $30FF MOVLW 255 $019F $00FA MOVWF STACK_10 $01A0 $0BFC DECFSZ STACK_12, F $01A1 $29A3 GOTO $+2 $01A2 $29AA GOTO $+8 $01A3 $0BFB DECFSZ STACK_11, F $01A4 $29A6 GOTO $+2 $01A5 $29A9 GOTO $+4 $01A6 $0BFA DECFSZ STACK_10, F $01A7 $29A6 GOTO $-1 $01A8 $29A3 GOTO $-5 $01A9 $29A0 GOTO $-9 $01AA $3046 MOVLW 70 $01AB $00FB MOVWF STACK_11 $01AC $30FF MOVLW 255

59

$01AD $00FA $01AE $0BFB $01AF $29B1 $01B0 $29B4 $01B1 $0BFA $01B2 $29B1 $01B3 $29AE $01B4 $30CF $01B5 $00FA $01B6 $0BFA $01B7 $29B6 $01B8 $0000 ;Fibonacci_Galoas.c,69 $01B9 $3001 $01BA $00A2 ;Fibonacci_Galoas.c,70 $01BB $3001 $01BC $0521 $01BD $00F0 $01BE $3000 $01BF $1870 $01C0 $3001 $01C1 $0606 $01C2 $3901 $01C3 $0686 ;Fibonacci_Galoas.c,71 $01C4 $3000 $01C5 $18A1 $01C6 $3001 $01C7 $00F1 $01C8 $3000 $01C9 $1871 $01CA $3002 $01CB $0606 $01CC $3902 $01CD $0686 ;Fibonacci_Galoas.c,72 $01CE $3000 $01CF $1921 $01D0 $3001 $01D1 $00F1 $01D2 $3000 $01D3 $1871 $01D4 $3004 $01D5 $0606 $01D6 $3904 $01D7 $0686 ;Fibonacci_Galoas.c,73 $01D8 $3000 $01D9 $1906 $01DA $3001 $01DB $00F1 $01DC $3000 $01DD $1871 $01DE $3001 $01DF $0620 $01E0 $3901 $01E1 $06A0 ;Fibonacci_Galoas.c,74 $01E2 $3001 $01E3 $0508

MOVWF STACK_10 DECFSZ STACK_11, F GOTO $+2 GOTO $+4 DECFSZ STACK_10, F GOTO $-1 GOTO $-5 MOVLW 207 MOVWF STACK_10 DECFSZ STACK_10, F GOTO $-1 NOP :: k = 1; MOVLW 1 MOVWF _k :: PORTB.F0 = DD.F0; MOVLW 1 ANDWF _DD, 0 MOVWF STACK_0 MOVLW 0 BTFSC STACK_0, 0 MOVLW 1 XORWF PORTB, 0 ANDLW 1 XORWF PORTB, 1 :: PORTB.F1 = DD.F1; MOVLW 0 BTFSC _DD, 1 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 2 XORWF PORTB, 0 ANDLW 2 XORWF PORTB, 1 :: PORTB.F2 = DD.F2; MOVLW 0 BTFSC _DD, 2 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 4 XORWF PORTB, 0 ANDLW 4 XORWF PORTB, 1 :: Y.F0 = PORTB.F2; MOVLW 0 BTFSC PORTB, 2 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 1 XORWF _Y, 0 ANDLW 1 XORWF _Y, 1 :: X.F0 = PORTD.F0 && Y.F0; MOVLW 1 ANDWF PORTD, 0

60

$01E4 $00F0 MOVWF STACK_0 $01E5 $1903 BTFSC STATUS, Z $01E6 $29EF GOTO L_main_27 $01E7 $3001 MOVLW 1 $01E8 $0520 ANDWF _Y, 0 $01E9 $00F0 MOVWF STACK_0 $01EA $1903 BTFSC STATUS, Z $01EB $29EF GOTO L_main_27 $01EC $3001 MOVLW 1 $01ED $00F0 MOVWF STACK_0 $01EE $29F0 GOTO L_main_26 $01EF $ L_main_27: $01EF $01F0 CLRF STACK_0, 1 $01F0 $ L_main_26: $01F0 $3000 MOVLW 0 $01F1 $1870 BTFSC STACK_0, 0 $01F2 $3001 MOVLW 1 $01F3 $0623 XORWF _X, 0 $01F4 $3901 ANDLW 1 $01F5 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,75 :: X.F1 = PORTD.F1 && Y.F1; $01F6 $3000 MOVLW 0 $01F7 $1888 BTFSC PORTD, 1 $01F8 $3001 MOVLW 1 $01F9 $00F1 MOVWF STACK_1 $01FA $0871 MOVF STACK_1, 0 $01FB $1903 BTFSC STATUS, Z $01FC $2A07 GOTO L_main_29 $01FD $3000 MOVLW 0 $01FE $18A0 BTFSC _Y, 1 $01FF $3001 MOVLW 1 $0200 $00F1 MOVWF STACK_1 $0201 $0871 MOVF STACK_1, 0 $0202 $1903 BTFSC STATUS, Z $0203 $2A07 GOTO L_main_29 $0204 $3001 MOVLW 1 $0205 $00F0 MOVWF STACK_0 $0206 $2A08 GOTO L_main_28 $0207 $ L_main_29: $0207 $01F0 CLRF STACK_0, 1 $0208 $ L_main_28: $0208 $3000 MOVLW 0 $0209 $1870 BTFSC STACK_0, 0 $020A $3002 MOVLW 2 $020B $0623 XORWF _X, 0 $020C $3902 ANDLW 2 $020D $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,76 :: DD.F0 = Y.F0; $020E $3001 MOVLW 1 $020F $0520 ANDWF _Y, 0 $0210 $00F0 MOVWF STACK_0 $0211 $3000 MOVLW 0 $0212 $1870 BTFSC STACK_0, 0 $0213 $3001 MOVLW 1 $0214 $0621 XORWF _DD, 0 $0215 $3901 ANDLW 1 $0216 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,77 :: DD.F1 = (PORTB.F0 && !X.F0)||(!PORTB.F0 && X.F0); $0217 $3001 MOVLW 1 $0218 $0506 ANDWF PORTB, 0

61

$0219 $00F0 MOVWF STACK_0 $021A $1903 BTFSC STATUS, Z $021B $2A1E GOTO L374_ex_L_main_35 $021C $1C23 BTFSS _X, 0 $021D $2A27 GOTO L_main_35 $021E $ L374_ex_L_main_35: $021E $1806 BTFSC PORTB, 0 $021F $2A25 GOTO L386_ex_L_main_35 $0220 $3001 MOVLW 1 $0221 $0523 ANDWF _X, 0 $0222 $00F0 MOVWF STACK_0 $0223 $1D03 BTFSS STATUS, Z $0224 $2A27 GOTO L_main_35 $0225 $ L386_ex_L_main_35: $0225 $01F0 CLRF STACK_0, 1 $0226 $2A29 GOTO L_main_34 $0227 $ L_main_35: $0227 $3001 MOVLW 1 $0228 $00F0 MOVWF STACK_0 $0229 $ L_main_34: $0229 $3000 MOVLW 0 $022A $1870 BTFSC STACK_0, 0 $022B $3002 MOVLW 2 $022C $0621 XORWF _DD, 0 $022D $3902 ANDLW 2 $022E $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,78 :: DD.F2 = (PORTB.F1 && !X.F1)||(!PORTB.F1 && X.F1); $022F $3000 MOVLW 0 $0230 $1886 BTFSC PORTB, 1 $0231 $3001 MOVLW 1 $0232 $00F1 MOVWF STACK_1 $0233 $0871 MOVF STACK_1, 0 $0234 $1903 BTFSC STATUS, Z $0235 $2A38 GOTO L407_ex_L_main_41 $0236 $1CA3 BTFSS _X, 1 $0237 $2A43 GOTO L_main_41 $0238 $ L407_ex_L_main_41: $0238 $1886 BTFSC PORTB, 1 $0239 $2A41 GOTO L421_ex_L_main_41 $023A $3000 MOVLW 0 $023B $18A3 BTFSC _X, 1 $023C $3001 MOVLW 1 $023D $00F1 MOVWF STACK_1 $023E $0871 MOVF STACK_1, 0 $023F $1D03 BTFSS STATUS, Z $0240 $2A43 GOTO L_main_41 $0241 $ L421_ex_L_main_41: $0241 $01F0 CLRF STACK_0, 1 $0242 $2A45 GOTO L_main_40 $0243 $ L_main_41: $0243 $3001 MOVLW 1 $0244 $00F0 MOVWF STACK_0 $0245 $ L_main_40: $0245 $3000 MOVLW 0 $0246 $1870 BTFSC STACK_0, 0 $0247 $3004 MOVLW 4 $0248 $0621 XORWF _DD, 0 $0249 $3904 ANDLW 4 $024A $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,79 :: }

62

$024B $ L_main_25: ;Fibonacci_Galoas.c,80 :: } $024B $295B GOTO L_main_18 $024C $ L_main_19: ;Fibonacci_Galoas.c,83 :: while (PORTC.F5==1 && PORTC.F4==1 && PORTC.F3 == 0) { $024C $ L_main_42: $024C $3000 MOVLW 0 $024D $1A87 BTFSC PORTC, 5 $024E $3001 MOVLW 1 $024F $00F1 MOVWF STACK_1 $0250 $0871 MOVF STACK_1, 0 $0251 $3A01 XORLW 1 $0252 $1D03 BTFSS STATUS, Z $0253 $2B7B GOTO L_main_43 $0254 $3000 MOVLW 0 $0255 $1A07 BTFSC PORTC, 4 $0256 $3001 MOVLW 1 $0257 $00F1 MOVWF STACK_1 $0258 $0871 MOVF STACK_1, 0 $0259 $3A01 XORLW 1 $025A $1D03 BTFSS STATUS, Z $025B $2B7B GOTO L_main_43 $025C $3000 MOVLW 0 $025D $1987 BTFSC PORTC, 3 $025E $3001 MOVLW 1 $025F $00F1 MOVWF STACK_1 $0260 $0871 MOVF STACK_1, 0 $0261 $3A00 XORLW 0 $0262 $1D03 BTFSS STATUS, Z $0263 $2B7B GOTO L_main_43 $0264 $ L457_ex_L_main_43: ;Fibonacci_Galoas.c,84 :: PORTB.F7 = PORTC.F5; $0264 $3000 MOVLW 0 $0265 $1A87 BTFSC PORTC, 5 $0266 $3001 MOVLW 1 $0267 $00F1 MOVWF STACK_1 $0268 $3000 MOVLW 0 $0269 $1871 BTFSC STACK_1, 0 $026A $3080 MOVLW 128 $026B $0606 XORWF PORTB, 0 $026C $3980 ANDLW 128 $026D $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,85 :: PORTB.F6 = PORTC.F4; $026E $3000 MOVLW 0 $026F $1A07 BTFSC PORTC, 4 $0270 $3001 MOVLW 1 $0271 $00F1 MOVWF STACK_1 $0272 $3000 MOVLW 0 $0273 $1871 BTFSC STACK_1, 0 $0274 $3040 MOVLW 64 $0275 $0606 XORWF PORTB, 0 $0276 $3940 ANDLW 64 $0277 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,86 :: if (PORTA.F0==1) { $0278 $3001 MOVLW 1 $0279 $0505 ANDWF PORTA, 0 $027A $00F1 MOVWF STACK_1 $027B $0871 MOVF STACK_1, 0 $027C $3A01 XORLW 1 $027D $1D03 BTFSS STATUS, Z

63

$027E $2A80 GOTO L_main_46 ;Fibonacci_Galoas.c,87 :: k = 0; $027F $01A2 CLRF _k, 1 ;Fibonacci_Galoas.c,88 :: } $0280 $ L_main_46: ;Fibonacci_Galoas.c,89 :: if ((PORTA.F0==0) && (k==0)) { $0280 $3001 MOVLW 1 $0281 $0505 ANDWF PORTA, 0 $0282 $00F1 MOVWF STACK_1 $0283 $0871 MOVF STACK_1, 0 $0284 $3A00 XORLW 0 $0285 $1D03 BTFSS STATUS, Z $0286 $2B7A GOTO L_main_49 $0287 $0822 MOVF _k, 0 $0288 $3A00 XORLW 0 $0289 $1D03 BTFSS STATUS, Z $028A $2B7A GOTO L_main_49 $028B $ L486_ex_L_main_49: ;Fibonacci_Galoas.c,90 :: delay_ms(250); $028B $3002 MOVLW 2 $028C $00FC MOVWF STACK_12 $028D $30FF MOVLW 255 $028E $00FB MOVWF STACK_11 $028F $30FF MOVLW 255 $0290 $00FA MOVWF STACK_10 $0291 $0BFC DECFSZ STACK_12, F $0292 $2A94 GOTO $+2 $0293 $2A9B GOTO $+8 $0294 $0BFB DECFSZ STACK_11, F $0295 $2A97 GOTO $+2 $0296 $2A9A GOTO $+4 $0297 $0BFA DECFSZ STACK_10, F $0298 $2A97 GOTO $-1 $0299 $2A94 GOTO $-5 $029A $2A91 GOTO $-9 $029B $3046 MOVLW 70 $029C $00FB MOVWF STACK_11 $029D $30FF MOVLW 255 $029E $00FA MOVWF STACK_10 $029F $0BFB DECFSZ STACK_11, F $02A0 $2AA2 GOTO $+2 $02A1 $2AA5 GOTO $+4 $02A2 $0BFA DECFSZ STACK_10, F $02A3 $2AA2 GOTO $-1 $02A4 $2A9F GOTO $-5 $02A5 $30CF MOVLW 207 $02A6 $00FA MOVWF STACK_10 $02A7 $0BFA DECFSZ STACK_10, F $02A8 $2AA7 GOTO $-1 $02A9 $0000 NOP ;Fibonacci_Galoas.c,91 :: k = 1; $02AA $3001 MOVLW 1 $02AB $00A2 MOVWF _k ;Fibonacci_Galoas.c,92 :: PORTB.F0 = DD.F0; $02AC $3001 MOVLW 1 $02AD $0521 ANDWF _DD, 0 $02AE $00F0 MOVWF STACK_0 $02AF $3000 MOVLW 0 $02B0 $1870 BTFSC STACK_0, 0 $02B1 $3001 MOVLW 1 $02B2 $0606 XORWF PORTB, 0

64

$02B3 $3901 $02B4 $0686 ;Fibonacci_Galoas.c,93 $02B5 $3000 $02B6 $18A1 $02B7 $3001 $02B8 $00F1 $02B9 $3000 $02BA $1871 $02BB $3002 $02BC $0606 $02BD $3902 $02BE $0686 ;Fibonacci_Galoas.c,94 $02BF $3000 $02C0 $1921 $02C1 $3001 $02C2 $00F1 $02C3 $3000 $02C4 $1871 $02C5 $3004 $02C6 $0606 $02C7 $3904 $02C8 $0686 ;Fibonacci_Galoas.c,95 $02C9 $3000 $02CA $19A1 $02CB $3001 $02CC $00F1 $02CD $3000 $02CE $1871 $02CF $3008 $02D0 $0606 $02D1 $3908 $02D2 $0686 ;Fibonacci_Galoas.c,96 $02D3 $3000 $02D4 $1986 $02D5 $3001 $02D6 $00F1 $02D7 $3000 $02D8 $1871 $02D9 $3001 $02DA $0620 $02DB $3901 $02DC $06A0 ;Fibonacci_Galoas.c,97 $02DD $3001 $02DE $0508 $02DF $00F0 $02E0 $1903 $02E1 $2AEA $02E2 $3001 $02E3 $0520 $02E4 $00F0 $02E5 $1903 $02E6 $2AEA $02E7 $3001 $02E8 $00F0 $02E9 $2AEB $02EA $ L_main_51:

ANDLW 1 XORWF PORTB, 1 :: PORTB.F1 = DD.F1; MOVLW 0 BTFSC _DD, 1 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 2 XORWF PORTB, 0 ANDLW 2 XORWF PORTB, 1 :: PORTB.F2 = DD.F2; MOVLW 0 BTFSC _DD, 2 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 4 XORWF PORTB, 0 ANDLW 4 XORWF PORTB, 1 :: PORTB.F3 = DD.F3; MOVLW 0 BTFSC _DD, 3 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 8 XORWF PORTB, 0 ANDLW 8 XORWF PORTB, 1 :: Y.F0 = PORTB.F3; MOVLW 0 BTFSC PORTB, 3 MOVLW 1 MOVWF STACK_1 MOVLW 0 BTFSC STACK_1, 0 MOVLW 1 XORWF _Y, 0 ANDLW 1 XORWF _Y, 1 :: X.F0 = PORTD.F0 && Y.F0; MOVLW 1 ANDWF PORTD, 0 MOVWF STACK_0 BTFSC STATUS, Z GOTO L_main_51 MOVLW 1 ANDWF _Y, 0 MOVWF STACK_0 BTFSC STATUS, Z GOTO L_main_51 MOVLW 1 MOVWF STACK_0 GOTO L_main_50

65

$02EA $01F0 $02EB $ L_main_50: $02EB $3000 $02EC $1870 $02ED $3001 $02EE $0623 $02EF $3901 $02F0 $06A3 ;Fibonacci_Galoas.c,98 $02F1 $3000 $02F2 $1888 $02F3 $3001 $02F4 $00F1 $02F5 $0871 $02F6 $1903 $02F7 $2B02 $02F8 $3000 $02F9 $18A0 $02FA $3001 $02FB $00F1 $02FC $0871 $02FD $1903 $02FE $2B02 $02FF $3001 $0300 $00F0 $0301 $2B03 $0302 $ L_main_53: $0302 $01F0 $0303 $ L_main_52: $0303 $3000 $0304 $1870 $0305 $3002 $0306 $0623 $0307 $3902 $0308 $06A3 ;Fibonacci_Galoas.c,99 $0309 $3000 $030A $1908 $030B $3001 $030C $00F1 $030D $0871 $030E $1903 $030F $2B1A $0310 $3000 $0311 $1920 $0312 $3001 $0313 $00F1 $0314 $0871 $0315 $1903 $0316 $2B1A $0317 $3001 $0318 $00F0 $0319 $2B1B $031A $ L_main_55: $031A $01F0 $031B $ L_main_54: $031B $3000 $031C $1870 $031D $3004 $031E $0623 $031F $3904

CLRF STACK_0, 1 MOVLW 0 BTFSC STACK_0, 0 MOVLW 1 XORWF _X, 0 ANDLW 1 XORWF _X, 1 :: X.F1 = PORTD.F1 && Y.F1; MOVLW 0 BTFSC PORTD, 1 MOVLW 1 MOVWF STACK_1 MOVF STACK_1, 0 BTFSC STATUS, Z GOTO L_main_53 MOVLW 0 BTFSC _Y, 1 MOVLW 1 MOVWF STACK_1 MOVF STACK_1, 0 BTFSC STATUS, Z GOTO L_main_53 MOVLW 1 MOVWF STACK_0 GOTO L_main_52 CLRF STACK_0, 1 MOVLW 0 BTFSC STACK_0, 0 MOVLW 2 XORWF _X, 0 ANDLW 2 XORWF _X, 1 :: X.F2 = PORTD.F2 && Y.F2; MOVLW 0 BTFSC PORTD, 2 MOVLW 1 MOVWF STACK_1 MOVF STACK_1, 0 BTFSC STATUS, Z GOTO L_main_55 MOVLW 0 BTFSC _Y, 2 MOVLW 1 MOVWF STACK_1 MOVF STACK_1, 0 BTFSC STATUS, Z GOTO L_main_55 MOVLW 1 MOVWF STACK_0 GOTO L_main_54 CLRF STACK_0, 1 MOVLW 0 BTFSC STACK_0, 0 MOVLW 4 XORWF _X, 0 ANDLW 4

66

$0320 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,100 :: DD.F0 = Y.F0; $0321 $3001 MOVLW 1 $0322 $0520 ANDWF _Y, 0 $0323 $00F0 MOVWF STACK_0 $0324 $3000 MOVLW 0 $0325 $1870 BTFSC STACK_0, 0 $0326 $3001 MOVLW 1 $0327 $0621 XORWF _DD, 0 $0328 $3901 ANDLW 1 $0329 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,101 :: DD.F1 = (PORTB.F0 && !X.F0)||(!PORTB.F0 && X.F0); $032A $3001 MOVLW 1 $032B $0506 ANDWF PORTB, 0 $032C $00F0 MOVWF STACK_0 $032D $1903 BTFSC STATUS, Z $032E $2B31 GOTO L603_ex_L_main_61 $032F $1C23 BTFSS _X, 0 $0330 $2B3A GOTO L_main_61 $0331 $ L603_ex_L_main_61: $0331 $1806 BTFSC PORTB, 0 $0332 $2B38 GOTO L615_ex_L_main_61 $0333 $3001 MOVLW 1 $0334 $0523 ANDWF _X, 0 $0335 $00F0 MOVWF STACK_0 $0336 $1D03 BTFSS STATUS, Z $0337 $2B3A GOTO L_main_61 $0338 $ L615_ex_L_main_61: $0338 $01F0 CLRF STACK_0, 1 $0339 $2B3C GOTO L_main_60 $033A $ L_main_61: $033A $3001 MOVLW 1 $033B $00F0 MOVWF STACK_0 $033C $ L_main_60: $033C $3000 MOVLW 0 $033D $1870 BTFSC STACK_0, 0 $033E $3002 MOVLW 2 $033F $0621 XORWF _DD, 0 $0340 $3902 ANDLW 2 $0341 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,102 :: DD.F2 = (PORTB.F1 && !X.F1)||(!PORTB.F1 && X.F1); $0342 $3000 MOVLW 0 $0343 $1886 BTFSC PORTB, 1 $0344 $3001 MOVLW 1 $0345 $00F1 MOVWF STACK_1 $0346 $0871 MOVF STACK_1, 0 $0347 $1903 BTFSC STATUS, Z $0348 $2B4B GOTO L636_ex_L_main_67 $0349 $1CA3 BTFSS _X, 1 $034A $2B56 GOTO L_main_67 $034B $ L636_ex_L_main_67: $034B $1886 BTFSC PORTB, 1 $034C $2B54 GOTO L650_ex_L_main_67 $034D $3000 MOVLW 0 $034E $18A3 BTFSC _X, 1 $034F $3001 MOVLW 1 $0350 $00F1 MOVWF STACK_1 $0351 $0871 MOVF STACK_1, 0 $0352 $1D03 BTFSS STATUS, Z

67

$0353 $2B56 GOTO L_main_67 $0354 $ L650_ex_L_main_67: $0354 $01F0 CLRF STACK_0, 1 $0355 $2B58 GOTO L_main_66 $0356 $ L_main_67: $0356 $3001 MOVLW 1 $0357 $00F0 MOVWF STACK_0 $0358 $ L_main_66: $0358 $3000 MOVLW 0 $0359 $1870 BTFSC STACK_0, 0 $035A $3004 MOVLW 4 $035B $0621 XORWF _DD, 0 $035C $3904 ANDLW 4 $035D $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,103 :: DD.F3 = (PORTB.F2 && !X.F2)||(!PORTB.F2 && X.F2); $035E $3000 MOVLW 0 $035F $1906 BTFSC PORTB, 2 $0360 $3001 MOVLW 1 $0361 $00F1 MOVWF STACK_1 $0362 $0871 MOVF STACK_1, 0 $0363 $1903 BTFSC STATUS, Z $0364 $2B67 GOTO L671_ex_L_main_73 $0365 $1D23 BTFSS _X, 2 $0366 $2B72 GOTO L_main_73 $0367 $ L671_ex_L_main_73: $0367 $1906 BTFSC PORTB, 2 $0368 $2B70 GOTO L685_ex_L_main_73 $0369 $3000 MOVLW 0 $036A $1923 BTFSC _X, 2 $036B $3001 MOVLW 1 $036C $00F1 MOVWF STACK_1 $036D $0871 MOVF STACK_1, 0 $036E $1D03 BTFSS STATUS, Z $036F $2B72 GOTO L_main_73 $0370 $ L685_ex_L_main_73: $0370 $01F0 CLRF STACK_0, 1 $0371 $2B74 GOTO L_main_72 $0372 $ L_main_73: $0372 $3001 MOVLW 1 $0373 $00F0 MOVWF STACK_0 $0374 $ L_main_72: $0374 $3000 MOVLW 0 $0375 $1870 BTFSC STACK_0, 0 $0376 $3008 MOVLW 8 $0377 $0621 XORWF _DD, 0 $0378 $3908 ANDLW 8 $0379 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,104 :: } $037A $ L_main_49: ;Fibonacci_Galoas.c,105 :: } $037A $2A4C GOTO L_main_42 $037B $ L_main_43: ;Fibonacci_Galoas.c,108 :: while (PORTC.F5==0 && PORTC.F4==1 && PORTC.F3 == 1) { $037B $ L_main_74: $037B $3000 MOVLW 0 $037C $1A87 BTFSC PORTC, 5 $037D $3001 MOVLW 1 $037E $00F1 MOVWF STACK_1 $037F $0871 MOVF STACK_1, 0

68

$0380 $3A00 XORLW 0 $0381 $1D03 BTFSS STATUS, Z $0382 $2C3E GOTO L_main_75 $0383 $3000 MOVLW 0 $0384 $1A07 BTFSC PORTC, 4 $0385 $3001 MOVLW 1 $0386 $00F1 MOVWF STACK_1 $0387 $0871 MOVF STACK_1, 0 $0388 $3A01 XORLW 1 $0389 $1D03 BTFSS STATUS, Z $038A $2C3E GOTO L_main_75 $038B $3000 MOVLW 0 $038C $1987 BTFSC PORTC, 3 $038D $3001 MOVLW 1 $038E $00F1 MOVWF STACK_1 $038F $0871 MOVF STACK_1, 0 $0390 $3A01 XORLW 1 $0391 $1D03 BTFSS STATUS, Z $0392 $2C3E GOTO L_main_75 $0393 $ L721_ex_L_main_75: ;Fibonacci_Galoas.c,109 :: PORTB.F7 = PORTC.F5; $0393 $3000 MOVLW 0 $0394 $1A87 BTFSC PORTC, 5 $0395 $3001 MOVLW 1 $0396 $00F1 MOVWF STACK_1 $0397 $3000 MOVLW 0 $0398 $1871 BTFSC STACK_1, 0 $0399 $3080 MOVLW 128 $039A $0606 XORWF PORTB, 0 $039B $3980 ANDLW 128 $039C $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,110 :: PORTB.F6 = PORTC.F4; $039D $3000 MOVLW 0 $039E $1A07 BTFSC PORTC, 4 $039F $3001 MOVLW 1 $03A0 $00F1 MOVWF STACK_1 $03A1 $3000 MOVLW 0 $03A2 $1871 BTFSC STACK_1, 0 $03A3 $3040 MOVLW 64 $03A4 $0606 XORWF PORTB, 0 $03A5 $3940 ANDLW 64 $03A6 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,111 :: if (PORTA.F0==1) { $03A7 $3001 MOVLW 1 $03A8 $0505 ANDWF PORTA, 0 $03A9 $00F1 MOVWF STACK_1 $03AA $0871 MOVF STACK_1, 0 $03AB $3A01 XORLW 1 $03AC $1D03 BTFSS STATUS, Z $03AD $2BAF GOTO L_main_78 ;Fibonacci_Galoas.c,112 :: k = 0; $03AE $01A2 CLRF _k, 1 ;Fibonacci_Galoas.c,113 :: } $03AF $ L_main_78: ;Fibonacci_Galoas.c,114 :: if ((PORTA.F0==0) && (k==0)) { $03AF $3001 MOVLW 1 $03B0 $0505 ANDWF PORTA, 0 $03B1 $00F1 MOVWF STACK_1 $03B2 $0871 MOVF STACK_1, 0 $03B3 $3A00 XORLW 0 $03B4 $1D03 BTFSS STATUS, Z

69

$03B5 $2C3D GOTO L_main_81 $03B6 $0822 MOVF _k, 0 $03B7 $3A00 XORLW 0 $03B8 $1D03 BTFSS STATUS, Z $03B9 $2C3D GOTO L_main_81 $03BA $ L750_ex_L_main_81: ;Fibonacci_Galoas.c,115 :: delay_ms(250); $03BA $3002 MOVLW 2 $03BB $00FC MOVWF STACK_12 $03BC $30FF MOVLW 255 $03BD $00FB MOVWF STACK_11 $03BE $30FF MOVLW 255 $03BF $00FA MOVWF STACK_10 $03C0 $0BFC DECFSZ STACK_12, F $03C1 $2BC3 GOTO $+2 $03C2 $2BCA GOTO $+8 $03C3 $0BFB DECFSZ STACK_11, F $03C4 $2BC6 GOTO $+2 $03C5 $2BC9 GOTO $+4 $03C6 $0BFA DECFSZ STACK_10, F $03C7 $2BC6 GOTO $-1 $03C8 $2BC3 GOTO $-5 $03C9 $2BC0 GOTO $-9 $03CA $3046 MOVLW 70 $03CB $00FB MOVWF STACK_11 $03CC $30FF MOVLW 255 $03CD $00FA MOVWF STACK_10 $03CE $0BFB DECFSZ STACK_11, F $03CF $2BD1 GOTO $+2 $03D0 $2BD4 GOTO $+4 $03D1 $0BFA DECFSZ STACK_10, F $03D2 $2BD1 GOTO $-1 $03D3 $2BCE GOTO $-5 $03D4 $30CF MOVLW 207 $03D5 $00FA MOVWF STACK_10 $03D6 $0BFA DECFSZ STACK_10, F $03D7 $2BD6 GOTO $-1 $03D8 $0000 NOP ;Fibonacci_Galoas.c,116 :: k = 1; $03D9 $3001 MOVLW 1 $03DA $00A2 MOVWF _k ;Fibonacci_Galoas.c,117 :: PORTB.F0 = DD.F0; $03DB $3001 MOVLW 1 $03DC $0521 ANDWF _DD, 0 $03DD $00F0 MOVWF STACK_0 $03DE $3000 MOVLW 0 $03DF $1870 BTFSC STACK_0, 0 $03E0 $3001 MOVLW 1 $03E1 $0606 XORWF PORTB, 0 $03E2 $3901 ANDLW 1 $03E3 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,118 :: PORTB.F1 = DD.F1; $03E4 $3000 MOVLW 0 $03E5 $18A1 BTFSC _DD, 1 $03E6 $3001 MOVLW 1 $03E7 $00F1 MOVWF STACK_1 $03E8 $3000 MOVLW 0 $03E9 $1871 BTFSC STACK_1, 0 $03EA $3002 MOVLW 2 $03EB $0606 XORWF PORTB, 0 $03EC $3902 ANDLW 2

70

$03ED $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,119 :: X.F0 = PORTD.F0 && PORTB.F0; $03EE $3001 MOVLW 1 $03EF $0508 ANDWF PORTD, 0 $03F0 $00F0 MOVWF STACK_0 $03F1 $1903 BTFSC STATUS, Z $03F2 $2BFB GOTO L_main_83 $03F3 $3001 MOVLW 1 $03F4 $0506 ANDWF PORTB, 0 $03F5 $00F0 MOVWF STACK_0 $03F6 $1903 BTFSC STATUS, Z $03F7 $2BFB GOTO L_main_83 $03F8 $3001 MOVLW 1 $03F9 $00F0 MOVWF STACK_0 $03FA $2BFC GOTO L_main_82 $03FB $ L_main_83: $03FB $01F0 CLRF STACK_0, 1 $03FC $ L_main_82: $03FC $3000 MOVLW 0 $03FD $1870 BTFSC STACK_0, 0 $03FE $3001 MOVLW 1 $03FF $0623 XORWF _X, 0 $0400 $3901 ANDLW 1 $0401 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,120 :: X.F1 = PORTD.F1 && PORTB.F1; $0402 $3000 MOVLW 0 $0403 $1888 BTFSC PORTD, 1 $0404 $3001 MOVLW 1 $0405 $00F1 MOVWF STACK_1 $0406 $0871 MOVF STACK_1, 0 $0407 $1903 BTFSC STATUS, Z $0408 $2C13 GOTO L_main_85 $0409 $3000 MOVLW 0 $040A $1886 BTFSC PORTB, 1 $040B $3001 MOVLW 1 $040C $00F1 MOVWF STACK_1 $040D $0871 MOVF STACK_1, 0 $040E $1903 BTFSC STATUS, Z $040F $2C13 GOTO L_main_85 $0410 $3001 MOVLW 1 $0411 $00F0 MOVWF STACK_0 $0412 $2C14 GOTO L_main_84 $0413 $ L_main_85: $0413 $01F0 CLRF STACK_0, 1 $0414 $ L_main_84: $0414 $3000 MOVLW 0 $0415 $1870 BTFSC STACK_0, 0 $0416 $3002 MOVLW 2 $0417 $0623 XORWF _X, 0 $0418 $3902 ANDLW 2 $0419 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,121 :: DD.F0 =(X.F0 && !X.F1)||(!X.F0 && X.F1); $041A $3001 MOVLW 1 $041B $0523 ANDWF _X, 0 $041C $00F0 MOVWF STACK_0 $041D $1903 BTFSC STATUS, Z $041E $2C21 GOTO L832_ex_L_main_91 $041F $1CA3 BTFSS _X, 1 $0420 $2C2C GOTO L_main_91 $0421 $ L832_ex_L_main_91:

71

$0421 $1823 BTFSC _X, 0 $0422 $2C2A GOTO L846_ex_L_main_91 $0423 $3000 MOVLW 0 $0424 $18A3 BTFSC _X, 1 $0425 $3001 MOVLW 1 $0426 $00F1 MOVWF STACK_1 $0427 $0871 MOVF STACK_1, 0 $0428 $1D03 BTFSS STATUS, Z $0429 $2C2C GOTO L_main_91 $042A $ L846_ex_L_main_91: $042A $01F0 CLRF STACK_0, 1 $042B $2C2E GOTO L_main_90 $042C $ L_main_91: $042C $3001 MOVLW 1 $042D $00F0 MOVWF STACK_0 $042E $ L_main_90: $042E $3000 MOVLW 0 $042F $1870 BTFSC STACK_0, 0 $0430 $3001 MOVLW 1 $0431 $0621 XORWF _DD, 0 $0432 $3901 ANDLW 1 $0433 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,122 :: DD.F1 = PORTB.F0; $0434 $3001 MOVLW 1 $0435 $0506 ANDWF PORTB, 0 $0436 $00F0 MOVWF STACK_0 $0437 $3000 MOVLW 0 $0438 $1870 BTFSC STACK_0, 0 $0439 $3002 MOVLW 2 $043A $0621 XORWF _DD, 0 $043B $3902 ANDLW 2 $043C $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,123 :: } $043D $ L_main_81: ;Fibonacci_Galoas.c,124 :: } $043D $2B7B GOTO L_main_74 $043E $ L_main_75: ;Fibonacci_Galoas.c,127 :: while (PORTC.F5==1 && PORTC.F4==0 && PORTC.F3 == 1) { $043E $ L_main_92: $043E $3000 MOVLW 0 $043F $1A87 BTFSC PORTC, 5 $0440 $3001 MOVLW 1 $0441 $00F1 MOVWF STACK_1 $0442 $0871 MOVF STACK_1, 0 $0443 $3A01 XORLW 1 $0444 $1D03 BTFSS STATUS, Z $0445 $2D4A GOTO L_main_93 $0446 $3000 MOVLW 0 $0447 $1A07 BTFSC PORTC, 4 $0448 $3001 MOVLW 1 $0449 $00F1 MOVWF STACK_1 $044A $0871 MOVF STACK_1, 0 $044B $3A00 XORLW 0 $044C $1D03 BTFSS STATUS, Z $044D $2D4A GOTO L_main_93 $044E $3000 MOVLW 0 $044F $1987 BTFSC PORTC, 3 $0450 $3001 MOVLW 1 $0451 $00F1 MOVWF STACK_1 $0452 $0871 MOVF STACK_1, 0

72

$0453 $3A01 XORLW 1 $0454 $1D03 BTFSS STATUS, Z $0455 $2D4A GOTO L_main_93 $0456 $ L885_ex_L_main_93: ;Fibonacci_Galoas.c,128 :: PORTB.F7 = PORTC.F5; $0456 $3000 MOVLW 0 $0457 $1A87 BTFSC PORTC, 5 $0458 $3001 MOVLW 1 $0459 $00F1 MOVWF STACK_1 $045A $3000 MOVLW 0 $045B $1871 BTFSC STACK_1, 0 $045C $3080 MOVLW 128 $045D $0606 XORWF PORTB, 0 $045E $3980 ANDLW 128 $045F $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,129 :: PORTB.F6 = PORTC.F4; $0460 $3000 MOVLW 0 $0461 $1A07 BTFSC PORTC, 4 $0462 $3001 MOVLW 1 $0463 $00F1 MOVWF STACK_1 $0464 $3000 MOVLW 0 $0465 $1871 BTFSC STACK_1, 0 $0466 $3040 MOVLW 64 $0467 $0606 XORWF PORTB, 0 $0468 $3940 ANDLW 64 $0469 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,130 :: PORTB.F3 = 0; $046A $1186 BCF PORTB, 3 ;Fibonacci_Galoas.c,131 :: if (PORTA.F0==1) { $046B $3001 MOVLW 1 $046C $0505 ANDWF PORTA, 0 $046D $00F1 MOVWF STACK_1 $046E $0871 MOVF STACK_1, 0 $046F $3A01 XORLW 1 $0470 $1D03 BTFSS STATUS, Z $0471 $2C73 GOTO L_main_96 ;Fibonacci_Galoas.c,132 :: k = 0; $0472 $01A2 CLRF _k, 1 ;Fibonacci_Galoas.c,133 :: } $0473 $ L_main_96: ;Fibonacci_Galoas.c,134 :: if ((PORTA.F0==0) && (k==0)) { $0473 $3001 MOVLW 1 $0474 $0505 ANDWF PORTA, 0 $0475 $00F1 MOVWF STACK_1 $0476 $0871 MOVF STACK_1, 0 $0477 $3A00 XORLW 0 $0478 $1D03 BTFSS STATUS, Z $0479 $2D49 GOTO L_main_99 $047A $0822 MOVF _k, 0 $047B $3A00 XORLW 0 $047C $1D03 BTFSS STATUS, Z $047D $2D49 GOTO L_main_99 $047E $ L915_ex_L_main_99: ;Fibonacci_Galoas.c,135 :: delay_ms(250); $047E $3002 MOVLW 2 $047F $00FC MOVWF STACK_12 $0480 $30FF MOVLW 255 $0481 $00FB MOVWF STACK_11 $0482 $30FF MOVLW 255 $0483 $00FA MOVWF STACK_10 $0484 $0BFC DECFSZ STACK_12, F

73

$0485 $2C87 GOTO $+2 $0486 $2C8E GOTO $+8 $0487 $0BFB DECFSZ STACK_11, F $0488 $2C8A GOTO $+2 $0489 $2C8D GOTO $+4 $048A $0BFA DECFSZ STACK_10, F $048B $2C8A GOTO $-1 $048C $2C87 GOTO $-5 $048D $2C84 GOTO $-9 $048E $3046 MOVLW 70 $048F $00FB MOVWF STACK_11 $0490 $30FF MOVLW 255 $0491 $00FA MOVWF STACK_10 $0492 $0BFB DECFSZ STACK_11, F $0493 $2C95 GOTO $+2 $0494 $2C98 GOTO $+4 $0495 $0BFA DECFSZ STACK_10, F $0496 $2C95 GOTO $-1 $0497 $2C92 GOTO $-5 $0498 $30CF MOVLW 207 $0499 $00FA MOVWF STACK_10 $049A $0BFA DECFSZ STACK_10, F $049B $2C9A GOTO $-1 $049C $0000 NOP ;Fibonacci_Galoas.c,136 :: k = 1; $049D $3001 MOVLW 1 $049E $00A2 MOVWF _k ;Fibonacci_Galoas.c,137 :: PORTB.F0 = DD.F0; $049F $3001 MOVLW 1 $04A0 $0521 ANDWF _DD, 0 $04A1 $00F0 MOVWF STACK_0 $04A2 $3000 MOVLW 0 $04A3 $1870 BTFSC STACK_0, 0 $04A4 $3001 MOVLW 1 $04A5 $0606 XORWF PORTB, 0 $04A6 $3901 ANDLW 1 $04A7 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,138 :: PORTB.F1 = DD.F1; $04A8 $3000 MOVLW 0 $04A9 $18A1 BTFSC _DD, 1 $04AA $3001 MOVLW 1 $04AB $00F1 MOVWF STACK_1 $04AC $3000 MOVLW 0 $04AD $1871 BTFSC STACK_1, 0 $04AE $3002 MOVLW 2 $04AF $0606 XORWF PORTB, 0 $04B0 $3902 ANDLW 2 $04B1 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,139 :: PORTB.F2 = DD.F2; $04B2 $3000 MOVLW 0 $04B3 $1921 BTFSC _DD, 2 $04B4 $3001 MOVLW 1 $04B5 $00F1 MOVWF STACK_1 $04B6 $3000 MOVLW 0 $04B7 $1871 BTFSC STACK_1, 0 $04B8 $3004 MOVLW 4 $04B9 $0606 XORWF PORTB, 0 $04BA $3904 ANDLW 4 $04BB $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,140 :: X.F0 = PORTD.F0 && PORTB.F0; $04BC $3001 MOVLW 1

74

$04BD $0508 ANDWF PORTD, 0 $04BE $00F0 MOVWF STACK_0 $04BF $1903 BTFSC STATUS, Z $04C0 $2CC9 GOTO L_main_101 $04C1 $3001 MOVLW 1 $04C2 $0506 ANDWF PORTB, 0 $04C3 $00F0 MOVWF STACK_0 $04C4 $1903 BTFSC STATUS, Z $04C5 $2CC9 GOTO L_main_101 $04C6 $3001 MOVLW 1 $04C7 $00F0 MOVWF STACK_0 $04C8 $2CCA GOTO L_main_100 $04C9 $ L_main_101: $04C9 $01F0 CLRF STACK_0, 1 $04CA $ L_main_100: $04CA $3000 MOVLW 0 $04CB $1870 BTFSC STACK_0, 0 $04CC $3001 MOVLW 1 $04CD $0623 XORWF _X, 0 $04CE $3901 ANDLW 1 $04CF $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,141 :: X.F1 = PORTD.F1 && PORTB.F1; $04D0 $3000 MOVLW 0 $04D1 $1888 BTFSC PORTD, 1 $04D2 $3001 MOVLW 1 $04D3 $00F1 MOVWF STACK_1 $04D4 $0871 MOVF STACK_1, 0 $04D5 $1903 BTFSC STATUS, Z $04D6 $2CE1 GOTO L_main_103 $04D7 $3000 MOVLW 0 $04D8 $1886 BTFSC PORTB, 1 $04D9 $3001 MOVLW 1 $04DA $00F1 MOVWF STACK_1 $04DB $0871 MOVF STACK_1, 0 $04DC $1903 BTFSC STATUS, Z $04DD $2CE1 GOTO L_main_103 $04DE $3001 MOVLW 1 $04DF $00F0 MOVWF STACK_0 $04E0 $2CE2 GOTO L_main_102 $04E1 $ L_main_103: $04E1 $01F0 CLRF STACK_0, 1 $04E2 $ L_main_102: $04E2 $3000 MOVLW 0 $04E3 $1870 BTFSC STACK_0, 0 $04E4 $3002 MOVLW 2 $04E5 $0623 XORWF _X, 0 $04E6 $3902 ANDLW 2 $04E7 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,142 :: X.F2 = PORTD.F2 && PORTB.F2; $04E8 $3000 MOVLW 0 $04E9 $1908 BTFSC PORTD, 2 $04EA $3001 MOVLW 1 $04EB $00F1 MOVWF STACK_1 $04EC $0871 MOVF STACK_1, 0 $04ED $1903 BTFSC STATUS, Z $04EE $2CF9 GOTO L_main_105 $04EF $3000 MOVLW 0 $04F0 $1906 BTFSC PORTB, 2 $04F1 $3001 MOVLW 1 $04F2 $00F1 MOVWF STACK_1 $04F3 $0871 MOVF STACK_1, 0

75

$04F4 $1903 BTFSC STATUS, Z $04F5 $2CF9 GOTO L_main_105 $04F6 $3001 MOVLW 1 $04F7 $00F0 MOVWF STACK_0 $04F8 $2CFA GOTO L_main_104 $04F9 $ L_main_105: $04F9 $01F0 CLRF STACK_0, 1 $04FA $ L_main_104: $04FA $3000 MOVLW 0 $04FB $1870 BTFSC STACK_0, 0 $04FC $3004 MOVLW 4 $04FD $0623 XORWF _X, 0 $04FE $3904 ANDLW 4 $04FF $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,143 :: X.F4 = (X.F0 && !X.F1)||(!X.F0 && X.F1); $0500 $3001 MOVLW 1 $0501 $0523 ANDWF _X, 0 $0502 $00F0 MOVWF STACK_0 $0503 $1903 BTFSC STATUS, Z $0504 $2D07 GOTO L1019_ex_L_main_111 $0505 $1CA3 BTFSS _X, 1 $0506 $2D12 GOTO L_main_111 $0507 $ L1019_ex_L_main_111: $0507 $1823 BTFSC _X, 0 $0508 $2D10 GOTO L1033_ex_L_main_111 $0509 $3000 MOVLW 0 $050A $18A3 BTFSC _X, 1 $050B $3001 MOVLW 1 $050C $00F1 MOVWF STACK_1 $050D $0871 MOVF STACK_1, 0 $050E $1D03 BTFSS STATUS, Z $050F $2D12 GOTO L_main_111 $0510 $ L1033_ex_L_main_111: $0510 $01F0 CLRF STACK_0, 1 $0511 $2D14 GOTO L_main_110 $0512 $ L_main_111: $0512 $3001 MOVLW 1 $0513 $00F0 MOVWF STACK_0 $0514 $ L_main_110: $0514 $3000 MOVLW 0 $0515 $1870 BTFSC STACK_0, 0 $0516 $3010 MOVLW 16 $0517 $0623 XORWF _X, 0 $0518 $3910 ANDLW 16 $0519 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,144 :: DD.F0 =(X.F4 && !X.F2)||(!X.F4 && X.F2); $051A $3000 MOVLW 0 $051B $1A23 BTFSC _X, 4 $051C $3001 MOVLW 1 $051D $00F1 MOVWF STACK_1 $051E $0871 MOVF STACK_1, 0 $051F $1903 BTFSC STATUS, Z $0520 $2D23 GOTO L1054_ex_L_main_117 $0521 $1D23 BTFSS _X, 2 $0522 $2D2E GOTO L_main_117 $0523 $ L1054_ex_L_main_117: $0523 $1A23 BTFSC _X, 4 $0524 $2D2C GOTO L1068_ex_L_main_117 $0525 $3000 MOVLW 0

76

$0526 $1923 BTFSC _X, 2 $0527 $3001 MOVLW 1 $0528 $00F1 MOVWF STACK_1 $0529 $0871 MOVF STACK_1, 0 $052A $1D03 BTFSS STATUS, Z $052B $2D2E GOTO L_main_117 $052C $ L1068_ex_L_main_117: $052C $01F0 CLRF STACK_0, 1 $052D $2D30 GOTO L_main_116 $052E $ L_main_117: $052E $3001 MOVLW 1 $052F $00F0 MOVWF STACK_0 $0530 $ L_main_116: $0530 $3000 MOVLW 0 $0531 $1870 BTFSC STACK_0, 0 $0532 $3001 MOVLW 1 $0533 $0621 XORWF _DD, 0 $0534 $3901 ANDLW 1 $0535 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,145 :: DD.F1 = PORTB.F0; $0536 $3001 MOVLW 1 $0537 $0506 ANDWF PORTB, 0 $0538 $00F0 MOVWF STACK_0 $0539 $3000 MOVLW 0 $053A $1870 BTFSC STACK_0, 0 $053B $3002 MOVLW 2 $053C $0621 XORWF _DD, 0 $053D $3902 ANDLW 2 $053E $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,146 :: DD.F2 = PORTB.F1; $053F $3000 MOVLW 0 $0540 $1886 BTFSC PORTB, 1 $0541 $3001 MOVLW 1 $0542 $00F1 MOVWF STACK_1 $0543 $3000 MOVLW 0 $0544 $1871 BTFSC STACK_1, 0 $0545 $3004 MOVLW 4 $0546 $0621 XORWF _DD, 0 $0547 $3904 ANDLW 4 $0548 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,147 :: } $0549 $ L_main_99: ;Fibonacci_Galoas.c,148 :: } $0549 $2C3E GOTO L_main_92 $054A $ L_main_93: ;Fibonacci_Galoas.c,151 :: while (PORTC.F5==1 && PORTC.F4==1 && PORTC.F3 == 1) { $054A $ L_main_118: $054A $3000 MOVLW 0 $054B $1A87 BTFSC PORTC, 5 $054C $3001 MOVLW 1 $054D $00F1 MOVWF STACK_1 $054E $0871 MOVF STACK_1, 0 $054F $3A01 XORLW 1 $0550 $1D03 BTFSS STATUS, Z $0551 $2E9D GOTO L_main_119 $0552 $3000 MOVLW 0 $0553 $1A07 BTFSC PORTC, 4 $0554 $3001 MOVLW 1 $0555 $00F1 MOVWF STACK_1 $0556 $0871 MOVF STACK_1, 0

77

$0557 $3A01 XORLW 1 $0558 $1D03 BTFSS STATUS, Z $0559 $2E9D GOTO L_main_119 $055A $3000 MOVLW 0 $055B $1987 BTFSC PORTC, 3 $055C $3001 MOVLW 1 $055D $00F1 MOVWF STACK_1 $055E $0871 MOVF STACK_1, 0 $055F $3A01 XORLW 1 $0560 $1D03 BTFSS STATUS, Z $0561 $2E9D GOTO L_main_119 $0562 $ L1112_ex_L_main_119: ;Fibonacci_Galoas.c,152 :: PORTB.F7 = PORTC.F5; $0562 $3000 MOVLW 0 $0563 $1A87 BTFSC PORTC, 5 $0564 $3001 MOVLW 1 $0565 $00F1 MOVWF STACK_1 $0566 $3000 MOVLW 0 $0567 $1871 BTFSC STACK_1, 0 $0568 $3080 MOVLW 128 $0569 $0606 XORWF PORTB, 0 $056A $3980 ANDLW 128 $056B $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,153 :: PORTB.F6 = PORTC.F4; $056C $3000 MOVLW 0 $056D $1A07 BTFSC PORTC, 4 $056E $3001 MOVLW 1 $056F $00F1 MOVWF STACK_1 $0570 $3000 MOVLW 0 $0571 $1871 BTFSC STACK_1, 0 $0572 $3040 MOVLW 64 $0573 $0606 XORWF PORTB, 0 $0574 $3940 ANDLW 64 $0575 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,154 :: if (PORTA.F0==1) { $0576 $3001 MOVLW 1 $0577 $0505 ANDWF PORTA, 0 $0578 $00F1 MOVWF STACK_1 $0579 $0871 MOVF STACK_1, 0 $057A $3A01 XORLW 1 $057B $1D03 BTFSS STATUS, Z $057C $2D7E GOTO L_main_122 ;Fibonacci_Galoas.c,155 :: k = 0; $057D $01A2 CLRF _k, 1 ;Fibonacci_Galoas.c,156 :: } $057E $ L_main_122: ;Fibonacci_Galoas.c,157 :: if ((PORTA.F0==0) && (k==0)) { $057E $3001 MOVLW 1 $057F $0505 ANDWF PORTA, 0 $0580 $00F1 MOVWF STACK_1 $0581 $0871 MOVF STACK_1, 0 $0582 $3A00 XORLW 0 $0583 $1D03 BTFSS STATUS, Z $0584 $2E9C GOTO L_main_125 $0585 $0822 MOVF _k, 0 $0586 $3A00 XORLW 0 $0587 $1D03 BTFSS STATUS, Z $0588 $2E9C GOTO L_main_125 $0589 $ L1141_ex_L_main_125: ;Fibonacci_Galoas.c,158 :: delay_ms(250); $0589 $3002 MOVLW 2

78

$058A $00FC MOVWF STACK_12 $058B $30FF MOVLW 255 $058C $00FB MOVWF STACK_11 $058D $30FF MOVLW 255 $058E $00FA MOVWF STACK_10 $058F $0BFC DECFSZ STACK_12, F $0590 $2D92 GOTO $+2 $0591 $2D99 GOTO $+8 $0592 $0BFB DECFSZ STACK_11, F $0593 $2D95 GOTO $+2 $0594 $2D98 GOTO $+4 $0595 $0BFA DECFSZ STACK_10, F $0596 $2D95 GOTO $-1 $0597 $2D92 GOTO $-5 $0598 $2D8F GOTO $-9 $0599 $3046 MOVLW 70 $059A $00FB MOVWF STACK_11 $059B $30FF MOVLW 255 $059C $00FA MOVWF STACK_10 $059D $0BFB DECFSZ STACK_11, F $059E $2DA0 GOTO $+2 $059F $2DA3 GOTO $+4 $05A0 $0BFA DECFSZ STACK_10, F $05A1 $2DA0 GOTO $-1 $05A2 $2D9D GOTO $-5 $05A3 $30CF MOVLW 207 $05A4 $00FA MOVWF STACK_10 $05A5 $0BFA DECFSZ STACK_10, F $05A6 $2DA5 GOTO $-1 $05A7 $0000 NOP ;Fibonacci_Galoas.c,159 :: k = 1; $05A8 $3001 MOVLW 1 $05A9 $00A2 MOVWF _k ;Fibonacci_Galoas.c,160 :: PORTB.F0 = DD.F0; $05AA $3001 MOVLW 1 $05AB $0521 ANDWF _DD, 0 $05AC $00F0 MOVWF STACK_0 $05AD $3000 MOVLW 0 $05AE $1870 BTFSC STACK_0, 0 $05AF $3001 MOVLW 1 $05B0 $0606 XORWF PORTB, 0 $05B1 $3901 ANDLW 1 $05B2 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,161 :: PORTB.F1 = DD.F1; $05B3 $3000 MOVLW 0 $05B4 $18A1 BTFSC _DD, 1 $05B5 $3001 MOVLW 1 $05B6 $00F1 MOVWF STACK_1 $05B7 $3000 MOVLW 0 $05B8 $1871 BTFSC STACK_1, 0 $05B9 $3002 MOVLW 2 $05BA $0606 XORWF PORTB, 0 $05BB $3902 ANDLW 2 $05BC $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,162 :: PORTB.F2 = DD.F2; $05BD $3000 MOVLW 0 $05BE $1921 BTFSC _DD, 2 $05BF $3001 MOVLW 1 $05C0 $00F1 MOVWF STACK_1 $05C1 $3000 MOVLW 0 $05C2 $1871 BTFSC STACK_1, 0

79

$05C3 $3004 MOVLW 4 $05C4 $0606 XORWF PORTB, 0 $05C5 $3904 ANDLW 4 $05C6 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,163 :: PORTB.F3 = DD.F3; $05C7 $3000 MOVLW 0 $05C8 $19A1 BTFSC _DD, 3 $05C9 $3001 MOVLW 1 $05CA $00F1 MOVWF STACK_1 $05CB $3000 MOVLW 0 $05CC $1871 BTFSC STACK_1, 0 $05CD $3008 MOVLW 8 $05CE $0606 XORWF PORTB, 0 $05CF $3908 ANDLW 8 $05D0 $0686 XORWF PORTB, 1 ;Fibonacci_Galoas.c,165 :: X.F0 = PORTD.F0 && PORTB.F0; $05D1 $3001 MOVLW 1 $05D2 $0508 ANDWF PORTD, 0 $05D3 $00F0 MOVWF STACK_0 $05D4 $1903 BTFSC STATUS, Z $05D5 $2DDE GOTO L_main_127 $05D6 $3001 MOVLW 1 $05D7 $0506 ANDWF PORTB, 0 $05D8 $00F0 MOVWF STACK_0 $05D9 $1903 BTFSC STATUS, Z $05DA $2DDE GOTO L_main_127 $05DB $3001 MOVLW 1 $05DC $00F0 MOVWF STACK_0 $05DD $2DDF GOTO L_main_126 $05DE $ L_main_127: $05DE $01F0 CLRF STACK_0, 1 $05DF $ L_main_126: $05DF $3000 MOVLW 0 $05E0 $1870 BTFSC STACK_0, 0 $05E1 $3001 MOVLW 1 $05E2 $0623 XORWF _X, 0 $05E3 $3901 ANDLW 1 $05E4 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,166 :: X.F1 = PORTD.F1 && PORTB.F1; $05E5 $3000 MOVLW 0 $05E6 $1888 BTFSC PORTD, 1 $05E7 $3001 MOVLW 1 $05E8 $00F1 MOVWF STACK_1 $05E9 $0871 MOVF STACK_1, 0 $05EA $1903 BTFSC STATUS, Z $05EB $2DF6 GOTO L_main_129 $05EC $3000 MOVLW 0 $05ED $1886 BTFSC PORTB, 1 $05EE $3001 MOVLW 1 $05EF $00F1 MOVWF STACK_1 $05F0 $0871 MOVF STACK_1, 0 $05F1 $1903 BTFSC STATUS, Z $05F2 $2DF6 GOTO L_main_129 $05F3 $3001 MOVLW 1 $05F4 $00F0 MOVWF STACK_0 $05F5 $2DF7 GOTO L_main_128 $05F6 $ L_main_129: $05F6 $01F0 CLRF STACK_0, 1 $05F7 $ L_main_128: $05F7 $3000 MOVLW 0 $05F8 $1870 BTFSC STACK_0, 0

80

$05F9 $3002 MOVLW 2 $05FA $0623 XORWF _X, 0 $05FB $3902 ANDLW 2 $05FC $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,167 :: X.F2 = PORTD.F2 && PORTB.F2; $05FD $3000 MOVLW 0 $05FE $1908 BTFSC PORTD, 2 $05FF $3001 MOVLW 1 $0600 $00F1 MOVWF STACK_1 $0601 $0871 MOVF STACK_1, 0 $0602 $1903 BTFSC STATUS, Z $0603 $2E0E GOTO L_main_131 $0604 $3000 MOVLW 0 $0605 $1906 BTFSC PORTB, 2 $0606 $3001 MOVLW 1 $0607 $00F1 MOVWF STACK_1 $0608 $0871 MOVF STACK_1, 0 $0609 $1903 BTFSC STATUS, Z $060A $2E0E GOTO L_main_131 $060B $3001 MOVLW 1 $060C $00F0 MOVWF STACK_0 $060D $2E0F GOTO L_main_130 $060E $ L_main_131: $060E $01F0 CLRF STACK_0, 1 $060F $ L_main_130: $060F $3000 MOVLW 0 $0610 $1870 BTFSC STACK_0, 0 $0611 $3004 MOVLW 4 $0612 $0623 XORWF _X, 0 $0613 $3904 ANDLW 4 $0614 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,168 :: X.F3 = PORTD.F3 && PORTB.F3; $0615 $3000 MOVLW 0 $0616 $1988 BTFSC PORTD, 3 $0617 $3001 MOVLW 1 $0618 $00F1 MOVWF STACK_1 $0619 $0871 MOVF STACK_1, 0 $061A $1903 BTFSC STATUS, Z $061B $2E26 GOTO L_main_133 $061C $3000 MOVLW 0 $061D $1986 BTFSC PORTB, 3 $061E $3001 MOVLW 1 $061F $00F1 MOVWF STACK_1 $0620 $0871 MOVF STACK_1, 0 $0621 $1903 BTFSC STATUS, Z $0622 $2E26 GOTO L_main_133 $0623 $3001 MOVLW 1 $0624 $00F0 MOVWF STACK_0 $0625 $2E27 GOTO L_main_132 $0626 $ L_main_133: $0626 $01F0 CLRF STACK_0, 1 $0627 $ L_main_132: $0627 $3000 MOVLW 0 $0628 $1870 BTFSC STACK_0, 0 $0629 $3008 MOVLW 8 $062A $0623 XORWF _X, 0 $062B $3908 ANDLW 8 $062C $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,169 :: X.F4 = (X.F0 && !X.F1)||(!X.F0 && X.F1); $062D $3001 MOVLW 1

81

$062E $0523 ANDWF _X, 0 $062F $00F0 MOVWF STACK_0 $0630 $1903 BTFSC STATUS, Z $0631 $2E34 GOTO L1267_ex_L_main_139 $0632 $1CA3 BTFSS _X, 1 $0633 $2E3F GOTO L_main_139 $0634 $ L1267_ex_L_main_139: $0634 $1823 BTFSC _X, 0 $0635 $2E3D GOTO L1281_ex_L_main_139 $0636 $3000 MOVLW 0 $0637 $18A3 BTFSC _X, 1 $0638 $3001 MOVLW 1 $0639 $00F1 MOVWF STACK_1 $063A $0871 MOVF STACK_1, 0 $063B $1D03 BTFSS STATUS, Z $063C $2E3F GOTO L_main_139 $063D $ L1281_ex_L_main_139: $063D $01F0 CLRF STACK_0, 1 $063E $2E41 GOTO L_main_138 $063F $ L_main_139: $063F $3001 MOVLW 1 $0640 $00F0 MOVWF STACK_0 $0641 $ L_main_138: $0641 $3000 MOVLW 0 $0642 $1870 BTFSC STACK_0, 0 $0643 $3010 MOVLW 16 $0644 $0623 XORWF _X, 0 $0645 $3910 ANDLW 16 $0646 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,170 :: X.F5 = (X.F2 && !X.F3)||(!X.F2 && X.F3); $0647 $3000 MOVLW 0 $0648 $1923 BTFSC _X, 2 $0649 $3001 MOVLW 1 $064A $00F1 MOVWF STACK_1 $064B $0871 MOVF STACK_1, 0 $064C $1903 BTFSC STATUS, Z $064D $2E50 GOTO L1302_ex_L_main_145 $064E $1DA3 BTFSS _X, 3 $064F $2E5B GOTO L_main_145 $0650 $ L1302_ex_L_main_145: $0650 $1923 BTFSC _X, 2 $0651 $2E59 GOTO L1316_ex_L_main_145 $0652 $3000 MOVLW 0 $0653 $19A3 BTFSC _X, 3 $0654 $3001 MOVLW 1 $0655 $00F1 MOVWF STACK_1 $0656 $0871 MOVF STACK_1, 0 $0657 $1D03 BTFSS STATUS, Z $0658 $2E5B GOTO L_main_145 $0659 $ L1316_ex_L_main_145: $0659 $01F0 CLRF STACK_0, 1 $065A $2E5D GOTO L_main_144 $065B $ L_main_145: $065B $3001 MOVLW 1 $065C $00F0 MOVWF STACK_0 $065D $ L_main_144: $065D $3000 MOVLW 0 $065E $1870 BTFSC STACK_0, 0 $065F $3020 MOVLW 32 $0660 $0623 XORWF _X, 0

82

$0661 $3920 ANDLW 32 $0662 $06A3 XORWF _X, 1 ;Fibonacci_Galoas.c,171 :: DD.F0 =(X.F4 && !X.F5)||(!X.F4 && X.F5); $0663 $3000 MOVLW 0 $0664 $1A23 BTFSC _X, 4 $0665 $3001 MOVLW 1 $0666 $00F1 MOVWF STACK_1 $0667 $0871 MOVF STACK_1, 0 $0668 $1903 BTFSC STATUS, Z $0669 $2E6C GOTO L1337_ex_L_main_151 $066A $1EA3 BTFSS _X, 5 $066B $2E77 GOTO L_main_151 $066C $ L1337_ex_L_main_151: $066C $1A23 BTFSC _X, 4 $066D $2E75 GOTO L1351_ex_L_main_151 $066E $3000 MOVLW 0 $066F $1AA3 BTFSC _X, 5 $0670 $3001 MOVLW 1 $0671 $00F1 MOVWF STACK_1 $0672 $0871 MOVF STACK_1, 0 $0673 $1D03 BTFSS STATUS, Z $0674 $2E77 GOTO L_main_151 $0675 $ L1351_ex_L_main_151: $0675 $01F0 CLRF STACK_0, 1 $0676 $2E79 GOTO L_main_150 $0677 $ L_main_151: $0677 $3001 MOVLW 1 $0678 $00F0 MOVWF STACK_0 $0679 $ L_main_150: $0679 $3000 MOVLW 0 $067A $1870 BTFSC STACK_0, 0 $067B $3001 MOVLW 1 $067C $0621 XORWF _DD, 0 $067D $3901 ANDLW 1 $067E $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,172 :: DD.F1 = PORTB.F0; $067F $3001 MOVLW 1 $0680 $0506 ANDWF PORTB, 0 $0681 $00F0 MOVWF STACK_0 $0682 $3000 MOVLW 0 $0683 $1870 BTFSC STACK_0, 0 $0684 $3002 MOVLW 2 $0685 $0621 XORWF _DD, 0 $0686 $3902 ANDLW 2 $0687 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,173 :: DD.F2 = PORTB.F1; $0688 $3000 MOVLW 0 $0689 $1886 BTFSC PORTB, 1 $068A $3001 MOVLW 1 $068B $00F1 MOVWF STACK_1 $068C $3000 MOVLW 0 $068D $1871 BTFSC STACK_1, 0 $068E $3004 MOVLW 4 $068F $0621 XORWF _DD, 0 $0690 $3904 ANDLW 4 $0691 $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,174 :: DD.F3 = PORTB.F2; $0692 $3000 MOVLW 0 $0693 $1906 BTFSC PORTB, 2 $0694 $3001 MOVLW 1

83

$0695 $00F1 MOVWF STACK_1 $0696 $3000 MOVLW 0 $0697 $1871 BTFSC STACK_1, 0 $0698 $3008 MOVLW 8 $0699 $0621 XORWF _DD, 0 $069A $3908 ANDLW 8 $069B $06A1 XORWF _DD, 1 ;Fibonacci_Galoas.c,175 :: } $069C $ L_main_125: ;Fibonacci_Galoas.c,177 :: } $069C $2D4A GOTO L_main_118 $069D $ L_main_119: ;Fibonacci_Galoas.c,181 :: PORTD = 0; $069D $0188 CLRF PORTD, 1 ;Fibonacci_Galoas.c,182 :: PORTB = 0; $069E $0186 CLRF PORTB, 1 ;Fibonacci_Galoas.c,183 :: DD = 0; $069F $01A1 CLRF _DD, 1 ;Fibonacci_Galoas.c,184 :: X = 0; $06A0 $01A3 CLRF _X, 1 ;Fibonacci_Galoas.c,185 :: Y = 0; $06A1 $01A0 CLRF _Y, 1 ;Fibonacci_Galoas.c,186 :: k = 0; $06A2 $01A2 CLRF _k, 1 ;Fibonacci_Galoas.c,187 :: delay_ms(500); $06A3 $3003 MOVLW 3 $06A4 $00FC MOVWF STACK_12 $06A5 $30FF MOVLW 255 $06A6 $00FB MOVWF STACK_11 $06A7 $30FF MOVLW 255 $06A8 $00FA MOVWF STACK_10 $06A9 $0BFC DECFSZ STACK_12, F $06AA $2EAC GOTO $+2 $06AB $2EB3 GOTO $+8 $06AC $0BFB DECFSZ STACK_11, F $06AD $2EAF GOTO $+2 $06AE $2EB2 GOTO $+4 $06AF $0BFA DECFSZ STACK_10, F $06B0 $2EAF GOTO $-1 $06B1 $2EAC GOTO $-5 $06B2 $2EA9 GOTO $-9 $06B3 $308C MOVLW 140 $06B4 $00FB MOVWF STACK_11 $06B5 $30FF MOVLW 255 $06B6 $00FA MOVWF STACK_10 $06B7 $0BFB DECFSZ STACK_11, F $06B8 $2EBA GOTO $+2 $06B9 $2EBD GOTO $+4 $06BA $0BFA DECFSZ STACK_10, F $06BB $2EBA GOTO $-1 $06BC $2EB7 GOTO $-5 $06BD $30A1 MOVLW 161 $06BE $00FA MOVWF STACK_10 $06BF $0BFA DECFSZ STACK_10, F $06C0 $2EBF GOTO $-1 $06C1 $0000 NOP ;Fibonacci_Galoas.c,190 :: } while (1); // Kraj beskon. petlje $06C2 $28A8 GOTO L_main_0 ;Fibonacci_Galoas.c,191 :: }//~ $06C3 $2EC3 GOTO

84

VI

LABORATORIJSKA VEBA

Slika 45. Raspored prekidaa, taster i LED na ploi 1. Koristei sliku 45 podesiti uredjaj da radi po Fibonacci-jevom metodu. 2. Zadati karakteristini polinom X4+X3+1 i poetno stanje 0001 i izlistati stanja na izlazu.Takodje, odrediti i binarnu sekvencu. stanje na izlazu binarna sekvenca dekadni ekvivalent

Posle koliko koraka se sistem vraa u poetno stanje?______________________ 85

3. Nai reciproni polinomgore navedenog polinoma______________________. 4. Za isti karakteristini polinom ponoviti postupak ali za drugo poetno stanje (npr. 1111). Koja se razlika uoava u ove dve sekvence?____________________________ 5. Promeniti ,sada, samo poetno stanje u 0000 i generisati sekvencu na izlazu. ta se u ovom sluaju deava?_______________________________________ 6. Generisati polinom X4+X2+1 i odrediti stanja na izlazu za sledee 3 razliite poetne vrednosti: 0001, 1011, 0011. Da li je primenjen polinom karakteristian polinom etvrtog stepena?________ ta se uoava iz dobijenih rezultata?___________________________________ 7. Odrediti stanja na izlazu za karakteristini polinom drugog i treeg stepena. Tabela sa karakteristinim polinomima je data u prvom poglavlju. Kroz koliko stanja prolazi sistem za karakteristine polinome 4,3,2,stepena respektivno? ______________________________________________________________ 8. Generisati sekvencu za sledei polinom etvrtog stepena: X4+1. ta uoavamo iz dobijenih rezultata?_________________________________ 9. Sada podesiti sistem da radi po Galois metodu i ponoviti sve korake. U emu se razlikuju sekvenca dobijena Fibonacci-jevim od sekvence dobijene Galois metodom uz primenu istog karakteristinog polinoma?_____________________________ Kada definiemo povratne sprege uz pomo polinoma koji lanovi polinoma su uvek prisutni? ________________________________________________________________ Napomene: Podeavanje potrebnog polinoma za Fibonacci i Galois metod je komplementarno. Npr., za polinom X4+X3+1 i za Fibonacci-jev metod prekidae za izbor polinoma treba postaviti u sledei polozaj: 1100 a za Galois metod u polozaj 0011. Stepen polinoma je definisan na sledei nain: 00-polinom prvog stepena (ne koristimo),01-polinom drugog stepena, 10-polinom treeg stepena i 11-polinom etvrtog stepena. Na klizau adaptera kojim se napaja sistem treba podesiti napon na 6 ili 7.5V (u pitanju je nestabilisan napon). Ako se izabere stepen polinoma nii od 4. stepena, mikrokontroler ignorie via poetna stanja i vie koeficijente polinoma. Dakle,obradjuje samo odgovarajuce. Pre svakog novog izbora stepena i tipa polinoma neophodno je resetovati mikrokontroler. Ako se tokom rada promene ova dva parametra, mikrokontroler ulazi u stanje u kome su sve LED iskljuene. Ako se tokom rada promene poetna stanja i koeficijenti polinoma, to ne "proizvodi" nikakav efekat. Naime, mikrokontroler "pamti" samo pomenuta stanja i koeficijente do prvog pritiska tastera Sledei.

86

VII

ZAKLJUAK

Ovaj seminarski rad prua mogunost studentima da se upoznaju sa nainom implementacije i nainom rada PRNG-a. Za lake izvoenje vebe, u prvim poglavljima opisani su svi potrebni pojmovi i dodatno pojanjeni na primeru implementacije PRNG-a petog stepena sa polinomom 1+X2+X5. U sledeim poglavljima je opisan PIC16F887A, zatim nain programiranja mikrokontrolera i nain realizacije praktinog dela ovog projekta. Potom su opisani zadaci koje studenti treba da odrade pri izvoenju ove vebe. U zavrnim poglavljima je dat pregled koriene literature pri pisanju ovog projekta a koja je neophodna za detaljniju analizu PRNG-a. U ovom zavrnom delu su dati i datasheet-ovi pojedinih elemenata korienih u ovom radu. Sam proces simulacije PRNG-a obavlja mikrokontroler, dok se praenje sekvence odvija na led diodama. U ovom projektu je predviena i veza sa raunarom. Videli smo da PRNG obezbeuje brz i efikasan metod za generisanje pseudo-sluajne binarne sekvence, da mu je hardverska implementacija veoma jednostavna pa se softverska implementacija izuzetno retko koristi. Da postoje dve vrste implementacije i to: Fibonacci-jeva i Galois i obe se mogu lako modifikovati jedna u drugu. Takoe se moe uoiti da je Galois implementacija efikasnija od Fibonacci-jeve zato to se sabiranje povratnih sprega kod nje vri paralelno pa se zato koristi za vee frekvencije. Meutim i Fibonacci-jeva implementacija ima svoju primenu a karakterie je to to je koncepciski laka, zato to se samo ulazni bit u pomerakom registru menja pri promeni kloka a sadraj pomerakog registra bie sledea n cifra u binarnoj sekvenci. Uoava se da i Fibonacci i Galoa PRNG prolazi kroz sva stanja izuzev zabranjenog i vraaju se u poetno stanje, sa odreenom periodom pod uslovom da su opisani primitivnim polinomom odgovarajueg stepena. Zakljuujemo da dobar PRNG treba da poseduje sledee osobine: -Uniformnost generisani brojevi treba da imaju ujednaenu raspodelu 0 i 1. -Nezavisnost generisani brojevi treba da budu nezavisni jedni od drugih. -Ponovljivost generisani brojevi trebaju biti ponovljivi. -Duina ciklusa treba da proe dosta vremena pre nego to doe do ponavljanja brojeva. -Brzina potrebno je da budu brzi. -Memorija nije potrebna velika memorija. Uoavamo i dve osobine koje u nekim primenama mogu izazvati probleme. Prva: imaju odstupanje koje se ogleda u tome to zabranjeno stanje nikada u normalnom radu nije prisutno. Meutim za duge sekvence ovo odstupanje postaje zanemarljivo. Druga: postoji mogunost predvianja sekvence. n+1 bit moe se predvideti ako se zna prethodnih n. To znai da su poznate povratne sprege i stanje svakog flip-flopa.

87

VIII SPISAK AKRONIMA PRNG- (Pseudo random number generator) pseudo sluajni binarni generator LFSR- (Linear feedback shift register) pomeraki registar sa linearnom povratnom spregom PRBS-(Pseudo random binary sequencer) pseudo sluajni binarni sekvencer BIST-(Built-in selfe test) samougradjeni test XOR- Ekskluzivno ili kolo NXOR- Ekskluzivno nili kolo CPU-(Central processor unit) centralna procesorska jedinica ROM- (Read only memory) rom memorija EPROM- Eprom memorija FLASH- Flash memorija STACK-Hardverski magacin RAM-(Random acess memory) ram memorija SSP-(Synchronous serial port) serijska komunikacija USART-(Universal synchronous asynchronous receiver transmiter) serijska komunikacija,univerzalni sinhroni i asinhroni primopredajnik PSP- (Parallel slave port) paralelna komunikacija ASM- Asemblerski HEX- Heksadecimalni DEC- Decimalni COM1- Serijski port na raunaru COM2- Serijski port na raunaru ASCII- (American standard code for information interchange) standard za kodove ICE-(In circuit emulator) unutranji emulator GIE-(General interrupt enable) bit za doyvolu rada svih prekida WDT- Watchdog tajmer PCON-(Power control register) dvobitni statusni registar BOR- Brown-out reset ALU- Aritmetiko logika jedinica OST- Oscilator PWRT-(Power up timer) unoenje kanjenja nakon ukljuenja napajanja POR-(Pover on reset) reset pri ukljuenju napajanja RISC-(Reduced instruction set computer) raunar sa smanjenim brojem instrukcija CISC-(Complex instruction set computer) raunar sa kompleksnim setom Instrukcija GPR-(General purposes registors) registri opte namene SFR-(Special function registers) registri specijalne namene LED-(Light emiting diode) led dioda

88

IX LITERATURA
1. RISC, CISC I DSP PROCESORI, Mile K. Stojev, I izdanje, Elektronski fakultet, Ni, 1997. 2. ARHITEKTURE I PROGRAMIRANJE RAUNARSKIH SISTEMA ZASNOVANIH NA FAMILIJI PROCESORA 80x86, Mile K. Stojev, Branislav D. Petrovi, I izdanje, Elektronski fakultet, Ni, 1999. 3. ZBIRKA ZADATAKA IZ MIKROPROCESORA I MIKRORAUNARA, Mile K. Stojev, Saa S. Risti, Milo D. Krsti, I izdanje, Elektronski fakultet, Ni, 1999. 4. LABORATORIJSKI PRAKTIKUM IZ PREDMETA MIKROPROCESORSKI SISTEMI, Tatjana Stankovi, Saa S. Risti, Milo D. Krsti, Ivan Andreji, Mile K. Stojev, Elektronski fakultet,(Edicija Pomoni Udbenici) Ni, 2004. 5. http://es.elfak.ni.ac.rs LABORATORIJA ZA EMBEDDED SISTEME,Elektronski fakultet Ni http://www.ti.com/msp430 TEXAS INSTRUMENTS, EXPERIMENTER'S BOARD MSP430 6. ECE454 DIGITAL DESIGN II, LECTURE6: A RANDOM NUMBER GENERATOR IN VERILOG, Patrik Schaumont, Spring 2008. 7. PSEUDO-RANDOM BINARY SEQUENCES, Marcus Muller. 8. 16-BIT CRC GENERATOR, Cypress MicroSystems Inc, August 29,2003. 9. TEST COMPACTION, Mani Soma 10. LINEAR FEEDBACK SHIFT REGISTERS AND CICLIC CODES IN SAGE, Timoti Brian Broock, April 24, 2006 . 11. BRANCH-ON-RANDOM, Edward Lee & Craig Zilles 12. ON THE DESIGN OF CLOCK-CONTROLLED PSEUDORANDOM BIT GENERATORS WITH PRIME PERIODS, Chung-Huang Yang. 13. WHATS AN LFSR? , Texas Instruments, December 1996. 14. DESIGN TECHNIQUES OF FPGA BASED RANDOM NUMBER GENERATOR, Pong P. Chu and Robert E. Jones. 15. FEEDBACK SHIFT REGISTER SEQUENCES, Hong-Yeop Song 16. RTL DESIGN OF A GENERIC PSEUDONOISE GENERATOR, Jean-Francois Beaumont 17. AN OVERVIEW OF EMBEDDED SELF-TEST DESIGN, Gaurav Gulati, Ryan Fonnesbeck, Sathya Vijayakumar, Sudheesh Madayi. 18. SERIJSKA KOMUNIKACIJA RAUNARA I USART MODULA MIKROKONTROLERA PIC16F877A, Dejan Lazi i Ivan Novakovi, seminarski rad, Elektronski fakultet, Ni, 2006. 19. PIC16F877A, Datasheet

89

PRILOZI

Introduction to C
Help version: 2006/12/04 C is a powerful, feature rich development tool for PICmicros. It is designed to provide the programmer with the easiest possible solution for developing applications for embedded systems, without compromising performance or control.

C IDE
PIC and C fit together well: PIC is the most popular 8-bit chip in the world, used in a wide variety of applications, and C, prized for its efficiency, is the natural choice for developing embedded systems. mikroC provides a successful match featuring highly advanced IDE, ANSI compliant compiler, broad set of hardware libraries, comprehensive documentation, and plenty of ready-to-run examples.

Features
mikroC (C) allows you to quickly develop and deploy complex applications:

Write your C source code using the built-in Code Editor (Code and Parameter Assistants, Syntax Highlighting, Auto Correct, Code Templates, and more)

90

Use the included mikroC libraries to dramatically speed up the development: data acquisition, memory, displays, conversions, communications Practically all P12, P16, and P18 chips are supported. Monitor your program structure, variables, and functions in the Code Explorer. Generate commented, human-readable assembly, and standard HEX compatible with all programmers. Inspect program flow and debug executable logic with the integrated Debugger. Get detailed reports and graphs: RAM and ROM map, code statistics, assembly listing, calling tree, and more We have provided plenty of examples for you to expand, develop, and use as building bricks in your projects. Copy them entirely if you deem fit thats why we included them with the compiler.

Where to Start

In case that youre new to programming PIC microcontrollers, consider reading the PIC Specifics chapter. The topic may give you some useful pointers on PIC constraints, code portability, and good programming practices. If you are experienced in C programming, you will probably want to consult mikroC Specifics first. For language issues, you can always refer to the comprehensive Language Reference. The complete list of included libraries is available at mikroC Libraries. If you had little experience in C programming, dont panic! We have provided plenty of exam-ples to get you going quickly. We suggest that you first consult Projects and Source Files, and then start browsing the examples that interest you the most.

Technical Support
The latest software can be downloaded at no cost via the Internet (you might want to bookmarkthe pa-ge so you could check for news, patches, and upgrades later on):
http://www.mikroe.com/en/compilers/mikroc/pic/download.htm.

Should you encounter any problems, you are welcome to our support forum at
www.mikroe.com/forum. Here, you may also find helpful information, hardware tips, and

practical code snippets. Your com-ments and suggestions on future development of mikroC are always appreciated feel free to drop a note or two on our Wishlist. To ensure that all problems you encounter are sorted and corrected in an efficient manner, we suggest that you email us at office@mikroe.com. Outline your specific problem and send us an attachment with relevant code. In this way, we can record and track down bugs more efficiently, which is in our mutual interest. We respond to every bug report and question in a timely manner, ever improving our technical support.

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

XI

BIOGRAFIJA

1. 2. 3. 4. 5.

Prezime: Ime: Datum roenja: Nacionalnost: Brano stanje:

Nedeljkovi Miodrag 30.06.1977. Srbin Neoenjen

Kontakt adrese
Adresa: E-mail: Telefon: Mobilni telefon: 36212 Ratina, Kraljevo Mikikimi77@yahoo.com 064 1900872

Obrazovanje
Institucija: Elektro-Saobraajna tehnika kola Kraljevo Kompletna ili stepenovana diploma: Elektrotehniar pogona IV stepen

Sposobnosti Menaderske vetine: Preduzimljivost, usredsreenost na razvoj, upornost, samopouzdanje, realistinost o svojim sposobnostima, sposobnost prihvatanja kritinog miljenja, motiv za uspehom. Sopstvene vetine: Orjentisanost ka ostvarenju zadatih ciljeva, postavljanje prioriteta, preuzimanje problema na sebe i reavanje istih, komunikativnost, kreativnost, inovacije, spremnost na saradnju i rad pod stresom. Poznavanje jezika: Engleski jezik osrednje. Iskustvo sa kompjuterom: Operativni sistemi: Windows 98, 2000, XP. Programski paketi: MS Office, Active HDL, Protel 2004 (DXP). 112

You might also like