upravljanje d-a konvertora mikrokontroleromes.elfak.ni.ac.rs/papers/upravljanje d-a...

70
UVOD Sistem oplemenjen mikrokontrolerom u potpunosti zamenjuje coveka, malih je dimenzija i mala je potrosnja energije. Mikrokontroleri sve vise zalaze u svaki segment covecanstva. Uredjaji novije generacije su nezamislivi bez mikrokontrolera. Nalaze se svuda: u racunarau, u kucnim aparatima, na profesionalnim uredjajima, na uredjajima zamernu tehniku i kontrolu... Zahvaljuci cinjenici da mikrokontroler PIC16F877A firme Microchip pretstavlja integraciju centralne procesorke jedinice (CPU), memorije i periferija, ne zahteva se slozeni eksterni hardver da bi se realizovao mikroračunarski sistem. Ovaj mikrokontroler je izradjen u CMOS tehnologiji sa ugradjenom FLASH i EEPROM memorijom za memorisanje programa i podataka. PIC16F877A ima tipicnu RISC arhtekturu. Ova arhitektura karakterise se manjim skupom instrukcija koje se brze izvrsavaju od instrukcija kod CISC arhitekture. U daljem tekstu cemo se truditi da detaljnije opisemo svaki deo sistema i da pokazemo kako citav sistem radi. U prvom poglavlju reci cemo nesto vise o samom mikrokontroleru PIC16F877. Drugi deo se bavi problematikom analogno- digitalne konverzije,u trecem delu cemo detaljno opisan celokupni sistem. U cetrvrtom delu prikaz je softver mikrokontrolera sa detaljnim komentarima. Bice reci i o kompajlerima, njihovim manama i prednostima. Napomenimo jos, da je prvobitni zadatak naseg sistema bio bezicna komunikacija, koja bi se odvijala cipom RXQ1. Medjutim, u zavrsnoj fazi izrade doslo je do promene plana, tako da smo uz minimalne hardverske izmene i ponovnog pisanja celokupnog softvera realizovali generator funkcija.

Upload: tranmien

Post on 15-Mar-2019

219 views

Category:

Documents


0 download

TRANSCRIPT

UVOD

Sistem oplemenjen mikrokontrolerom u potpunosti zamenjuje coveka, malih je dimenzija i mala je potrosnja energije. Mikrokontroleri sve vise zalaze u svaki segment covecanstva. Uredjaji novije generacije su nezamislivi bez mikrokontrolera. Nalaze se svuda: u racunarau, u kucnim aparatima, na profesionalnim uredjajima, na uredjajima zamernu tehniku i kontrolu...

Zahvaljuci cinjenici da mikrokontroler PIC16F877A firme Microchip pretstavlja integraciju centralne procesorke jedinice (CPU), memorije i periferija, ne zahteva se slozeni eksterni hardver da bi se realizovao mikroračunarski sistem. Ovaj mikrokontroler je izradjen u CMOS tehnologiji sa ugradjenom FLASH i EEPROM memorijom za memorisanje programa i podataka. PIC16F877A ima tipicnu RISC arhtekturu. Ova arhitektura karakterise se manjim skupom instrukcija koje se brze izvrsavaju od instrukcija kod CISC arhitekture.

U daljem tekstu cemo se truditi da detaljnije opisemo svaki deo sistema i da pokazemo kako citav sistem radi. U prvom poglavlju reci cemo nesto vise o samom mikrokontroleru PIC16F877. Drugi deo se bavi problematikom analogno-digitalne konverzije,u trecem delu cemo detaljno opisan celokupni sistem. U cetrvrtom delu prikaz je softver mikrokontrolera sa detaljnim komentarima. Bice reci i o kompajlerima, njihovim manama i prednostima.

Napomenimo jos, da je prvobitni zadatak naseg sistema bio bezicna komunikacija, koja bi se odvijala cipom RXQ1. Medjutim, u zavrsnoj fazi izrade doslo je do promene plana, tako da smo uz minimalne hardverske izmene i ponovnog pisanja celokupnog softvera realizovali generator funkcija.

1. Mikrokontroleri 1.1 Mikroprocesori u odnosu na mikrokontrolere

Da bi ukazali na to kakva razlika postoji izmedju mikroprocesora i mikrokontrolera analiziracemo sliku 1.1 koja predstavlja jedan detaljan blok dijagram mikroracunarskog sistema. Dok je mikroprocesor (CPU) na jedinstvenom cipu sam, mikrokontroler, na jedinstvenom cipu, sadrzi CPU, RAM i ROM memoriju i ostale ulazno-izlazno orijentisane gradivne blokove (paralelni i serijski interfejsi, tajmeri, logika za prihvatanje prekida, A/D i D/A konvertore i dr.).

Sl.1.1 Detaljni blok dijagram mikroracunarskog sistema

1.2 Mikroprocesori

Na slici 1.2 prikazan je blok dijagram mikroprocesora. CPU cine sledeci blokovi: ALU, PC, SP, odredjeni broj radnih registara, kola za taktovanje i sinhronizaciju i kola koja se koriste za prihvatanje zahteva za prekid.

Sl.1.2 Blok dijagram mikroprocesora(CPU-a)

Da bi se kompletirao mikroracunarski sistem pored mikroprocesora potrebno je dodati ROM, RAM memorijske dekodere, oscilator, odredjeni broj ulazno-izlaznih uredjaja, kakvi su paralelni i serijski portovi za podatke, A/D i D/A konvertori i drugo. Pored ulazno-izlaznih uredjaja specijalne namene, cesto se javlja i potreba da se ugrade i kontroleri prekida, DMA kontroleri, kao i brojaci/tajmeri ciji je zadatak da oslobode CPU od obavljanja U/I aktivnosti. Kada se u sistem instaliraju i uredjaji za masovno memorisanje (hard disk, CD drajver), kao i tastatura, mis i CRT displej tada se taj ''mali racunar'' moze koristiti za razlicite aplikacije opste namene. Osnovna namena CPU-a je da pribavlja podatke, obavlja izracunavanja nad podacima i memorise rezultate izracunavanja na disku kao i da za potrbe korisnika prikaze te rezultate na displeju (CRT, TFT, LED i dr.). Programi koje koristi

mikroprocesor memorisani su na disku odakle se citaju i smestaju u RAM. Deo programa, najcesce malog obima, se obicno smesta i u ROM-u. 1.3 Mikrokontroleri

Blok dijagram mikrokontrolera prikazan je na slici 1.3. Mikrokontroler je u sustini pravi ''mali racunar'' na cipu, koji sadrzi sve gradivne blokove CPU-a (ALU, PC, SP, registre i dr.), ali takodje i RAM, ROM, paralelne i seriske U/I portove, generatore takta i dr. Kao i mikroprocesor, i mikrokontroler je uredjaj opste namene, koji pribavlja podatke, obavlja ogranicenu obradu nad tim podacima, i upravlja svojim okruzenjem na osnovu rezultata izracunavanja. Mikrokontroler u toku svog rada koristi fiksni program koji je smesten u ROM-u i koji se ne menja u toku zivotnog veka sistema.

Sl.1.3 Blok dijagram mikrokontrolera

Mikrokontroler koristi ogranicen skup jedno- ili dvo-bajtnih instrukcija koje se koriste za pribavljanje programa i podataka iz interne memorije. Veliki broj ulazno-izlaznih pinova mikrokontrolera se moze koristiti za vise namena sto se softverski definise. Mikrokontroler komunicira sa spoljnim svetom (pribavlja i predaje podatke) preko svojih pinova, pri cemu je arihitektura i skup instrukcija projektovan za manipulisanje podacima obima bajt ili bit. 1.4 Razlike izmedju mikroprocesora i mikrokontrolera

Razlike su brojne ali one koje su najvaznije su sledece: 1. Mikroprocesori su najcesce CISC tipa. Za kopiranje podataka iz spoljne

memorije u CPU koriste veci broj op-kôdova, dok mikrokontroleri jedan ili dva.

2. Za manipulisanje sa podacima tipa bit, mikroprocesori koriste jedan ili dva tipa instrukcija, dok je kod mikrokontrolera taj broj veci.

3. Mikroprocesori su projektovani za brzi prenos podataka iz programa sa spoljno adresiranih lokacija u cip, dok se kod mikrokontrolera brzi prenos bitova obavlja u okviru cipa.

4. Mikrokontroler moze da funkcionise kao racunar bez dodataka spoljnih gradivnih blokova (memorije i U/I uredjaja), dok operativnost mikroprocesora bez spoljne memorije i U/I podsistema nije moguca.

1.6 Mikroracunar

Mikroracunar je sastavljen od tri osnovna dela: Procesor (CPU), U/I podsistem i memoriski podsistem. Svaki deo moze varirati u kompleksnosti, od osnovnog pa do jako slozenog. Ako je procesor realizovan na jedninstvenom cipu, tada se on naziva mikroprocesor. Kada na jedinstvenom cipu postoji mikroprocesor, i ograniceni iznos memorije i ulaza –izlaza tada se to integrisano kolo naziva mikrokontroler. Na slici 1.4 prikazan je jedan tipican mikroracunarski sistem.

Sl.1.4 Tipican mikroracunarski sistem

Ukazimo sada u kratkim crtama na strukturu i funkcije koje obavljaju osnovni gradivni blokovi mikroracunarskog sistema: Centralna procesorska jedinica (CPU) – srce sistema i moze biti realizovana kao 4, 8 ili16-bitna procesorska jedinica. Memorija – moze biti RAM, ROM, EPROM, EEPROM i FLASH tipa ili bilo koja njihova kombinacija. Memorija se koristiti za cuvanje programa i podataka. Ulaz/Izlaz (U/I) – cine ga blokovi koji mogu da obavljaju digitalne, analogne i specijalne funkcije. Preko ulazno-izlaznog podsistema mikrokontroler komunicira sa spoljnim svetom. 1.7 Ostala kola za podrsku rada sistema Oscilator –je taktni generator mikroracunar. Njegova uloga je da sinhrono pobudjuje sva kola u okviru mikroracunarskog sistema. Oscilator moze biti napravljen od diskretnih elemenata ili kao gotov modul. Sistem za napajanje- moze biti izveden kao ispravljacka jedinica, autonomna bateriska ili kombinacija. Jedinica za napajanje moze biti izvedena kao linearna (konvertor je tipa AC-DC), kao prekidacki regulator tipa DC-DC konvertor( konverzije tipa AC-DC-DC) ili neka kombinacija. Pas-cuvar (watchdog timer)- koristi se kod sistema za rad u realnom vremenu da obavesti procesor o tome da je istekao krajnji rok izvrsenja zadatka ili da aktivira

procesor iz stanja HALT u slucaju ako se rad procesora zaustavi kada se procita neki pogresan op-kod ili dr. 1.8 Mikrokontroler PIC16F877

Kao sto je u uvodu naglaseno centralna komponenta naseg sistema je mikrokontoler PIC16F877 firme Microchip. U ovom poglavlju cemo se truditi da detaljnije opisemo ovo integrisano kolo. Mikrokontroleri imaju integrisane sve gore pobrojane gradivne blokove: CPU, memoriju, oscilator, watch-dog timer i U/I, integrisni su unutar samog cipa. I pored prednosti koje se nude integracijom postoji jedan ozbiljan nedostatak koji se ogleda u malom iznosu implementirane memorije (reda kB) i relativno skromnim mogucnostima ulazno-izlaznog podsistema (dva do tri paralelna porta, do tri tajmera, jedan do dva UART-a, jedan ADC). PIC familija mikrokontrolera podrzava rad sa:

velikim brojem U/I uredjaja (paralelni portovi,serijski portovi,LCD i dr.); memorijama razlicitog tipa (EEPROM, FLASH, RAM, ROM)

1.9 Osnovne karakteristike mikrokontrolera PIC16F877:

Visoko performansni RISC CPU 35 instrukcija obima jedne reci Radna frekvencija ,fref = DC-20 MHz Trajanje taktnog intervala tcpu = 200 ns, kada je fref = 20 MHz Op-kôd obima14bita Harverski magacin sa osam nivoa Tri nacina adresiranja: -direktno

-indirektno -relativno

