impulsno širinske (pwm) i
TRANSCRIPT
Elektronski fakultet u Nišu
Implementacija impulsno‐širinske (PWM) i impulsno‐amplitudske modulacije (PAM) korišćenjem mikrokontrolera PIC16F877
Mentor: Studenti: Prof. Dr. Mile Stojčev Miličić Nikola
Branković Dragan
SADRŽAJ 1. Impulsno‐širinska i impulsno‐amplitudska modulacija....................................1
Impulsno širinska modulacija ‐ PWM.......................... ............................................................2 Impulsno‐amplitudska modulacija ‐ PAM................................................................................5 Osnovne karakteristike PWM i PAM primopredajnika............................................................6 Struktura PWAM modulacije...................................................................................................7 Glavne osobine PWAM signala................................................................................................8 PWM Modulator.....................................................................................................................10 PAM Modulator......................................................................................................................11 2. Mikrokontroler...........................................................................................................14 Blok dijagram mikrokontrolera.................................... ..........................................................16 Osnovne karakteristike mikrokontrolera................................................................................18 Memorijska mapa mikrokontrolera........................................................................................20 Programiranje.........................................................................................................................24 3. Kompajler za mikrokontrolere................................................................................27
Instalacija MikroC‐a................................................................................................................29 Pisanje kÔda...........................................................................................................................29 USART terminal......................................................................................................................33 Ubacivanje Firmware‐a u mikrokontroler..................... ........................................................35 4. Implementacija PWAM predajnika.......................................................................36 Blok šema realizovanog PWAM predajnika.............................................................................36 Električna šema.......................................................................................................................37 5. Programski kod.............................................................................................................41 Programski kod u MikroC‐u.....................................................................................................41 Programski kod u Assembler‐u...............................................................................................47 6. LABORATORIJSKA VEŽBA ‐ Zadatak.......................................................................79
Prilog...............................................................................................................................82 Zaključak........................................................................................................................92 Literatura.......................................................................................................................93 O autorima.................................................................. .................................................94
Uvod
U ovom projektu realizovan je predajnik signala modulisanog pomoću impulsno‐širinske i impulsno‐amplitudske modulacije gde se kao ulazni podaci šalju sekvence podataka sa PC‐a preko RS‐232 komunikacije. Pošto je predviđena i nadogradnja projekta, ostavljeni su i izlazni priključci za prijemnik signala modulisanog pomoću impulsno‐širinske i impulsno‐amplitudske modulacije koji ustvari predstavlja inverzni proces tj. Izvršavaće demodulaciju tih signala.
Za pisanje koda koristili smo kompajler mikroC, a za upis koda u mikro‐kontroler koristili smo ALLPIC programator.
U prvom poglavlju biće objašnjene osnovne karakteristike PWM i PAM modulacije, sa detaljnim grafičkim objašnjenjima.
Drugo poglavlje sadrži kratak opis mikrokontrolera PIC16F877‐DIP40, s obzirom da je dosta podataka o ovom mikrokontroleru izloženo u seminarskim radovima.
U trećem poglavlju je ukratko opisan MikroC kompajler i softverski USART terminal, koji služi za komunikaciju mikrokontrolera PIC16F877‐DIP40 i PC računara.
Postupak programiranja mikrokontrolera izložen je u četvrtom poglavlju. Kao alat je korišćen MikroC.
U petom poglavlju je predstavljena implementacija PWM i PAM pomoću mikrokontrolera PIC16F877‐04 kao i način njegove upotrebe.
Šesto poglavlje je osmišljeno kao laboratoriska vežba gde bi se ustvari praktično pokazali rezultati celog projekta i videlo kako ceo sistem funkcioniše.
Na kraju bi želeli da se zahvalimo profesoru Miletu Stojčevu koji nam je omogućio da realizujemo ovakav projekat, pomogao oko nabavke potrebnih komponenata, i savetovao nas kako da rešimo probleme na koje smo nailazili u toku realizacije.
1
1. Impulsno‐širinska i implusno‐amplitudska modulacija
U komunikaciji između čipova, brzina međuveza između samih pinova mora biti srazmerna brzini i stepenu integracije samog integrisanog kola kako bi se održala velika brzina, mala cena i jednostavnost celog sistema. Da bi se postigla velika brzina prenosa podataka, mora se proširiti širina unutrašnje magistrale, povećati broj samih pinova na čipu, što samim tim povećava i dimenzije čipa. To dalje prouzrokuje i dosta problema oko samog povezivanja različitih modula na štampanoj ploči (PCB). Stoga se pristupa konceptu o prenosu više bitova preko samo jednog simbola uz pomoć modulacionih tehnika i tako se rešava većina gore pomenutih problema.
U transmisiji digitalne informacije preko komunikacionog kanala, modulator je uređaj koji mapira digitalnu informaciju u analogni signal. Jedna od dosta upotrebljivanih metoda je Impulsno‐amplitudska modulacija (PAM) koja koristi amplitude na više nivoa umesto binarnih signala, kako bi povećala brzinu prenosa. Na primer, svaka dva susedna bita u jednoj sekvenci bitova se grupišu i konvertuju u jedan od četiri moguća amplitudska nivoa, svaki nivo je dva puta duži od dužine trajanja jednog bita, zahtevajući samo polovinu opsega potrebnog za prenos u odnosu na binarnu transmisiju. Ovom PAM tehnikom se projektuju primopredajnici koji postižu brzine i do nekoliko gigabita u sekundi.
Drugi koncepti analogno‐digitalnog odmeravanja sekvence podataka su impulsno‐amplitudska modulacija (PWM), Impulsno‐fazna modulacija (PPM), Impulsno‐intenzitetska modulacija (PDM). Impulsno modulaciona tehnika je dokazana kao efikasna kako u upotrebi sa multi‐modulima, tako i sa PCB‐ovima. PPM postiže brzine od oko 160 Mb/s. Kod asinhrone kompresovane PWM modulacije, koja je u suštini modifiovana PWM modulacija, kanali za prenos podataka i takt kanali su kombinovani tako da idu preko jednog kanala čime se smanjuje ukupan broj pinova. Binarni podaci se kodiraju u impulse sa različitim širinama čime se postiže periodično povećavanje ivice tokom svakog perioda. Takt se zatim može vrlo lako izdvojiti iz signala u prijemniku korišćenjem jednostavnog PPL‐a, u poređenju sa komplikovanim tehnikama korišćenjem PAM signala.
Da bi se postigla određena brzina prenosa podataka pojednostavljenom šemom i redukcijom ukupnog broja pinova, kanali za prenos podataka i takt kanali su kombinovani tako da idu preko jednog kanala i u PWM i u PAM šemama. Ovde ćemo malo ozbiljnije razmotriti 4‐bitni PAM signal.
2
Impulsno‐širinska modulacija ‐ PWM
Impulsno širinska modulacija (skraćeno PWM) je vrsta upravljanja koja predstavlja način da se od digitalnog signala napravi signal analogne vrednosti. Odnos impuls/pauza se moduliše tako da odgovara specificiranom nivou analognog signala.
Opis impulsno širinske modulacije
PWM kontrola je moćna tehnika za upravljanje analognim kolima pomoću digitalnih izlaza. PWM je primenjena u širokom spektru aplikacija, od primene u merenjima i komunikacijama, sve do primene u kontroli snage i konverzijama električne energije u druge oblike (zvuk, mehaničku energiju .). Često se u literaturi PWM može pronaći pod imenom PWM (eng. Pulse Wide Modulation) Šta su to analogni signali i zašto se odlučuje za digitalno upravljanje pomoću PWM?
Analogni signal ima kontinualno promenljivu vrednost amplitude, kao i beskonačnu rezoluciju i po vremenskoj osi i po amplitudi. Jedan od primera analognog uređaja je baterija od 9V, pri čemu njen izlaz nije tačno 9V nego se menja u vremenu i može da uzme vrednost bilo kog realnog broja u blizini 9V. Slično i struja koja teče iz baterije nije ograničena brojem mogućih vrednosti. Analogni signali se razlikuju od digitalnog jer se kod digitalnog signala uvek uzima vrednost iz konačnog skupa predefinisanih mogućih vrednosti, kao što je npr. skup {0V,5V}.
Analogni napon i struja se mogu koristiti za direktnu kontrolu, kao što je jačina zvuka na radiju. Okretanjem potenciometra se povećava i smanjuje otpornost na krajevima potenciometra i time se proporcionalno menja i struja koja teče kroz njega. Ova promena utiče i na promenu struje koja teče kroz zvučnik pa time utiče i na jačinu zvuka.
Glavna prednost analognih kola je uglavnom jednostavnost kako to na prvi pogled izgleda. Ali izbor analognog rešenja često nije praktičan, ekonomičan i dovoljno atraktivan. Analogna kola takođe vremenom menjaju svoje osobine. Precizna analogna kola u kojima je taj problem rešen mogu biti velika i skupa. Takođe postoji problem disipacije jer je ona srazmerna naponu na krajevima kola i struji koja kroz kolo teče, pa je potrebno njegovo hlađenje. Analogna kola su takođe osetljiva na šum.
3
Digitalnom kontrolom analognih kola, cena i potrošnja se drastično mogu smanjiti. Šta više, mnogi mikrokontroleri i DSP (eng. Digital Signal Processors) već imaju implementiran generator PWM signala čime se olakšava realizacija uređaja.
Ukratko, PWM je način da se od digitalnog signala napravi signal analogne vrednosti. Odnos impuls/pauza se moduliše tako da odgovara specificiranom nivou analognog signala. PWM signal je i dalje digitalni zato što je u datom vremenskom periodu napajanje potpuno uključeno ili potpuno isključeno. Naponski ili strujni izvor se dovodi na analogno kolo putem povorke impulsa sa odgovarajućim odnosom impuls/pauza. Koristeći dovoljno usku periodu, bilo koja analogna vrednost koja upada u opseg mogućnosti izvora može se postići putem PWM signala.
Na slici 1. su prikazani PWM signali sa tri različita odnosa impuls/pauza , odnosno sa tri različita faktora ispune. Na sl. 1.a je prikazan signal sa faktorom ispune 0.1, na sl. 1.b je prikazan signal sa faktorom ispune 0.5 i na sl. 1.c je prikazan signal sa faktorom ispune 0.9. Ova tri signala reprezentuju tri vrednosti analognog signala. Ako je npr. napon napajanja 9V tada navedeni signali na svom izlazu daju vrednosti od 0.9V, 4.5V i 8.1V respektivno.
Slika 1. PWM signali sa različitim faktorima ispune
f.1.
4
f.2.
Jedan od načina primene PWM signala je prikazan na sl. 2. Prikazano je jednostavno kolo u kom se putem PWM signala upravlja prekidačem za paljenje i gašenje sijalice. U periodu kada je prekidač uključen sijalica gori, a u periodu kada je prekidač isključen sijalica je ugašena. Promenom faktora ispune PWM signala menja se period u kom sijalica gori. Ako je perioda PWM signala dovoljno mala tada se ne primeti treperenje sijalice a ako je rezolucija velika fino se može upravljati jačinom svetlosti sijalice.
Slika 2. Jednostavno kolo za upravljanje jačinom svetlosti sijalice
Primena impulsno širinske modulacije
PWM signal je našao široku primenu u mnogim oblastima. Pored prethodno navedenih tu su i primena u regulaciji napona napajanja. U regulaciji napona napajanja postižu se rezultati sa visokim koeficijentom korisnog dejstva. PWM se ponekad koristi za sintezu zvuka jer mogu da se postignu lepi efekti. Primena u audio tehnici je nova klasa audio pojačavača koja postaje sve popularnija. Zove se "klasa‐D" audio pojačavača. Ovi pojačavači proizvode PWM ekvivalent analognog ulaznog signala, koji se vodi na zvučnike putem odgovarajuće mreže filtara. Time se signal vraća na originalni audio signal. Ovi pojačavači se karakterišu visokim faktorom korisnog dejstva koji je čak i preko 90%, kao i malim prostorom i težinom u odnosu na izlaznu snagu. PWM signal se široko koristi za kontrolu brzine DC i AC motora, za upravljanje invertorima i mnogim drugim oblastima u elektronici i elektroenergetici.
5
Impulsno‐amplitudska modulacija ‐ PAM
Impulsno‐amplitudska modulacija (PAM) je metod modulacije signala u kojoj se informaciona poruka kodira po amlitudi iz serije signalnih impulsa (slika 3.). Na primer, 2‐bitni modulator (PAM‐4) uzima po 2 bita istovremeno i odmerava amplitude signala po jednom od mogućih nivoa, ‐3v, ‐1v, 1v i 3v. Mogu da budu i drugačije vrednosti napona na nivoima ali su ovi uobičajeni.
Demodulacija se vrši tako što se prvo detektuju amlitudski nivoi nosioca u svakom intervalu od jednog simbola. Impulsno‐amlitudska modulacija se dosta primenjuje u baznoj transmisiji digitalnih podataka, dok je u kod non‐baseband sistema mnogo povoljinija impulsno‐kodna modulacija.
Treba napomenuti da se danas u nekim verzijama vrlo popularnom Ethernet komunikacijskom standardu koriste isključivo PAM modulacioni signali. U Fast Ethernet (100Base‐T2) komunikaciji, na 100Mb/s koriste 5‐stepena PAM modulacija (PAM‐5) pri brzina od 25 megaimpulsa/sek, preko 2 para kablova. Specijalna tehnika se koristi kako bi se smanjila medju‐znakovna interferencija između neoklopljenih parova. Kasnije, Gigabit Ethernet standard (100Base‐T) koriste 4 para žica pri brzinama od 125megaimpulsa/sek, pa se time potižu brzine prenosa podataka i do 1000Mb/s.
Slika 3. Islustracija Impulsno‐amplitudske modulacije
6
Osnovne karakteristike PWM i PAM primopredajnika
Konvencionalni dvostepeni PAM (2‐PAM) primopredajnik konvertuje ulazne paralelne podatke i šalje ih na izlaz. Na slici 4, 2‐bitni paralelni podaci na ulazu se prosleđuju ka ulazu dvostrukom brzinom, 1/Tb. Pored toga, velika brzina prenosa u kanalu dovodi do problema sa među‐znakovnom interferencijom (ISI). Da bi se ti problemi prevazišli, upotrebljava se primopredajnik sa više nivoa. Kao primer, signali u 4‐stepenom ili 4‐PAM primopredajnik prikazani su na slici 4b. Brzina prenosa izlaznih podataka je ista kao paralelna brzina prenosa. Pošto PAM kodirani signal nema spektralnu karakteristiku na Fck, tradicionalni PLL neće proizvoditi takt signal. Kao potreba za kompleksnije analize i rekonstruisanje takta i podataka (CDR) ili vremensko obnavljanje signala. PWM modulacija je efektan način za predstavljanje informacija zbog digitalne amplitude i analognog oblika. Na slici 4c prikazan je PWM kodirani signal sa periodičnom rastućom ivicom. Zbog te periodične karakteristike znatno se pojednostavljuje dizajn CDR kola u prijemniku.
Slika 4. a) 2‐bitni, b) 4‐PAM primopredajnik c) PWM kodirani signal
7
Struktura PWAM modulacije
Na slici 5a prikazana je šema PWAM primopredajnika, gde čip A koristi 4‐bitni PWAM transmiter kako bi preneo odmerene podatke i takt preko kanala sve do čipa B koji rekonstruiše podatke i takt. Na slici 5b imamo 4‐stepeni PWM (4‐PWM) i 5‐stepeni PAM (5‐PAM) koji prenosi 4 bita podataka i sistemski takt preko kanala. PWAM kodirani signali ne mogu da postignu velike brzine zbog PAM formata ali mogu znatno da redukuju ukupan broj pinova i da obezbede lako obnavljanje takt signala uz pomoć PWM funkcije.
Slika 5. Šema PWAM primopredajnika
PWAM primopredajnik se sastoji od 2‐bitnog PWM modulatora i 2‐bitnog
PAM modulatora. PWM kodirani signal ima impulse sa 4 različite dužine. Širina impulsa je kvantovana u 4 nivoa da bi se prikazala Tx‐bit0 i Tx‐bit1. Zatim PAM
8
modulator konvertuje Tx‐bit2 i Tx‐bit3 u PWAM kodirani signal (slika 5c). Izlaz se konvertuje u 5‐stepeni PAM signal, kvantovan u 4 različita amplitudska nivoa predstavljajući Tx‐bit2 i Tx‐bit3 i jedan dodatni nivo za PWM kodirani reset na početnu vrednost (reset to initials‐RI). Talasni oblici se mogu videti 2D modulacionom tehnikom koristeći impulsnu modulaciju na x osi o amplitudsku na y osi.
Slika 6. Impulsno modulisani tal. oblici na x osi , amplitudski na y osi.
Svaki PWAM simbol nosi po jedan RI nivo za PWM signalizaciju. Pošto je
RI nivo smešten u sredini PAM signala (slika 5c), nivoi amplituda PWAM podataka su simetrični. Na slici 6 imamo ostale oblike PWAM formata koji su asimetrične prirode. Oni rezultuju većim razmkom između RI nivoa i ostalih nivoa (slika 5c). Ali PWAM format na slici 5c, je bolji i praktičniji zbog male razlike u amplitudama u odnosu na RI nivo i ima oštriju promenu nivoa i bolju ISI karakteristiku. Glavne osobine PWAM signala
Govorili smo o kodiranju binarnih podataka u impulse različitih amplituda i širina, pa ćemo sad nabrojati neke od najvažnijih osobina PWAM‐a:
1) Sa karakteristikom PWM, neophodna komponenta TAKT se umeće u kodirani signal, pa stoga, u prijemniku imamo konvencionalni PLL koji lako obnavlja takt signal ulaznih podataka, a višefazni izlaz naponski kontrolisanog oscilatora (Vco) u PLL‐u se koristi za demodulaciju PWM‐kodiranog signala.
2) Za datu brzinu, PAM šema sa više nivoa smanjuje brzinu prenosa podataka u odnosu na konvencionalni 2‐PAM sistem. Redukcija brzine smanjuje
9
ne samo ISI karakteristiku već i maksimalnu potrebnu takt frekvenciju na samom čipu. Prenošenjem više bitova u jednom vremenskom intervalu simbola, smanjuje se i potrebna širina opsega prenosnog kanala za odgovarajuću brzinu prenosa podataka, pa stoga raste efikanost celokupnog sistema.
3) U 4‐bitnoj modulacionoj tehnici, predstavljeni model 4‐bitnog PWAM odmerenog 2‐btinim PWM i 2‐bitnim PAM omogućava prenos velikim brzinama prenosa podataka, ali je to ipak manja brzina od 4‐PAM ili 8‐PAM ali je veća od klasične PWM tehnike.
4) Ukupan broj pinova se može dodatno još smanjiti prenošenjem 4‐bitnih kanala i klok kanala preko jednog prenosnog kanala propuštajući ih kroz modulacione tehnike, PAM ili PWM.
Slika 7. PWAM primopredajnik
Možda i najbitnija karakteristika čipova je cena, kompleksnost izrade (proizvodnje) i potrebna snaga (potrošnja struje).
Jedan PWAM primopredajnik je detaljno prikazan na slici 7 i sastoji se iz 3 odvojene celine (bloka): PWM modulator, PAM modulator i glavno kolo.
Delay‐locked loop (DLL) obezbeđuje prostor za klok fazu koja se koristi za PWM kodiranje signala. Posle procesuiranja Tx‐bit0 i Tx‐bit1 PWM tehnikom, informacija (Tx‐bit2 i Tx‐bit3) se propušta i kroz PAM modulator.
10
Slika 8. Mikrofotgrafski snimak PWAM primopredajnika
Prijemnik PWAM signala se sastoji od PAM i PWM demodulatora, a kompletan sistem predajnika i prijemnika PWAM signala, snimljen mikrofotgrafskom tehnikom, prikazan je na slici 8.
PWM Modulator
PWM modulator je napravljen od DLL‐a i faznog modulatora. DLL predstavjla kolo koje sinhronizuje izlazni takt sa ulaznim taktom. Sastoji se od faznog detektora (PD), transformatora, niskopropusnog filtra i 7‐stepeni VCDL. Ulazni klok Tx‐CK se sprovodi i u PD i u VCDL, dok je izlazni klok ustvari odložena verzija ulaznog kloka.
Slika 9.
11
PD detektuje faznu razliku između dva ulaza, koja se koristi za upravljanje
(kontrolu) struje u transformatoru, tako što se puni ili prazni niskopropusni filtar. VCDL je kontrolisan filtriranim kontrolnim naponom i koga se zatim prilagođeni izlazni klok vraća na PD. Tokom povratne sprege dolazi do kašnjenja signala jednog od klokova između dva ulazna signala, neposredno pred klok sinhronizaciju. DLL se koristi da bi se generisale 7‐stepene sekvence, pa se 5 faza ustvari koristi za PWM signalizaciju. U faznom kontroleru promenom fazno‐prekidačke sekvence (Slika 9) proizvodi se PWM signal. Širina impulsa zavisi od ulaznih bitova Tx‐bit0 i Tx‐bit1. Vreme aktivnog izlaza (Tx‐pwm) dobija se iz formule (n+2)/7, gde je n=0,...,3. Fazni kontroler je prikazan na slici 10.
Slika 10. PAM modulator
PAM signalizacija se koristi da bi se informacija modulovala iz Tx‐bit2 i Tx‐bit3. Na slici 8a prikazana je kompletna šema PAM modulatora, koja se sastoji od 3‐bitnog d/a konvertora (DAC) koji generiše 5 amplitudnih nivoa kako bi predstavio PAM signal.
12
Slika 11. PAM modulator (šema i dijagram oka)
Struja na izlazu 5‐PAM modulacionog kola može se izračunati iz sledećeg obrasca:
, 1
Na izlazu imamo pet nivoa za prikaz PAM funkcije. Kada je PWM na višem
nivou, izlaz se vodi na 2I, 3I, 5I i 6I preko Tx‐bit2 i Tx‐bit3. Kada se PWM signal vrati na nulu, struja na izlazu postaje 4I, što ustvari znači da se vratio u default nivo signala. Referentna struja I se generiše preko Vr/(4R). Opterećenje elemenata se smanjuje određenom vrednošću R u samom kanalu. PAM kodirana stanja su prikazana na slici 8b. Pošto je vrednost ∆V jednaka IR npr. za Vr/4, IR nivo postaje Vr, što predstavlja referentni napon, koji može da se podešava.
Pojednostavljeni vremenski dijagram oka PAM kolaprikazan je na slici 11. Neophodno je predstaviti vremenski interval ∆t, koji se definiše kao vremenska razlika između početka svakog bita u Tx‐bit2 i Tx‐bit3 pa sve do pozitivne ivice Tx‐PWM signala. Ako je ∆t negativno ili veće od t1, kako je prikazano na slici 8b, PWM kolo ne može da dekodira izlazni signal. Zapažamo i to da je t2 ekvivalentan (2/7)Tck, koji je lociran na nekom nižem nivou Tx‐PWM. Da bi se izbegao ovaj problem, vreme okidanja sistemskog kloka dolazećih podatak Tx‐
13
bit2 i Tx‐bit3 trebalo bi da se nađu blizu t1 tj. ∆t<t1, kao što je prikazano na slici 11. Drugačiji pristup otkrivanja ovakvog problema može se videti na slici 10. Digitalni podaci su sinhronizovani fazom Φo, koja je u fazi sa sistemskim klokom, gde se rastuća ivica PWM signala okida fazom Φ1. Ovo garantuje da je vremenska razlika ∆t ekvivalentna Tck/7 i manja od t1, pa stoga PAM kolo može bez grešaka generisati PWAM kodirane signale.
14
2. Mikrokontroler
PIC16F877 je 8‐bitni mikrokontroler kompanije Microchip izrađen u CMOS tehnologiji, a takođe je baziran na flash tehnologiji. Programska memorija čipa je EEPROM.
RISC arhitektura omogućuje odvojene magistrale za 8‐bitne podatake i 14‐bitne magistrale za programsku memoriju, time se omogućuje da se u toku izvršvanja jedne instrukcije pribavi naredna, protočno se izvršavaju naredbe (pipelining) . Za sve instrukcije potreban je isti vremenski period (osim kada u programu postoji grananje) i izvrše se u toku šetiri takta oscilatora.
Mikrokontroler se pakuje u 40‐pinsko (DIP) ili u 44‐pinska kućišta (QFP i PLCC) kao sto je prikazano na slikama (a) DIP‐40 b) PLCC‐44 c) TQFP‐44 ).
16
Blok dijagram mikrokontrolera
Sa blok dijagrama kojeg daje proizvođač (Slika 13 ) može se ustanoviti da se koncepcija ovog mikrokontrolera ne razlikuje mnogo od koncepcije RISC mikrokontrolera drugih proizvođača prisutnih na tržištu. Uočavaju se standardne komponente:
• Flash programska memorija – 8 kiloreči obima 14 bita • RAM (File Registers) – 368 bajtova • Aritmetičko‐logička jedinica (ALU) • Akumulator (Working Register) • Hardverski magacin (Stack) organizivan u 8 nivoa • EEPROM memorija podataka obima 256 bajtova • Višekanalni A/D konvertor, USART (univerzalni sinhroni i asinhroni primo‐predajnik), tajmere, portove itd.
PIC16F877 podržava tehniku prekida (eng. interrupts). Postoji ukupno 14 izvora prekida, što spoljašnjih, što unutrašnjih. Svaki prekid nema sopstveni interapt‐vektor, već postoji jedinstvena adresa (0x0004) od koje se nastavlja izvršavanje programa kada se dogodi bilo koji od njih. Tada je na programeru da prozivanjem zastavica/markera pojedinih prekida (eng. interrupt flags polling) ustanovi ko traži prekid i uputi program na izvršavanje odgo‐varajuće rutine za obradu. Adresa na koju se program treba vratiti po obradi prekida čuva se automatski u hardverskom magacinu i u programski brojač vraća izvršavanjem instrukcije RETFIE.
18
Osnovne karakteristike mikrokontrolera
Osnovna karakteristika koja mikrokontrole izdvaja od ostalih procesora jeste prisustvo raznih specijalnih kola koja se trebaju izboriti sa potrebama izvršavanja aplikacija u realnom vremenu ( real‐time aplikacija). Ovaj mikrokontroler poseduje niz osobina potrebnih da se maksimizuje pouzdanost sistema, minimizuje cena kroz eliminaciju eksternih komponenti, da se omoguće režimi niske potrošnje energije, pružanje zaštite programskog kôda. Upotreba navedenih resursa definiše se u programatorskom sostveru upisom odgovarajuće konfiguracione reči u registar CONFIG. Taj registar je dostupan samo u toku upisa programa u mikrokontroler i drugačije se ne može adresirati.
Među ponuđenim karakteristikama postoji mogućnost izbora četiri tipa oscilatora, mogućnost upotrebe Power‐up (PWRT) i Start‐up (OST) tajmera, i eventualno korišćenje Power‐on (POR) i/ili Brown‐out (BOR) reseta. Povećanje pouzdanosti kroz sprečavanje zalaska programa u mrtve petlje pomaže upotreba Watchdog tajmera (WDT). Zaštitu kôda od neželjenog čitanja pruža opcija code protection.
Ostale karakteristike:
• RISC mikroprocesor visokih performansi • 35 instrukcija obima jedne reči • Radna frekvencija do 20 MHz • Trajanje taktnog intervala 200 ns, pri frekvenciji 20 MHz • Opkôd obima 14 bita • Harverski magacin sa osam nivoa • Tri načina adresiranja (direktno,indirektno i relativno) • Programska flash memorija kapaciteta 8 k X 14‐bitnih reči • 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č_događaja ‐ Timer1 (TMR1): 16‐bitni tajmer/brojač_događaja ‐ Timer2 (TMR2): 8‐bitni tajmer/brojač_događaja • 10‐bitni 8‐kanalni analogno‐digitalni (A/D) konvertor • Serijska komunikacija: MSSP, USART • Paralelna komunikacija: PSP
19
• Power‐on Reset ‐ reset pri uključenju napajanja (POR) • Power‐up timer ‐ unošenje kašnjenja nakon uključenja napajanja (PWRT) • Oscillator Start‐up Timer ‐ unošenje kašnjenja nakon stabilizovanja radne frekvencije oscilatora (OST) • Sleep mode ‐ režim rada sa malim utroškom energije • Watchdog tajmer sa sopstvenim integrisanim RC oscilatorom za nezavisni rad • Izbor tipa oscilatora • Radni napon od 2V do 5.5V • Mala potrošnja energije:
‐0.6 mA pri naponu od 3V i radnoj frekvenciji od 4 MHz 20µA pri naponu od 3V i radnom taktu od 32kHz ‐1µA u standby režimu rada.
Napajanje se dovodi na pinove VDD, a masa na pinove VSS. Nožice
OSC1 i OSC2 služe za priključenje oscilatorskih komponenti (RC‐kolo ili rezonator), odnosno priključenje eksternog oscilatora kao bolje, ali skuplje varijante. Osim za reset‐kolo pin 1 (MCLR/VPP) ima ulogu u toku procesa programiranja mikrokontrolera. Ostalih 33 pina predstavljaju I/O linije. Oni su grupisani u pet portova (PORT A, B, C, D i E) i svaki od njih je individualno konfigurabilan kao izlazni ili kao ulazni. Osim opšte namene, većina pinova ima i specifičnu svrhu koja se programski dodeljuje u slučaju korišćenja nekih specijalnih periferija mikrokontrolera (Slika 13) (brojača, serijske komuni‐kacije, A/D konvertora i dr.)
Na kraju ovog uvoda treba napomenuti da su Microchip PIC mikrokontroleri dominantni u odnosu na konkurentne relativno visokom strujom koju može propustiti I/O pin (25 mA). Takođe, ova familija mikrokontrolera poseduje veoma širok opseg napona napajanja koji se proteže od 2,0 V do 5,5 V
20
Memorijska mapa mikrokontrolera Strukturu memorije kod PICmicro™ mikrokontrolera čine tri odvojena
bloka:
• Programska memorija • Memorija podataka • EEPROM memorija podataka.
Odvojeno od navedenih memorijskih blokova egzistira zasebna struktura
magacin (stack), koja se sastoji od osam 13‐bitnih registara. Stek pointer se ne može čitati i upisivati. Prilikom izvršenja instrukcije CALL ili prilikom poziva prekida mikrokontrolera, adresa sledeće instrukcije se stavlja na magacin. Ponovno vraćanje starog sadržaja programskog brojača izaziva izvršenje instrukcije RETURN, RETFIE ili RETLW. Magacin radi na principu cirkularnog bafera, što znači da se u njega može staviti osam različitih adresa, a da pokušaj unošenja devete izaziva brisanje prve i tako redom. Programski se ne može utvrditi da li je došlo do prepunjavanja magacina.
Organizacija programske memorije
PIC16F877 mikrokontroleri imaju 13‐bitni programski brojač (PC) koji je može da adresira memorijski prostor od 8k programskih reči od 14 bita. Reset vektor je 0x0000 i od njega počinje izvršavanje programa. Interapt vektor je 0x0004. Mapa programske memorije i magacin prikazani su dijagramom na Slici 14
21
Slika 14 Mapa programske memorije Organizacija memorije podataka
Memorija za podatke je izdeljena u više celina banki (eng. banks), a sastoji se od registara opšte 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 služe za odabir željene banke podataka po principu (Slika 15):
Slika 15. Izbor željene banke preko bitova RP0 i RP1
22
Slika 16. Mapa registara mikrokontrolera Svaka banka može da sadrži do 128 registara (0x7F). Niže lokacije u
banci zauzimaju specijalni registri, a ostatak prostora popunjavaju registri opšte namene implementirani kao statički RAM. Neki specijalni registri koji se često koriste mapirani su u sve banke da bi se omogućio brži pristup i redukcija kôda.
Mapa registara procesora PIC16F877A prikazana je na Sliki 16. Nekoliko specijalnih registara su registri jezgra, usko povezani sa funkcionisanjem CPU. Ostali registri su vezani za periferne module i služe njihovom upravljanju i kontroli statusa.
23
Opis nekoliko najvažnijih i najčešće korišćenih registara jezgra:
‐ Programski brojač (PC) određuje adresu instrukcije u programskom flešu koja će sledeća biti pribavljena. Reč je o 13‐bitnom registru. Simboličko ime nižeg bajta je PCL. To je registar koji se može i upisivati i iščitavati. Težih pet bita programskog brojača smešteni su u izolovani registar PCH kojem se pristupa samo preko leča PCLATH mapiranom u internom RAM‐u na adresi 0x0A.
‐ STATUS registar je veoma bitan i zato je predviđeno da se može adresirati iz bilo koje banke. On pokazuje status aritmetičko‐logičke jedinice, reset status mikrokontrolera i sadrži bite za selekciju banki internog RAM‐a. Od navedenih flegova posebno treba izdvojiti Zero
bit (Z) koji se postavlja kad je rezultat aritmetičke operacije jednak nuli i bit prenosa (eng. Carry ‐ C).
‐ Registar OPTION_REG se koristi za konfiguraciju preskalera za tajmer 0 ili Watchdog, za upravljanje tajmerom 0, selekciju ivice okidanja eksternog interapta, te za omogućenje Pull‐up otpornika na portu B.
‐ INTCON je registar za manipulisanje sistemom prekida mikrokontrolera. Pored bita za omogućenje svih prekida (GIE) i bita za omogućenje perifernih prekida (PEIE), u ovom registru su interapt‐flegovi i biti omogućenja prekida tajmera 0, spoljašnjeg prekida na pinu RB0/INT i prekida porta B na promenu stanja. Osim ova tri osnovna prekida postoji još 11 periferijskih prekida. Bitovi za njihovo omogućenje nalaze se u registrima PIE1 i PIE2, a korespondentni flegovi, vesnici interapta, u registrima PIR1 i PIR2. Ovi se flegovi setuju čim se ispuni uslov interapta bez obzira na stanje njihovog bita omogućenja, a po izvršenju servis rutine potrebno ih je sostverski resetovati.
‐ Kada je reč o registrima jezgra ne treba zaboraviti par FSR (File Select Register) i INDF (Indirect File), koji služe za indirektno adresiranje memorije podataka. Bilo koja instrukcija koja se obraća INDF registru, u stvari, indirektno pristupa onoj lokaciji internog RAM‐a čija je adresa trenutno u registru FSR.
‐ Konačno, treba spomenuti registar PCON (Power Control Register). U PIC16F877 ovaj registar sadrži samo dva bita. Pomoću bita POR detektuje se razlika između Power‐on reseta i reseta izazvanih drugim uzrokom. Drugi bit (BOR) služi kao indikacija Brown‐out stanja (nedozvoljeni naponski nivoi u napajanju mikrokontrolera), zbog kojeg se takođe može desiti reset.
24
Programiranje Set instrukcija
Harvardska RISC arhitektura procesora ima samo 35 instrukcija. One su 14‐bitne i sastoje se od operacionog kôda i jednog ili više operanada. Slika 17 prikazuje opšti format implementiranih instrukcija, a kompletan pregled seta instrukcija daje Tabela 1. Instrukcije su podeljene u tri kategorije:
• Byte‐oriented (operacije sa čitavim registrima), • Bit‐oriented (operacije sa pojedinim bitovima), • Literal & Control (operacije sa konstantama i upravljačke).
Slika 17. Format instrukcije
Izvršavanje svake instrukcije traje jedan mašinski ciklus, osim kod grananja programa. Kod potvrdnog odgovora u nekom testu, pribavljena instrukcija se proglašava nevažećom i traži se nova, što rezultuje trajanjem od dva mašinska ciklusa. Dok se tokom drugog ciklusa pribavlja nova instrukcija, praktično se izvršava naredba NOP.
25
Jedan mašinski ciklus traje četiri perioda oscilatora, što garantuje njegovu dužinu od 1µs pri frekvenciji oscilatora od 4 MHz.
Tabela 1. Set instrukcija mikrokontrolera Napomene: 1. Kada se vrši modifikacija I/O registra, a u instrukciji se koristi prethodno njegovo stanje (npr.MOVF PORTB,1), kao operand se koristi stanje pročitano sa pinova porta. Tako je moguće da se u leč pina konfigurisanog kao ulaz i postavljenog na nulu preko spoljašnjih elektronskih komponenti, posle izvršenja instrukcije upiše nula.
26
2. Ako se ova instrukcija izvrši nad registrom TMR0 (i ako je d=1, gde je to moguće), preskaler će biti resetovan, ako je dodeljen tajmerskom modulu. 3. Ako je modifikovan programski brojač (PC) ili je rezultat logičkog testa pozitivan, za izvršenje instrukcije biće potrebna dva mašinska ciklusa. U drugom ciklusu praktično se izvršava naredba NOP (No operation).
27
3. Kompajler za mikrokontrolere
MikroC je alat koji služi za pisanje kôda za Microchip‐ove PIC mikrokontrolere. Programer na jednostavan način kontroliše proces programiranja i pravi kvalitetan firmware za mikrokontroler.
Osnovne karakteristike MikroC‐a su:
• Pisanje C kôda korišćenjem kvalitetnog i preglednog editora, što se ogleda u automatskoj kontroli i upozorenjima vezanim za sintaksu kôda, korišćenih para‐metara, kao i automatskoj korekciji pojedinih grešaka
• Preglednost strukture programa (kôda), promenljivih i funkcija omogućava Code explorer
• Jasan asemblerski kôd i standardna kompatibilnost generisanih HEX datoteka toka programa preko ugrađeg debagera (debugger)
• Programer ima na raspolaganju veliki broj integrisanih biblioteka i rutina, koje značajno ubrzavaju pisanje programa
• Detaljan izveštaj i grafičko predstavljanje RAM i ROM mape, statistike kôda i slično.
MikroC, doduše, odstupa od ANSI standarda koja su načinjena u cilju da
se olakša programiranje,kao i zbog hardverskih ograničenja PIC mikrokontrolera.
Specifičnost MikroC‐a: • Rekurzivne funkcije (function recursion) su podržane sa izvesnim
ograničenjima, koja su posledica nešto složenijeg pristupa magacinu (stack) i ograničenja vezana za memoriju
• Pokazivači (pointers) promenljivih i pokazivači konstanti nisu kompatibilni, tj. nije moguća međusobna dodela ili upoređivanje
• mikroC tretira označavanje const kao “true constans” (kod C++), što omogućava korišćenje const objekta na mestima gde ANSIC očekuje constant izraz .Ukoliko se teži ka prenosivosti programa, treba koristiti tradicionalno pretprocesorsko definisanje konstanti
28
• mikroC dozvoljava C++ stil jednolinijskih komentara, koristeći dve kose crte (//). Komentar može da počne bilo gde i traje do sledeće nove linije programskog kôda
• Brojne standardne C biblioteke (ctype, math, stdlib, string ) implementirane su u mikroC, uz individualna odstupanja.
MikroC podržava gotovo sve PIC mikrokontrolere serija 12, 16 i 18.
Izuzetak su jedino mikrokontroleri koji poseduju staro hardversko jezgro, kao na primer PIC12C50x, PIC12F50x, itd.
U realizaciji ovog seminarskog rada korišćen je softverski alat mikroC koji
je delo firme Mikroelektronika iz Beograda. Inače, ograničena verzija (do 2KB programa) može da s preuzme sa sajta
beogradske Mikroelektronike (www.mikroe.com). Za punu verziju programa, treba platiti licencu koja iznosi 250$ i važi samo za jedan računar.
29
Instalacija MikroC‐a
Instalacija programa traje 30‐ak sekundi (treba samo pratiti ponuđene opcije i pritiskati komandno dugme Next). Posle instalacije treba pokrenuti mikroC, a to se najjednostavnije ostvaruje klikom na ikonicu: Pisanje kÔda
Postupak pisanja kôda u mikroC‐u (Slike 18 do 24) i generisanje fajlova posle prevođenja (kompilacije/kompajliranja) biće objašnjeno na sledećim stranama. Slike dovoljno jasno ilustruju ceo proces, a komentari se nalaze ispod slika.
Slika 18. Kreiranje novog projekta preko opcije Project → New Project
30
Slika 19. Podešavanje parametara projekta (naziv mikrokontrolera, takta, reseta...)
Slika 20. U editoru treba napisati program (kôd) mikrokontrolera
31
Slika 21. U editor je unet neki program
Slika 22. Prevođenje programa preko komande Project → Build
32
Slika 23. Izgled prozora posle prevođenja sa izveštajem (Messages)
Slika 24. Posle prevođenja (kompilacije/kompajliranja) generiše se nekoliko fajlova: asemblerski kôd (ASM), heksadecimalni kôd (HEX), izveštaji itd.
33
USART terminal
Pokretanje internog softverskog terminala mikroC‐a koji se koristi za komunikaciju računara i mikrokontrolera ostvaruje se na sledeći način:
Tools → USART Terminal
Slika 25. Izgled prozora kod USART komunikacionog terminala Kao što se vidi, moguće je podesiti veći broj parametara. Navešćemo samo najvažnije:
• Serijski port (u padajućem meniju treba izabrati željeni serijski port, a kod standardnih računara to su COM1 i COM2) • Brzina prenosa (za frekvenciju kvarca od 4MHz treba izabrati 2400 bauda, dok za 8MHz bira se 9600 bauda itd.) • Broj stop bitova (1, 1.5 i 2) • Izbor parnosti (bez, parna, neparna itd.) • Broj bitova koji čine karakter (5, 6, 7 ili 8)
34
• Uključivanje/isključivanje handshaking signala (RTS i DTR) • Izbor formata podatka koji se šalje (ASCII, heksadecimalni ‐ HEX ili dekadni ‐ DEC) • Način slanja (odmah po kucanju ili kada se klikne na opciju SEND) itd.
Kada se podese parametri, terminal se startuje klikom na komandno dugme Connect.
Slika 26. Izgled prozora softverskog USART terminala kada je pokrenut
Odmah zatim, terminal je spreman da prihvati komande (vidi Sliku 26). Kada se završi komunikacija, treba kliknuti na komandno dugme Disconnect.
35
Ubacivanje Firmware‐a u mikrokontroler
Heksadecimalni kôd koji je dobijen iz kompilatora/kompajlera je «razumljiv» mikrokontroleru i u njega se upisuje preko programatora.
Ovde je korišćen programator AllPIC o kojem je dat kompletan članak u poglavlju Prilog. Zbog toga se ovde nećemo baviti njegovim opisom.
36
4. Implementacija PWAM predajnika Blok šema realizovanog PWAM predajnika
Na Slici 27. je prikazana blok šema PWAM predajnika realizovanog preko mikrokontrolera PIC16F877 i operacionog pojačavača LF353.
Slika 27. Blok šema PWAM predajnika realizovanog pomoću mikrokontrolera
Na Slici 28. je prikazana električna šema PWAM predajnika realizovanog
preko mikrokontrolera PIC16F877 i operacionog pojačavača LF353. Mikrokontroler PIC16F877 radi na frekvenciji od 4Mhz. Pošto se koristi transformator bez srednje tačke, za formiranje vrši se
jednostrano usmeravanje/ ispravljanje i pozitivnog i negativnog napona. Oba napona se stabilizuju preko regulatora napona 7805 i 7905, respektivno.
Komunikacija mikrokontrolera sa PC računarom se ostvaruje preko interfejsnog kola MAX232. Pomenuta komunikacija je bez handshaking‐a.
37
C5
100uF
C6
100nF
C1
330uF
D1
1N4002
C2
100nF
MCLR1
PA02
PA13
PA24
PA35
PA46
PA57
RD8
WR9
PC217
PD2 21PD3 22PC4 23PC5 24PC6 25PC7 26PD4 27PD5 28PD6 29PD7 30CS10
VDD11
VSS12
OSC113
OSC214
PC015
PC116
PC318
PD019
PD120
VSS 31VDD 32PB0 33PB1 34PB2 35PB3 36PB4 37PB5 38PB6 39PB7 40IC3
PIC16F877-04
C14
27pF
C15
27pF
Y1
4MHz
SW1
SW2
C1+1 Vcc 16
V+2 Gnd 15
C1-3 T1out 14
C2+4 R1in 13
C2-5 R1out 12
V-6 T1in 11
T2out7 T2in 10
R2in8 R2out 9
IC4
MAX232
162738495
CN2
DB9/F
C12
100nF
C1110
0nF
C9
100nF
C10
100n
F
C13220nF
Vin1
Gnd
2
Vout 3IC1
LM7805
1 2 3 4 5 6 7 8
9
RN1
8x10K
SW3
Vin1
Gnd
2
Vout 3
IC2
LM7905
C3
330uF
D2
1N4002
C4
100nF
C7
100uF
C8
100nF
1234
8765
S1
R8
10K
R5
6.8K
R6
10K R3 27K
R2 10KR1 10K
OutAA-A+V- B+
B-OutB
V+
IC5
LF353
R4 27K
Q2
2N3906
Q1
2N3906R9
10K
R7
10K
1 2 3 4 5
CN3
12
JP1
TRAFO
15V~
Na Slici je ilustrovan raspored komponenti na štampanoj ploči. Napominjemo kako su električna šema i štampana ploča (PCB) dizajnirani u programu PROTEL 99 SE.
Na izlazu operacionog pojačavača formiraju se naponi ‐2ΔV, ‐ ΔV, 0, ΔV i 2ΔV, zavisno od toga koji se signal prenosi.
U formiranju PWAM signala učestvuju 2 bita za PAM i 2 bita za PWM modulaciju – kada je signal dozvole aktivan.
Električna šema
Slika 28. Električna šema PWAM predajnika realizovanog pomoću mikrokontrolera
39
Slika 29. Štampana ploča (PCB) PWAM predajnika realizovanog pomoću mikrokontrolera
Slika 29a. Finalna realizacija PWAM predajnika
41
Programski kod u mikroC‐u unsigned short i = 0, j = 0, k = 0, l = 0; unsigned short m = 0, n = 0, t = 0, o = 0, q = 0; void main() { // Definisanje // pinova PORTA TRISB = 0x00; PORTB = 0b01100000; TRISD = 0x00; PORTD = 0x00; TRISA = 0b111111; ADCON0 = 0; // Definisanje digitalnih signala A porta ADCON1 = 6; Usart_Init(2400); // Inicijalizacija USART modula // (8 bita, 2400 bauda) do { // Otvaranje beskonacne petlje j.F0 = PORTA.F4; j.F1 = PORTA.F5; if (Usart_Data_Ready()) { i = Usart_Read(); // Citanje primljenog podatka Usart_Write(i); // Slanje poslatog podatka
42
k.F1 = i.F7; // Razbijanje 8‐bitne reci na k.F0 = i.F6; // 2‐bitne reci l.F1 = i.F5; l.F0 = i.F4; m.F1 = i.F3; m.F0 = i.F2; n.F1 = i.F1; n.F0 = i.F0; if (PORTA.F2 == 1) { o = j+1; PORTB.F7 = !k.F1; PORTB.F6 = !k.F1&&!k.F0; PORTB.F5 = !k.F0; delay_ms(1); PORTB.F4 = 1; Vdelay_ms(o); PORTB.F4 = 0; PORTB.F7 = !l.F1; PORTB.F6 = !l.F1&&!l.F0; PORTB.F5 = !l.F0; delay_ms(1); PORTB.F4 = 1; Vdelay_ms(o); PORTB.F4 = 0; PORTB.F7 = !m.F1; PORTB.F6 = !m.F1&&!m.F0; PORTB.F5 = !m.F0; delay_ms(1);
43
PORTB.F4 = 1; Vdelay_ms(o); PORTB.F4 = 0; PORTB.F7 = !n.F1; PORTB.F6 = !n.F1&&!n.F0; PORTB.F5 = !n.F0; delay_ms(1); PORTB.F4 = 1; Vdelay_ms(o); PORTB.F4 = 0; PORTB.F7 = 0; PORTB.F6 = 1; PORTB.F5 = 1; } if (PORTA.F2 == 0) { o = l+1; q = n+1; PORTB.F7 = !k.F1; PORTB.F6 = !k.F1&&!k.F0; PORTB.F5 = !k.F0; delay_ms(1); PORTB.F4 = 1; Vdelay_ms(o); PORTB.F4 = 0;
44
PORTB.F7 = !m.F1; PORTB.F6 = !m.F1&&!m.F0; PORTB.F5 = !m.F0; delay_ms(1); PORTB.F4 = 1; Vdelay_ms(q); PORTB.F4 = 0; PORTB.F7 = 0; PORTB.F6 = 1; PORTB.F5 = 1; } } if (PORTA.F0 == 0) { // Na pritisak tastera generise // se testna PWAM sekvenca PORTB = 0b11100000; delay_ms(1); PORTB = 0b00100000; delay_ms(1); PORTB = 0b00000000; delay_ms(1); PORTB = 0b10000000; delay_ms(1); PORTB = 0b01100000; delay_ms(4);
45
PORTB = 0b11100000; delay_ms(2); PORTB = 0b00100000; delay_ms(2); PORTB = 0b00000000; delay_ms(2); PORTB = 0b10000000; delay_ms(2); PORTB = 0b01100000; delay_ms(4); PORTB = 0b11100000; delay_ms(3); PORTB = 0b10000000; delay_ms(3); PORTB = 0b00100000; delay_ms(3); PORTB = 0b00000000; delay_ms(3); PORTB = 0b01100000; delay_ms(4); PORTB = 0b00000000; delay_ms(4); PORTB = 0b10000000; delay_ms(4); PORTB = 0b11100000; delay_ms(4);
46
PORTB = 0b00100000; delay_ms(4); PORTB = 0b01100000; delay_ms(4); } } while (1); // Kraj beskonacne petlje }//~!
47
Programski kod u Assembler‐u ; ASM code generated by mikroVirtualMachine for PIC ‐ V. 6.2.1.0 ; Date/Time: 15.7.2008 17:11:14 ; Info: http://www.mikroelektronika.co.yu ; ADDRESS OPCODE ASM ; ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ $0000 $2906 GOTO _main $0004 $ _Mul_32x32_U: $0004 $1303 BCF STATUS, RP1 $0005 $1283 BCF STATUS, RP0 $0006 $3022 MOVLW 34 $0007 $00FC MOVWF STACK_12 $0008 $01F8 CLRF STACK_8 $0009 $01F9 CLRF STACK_9 $000A $01FA CLRF STACK_10 $000B$01FB CLRF STACK_11 $000C $ _NEXT: $000C $03FC DECF STACK_12, F $000D $1903 BTFSC STATUS, Z $000E $283A GOTO _EXIT2 $000F $1003 BCF STATUS, C $0010 $ _LOOP: $0010 $0CFB RRF STACK_11, F $0011 $0CFA RRF STACK_10, F $0012 $0CF9 RRF STACK_9, F $0013 $0CF8 RRF STACK_8, F $0014 $0CF3 RRF STACK_3, F $0015 $0CF2 RRF STACK_2, F $0016 $0CF1 RRF STACK_1, F $0017 $0CF0 RRF STACK_0, F $0018 $1C03 BTFSS STATUS, C $0019 $280C GOTO _NEXT $001A $03FC DECF STACK_12, F $001B$1903 BTFSC STATUS, Z $001C $282C GOTO _EXIT1 $001D $0874 MOVF STACK_4, W
48
$001E $07F8 ADDWF STACK_8, F $001F $0875 MOVF STACK_5, W $0020 $1803 BTFSC STATUS, C $0021 $0F75 INCFSZ STACK_5, W $0022 $07F9 ADDWF STACK_9, F $0023 $0876 MOVF STACK_6, W $0024 $1803 BTFSC STATUS, C $0025 $0F76 INCFSZ STACK_6, W $0026 $07FA ADDWF STACK_10, F $0027 $0877 MOVF STACK_7, W $0028 $1803 BTFSC STATUS, C $0029 $0F77 INCFSZ STACK_7, W $002A $07FB ADDWF STACK_11, F $002B$2810 GOTO _LOOP $002C $ _EXIT1: $002C $0874 MOVF STACK_4, W $002D $07F8 ADDWF STACK_8, F $002E $0875 MOVF STACK_5, W $002F $1803 BTFSC STATUS, C $0030 $0F75 INCFSZ STACK_5, W $0031 $07F9 ADDWF STACK_9, F $0032 $0876 MOVF STACK_6, W $0033 $1803 BTFSC STATUS, C $0034 $0F76 INCFSZ STACK_6, W $0035 $07FA ADDWF STACK_10, F $0036 $0877 MOVF STACK_7, W $0037 $1803 BTFSC STATUS, C $0038 $0F77 INCFSZ STACK_7, W $0039 $07FB ADDWF STACK_11, F $003A $ _EXIT2: $003A $0008 RETURN $003B$ _Usart_Data_Ready: $003B$3000 MOVLW 0 $003C $1303 BCF STATUS, RP1 $003D $1283 BCF STATUS, RP0 $003E $1A8C BTFSC PIR1, 5 $003F $3001 MOVLW 1 $0040 $00F1 MOVWF STACK_1 $0041 $0871 MOVF STACK_1, 0 $0042 $00F0 MOVWF STACK_0
49
$0043 $0008 RETURN $0044 $ _Usart_Read: $0044 $1303 BCF STATUS, RP1 $0045 $1283 BCF STATUS, RP0 $0046 $081A MOVF RCREG, 0 $0047 $00A6 MOVWF Usart_Read_tmp_L0 $0048 $1C98 BTFSS RCSTA, 1 $0049 $284C GOTO L_Usart_Read_2 $004A $1218 BCF RCSTA, 4 $004B$1618 BSF RCSTA, 4 $004C $ L_Usart_Read_2: $004C $0826 MOVF Usart_Read_tmp_L0, 0 $004D $00F0 MOVWF STACK_0 $004E $0008 RETURN $004F $ _Usart_Write: $004F $ L_Usart_Write_3: $004F $3000 MOVLW 0 $0050 $1303 BCF STATUS, RP1 $0051 $1683 BSF STATUS, RP0 $0052 $1898 BTFSC TXSTA, 1 $0053 $3001 MOVLW 1 $0054 $00F1 MOVWF STACK_1 $0055 $0871 MOVF STACK_1, 0 $0056 $3A00 XORLW 0 $0057 $1D03 BTFSS STATUS, Z $0058 $285B GOTO L_Usart_Write_4 $0059 $0000 NOP $005A $284F GOTO L_Usart_Write_3 $005B$ L_Usart_Write_4: $005B$1283 BCF STATUS, RP0 $005C $0826 MOVF FARG_Usart_Write+0, 0 $005D $0099 MOVWF TXREG $005E $0008 RETURN $005F $ _VDelay_ms: ;delays.c,68 :: void VDelay_ms(unsigned Time_ms){ ;delays.c,70 :: NumberOfCyc = Clock_KHz()>>2; // this will be done by compiler, no asm will be genereated except that for assignment; $005F $30E8 MOVLW 232 $0060 $1303 BCF STATUS, RP1 $0061 $1283 BCF STATUS, RP0
50
$0062 $00A8 MOVWF VDelay_ms_NumberOfCyc_L0 $0063 $3003 MOVLW 3 $0064 $00A9 MOVWF VDelay_ms_NumberOfCyc_L0+1 $0065 $01AA CLRF VDelay_ms_NumberOfCyc_L0+2 $0066 $01AB CLRF VDelay_ms_NumberOfCyc_L0+3 ;delays.c,71 :: NumberOfCyc *= Time_ms; $0067 $0826 MOVF FARG_VDelay_ms+0, 0 $0068 $00F0 MOVWF STACK_0 $0069 $0827 MOVF FARG_VDelay_ms+1, 0 $006A $00F1 MOVWF STACK_0+1 $006B$01F2 CLRF STACK_0+2 $006C $01F3 CLRF STACK_0+3 $006D $30E8 MOVLW 232 $006E $00F4 MOVWF STACK_4 $006F $3003 MOVLW 3 $0070 $00F5 MOVWF STACK_4+1 $0071 $3000 MOVLW 0 $0072 $00F6 MOVWF STACK_4+2 $0073 $3000 MOVLW 0 $0074 $00F7 MOVWF STACK_4+3 $0075 $2004 CALL _mul_32x32_u $0076 $0870 MOVF STACK_0, 0 $0077 $00A8 MOVWF VDelay_ms_NumberOfCyc_L0 $0078 $0871 MOVF STACK_0+1, 0 $0079 $00A9 MOVWF VDelay_ms_NumberOfCyc_L0+1 $007A $0872 MOVF STACK_0+2, 0 $007B$00AA MOVWF VDelay_ms_NumberOfCyc_L0+2 $007C $0873 MOVF STACK_0+3, 0 $007D $00AB MOVWF VDelay_ms_NumberOfCyc_L0+3 ;delays.c,72 :: if (NumberOfCyc < 690) $007E $3000 MOVLW 0 $007F $0273 SUBWF STACK_0+3, 0 $0080 $1D03 BTFSS STATUS, Z $0081 $288C GOTO L_VDelay_ms_5 $0082 $3000 MOVLW 0 $0083 $0272 SUBWF STACK_0+2, 0 $0084 $1D03 BTFSS STATUS, Z $0085 $288C GOTO L_VDelay_ms_5 $0086 $3002 MOVLW 2
51
$0087 $0271 SUBWF STACK_0+1, 0 $0088 $1D03 BTFSS STATUS, Z $0089 $288C GOTO L_VDelay_ms_5 $008A $30B2 MOVLW 178 $008B$0270 SUBWF STACK_0, 0 $008C $ L_VDelay_ms_5: $008C $1803 BTFSC STATUS, C $008D $288F GOTO L_VDelay_ms_2 ;delays.c,73 :: return; $008E $0008 RETURN $008F $ L_VDelay_ms_2: ;delays.c,74 :: NumberOfCyc ‐= 690; $008F $30B2 MOVLW 178 $0090 $00F0 MOVWF STACK_0 $0091 $3002 MOVLW 2 $0092 $00F1 MOVWF STACK_0+1 $0093 $01F2 CLRF STACK_0+2 $0094 $01F3 CLRF STACK_0+3 $0095 $0828 MOVF VDelay_ms_NumberOfCyc_L0, 0 $0096 $00F4 MOVWF STACK_4 $0097 $0829 MOVF VDelay_ms_NumberOfCyc_L0+1, 0 $0098 $00F5 MOVWF STACK_4+1 $0099 $082A MOVF VDelay_ms_NumberOfCyc_L0+2, 0 $009A $00F6 MOVWF STACK_4+2 $009B$082B MOVF VDelay_ms_NumberOfCyc_L0+3, 0 $009C $00F7 MOVWF STACK_4+3 $009D $0870 MOVF STACK_0, 0 $009E $02F4 SUBWF STACK_4, 1 $009F $0871 MOVF STACK_0+1, 0 $00A0 $1C03 BTFSS STATUS, C $00A1 $0F71 INCFSZ STACK_0+1, 0 $00A2 $02F5 SUBWF STACK_4+1, 1 $00A3 $0872 MOVF STACK_0+2, 0 $00A4 $1C03 BTFSS STATUS, C $00A5 $0F72 INCFSZ STACK_0+2, 0 $00A6 $02F6 SUBWF STACK_4+2, 1 $00A7 $0873 MOVF STACK_0+3, 0 $00A8 $1C03 BTFSS STATUS, C $00A9 $0F73 INCFSZ STACK_0+3, 0 $00AA $02F7 SUBWF STACK_4+3, 1
52
$00AB $0874 MOVF STACK_4, 0 $00AC $00A8 MOVWF VDelay_ms_NumberOfCyc_L0 $00AD $0875 MOVF STACK_4+1, 0 $00AE $00A9 MOVWF VDelay_ms_NumberOfCyc_L0+1 $00AF $0876 MOVF STACK_4+2, 0 $00B0$00AA MOVWF VDelay_ms_NumberOfCyc_L0+2 $00B1$0877 MOVF STACK_4+3, 0 $00B2$00AB MOVWF VDelay_ms_NumberOfCyc_L0+3 ;delays.c,75 :: NumberOfCyc = NumberOfCyc >> 5; // Dec and While below take around 32 instructions $00B3$3005 MOVLW 5 $00B4$00F0 MOVWF STACK_0 $00B5$0874 MOVF STACK_4, 0 $00B6$00A8 MOVWF VDelay_ms_NumberOfCyc_L0 $00B7$0875 MOVF STACK_4+1, 0 $00B8$00A9 MOVWF VDelay_ms_NumberOfCyc_L0+1 $00B9$0876 MOVF STACK_4+2, 0 $00BA $00AA MOVWF VDelay_ms_NumberOfCyc_L0+2 $00BB $0877 MOVF STACK_4+3, 0 $00BC $00AB MOVWF VDelay_ms_NumberOfCyc_L0+3 $00BD $0870 MOVF STACK_0, 0 $00BE $ L_VDelay_ms_6: $00BE $1903 BTFSC STATUS, Z $00BF $28C7 GOTO L_VDelay_ms_7 $00C0 $0CAB RRF VDelay_ms_NumberOfCyc_L0+3, 1 $00C1 $0CAA RRF VDelay_ms_NumberOfCyc_L0+2, 1 $00C2 $0CA9 RRF VDelay_ms_NumberOfCyc_L0+1, 1 $00C3 $0CA8 RRF VDelay_ms_NumberOfCyc_L0, 1 $00C4 $13AB BCF VDelay_ms_NumberOfCyc_L0+3, 7 $00C5 $3FFF ADDLW 255 $00C6 $28BE GOTO L_VDelay_ms_6 $00C7 $ L_VDelay_ms_7: ;delays.c,76 :: while (NumberOfCyc‐‐) $00C7 $ L_VDelay_ms_3: $00C7 $0828 MOVF VDelay_ms_NumberOfCyc_L0, 0 $00C8 $00F0 MOVWF STACK_0
53
$00C9 $0829 MOVF VDelay_ms_NumberOfCyc_L0+1, 0 $00CA $00F1 MOVWF STACK_0+1 $00CB $082A MOVF VDelay_ms_NumberOfCyc_L0+2, 0 $00CC $00F2 MOVWF STACK_0+2 $00CD $082B MOVF VDelay_ms_NumberOfCyc_L0+3, 0 $00CE $00F3 MOVWF STACK_0+3 $00CF $3001 MOVLW 1 $00D0 $02A8 SUBWF VDelay_ms_NumberOfCyc_L0, 1 $00D1 $1C03 BTFSS STATUS, C $00D2 $02A9 SUBWF VDelay_ms_NumberOfCyc_L0+1, 1 $00D3 $1C03 BTFSS STATUS, C $00D4 $02AA SUBWF VDelay_ms_NumberOfCyc_L0+2, 1 $00D5 $1C03 BTFSS STATUS, C $00D6 $02AB SUBWF VDelay_ms_NumberOfCyc_L0+3, 1 $00D7 $0870 MOVF STACK_0, 0 $00D8 $0471 IORWF STACK_0+1, 0 $00D9 $0472 IORWF STACK_0+2, 0 $00DA $0473 IORWF STACK_0+3, 0 $00DB $1903 BTFSC STATUS, Z $00DC $28E6 GOTO L_VDelay_ms_4 ;delays.c,78 :: asm nop; $00DD $0000 NOP ;delays.c,79 :: asm nop; $00DE $0000 NOP ;delays.c,80 :: asm nop; $00DF $0000 NOP ;delays.c,81 :: asm nop; $00E0 $0000 NOP ;delays.c,82 :: asm nop; $00E1 $0000 NOP ;delays.c,83 :: asm nop; $00E2 $0000 NOP ;delays.c,84 :: asm nop; $00E3 $0000 NOP ;delays.c,85 :: asm nop; $00E4 $0000 NOP
54
;delays.c,86 :: } $00E5 $28C7 GOTO L_VDelay_ms_3 $00E6 $ L_VDelay_ms_4: ;delays.c,87 :: } $00E6 $0008 RETURN $00E7 $ GlobalIniPr: $00E7 $3000 MOVLW 0 $00E8 $1303 BCF STATUS, RP1 $00E9 $1283 BCF STATUS, RP0 $00EA $00A1 MOVWF _i+0 $00EB $3000 MOVLW 0 $00EC $00A0 MOVWF _j+0 $00ED $3000 MOVLW 0 $00EE $00A2 MOVWF _k+0 $00EF $3000 MOVLW 0 $00F0 $00A3 MOVWF _l+0 $00F1 $3000 MOVLW 0 $00F2 $00A4 MOVWF _m+0 $00F3 $3000 MOVLW 0 $00F4 $00A5 MOVWF _n+0 $00F5 $0008 RETURN $00F6 $ _Usart_Init: $00F6 $1303 BCF STATUS, RP1 $00F7 $1683 BSF STATUS, RP0 $00F8 $1698 BSF TXSTA, 5 $00F9 $3090 MOVLW 144 $00FA $1283 BCF STATUS, RP0 $00FB $0098 MOVWF RCSTA $00FC $1683 BSF STATUS, RP0 $00FD $1787 BSF TRISC, 7 $00FE $1307 BCF TRISC, 6 $00FF $ L_Usart_Init_0: $00FF $1283 BCF STATUS, RP0 $0100 $1E8C BTFSS PIR1, 5 $0101 $2905 GOTO L_Usart_Init_1 $0102 $081A MOVF RCREG, 0 $0103 $00AA MOVWF Usart_Init_tmp_L0 $0104 $28FF GOTO L_Usart_Init_0 $0105 $ L_Usart_Init_1: $0105 $0008 RETURN
55
$0106 $ _main: ;Pr.c,3 :: void main() { ;Pr.c,6 :: TRISB = 0x00; $0106 $20E7 CALL GlobalIniPr, 1 $0107 $1683 BSF STATUS, RP0 $0108 $0186 CLRF TRISB, 1 ;Pr.c,7 :: PORTB = 0x00; $0109 $1283 BCF STATUS, RP0 $010A $0186 CLRF PORTB, 1 ;Pr.c,8 :: TRISD = 0x00; $010B$1683 BSF STATUS, RP0 $010C $0188 CLRF TRISD, 1 ;Pr.c,9 :: PORTD = 0x00; $010D $1283 BCF STATUS, RP0 $010E $0188 CLRF PORTD, 1 ;Pr.c,10 :: TRISA = 0b111111; $010F $303F MOVLW 63 $0110 $1683 BSF STATUS, RP0 $0111 $0085 MOVWF TRISA ;Pr.c,12 :: ADCON0 = 0; // Parametri A/D konvertora $0112 $1283 BCF STATUS, RP0 $0113 $019F CLRF ADCON0, 1 ;Pr.c,13 :: ADCON1 = 6; $0114 $3006 MOVLW 6 $0115 $1683 BSF STATUS, RP0 $0116 $009F MOVWF ADCON1 ;Pr.c,15 :: Usart_Init(2400); // Inicijalizacija USART modula $0117 $3067 MOVLW 103 $0118 $0099 MOVWF SPBRG $0119 $1518 BSF TXSTA, BRGH $011A $20F6 CALL _Usart_Init ;Pr.c,17 :: do { $011B$ L_main_0: ;Pr.c,20 :: j.F0 = PORTA.F5; $011B$3000 MOVLW 0 $011C $1A85 BTFSC PORTA, 5 $011D $3001 MOVLW 1 $011E $00F1 MOVWF STACK_1 $011F $3000 MOVLW 0 $0120 $1871 BTFSC STACK_1, 0
56
$0121 $3001 MOVLW 1 $0122 $0620 XORWF _j, 0 $0123 $3901 ANDLW 1 $0124 $06A0 XORWF _j, 1 ;Pr.c,21 :: j.F1 = PORTA.F6; $0125 $3000 MOVLW 0 $0126 $1B05 BTFSC PORTA, 6 $0127 $3001 MOVLW 1 $0128 $00F1 MOVWF STACK_1 $0129 $3000 MOVLW 0 $012A $1871 BTFSC STACK_1, 0 $012B$3002 MOVLW 2 $012C $0620 XORWF _j, 0 $012D $3902 ANDLW 2 $012E $06A0 XORWF _j, 1 ;Pr.c,24 :: if (Usart_Data_Ready()) { // If data is received $012F $203B CALL _Usart_Data_Ready $0130 $0870 MOVF STACK_0, 0 $0131 $1903 BTFSC STATUS, Z $0132 $2A98 GOTO L_main_2 ;Pr.c,25 :: i = Usart_Read(); // Read the received data $0133 $2044 CALL _Usart_Read $0134 $0870 MOVF STACK_0, 0 $0135 $00A1 MOVWF _i ;Pr.c,26 :: Usart_Write(i); // Send data via USART $0136 $0870 MOVF STACK_0, 0 $0137 $00A6 MOVWF FARG_Usart_Write+0 $0138 $204F CALL _Usart_Write ;Pr.c,28 :: k.F1 = i.F7; $0139 $3000 MOVLW 0 $013A $1BA1 BTFSC _i, 7 $013B$3001 MOVLW 1 $013C $00F1 MOVWF STACK_1 $013D $3000 MOVLW 0 $013E $1871 BTFSC STACK_1, 0 $013F $3002 MOVLW 2 $0140 $0622 XORWF _k, 0 $0141 $3902 ANDLW 2 $0142 $06A2 XORWF _k, 1 ;Pr.c,29 :: k.F0 = i.F6;
57
$0143 $3000 MOVLW 0 $0144 $1B21 BTFSC _i, 6 $0145 $3001 MOVLW 1 $0146 $00F1 MOVWF STACK_1 $0147 $3000 MOVLW 0 $0148 $1871 BTFSC STACK_1, 0 $0149 $3001 MOVLW 1 $014A $0622 XORWF _k, 0 $014B$3901 ANDLW 1 $014C $06A2 XORWF _k, 1 ;Pr.c,30 :: l.F1 = i.F5; $014D $3000 MOVLW 0 $014E $1AA1 BTFSC _i, 5 $014F $3001 MOVLW 1 $0150 $00F1 MOVWF STACK_1 $0151 $3000 MOVLW 0 $0152 $1871 BTFSC STACK_1, 0 $0153 $3002 MOVLW 2 $0154 $0623 XORWF _l, 0 $0155 $3902 ANDLW 2 $0156 $06A3 XORWF _l, 1 ;Pr.c,31 :: l.F0 = i.F4; $0157 $3000 MOVLW 0 $0158 $1A21 BTFSC _i, 4 $0159 $3001 MOVLW 1 $015A $00F1 MOVWF STACK_1 $015B$3000 MOVLW 0 $015C $1871 BTFSC STACK_1, 0 $015D $3001 MOVLW 1 $015E $0623 XORWF _l, 0 $015F $3901 ANDLW 1 $0160 $06A3 XORWF _l, 1 ;Pr.c,32 :: m.F1 = i.F3; $0161 $3000 MOVLW 0 $0162 $19A1 BTFSC _i, 3 $0163 $3001 MOVLW 1 $0164 $00F1 MOVWF STACK_1 $0165 $3000 MOVLW 0 $0166 $1871 BTFSC STACK_1, 0 $0167 $3002 MOVLW 2
58
$0168 $0624 XORWF _m, 0 $0169 $3902 ANDLW 2 $016A $06A4 XORWF _m, 1 ;Pr.c,33 :: m.F0 = i.F2; $016B$3000 MOVLW 0 $016C $1921 BTFSC _i, 2 $016D $3001 MOVLW 1 $016E $00F1 MOVWF STACK_1 $016F $3000 MOVLW 0 $0170 $1871 BTFSC STACK_1, 0 $0171 $3001 MOVLW 1 $0172 $0624 XORWF _m, 0 $0173 $3901 ANDLW 1 $0174 $06A4 XORWF _m, 1 ;Pr.c,34 :: n.F1 = i.F1; $0175 $3000 MOVLW 0 $0176 $18A1 BTFSC _i, 1 $0177 $3001 MOVLW 1 $0178 $00F1 MOVWF STACK_1 $0179 $3000 MOVLW 0 $017A $1871 BTFSC STACK_1, 0 $017B$3002 MOVLW 2 $017C $0625 XORWF _n, 0 $017D $3902 ANDLW 2 $017E $06A5 XORWF _n, 1 ;Pr.c,35 :: n.F0 = i.F0; $017F $3001 MOVLW 1 $0180 $0521 ANDWF _i, 0 $0181 $00F0 MOVWF STACK_0 $0182 $3000 MOVLW 0 $0183 $1870 BTFSC STACK_0, 0 $0184 $3001 MOVLW 1 $0185 $0625 XORWF _n, 0 $0186 $3901 ANDLW 1 $0187 $06A5 XORWF _n, 1 ;Pr.c,38 :: if (PORTA.F2 == 1) { $0188 $3000 MOVLW 0 $0189 $1905 BTFSC PORTA, 2 $018A $3001 MOVLW 1 $018B$00F1 MOVWF STACK_1
59
$018C $0871 MOVF STACK_1, 0 $018D $3A01 XORLW 1 $018E $1D03 BTFSS STATUS, Z $018F $2A3A GOTO L_main_3 ;Pr.c,40 :: if (k==3) { $0190 $0822 MOVF _k, 0 $0191 $3A03 XORLW 3 $0192 $1D03 BTFSS STATUS, Z $0193 $2995 GOTO L_main_4 ;Pr.c,41 :: PORTB = 0b00000000; $0194 $0186 CLRF PORTB, 1 ;Pr.c,42 :: } $0195 $ L_main_4: ;Pr.c,44 :: if (k==2) { $0195 $0822 MOVF _k, 0 $0196 $3A02 XORLW 2 $0197 $1D03 BTFSS STATUS, Z $0198 $299B GOTO L_main_5 ;Pr.c,45 :: PORTB = 0b00100000; $0199 $3020 MOVLW 32 $019A $0086 MOVWF PORTB ;Pr.c,46 :: } $019B$ L_main_5: ;Pr.c,48 :: if (k==1) { $019B$0822 MOVF _k, 0 $019C $3A01 XORLW 1 $019D $1D03 BTFSS STATUS, Z $019E $29A1 GOTO L_main_6 ;Pr.c,49 :: PORTB = 0b10000000; $019F $3080 MOVLW 128 $01A0 $0086 MOVWF PORTB ;Pr.c,50 :: } $01A1 $ L_main_6: ;Pr.c,52 :: if (k==0) { $01A1 $0822 MOVF _k, 0 $01A2 $3A00 XORLW 0 $01A3 $1D03 BTFSS STATUS, Z $01A4 $29A7 GOTO L_main_7 ;Pr.c,53 :: PORTB = 0b11100000; $01A5 $30E0 MOVLW 224
60
$01A6 $0086 MOVWF PORTB ;Pr.c,54 :: } $01A7 $ L_main_7: ;Pr.c,55 :: Vdelay_ms(j+1); $01A7 $0820 MOVF _j, 0 $01A8 $3F01 ADDLW 1 $01A9 $00A6 MOVWF FARG_VDelay_ms+0 $01AA $01A7 CLRF FARG_VDelay_ms+1 $01AB $1803 BTFSC STATUS, C $01AC $0AA7 INCF FARG_VDelay_ms+1, 1 $01AD $205F CALL _VDelay_ms ;Pr.c,57 :: if (l==3) { $01AE $1303 BCF STATUS, RP1 $01AF $1283 BCF STATUS, RP0 $01B0$0823 MOVF _l, 0 $01B1$3A03 XORLW 3 $01B2$1D03 BTFSS STATUS, Z $01B3$29B5 GOTO L_main_8 ;Pr.c,58 :: PORTB = 0b00000000; $01B4$0186 CLRF PORTB, 1 ;Pr.c,59 :: } $01B5$ L_main_8: ;Pr.c,61 :: if (l==2) { $01B5$1303 BCF STATUS, RP1 $01B6$1283 BCF STATUS, RP0 $01B7$0823 MOVF _l, 0 $01B8$3A02 XORLW 2 $01B9$1D03 BTFSS STATUS, Z $01BA $29BD GOTO L_main_9 ;Pr.c,62 :: PORTB = 0b00100000; $01BB $3020 MOVLW 32 $01BC $0086 MOVWF PORTB ;Pr.c,63 :: } $01BD $ L_main_9: ;Pr.c,65 :: if (l==1) { $01BD $1303 BCF STATUS, RP1 $01BE $1283 BCF STATUS, RP0 $01BF $0823 MOVF _l, 0 $01C0 $3A01 XORLW 1 $01C1 $1D03 BTFSS STATUS, Z
61
$01C2 $29C5 GOTO L_main_10 ;Pr.c,66 :: PORTB = 0b10000000; $01C3 $3080 MOVLW 128 $01C4 $0086 MOVWF PORTB ;Pr.c,67 :: } $01C5 $ L_main_10: ;Pr.c,69 :: if (l==0) { $01C5 $1303 BCF STATUS, RP1 $01C6 $1283 BCF STATUS, RP0 $01C7 $0823 MOVF _l, 0 $01C8 $3A00 XORLW 0 $01C9 $1D03 BTFSS STATUS, Z $01CA $29CD GOTO L_main_11 ;Pr.c,70 :: PORTB = 0b11100000; $01CB $30E0 MOVLW 224 $01CC $0086 MOVWF PORTB ;Pr.c,71 :: } $01CD $ L_main_11: ;Pr.c,72 :: Vdelay_ms(j+1); $01CD $1303 BCF STATUS, RP1 $01CE $1283 BCF STATUS, RP0 $01CF $0820 MOVF _j, 0 $01D0 $3F01 ADDLW 1 $01D1 $00A6 MOVWF FARG_VDelay_ms+0 $01D2 $01A7 CLRF FARG_VDelay_ms+1 $01D3 $1803 BTFSC STATUS, C $01D4 $0AA7 INCF FARG_VDelay_ms+1, 1 $01D5 $205F CALL _VDelay_ms ;Pr.c,74 :: if (m==3) { $01D6 $1303 BCF STATUS, RP1 $01D7 $1283 BCF STATUS, RP0 $01D8 $0824 MOVF _m, 0 $01D9 $3A03 XORLW 3 $01DA $1D03 BTFSS STATUS, Z $01DB $29DD GOTO L_main_12 ;Pr.c,75 :: PORTB = 0b00000000; $01DC $0186 CLRF PORTB, 1 ;Pr.c,76 :: } $01DD $ L_main_12: ;Pr.c,78 :: if (m==2) {
62
$01DD $1303 BCF STATUS, RP1 $01DE $1283 BCF STATUS, RP0 $01DF $0824 MOVF _m, 0 $01E0 $3A02 XORLW 2 $01E1 $1D03 BTFSS STATUS, Z $01E2 $29E5 GOTO L_main_13 ;Pr.c,79 :: PORTB = 0b00100000; $01E3 $3020 MOVLW 32 $01E4 $0086 MOVWF PORTB ;Pr.c,80 :: } $01E5 $ L_main_13: ;Pr.c,82 :: if (m==1) { $01E5 $1303 BCF STATUS, RP1 $01E6 $1283 BCF STATUS, RP0 $01E7 $0824 MOVF _m, 0 $01E8 $3A01 XORLW 1 $01E9 $1D03 BTFSS STATUS, Z $01EA $29ED GOTO L_main_14 ;Pr.c,83 :: PORTB = 0b10000000; $01EB $3080 MOVLW 128 $01EC $0086 MOVWF PORTB ;Pr.c,84 :: } $01ED $ L_main_14: ;Pr.c,86 :: if (m==0) { $01ED $1303 BCF STATUS, RP1 $01EE $1283 BCF STATUS, RP0 $01EF $0824 MOVF _m, 0 $01F0 $3A00 XORLW 0 $01F1 $1D03 BTFSS STATUS, Z $01F2 $29F5 GOTO L_main_15 ;Pr.c,87 :: PORTB = 0b11100000; $01F3 $30E0 MOVLW 224 $01F4 $0086 MOVWF PORTB ;Pr.c,88 :: } $01F5 $ L_main_15: ;Pr.c,89 :: Vdelay_ms(j+1); $01F5 $1303 BCF STATUS, RP1 $01F6 $1283 BCF STATUS, RP0 $01F7 $0820 MOVF _j, 0 $01F8 $3F01 ADDLW 1
63
$01F9 $00A6 MOVWF FARG_VDelay_ms+0 $01FA $01A7 CLRF FARG_VDelay_ms+1 $01FB $1803 BTFSC STATUS, C $01FC $0AA7 INCF FARG_VDelay_ms+1, 1 $01FD $205F CALL _VDelay_ms ;Pr.c,91 :: if (n==3) { $01FE $1303 BCF STATUS, RP1 $01FF $1283 BCF STATUS, RP0 $0200 $0825 MOVF _n, 0 $0201 $3A03 XORLW 3 $0202 $1D03 BTFSS STATUS, Z $0203 $2A05 GOTO L_main_16 ;Pr.c,92 :: PORTB = 0b00000000; $0204 $0186 CLRF PORTB, 1 ;Pr.c,93 :: } $0205 $ L_main_16: ;Pr.c,95 :: if (n==2) { $0205 $1303 BCF STATUS, RP1 $0206 $1283 BCF STATUS, RP0 $0207 $0825 MOVF _n, 0 $0208 $3A02 XORLW 2 $0209 $1D03 BTFSS STATUS, Z $020A $2A0D GOTO L_main_17 ;Pr.c,96 :: PORTB = 0b00100000; $020B$3020 MOVLW 32 $020C $0086 MOVWF PORTB ;Pr.c,97 :: } $020D $ L_main_17: ;Pr.c,99 :: if (n==1) { $020D $1303 BCF STATUS, RP1 $020E $1283 BCF STATUS, RP0 $020F $0825 MOVF _n, 0 $0210 $3A01 XORLW 1 $0211 $1D03 BTFSS STATUS, Z $0212 $2A15 GOTO L_main_18 ;Pr.c,100 :: PORTB = 0b10000000; $0213 $3080 MOVLW 128 $0214 $0086 MOVWF PORTB ;Pr.c,101 :: } $0215 $ L_main_18:
64
;Pr.c,103 :: if (n==0) { $0215 $1303 BCF STATUS, RP1 $0216 $1283 BCF STATUS, RP0 $0217 $0825 MOVF _n, 0 $0218 $3A00 XORLW 0 $0219 $1D03 BTFSS STATUS, Z $021A $2A1D GOTO L_main_19 ;Pr.c,104 :: PORTB = 0b11100000; $021B$30E0 MOVLW 224 $021C $0086 MOVWF PORTB ;Pr.c,105 :: } $021D $ L_main_19: ;Pr.c,106 :: Vdelay_ms(j+1); $021D $1303 BCF STATUS, RP1 $021E $1283 BCF STATUS, RP0 $021F $0820 MOVF _j, 0 $0220 $3F01 ADDLW 1 $0221 $00A6 MOVWF FARG_VDelay_ms+0 $0222 $01A7 CLRF FARG_VDelay_ms+1 $0223 $1803 BTFSC STATUS, C $0224 $0AA7 INCF FARG_VDelay_ms+1, 1 $0225 $205F CALL _VDelay_ms ;Pr.c,108 :: PORTB = 0b01100000; $0226 $3060 MOVLW 96 $0227 $1303 BCF STATUS, RP1 $0228 $1283 BCF STATUS, RP0 $0229 $0086 MOVWF PORTB ;Pr.c,109 :: delay_ms(4); $022A $3006 MOVLW 6 $022B$00FB MOVWF STACK_11 $022C $30FF MOVLW 255 $022D $00FA MOVWF STACK_10 $022E $0BFB DECFSZ STACK_11, F $022F $2A31 GOTO $+2 $0230 $2A34 GOTO $+4 $0231 $0BFA DECFSZ STACK_10, F $0232 $2A31 GOTO $‐1 $0233 $2A2E GOTO $‐5 $0234 $302C MOVLW 44 $0235 $00FA MOVWF STACK_10
65
$0236 $0BFA DECFSZ STACK_10, F $0237 $2A36 GOTO $‐1 $0238 $0000 NOP $0239 $0000 NOP ;Pr.c,111 :: } $023A $ L_main_3: ;Pr.c,113 :: if (PORTA.F2 == 0) { $023A $3000 MOVLW 0 $023B$1303 BCF STATUS, RP1 $023C $1283 BCF STATUS, RP0 $023D $1905 BTFSC PORTA, 2 $023E $3001 MOVLW 1 $023F $00F1 MOVWF STACK_1 $0240 $0871 MOVF STACK_1, 0 $0241 $3A00 XORLW 0 $0242 $1D03 BTFSS STATUS, Z $0243 $2A98 GOTO L_main_20 ;Pr.c,115 :: if (k==3) { $0244 $0822 MOVF _k, 0 $0245 $3A03 XORLW 3 $0246 $1D03 BTFSS STATUS, Z $0247 $2A49 GOTO L_main_21 ;Pr.c,116 :: PORTB = 0b00000000; $0248 $0186 CLRF PORTB, 1 ;Pr.c,117 :: } $0249 $ L_main_21: ;Pr.c,119 :: if (k==2) { $0249 $1303 BCF STATUS, RP1 $024A $1283 BCF STATUS, RP0 $024B$0822 MOVF _k, 0 $024C $3A02 XORLW 2 $024D $1D03 BTFSS STATUS, Z $024E $2A51 GOTO L_main_22 ;Pr.c,120 :: PORTB = 0b00100000; $024F $3020 MOVLW 32 $0250 $0086 MOVWF PORTB ;Pr.c,121 :: } $0251 $ L_main_22: ;Pr.c,123 :: if (k==1) { $0251 $1303 BCF STATUS, RP1
66
$0252 $1283 BCF STATUS, RP0 $0253 $0822 MOVF _k, 0 $0254 $3A01 XORLW 1 $0255 $1D03 BTFSS STATUS, Z $0256 $2A59 GOTO L_main_23 ;Pr.c,124 :: PORTB = 0b10000000; $0257 $3080 MOVLW 128 $0258 $0086 MOVWF PORTB ;Pr.c,125 :: } $0259 $ L_main_23: ;Pr.c,127 :: if (k==0) { $0259 $1303 BCF STATUS, RP1 $025A $1283 BCF STATUS, RP0 $025B$0822 MOVF _k, 0 $025C $3A00 XORLW 0 $025D $1D03 BTFSS STATUS, Z $025E $2A61 GOTO L_main_24 ;Pr.c,128 :: PORTB = 0b11100000; $025F $30E0 MOVLW 224 $0260 $0086 MOVWF PORTB ;Pr.c,129 :: } $0261 $ L_main_24: ;Pr.c,130 :: Vdelay_ms(l+1); $0261 $1303 BCF STATUS, RP1 $0262 $1283 BCF STATUS, RP0 $0263 $0823 MOVF _l, 0 $0264 $3F01 ADDLW 1 $0265 $00A6 MOVWF FARG_VDelay_ms+0 $0266 $01A7 CLRF FARG_VDelay_ms+1 $0267 $1803 BTFSC STATUS, C $0268 $0AA7 INCF FARG_VDelay_ms+1, 1 $0269 $205F CALL _VDelay_ms ;Pr.c,131 :: PORTB = 0b01100000; $026A $3060 MOVLW 96 $026B$1303 BCF STATUS, RP1 $026C $1283 BCF STATUS, RP0 $026D $0086 MOVWF PORTB ;Pr.c,133 :: if (m==3) { $026E $0824 MOVF _m, 0 $026F $3A03 XORLW 3
67
$0270 $1D03 BTFSS STATUS, Z $0271 $2A73 GOTO L_main_25 ;Pr.c,134 :: PORTB = 0b00000000; $0272 $0186 CLRF PORTB, 1 ;Pr.c,135 :: } $0273 $ L_main_25: ;Pr.c,137 :: if (m==2) { $0273 $1303 BCF STATUS, RP1 $0274 $1283 BCF STATUS, RP0 $0275 $0824 MOVF _m, 0 $0276 $3A02 XORLW 2 $0277 $1D03 BTFSS STATUS, Z $0278 $2A7B GOTO L_main_26 ;Pr.c,138 :: PORTB = 0b00100000; $0279 $3020 MOVLW 32 $027A $0086 MOVWF PORTB ;Pr.c,139 :: } $027B$ L_main_26: ;Pr.c,141 :: if (m==1) { $027B$1303 BCF STATUS, RP1 $027C $1283 BCF STATUS, RP0 $027D $0824 MOVF _m, 0 $027E $3A01 XORLW 1 $027F $1D03 BTFSS STATUS, Z $0280 $2A83 GOTO L_main_27 ;Pr.c,142 :: PORTB = 0b10000000; $0281 $3080 MOVLW 128 $0282 $0086 MOVWF PORTB ;Pr.c,143 :: } $0283 $ L_main_27: ;Pr.c,145 :: if (m==0) { $0283 $1303 BCF STATUS, RP1 $0284 $1283 BCF STATUS, RP0 $0285 $0824 MOVF _m, 0 $0286 $3A00 XORLW 0 $0287 $1D03 BTFSS STATUS, Z $0288 $2A8B GOTO L_main_28 ;Pr.c,146 :: PORTB = 0b11100000; $0289 $30E0 MOVLW 224 $028A $0086 MOVWF PORTB
68
;Pr.c,147 :: } $028B$ L_main_28: ;Pr.c,148 :: Vdelay_ms(n+1); $028B$1303 BCF STATUS, RP1 $028C $1283 BCF STATUS, RP0 $028D $0825 MOVF _n, 0 $028E $3F01 ADDLW 1 $028F $00A6 MOVWF FARG_VDelay_ms+0 $0290 $01A7 CLRF FARG_VDelay_ms+1 $0291 $1803 BTFSC STATUS, C $0292 $0AA7 INCF FARG_VDelay_ms+1, 1 $0293 $205F CALL _VDelay_ms ;Pr.c,149 :: PORTB = 0b01100000; $0294 $3060 MOVLW 96 $0295 $1303 BCF STATUS, RP1 $0296 $1283 BCF STATUS, RP0 $0297 $0086 MOVWF PORTB ;Pr.c,152 :: } $0298 $ L_main_20: ;Pr.c,154 :: } $0298 $ L_main_2: ;Pr.c,158 :: if (PORTA.F0 == 0) { $0298 $3001 MOVLW 1 $0299 $1303 BCF STATUS, RP1 $029A $1283 BCF STATUS, RP0 $029B$0505 ANDWF PORTA, 0 $029C $00F1 MOVWF STACK_1 $029D $0871 MOVF STACK_1, 0 $029E $3A00 XORLW 0 $029F $1D03 BTFSS STATUS, Z $02A0 $2BED GOTO L_main_29 ;Pr.c,160 :: PORTB = 0b11100000; // ‐5 $02A1 $30E0 MOVLW 224 $02A2 $0086 MOVWF PORTB ;Pr.c,161 :: delay_ms(1); $02A3 $3002 MOVLW 2 $02A4 $00FB MOVWF STACK_11 $02A5 $30FF MOVLW 255 $02A6 $00FA MOVWF STACK_10 $02A7 $0BFB DECFSZ STACK_11, F
69
$02A8 $2AAA GOTO $+2 $02A9 $2AAD GOTO $+4 $02AA $0BFA DECFSZ STACK_10, F $02AB $2AAA GOTO $‐1 $02AC $2AA7 GOTO $‐5 $02AD $304A MOVLW 74 $02AE $00FA MOVWF STACK_10 $02AF $0BFA DECFSZ STACK_10, F $02B0$2AAF GOTO $‐1 ;Pr.c,162 :: PORTB = 0b00100000; // +2.5 $02B1$3020 MOVLW 32 $02B2$0086 MOVWF PORTB ;Pr.c,163 :: delay_ms(1); $02B3$3002 MOVLW 2 $02B4$00FB MOVWF STACK_11 $02B5$30FF MOVLW 255 $02B6$00FA MOVWF STACK_10 $02B7$0BFB DECFSZ STACK_11, F $02B8$2ABA GOTO $+2 $02B9$2ABD GOTO $+4 $02BA $0BFA DECFSZ STACK_10, F $02BB $2ABA GOTO $‐1 $02BC $2AB7 GOTO $‐5 $02BD $304A MOVLW 74 $02BE $00FA MOVWF STACK_10 $02BF $0BFA DECFSZ STACK_10, F $02C0 $2ABF GOTO $‐1 ;Pr.c,164 :: PORTB = 0b00000000; // + 5 $02C1 $0186 CLRF PORTB, 1 ;Pr.c,165 :: delay_ms(1); $02C2 $3002 MOVLW 2 $02C3 $00FB MOVWF STACK_11 $02C4 $30FF MOVLW 255 $02C5 $00FA MOVWF STACK_10 $02C6 $0BFB DECFSZ STACK_11, F $02C7 $2AC9 GOTO $+2 $02C8 $2ACC GOTO $+4 $02C9 $0BFA DECFSZ STACK_10, F $02CA $2AC9 GOTO $‐1 $02CB $2AC6 GOTO $‐5
70
$02CC $304A MOVLW 74 $02CD $00FA MOVWF STACK_10 $02CE $0BFA DECFSZ STACK_10, F $02CF $2ACE GOTO $‐1 ;Pr.c,166 :: PORTB = 0b10000000; // ‐ 2.5 $02D0 $3080 MOVLW 128 $02D1 $0086 MOVWF PORTB ;Pr.c,167 :: delay_ms(1); $02D2 $3002 MOVLW 2 $02D3 $00FB MOVWF STACK_11 $02D4 $30FF MOVLW 255 $02D5 $00FA MOVWF STACK_10 $02D6 $0BFB DECFSZ STACK_11, F $02D7 $2AD9 GOTO $+2 $02D8 $2ADC GOTO $+4 $02D9 $0BFA DECFSZ STACK_10, F $02DA $2AD9 GOTO $‐1 $02DB $2AD6 GOTO $‐5 $02DC $304A MOVLW 74 $02DD $00FA MOVWF STACK_10 $02DE $0BFA DECFSZ STACK_10, F $02DF $2ADE GOTO $‐1 ;Pr.c,168 :: PORTB = 0b01100000; // 0 $02E0 $3060 MOVLW 96 $02E1 $0086 MOVWF PORTB ;Pr.c,169 :: delay_ms(4); $02E2 $3006 MOVLW 6 $02E3 $00FB MOVWF STACK_11 $02E4 $30FF MOVLW 255 $02E5 $00FA MOVWF STACK_10 $02E6 $0BFB DECFSZ STACK_11, F $02E7 $2AE9 GOTO $+2 $02E8 $2AEC GOTO $+4 $02E9 $0BFA DECFSZ STACK_10, F $02EA $2AE9 GOTO $‐1 $02EB $2AE6 GOTO $‐5 $02EC $302C MOVLW 44 $02ED $00FA MOVWF STACK_10 $02EE $0BFA DECFSZ STACK_10, F $02EF $2AEE GOTO $‐1
71
$02F0 $0000 NOP $02F1 $0000 NOP ;Pr.c,171 :: PORTB = 0b11100000; // ‐5 $02F2 $30E0 MOVLW 224 $02F3 $0086 MOVWF PORTB ;Pr.c,172 :: delay_ms(2); $02F4 $3003 MOVLW 3 $02F5 $00FB MOVWF STACK_11 $02F6 $30FF MOVLW 255 $02F7 $00FA MOVWF STACK_10 $02F8 $0BFB DECFSZ STACK_11, F $02F9 $2AFB GOTO $+2 $02FA $2AFE GOTO $+4 $02FB $0BFA DECFSZ STACK_10, F $02FC $2AFB GOTO $‐1 $02FD $2AF8 GOTO $‐5 $02FE $3096 MOVLW 150 $02FF $00FA MOVWF STACK_10 $0300 $0BFA DECFSZ STACK_10, F $0301 $2B00 GOTO $‐1 ;Pr.c,173 :: PORTB = 0b00100000; // +2.5 $0302 $3020 MOVLW 32 $0303 $0086 MOVWF PORTB ;Pr.c,174 :: delay_ms(2); $0304 $3003 MOVLW 3 $0305 $00FB MOVWF STACK_11 $0306 $30FF MOVLW 255 $0307 $00FA MOVWF STACK_10 $0308 $0BFB DECFSZ STACK_11, F $0309 $2B0B GOTO $+2 $030A $2B0E GOTO $+4 $030B$0BFA DECFSZ STACK_10, F $030C $2B0B GOTO $‐1 $030D $2B08 GOTO $‐5 $030E $3096 MOVLW 150 $030F $00FA MOVWF STACK_10 $0310 $0BFA DECFSZ STACK_10, F $0311 $2B10 GOTO $‐1 ;Pr.c,175 :: PORTB = 0b00000000; // + 5 $0312 $0186 CLRF PORTB, 1
72
;Pr.c,176 :: delay_ms(2); $0313 $3003 MOVLW 3 $0314 $00FB MOVWF STACK_11 $0315 $30FF MOVLW 255 $0316 $00FA MOVWF STACK_10 $0317 $0BFB DECFSZ STACK_11, F $0318 $2B1A GOTO $+2 $0319 $2B1D GOTO $+4 $031A $0BFA DECFSZ STACK_10, F $031B$2B1A GOTO $‐1 $031C $2B17 GOTO $‐5 $031D $3096 MOVLW 150 $031E $00FA MOVWF STACK_10 $031F $0BFA DECFSZ STACK_10, F $0320 $2B1F GOTO $‐1 ;Pr.c,177 :: PORTB = 0b10000000; // ‐ 2.5 $0321 $3080 MOVLW 128 $0322 $0086 MOVWF PORTB ;Pr.c,178 :: delay_ms(2); $0323 $3003 MOVLW 3 $0324 $00FB MOVWF STACK_11 $0325 $30FF MOVLW 255 $0326 $00FA MOVWF STACK_10 $0327 $0BFB DECFSZ STACK_11, F $0328 $2B2A GOTO $+2 $0329 $2B2D GOTO $+4 $032A $0BFA DECFSZ STACK_10, F $032B$2B2A GOTO $‐1 $032C $2B27 GOTO $‐5 $032D $3096 MOVLW 150 $032E $00FA MOVWF STACK_10 $032F $0BFA DECFSZ STACK_10, F $0330 $2B2F GOTO $‐1 ;Pr.c,179 :: PORTB = 0b01100000; // 0 $0331 $3060 MOVLW 96 $0332 $0086 MOVWF PORTB ;Pr.c,180 :: delay_ms(4); $0333 $3006 MOVLW 6 $0334 $00FB MOVWF STACK_11 $0335 $30FF MOVLW 255
73
$0336 $00FA MOVWF STACK_10 $0337 $0BFB DECFSZ STACK_11, F $0338 $2B3A GOTO $+2 $0339 $2B3D GOTO $+4 $033A $0BFA DECFSZ STACK_10, F $033B$2B3A GOTO $‐1 $033C $2B37 GOTO $‐5 $033D $302C MOVLW 44 $033E $00FA MOVWF STACK_10 $033F $0BFA DECFSZ STACK_10, F $0340 $2B3F GOTO $‐1 $0341 $0000 NOP $0342 $0000 NOP ;Pr.c,182 :: PORTB = 0b11100000; // ‐5 $0343 $30E0 MOVLW 224 $0344 $0086 MOVWF PORTB ;Pr.c,183 :: delay_ms(3); $0345 $3004 MOVLW 4 $0346 $00FB MOVWF STACK_11 $0347 $30FF MOVLW 255 $0348 $00FA MOVWF STACK_10 $0349 $0BFB DECFSZ STACK_11, F $034A $2B4C GOTO $+2 $034B$2B4F GOTO $+4 $034C $0BFA DECFSZ STACK_10, F $034D $2B4C GOTO $‐1 $034E $2B49 GOTO $‐5 $034F $30E2 MOVLW 226 $0350 $00FA MOVWF STACK_10 $0351 $0BFA DECFSZ STACK_10, F $0352 $2B51 GOTO $‐1 ;Pr.c,184 :: PORTB = 0b10000000; // ‐ 2.5 $0353 $3080 MOVLW 128 $0354 $0086 MOVWF PORTB ;Pr.c,185 :: delay_ms(3); $0355 $3004 MOVLW 4 $0356 $00FB MOVWF STACK_11 $0357 $30FF MOVLW 255 $0358 $00FA MOVWF STACK_10 $0359 $0BFB DECFSZ STACK_11, F
74
$035A $2B5C GOTO $+2 $035B$2B5F GOTO $+4 $035C $0BFA DECFSZ STACK_10, F $035D $2B5C GOTO $‐1 $035E $2B59 GOTO $‐5 $035F $30E2 MOVLW 226 $0360 $00FA MOVWF STACK_10 $0361 $0BFA DECFSZ STACK_10, F $0362 $2B61 GOTO $‐1 ;Pr.c,186 :: PORTB = 0b00100000; // +2.5 $0363 $3020 MOVLW 32 $0364 $0086 MOVWF PORTB ;Pr.c,187 :: delay_ms(3); $0365 $3004 MOVLW 4 $0366 $00FB MOVWF STACK_11 $0367 $30FF MOVLW 255 $0368 $00FA MOVWF STACK_10 $0369 $0BFB DECFSZ STACK_11, F $036A $2B6C GOTO $+2 $036B$2B6F GOTO $+4 $036C $0BFA DECFSZ STACK_10, F $036D $2B6C GOTO $‐1 $036E $2B69 GOTO $‐5 $036F $30E2 MOVLW 226 $0370 $00FA MOVWF STACK_10 $0371 $0BFA DECFSZ STACK_10, F $0372 $2B71 GOTO $‐1 ;Pr.c,188 :: PORTB = 0b00000000; // + 5 $0373 $0186 CLRF PORTB, 1 ;Pr.c,189 :: delay_ms(3); $0374 $3004 MOVLW 4 $0375 $00FB MOVWF STACK_11 $0376 $30FF MOVLW 255 $0377 $00FA MOVWF STACK_10 $0378 $0BFB DECFSZ STACK_11, F $0379 $2B7B GOTO $+2 $037A $2B7E GOTO $+4 $037B$0BFA DECFSZ STACK_10, F $037C $2B7B GOTO $‐1 $037D $2B78 GOTO $‐5
75
$037E $30E2 MOVLW 226 $037F $00FA MOVWF STACK_10 $0380 $0BFA DECFSZ STACK_10, F $0381 $2B80 GOTO $‐1 ;Pr.c,190 :: PORTB = 0b01100000; // 0 $0382 $3060 MOVLW 96 $0383 $0086 MOVWF PORTB ;Pr.c,191 :: delay_ms(4); $0384 $3006 MOVLW 6 $0385 $00FB MOVWF STACK_11 $0386 $30FF MOVLW 255 $0387 $00FA MOVWF STACK_10 $0388 $0BFB DECFSZ STACK_11, F $0389 $2B8B GOTO $+2 $038A $2B8E GOTO $+4 $038B$0BFA DECFSZ STACK_10, F $038C $2B8B GOTO $‐1 $038D $2B88 GOTO $‐5 $038E $302C MOVLW 44 $038F $00FA MOVWF STACK_10 $0390 $0BFA DECFSZ STACK_10, F $0391 $2B90 GOTO $‐1 $0392 $0000 NOP $0393 $0000 NOP ;Pr.c,193 :: PORTB = 0b00000000; // + 5 $0394 $0186 CLRF PORTB, 1 ;Pr.c,194 :: delay_ms(4); $0395 $3006 MOVLW 6 $0396 $00FB MOVWF STACK_11 $0397 $30FF MOVLW 255 $0398 $00FA MOVWF STACK_10 $0399 $0BFB DECFSZ STACK_11, F $039A $2B9C GOTO $+2 $039B$2B9F GOTO $+4 $039C $0BFA DECFSZ STACK_10, F $039D $2B9C GOTO $‐1 $039E $2B99 GOTO $‐5 $039F $302C MOVLW 44 $03A0 $00FA MOVWF STACK_10 $03A1 $0BFA DECFSZ STACK_10, F
76
$03A2 $2BA1 GOTO $‐1 $03A3 $0000 NOP $03A4 $0000 NOP ;Pr.c,195 :: PORTB = 0b10000000; // ‐ 2.5 $03A5 $3080 MOVLW 128 $03A6 $0086 MOVWF PORTB ;Pr.c,196 :: delay_ms(4); $03A7 $3006 MOVLW 6 $03A8 $00FB MOVWF STACK_11 $03A9 $30FF MOVLW 255 $03AA $00FA MOVWF STACK_10 $03AB $0BFB DECFSZ STACK_11, F $03AC $2BAE GOTO $+2 $03AD $2BB1 GOTO $+4 $03AE $0BFA DECFSZ STACK_10, F $03AF $2BAE GOTO $‐1 $03B0$2BAB GOTO $‐5 $03B1$302C MOVLW 44 $03B2$00FA MOVWF STACK_10 $03B3$0BFA DECFSZ STACK_10, F $03B4$2BB3 GOTO $‐1 $03B5$0000 NOP $03B6$0000 NOP ;Pr.c,197 :: PORTB = 0b11100000; // ‐5 $03B7$30E0 MOVLW 224 $03B8$0086 MOVWF PORTB ;Pr.c,198 :: delay_ms(4); $03B9$3006 MOVLW 6 $03BA $00FB MOVWF STACK_11 $03BB $30FF MOVLW 255 $03BC $00FA MOVWF STACK_10 $03BD $0BFB DECFSZ STACK_11, F $03BE $2BC0 GOTO $+2 $03BF $2BC3 GOTO $+4 $03C0 $0BFA DECFSZ STACK_10, F $03C1 $2BC0 GOTO $‐1 $03C2 $2BBD GOTO $‐5 $03C3 $302C MOVLW 44 $03C4 $00FA MOVWF STACK_10 $03C5 $0BFA DECFSZ STACK_10, F
77
$03C6 $2BC5 GOTO $‐1 $03C7 $0000 NOP $03C8 $0000 NOP ;Pr.c,199 :: PORTB = 0b00100000; // +2.5 $03C9 $3020 MOVLW 32 $03CA $0086 MOVWF PORTB ;Pr.c,201 :: delay_ms(4); $03CB $3006 MOVLW 6 $03CC $00FB MOVWF STACK_11 $03CD $30FF MOVLW 255 $03CE $00FA MOVWF STACK_10 $03CF $0BFB DECFSZ STACK_11, F $03D0 $2BD2 GOTO $+2 $03D1 $2BD5 GOTO $+4 $03D2 $0BFA DECFSZ STACK_10, F $03D3 $2BD2 GOTO $‐1 $03D4 $2BCF GOTO $‐5 $03D5 $302C MOVLW 44 $03D6 $00FA MOVWF STACK_10 $03D7 $0BFA DECFSZ STACK_10, F $03D8 $2BD7 GOTO $‐1 $03D9 $0000 NOP $03DA $0000 NOP ;Pr.c,202 :: PORTB = 0b01100000; // 0 $03DB $3060 MOVLW 96 $03DC $0086 MOVWF PORTB ;Pr.c,203 :: delay_ms(4); $03DD $3006 MOVLW 6 $03DE $00FB MOVWF STACK_11 $03DF $30FF MOVLW 255 $03E0 $00FA MOVWF STACK_10 $03E1 $0BFB DECFSZ STACK_11, F $03E2 $2BE4 GOTO $+2 $03E3 $2BE7 GOTO $+4 $03E4 $0BFA DECFSZ STACK_10, F $03E5 $2BE4 GOTO $‐1 $03E6 $2BE1 GOTO $‐5 $03E7 $302C MOVLW 44 $03E8 $00FA MOVWF STACK_10 $03E9 $0BFA DECFSZ STACK_10, F
78
$03EA $2BE9 GOTO $‐1 $03EB $0000 NOP $03EC $0000 NOP ;Pr.c,205 :: } $03ED $ L_main_29: ;Pr.c,207 :: } while (1); $03ED $291B GOTO L_main_0 ;Pr.c,208 :: }//~! $03EE $2BEE GOTO $
79
LABORATORIJSKA VEŽBA ‐ Zadatak
1) Povezati PWAM predajnik sa serijskim portom računara preko standardnog pin‐to‐pin DB9 kabla.
2) Dovesti kolu napajanje preko TRANSFORMATORA. 3) Postaviti sondu osciloskopa kao na slici 31. (Vremenska baza
OSCILOSKOPA treba da bude 1ms). 4) Pokrenuti USART terminal iz programa mikroC.
Podesiti parametra USART terminala (prikazano na Slici 6.4): • COM1 ili COM2 (zavisno na koji port je povezano kolo) • Brzina 2400 Bauda, 1 stop‐bit (One Stop Bit), Space bit parnosti
(Parity), osam bitova čini karakter/podatak (Data bits), isključen RTS (Off)
• Podesite da prenos mikrokontroler↔PC bude HEX • Čekirati Send as number.
Slika 30. Raspored tastera i prekidača
Slika 31. Postavljanje sonde osciloskopa
80
• Raspored tastera i prekidača je na Slici 30. • Pritiskom na taster SW1 vrši se resetovanje mikrokontrolera • Pritiskom na taster SW2 vrši se generisanje testnog signala, koji je
prikazan na donjoj slici. Testni signal sadrži 4 sekvence 00101101, 00101101, 00011011 i 11010001, što je uokvireno u crvenom «prozoru» (Slika 32).
• Kada je prekidač S1 u stanju logičke «1», to znači da se iz USART terminala šalju 4 dvobitna PAM signala, a da se širinska modulacija definiše prekidačima S3 i S4 (00, 01, 10, 11). Dakle, sva četiri signala se amplitudski modulišu po obrascu: 00 (‐3.5V), 01 (‐1.75V), 10 (1.75V), 11 (3.5V). Zatim se vrši širinska modulacija zavisno od stanja prekidača S3 i S4 (00, 01, 10, 11) .
• Kada je prekidač S1 u stanju logičke «0», to znači da se iz USART terminala šalju 4 dvobitna PAM signala, pri čemu se sa prva dva bita definiše amplitudska modulacija, sa sledeća dva širinska modulacija. Isto se odnosi i na sledeći nibl (četvorku). Stanja prekidača S3 i S4 se u ovom slučaju programski ne tretiraju.
Slika 32. Izgled testne sekvence je uokvirena crvenim prozorom
81
Slika 33. Zadavanje sekvenci iz USART terminala
5) Proveriti rad PWAM predajnika i snimiti oblike signala zadavanjem različitih sekvenci iz USART terminala za slučaj S1 =1.
6) Proveriti rad PWAM predajnika i snimiti oblike signala zadavanjem različitih sekvenci iz USART terminala za slučaj S1 =0 i različita stanja prekidača S3 i S4 (Slika 33.).
Napomena: Ako u USART terminalu zadate 180, to je identično kao da ste poslali 8‐bitnu sekvencu 10110100 ( 180DEC = B4HEX=10110100BIN).
92
Zaključak
U ovom projektu realizovan je predajnik signala modulisanog pomoću impulsno‐širinske i impulsno‐amplitudske modulacije gde se kao ulazni podaci šalju sekvence podataka sa PC‐a preko RS‐232 komunikacije. Štampana pločica je kreirana u Protel‐u, a realizovana u firmi «Denitron».
Za pisanje koda koristili smo kompajler mikroC, a za upis koda u mikro‐kontroler koristili smo ALLPIC programator.
U ovom radu su objašnjene osnovne karakteristike PWM i PAM modulacije, sa detaljnim grafičkim objašnjenjima, sadržanje veoma kratak opis mikrokontrolera PIC16F877‐DIP40.
Ukratko je opisan MikroC kompajler i softverski USART terminal, koji služi za komunikaciju mikrokontrolera PIC16F877 i PC računara.
Prilikom programiranja mikrokontrolera kao alat je korišćen MikroC. U toku realizacije ovog rada planiran je jos jedan rad koji bi predstavljao
prijemnik za PWM i PAM modulaciju, ali on nije realizovan do završetka predajnika tako da je moguća modifikacijaovog rada radi usklađivanja sa prijemnikom da bi predajnik i prijemnik predstaljali jednu funkcionalnu celinu.
93
Literatura
• PWM and PAM signaling ‐ Ching Yuan Yang, Yu Lee
• AllPIC programator, Info Elektronika ‐ Niš o IC‐Prog, http://www.ic‐prog.com o mikroC, firma Mikroelektronika, http://mikroe.com
• PIC16F877, Microchip Tecnology, http://www.microchip.com
• Sprega mikrokontrolera PIC16f877 sa paralelnimperiferijskim
interfejsom8255A i D/A konvertorim DAC832LCV Slaviša Popović, Mladen Pavlović, Siniša Stoilković‐ Elektronski fakultet ‐ Niš, (seminarski rad)
• Komunikacija mikrokontrolera PIC16F877‐20 preko SPI modula Dušan
Đorđevič, Žarko Đorđević ‐ Elektronski fakultet ‐ Niš, (seminarski rad)
94
O Autorima:
Prezime: Miličić
Ime: Nikola
Adresa stanovanja: 18220 Aleksinac Taušanovićeva 59
e-mail adresa: [email protected]
Datum rođenja: 21. 10. 1983.g.
Nacionalnost: Srbin Obrazovanje:
Gimnazija ”Drakče Milovanović“ Aleksinac
Kompletna ili stepenovana diploma: IV stepen
Poznavanje jezika: Engleski (odlično)
Vozačka dozvola: B kategorija
Rad na računaru: WINDOWS (98/2K/XP/VISTA), Linux, CorelDraw, Adobe PhotoShop, MS Office, PHP, MikroC, JAVA,
Posebna interesovanja: Rač. mreže, internet, obrada video signala, baze podataka, statistika, kriptovanje podataka, itd.
95
Prezime: Branković
Ime: Dragan
Adresa stanovanja: 12255 Duboka bb
e-mail adresa: [email protected]
Datum rođenja: 15. 02. 1983.g.
Nacionalnost: Srbin Obrazovanje:
ETŠ ”Nikola Tesla“ Beograd
Kompletna ili stepenovana diploma: IV stepen
Poznavanje jezika: Engleski (dobro)
Vozačka dozvola: B kategorija
Rad na računaru: WINDOWS (98/2K/XP/VISTA), MS OFFICE LINUX, ASTERISK, JAVA, PROTEL...
Posebna interesovanja: Muzika, obrada zvuka, razvoj računarskog hardvera, itd.