impulsno širinske (pwm) i

98
Elektronski fakultet u Nišu Implementacija impulsnoširinske (PWM) i impulsnoamplitudske modulacije (PAM) korišćenjem mikrokontrolera PIC16F877 Mentor: Studenti: Prof. Dr. Mile Stojčev Miličić Nikola Branković Dragan

Upload: others

Post on 30-Oct-2021

1 views

Category:

Documents


0 download

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 ).      

                      

15

     

        RASPORED PINOVA PIC16F877 DIP‐40   

                       

Slika 12.  Raspored pinova mikrokontrolera u kućištu DIP40 

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.     

17

  

 Sl.13. Arhitektura mikrokontrolera PIC16F877A 

      

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 

        

38

   

39

        

         

Slika 29. Štampana ploča (PCB) PWAM predajnika realizovanog pomoću mikrokontrolera 

                   

 Slika 29a. Finalna realizacija PWAM predajnika 

40

 

  

Slika 29b. Finalna realizacija PWAM predajnika sa transformatorom

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). 

  

             

82

Prilog 

83

84

85

86

87

88

89

90

91

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.