Programska memorija kapaciteta 8 kx14-bitnih reci realizovane u FLASH tehnologiji

Memorije za podatke tipa RAM kapaciteta 368x8 bita Memorije za podatke EEPROM tipa kapaciteta 256x8 bita Prekidi ( do 14 izvora prekida) U/I portovi: A,B,C,D,E Tri tajmera: -Timer0: 8-bitni tajmer/brojac dogadjaja -Timer1: 16-bit tajmer/brojac dogadjaja -Timer2: 8-bit tajmer/brojac dogadjaja 10-to bitni 8-kanalni Analogno-Digitalni (A/D) konvertor Seriska komunikacija: MSSP,USART Paralelna komunikacija: PSP Power-on Reset- reset pri ukljucenju napajanja(POR)

Power-up timer-unosenje kasnjenja nakon ukljucenja napajanja (PWRT) Oscillator Start-up Timer-unosenje kasnjenja nakon stabilizovanja radne

frekvencije oscilatora(OST) Sleep -rezim rada za stednju energije Watchdog timer sa sopstvenim integrisanim RC oscilatorom za nezavisni

rad Izbor tipa oscilatora Mala potrosnja,velika brzina rada Radni napon od 2V do 5.5V Mala potrosnja energije:

1. <0.6 mA pri naponu od 3V i radnoj frekvenciji od 4 MHz 2. 20µA pri naponu od 3V i radnom taktu od 32kHz 3. <1µA u standby nacinu rada

1.10 Kratak opis mikrokontrolera PIC16F877

Kao sto smo vec naglasili mikrokontroler PIC16F877 poseduje tipcnu RISC arhitekturu. Arhitektura poseduje odvojene magistrale za podatke i programski kôd. Obim podataka je 8-bitni, dok je programski kôd 14-bitni. Moguce je protocno izvrsenje (pipelining). Sve insrukcije su istog obima (osim instrukcija grananja) i izvsavaju se za cetiri taktna intervala. Dakle, ako koristimo oscilator npr. od 20 MHz dobijamo da ciklus instrukcuije traje 200 ns. Sa blok dijagrama (slika 1.5) mogu se uociti sledeci gradivni blokovi:

Flash programska memorija – 8 kiloreci 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 Razne periferne jedinice (portovi, tajmeri, A/D konvertor, USART,...)

Sl.1.5 Blok dijagram mikrokontrolera PIC16F877 1.11 Raspored nozica

Jezgro mikrokontrolera PIC16F887 pakuje se u 40-pinsko DIP pakovanje ili u 44-pinska kucista QFP i PLCC tipa. Na slici 1.6 prikazan je raspored nozica kod 40-to pinskog DIP pakovanja:

Sl.1.6 Raspored nozica mikrokontrolera PIC16F877

Napajanje od +5V se dovodi na pinove VDD (11 i 32) a masa na pinove VSS (12 i 31).

Nozice OSC1 i OSC2 (pinovi 13 i 14) sluze za priklucivanje oscilatorskih komponeti (RC-kolo ili kvarc).

Pin 1 (MCLR/VPP) ima dvostruku ulogu. Standardno se koristi kao Reset, a u procesu programiranja kao pin za dovodjenje visokog napona (13V).

Ostalih 33 pina prestavljaju U/I linije. One su grupisane u pet portova (PORTA-PORTE) i svaki od njih mozemo konfigurisati kao ulazni ili izlazni. Osim opste namene vecina pinova ima i specificnu namenu koju dobija u slucaju koriscenja nekih specijalnih periferija mikrokontrolera (brojaca, ADC, serijske komunikacije).

1.12 Generator takta (Oscilator)

Moguce su cetri varijante u konfiguraciji oscilatora: LP Low Power Crystal XT Crystal / Resonator HS High Speed Crystal / Resonator RC Resistor/Capacitor Kontroler moze da radi i na 32 kHz i tada ima jako malu potrosnju.

Najednostavnija varijanta je RC oscilator (slika 1.7).Ova varijanta oscilatora moze se koristiti u aplikacijama gde se precizna procena vremenskih intervala ne zahteva.

Sl.1.7 Nacin povezivanja RC oscilatora

Frekfencja oscilovanja zavisi od napona napajanja, vrednosti Rext i Cext ,kao i radne temperature. Rext treba da je u granicama od 5k do 100k. Van ovog opsega rad oscilatora postaje nestabilan i osetljiv na spoljne uticaje. Cext se moze i izostaviti, ali zbog stabilnosti se preporucuje 20pF. Na OSC2/CLKOUT generise se taktni impuls cija je perioda cetiri puta veca od periode oscilatora. Kod vremenski kriticnih aplikacija treba ugradjivati kvarcni oscilator ili keramicki rezonator. Vrednosti kondenzatora C1 i C2 (slika 1.8), treba da su jednake.

Sl.1.8 Nacin povezivanja XT oscilatora

Preporuka proizvodjaca za vrednosti C1 i C2 kod nekih konfiguracija je: Tabela 1.1

LP 32 kHz 68-100pF - Kristal 200 kHz 15-33pF - Kristal

Tabela 1.2

XT 100 kHz 100-150pF - Kristal

455 kHz 47-100pF Rezonator - 2.0 MHz 15-33pF Rezonator Kristal 4.0 MHz 15-33pF Rezonator Kristal

Tabela 1.3

HS 4.0 MHz 15-33pF - Kristal 8.0 MHz 15-33pF Rezonator Kristal 10.0MHz 15-33pF Rezonator Kristal

Moguce je i da se oscilacije dovode iz nekog spoljnjeg izvora kao sto je prikazano na slici 1.9:

Sl.1.9.Nacin povezivanja spoljnjeg oscilatora

Najcesce se koristi spoljni kristalni oscilator (XT) radne frekvencije 4MHz. Bice prikazano kako se spaja kristalni oscilator sa mikrokontrolerom (slika 1.10) i kako izgleda oblik signala generisan iz oscilatora u trenutku ukljucenja (slika 1.11). Oscilatoru treba neko vreme ΔT da se stabilizira na potrebnu frekvenciju i amplitudu

Sl.1.10 Spajanje kristalnog oscilatora Sl.1.11 Oblik signala pri ukljucenju oscilatora 1.13 Takt/instrukciski ciklus Takt koji se dovodi na nozice oscilatora OSC1 u mikrokontroleru se deli na cetiri vremenski nepreklapajuca taktna signala nazvana Q1,Q2,Q3 i Q4. Skup ovih signala cine jedan instrukciski ciklus (slika 1.12a). U zavisnosti od trenutka generisanja u okviru ciklusa instrukcija taktni signali Q1-Q4 se koriste za sledece namene:

Q1-pribavljanje instrukcije iz programske memorije Q2-dekodiranje naredbe iz prethodnog instrukciskog ciklusa Q3-izvrsenje naredbe iz prethodna dva instrukciska ciklusa Q4-prenos op-kôda naredbe pozvane u Q1 u instrukcijski registar.

Uzmimo za primer instrukciski ciklus TCY2 (slika 1.12a). U toku taktnog impulsa Q1 instrukcijskog ciklusa TYC2, stanje programskog brojaca (PC) se uvecava za 1 i pribavlja naredna instrukciju iz programske memorije. U toku intervala Q2 dekodira se instrukcija pribavljena u TCY1, a u toku Q3 se izvrsava instrukcija pribavljena u TCY0. U cetvrtom taktu Q4 instrukciskog ciklusa TCY2 se, instrukcija pribavljena u toku Q1, prebacuje se u instrukciski registar.

Sl.1.12 Vremenski dijagram i protocnost kod izvrsavanja instrukcije

a).Vremenski dijagram

Sl 1.12 b) Protocnost kod izvrsenja sekvence instrukcije

Na slici 1.12b prikazan je protocni nacin izvrsenja sekvence od 5 instrukcija. Kao sto se vidi sa slika 1.12b postoje dva stepena u protocnoj obradi. Prvi se odnosi na pribavljanje, a drugi na izvrsenje. Neka je protocni sistem inicijalno prazan. U toku TCY0 pribavlja se instrukcija sa labele 1 tipa MOVLW 55h. U toku TCY1 izvrsava se instrukcija sa labele 1 i pribavlja instrukcija sa labele 2 tipa MOVWF PORTB. U toku TCY2 pribavlja se instrukcija sa labele 3 koja je tipa CALL SUB_1 i pretstavlja poziv potprograma 1, i izvrsava se instrukcija sa labele 2. U toku TCY3 pribavlja se instrukcija sa labele 4 tipa BSF PORTA, BIT3 i izvrsava insrukcija sa labele 3. Napomenimo da je instrukcija sa labele 3 tipa bezuslovno grananje tako da, u principu, efekat izvrsenja instrukcije sa labele 4 ne treba da bude vidljiv,tj. ona treba da pretstavlja neku operaciju tipa NOP (da ne menja statusne markere procesora kao i stanja procesora). Nakon izvrsenja instrukcije CALL SUB_1 vrednost programskog brojaca se postavlja na adresu insrukcije koja se nalazi na labeli 5. U toku TCY4 pribavlja se instrukcija sa labele 5 tipa Instruction @ address SUB_1 (prva naredba potprograma), a izvrsava instrukcija na labeli 4 koja je sa stanovista procesora i programa operacija tipa NOP. U TCY5 pribavlja se druga naredba potprograma i izvrsava prava. 1.14 Reset

Reset sluzi da bi sve registre mikrokontrolera doveli u pocetni polozaj. Ako se mikrokontroler “zakoci” ,ili smo ga tek ukljucili, treba ga resetovati. Da bi sprecili slucajno dovodjenje “0” na MCLR nozicu, porebno ju je preko otpornika povezati na pol napajanja Vdd (slika 1.13)

Sl.1.13. Povezivanje kola za reset

Postoji vise vrste reseta kod PIC16F877A mikrokontrolera:

Power-on reset (POR) MCLR Reset pri normalnom radu MCLR Reset prilikom SLEEP rezima rada WDT Reset pri normalnom radu WDT Wake-up (budjenje iz SLEEP rezima rada) Brown-out Reset (BOR)

Power-on reset (POR) impuls se generise u samom kolu kada se detektuje porast napona napajanja (oko 1,2 – 1,7 V). Da bi se POR iskoristio dovoljno je MCLR nozicu prikljuciti na Vdd direktno ili preko otpornika (sl. 1.10). Ukoliko je porast napona napajnja spor neophodno je na MCLR postaviti spoljnje kolo za reset. Sema kola za POR reset je prikazana na slici 1.14.

Sl.1.14 Spoljasnje kolo za reset

Interno POR kolo nece generisati Reset signal kad napon napajanja padne ispod minimuma. Za situacije kada je moguca pojava BROWN-OUT-a (privremeni pad napona ispod Vmin) prebno je napraviti spoljnje Brown-out reset kolo,sto je prikazano na slici 1.15.

Sl.1.15.Kolo za BROWN-OUT reset Varijanta 1

Kolo ce generisati Reset impuls kada napon bude ispod (Vz + 0.7) V Vz – napon na Zener diodi.

Sl.1.16. Kolo za BROWN-OUT reset Varijanta 2

Uslov da tranzistor iskljuci je:

V7.0R1R2

R1Vdd

Power-up Timer (PWRT) generise impuls fiksne sirine (nominalno 72 msec) od pojave impulsa POR-a. Za to vreme ce kontroler biti je u Reset stanju. Za ovaj vremenski period se obezbedjuje da napon napajanja dostigne nominalnu vrednost. Tajmeru PWRT se dozvoljava rad setovanjem PWRTE bita koji pripada konfiguracionoj reci u fazi programiranja cipa. PWRT se taktuje internim RC oscilator. Oscilator Start-up Timer (OST) obezbedjuje kasnjenje od 1024 taktnih intervala nakon isteka kvazistabilne periode PWRT-a (vidi tabelu 1.4). Ovo obezbedjuje da

kristalni oscilator ili rezonator startuju stabilnom frekvencijom. OST se aktivira samo kod XT, LP i HS rezima rada i to pri:

POR, i budjenju iz SLEEP rezima rada.

Mikrokontroler PIC16F877 ima implementiran dvo-bitni statusni registar nazvan PCON (Power Control Register). Prvi bit nazvan POR setuje se kada se aktivira Power-on-Reset a resetuje se kada je se aktivira neki drugi Reset. Drugi bit (BOR) kada je setovan ukazuje da je aktivan Brown-out stanja (nepropisana naponska stajna u napajanju mikrokontrolera), zbog kojeg se takodje može aktivirati Reset. Tabela 1.4

Power-up Konfiguracija

oscilatora PWRT omogucen PWRT

onemogucen Budjenje iz

SLEEP rezima rada

XT, HS, LP 72 ms + 1024 Tosc

1024 Tosc 1024 Tosc

RC 72 ms - - Stanja na kojima se postavljaju interni registri CPU-a nakon Reseta zavisi od vrste Reseta i rezima rada u kojima se nalazi procesor (Sleep i normalni). Stanje nekih registara ostaje nedifinisano, neki zadrzavaju svoje stanje, a ostali se postavljaju u unapred definisana stanja (vidi Tabele 1.5 i 1.6). Tabela 1.5: Postavljanje registara nakon reseta

Program Counter STATUS reg. Power-on reset (POR) 000h 0001 1xxx

MCLR reset pri normalnom radu 000h 000u uuuu

MCLR reset prilikom SLEEP rezima rada 000h 0001 0uuu

WDT Reset pri normalnom radu 000h 0000 1uuu

WDT Wake-up (budjenje iz SLEEP rezima rada) PC+1 uuu0 0uuu

Interapt 004h uuu1 0uuu Tabela 1.6: Postavljanje registara nakon reseta

Registar Power-on reset

MCLR reset pri: -normalnom radu

-SLEEP mod WDT reset pri normalnom radu

Budjenje iz SLEEP -interapt

-WDT time out

00h INDF ---- ---- ---- ---- ---- ----

01h TMR0 xxxx xxxx uuuu uuuu uuuu uuuu 02h PCL 0000 0000 0000 0000 PC+1 03h STATUS 0001 1xxx 000q quuu uuuq quuu 04h FSR xxxx xxxx uuuu uuuu uuuu uuuu 05h PORTA ---x xxxx ---u uuuu ---u uuuu 06h PORTB xxxx xxxx uuuu uuuu uuuu uuuu 08h EEDATA xxxx xxxx uuuu uuuu uuuu uuuu 09h EEADR xxxx xxxx uuuu uuuu uuuu uuuu 0Ah PCLATH ---0 0000 ---0 0000 ---u uuuu 0Bh INTCON 0000 000x 0000 000u uuuu uuuu 80h INDF ---- ---- ---- ---- ---- ---- 81h OPTION 1111 1111 1111 1111 uuuu uuuu 82h PCL 0000 0000 0000 0000 PC+1 83h STATUS 0001 1xxx 000q quuu uuuq uuuu 84h FSR xxxx xxxx uuuu uuuu uuuu uuuu 85h TRISA ---1 1111 ---1 1111 ---u uuuu 86h TRISB 1111 1111 1111 1111 uuuu uuuu 88h EECON1 ---0 x000 ---0 q000 ---0 uuuu 89h EECON2 ---- ---- ---- ---- ---- ---- 8Ah PCLATH ---0 0000 ---0 0000 ---u uuuu 8Bh INTCON 0000 000x 0000 000u uuuu uuuu Legenda: x – Nepoznato stanje u – Nepromenjeno stanje q – Stanje zavisi od uslova - - Ne postoji fizicki cita se kao 0 Struktura Reset logike za PIC 16F877A data je na slici 1.17:

Sl.1.17 Blok dijagram Reseta

1.15 Watchdog timer

Watchdog timer (WDT) taktuje se nezavisanim RC oscilatorom koji radi cak i kad je zaustavljen rad glavnog oscilatora, u SLEEP rezimu rada, povezan na OSC1/CLKIN i OSC2/CLKOUT pinove. Prekoracenje intervala brojanja WDT-a, prilikom normalnog rada, izaziva RESET kontrolera. Ako je kontroler bio u SLEEP rezimu rada prekoracenje tajmera ce probuditi kontroler i program ce nastaviti sa radom u normalnom rezimu. Iskljucivanje WDT-a se vrsi resetovanjem WDTE bita u konfiguracionoj reci. Nominalno vreme WDT-a je 18 ms bez uptrebe preskalera. Ovo vreme moze da varira od kola do kola zbog temperature i slicno. Ukoliko je potrebno duze vreme moze se WDT-u pridruziti preskaler sa faktorom deljenja do 1:128, tako se vreme moze produziti do 2,3 s. Instrukcije CLRWDT i SLEEP resetuju WDT. TO’ bit u STATUS registru ce biti 0 nakon isteka WDT. 1.16 Prekidi

Mikrokontroler PIC16F877 podrzava tehniku rada sa prekidima (interrupts). Postoji ukupno 14 izvora pekida, neki su interni, a drugi su eksterni. Svaki prekid nema sopstveni vektor-broj. Kada se prihvati zahtev za prekid izvrsenje prekidnog programa pocinje od adrese 0x0004. Tada se programskim putem testira stanje markera koji se postavljaju kada se aktivira odgovarajuci prekid (interrupt flags polling). Kada se ustanovi koji je od uredjaja generisao zahtev za prekid prelazi se na izvrsenje odgovarajuce rutine za obradu tog prekida. Povratna adresa prekinutog programana cuva se automatski u hardverski magacin. Povratak iz prekidnog programa se vrsi instrukcijom RETFIE. Upravljacki registar INTCON se koristi za maskiranje prekida. Pregled sadrzaja marker bitova kojim se generise zahtev za prekid je definisan na slici 1.18. Znacenje pojedinih markera je sledece:

T0IF (INTCON:2) setuje se na prekoracenje Timer0 INTF (INTCON:1) setuje se u slucaju da nastupi spoljni prekid na pinu

RBO/INT RBIF (INTCON:0) setuje se kada se dogodi promena stanja na nekom od

pinova RB4, RB5, RB6, RB7 PSPIF (PIR1:7) PSP marker bit koji se koristi u opreciji citanja i upisa na

PORTD kada je on konfigurisan kao PSP ADIF (PIR1:6) marker koji se koristi za vreme analogno-digitalne

konverzije RCIF (PIR1:5) marker koji oznacava da je prijemni bafer koji koji koristi

USART blok, pun TXIF (PIR1:4) marker koji pokazuje da je bafer za slanje podataka koji

koristi USART prazan SSPIF (PIR1:3) marker koji se koristi za rad sinhronog serijskog porta CCP1IF (PIR1:2) marker koji koristi CCP1 blok

TMR2IF (PIR1:1) marker koji setije Timer2 kada dodje do prkoracenja TMR1IF (PIR1:0) marker koji setije Timer2 kada dodje do prkoracenja EEIF (PIR2:4) marker koji se setuje kada se zavrsi upis u interni

EEPROM BCLIF (PIR2:3) marker koji koji korist SSP blok kada je konfigurisan da

radi u I2C master rezimu rada CCP2IF (PIR2:0) marker koji koristi CCP2 blok.

Pored bita za dozvolu rada svih prekida General Interrupt Enable (GIE) i bita za dozvolu rada prekida generisanih od strane periferija (PEIE), ovom registru pripadaju i markeri prekida (interrupt-flags) i bitovi koji dozvoljavaju prekid koji izaziva tajmer0, spoljasnji prekid na pinu RB0/INT i prekida porta B na promenu stanja. Osim ova tri osnovna prekida postoji jos 11 periferijskih prekida. Bitovi za njihovo omogucenje nalaze se u registrima PIE1 i PIE2, a korespodentni flegovi, u registrima PIR1 i PIR2. Ovi se flegovi setuju cim se ispuni uslov interapta bez obzira na stanje njihovog bita omogucenja, a po izvrsenju servis rutine potrebno ih je sostverski resetovati. Na sledecoj slici (sl. 1.18) prikazana je logicka sema svih interrupt-a sa tabelom u kojoj su oni pobrojani:

Sl.1.18 Sema logike za prihvatanje zahteva za prekid i sadrzaj

1.17 U/I Portovi

Za vezu mikrokontrolera sa spoljnim svetom zaduzeni su ulazno/izlazni portovi. Ima ih pet i oznaceni kao PORTA, PORTB, PORTC, PORTD i PORTE. Razlicitog su obima. PORTE cine tri pina, PORTA sest, a ostala tri porta su osmopinski. Odredjeni pinovi U/I portova u zavisnosti od rezima rada mogu da imaju fiksne ili promenljive funkcije. Konfiguracija smera prenosa na odgovarajucoj bit poziciji porta vrsi se upisom konfiguracione reci u pripadajuci

TRIS registar pri cemu nula konfigurise pin kao izlazni, a jedinica kao ulazni. Svaki port poseduje odgovarajuci registar podataka (PORTX) preko kojeg se programski pristupa U/I pinovima. Upis u neki od tih registara inicirace upis u lec tog porta, a njegovo citanje rezultirace citanjem logickih stanja direktno sa pinova. Sve instrukcije upisivanja su tzv. read-modify-write instrukcije. To znaci da se pri upisu u port prvo ocitaju stanja pinova, izvrsi modifikacija, a potom ispravljena vrednost upise u lec porta. Nema velike razlike u elektricnoj konstrukciji navedenih pet portova. Port B se od ostalih razlikuje posebnom opcijom koju nude cetiri MSB. Ukoliko se setuje bit RBIE u registru INTCON, svaka promena stanja na ovim pinovima generisace prekid mikrokontrolera. Port A Port A je 6-to bitni bidirekcioni port i sadrzi pinove od RA0 do RA5. TRISA je direkcioni registar koji odredjuje smer pinova na portu. Ako postavimo TRIS na 1 pin je ulazni, u suprotnom pin je izlazni. Npr. ako je TRISA=0b111111 ceo port A je ulazni, a ako je TRISA=0b000000, ceo port A je izlazni. Moguce je podeliti port A, tako da, na primer, prva 2 bita budu ulazna,a ostala 4 izlazna (TRISA=0b110000). Na slikama 1.19 i 1.20 bice prikazan blok dijagram porta A:

Sl.1.19 Port A od RA0 do RA3 i RA5 Sl.1.20 Pin RA4 na portu A Pin RA4 je izlaz sa otvorenim drejnom pa se zahteva od projektanta da veze otpornik odgovarajuce vrednosti za pozitivan napon. Pri tome mora se voditi racuna o strujnom ogranicenju pina o cemu ce biti kasnije reci. Ceo port A ima mogucnost analogno-digitalne konverzije i prvenstveno se korisi u te svrhe. A/D konvertor je 10-to bitni sa 8 ulaznih kanala, jer se u ove svrhe korite i svi pinovi na portu E (i pinovi porta A od RA0 do RA3 i pin RA5). Pin RA4 moze da se izkoristi za ulaznu frekvenciju timer0. Timer0 moze da se okida preko ovog pina na rastucu ili opadajucu ivicu ulaznog signala, sto se odradjuje selekcijom bita T0SE u registru OPTION.

Na slici 1.21 dat je tabelarni prikaz funkcija pojedinih pinova porta A i registri koji se koriste za konfigurisanje porta:

Sl.1.21 tabelarni prikaz registara za konfigurisanje porta A

Port B Port B je 8-mo bitni bidirekcioni port. Svi pinovi imaju odgovarajuce bitove u TRISB registru kojim moze da se pinovi konfigurisu kao izlazni ili kao ulazni. ‘1’ u nekom bitu u TRISB registru stavlja odgovarajuci pin u stanje visoke impedanse i on radi kao ulazni pin. ‘0’ u TRISB registru prosledjuje sadrzaj bita iz izlaznog (latch) registra na pin i on radi kao izlazni. Svi pinovi u PORTB imaju pull-up otpornike. Ovi otpornici se mogu ukljuciti jednim kontrolnim bitom. To se radi stavljanjem RBPU' bita na ‘0’. Pull-up otpornici se automatski iskljucuju kad se pin konfigurise kao izlazni. Otpornici su iskljuceni kod Power-on-reset-a. Cetri pina na PORTB (RB7-RB4) imaju mogucnost generisanja interapta. Samo pinovi definisani kao ulazni mogu prouzrokovati interapt. Vrednost na pinovima se poredi sa starom vrednoscu uhvacenoj kod zadnjeg citanja porta B. Nad ovim vrednostima se vrsi OR operacija da bi se generisao interapt na promenu stanaja na PORTB. Ovaj interapt moze probuditi kontroler iz SLEEP rezim rada. Korisnik moze u rutini za obradu prekida ponistiti prekid sledecim postupcima:

Citanjem ili pisanjem u PORTB. Ovo ce ukloniti neslaganje na portu i uslov za interapt.

Resetovanjem flag bita RBIF. Neslaganje na portu B ce nastaviti da setuje RBIF. Citanje PORTB-a ce prekinuti neslaganje i uslov za interapt i omoguciti resetovanje bita RBIF Kombinacija interapta na promennu stanja PORTB i pull up otpornika se moze iskoristiti za jednostavan interfejs za tastaturu. Da bi promena na U/I pinu bila prepoznata sirina impusa mora da bude najmanje koliko i jedan masinski ciklus (4 * Tosc). Na slikama 1.22 i 1.23 prikazana je struktura PORTB.

Sl.1.22 Struktura pinova od RB0 do RB3 Sl.1.23 Struktura pinova od RB4 do RB7 Na slici 1.24 su prikazane tabele sa funkcijama pojedinih pinova i registara koji se koriste za konfigurisanje porta B.

Sl.1.24 Tabela registara koji sluze za konfigurisanje PORTB.

Pin RB0 ima mogucnost da izazove prekid mikrokontrolera. Ako je ovaj interapt omogucen (setovan bit 4 (INTE) u INTCON registru) i na RB0/INT pinu se pojavi odgovarajuca ivica (definisana INTEDG bitom OPTION registra) nastupice interapt. Na kraju interapt rutine potrebno je u programu resetovati INTF bit u INTCON registru, kako bi naredni interapt bio moguc. Port C Port C je 8-mo bitni bidirekcioni port. Ovaj port je poseban sto na pinovima RC6 i RC7 ima ugradjen USART modul koji sluzi za serisku komunikaciju (npr. sa racunarom). Prilikom koriscenja modula za serisku komunikaciju potrebno je softverski konfigurisati pinove RC6 i RC7 tako da budu u funkciji USART modula. Na slikama 1.25 i 1.26 su prikazane blok seme PORTC, a funkcionalna tabela registara koji se koriste za konfigurisanje samog porta data je na slici 1.27.

Sl.1.25. Struktura pinova od RC0 do RC2 Sl.1.26.Struktura pinova od RC3 i i od RC5 do RC7 RC4

Sl.1.27 Tabela registara koji sluze za konfigurisanje PORTC

Port D Port D je 8-mo bitni bidirekcioni port. Ovaj port se moze konfigurisati kao 8-mo bitni paralelni mikroprocesorski port (parallel slave port-PSP), podesavanjem konfigurisuceg bita PSPMOTE (TRISC<4>). U tom rezimu rada ulazni bafer je TTL tipa. Na slikama 1.28 i 1.29 je prikazana blok sema PORTD i funkcionalna tabela registara koji se koriste za konfigurisanje samog porta.

Sl.1.28. Struktura porta D

Sl.1.29 Tabela registara koji sluze za konfigurisanje PORTD

Port E Port E je sirine 3 bita.Ima mogucnost A/D konverzije. Svaki pin porta E moze da se konfigurise softverski kao ulazni ili izlazni. Ulazni bafer je Schmitt Trigger tipa. Pinovi se mogu konfigurisati kao digitalni ili analogni,kao i u slucaju porta A, sto je vec pomenuto. Na slikama 1.30 i 1.31 prikazana je strukturna blok sema PORTE i tabelarni prikaz registara koji sluze za konfigurisanje.

Sl.1.30 Struktura porta E

Sl.1.31 Tabela registara koji sluze za konfigurisanje porta

1.18 A/D konverzija

S obzirom na kontinualnost pojava u spoljasnjem svetu, tesko je upravljati bilo kojim procesom bez digitalizacije analognih velicina. Kao sto smo vec napomenuli PORTA i PORTE imaju mogucnost A/D konverzije sto podrazumeva da se mogu konfigurisati kao analogni ili digitalni. Ako zelimo da koristimo A/D konverziju moramo ukljuciti modul za tu svrhu i podesiti ga na nacin koji nam najvise odgovara. Da bi to uradili potrbno je da pravilno podesimo registre ADCON0 i ADCON1. Zato u nastavku dajemo prikaz tih registara i prikaz tabele koji su potrebni za konfigurisanje. Na slici 1.32 je prikazan je registar ADCON0. Registar ADCON0 sluzi za podesavanje A/D konverzije: frekvencije semplovanja A/D konvertora, kanal koji se koristi za A/D konverziju, pocetak A/D konverzije i ukljucuje se modul za A/D konverziju. Registrom ADCON1 (na slici 1.33) odredjujemo ulogu pojedinih pinova (analogni ili digitalni). Modul za A/D konverziju se bazira na A/D konvertor sa sukcesivni aproksimacijama.

Sl.1.32 Registar za podesavanje A/D konverzije

Sl.1.33 Podesavanje tipa kanala (analogni/digitalni)

1.19 Strujna,naponska i temperaturna ogranicenja

U tabeli 1.7 dat je pregled strujnih, naponskih i temperaturnih ogranicenja mikrokontrolera i pojedinih portova. Tabela 1.7: Strujna,naponska i temperaturna ogranicenja mikrokontrolera Radna temperatura ambijenta -55 do +125ºC Napon na pojedinim pinovima u odnosu na Vss (bez Vdd, MCLR i RA4)

-0.3V do(Vdd+0.3)

Temperatura cuvanja mikrokontrolera -65 do +150ºC Napon Vdd u odnosu na Vss -0.3V do +7.5V Napon na MCLR u odnosu na Vss 0 do +14V Napon na RA4 u odnosu na Vss 0 do +8.5 V Ukupna disipacija 1W Maksimalna izlazna struja na pinu Vss 300mA Maksimalna ulazna struja na pinu Vdd 250mA Ulazna struja kroz klamp diode IIK (VI < 0 ili VI > VDD) +/- 20mA

Izlazna struja kroz klamp diode IOK (VO < 0 or VO > VDD) +/- 20mA Maksimalna struja koju moze da primi jedan pin 25mA Maksimalna struja koju moze da da svaki pin 25mA Maksimalna struja koju moze port da primi(port A,B,C,D i E) 200mA Maksimalna struja koju moze port da da (port A,B,C,D i E) 200mA 1.20 Organizacija memorije

Strukturu memorije ovog mikrokontrolera cine tri odvojena bloka: 1. Programska memorija 2. Memorija podataka 3. EEPROM memorija podataka

Odvojeno od nabrojanoh memorijskih blokova egzistira zasebna struktura magacina (Stack), koji se satoji od osam 13-bitnih registara. Stack pointer se ne moze citati, niti se u njega moze upisivati. Prilikom izvrsenja instrukcije CALL ili prilikom poziva prekida mikrokontrolera, adresa sledece instrukcije se stavlja na magacin. Magacin radi na principu ciklicnog bafera, sto znaci da se u njega mogu staviti osam razlicitih adresa, a da se upisom devete brise prva i tako redom. Programski se ne moze utvrditi da li je doslo do prepunjeja steka. Organizcija programske memorije PIC16F877 imaju 13-bitni programski brojac (PC) koji je u mogucnosti da adresira memorijski prostor od 8k programskih reci od 14 bita. Reset vektor je 0x0000 i od njega pocinje izvrsavanje programa. Interapt vektor je 0x0004. Mapa programske memorije i magacin prikazani su na slici 1.34.

Sl.1.34 Mapa programske memorije i stack

Organizacija memorije podataka Memorija za podatke je izdeljena u vise celina–banki (banks), a sastoji se od registara opste 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 sluze za odabir zeljene banke podataka po principu prikazanom na slici 1.35.

Sl.1.35.Nacin kodovanja Bank

Svaka banka moze da sadrzi do 128 registara (0x7F). Nize lokacije u banci zauzimaju specijalni regisri, a ostatak prostora popunjavaju registri opste namene implementirani kao staticki RAM. Neki specijalni registri koji se cesto koriste mapirani su u sve banke da bi se omogućio brzi pristup i redukcija kôda. Mapa registara mikrokontrolera PIC16F877 prikazana je na slici 1.36. Nekoliko specijalnih registara su registri jezgra, usko povezani sa funkcionisanjem CPU. Ostali registri su vezani za periferne module i sluze njihovom upravljanju i kontroli statusa. Programski brojac (PC) odredjuje adresu instrukcije u programskom flesu koja ce sledeca biti pribavljena. Rec je o 13-bitnom registru. Simbolicko ime nizeg bajta je PCL. To je registar koji se moze i upisivati i iscitavati. Težih pet bita programskog brojaca smesteni su u izolovani registar PCH kojem se pristupa samo preko leca PCLATH mapiranom u internom RAM-u na adresi 0x0A. STATUS registar je veoma bitan i zato je predvidjeno da se moze adresirati iz bilo koje banke. On pokazuje status aritmeticko-logicke jedinice, reset status mikrokontrolera i sadrzi bite za selekciju banki internog RAM-a. Od navedenih flegova posebno treba izdvojiti Zero bit (Z) koji se postavlja kad je rezultat aritmeticke operacije jednak nuli i bit prenosa/pozajmice Carry (C). Registar OPTION_REG se koristi za konfiguraciju preskalera za tajmer 0 ili Watchdog, za upravljanje tajmerom0, selekciju ivice okidanja eksternog interapta, i za omogucavanje Pull-up otpornika na portu B. Kada je rec o registrima jezgra ne treba zaboraviti par FSR (File Select Register) i INDF (Indirect File), koji sluze za indirektno adresiranje memorije podataka. Bilo koja instrukcija koja se obraca INDF registru ustvari indirektno pristupa onoj lokaciji internog RAM-a cija je adresa trenutno u registru FSR.

Sl.1.36 Mapa registra PIC16F877

Interni EEPROM za podatke Ako je potrebno neke podatke sacuvati i po ukidanju napajanja mikrokontrolera, treba ih prethodno zapisati u interni EEPROM. Ova memorija sadrzi 256 bajtova. 1.21 Tajmeri Ove se periferije koriste za merenje vremena i brojanje eksternih dogadjaja. Ugradjena su tri tajmerska modula (TIMER 0,1,2) i svaki ima svoje specificnosti. Tajmer0 je jednostavni 8-bitni brojač koji generise interapt pri prelasku sa 0xFF na 0x00 (overflow). Poseduju ga svi nizi PICmicro™ procesori i ovde je zadrzana kompatibilnost s njima. Izvor takta za tajmer0 moze biti bilo interni sistemski sat (Fosc/4), bilo spoljni generator takta spojen na pin RA4/T0CKI. Moguce je podesiti da se brojac inkrementira na rastucu ili opadajucu ivicu spoljnjeg signala. U kombinaciji sa modulom tajmera 0 moze se koristiti programabilni preskaler (delilac frekvencije) sa odnosima deljenja od 1:2 do 1:256. Ukoliko deljenje nije potrebno preskaler se dodeli watchdog tajmeru. Kada je preskaler u upotrebi maksimalna frekvencija eksternog izvora iznosi 50 MHz sto je vece od maksimalne frekvencije samog mikrokontrolera. Tajmer1 je 16-bitni i takodje je osposobljen da radi kao brojac ili merac vremena. Ima tri izvora takta: sistemski sat (Fosc/4), spoljasnji takt ili spoljasnji kristal. Brojac eksternih dogadjaja moze se sinhronizovati sa internim oscilatorom, a postoji i asinhroni nacin rada koji omogucuje da se brojac inkrementira i u sleep rezimu. Preskaliranje je upotrebljivo sa vrednostima deljenja 1:1, 1:2, 1:4 i 1:8. Tajmer2 je 8-bitni tajmer sa programabilnim preskalerom i postskalerom. Moze biti tajmer/brojac opste namene. Medjutim, potreban je CCP modulu prilikom generisanja PWM signala i modulu za sinhronu serijsku komunikaciju (SSP) kao Baud Rate generator. U kooperaciji sa tajmerom 2 koristi se registar PR2 (Period Register). Kada se vrednost brojaca izjednaci sa vrednoscu upisanom u registar PR2, generise se odgovarajuci interapt. 1.22 CCP moduli

CCP je skracenica za Compare/Capture/PWM. PIC16F877 poseduje dva ovakva modula koji mu pomazu da se lakse nosi sa raznim zahtevima real-time aplikacija. U rezimu rada Capture kada se desi dogadjaj na pinu RC2/CCP1 16-bitna vrednost tajmera 1 preslikava se u registre CCPR1H:CCPR1L. Istovremeno se setuje korespondentni interapt fleg u registru PIR1. Da bi ova operacija bila uspesna tajmer1 mora raditi u tajmerskom rezimu ili rezimu sinhronizovanog brojanja. U rezumu rada Compare 16-bitna vrednost registra CCPR1 se stalno poredi sa vrijednoscu para registara tajmera1. Kada dodje do izjednacenja moguce je da se pin RC2/CCP1 setuje, resetuje ili ostane nepromenjen, sto se ranije podesi odgovarajućim konfiguracionim bajtom upisanim u registar CCP1CON. I u ovom slucaju se setuje interapt fleg CCP1IF. U rezimu rada PWM (Pulse Width Modulation) pin RC2/CCP1 proizvodi sirinsko-impulsni modulisani signal rezolucije do 10 bita. Pojednostavljeni blok-dijagram PWM modula dat je na slici 1.37.

Sl.1.37 Pojednostavljeni blok-dijagram PWM modula

Period PWM signala odredjuje se upisom u PR2 registar po formuli: PWM_perid = [(PR2)+1]*4*Tosc*TMR2_preskajler Vreme ispune (Duty Cycle Time) menja se upisom u registar CCPR1L i dva bita registra CCP1CON (biti 5 i 4). Time je omogucena maksimalno 10-bitna rezolucija PWM izlaza. Formula za proracun je: PWM_Duty_Cycle = (CCPR1L:CCP1CON<5:4>)*Tosc*TMR2_preskajler 1.23 Ostale periferne jedinice

Mikrokontroler PIC16F877 poseduje jos nekoliko korisnih periferijskih modula koji ce u ovom odjeljku biti samo kratko spomenuti. Mikrokontroler obicno nije usamljen, nego je deo mreze uredjaja koji trebaju medjusobno komunicirati i razmenjivati podatke. U tu svrhu, on je opremljen sa tri hardverska komunikaciona modula. Prvi od njih je SSP modul (Synchronous Serial Port), koji sluzi za komunikaciju sa serijskim EEPROM-ima, pomerackim registrima, displej-drajverima, itd. Ovaj modul moze raditi u jednom od dva rezima: 1. Serial Peripheral Interface (SPI) 2. Inter-Integrated Circuit (I2C) Drugi serijski komunikacioni modul je USART (Universal Synchronous Asynchronous Receiver Transmiter). On uglavnom sluzi za povezivanje sa personalnim racunarom, ali to nije njegova jedina mogucnost primene. USART se moze konfigurisati u neki od sledecih modova rada: 1. Asinhroni rad (full duplex)

2. Sinhroni master rad (half duplex) 3. Sinhroni slave rad (half duplex) Osim serijskih, postoji i jedan paralelni komunikacioni modul. Rec je o modulu PSP (Parallel Slave Port). On sluzi da se PIC16F877 direktno poveze na 8-bitnu magistralu podataka drugog mikroprocesora. Eksterni procesor tada koristeci linije Read (RD) i Write (WR) moze citati i upisivati PORTD registar kao svaki drugi 8-bitni lec.

2. Digitalno-analogni konvertor

Da bi se, koriscenjem digitalnih sistema za obrdau (racunara) izvrsila efikasna obrada izmerenih fizickih velicina, neophodno je fizicke velicine mernim pretvaracima transformisati u elektricne, napon ili struju, a zatim napon ili struju, koja reprezentuje izmerenu velicinu u analognoj formi, transformisti u digitalno kodovan broj. Elektronsko kolo koje velicinu i polaritet napona (struje) konvertuje u odgovarajucu digitalnu formu naziva se analogno-digitalni konvertor, ili skraceno A/D konvertor.

Takodje, nakon digitalne obrade, potrebno je digitalno izrazenu velicinu konvertovati u napon ili struju, kako bi se odgovarajucim naponom (strujom) delovalo na sklopove sistema da obavljaju funkcije na nacin kako je digitalnim sistemom definisano..

Da bi digitalni broj mogao da se konvertuje u analognu velicinu, broj mora biti dekodovan, tako da svakom broju odgovara unapred odredjena vrednost napona ili struje, ili broj mora biti kodovan u nekom tezinskom kodu,tako da svaka cifra, zavisno od pozicije (tezine) srazmerno doprinosi velicini izlaznog napona, odnosno struje.

Osnovni gradivni blokovi digitalno-analognog konvertora su: registar za pamcenje digitalne informacije, izvor referetnog napona, mreza pasivnih komponenti za skaliranje referetnog napona, skup analognih orekidacaza izbor konfiguracije pasivne mreze u zavisnosti od ulazne digitalne informacije i izlazvi analogni pojacavac za dovodjenje izlaznog signala na zeljeni nivo i prilagodjenje izlazne impedanse. Blok dijagram digitalno-analognog konvertora data je ne slici 2.1.

Sl:2.1 Blok sema digitalno-analognog konvertora

Svaki od blokova digitalno-analognog konvertora sa slike 2.1 unosi statickui/ili dinamicku gresku, ili nepreciznost prilikom konverzij.

Idealna prenosna karakteristika za cetvorobitni digitalno-analogni konvertor prikazana je na slici 2.2.

Sl:2.2 Idealna karakteristika digitalno-analognog konvertora Na apcisi karakteristike prenosa je vreme t u kome se, u jednakim vremenskim intervalima, menja binarno kodovan broj od 0 (0000) do 15 (1111). Broj je formiran digitalnim sinmalima d0, d1, d2, d3 sa slike 2.1. Na ordinati je vrednost izlaznig napona, normalizovana u odnosu na maksimalni izlazni napon, koji se cesto naziva napon pune skale (Vmax=Vps). Za svaku kombinaciju ulaznih digitalnih signala postoji samo jedna vrednost izlaznog napona. Razlika izlaznih napona koji odgovaraju susednim brojevima naziva se promena za jedan bit najmanje tezine, ili skraceno LSB (least significant bit). Ukupan broj diskretnih vrednosti koje izlazni napon digitalno-analognog konvertora moze da zauzme se naziva rezolucuja digitalno-analognog konvertora. Ako se konvertuju binarni brojevi od n cifara, Viz teorijski moze imati 2n razlicitih vrednosti. Ako je sum izlaznih napona digitalno-analognog konvertora po apsolutnoj vrednosti veci od LSB, stvara rezolucija je manja od 2n. Rezolucija digitalno-analognog konvertora se cesto izrazava brojemcifara n, umesto brojem nivoa izlaznih napona. Tako digitalno-analogni konvertor sa slike 2.2 je rezolucije 16, odnosno, rezolucije 4 bita. Svako odstupanje u odnosu na idealnu karakteristiku prenosa prikazanu na slici 2.2 prestavlja gresku konverzije. Greska konverzije mogu biti staticke i dinamicke.

Staticke greske unose gresku linearnosti digitalno-analognog konvertora. Linearnost se definise kao maksimalno odstupanje izlaznog napona (za bilo koji kôd ulaznih promenjivih) od prave linije povucene od nultog, do proracunatog napona pune skale. Izrazava se u procentima opsega pune skale ili u frakcijama LSB. Ovako definisana linearnost se naziva apsolutna linearnost. Graficki prikaz apsolutne linearnosti prikazan je na slici 2.3. Za razliku od karakteristike prikazane na slici 2.2 na apcisi nije vreme, vec kôd ulazne digitalne informacije.

Sl: 2.3 Graficki prikaz apsolutne linearnosti

Isprekidanim linijamana slici 2.3 definisana je apsolutna linearnost. Odstupanje izlaznog napona od 0 za kôd 000 naziva se greska nule, a odstupanje na maksimalnoj vrednosti, greska pune skale. Linearnost se moze definisati i u odnosu na pravu liniju koja je povucena izmedju izmerenih vrednosti po kriterijumu da je apsolutna vrednost rastojanja izmerenih vrednosti od prave minimalna. Ovakva linearnost se naziva linearnost optimalne prave (best-straight-linelinearity). Odstupanje nagiba optimalne prave od nagiba idealne karakteristike naziva se greska pojacanja. Presek optimalne prave sa naponskom osom definise nulti ofset. Na slici 2.4 prikazan je primer karakteristike digitalno-analognog konvertora koji nema zadovoljavaljucu apsolutnu linearnost, ali je odstupanje izmerenih vrednosti od optimalne prave malo. Oduzimanjem napona ofseta od izlaznog napona i povecanjem pojacanja izlaznog pojacavaca, tako da nagib optimalne prave bude

jednak nagibu teoretske karakteristike, staticka karakteristika prenosa sa slike 2.4 bi se uklopila u granice apsolutne linearnost.

Sl: 2.4 Linearnost u odnosu na optimalnu pravu

Merenjem karakteristika kvalitetnijih digitalno-analognih konvertora moze se

ustanoviti da je optimalna prava u vecini slucajeva veoma bliska (ili se poklapa) sa pravom povucenom kroz tacku izmerenog napona za nulti ulazni kôd i tacku stvarno izmerenog napona pune skale. Linearnost u odnosu na ovako povucenu oravu naziva se linearnost krajnih tacaka (end point linearity). S obzirom da je merenje jednostavnije, a rezultati su priblizni, u praksi se linearnost krajnih tacaka mnogo cesce koristi nego linearnost optimalne prave. Mera kvaliteta digitalno-analognog konvertora je i diferencijalna linearnost. Diferencijalna linearnost je definisana kao maksimalno odstupanje susednih naponskih nivoa u odnosu na teoretsku, idealnu vrednost. Apsolutna vrednost razlike izlaznog napona dva susuedna binarna broja od n cifara je u idealnom slucaju:

12 n

PSLSB

VV

medjutim, zbog tolerancije koriscenih komponenti, promena izlaznog napona ΔV, moze biti veca ili manja od VLSB, tako da je diferncijalna linearnost DL definisana kao:

LSB

LSB

VVVDL

i izrazava se u frakcijama od VLSB, odnosno, od LSB. Da bi izlazni napon digitalno-analognog konvertora bio monotono rastuca funkcija kodovane brojne vrednosti, diferencijalna linearnost mora da bude bolja od ±1/2 LSB. Pored linearnosti, vazna karakteristika digitalno-analognog konvertora je i stabilnost. Stabilnost je funkcija temperature i vremena. Temperaturna stabilnost se izrazava u frakcijama LSM/ºC, ili ppm/ ºC, odnosi se na stabilnost pojacanja, linearnosti i ofseta. Dugorocna stbilnost (long term stability) se odnosi na iste parametre i najcesce se izrazava u ppm/god. Dinamicke karakteristike digitalno-analognog konvertora definisu vreme za koje, nakon promene ulazne informacije, izlazni napon dostigne zadatu vrednost. Ovo vreme se naziva vreme postavljanja tst (settling time) i definise se, ili za maksimalnu promenu (od 0 do Vps), ili za promenu ulazne informacije za jedan LSB. Vreme postavljanja digitalno-analognog konvertora se racuna od trenutka zadavanja nove digitalne vrednosti, do trenutka kada se izlazni napon stabilisao na zadatu vrednost ±1/2 LSB. Umesto vremena postavljanja, cesto se definise vreme prekidanja tsw (switching time) digitalno-analognog konvertora. Vreme prekidanja je vreme od trenutka zadavanja digitalnog kôda do trenutka kada Viz dostigne 50% zadate vrednosti. Karakteristicno za dinamicku karakteristiku prenosa digitalno-analognog konvertora je pojava glica na izlaznom naponu prilikom promene ulaznog koda za 1 LSB. Do pojave glica dolazi zbog razlicite brzine prekidanja analognih prekidaca u konvertoru. Ako je, na primer, prekidac bita najvece tezine brzi od ostalih prekidaca u mrezi, nakon stanja 01...111,umesto stanja 10...000, kratkotrajno ce postojati stanje11...111, sto generise maksimalni napon,da bi, kad se ostali prekidaci iskljuce, napon pao na zadatu vrednost. Do pojave negativnog glica ce doci ako je, na primer, prekidac MSB sporiji od ostalih prekidaca. Korektno specificiranje glica bi zahtevalo definisanje maksimalnog trajanja i maksimalne amplitude glica, medjutim, proizvodjaci najcesce definisu samo vreme postavljanja u koje je ukljuceno i trajanje glica. Glicevi se javljaju uvek kada vise od jednog prekidaca menja stanje. Po pravilu su glicevi izrazeniji kada se menja bit vece tezine, a najveci se javlja kada se menja MSB.

2.1 Digitalno-analogni konvertor sa lestvicastom mrezom

Lestvicasta otporna mreza je prikazana na slici 2.5, a dobila je naziv po svojoj slicnosti sa letvicama.

Kao sto se sa slike vidi,u mrezi se koriste samo dve vrste otpornika, R i 2R po celiji. Mreza je bez obzira na broj celija, zatvorena sa obe strane otpornicima 2R prema masi.

Lestvicasta mreza ima osobinu da ekvivaletna otpornost svake grane prema masi iz svakog cvora Ai iznosi 2R. Takodje je iz svake tacke Pi ekvivaletna otpornost mreza 3R. Ovo ima za posledicu, da kada se bilo koji prekidac Pi prikljuci na napon VREF kroz granu Pi-Ai ce teci struja istog intenziteta, Ii=VREF/3R. U svakom cvoru Ai, s obzirom da je otpornost svih grana jednaka, struja se deli na dve jednake komponente.

Sl:2.4 Lestvicasta otporna mreza

Ako je, na primer, samo prekidac Pn-1 prikljucen na referetni napon, kroz granu Pn-1-An-1 teci ce struja In-1=VREF/3R, kroz grane An-1-M i An-1-An-2 struja ce biti In-1/2. ako je prikljucen samo prekidac Pn-2, struja In-2 se u cvoru An-2 deli na dve jednake komponente intenziteta In-2/2. Komponente struje koja tece kroz granu An-2-An-1 se u cvoru An-1 ponovo deli na dve jednake komponente intenziteta In-2/4, tako da kroz granu An-1-M kao posledica ukljucivanja prekidaca Pn-2 protice struja In-2/4. Slicnim razmatranjem se moze pokazati da ce ukljucivanjem narednog prekidaca Pn-3, struja I u grani An-1-M biti In-3/8, odnosno, ukljucivanjem svakog sledeceg prekidaca generise upola manju struju u grani An-1-M. Ako se primeni zakon superpozicije, struja I kroz granu An-1-m ima vrednost

00

11

22

22

11

1 222222

16

QQQQQR

VI nn

nn

nREF

gde Qi=1 oznacava da je i-ti prekidac prikljucen na referetni napon, Qi=0, da je prikljucen na masu. Ako se tacka M, umesto na masu, prikljuci na virtuelnu masu operacionog pojacavaca, a upravljacki signali prekidaca na izlaz stacionarnog registra, dobija se digitalno-analogni konvertor sa lestvicastom otpornom mrezom.

3.Realizacija sistema

Na slici 3.1 prikazana je blok sema sistema. Srce sistema je mikrokontroler firme Microchip PIC16F877.

Sl: 3.1 Blok sema sistema

Mikrokontroler, kao centralni deo sistema ima ulogu da vrsi kontrolu ostalih blokaova sistema (blok zakomunikaciju sa racunarom, blok za analogno-digitalnu konverziju). Mikrokontroler je isprogramiram da generise na portu D sekvence za analogno-ditalni konvertor, tako da na izlazu konvertora imamo tri potrebna talasna oblika. Druga uloga mikrokontrolera je da preko RS232 interfejsa posalje informacije racunaru.

Prvi talasni oblik koji treba de se generise je prikazan na slici 3.2 Sastoji se od 256 nivoa, koji se medjusobno razlikuju za LSB. Na ovaj nacin dobija se talasni oblik koji je vrlo slican trouglastom talasnom obliku. Vreme trajanja stabilnog nivoa na izlazu, za odredjenu sekvencu na portu D mikrokontrolera, zavisi od stanja prekidaca 4. Ako je prekidac ukljuven vreme strajanja stabilnog nivoa je 4 mikrosekunde, a ako je iskljuce trajanje je 2 milisekunde. Ostala tri prekidaca sluze za izbor talasnog oblika na izlazu analogno digitalnog konvertora. Ako je ukljucen prekidac 3, a prekidaci 2 i 1 iskljuceni generise se signal 3, ili ako je ukljucen prekidac 2, a prekidaci 1 i 3 iskljuceni generise se talasni oblik broj tri. Za bilo koju drugu kombinaciju prekidaca generisemo talasni oblik broj jedan. Ovo ce biti mnogo jasnije iz samog listinga programa mikrokontrolera, koji ce biti prikazan i obljasnjen u nastavku.

Sl: 3.2 Dve priode talasnog oblika 1

Talasni oblik broj dva prikazan je na slici 3.3. Ovaj talasni oblik se generise tako sto u 256 sukcesivnih vrenmenskih intervala na portu D postavljamo vrednosti redom od 0x00 do 0xFF. Ovaj talasni oblik je vlrlo slicac testerastom talasnom obliku.

Sl: 3.3 Dve periode talasnog oblika 2

Talasni oblik broj tri prikazan je na slici 3.4. Ovaj talasni oblik je slican talasnom obliku broj dva, stom razlikom sto je dodata pauza izmedju periode.Nacin sinteze je slican sintezi talasnog oblika broj dva, stom razlikom sto je dodat kod koji generise pauzu trajanja 256 vremenskih intervala od 4 ili 2 milisekunde, sto je odredjeno stanjem prekidaca 4. Sve ovo ce biti jasnije kasnije kada budemo kometarisali kôd mikrokontrolera. 3.1. Mikrokontrolerski deo

Na slici 3.5. prikazana je sema sistema ciji glavni deo zauzima mikrokontroler

i prateci elementi, koji sluze za njgov ispravan rad. Kao sto je vec receno, ovde koriscen Microchip-ov mikrokontroler PIC16F877, i on je opisan u pethodnim poglavljiva, tako da ovde nece biti reci o njemu. Pored mikrokontrolera, u neposrednoj njegovoj okolini uocavamo taster za reset (oznacen nasemi sa S2),diodu

D3, koja ima ulogu u ICSP programiranja. Otpornik R2 i kondezator C4 imaju ilogu NF filtra, tako da slucajne VF promene ,koje bi mogle da se pojave na pinu MCLR i nepotrebno resetovale mikrokontroler, budu eliminisane. Pored ovih elemenata nalaze se jos i kvarcni oscilator na 10MHz sa dva prateca kondezatora od 22pF. Kako je kvarcni oscilator Y1 sa frekfencijom od 10MHz, nas mikrokontroler ima vreme izvrsenja masinskog ciklusa 400ns. Ovde se nalazi i konektor J2 koji sluzi za povezivanje sistema sa programatorom.

Sl:3.4 Dve periode talasnog oblika 3 3.2. Napajanje

Napajanje korisceno u ovom sistemu je relativno stsndardno. Satoji se od transformatora koji koji smanjuje mrzni napon od 220V na nama potrebnih 9V. Iza njega dolazi integrisani grecov ispravljac U5, koji previdjen za struju do jednog ampera. Zatim dolaze blok kondezatori, za filtriranje VF smetnji, i linijski stabilizator 7805 , koji je , kao i grecov ispravljac predvidjen za struju od jednog ampera. Sastavni deo napajanja je i jedna crvena LE-dioda crvene boje i precnika 3mm, koja ima ulogu signalizacije ispravnosti napajanja 3.3. Kolo za komunikaciju sa racunarom Protokol RS232 zahteva naponske nivoe:

1. Logicka nula „SPACE“ u opsegu od +3V do +25V 2. Logicka jedinica „MARK“ u opsegu od -3V do -25V.

Oblast izmedju -3V i +3V je nedefinisana. S druge strane sistem koji se realizuje radi na naponu od +5V. Da nebi doslo do ostecenja sistema previsokim naponom koji se javlja na strani racunara, bilo je neophodno uvesti kolo MAX 232, koje ce izvrsiti potrebnu translaciju naponskih nivoa. Pored ovog kola nalaze se i elektrolitski kondezatori C6, C11, C12, C13 koji su preporuceni od strane proizvodjaca. 3.4. Prekidaci Kako je na izlazu bilo potrebno dobiti tri talasna oblika, koji mogu da imaju jednu od dve razlicite frekfencije, bilo je neophodno uvesti prekidace. Prekidaci korisceni u ovom sistemu su DIP prekidaci (DIP-4). Povezani su na port B i isprogramirani su tako, da od njihovog stanja zavisi talasni oblik na izlazu. O nacinu podesavanjaprekidaca bilo je reci u prethodnom delu (kada su opisani talasni oblici), tako da se sada nece biti reci o tome.

Sl: 3.5 Sema sistema u programskom paketu PROTEL 99SE

3.5. Digitalno-analogni konvertor Da bi dobili anlogne signale na izlazu sisteme neophodno je ralizovati analogno digitalni konvertor. Ovde je odluceno da se koristi digitalo-analogni konvertor sa letvicastom strukturom (odnosno R-2R mrezom). Ovaj konvertor je odabran pre svega zbog jednostavne realozacije i niske cene komponenata. Naime za ovaj konvertor potreboj je samo jedan registar (koriscen je D lec 74HC373) i nekoliko otpornika otpornosti 1KΩ i 2KΩ. Kolo 74HC373 poseduje pinove LE i OE, koji sluze za kotolu samog integrisanog kola. Pin OE na logickoj jedinici izlazi leca su u stanj visoke impedanse, a kada je na logickoj nuli izlaz je u stanju niske impedanse. Kada je pin LE na logickoj jedinici moguce je upisivati podatke u lec, dok kada le na logickoj nuli lec zadrzava prethodno stanje.

Na istoj plocici nalazi se indikator napona napajanja u vidu jedne crvene LE-diode precnika 3mm. Karakteristike ovog analogno-digitalnog koverora su opisane u prethodnoj glavi, tako da sada nece biti reci o tome. Sema analogno-digitalnog konvertora prikazana je na slici 3.6.

Sl: 3.6 Sema analogno-digitalnog konvertora u programskom paketu PROTEL 99SE

3.6 Ostali deovi sistemna Kao sto je vec u uvodu receno prvobitna uloga ovog sistama je bila bezicna komunikacija. Predvidjeno je bilo da se komunikacija obavlja pomocu cipa RXQ1. Medjutim, kako je doslo do izmene u trenutku kada je sistem za bezicnu komunikaciju vec bio zavrsen, reseno je da se promeni softver mikrokontrolera i uz minimalne hardverske izmene realizuje generator funkcije. Zog toga je na glavnoj plocicici ostale neke komponente koje nisu potrebne generatoru funkcija. Ovde se pre svega misli na indikatore sa LE-diodama i ostavljenom slobodnom mestu za cip RXQ1. 3.7. Fizicki izgled plocica U ovom delu bice prizan izgled stampanih plocica koje su koriscene za razvoj sistema. Sve plocice su projektovane u programskom paketu „PROTEL 99SE“. Na slici 3.7 prikazana je plocica glavnog dela sistema. Na njoj se jasno vidi mesto gde se nalazi mikrokontroler, kao i slobodno mesto koje je bilo predvidjeno za cip RXQ1.

Sl:3.7 Fiziki izgled donjeg sloja glavne ploce

Na slici 3.8 vidimo raspored elemenata glavne plocice. Sa slike se vidi da raspored elemenata nije gust. To je ucinjeno s namerom da se izmegne nezeljeni uticaj izmedju komonenata, jer je ovaj sistem,kao sto smo vec rekli, bio namenjem za bezicnu komunikaciju. Iz istog razlloga se i trasformator nalazi na posebnoj plocici. Slika 3.9 prikazuje fizicki izgled stampane plocice analogno-digitalnog konvertora. Ova plocica je relativno malih dimenzija, i komponente su gusto postavljene, za razliku od prethodne, glavne, plocice.

Sl:3.8 Raspored elemenata glavne ploce

Sl:3.9 Fizicki izgled donjeg sloja analogno-digitalnog konvertora

Slika 3.10 okazuje raspored elemanta na plocici analogno-digitalnog konvertora. Na ovoj plocici se nalazi i dzamper J2 koji je namenjem za povezivanje sa osciloskopom.

Sl:3.10 Raspored elemenata analogno-digitalnog konvertora

Sl:3.11 Fiziki izgled plocice trafoa

Sl:3.12 Raspored elemenata na plocici trafoa Na slikama 3.11 i 3.12 prikazan je fizicki izgled stampane plocice trafoa i raspored elemenata na plocici.

4.SOFTVER Za rad miktrokontrolera napisan je poseban softver u programskom jeziku C. Za razvoj sistema koristili smo pozanti kompajler HI-TECH. Ovaj kompajler spada u profesionalne alate za razvoj softvera mikrontolera. Njegova osnovna karakteristika je ta sto generise vrlo efikasan kôd, nema ugradjene biblioteke za rad sa periferijama, nema IDE okruzenje. Sama cinjenica da nema ugradjene biblioteke za rad sa periferijama zahteva odlicho pozanavane samog mikrokontrolera, periferija, ali i digitalne i impulsne elekronike. S druge strane ovo omogucava bolju kontrolau programa, jer sve bibliote pise sam programer u toku razvijanja sistema. Pored ovog kompajlera postoje i CCS, MicroC, MicroBasic... Program koji upravlja radom mikrokontrolera sastoji se iz tri celine:

1. main rutine u kojoj se nalazi beskonatna petlja i u kojoj se pozivaju potprogrami za generisanje talasnih oblika

2. interrupt rutine koja se izvrsava na svako prekoracenje TIMER-a 0, i u kojoj se vrsi obrada tastera

3. potprograma za generisanje potrebnih talasnih obloka Listing glavog programa sa detaljnim komentarom je dat u nastavku: #include <pic.h> #include "delay.c" //ucitavamo rutinu koja unosi kasnjenje #include "rs232.c" //ucitavamo rutinu koja omogucava RS232 komunikaciju __CONFIG(LVPDIS&HS&PWRTEN&WDTDIS&DEBUGDIS); //osnovna podesavanja //mikrokontrolera //upisujemo podatke za evidenciju u eprom mokrokontrolera __EEPROM_DATA('D','A','C','_','1','.','0','0'); __EEPROM_DATA('O','K','T','O','B','A','R','_'); __EEPROM_DATA('2','0','0','7','.','G','O','D'); //dajemo ime pojedinim pinovima #define PORTBIT(adr,bit) ((unsigned)(&adr)*8+(bit)) static bit taster1 @ PORTBIT(PORTB,1); static bit taster2 @ PORTBIT(PORTB,2); static bit taster3 @ PORTBIT(PORTB,3); static bit taster4 @ PORTBIT(PORTB,4); static bit oe @ PORTBIT(PORTE,0); static bit le @ PORTBIT(PORTE,1); //deklarisemo promenjive unsigned char vreme,h,f,d,s,o,p,r,funkcija,t; int i,j,k,l,q; //formiramo masku za prikaz na racunaru char const maska4[43]="******************************************"; char const maska0[43]="* Mikroprocesorski sistemi *"; char const maska1[43]="* Upravljanje DAC-a mikrokontrolerom *"; char const maska2[43]="* Ver SW:1.00 *"; char const maska3[43]="* Projakat su uradili: *"; char const maska5[43]="* Vladimir Stankovic 9786 *"; char const maska6[43]="* Branko Vojicic 9589 *"; char const maska7[43]="******************************************"; void interrupt isr(void) //intrrupt rutina za obradu tastera

{ if(T0IF) { if(!taster1&&taster2&&taster3) //proveravamo prvi taster { funkcija=1; } else if(taster1&&!taster2&&taster3) //proveravamo drugi taster { funkcija=2; } else if(taster1&&taster2&&!taster3) //proveravamo treci taster { funkcija=3; } else { funkcija=1; } if(taster4) //proveravamo cetvrti taster { t=4; } else if(!taster4) { t=2; } T0IF=0; } } //potprogram za generisanje prvog talasnog oblika void signal1(unsigned char vreme) { for(i=0; i<=255; i++) { PORTD=i; //upisujemo vrednost brojaca na port d DelayUs(vreme); //pauza } for(j=254; j>=0; j--) //drugi deo signala { PORTD=j; DelayUs(vreme); } } //potprogram za generisanje drugog talasnog oblika void signal2(unsigned char vreme) { for(k=0; k<=255; k++) { PORTD=k; DelayUs(vreme); } PORTD=0; DelayUs(vreme); } //potprogram za generisanje treceg talasnog oblika

void signal3(unsigned char vreme) { for(l=0;l<=255;l++) { PORTD=l; DelayUs(vreme); } for(q=0;q<=255;q++) { PORTD=0; DelayUs(vreme); } } void main(void) { GIE=0; //iskljucujemo sve interrupt-e rs232_init(); //inicijalizuje RS232 interfejs TRISC=0x00; //tris c je izlazni PORTC=0x00; //port c je postavljen na logicku nulu TRISA=0x00; //tris a je izlazni PORTA=0x00; // port a je postavljen na logicku nulu TRISE=0x00; //tris e je izlazni PORTE=0x00; // port e je postavljen na logicku nulu TRISB=0x1F; //tris b je i ulazni i izlazni PORTB=0x00; // port b je postavljen na logicku nulu TRISD=0x00; //tris d je izlazni PORTD=0x00; //na poertd prikljucujemo DAC OPTION=0b11000111; // iskljucujemo pull-up otpornike, dodeljujemo //unutrasnji klok timer-u 0, i preskajler je 1/256, iterrupt na 102.2us ADCON1=0b1100111; // svi pinovi su digitalni T0IE=1; //omogucujemo interrupt na timer 0 funkcija=1; //automatski se generise prvi talasni oblik t=2; //pocetna perioda je 2 milisekunda le=1; //pin LE je stalno na logicku nulu oe=0; //pin OE je stalno na logicku 0; //ispisujemo prateci tekst na racunaru for(h=0;h<43;h++) { RS232_putch(maska4[h]); } RS232_putch(10); RS232_putch(13); for (f=0;f<43;f++) { RS232_putch(maska0[f]); } RS232_putch(10); RS232_putch(13); for(d=0;d<43;d++) { RS232_putch(maska1[d]);

} RS232_putch(10); RS232_putch(13); for(s=0;s<43;s++) { RS232_putch(maska2[s]); } RS232_putch(10); RS232_putch(13); for(l=0;l<43;l++) { RS232_putch(maska3[l]); } RS232_putch(10); RS232_putch(13); for(o=0;o<43;o++) { RS232_putch(maska5[o]); } RS232_putch(10); RS232_putch(13); for(p=0;p<43;p++) { RS232_putch(maska6[p]); } RS232_putch(10); RS232_putch(13); for(r=0;r<43;r++) { RS232_putch(maska7[r]); } RS232_putch(10); RS232_putch(13); GIE=1; omogucujemo globalni interrupt while(1) //beskonacka petlja { if(funkcija==1) //ako je prekidac 1 na logicku 1 ->funkcija1 signal1(t); if(funkcija==2) signal2(t); if(funkcija==3) signal3(t); } } Predhodni program koristi biblioteke rs232.c i daley.c. U nastavku prikazecemo listinig bibloteka bez posebnih komentara, jer je kod dovoljno jasan. Ove bibliote nalase se i na pratecem disku.

Listing biblioteke rs232.c: #define PIC_CLK 10000000 // frekvencija XTAL-a #define BAUD 56818 // RS232 baud rate #define DIVIDER ((PIC_CLK/(16UL * BAUD) -1)) // interni proracun #define HIGH_SPEED 1 // interno podesavanje RS232 registara // slanje jednog karaktera void RS232_putch(unsigned char c) { while(!TXIF); //prelazi u '1' kada je prazan TXREG = c; DelayUs(60); } // prijem jednog karaktera unsigned char RS232_getch(void) { if(RCIF) //prelazi u '1' kada je prazan { RCIF = 0; return RCREG; } CREN = 0; //ukoliko je doslo do greske obrisi je CREN = 1; //enable reception return 255; // ako nema podatka primljenog } // slanje stringa void RS232_putst(register const char *str) { while((*str)!=0) { RS232_putch(*str); if (*str==13) RS232_putch(10); if (*str==10) RS232_putch(13); str++; } } // *----------------------------------------- // * Konverzija decimalnih brojeva u string // u opsegu od 0..99 za RS232 komunikaciju // *----------------------------------------*/ void RS232_dec2str2(unsigned int x) { unsigned int y; if (x<100) { y=x/10;RS232_putch(y+0x30);x-=(y*10); RS232_putch(x+0x30); } else RS232_putst("Err"); } void rs232_init(void) { // SERIAL PORT SETUP SPBRG = DIVIDER; BRGH = HIGH_SPEED; //data rate for sending

SYNC = 0; //asynchronous SPEN = 1; //enable serial port pins CREN = 1; //enable reception SREN = 0; //no effect TXIE = 0; //disable tx interrupts RCIE = 0; //disable rx interrupts TX9 = 0; //8-bit transmission RX9 = 0; //8-bit reception TXEN = 0; //reset transmitter TXEN = 1; //enable the transmitter } Listing biblioteke delay.c: #include "delay.h" void DelayMs(unsigned char cnt) { #if XTAL_FREQ <= 2MHZ do { DelayUs(996); } while(--cnt); #endif #if XTAL_FREQ > 2MHZ unsigned char i; do { i = 4; do { DelayUs(250); } while(--i); } while(--cnt); #endif } void DelaySec(char sec) { char loop; for(loop=0;loop<=sec*4;loop++) { DelayMs(250); } } Biblioteka delay.c koristi za svoj rad biblioteku delay.h u kojo je definisana ucestanost oscilatora i procedura koja unosi kasnjenje od jedne mikrosekunde Listing biblioteke delay.h: #ifndef XTAL_FREQ #define XTAL_FREQ 10MHZ /* Crystal frequency in MHz */ #endif #define MHZ *1000L /* number of kHz in a MHz */ #define KHZ *1 /* number of kHz in a kHz */ #if XTAL_FREQ >= 12MHZ

#define DelayUs(x) { unsigned char _dcnt; \ _dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \ while(--_dcnt != 0) \ continue; } #else #define DelayUs(x) { unsigned char _dcnt; \ _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \ while(--_dcnt != 0) \ continue; } #endif extern void DelayMs(unsigned char); extern void DelaySec(char sec); Kada razvijemo program u programskom jeziku C, vrsimo njegovo kompajliranje. HI-TECH kompajler grerise hex fajl koji sadrzi kôd koji treba da loadujemo u mikrokontroler. Za loadovanje programa koristimo softver Ic-prog i programator TAIT. Primer2: Program vrsigenerisanje talasnih oblika na rucno inkrementiranje brojaca. Listing programa je u nastavku: #include <pic.h> #include "delay.c" #include "rs232.c" __CONFIG(LVPDIS&HS&PWRTEN&WDTDIS&DEBUGDIS); __EEPROM_DATA('D','A','C','_','1','.','0','0'); __EEPROM_DATA('O','K','T','O','B','A','R','_'); __EEPROM_DATA('2','0','0','7','.','G','O','D'); #define PORTBIT(adr,bit) ((unsigned)(&adr)*8+(bit)) static bit taster1 @ PORTBIT(PORTB,1); static bit taster2 @ PORTBIT(PORTB,2); static bit taster3 @ PORTBIT(PORTB,3); static bit taster4 @ PORTBIT(PORTB,4); static bit oe @ PORTBIT(PORTE,0); static bit le @ PORTBIT(PORTE,1); static bit inkr @ PORTBIT(PORTE,2); // taster za inkrementiranje unsigned char vreme,h,f,d,s,o,p,r,funkcija,t; int i,j,k,l,q; char const maska4[43]="******************************************"; char const maska0[43]="* Mikroprocesorski sistemi *"; char const maska1[43]="* Upravljanje DAC-a mikrokontrolerom *"; char const maska2[43]="* Ver SW:1.00 *"; char const maska3[43]="* Projakat su uradili: *"; char const maska5[43]="* Vladimir Stankovic 9786 *"; char const maska6[43]="* Branko Vojicic 9589 *"; char const maska7[43]="******************************************"; void interrupt isr(void) { if(T0IF)

{ if(!taster1&&taster2&&taster3) { funkcija=1; } else if(taster1&&!taster2&&taster3) { funkcija=2; } else if(taster1&&taster2&&!taster3) { funkcija=3; } else { funkcija=1; } if(taster4) { t=4; } else if(!taster4) { t=2; } T0IF=0; } } void signal1(void) { for(i=0; i<=255; i++) { while(!inkr) //cekaj stisak tastera { PORTD=i; DelayMs(250); DelayMs(250); DelayMs(250); DelayMs(250); } } for(j=254; j>=0; j--) { while(!inkr) { PORTD=j; DelayMs(250); DelayMs(250); DelayMs(250); DelayMs(250); } } } void signal2(void) { for(k=0; k<=255; k++) { while(!inkr) {

PORTD=k; DelayMs(250); DelayMs(250); DelayMs(250); DelayMs(250); } } } void signal3(void) { for(l=0;l<=255;l++) { while(!inkr) { PORTD=l; DelayMs(250); DelayMs(250); DelayMs(250); DelayMs(250); } } for(q=0;q<=255;q++) { while(!inkr) { PORTD=0; DelayMs(250); DelayMs(250); DelayMs(250); DelayMs(250); } } } void main(void) { GIE=0; rs232_init(); TRISC=0x00; PORTC=0x00; TRISA=0x00; PORTA=0x00; TRISE=0x04; //ra2 je ilazni ostali izlazni PORTE=0x00; TRISB=0x1F; PORTB=0x00; TRISD=0x00; PORTD=0x00; //na poertd prikljucujemo DAC OPTION=0b11000111; // iskljucujemo pull-up otpornike, dodeljujemo unutrasnji klok, i preskajler je 1/256, iterrupt na 102.2us ADCON1=0b1100111; // svi pinovi su digitalni T0IE=1; funkcija=1; t=2; le=1; oe=0; //invertovan for(h=0;h<43;h++)

{ RS232_putch(maska4[h]); } RS232_putch(10); RS232_putch(13); for (f=0;f<43;f++) { RS232_putch(maska0[f]); } RS232_putch(10); RS232_putch(13); for(d=0;d<43;d++) { RS232_putch(maska1[d]); } RS232_putch(10); RS232_putch(13); for(s=0;s<43;s++) { RS232_putch(maska2[s]); } RS232_putch(10); RS232_putch(13); for(l=0;l<43;l++) { RS232_putch(maska3[l]); } RS232_putch(10); RS232_putch(13); for(o=0;o<43;o++) { RS232_putch(maska5[o]); } RS232_putch(10); RS232_putch(13); for(p=0;p<43;p++) { RS232_putch(maska6[p]); } RS232_putch(10); RS232_putch(13); for(r=0;r<43;r++) { RS232_putch(maska7[r]); } RS232_putch(10); RS232_putch(13); GIE=1; while(1) { if(funkcija==1) signal1();

if(funkcija==2) signal2(); if(funkcija==3) signal3(); } } Primer3: Program generise pored prva tri talasna oblika i jedan proizvoljni talasni oblik. Listing programa je prikazan u nastavku: #include <pic.h> #include "delay.c" #include "rs232.c" __CONFIG(LVPDIS&HS&PWRTEN&WDTDIS&DEBUGDIS); __EEPROM_DATA('D','A','C','_','1','.','0','0'); __EEPROM_DATA('O','K','T','O','B','A','R','_'); __EEPROM_DATA('2','0','0','7','.','G','O','D'); #define PORTBIT(adr,bit) ((unsigned)(&adr)*8+(bit)) static bit taster1 @ PORTBIT(PORTB,1); static bit taster2 @ PORTBIT(PORTB,2); static bit taster3 @ PORTBIT(PORTB,3); static bit taster4 @ PORTBIT(PORTB,4); static bit oe @ PORTBIT(PORTE,0); static bit le @ PORTBIT(PORTE,1); unsigned char vreme,h,f,d,s,o,p,r,funkcija,t; int i,j,k,l,q,m,g; char const maska4[43]="******************************************"; char const maska0[43]="* Mikroprocesorski sistemi *"; char const maska1[43]="* Upravljanje DAC-a mikrokontrolerom *"; char const maska2[43]="* Ver SW:1.00 *"; char const maska3[43]="* Projakat su uradili: *"; char const maska5[43]="* Vladimir Stankovic 9786 *"; char const maska6[43]="* Branko Vojicic 9589 *"; char const maska7[43]="******************************************"; void interrupt isr(void) { if(T0IF) { if(!taster1&&taster2&&taster3&&taster4) { funkcija=1; } else if(taster1&&!taster2&&taster3&&taster4) { funkcija=2; } else if(taster1&&taster2&&!taster3&&taster4) { funkcija=3; } else if (taster1&&taster2&&taster3&&!taster4)

{ funkcija=5; } else { funkcija=5; } T0IF=0; } } void signal1(unsigned char vreme) //jednosmerni signal maksimalne amplitude { for(i=0; i<=255; i++) { PORTD=255; DelayUs(vreme); } } void signal2(unsigned char vreme) //testerasti rastuci signal { for(k=0; k<=255; k++) { PORTD=k; DelayUs(vreme); } } void signal3(unsigned char vreme) //testerasti opadajuci signal { for(l=255;l>=0;l--) { PORTD=l; DelayUs(vreme); } } void signal4(unsigned char vreme) //pravougaoni napon { for(j=0; j<=128; j++) { PORTD=255; DelayUs(vreme); } for (m=0; m<=128; m++) { PORTD=0; DelayUs(vreme); } } void signal6(unsigned char vreme) //rastuci trapezasti koji pocinje od 128 { for(g=128; g<=255; g++) { PORTD=g; DelayUs(vreme);

} } void signal5(unsigned char vreme) { PORTD=0; DelayMs(vreme); PORTD=128; DelayMs(vreme); signal6(vreme); signal2(vreme); signal2(vreme); signal3(vreme); signal3(vreme); signal3(vreme); signal4(vreme); signal4(vreme); signal4(vreme); } void main(void) { GIE=0; rs232_init(); TRISC=0x00; PORTC=0x00; TRISA=0x00; PORTA=0x00; TRISE=0x00; PORTE=0x00; TRISB=0x1F; PORTB=0x00; TRISD=0x00; PORTD=0x00; //na poertd prikljucujemo DAC OPTION=0b11000111; // iskljucujemo pull-up otpornike, dodeljujemo unutrasnji klok, i preskajler je 1/256, iterrupt na 102.2us ADCON1=0b1100111; // svi pinovi su digitalni T0IE=1; funkcija=1; t=1; le=1; oe=0; //invertovan for(h=0;h<43;h++) { RS232_putch(maska4[h]); } RS232_putch(10); RS232_putch(13); for (f=0;f<43;f++) { RS232_putch(maska0[f]); } RS232_putch(10); RS232_putch(13); for(d=0;d<43;d++) { RS232_putch(maska1[d]);

} RS232_putch(10); RS232_putch(13); for(s=0;s<43;s++) { RS232_putch(maska2[s]); } RS232_putch(10); RS232_putch(13); for(l=0;l<43;l++) { RS232_putch(maska3[l]); } RS232_putch(10); RS232_putch(13); for(o=0;o<43;o++) { RS232_putch(maska5[o]); } RS232_putch(10); RS232_putch(13); for(p=0;p<43;p++) { RS232_putch(maska6[p]); } RS232_putch(10); RS232_putch(13); for(r=0;r<43;r++) { RS232_putch(maska7[r]); } RS232_putch(10); RS232_putch(13); GIE=1; while(1) { if(funkcija==1) signal1(t); if(funkcija==2) signal2(t); if(funkcija==3) signal3(t); if(funkcija==5) signal5(t); } }

5.Dodatak

Sl: 5.1 Blok sema kola 74hc373

Sl: 5.2 Struktura kola 74hc373

Na slikama 5.1 i 5.2 prikazana je blok sema i struktura kola 74hc373. Ovo kolo je D lec kolo sa trostatickim izlazom. Pinovi OE i LE sluze za kontolu leca i trostatickog izlaza. Slika 5.3 prikazuje tabeli istinitosti kola 74hc373, dok slika 5.4 jednosmerne karakteristike ovog D lec kola. Od jendnosmernih karakteristika najvaznije su one koje odredjuju izlazne naponske nivoe na izlazu leca (VOH i VOL). Izlazni naponski nivo logicke jedinice je ujedno referetni napo koji se kristi u izrazu za napon na izlazu analogno-digitalnog konvertora. Slika 5.5 je proizvodjacka preporuka povezivanje kola MAX232. Na slici su prikazani svi potrebni elementi, i nacin na koji ih treba povezti da bi kolo ispravni radilo. Pri realizaciji naseg sistema iskoristili smo upavo ovu preporuku. Na slici 5.6 prikazane su dimenzije i karakteristike koriscenih LE dioda. Ove diode su vrlo zahvene za koriscene u situacija kada je potrebna jednostavna i jeftina indikacija nekog stanja. Imaju veoma malo potrosnju struje, tako da mikrokontroler PIC16F877 moze direkno da ih podjuje. Slika 5.7 prikazuje fiziki izgled i karakteristike koriscenih DIP prekidaca. U nasem sistemu korisceni su cetvoropolni DIP prekidaci.

Sl: 5.3 Tabela istinitost kola 74hc373

Sl: 5.4 Jednosmerne karakteristike kola 74hc373

Sl: 5.5 Struktura kola MAX232

Sl: 5.6 Fizicki izgled i karakteristike LE-dioda

Sl: 5.7 Fizicki izgled i karateristike DIP prekidaca

Sl: 5.8 Fizicki izgled linijskog stabilizatora 7805

Sl: 5.9 Fizicki izgled i karakteristike impulsnih tastera

Sl: 5.10 Fizicki izgled NYLON konektora

Sl: 5.11 Fizicki izgled i karaktristike grecovog ispravljaca

Slika 5.8 prikazuje fizice dimenzije linijskog stabiliora 7805. Ovaj stabilizator je dimenzionisan za nazivnu struju od jednog ampera, sto je bilo sasvim dovoljno za nas sistem.

Za reset mikrokontrolera koristili smo impulsne tastere. Oni su malih dimenzija, a i cena imje pristupacna, tako da sve vise nalaze mesto u mikrokontrolerskim sistemima. Fizicki izgled i karateristike impulsnih tastera prikazana je na slici 5.9.

Na slici 5.10 prikaz je zizicki izgled NYLON konektra. Ovi konektori su korisceni za povezivanje napajanja i programatora sa sistemom.

Slika 5.11 prikazuje karakteristke i fizicki izgled integrisanog grecovog ispravljaca. U sistemu je koriscen grecov ispravljac dimenzionisan za struje do jednig ampera.

Sl: 5.12 Sema TAIT programatora Za programiranje mikrokontrolera koristili smo TAIT programator. Ovaj

programator spada u grupi ICSP programatoa, sto zanaci da moze da programira mikrokntroler dok se on nalazi u sistemu, bez njegovog vadjenja. Vrlo je zahvalan za izrdu pre svega zbog cene komponenata i jednostavnosti izrade. Sema ovog programatora prikazana je na slici 5.12.

Literatra

1. Programski jezik C za PIC mikrokontrolere, Infoelektronika 2. PC interfejsi, V. Milanovic 3. Impulsna i digitakna elektronika, D. Zivkovic i M. Popovic 4. Seminarski rad: Razvojni sistem za PIC16F877A mikrokontroler, B.

Dimitrijevic, S. Aleksic, I. Antic