VISOKA POSLOVNA ŠKOLA STRUKOVNIH STUDIJA ČAČAK MASTER RAD Simulacija PLC kontrolera preko mikrokontrolera PIC16F877A Mentor: Profesor: Student: Br.Indeksa: Mesto, mesec, godina
ELEKTRONSKI FAKULTET Katedra za elektroniku SIMULACIJA PLC KONTROLERA PREKO MIKROKONTROLERA PIC16F877A
SADRŢAJ I O RADU 3 II STANDARDI ZA PRENOS PODATAKA 4 TIA/EIA-232-F TIA/EIA-423-B TIA/EIA-422-B TIA/EIA-485 SCSI FireWire USB III KARAKTERISTIKE SERIJSKOG PORTA 8 IV OPIS MIKROKONTROLER PIC16F877A 12 V Zašto baš PIC16F877A? Karakteristike mikrokontrolera Arhitektura mikrokontrolera Organizacija memorije mikrokontrolera Izbor oscilatora mikrokontrolera Portovi mikrokontrolera Periferijske jedinice LOGIĈKA I SEKVENCIJALNA KOLA 26 Realizacija logiĉkih kola Prekidaĉka kola Multiplekseri i demultiplekseri Leĉevi i flip-flopovi VI PLC KONTROLERI 44 Šta predstavlja PLC? PLC v.s. mikroraĉunar Prednosti PLC kontrolera Nedostaci PLC kontrolera Neki primeri primene PLC kontrolera VII SIMULACIJA PLC KONTROLERA 51 Varijante realizacija PLC-a VIII LISTING PROGRAMSKOG KÔDA PLC-a 61 IX LISTING ASEMBLERSKOG KÔDA PLC-a 65 X LABORATORIJSKA VEŢBA 86 XI ZAKLJUĈAK 91 XII LITERATURA 92 XIII KRAĆE BIOGRAFIJE 93 2
1- O RADU Seminarski rad koji je realizovan u toku januara i februara 2008. godine predstavlja jedan od načina za simulaciju funkcija PLC kontrolera preko mikrokontrolera PIC16F877A. Iako je prvobitna ideja bila da se seminarski rad realizuje sa (industrijskim) PLC kontrolerom, od nje se odustalo zbog visoke cene ovih kontrolera (najjednostavniji PLC kontroleri koštaju preko 200 evra) i nemogućnosti nabavke odgovarajućeg softvera. U drugom i trećem programu dat je kratak pregled prenosa podataka i serijskog porta računara. Četvrto poglavlje sadrži opis mikrokontrolera PIC16F877A, a u petom poglavlju nalazi se kratak pregled logičkih i sekvencijalnih kola. Šesto poglavlje se bavi opisom (industrijskih) PLC kontrolera. U sedmom poglavlju prikazan je projekat PLC kontrolera realizovanog preko standardnog mikrokontrolera, u osmom poglavlju je prikazan listing kôda u C-u i asembleru, a u sledećem poglavlju je opisana laboratorijska vežba za rad studenata. Za programiranje pomenutog mikrokontrolera korišćen je ALLPIC programator i softver IC-Prog, koji su detaljno opisani u seminarskim radovima studenata [3] i [4] (poglavlje LITERATURA). U cilju eventualnog proširenja, po obodu realizovane štampane pločice (PCB) nalaze se kleme, a predviďena je mogućnost serijske komunikacije sa računarom. 3
2 STANDARDI ZA PRENOS PODATAKA PARAMETAR EIA 232 RS 423-A RS 422-A RS 485 naĉin rada nebalansirani nebalansirani diferencijalni diferencijalni broj drajvera i prijemnika 1 drajver 1 drajver 1 drajver 32 drajvera 1 prijemnik 10 prijemnik 10 prijemnik 32 prijemnika maksimalna duţina kabla [m] 15 1200 1200 1200 maksimalna brzina prenosa podataka [bps] 20 K 100 K 10 M 10 M maksimalni napon na zajedniĉkim krajevima [V] + 25 + 6 6 do 0.25 12 do 7 IZLAZNI DRAJVERSKI SIGNALI izlaz drajvera [V] (min) neopterećen 5 3,6 2 3,6 izlaz drajvera [V] (max) opterećen 15 6 5 3,6 opterećenje drajvera [Ω] 3 K 7 K 450 (min) 100 (min) 60 (min) ''slew rate'' drajvera [V/µs] 30 (max) spoljna kontrola n.d. n.d. izlazna struja kratkog spoja 150 na GND graniĉna vrednost struje (ma) 500 na Vcc 150 na GND 150 na GND 200 na 7 ili izlazna otpornost ukljuĉeno drajvera [Ω] stanje visoke napajanje iskljuĉeno n.d. n.d. n.d. 12 K impedanse [Ω] napajanje 30 K 60 K 60 K 12 K ulazna impedansa prijemnika [Ω] 3 7 K 4 K(min) 4 K (min) 12 K (min) osetljivost prijemnika [V] 3 V 0,2 0,2 0,2 opseg ulaznog napona prijemnika [V] 15 12 7-7 do 12V Tabela 2-1. Uporedni prikaz ĉetiri standarda za prenos podataka 2-1. TIA/EIA-232-F Uobičajen naziv za ovaj standard je RS-232. Definisan je u ANSI (American National Standards Institute) specifikaciji kao interfejs izmeďu data terminala (DTE data terminal equipment) i data kola (DCE data circuit-terminating equipment), pri čemu se koristi serijski binarni protok podataka. Standard podrazumeva single-ended serijsku prenosnu šemu. Maksimalni protok podataka je 20kbs, mada sada postoji veliki broj softverskih rešenja koja postižu 116 kbps i više. Maksimalna ulazna kapacitivnost je 2500pF, pri kojoj je uz upotrebu običnih standardnih kablova, moguća 15-ak metara duga veza. Za dužu vezu ili veći protok neophodne su diferencijalno balansirane linije za komunikaciju. Električne osobine serijskog porta su definisane EIA (Electronics Industry Association) RS232C standardom, čiji su parametri: 4
Logičkoj nuli odgovara stanje "SPACE", koji se nalazi u opsegu napona +3V do +25V, Logičkoj jedinici odgovara stanje "MARK", koji je u opsegu -3V do -25V, Naponski nivo izmeďu -3 do + 3 V nije definisan, Napon na kolu ne sme da preďe 25V u odnosu na masu (GND), Struja kola ne sme preďe vrednost 500 ma. Pored RS232C standarda postoje i novije verzije EIA-232D i EIA-232E, koje su objavljene 1987. i 1991. godine i to je prikazano u Tabeli 2-1. Slučaj kada nema slanja podatka, tj. linija je slobodna, označena je MARK naponom. Prenos počinje kada linija preďe u SPACE stanje, što predstavlja START bit. Iza start bita dolaze bitovi podataka i to tako da je jedinica predstavljena negativnim naponom, a nula pozitivnim. Ovo je, dakle, u suprotnosti sa logičkim nivoima gde je +5 V logička jedinica, a 0 V logička nula. Konverzija se obavlja preko odgovarajućeg kola (npr. MAX232) Posle bitova podatka može da doďe bit parnosti koji se koristi za detekciju jednostruke greške u prenosu. Iza bita parnosti signal se postavlja u MARK stanje što označava početak STOP bita. Prema RS232 standardu, broj stop bitova može biti: 1, 1.5 ili 2. Nakon završetka STOP bit(ov)a, linija je spremna za slanje novog karaktera. PC računari za podatak (DATA) najčešće koriste 7 ili 8 bitova. IzmeĎu slanja dva karaktera linija se nalazi u MARK stanju, a u toku prenosa više puta prelazi iz MARK u SPACE stanje, u zavisnosti od broja jedinica i nula. To znači da se linija može nalaziti u SPACE stanju najviše u slučaju kada karakter sadrži sve nule. Ova osobina prenosa upotrebljena je za uvoďenje specijalnog znaka nazvanog BREAK (prekid). Ovaj signal se koristi kako bi se prijemniku signaliziralo da je došlo do problema u slanju podataka. Serijski prenos počinje tako da predajna strana šalje prijemnoj strani signal RTS (zahtev za slanje), dok prijemnik, ako je spreman za prijem, odgovara signalom CTS (spreman za prijem). Predajnik zatim šalje podatke prijemniku. Nakon prijema podataka, prijemnik proverava da li su podaci primljeni bez greške i za to vreme javlja predajniku da je zauzet. Ako su podaci primljeni bez greške, prijemnik šalje predajniku signal potvrde ACK (Acknowledgment - ASCII 6), a u slučaju ako se pojavila neka greška, šalje signal negativne potvrde NAK (ASCII 21). Zavisno od upotrebljenog protokola, odgovor predajnika na dobijeni NAK signal može biti ponovno slanje podataka. Protokol za prenos može se izvesti na dva načina i to: hardverski i softverski. Za realizaciju hardverskog protokola neophodno je da postoje linije: RTS, CTS i linija za prenos bitova poruke. Softverska realizacija koristi umesto linija RTS i CTS, ASCII znakove XON i XOFF (nazivaju su i DC1 i DC3), zbog čega je umesto tri dovoljna samo jedna linija. Kada se primenjuje ovaj protokol prijemnici i na predaji i prijemu proveravaju svaki prispeli znak radi utvrďivanja da li je to XON, XOFF ili podatak. Strana koja ne može da primi karakter kao indikator tog stanja drugoj strani šalje XOFF znak. Oblik signala kod RS232 standarda prikazan je na Slici 2-2. 2-2. TIA/EIA-423-B (RS-423) Ovaj interfejs koristi nebalansirane linije za prenos. Ipak, samo jedan kraj prenosnog sistema je uzemljen, što onemogućuje pojavu ground loop-a. Prijemna strana RS-423 je diferencijalna. Nebalansirani predajnik i diferencijalni prijemnik se koriste da bi se izbegao uticaj preslušavanja (crosstalk) i različitog (diferentnog) uzemljenja. Kod RS-423 standarda prenos podataka je na 120kbps (za 30 metara dugi kabl), pa sve do 3 kbps (za kabl dug 1300 metara). 5
Slika 2-2. Oblik signala kod RS232 standarda 2-3. TIA/EIA-422-B Uobičajen naziv za standard je RS-422. Prenos podataka kod RS-422 je jednosmeran (simplex). Koriščenjem kablova koji su meďusobno upredeni (uvrnuti) i RS-422 prijemnika, čiji je napon minimalno 7V, ovaj način prenosa je manje položan šumovima okoline u kojoj se nalaze dugi prenosni kablovi. Svaki drajver može pokretati do 10 prijemnika. Prenos podataka je do 10Mbps-a pri dužini kabla (linija) do 1200 metara, mada je moguće ostvariti i veće brzine podataka. 2-4. TIA/EIA-485 (RS-485) RS-485 predstavlja poboljšanje RS-422 standarda, koje koristi slične naponske nivoe, ali omogućava polu-dupleks vezu i bidirekcionu komunikaciju. Standard definiše samo nivoe i oblike električnih signala. Kompletan hardver se definiše od strane korisnika proizvoljno. Standard propisuje balansirane linije prenosa čija dužina treba da bude 1200 metara. Maksimalna brzina prenosa je nedefinisana, ali se odreďuje kao odnos vremena uspostavljanja signala i vremena trajanja bita. Slika 2-3. Klasifikacija standarda po brzini 6
2-5. SMALL COMPUTER SISTEM INTERFACE (SCSI) SCSI je industrijski standard, koji je definisan od strane ANSI-a, a koji obezbeďuje razmenu podatka izmedju kompijutera i periferije. Standardni SCSI je paralelni interfejs širine jednog bajta, koji omogućuje vrlo velike brzine prenosa podataka na malim razdaljinama. SCSI magistrala (bus) je bidirekcionalna (obostrana) i na oba kraja kabla se nalazi terminator, radi eliminasanja uticaja refleksije u vodu. Kod single-ended interfejsa standard definiše maksimalnu dužinu voda od 6 metara. Maksimalna brzina protoka podataka je 10 miliona transfera po sekundi, što iznosi oko 80 Mbps. Za duže linije (do 25 metara), ovaj standard koristi RS-485 kao fizičku sloj. 2-6. IEEE 1394 (FireWire) Novi standard koji obezbeďuje visoke brzine prenosa na serijskoj magistrali (bus-u). Omogućava izohroni (real time) i asinhroni prenos podataka sa brzinom od 100, 200 i 400 Mbps. Inače, planirane su i veće brzine. Ovaj standard podržava prenos podataka visoke rezolucije za video kao i prenos većeg broja audio kanala pri niskoj ceni. Tipična aplikacije su digitalni audio i video, CD-ROM-ovi, PC računari i periferije, kao i svi oblici vremenski kritičnih (time critical) prenosa podataka. 2-7. UNIVERSAL SERIAL BUS (USB) Ovaj standard može da zameni mnoge postojeće standarde (kao što su RS-232, paralelne portove, MIDI portove) sa samo jednim konektorom. USB omogućava prenos od 1,5 Mbps, 12 Mbps, 120 Mbps i više. Tipične aplikacije su povezivanje sporih periferija na PC računar (tastatura, miš), povezivanje (standardnih i GSM/ GPRS) modema, skenera, štampača, digitalnih i audio ureďaja itd. 7
3 KARAKTERISTIKE SERIJSKOG PORTA Serijski port PC računara koristi se za serijski prenos podataka (bit po bit) i samim tim je sporiji od paralelnog porta. UreĎaji koji koriste serijsku komunikaciju koriste dve vrste kablova i to: DCE (Data Communications Equipment) i DTE (Data Terminal Equipment). DCE koriste modemi, ploteri i slično, dok se DTE koristi za vezu izmeďu PC računara. Raspored pinova (1-9) na konektoru DSUB-9 prikazan je na Slici 3-1, dok su opisi i značenja signala dati Tabeli 3-2 i Tabeli 3-3. Slika 3-1. Raspored pinova na konektoru DSUB-9 Postoje sinhroni i asinhoni serijski prenos. Sinhoni prenos podrazumeva da predajnik i prijemnik dele zajednički takt, ili da predajnik obezbedi poseban signal kojim će se obaveštavati prijemnik kada se šalje sledeći podatak. Kod asinhronog prenosa ne postoji poseban signal, već se sinhronizacija vrši preko specijalnih bitova koji se umeću. Slika 3-2. Principijelna blok-šema serijskog porta Tokom serijskog prenosa podataka moguća je pojava sledećih grešaka: Greška uokvirenja ili greška rama podatka (framing error). Do ove greške dolazi u slučaju kada prijemnik očekuje STOP bit, ali se on ne pojavljuje. 8
Greška prekoračenja (overrun error). Nastaje kada se pojavljuje novi znak u prijemniku, a prethodni nije upotpunosti primljen. Greška parnosti (parity error). Nastaje kada bit parnosti ne odgovara stanju bitova u bitovima podatka. Signali Tip Opis RX Input Linija za prijem bita serijski ulaz u prijemnik. TX Output Linija za slanje bita serijski izlaz iz predajnika. RST_In Input Reset Input sistemski reset. CLK_In Input Clock Input sistemski takt. WE_In Input Write Enable odreďuje da li je na magistrali ciklus čitanja ili upisa; WE_In=0 => čitanje, WE_In=1 => upis. CYC_In Input Cycle Input govori da je u toku ispravan ciklus na magistrali. Signal je aktivan za sve vreme trajanja cikusa (tj. za vreme trajanja svih ciklusa u slučaju BLOCK čitanja/upisa). STB_In Input Strobe Input indicira da je u toku ispravan ciklus na magistrali. PotvrĎuje spremnost podataka na WE_In, ADR_In, SEL_In ulazima. ACK_Out Output Acknowledge Output aktivna vrednost označava da je normalno završen ciklus na magistrali. RTY_Out Output Retry Output aktivna vrednost govori da interfejs nije spreman da primi/pošalje podatke i da treba ponovo izvršiti ciklus. ERR_Out Output Error Output aktivna vrednost govori da je došlo do greške i da se ciklus prekida. ADR_In (31..0) Input Addres Input array sadrži adresu podatka koji se čita, tj. adresu na koju podatak treba da se upiše. Najznačajniji bit adrese se nalazi na kraju niza označenom najvećom vrednošću. DAT_In (31..0) Input Data Input array linije preko kojih port prima podatke od računarskog sistema. DAT_Out (31..0) Output Data Output array linije preko kojih port šalje podatke računarskom sistemu. SEL_In (3..0) Input Select Input array označava gde na linijama za podatke master očekuje da budu podaci koji su pročitani, tj. gde se nalaze podaci koji treba da budu upisani. TAG0_Out Output Tx_FIFO Full odlazni FIFO red je pun. TAG1_Out Output Rx_FIFO Empty dolazni FIFO red je prazan. TAG2_Out Output Framing Error u prijemniku se desila greška. TAG3_Out Output Overrun Error u prijemniku se desila greška. Tabela 3-1. Spisak signala serijskog porta Kod PC računara serijska komunikacija se ostvaruje preko Intelovog UART kola 8250 (kod XT) ili 16450 (kod AT računara). Ova kola su veoma slična, s tim što kolo 16450 ima neke naprednije karakteristike. Kolo 8250 sadrži 10, dok kolo16450 ima 12 programibilnih jednobajtnih registara. Svaki port (COM1 i COM2) ima po jedno UART kolo koja se vezuju na linije prekida IRQ3 i IRQ4. Standardno se koriste dva porta, a moguće je i više sa adresama i IRQ prema Tabeli 3-4. Bazne adrese COM portova nalaze se u BIOS-u na adresama datim u Tabeli 3-5. 9
DSUB-9 Signal Opis signala pin 3 TD Transmit Data pin 2 RD Receive Data pin 7 RTS Request To Send pin 8 CTS Clear To Send pin 6 DSR Data Set Ready pin 5 SG Signal Ground pin 1 CD Carrier Detect pin 4 DTR Data Terminal Ready pin 9 RI Ring Indicator Tabela 3-2. Signali na konektoru DSUB-9 Signal Opis signala Značenje signala TD Transmit Data Serijski izlaz podataka (TXD) RD Receive Data Serijski ulaz podataka (RXD) RTS Request ToSend Indicira da je modem spreman za razmenu podataka CTS Clear To Send Kada modem detektuje signal "Carrier" od modema sa druge strane linije, onda ona postaje aktivna DSR Data Set Ready DCE signalizira da je spreman za rad SG Signal Ground Masa CD Carrier Detect DCE javlja da je uspostavljena veza DTR Data Terminal Ready Indicira DCE ureċaju da je DTE spreman RI Ring Indicator Signalizira detekciju signala "zvona" na telefonskoj liniji Tabela 3-3. Funkcija pojedinih signala Naziv Adresa IRQ COM 1 3F8 4 COM 2 2F8 3 COM 3 3E8 4 COM 4 2E8 3 Tabela 3-4. Adrese COM portova Startna adresa Opis 0000:0400 Poĉetna adresa COM1 0000:0402 Poĉetna adresa COM2 0000:0404 Poĉetna adresa COM3 0000:0406 Poĉetna adresa COM4 Tabela 3-5. Bazne adrese COM portova u BIOS-u 10
USART Serijski port sadrži USART (Universal Asynchronous & Synchronous Receiver/Transmitter) kontroler, koji predstavlja najvažniju komponentu za ostvarivanje serijske komunikacije. USART predstavlja interfejs izmeďu mikroprocesora i ulazno-izlaznog periferijskog ure- Ďaja, tako da ima dvojak zadatak: 1. Prihvata bajtove podataka od mikroprocesora, transformiše ih u bitski niz (string) i šalje ka periferiji bit-po-bit. 2. Prihvata niz bitova koji stižu sa periferije, pakuje ih u bajtove i predaje mikroprocesoru (CPU). Unutar USART podsistema integrisane su sledeće komponente: takt generator, delitelji frekvencije, ulazni pomerački registar, izlazni pomerački registar, kontrolna logika čitanja i upisa, kontrolna logika slanja i prijema, bafer prijemnika (opciono), bafer predajnika (opciono), FIFO (opciono). Pored navedenih, USART mora da obavi i dodatne operacije brisanje prethodno poslatog bita ili podatka, kao i pridruživanje dodatnih bitova (start-bit, stop-bitovi i bit parnosti) karakteru koji se šalje. U slučaju da karakter sadrži manje od 8 bitova (5, 6 ili 7), na svaku praznu poziciju se dopisije ili logička 0 ili logička 1, zavisno od proizvoďača. Dodatne mogućnosti podrazumevaju da UART mora da prepoznaje greške koje mogu da nastanu prilikom prijema podataka: grešku prekoračenja (Overrun Error), grešku u ramu podatka (Framing Error) i grešku parnosti (Parity Error). 11
4 - OPIS MIKROKONTROLERA PIC16F877A Pre oko jedne decenije firma Microchip je tržištu ponudila mikrokontroler PIC16F877A, koji predstavlja integraciju mikroprocesora (CPU), memorije i periferija. Ovaj mikrokontroler je izraďen u CMOS tehnologiji sa ugraďenom FLASH i EEPROM memorijama, za čuvanje programa i podataka. PIC16F877A ima tipičnu RISC arhtekturu (karakteriše manjim skupom instrukcija koje se brže izvšavaju u odnosu na CISC arhitekturu). 4-1. Zašto baš PIC16F877A? Microchip proizvodi kontrolere čiji odnos cena/performanse je u samom vrhu trenutno prisutnih kontrolera na svetskom tržištu. Za svoje mikrokontrolere Microchip nudi potpuno besplatan razvojni sistem MPLAB. Microchip prodaje C kompajler za svoje kontrolere, ali zato za edukaciju i neprofesionalnu upotrebu postoje C kompajleri koji se mogu naći na Internetu i koji su besplatni. Arhitektura Microchip-ovih kontrolera je RISC zasnovana sa dobrim konceptom optimizacije u smislu brzine i jednostavnosti projektovanja i performansi. Mikrokontroler PIC16F877A posjeduje većinu potrebnih periferija na samom čipu tako da je podesan za aplikacije na jednom čipu. Koristi ISP (In System Programming) tehniku programiranja, za čiji programator je dovoljno realizovati manji sklop od tri otpornika i imati vezu sa serijskim portom računara. Kompatibilan je sa ostalim mikrokontrolerima iz Microchip-ove familije u smislu instrukcijskog seta i arhitekture tako da je prelazak na bilo koji drugi njihov mikrokontroler veoma jednostavan. 12
4-2. Karakteristike mikrokontrolera RISC CPU visokih performansi 35 instrukcija obima jedne reči Radna frekvencija do 20 MHz Sve instrukcije su jednocikluske, sem instrukcija grananja koje su dvocikluske Trajanje taktnog intervala 200 ns (pri frekvenciji 20 MHz) Opkôd je obima 14 bita Hardverski magacin (stack) ima osam nivoa Postoje tri načina adresiranja (direktno, indirektno i relativno) Programska flash memorija je kapaciteta 8 k X 14-bitnih reči Memorije za podatke (RAM) je kapaciteta 368 X 8 bita Memorije za podatke (EEPROM) je kapaciteta 256 X 8 bita Prekidi (maksimalno 14 izvora prekida) šest ulazno-izlaznih portova (A, B, C, D i E) Tri tajmera: - Timer0 (TMR0): osmobitni tajmer/brojač_dogaďaja - Timer1 (TMR1): šesnaestobitni tajmer/brojač_dogaďaja - Timer2 (TMR2): osmobitni tajmer/brojač_dogaďaja Serijska komunikacija: MSSP, USART Paralelna 8-bitna komunikacija: PSP ICSP (In Circuit Serial Programing) preko samo dva izvoda Analogni komparatorski modul sa programabilnim referentnim naponima 8-kanalni 10-bitni ADC (Analog-to-Digital Converter, analogno/digitalni konvertor) 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 neposredno po stabilizovanju radne frekvencije oscilatora (OST) Sleep mode - režim rada sa veoma malim utroškom energije Watchdog tajmer sa sopstvenim integrisanim RC oscilatorom za nezavisni rad Izbor tipa oscilatora (RC, XT, HS, LP) 100000 ciklusa Write/Erase programske memorije. 1000000 ciklusa Write/Erase memorije za podatke EEPROM. Trajanje podataka u EEPROM duže od 40 godina. Radni napon može da bude u opsegu 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. 4-3. Arhitektura mikrokontrolera PIC16F877A Na Slici 4-2 je ilustrovana arhitektura mikrokontrolera PIC16F877A. Ona poseduje odvojene magistrale za podatke i programski kôd. Obim podataka je osmobitni, dok je programski kôd četrnaestobitni. Sve instrukcije su istog obima (osim instrukcija grananja) i izvšavaju se za četiri taktna intervala. Dakle, ukoliko se koristi oscilator od 20 MHz, ciklus instrukcije traje 200 ns, a moguće je protočno izvršenje (pipelining). 13
Slika 4-1. Raspored pinova kod mikrokontrolera PIC16F877 u kućištu DIP40 Strukturu mikrokontrolera PIC16F877A čini nekoliko celina: Aritmetičko-logička jedinica (ALU) Akumulator (Working Register) Hardverski magacin (Stack) organizivan u 8 nivoa EEPROM memorija podataka obima 256 bajtova Flash programska memorija 8 kiloreči obima 14 bita RAM (File Registers) 368 bajtova Višekanalni A/D konvertor, USART, SPI interfejs, I2C interfejs, šest U/I portova, tajmere itd. 4-4. Organizacija memorije mikrokontrolera Memorija mikrokontrolera PIC16F877A je organizovan u sledeće tri celine: Programska memorija (FLASH) Memorija podataka (RAM) EEPROM memorija podataka. 14
Slika 4-2. Arhitektura mikrokontrolera PIC16F877A 15
U mikrokontroleru postoji i magacin (stack), koji radi na principu cikličnog bafera, što znači da se u njega mogu staviti osam različitih adresa, dok se sa upisom devete adrese briše prva i tako redom. Programski se ne može utvrditi da li je došlo do prepunjeja magacina. Programska memorija U mikrokontroler PIC16F877A integrisan je trinaestobitni programski brojač (PC) koji je u mogućnosti da adresira 8K programskih reči od 14 bita. Izvršavanje programa počinje od Reset vektora, a prekidni (interrupt) vektor je 0x0004. Mapa programske memorije i magacin su prikazani na Slici 4-3. Memorija podataka Memorija podataka je podeljena u više banki (banks), a čine je registri opšte namene (General Purpose Registers) i registri specijalne funkcije (Special Function Registers). U jednom od specijalnih registara, tzv. STATUS registru postoje dva bita RP1 i RP0 koji služe za izbor željene banke podataka.. Slika 4-3. Mapa programske memorije i magacin (stack) 16
Slika 4-4. Mapa registara mikrokontrolera PIC16F877 17
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 brzi pristup i redukcija kôda. Mapa registara mikrokontrolera PIC16F877 prikazana je na Slika 4-4. Nekoliko specijalnih registara su registri jezgra, uskopovezani sa funkcionisanjem mikroprocesora kontrolera. Ostali registri su vezani za periferne module i služe za njihovo upravljanje i kontrolu statusa Programski brojač (PC) je 13-bitni registar i odreďuje adresu naredne instrukcije u programskoj flash memoriji. Simboličko ime nižeg bajta je PCL i to je registar u koji se može i upisivati i iščitavati. Viših pet bita programskog brojača (PC) smešteni su u izolovani registar PCH kojem se pristupa samo preko latch-a PCLATH, mapiranom u internom RAM-u na adresi 0x0A. STATUS registar je veoma važan 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/pozajmice Carry (C). Interni EEPROM za podatke Kada je potrebno da se upamte neki parametri (podaci) i posle prestanka napajanja mikrokontrolera, treba ih, prethodno, zapisati u interni EEPROM. Ova memorija je obima 256 bajtova. Slika 4-5. Povezivanje oscilatora sa eksternim otpornikom i kondenzatorom 4-5. Izbor oscilatora mikrokontrolera Kod mikrokontrolera PIC16F877A moguće je izabrati jednu od četiri konfiguracije oscilatora: RC Resistor/Capacitor XT Crystal / Resonator 18
LP Low Power Crystal HS High Speed Crystal / Resonator. Najjednostavnija varijanta je izbor RC oscilatora (internog ili eksternog), što je i prikazano na Slici 4-5. Ovakav pristup je ispravan u aplikacijama u kojima se ne zahteva precizna procena vremenskih intervala. Slika 4-6. Povezivanje eksternog kvarca (LP, XT, HS) Slika 4-7. DovoĊenje spoljašnjeg takta Pored vrednosti otpornika i kondenzatora (Rext i Cext), frekvencija oscilovanja zavisi i od napona napajanja i radne temperature. Vrednost otpornika Rext treba da bude u opsegu od 3 KΩ do 100K KΩ. Izvan ovog opsega rad oscilatora nije stabilan i osetljiv je na spoljašne uticaje. Kondenzator Cext se može čak i izostaviti. MeĎutim, zbog stabilnosti preporučuje se vrednost oko 20pF. Kod aplikacija koje su vremenski kritične (time critical) treba koristiti kvarcni oscilator ili keramički rezonator. Vrednosti kondenzatora C1 i C2 (Slici 4-6), treba da budu identične. Mikrokontroleru PIC16F877A može da se dovede i spoljašnji takt, što je i pokazano na Slici 4-7. 4-6. Portovi mikrokontrolera PIC16F877A poseduje pet portova (PORT_A, PORT_B, PORT_C, PORT_D i PORT_E) i svi oni predstavljaju vezu njegove interne strukture sa spoljašnjim svetom. Svaki od njih može da se konfiguriše kao ulazni ili kao izlazni. Pomenuti portovi su različitog obima: 19
6-pinski (PORT_A) 8-pinski (PORT_B, PORT_C, PORT_D) 3-pinski (PORT_E). Svakom pinu bilo kojeg porta, u zavisnosti od režima rada, mogu da se dodele kako fiksne tako i promenljive funkcije. Konfiguracija smera prenosa ostvaruje se upisom na odgovarajuću bit-poziciju u pripadajućem TRIS registru (0 pin je izlazni, 1 pin je ulazni). Svakom portu je dodeljen registar podataka (PORT_X), preko kojeg se programski pristupa U/I pinovima. Upis u neki od tih registara iniciraće upis u latch tog porta, a njegovo čitanje rezultiraće čitanjem logičkih stanja direktno sa pinova. Sve instrukcije upisivanja su tipa read-modify-write.to znači da se pri upisu u port najpre očitaju stanja pinova, zatim izvrši modifikacija, a potom korigovana vrednost upiše u latch porta. Ne postoji velika razlika u konstrukciji pomenutih pet portova. Jedino se Port_B od ostalih razlikuje zbog posebne opcije koju nude četiri MSB. Ukoliko se setuje bit RBIE u registru INTCON, svaka promena stanja na ovim pinovima, generisaće prekid mikrokontrolera. Slika 4-8. Blok-dijagram pina RA4 Port_A Port_A je 6-bitni (RA5-RA0) bidirekcioni port (podaci mogu da se šalju u oba smera). Sadržaj registra TRISA odreďuje smer (ulazni ili izlazni) pinova na portu. Blok-dijagrami za pin RA4 je prikazan na Slici 4-8, a za ostale pinove na Slici 4-9. 20
Slika 4-9. Blok-dijagram ostalih pinova Porta A Kroz nekoliko primera ćemo ilustrovati kako se definišu smerovi na portu : TRISA = 0b111111 (Port_A je ulazni), TRISA = 0b000000 (Port_A je izlazni), TRISA = 0b100001 (RA5 i RA0 pinovi su ulazni, a RA4-RA1 su izlazni), TRISA = 0b000111 (RA5-RA3 su izlazni, a RA2-RA0 su ulazni) itd. Port_A ima mogućnost analogno-digitalne konverzije i prvenstveno se koristi za te svrhe. A/D konvertor, koji je integrisan u mikrokontroleru, je 10-bitni sa 8 ulaznih kanala, jer se u ove svrhe koriste i svi pinovi Porta E (i pinovi Porta A, osim RA4). Pin RA4 je sa otvorenim drejnom i može da se iskoristi za ulazni takt za tajmer TMR0. Port_B Port _B je 8-bitni bidirekcioni port. Svakom pinu porta korespondira odgovarajući bit u registru TRISB, kojim se definiše smer. Svi pinovi unutar Porta B poseduju pull-up otpornike. Ovi otpornici mogu da se uključe jednim kontrolnim bitom. To se postiže postavljanjem RBPU bita na 0. Pull-up otpornici se automatski isključuju kada se pin konfiguriše kao izlazni. Otpornici su isključeni i kod Power-on reseta. 21
Slika 4-10. Blok-dijagram pinova RB7-RB4 Slika 4-11. Blok-dijagram pinova RB7-RB4 22
Četiri pina na Portu B (RB7-RB4) imaju mogućnost generisanja prekida. Samo pinovi koji su definisani kao ulazni mogu da prouzrokuju prekid. Kombinacija prekida na promenu stanja Porta B i pull-up otpornik mogu da se iskoriste kao jednostavan interfejs za tastaturu. Na Slikama 4-10 i 4-11 prikazana je struktura Porta B. Port_C Port C je 8-bitni bidirekcioni port. Posebnost ovog porta se ogleda u tome što poseduje ugraďen USART modul, koji služi za serijsku komunikaciju (na primer sa računarom ili drugim mikrokontrolerom). Modulu se pristupa preko pinova RC7 i RC6. Pinove treba softverski konfigurisati da budu u funkciji USART modula. Portovi C, D i E Port_ D je 8-bitni bidirekcioni port. Ovaj port može da se konfiguriše kao 8-bitni paralelni mikro-procesorski port (parallel slave port-psp) i to podešavanjem konfiguracionog bita PSPMOTE (TRISC<4>). U ovom režimu rada ulazni bafer je TTL tipa. Slika 4-12. Blok-dijagram pinova RC7-RC5, RC2-RC0 23
Slika 4-13. Blok-dijagram pinova RC7-RC5, RC2-RC0 Port_E je bidirekcioni port veličine 3 bita. Ima mogućnost A/D konverzije.ulazni bafer je tipa Schmitt Trigger. Pinovi mogu da se konfigurišu kao digitalni ili analogni, kao i u slučaju Porta A, o čemu je već bilo reči. 4-7. Periferijske jedinice Mikrokontroler PIC16F877 poseduje nekoliko korisnih periferijskih modula, koji će u ovom odeljku biti samo kratko spomenuti. S obzirom na kontinualnost pojava u spoljašnjem svijetu, teško je upravljati bilo kojim procesom bez digitalizacije analognih veličina. Na većinu zahteva može odgovoriti 10-bitnii 8- kanalni A/D konvertor konstruisan na principu sukcesivnih aproksimacija. Mikrokontroler obično nije usamljen, nego je deo mreže ureďaja koji trebaju meďusobno da komuniciraju i razmenjuju podatke. U tu svrhu, on je opremljen sa tri hardverska komunikaciona modula. Prvi od njih je SSP modul (Synchronous Serial Port), koji služi za komunikaciju sa serijskim EEPROM-ima, pomeračkim registrima, displej-drajverima itd. Ovaj modul može da radi u jednom od dva režima: Serial Peripheral Interface (SPI) Inter-Integrated Circuit (I2C). 24
Drugi serijski komunikacioni modul je USART (Universal Synchronous Asynchronous Receiver Transmiter). On uglavnom služi za povezivanje sa personalnim računarom, mada to nije jedina mogućnost primene. USART može da se konfiguriše u neki od sledećih režima rada: Asinhroni rad (full duplex) Sinhroni master rad (half duplex) Sinhroni slave rad (half duplex). Osim serijskih, postoji i jedan paralelni komunikacioni modul. Reč je o modulu PSP (Parallel Slave Port). Njegov zadatak je da PIC16F877A direktno poveže na 8-bitnu magistralu podataka drugog mikroprocesora. Eksterni mikroprocesor tada, preko linija Read (RD) i Write (WR) može da čita i upisuje u Port_D registar kao u svaki drugi 8-bitni latch. 25
5 LOGIĈKA I SEKVENCIJALNA KOLA Digitalna kola se dele na dve velike klase: ona koja ne poseduju memoriju nazivamo kombinacionim kolima, dok su ona koja poseduju memoriju poznata pod imenom sekvencijalna kola. Ponašanje kombinacionog kola u potpunosti je specificirano istinitosnom tablicom ili skupom jednačina koje za svaku ulaznu kombinaciju daju odgovarajuću izlaznu kombinaciju. Ova kola preslikavaju ulazne podatke u izlazne, tj. obavljaju izračunavanje u jednom koraku. U praksi postoji neznatno kašnjenje pre nego što izlazni signali promene svoje stanje kao odziv na promene vrednosti signala na ulazu. Vreme odziva je obično veoma kratko, najčešće reda nanosekunde ili kraće, tako da se sa tog aspekta za odziv kombinacionih kola kaže da je trenutan. Nikola Tesla je prvi zatražio patente za elektromehaničko I (AND) logičko kolo 1899. godine, Klod Šenon (Claude E. Shannon) je uveo korišćenje Bulove algebre u analizi i dizajnu prekidačkih kola 1937. godine, a Volter Bot (Walther Bothe), pronalazač tzv. podudarnih kola, podelio je Nobelovu nagradu za fiziku 1954. godine za prvo električno I kolo napravljeno 1924. godine. Projektanti najčešće razlažu složena izračunavanja na sekvencu jednostavnih koraka. U tom slučaju, umesto da se rezultat odredi odjednom, u datom trenutku dobijamo samo mali deo tog rezultata. Isti princip važi i kod digitalnih sistema. Naime, digitalna kola koja izvršavaju specificirani zadatak obavljaju aktivnost kao sekvencu koraka. Zbog toga za ova kola kažemo da su sekvencijalna. Sekvencijalna kola moraju da pamte parcijalne rezultate izmeďu koraka. Pojmovi sekvencijalno kolo i kolo koje poseduje memoriju predstavljaju sinonime. Prednost sekvencijalnog rada je ta što je za izvršenje svakog koraka potrebno ugraditi jednostavniji hardver, ali sa druge strane, treba da protekne znatno duži period dok se ne dobije konačan rezultat. To znači da implementacija nekog zadataka pomoću kombinacione logike rezultira kraćem vremenu generisanja rezultata u odnosu na implementaciju zasnovanu na sekvencijalnoj logici, ali će zato obim hardvera biti veći. 5-1. Realizacija logiĉkih kola U principu, logička kola se mogu konstruisati od releja i prekidača. Mada je poluprovodnička elektronika prisutna u većini primena, releji i prekidači se još uvek koriste u nekim industrijskim primenama i u nastavne svrhe. Tri osnovna tipa logičkih kola realizuju tri osnovne logičke funkcije, a to su I (AND), ILI (OR) i NE (NOT) kolo. Sa ovim kolima je moguće konstruisati druge logičke funkcije, kao što su NI (NAND), NILI (NOR), EKSILI (XOR) i EKSNILI (XNOR). Ova kola ne izgledaju logičan izbor, ali se zbog jednostavnije konstrukcije složenih logičkih izraza baš neka od njih često koriste. Upravo je NI kolo najjednostavnije za realizaciju, odnosno sa tim kolom se konstruišu logički sklopovi koji sadrže najmanje tranzistora i samim tim su najmanje površine poluprovodničke pločice silicijuma. Usput, pomoću NI kola je moguće konstruisati bilo koje drugo logičko kolo primenom De Morganovih pravila. Dakle, sva složena logička kola se mogu realizovati primenom samo jednog, NI osnovnog kola.takav način obezbeďuje uniformnost i jednostavnost logičkog projektovanja, a programabilna logička polja (PLA) su baš tako realizovana. 26
5-2. Prekidaĉka kola Elektronska prekidačka kola su praktične realizacije apstraktnih bulovskih ideja. Prvi korak u razumevanju praktičnog kola je uspostavljanje veze izmeďu apstraktnih koncepata '1' i '0' (nula - ili bilo koje ime dato za ova dva stanja) i kako su prikazani u realnom, analognom, kolu. Oni su obično predstavljeni kao različiti naponi, mada su ponekad predstavljeni različitim jačinama struja kao u primeru niže. Nakon ovoga, mora se odrediti tzv. 'logički polaritet'. Na primer, pri interpretiranju značenja opšteprihvaćena je pozitivna logika, gde je najviši napon pridružen logičkoj jedinici. TTL koristi logiku prema ovakvom dogovoru. S druge strane, u drugom poglavlju je spomenut RS- 232 standard koji koristi tzv. 'negativnu' logiku. I kolo Bulovska I funkcija se može implementirati sa dva redno vezana prekidača (A i B), kao što je prikazano na Slici 5-1. Da bi kolo provodilo struju, istovremeno moraju biti uključena oba prekidača (A i B). Tablica istinitosti I kola prikazana ja u Tabeli 5.1. Slici 5-1. Principijelna šema prekidaĉkog I kola ULAZI IZLAZ A B A i B 0 0 0 1 0 0 0 1 0 1 1 1 Tabela 5-1. Tablica istinitosti prekidaĉkog I kola ILI kolo ILI kolo je realizovano sa dva prekidača (Slika 5-2), koja su u paralelnoj vezi tako da se provodnost obezbeďuje ako je makar jedan od prekidača (A ili B) uključen. Tablica istinitosti ILI kola prikazana ja u Tabeli 5.2. 27
Slici 5-2. Principijelna šema prekidaĉkog ILI kola ULAZI IZLAZ A B A ili B 0 0 0 1 0 1 0 1 1 1 1 1 Tabela 5-2. Tablica istinitosti prekidaĉkog ILI kola Slika 5-3. Osnovna logiĉka kola 28
Na Slici 5-3 prikazana su osnovna logička kola sa odgovarajućim simbolima i tablicama istinitosti. 5-3. Multiplekseri i demultiplekseri Multiplekser je kombinaciono kolo koje vrši ulogu elektronskog prekidača. Često se označava sa MUX i omogućava da se samo jedan od n ulaza logički poveže, u datom trenutku, na zajedničko odredište. Ulaz koji se u datom trenutku bira odreďen je od strane adresa ili selektorskih ulaza. Multiplekser se sastoji iz jednog izlaza, n selekcionih ulaza i 2 n informacijskih ulaza. Tako na primer multiplekser 2/1 ima dva ulaza za podatke (D0 i D1), jedan selekcijski ulaz (S) i jedan izlaz (Y). Kada je S=0, stanje sa ulaza D0 će biti prosleďeno na izlaz (Y); ako je S=1, stanje sa ulaza D1 će biti prosleďeno na izlaz (Y). Slika 5-4. Multiplekser 2/1 (MUX 2/1) 29
Logički simbol, tablica istinitosti, logička funkcija i shema multipleksera 2/1 prikazani su na Slici 5-4, a realizacija MUX 2/1 preko logičkih kola prikazana je na Slici 5-5. Multiplekser 4/1 (logički simbol je prikazan na Slici 5-6) ima dva ulaza za podatke (D0, D1, D2 i D3), dva selekcijska ulaza (S0 i S1) i jedan izlaz (Y). Kada je S0=S1=0, stanje sa ulaza D0 će biti prosleďeno na izlaz (Y); ako je S0=0 i S1=1, stanje sa ulaza D1 će biti prosleďeno na izlaz; ako je S0=1 i S1=0, stanje sa ulaza D2 će biti prosleďeno na izlaz; kada je S0=S1=1, stanje sa ulaza D3 će biti prosleďeno na izlaz. Slika 5-5. Multiplekser 2/1 (MUX 2/1) realizovan preko logiĉkih kola Realizacija MUX 4/1 preko logičkih kola prikazana je na Slici 5-7. Slika 5-6. Logiĉki simbol multipleksera 4/1 (MUX 4/1) Multiplekseri se mogu koristiti za implementaciju logičkih funkcija. Na primer, multiplekser tipa 4/1 se može koristiti za generisanje bilo koje moguće funkcije od tri promenljive, shodno sledećoj relaciji: 30
Slika 5-7. Realizacija MUX 4/1 sa dozvolom (En) preko logiĉkih kola Demultiplekser je kolo koje obavlja funkciju suprotnu multiplekseru, tj. vrši prenos podatka od jedinstvenog izvora D ka jednom od m = 2 n izlaza (odredišta), pri čemu koristi n selektorski ulaza. Slika 5-8. Kombinacija multipleksera i demultipleksera 31
Na Slici 5-8 ilustrovano je korišćenje multipleksera i demultipleksera. Naime, prenos podataka vrši se u jednom smeru (preko komunikacionog kanala), iz jednog ili više izvora podataka ili predajnika ka jednom ili više odredišta podataka ili prijemnika. 5-4. Leĉevi i flip-flopovi Bistabilno kolo (leč, flip-flop) je elektronsko kolo koje ima dva stabilna stanja i stoga je u stanju da posluži kao jedan bit memorije. Bistabilno kolo se kontroliše jednim ili dva kontrolna signala i/ili signalom dozvole. Izlaz često pored normalnog ima i komplementni izlaz. Bistabilna kola takoďe zahtevaju ulaze za napajanje i masu. Bistabilna kola (latch, flip-flop) imaju dva stabilna stanja. Dele se na asinhrona i sinhrona. Asinhrona bistabilna kola se sastoje od dva ukrštena invertujuća elementa - tranzistora, NI ili NILI kola. Sinhroni flip-flop je verzija asinhronog koji ima dodatne ulaze C ili CLK (takt na koji se dovode sinhronizacijski impulsi konstantne frekvencije tako da flip-flop menja stanje na promenu okidnog signala) i EN ili ENABLE - signal dozvole. Sinhrona bistabilna kola su specijalno projektovana za sinhrone sisteme i zato ignorišu stanja na svojim ulazima osim u trenutku promene okidnog signala. Ovo prouzrokuje da bistabilno kolo može da ili promeni ili da zadrži svoj izlazni signal koji zavisi od vrednosti ulaznih signala za vreme prelaza. Neka bistabilna kola menjaju vrednost izlaza duž celo pozitivnog ili negativnog dela okidnog signala, neki na rastućoj ivici okidnog signala, a drugi na opadajućoj ivici. Bistabilno kolo kod kojeg izlaz stalno prati promene na ulazima dok se eventualno ne dovede pobudni signal koji zamrzava stanje na izlazu se se naziva se leč (latch), dok se kola kod kojih se izlaz menja samo posle dovoďenja odgovarajuće ivice pobudnog signala nazivaju flip-flopovi. U literaturi i katalozima se često ne pravi razlika izmeďu lečeva i flip-flopova, pa se obe vrste kola nazivaju flip-flop. Prvi elektronski flip-flop su izmislili 1919. Vilijam Ekles i F. V. Džordan. U početku je nazivan Ekles-Džordanovo okidačko kolo i sastojalo se od dva aktivna elementa (elektronske cevi). Ime flip-flop je kasnije nadenuto po zvuku koji se dobijao na zvučnku proključenom na jedan od spregnutih pojačala tokom procesa okidanja u kolu. Flip-flop se definiše kao bistabilno kolo koje koristi specijalni upravljački signal C (može i nekoliko takvih signala) radi specificiranja trenutaka u kojima se memorija odaziva na promene ulaznih podataka i trenutaka u kojima memorija menja svoje izlazne podatke, tako da se postigne pouzdan netransparentan način rada. S obzirom da signal C, kada je u pitanju flipflop, ima sinhronizirajuću ulogu, on se naziva taktni signal (clock signal). Taktovani flip-flopovi se tipično izraďuju kao master-slave kola, u kom dva osnovna leča (uz neka dodatna logička kola) saraďuju da ga učine neosetljivim na šumove izmeďu prelaza pobudnog signala; ali ipak oni često imaju asinhrone Clear i Set ulaze koji mogu da promene trenutni izlaz nezavisno od takta. Flip-flopovi se mogu dalje podeliti u tipove koji mogu imati zajedničku primenljivost i u asinhronim i u taktovanim sekvencijalnim sistemima: SR ("Set-Reset"), D ("Data"), T ("Toggle") i JK tipovi su uobičajeni. Svi pomenuti mogu se izvesti od drugih tipova uz nekoliko logičkih kola. Ponašanje nekog tipa flip-flopa se može opisati karakterističnom jednačinom, koja daje sledeći izlaz Q n + 1 u zavisnosti od ulaznih signala i/ili trenutnog izlaza. 32
SR leĉ Leč je logičko kolo memorijskog tipa sa dva izlaza koji su komplementarni jedan u odnosu na drugi. Osnovni leč se može realizovati unakrsnim povezivanjem dva NOR kola kako je to prikazano na Slici 5-8. Ovo kolo se naziva SR leč i ima dva ulaza S i R (po kojima je i dobio ime). Ulaz S se naziva setujući ulaz, dok je ulaz R resetujući ulaz. Postavljanjem ulaza S u logičko stanje 1, a ulaza R u logičko stanje 0 izlaz Q se postavlja u stanje 1, a izlaz Q' u stanje 0. Ukoliko se na ulaz S dovede logička 0, a na ulaz R logička 1 na izlazu Q se dobije logička 0, a na izlazu Q logička 1. Slika 5-8. Realizacija SR leĉa NILI kolima Slika 5-9. Simbol SR leĉa realizovanog NILI kolima Ako se na ulaze S i R istovremeno dovede logička 0, na izlazu se ne dešava nikakva promena, dok se istovremenim dovoďenjem logičke 1 uzrokuje nepredviďeno stanje na izlazu, pa se ova kombinacija naziva zabranjeno stanje. Najčešći način zapisivanja rada flip-flopa je korišćenjem tablice stanja: ULAZI IZLAZ S R Q n+1 0 0 Q n 0 1 0 1 0 1 1 1 X Tabela 5-3. Tablica stanja SR leĉa sa NILI kolima 33
Iz ove tablice se direktno dobija jednačina:, i uz činjenicu da je za dozvoljena stanja na ulazu SR=0, dobija se prostija jednačina: SR leč može da se realizuje i sa NI kolima, što je prikazano na Slici 5-10. Odgovarajuća tablica stanja data je u Tabeli 5-4. Slika 5-10. Realizacija SR leĉa NILI kolima ULAZI S IZLAZ R Q n+1 0 0 X 0 1 1 1 0 0 1 1 Q n Tabela 5-4. Tablica stanja SR leĉa sa NI kolima D leĉ Jedan od načina da se eliminiše neželjeno nedefinisano stanje kod SR leča je da se obezbedi da ulazi S i R ne budu nikada istovremeno jednaki '1'. Ovo se izvodi kod D leča kako je to prikazano na Slici 5-11. D leč ima dva ulaza: D (Data - podaci) i C (Control - upravljački). Komplement ulaza D dovodi se preko NI kola na ulaz S, dok se ulaz D preko invertora i NI kola dovodi na ulaz R. Sve dok je upravljački ulaz C='0', oba ulaza SR leča su na visoko i kolo ne može da promeni svoje stanje nezavisno od vrednosti D. Ulaz D se uzorkuje (odmerava) kada je C='1'. Ako je D='1', Q se postavlja na '1', tj. za kolo kažemo da je u stanju set. Kada je D='0', izlaz Q='0' i kolo je u stanju reset. 34
Logički simbol D leča prikazan je na Slici 5-12, a tablica promene stanja leča data je u Tabeli 5-5. Slika 5-11. Realizacija SR leĉa NILI kolima Slika 5-12. Logiĉki simbol D leĉa ULAZI IZLAZ D C Q n+1 X 0 Q n 0 1 0 1 1 1 Tabela 5-5. Tablica stanja D leĉa Zbog svoje transparentnosti u radu (kada je C='1', izlaz Q prati stanje na ulazu D) lečevi nisu pogodni za korišćenje kod sekvencijalnih kola koja imaju povratnu strukturu, tj. kada se izlaz leča preko kombinacione logike dovodi na njegov ulaz. Naime, kada je C='1', izlazni signal (Q ili Q) se vraća preko povratne grane na ulaz D. Neželjene kombinacije propagacionog kašnjenja (kašnjenja signala kroz kola) mogu da uzrokuju višestruke promene, što rezultira novom neodreďenom stanju leča. Ovaj fenomen se naziva problem trke (race problem) i direktna je posledica transparentnosti leča koja omogućava da kada je C='1' (rad leča dozvoljen) kroz leč proďe neograničen broj promena podataka. Da bi ograničili me- 35
morijski element na samo jednu promenu stanja po koraku kada je leču dozvoljen rad, neophodno je koristiti netransparentne memorijske elemente kao što su flip-flopovi. Metodi taktovanja Slika 5-13. Taktovanje flip-flopa Postoji već broj tipova flip-flopova koji se razlikuju po načinu taktovanja. Uloga signala C kod leča prikazana je na Slici 5-13. U toku perioda t1:t2, kada je C='1', bilo kakva promena signala podataka prenosi se kroz leč. Nakon odreďenog propagacionog kašnjenja ove promene utiču na izlaz leča Q (a takoďe i na Q ) u toku perioda t3:t4. Ako se ignoriše jedan kratak period neodreďenosti kada signali podataka i takta menjaju vrednosti, za leč kažemo da 36
se odaziva na sve ulazne promene kada je C na nivou '1'. Kada je C na logičkoj nuli promene podataka na ulazu nemaju efekat na promene podataka na izlazu. Iz ovih razloga za lečeve kažemo da su osetljivi na nivo (level sensitive) ili da se okidaju na nivo (level triggered). Da bi ostvarili ponašanje flip-flopa moramo da obezbedimo da ne doďe do preklapanja izmeďu vremenskog perioda t1:t2 (kada se prihvataju promene ulaznih signala) i perioda t3:t4 (kada se menjaju izlazni podaci). Jedan od načina da flip-flop ispuni ove zahteve sastoji se u sledećem. Ulazne promene treba prihvatati kada je C='1', a menjati izlaze kada je C='0'. Ovaj impulsni metod rada je bio korišćen kod nekih ranijih verzija bistabilnih kola. Kod najvećeg broja današnjih rešenja koristi se tehnika okidanja na ivicu (edge triggering). Na Slici 5-13b je definisano ponašanje flip-flopa koji se okida pozitivnom ivicom, a na Slici 5-13c ponašanje flip-flopa koji se okida na negativnu ivicu. Flip-flopovi imaju isti simbol kao i lečevi sa izuzetkom jedne male, ali ključne, modifiikacije koja se odnosi na specifikaciju načina taktovanja. Simbol '>' koji se nalazi na kraju linije za taktovanje ukazuje da se okidanje flip-flopa vrši pri prelazu signala C sa '0' na '1'. Simbol '>' se naziva dinamički ulazni simbol. Okidanje negativnom ivicom se označava kombinovanjem dinamičkog ulaznog simbola '>' i simbola inverzije 'o'. Kombinovanje leĉa i flip-flopa Postoje dva načina na koje se kombinuju lečevi kod flip-flopova. Kod prvog načina lečevi se kombinuju tako da se: Važećim ulaznim podacima koji su prisutni na ulazima flip-flopa smatraju samo oni koji su prisutni u trenutku kada je važeći i upravljački signal; Stanje flip-flopa menja samo kada stanje upravljačkog impulsa nije aktivno. Ovaj tip flip-flopa se naziva master-slave. Kod drugog načina važi sledeći princip. Flip-flop se okida samo u toku promene taktnog impulsa sa '0' na '1' (ili sa '1' na '0'), a u ostatku perioda promene nisu dozvoljene uključujući i period taktnog signala. Ovaj flip-flop se naziva ivično-okidani flip-flop. Master-slave flip-flop - okidanje na nivo Strukturu master-slave flip-flopa čine dva leča i jedan invertor. Struktura jednog masterslave SR flip-flop prikazana je na Slici 5-14. Levi flip-flop naziva se master, a desni slave. Kada je C='0', izlaz invertora je '1' i rad slave leča je dozvoljen, tako da njegov izlaz Q prati vrednost na izlazu mastera Y. U tom trenutku rad master leča je zabranjen, jer je C='0'. Kada je C=1, signali prisutni na ulazima Sm i Rm definišu na koje će se vrednosti postaviti Y. Rad slave-a je zabranjen sve dok je C='1', tj C S ='0'. Bilo kakve promene na ulazima S i R menjaju master izlaz Y, ali nemaju efekat na slave izlaz Q. Kada ponovo bude C= '0' rad mastera se zabranjuje, tako da se promene na ulazima Sm i Rm više ne prihvataju, ali je istovremeno rad slave-a dozvoljen tako da se tekuća vrednost Y prenosi na izlaz Q. Vremenski dijagrami karakteristični za rad master-slave SR flip-flopa su prikazani na Slici 5-15. 37
Slika 5-14. SR master-slave flip-flop Slika 5-15. Vremenski dijagrami SR master-slave flip-flopa Analizom tablice stanja SR leča (Tabela 5-3) vidimo da je izlaz leča nedefinisan kada su pri C='1' oba ulaza S=R='1'. Da bi se eliminisao neželjeni uslov koji dovodi do toga da izlazi budu nedefinisani, koristi se JK flip-flop. Kod ovog flip-flopa uslov kada su oba ulaza jednaka '1' ukazuje da izlaz primi komplementarnu vrednost. Struktura JK flip-flopova i odgovarajuće tablice stanja na osnovu koje se opisuje njegovo ponašanje prikazani su na Slici 5-16 i Tabeli 5-6, respektivno. Slika 5-16. Master-slave JK flip-flop (okidanje na nivo) 38
ULAZI IZLAZ IZLAZ J K Q n Q n+1 0 0 X X 0 1 X 1 1 0 X 0 1 1 Q n Q n Tabela 5-6. Tablica stanja JK flip-flopa JK flip-flop nadograďuje rad SR flip-flopa tretiranjem stanja S = R = '1' kao naredbu za komplementiranje izlaza. Kombinacija J = '1', K = '0' je komanda da se setuje flip-flop; kombinacija J = '0', K = '1' je komanda da se resetuje flip-flop; a kombinacija J = K = '1' menja izlaz u logički komplement svoje trenutne vrednosti. Kada je J = K = '0', izlazi flip-flopa će zadržati svoje prethodno stanje. Karaktetistična jednačina JK flip-flopa je: Iviĉno okidani D flip-flop Flip-flop koji se okida na ivicu ignoriše upravljački signal C, dok je na konstantnom nivou, a okida se samo u toku prelaza taktnog signala sa jednog nivoa na drugi. Neki od ivično okidanih flip-flopova okidaju se na pozitivnu ivicu (prelaz sa '0' na '1'), dok se drugi okidaju na negativnu ivicu (prelaz sa '1' na '0'). Jedan tipičan predstavnik flip-flopova iz ove grupe je ivično okidani D flip-flop (Slika 5-17). Slika 5-17. D flip-flop koji se okida na pozitivnu ivicu 39
Slika 5-18. D flip-flop koji se okida iviĉno 40
Logički dijagram D tipa flip-flopa koji se okida na prednju ivicu prikazan je na Slici 5-18. Flip-flop čine dve celine: master deo realizovan D lečom i slave deo koji može biti SR ili D leč. Na ulazu taktnog signala se dodaje invertor. S obzirom da je master leč D leč, flip-flop ima osobinu da se okida na ivicu, a ne na nivo kao što je to slučaj sa master-slave. Kada je C='0', rad master leča je dozvoljen i transparentan, tj. njegov izlaz sledi stanje na D ulazu. Rad slave leča je zabranjen i on održava nepromenjeno stanje flip-flopa. Kada se javi pozitivna ivica taktni ulaz se promeni na '1'. Rad master leča se zabranjuje, njegov izlaz zamrzava, a slave leču je dozvoljen rad tako da on kopira na svom izlazu stanje koje je prisutno na izlazu master leča. Stanje master leča koje treba kopirati je stanje koje je prisutno u trenutku pojave pozitivne ivice taktnog impulsa. Zbog ovoga se ponašanje flip-flopa opisuje kao okidanje na ivicu. Kada je C='1', rad master leča je zabranjen i on ne može da se promeni, tako da stanja oba leča (i mastera i slave-a) ostaju nepromenjena. Konačno, kada se C promeni sa '1' na '0', rad mastera je dozvoljen i njegov izlaz počinje da sledi vrednost na ulazu D. U toku prelaza sa '1' na '0' rad slave-a se zabranjuje tako da bilo kakva promena na masteru nema efekta na izlaz slave-a. Zbog toga, vrednost koja je memorisana u slave-u ostaje nepromenjena u toku ove promene. Iviĉno okidani JK flip-flop U ovom poglavlju smo već razmatrali implementaciju master-slave JK flip-flopa kod koga je master-slave SR flip-flopu dodata logika i, kao rezultat toga, dobijen je JK flip-flop koji se okida na nivo. Razmotrimo sada implementaciju JK flip-flopa koji se okida pozitivnom ivicom impulsa, a dobija se dodavanjem logike D flip-flopu koji se okida pozitivnom ivicom taktnog impulsa. Rezultujuće kolo je prikazano na Slici 5-19. Logički simbol, važeći talasni dijagrami, Karnoova mapa i tablica stanja ivično okidanog flip-flopa dati su na Slici 5-20. Slika 5-19. JK flip-flop koji se okida pozitivnom ivicom 41
Slika 5-20. JK flip-flop koji se okida iviĉno T flip-flop T flip-flop je poznat pod nazivom trigerski (trigger ili toggle), a karakteriše se jedinstvenom ulaznom linijom. Simbol T flip-flopa je prikazan na Slici 5-21a. Ako je T='1', kada se taktni impuls menja sa '0' na '1', izlaz flip-flopa prelazi u komplementarno stanje u odnosu na tekuće, a kada je T='0' flip-flop ne menja svoje stanje. Tablica stanja T flip-flopa je prikazana na Slici 5-21b, a Karnoova mapa na slici 5-21c. 42
Slika 5-21. T flip-flop Kako je prikazano na Slici 5-22, T flip-flop se može konstruisati od JK flip-flopa (Slika 5-22a) ili od D flip-flopa (slika 5-22b). Treba naglasiti da T flip-flopovi nisu dostupni na tržištu kao zasebne komponente nego se oni konstruišu od JK i D flip-flopova. Slika 5-22. IzvoĊenje T flip-flopa preko JK i D flip-flopa 43
6 PLC KONTROLERI Digitalni elektronski sklop sa programibilnom memorijom za smeštanje fimware-a kojim se realizuju posebne funkcije (brojanje, aritmetičke operacije, logičko sekvenciranje itd.) naziva se PLC kontroler. Inače, ovim elektronskim ureďajem upravlja se različitim mašinama i procesima putem digitalnih ili analognih ulaznio/izlaznih modula. Nastanak PLC-ova se vezuje za kasne 60-te i rane 70-te godine prošlog veka, a nastali su na bazi konvencionalnih računar tog vremena. Njihova prvobitna primena bila je u automobilskoj industriji, a sa ciljem da se skrati vreme zastoja u proizvodnji usled promene proizvodnog procesa. Priprema pogona za proizvodnju novog modela automobila trajala je mesecima, a podrazumevala je prepovezivanje panela i ormara prepunih žica, relea, tajmera, sklopki i drugih, uglavnom elektromehaničkih komponenti, pomoću kojih su se, u to vreme, realizovale upravljačke jedinice. UvoĎenjem PLC-a, omogućilo je da se reprogramiranje obavi preko tastature i da se, uz minimalna dodatna prepovezivanja, vreme zastoja proizvodnje skrati do tek nekoliko dana. Glavni problem sa računarima/plc-ovima iz 70-tih godina odnosio se na njihovo reprogramiranje. Programi su bili komplikovani, a njih su moguli da sastavljaju samo visokostručni i iskusni programeri. Kasnih 70-tih godina učinjen je izvestan napredak u pogledu pojednostavljenja procedure programiranja. Godine 1972. pojavlju se mikroprocesori, koji, zahvaljujući performansama koje su nudili i relativno niskoj ceni, brzo nalaze široku primenu u mnogim oblastima elektronike, pa i industrijske automatizacije. Od tog vremena, PLC-ovi se neprestano usavršavaju, kako u pogledu preformasi, moći obrade, mogućnosti sprezanja sa najrazličitijim ureďajima, tako u pogledu načina i procedura programiranja, kao i jezika koji se koriste za njihovo programiranje. PLC su postali razumljiviji široj populaciji industrijskih inženjera. Osamdesetih godina dolazi do eksponecijalnog rasta tržišta PLC-ova, a primena PLC-a se širi van industrijskih pogona, na sisteme kao što su elektroenrgetska postrojenja, sistemi automatizacije zgrada, sistemi obezbeďenja i nadzora i td. Danas, PLC-ovi postaju prisutni i u oblastima kao što je medicinska oprema i ureďaji, kućni aparati i slčno. 44
Prvi PLC kontroleri su bili jednostavni ureďaji za on/off upravljanje i koristili su se za zamenu zastarele relejne tehnike. MeĎutim, takvi PLC kontroleri nisu mogli obezbediti složenije upravljanje, kao što je upravljanje temperaturom, pritiskom, pozicijom. U meďuvremenu, proizvoďači PLC kontrolera razvili su i ugradili u PLC kontrolere brojna poboljšanja i funkcionalna unapreďenja. Savremeni PLC kontroleri imaju mogućnost obavljanje izuzetno složenih zadataka kako što je upravljanje preciznim pozicioniranjem i upravljanje složenim tehnološkim procesima. TakoĎe, brzina rada PLC kontrolera je značajno povećana, kao i lakoća programiranja. Razvijeni su brojni moduli specijalne namene za primene kao što je radio komunikacija, vizija ili čak prepoznavanje govornih komandi. U prošlosti, svaka električno upravljna mašina za proizvodnju zahtevala je svoju sopstvenu upravljačku jedinicu; u pogonu sa 15 mašina, postojalo je 15 različitih, namenski projektovanih, upravljačkih jedinica. Danas je moguće isti model PLC-a koristiti za upravljanje bilo kojom od 15 mašina. Uz to, verovatno neće biti potrebe za 15 PLC-ova, jer jedan PLC lako može da opsluži više različitih mašina, tako što će, konkurentno, za svaku priključenu mašinu izvršavati poseban, namenski program. 6-1. Šta predstavlja PLC? PLC - namenski elektronski ureċaj, zasnovan na mikroprocesoru, koji je u mogućnosti da obavlja brojne tipove upravljačkih funkcija različitog nivoa složenosti. PLC - industrijski raĉunar čiji su hardver i softver posebno prilagoďeni radu u industrijskim uslovima, a koji se može lako programirati i ugraďivati u nove i postojeće industrijske sisteme. Proces PLC Slika 6-1. PLC kontrola procesa PLC - (Programmable) - označava mogućnost programiranja. Program rada se unapred priprema i puni u permanentu memoriju PLC kontrolera. PLC program se razvija u jeziku lestvičastih (ladder) dijagrama, koji je nastao po ugledu na tzv. relejne šeme. PLC - (Logic) - jedna od glavnih osobina PLC kontrolera je mogućnost obavljanja logičkih (bulovih) funkcija. PLC generiše diskretne (digitalne) izlazne signale u funkciji (logičkoj) 45
diskretnih ulaznih signala - karakteristično za prvobitne tipove PLC kontrolera. Savremeni PLC-ovi, pored logičkih mogu da obavljaju: aritmetičke operacije, odmeravaju vremenske intervale, prebrojavaju dogaďaje, a prihvataju i generišu, pored diskretnih, i analogne signale. PLC (Controller) - Glavna primena u industriji (proizvodnoj) gde se koristi za automatsko upravljanje procesima - prati ključne parametre procesa (posredstvom priključenih senzora i davača, i shodno memorisanom programu, generiše pobudu kojom deluje na proces (posredstvom aktuatora) Slika 6-1. 6-2. PLC v.s. mikroraĉunar U izvesnom smislu, područje primene PLC kontrolera isto je kao i za specijalizovane mikroračunarske kontrolere ili signal procesore. Ključna razlika leži u činjenici da korišćenje PLC-a ne zahteva od korisnika gotovo nikakvo predznanje o arhitekturi mikroračunarskih sistema i programiranju. Drugim rečima, korisnik PLC kontrolera je u najvećoj mogućoj meri osloboďen rešavanja različitih problema vezanih za čisto računarski aspekt, i može da se u punoj meri skoncentriše na projektovanje same aplikacije. 6-3. Prednosti PLC kontrolera Laka promena programa i korekcija grešaka. Kod tradicionalih, relejnih panela, svaka promena programa zahtevala je značajno vreme za prepovezivanje panela i ureďaja. Sa druge strane, kod PLC-a promena programa, tj. ladder dijagrama (Slika 6-2), je laka i brza. Novi program se preko tastature ili na neki drugi način učitava u PLC, a prepovezivanje obično nije potrebno, tako da celokupna ak-tivnost ne traje duže od nekoliko minuta. TakoĎe, uočene nepravilnosti u radu sistema, koje su posledica greške u programu se mogu lako i brzo ispraviti. +V Izvor napajanja -V Prekidač 1 Sijalica 1 Prekidač 2 Sijalica 2 Slika 6-2. Lestviĉasti dijagram PLC kontrolera 46
+V Izvor napajanja -V Prekidač 1 Ulazni modul Logička jedinica Izlazni modul Sijalica 1 Prekidač 2 Sijalica 2 Slika 6-3. Blok-šema PLC kontrolera sa 2 prekidaĉa (ulazi) i 2 sijalice (izlazi) PM Programator/ Monitor CPU Mikroprocesor Ulazni modul Memorija Izlazni modul Izvor napajanja Rek i šasija Slika 6-4. Unutrašnja struktura PLC kontrolera Funkcija relejne upravljačke jedinice se realizuje povezivanjem relea (kontakta) koji imaju ulogu elektromehaničkih logičkih kola ili flip-flopova. Broj relea u jednom relejnom panelu je ograničen (npr. fizičkim dimenzijama panela), što ograničava i složenost funkcije koja se može realizovati. Može se desiti da u slučaju promene programa rada upavljačke jedinice, broj 47
rasploživih relea nije dovoljan da bi se realizovala nova funkcija. U takvim slučajevima, neophodno je ugraditi dodatne relee ili relejne blokove, što može biti dugotrajna operacija skopčana s neizbežnim mehaničkim intervencijama. Sa druge strane, PLC može realizovati funkcije čija je složenost ograničena jedino raspoloživom memorijom može se zamisliti da svaki bit interne memorije PLC-a predstavlja jedan kontakt (rele); za realizaciju jednog tajmera ili brojača koriste se tri 16-bitne reči memorije itd. Tipična memorija PLC je veličine više KB. Mogućnost probnog rada. Rad PLC-a se može ispitati u laboratoriji, pre ugradnje u proizvodni pogon. Program se piše, testira, analizira i, ako je nophodno, modifikuje sve do trenutka kada se proceni da su sve zahtevane funkcije korektno realizovane. Tek tada se program prenosi u PLC koji se instalira (ili je već instaliran) u proizvodni pogon. Na ovaj način se čini velika ušteda skupog fabričkog vremena (nema zastoja u proizvodnji). Nasuprot tome, testiranje konvencionalnih relejnih sistema se može obaviti samo u fabričkoj hali, što može biti veoma vremenski neracionalno. Mogućnost vizuelnog praćenja rada. Rad PLC-a se može direktno pratiti na ekranu monitora na pogodan način se u grafičkom obliku prikazuju stanja ulaza i izlaza PLC-a uz osvetljeno prikazivanje logičkih putanja koje su trenutno aktivne i ispisivanje obaveštenja o eventualnom neispravnom radu sistema ili o nastanku nekih izuzetnih situacija. Na taj način, svaka kritična situacija se može uočiti istog trenutka kada se i desila, što olakšava pronalažene nastalih kvarova. Naime, kod naprednih PLC sistema, postoji mogućnost programiranja poruka za svako moguće neispravno ponašanje, koje će se prikazati onog trenutka kada se takva situacija detektuje od strane PLC-a, (kao npr. MOTOR #7 je preopterećen ). Slika 6-5. Vizuelno praćenje PLC kontrolera Za programiranje PLC kontrolera koristi se jezik lestvičastih logičkih dijagrama (ili leder dijagrama - ladder diagram), koji je već dugi niz godina u upotrebi u industriji pri projektovanju logičkih i sekvencijalnih relejnih ureďaja. Ovaj jezik koristi grafičku notaciju koja je po vizuelnom izgledu i logici rada slična dijagramima električnih šema i zbog toga je lako razumljiv in- 48
dustrijskim inženjerima. Drugim rečima, industrijski inženjeri ne moraju biti eksperti za programiranje da bi u svojim sistemima koristili PLC-ove. Poluprovodničke komponente, od kojih je PLC sačinjen, su, generalno, pouzdanije od mehaničkih sistema ili relea i tajmera. Uz to, za realizaciju PLC-ovi se koriste komponente sa veoma visokim faktorom pouzdanosti. Iz tog razloga, troškovi održavanja upravljačkih sistema zasnovanih na PLC-u su niži, a vreme zastoja kraće. Jednostavnost naruĉivanja komponenti upravljaĉkog sistema. PLC je jedan uraďaj. Kada naručeni PLC stigne u industrijski pogon, svi brojači, relei, i druge virtuelne komponente sadržane u PLC-u su takoďe stigle. Situacija je potpuno drugačija kada se projektuje relejni panel. Na primer, potrebno je 20 različitih tipova relea i tajmera koji se nabavljaju od 12 različitih dobavljača, sa različitim rokovima isporuke i potencijalnim problemima sa dostupnošću traženih komponenti. Ako projektant propusti da naruči samo jednu komponentu, celokupan projekat se odlaže za vreme isporuke te komponente. Kod PLC-ova uvek postoji jedan rele više - pod uslovom da je naručen PLC sa izvesnom rezervom u moći izračunavanja. Dokumentacija. Leder dijagrami, kako grafički prikazi, su u toj meri samo-deskriptivni da obično nije neophodna neka dodatna dokumentacija koja bi upotpunjavala opis rada PLC-a i načina na koji su realizovane njegove funkcije. Leder dijagram se uvek može odštampati, a pošto se isti dijagram koristi i kao program, ne postoji opasnost da dokumentacija bude neažurna, što je često slučaj sa dijagramima i šemama relejnih panela (kada inženjer nakon učinjene intervencije ne unese izmenu u relejnu šemu) Bezbednost. Program PLC-a se ne može promeniti pre nego što je PLC otključan, nakon unosa ispravne lozinke. Mogućnost reprogramiranja. Osobina brzog reprogramiranja PLC-a otvara mogućnost za postizanje neke vrste adaptivnog proizvodnog procesa, gde se program rada menja shodno karakteristikama svakog pojedinačnog prizvoda ili čestim varijacijama u procesu proizvodnje. Nova tehnologija. Pokazalo se da je teško promeniti način razmišljanja industrijskih inženjera sa relejne logike na PLC koncept. MeĎutim, zahvaljujući sve široj primeni, ne samo u domovima i kancelarijama već sve više i u fabričkim halama, računari postaju u sve većoj meri prihvataju i kao sredstvo za postizanje veće prodiktivnosti proizvodnje. Aplikacije sa fiksim programom. Pojedine aplikacije zasnovane su na samo jednoj funkciji koja se veoma retko ili nikada ne menja. U ovakvim slučajevima, zamena postojeće opreme PLC-om ne donosi veliki dobitak, jer se njihova glavna osobenost mogućnost reprogramiranja praktično ne koristi. PLC je najbolje rešenje kada su neophodne periodične promene u načinu rada. 6-4. Nedostaci PLC kontrolera Uslovi rada. Ekstremnim uslovi rada, kao što su: visoka temperatura, vlažnost, vibracije, električne smetnje, a koji su karakteristični za pojedine proizvodne procese, mogu uticati na rad PLC-a i ograničiti njegovu primenu. 49
Bezbednost u radu. Kod relejnih sistema uvek postoji tzv. Stop prekidač, kojim se u bilo kom momentu može trenutno prekinuti rad sistema (isključenjem napajanja). Pri tome, relejni sistem se automatski ne resetuje kada se napajanje uključi, već zadržava stanje u kome je bio kada je napajanje isključeno. Ovakvo ponašanje se svakako može programski ostvariti i kod PLC-a, tako što će se Stop prekidač povezati na jedan od ulaza PLC-a. MeĎutim, ovakvo rešenje nije bezbedno (ako PLC otkaže, prekidač Stop gubi funkciju!) Ovaj nedostatak se može prevazići ugradnjom bezbedonosnih relea na izlazima PLC-a. 6-5. Neki primeri primene PLC kontrolera Na Slici 6-6 ilustrovana je primena PLC kontrolera kod parking servisa (kontrola ulazne i izlazne rampe), dok je na Slici 6-7 ilustrovana kontrola hemijskog procesa. Slika 6-6. Parking servis Slika 6-7. Kontrola hemijskog procesa 50
7 SIMULACIJA PLC KONTROLERA Na Slici 7-1 prikazan je jedan od načina da se simulira PLC kontroler preko mikrokontrolera PIC16F877A. Inače, mikrokontroler ima takt od 4MHz i napaja se preko standardnog linearnog regulatora napona LM7805 (V out = 5V±0,1V, I max = 500mA). U cilju kasnijeg proširenja ureďaja, postoji mogućnost povezivanja mikrokontrolera sa računarom (preko integrisanog kola MAX232N). Komunikacija je bez handshaking-a. Kao indikacija koriste se crvene LED sa malom potrošnjom (low-power). Db CN0 1 2 Power Din 1N4002 C1 1 220uF 1N4002 U1 7 8M05 V in V out G nd 2 3 C2 100uF C3 2.2nF C4 100nF R1 SW1 V DD MCLR SW Gnd Gnd Gnd Gnd Gnd Gnd Gnd V DD V DD V DD V DD V DD V DD V DD Y1 V DD V DD V DD V DD V DD V DD V DD OSC1 OSC2 6 G nd 5 G nd 4 G nd 3 G nd 2 G nd 1 G nd CN1 C5 22pF 4MHz C6 22pF 7 G nd 6 G nd 5 G nd 4 G nd 3 G nd 2 G nd 1 G nd CN2 Gnd Gnd Gnd Gnd Gnd Gnd Gnd Gnd Gnd Gnd Gnd Gnd Gnd Gnd Gnd U2 CN7 1 40 CN5 MCLR MCLR P B7 2 39 P A0 P B6 3 38 P A1 P B5 4 37 P A2 P B4 5 36 P A3 P B3 6 35 P A4 P B2 7 34 P A5 P B1 8 33 RD P B0 9 32 WR V DD V DD D1 LED 10 31 CS V SS Gnd 11 30 V DD V DD P D7 12 29 Gnd V SS P D6 D2 LED 13 28 OSC 1 OSC1 P D5 14 27 RN1 CN6 OSC 2 OSC2 P D4 15 26 P C0 P C7 D3 1 TX LED 16 25 2 P C1 P C6 RX 17 24 3 P C2 P C5 18 23 P C3 P C4 D4 4 LED 19 22 5 P D0 P D3 20 21 6 P D1 P D2 D5 7 LED 8 Gnd Gnd Gnd Gnd Gnd Gnd PIC 16F877A 9 Gnd V DD G nd V DD G nd 1 V DD G nd 2 V DD G nd 3 V DD G nd 4 V DD G nd 5 6 CN3 C11 D6 D7 D8 LED LED LED 100nF C10 100nF C9 1 2 3 4 5 6 7 8 M A X232 U3 C1+ V+ C2+ C1- C2- V- T2 out R2i n 100nF V cc Gnd T1 out R1i n R1out T1 in T2 in R2out 16 15 Gnd 14 RX1 13 TX 1 12 TX 11 RX 10 9 V DD RX1 TX 1 1 6 2 7 3 8 4 9 5 CN4 C8 100nF C7 100nF DB9/F Gnd Gnd Gnd Slika 7-1. Elektriĉna šema PLC kontrolera simuliranog preko PIC16F877A Uloga dioda Din i Db je zaštitna. Naime, Din štiti celokupno kolo od pogrešnog priključivanja napona napajanja, a Db je zaštitna povratna dioda koja štiti regulator napona LM7805 od kapacitivnog opterećenja (prilikom ukidanja spoljašnjeg napajanja C2 se prazni preko ulaznog dela kola LM7805). 51
Slika 7-1.1. Blok šema PLC kontrolera simuliranog preko PIC16F877A 52
Na Slici 7-2 prikazan je raspored komponenata i veza štampane ploče za kolo sa Slike 7-1. Plavom bojom su ilustrovane veze sa donje (BOTTOM) strane, dok su crvenom bojom prikazani kratkospajači sa gornje (TOP) strane. Slika 7-2. Izgled štampane ploĉe za kolo sa Slike 7-1 Na svaki od sledećih pinova: PA5-PA0, PB7-PB1, PC5-PC0, možemo dovoditi logičku '0' ili logičku '1' (preko prekidača konektora SW_CN5-SW_CN7), povezati ga na neki drugi pin mikrokontrolera (CN5-CN7) ili ostaviti ga slobodnim. Ideja je da se preko mikrokontrolera softverski i realizuju sledeće logičke celine: logička kola (I, ILI, NI, NILI, EXILI, EXNILI), multiplekseri (2/1, 4/1), demultiplekseri (1/2, 1/4), flipflopovi (JK, D, T). Pomenute celine je moguće kasnije iskombinovati, tako da se dobiju različita digitalna elektronska kola. 53
Slika 7-3. Blok šema za kolo sa Slike 7-1 sa rasporedom pinova Port A je organizovan kao upravljački, flip-flopovi se taktuju interno, a organizacija pinova mikrokontrolera je sledeća: PC7 i PC6 su pinovi za eventualnu komunikaciju sa PC računarom, PC5-PC2 predstavljaju ulaze 2 dvoulazna logička kola, PB7-PB5 su ulazi flip-flopova (D i JK ili T i JK), PB4-PB1 su ulazi multipleksera, PB0 je izlaz multipleksera, PD7 je ulaz demultipleksera, PD6-PD5, PD2-PD1 (ili PC1-PC0) su izlazi demultipleksera, PC1-PC0 (ili PD1-PD2) su izlazi logičkih kola, respektivno, PA5-PA2 su kontrolišući pinovi i definišu moguće kombinacije logičkih i sekvencijalnih kola, a mogu se koristiti i za neku drugu svrhu (ukoliko se za tu svrhu isprogramiraju u mikroc-u), PA1-PA0 su selektorski ulazi (S1 i S0) za multiplekser i demultiplekser. 54
Slika 7-4. Raspored pinova na štampanoj ploĉi Slika 7-5. Raspored pinova na celoj ploĉi 55
Na Slici 7-5 prikazana je ploča simuliranog PIC-PLC kontrolera. Preko spoljašnjih DIP SW prekidača (SW-CN5, SW-CN6 i SW-CN7) na odgovarajuće pinove Portova A, B i C dovode se logička '0' ili logička '1'. Kada je odgovarajući pin na 8-pinskom DIP SW prekidaču postavljen u stanje On, na tom pinu je stanje logičke '0' a u slučaju da je postavljen u stanje Off, na tom pinu je stanje logičke '1'. Napomene: Ukoliko je pin nekog porta definisan kao izlazni, nikako ne treba dovoditi na njega logičku '0' ili logičku '1'. Pinovi Porta A su direktno su stalno povezani na konektor sa prekidačima SW-CN5, s obzirom da se radi o kontrolišućim pinovima. Ukoliko pin nekog porta nije povezan pre priključivanja napajnja, njegovo stanje biće identično stanju koje je definisano kao početno u kodu u mikroc-u Pre priključivanja napajanja, na potenciometru AC/DC adaptera treba izabrati 7.5V nestabilisano. 7-1. Varijante realizacija PLC kontrolera Sada ćemo predstaviti šest realizacija PLC kontrolera, zavisno od stanja na kontrolnim pinovima PA5-PA3. Naime, ostavljena je mogućnost da preostale dve kombinacije studenti samostalno realizuju dopisivanjem kôda u mikroc-u. Kombinacija '000' PB7 je ulaz D flip-flopa, a PB6 (J) i PB5 (K) su ulazi JK flip-flopa, PC5-PC4 (1) i PC3-PC2 (2) predstavljaju ulaze NI logičkih kola, PD4 predstavlja izlaz D flip-flopa, a PD3 predstavlja izlaz JK flip-flopa, PB4-PB1 su ulazi multipleksera 4/1, PB0 je izlaz multipleksera 4/1, PD7 je ulaz demultipleksera 1/4, PD6-PD5, PD2-PD1 su izlazi demultipleksera 1/4, PC1 je izlaz NI logičkog kola (1), a PC0 je izlaz NI logičkog kola (2), PD0 pin registruje trenutak internog taktovanja flip-flopova. Taktovanje je reda 400 milisekundi kako bi posmatrač mogao da ih uoči. Ilustracija realizacije je data na Slici 7-6. 56
Slika 7-6. Funkcije PLC-a za kombinaciju '000' Kombinacija '001' PB7 je ulaz T flip-flopa, a PB6 (J) i PB5 (K) su ulazi JK flip-flopa, PC5-PC4 (1) i PC3-PC2 (2) predstavljaju ulaze NILI logičkih kola, PC1 predstavlja izlaz D flip-flopa, a PC0 predstavlja izlaz JK flip-flopa, PB4-PB3 su ulazi multipleksera 2/1, PB0 je izlaz multipleksera 2/1, PD7 je ulaz demultipleksera 1/2, PD6-PD5 su izlazi demultipleksera 1/2, PD1 je izlaz NILI logičkog kola (1), a PD2 je izlaz NILI logičkog kola (2), PD0 pin registruje trenutak internog taktovanja flip-flopova. Taktovanje je reda 400 milisekundi kako bi posmatrač mogao da ih uoči. Ilustracija realizacije je data na Slici 7-7. 57
Slika 7-7. Funkcije PLC-a za kombinaciju '001' Kombinacija '010' PB7 je ulaz T flip-flopa, a PB6 (J) i PB5 (K) su ulazi JK flip-flopa, PC5-PC4 (1) su ulazi EXILI, a PC3-PC2 (2) predstavljaju ulaze EXNILI logičkog kola, PC1 predstavlja izlaz T flip-flopa, a PC0 predstavlja izlaz JK flip-flopa, PB4-PB3 su ulazi multipleksera 2/1, PB0 je izlaz multipleksera 2/1, PD7 je ulaz demultipleksera 1/2, PD6-PD5 su izlazi demultipleksera 1/2, PD1 je izlaz EXILI logičkog kola (1), a PD2 je izlaz EXNILI logičkog kola (2), PD0 pin registruje trenutak internog taktovanja flip-flopova. Taktovanje je reda 400 milisekundi kako bi posmatrač mogao da ih uoči. Ilustracija realizacije je data na Slici 7-8. 58
Slika 7-8. Funkcije PLC-a za kombinaciju '010' Kombinacija '011' PB7 je ulaz T flip-flopa, a PB6 (J) i PB5 (K) su ulazi JK flip-flopa, PC5-PC4 (1) su ulazi I, a PC3-PC2 (2) predstavljaju ulaze NI logičkog kola, PC1 predstavlja izlaz T flip-flopa, a PC0 predstavlja izlaz JK flip-flopa, PB4-PB3 su ulazi multipleksera 2/1, PB0 je izlaz multipleksera 2/1, PD7 je ulaz demultipleksera 1/2, PD6-PD5 su izlazi demultipleksera 1/2, PD1 je izlaz I logičkog kola (1), a PD2 je izlaz NI logičkog kola (2), PD0 pin registruje trenutak internog taktovanja flip-flopova. Taktovanje je reda 400 milisekundi kako bi posmatrač mogao da ih uoči. Ilustracija realizacije je data na Slici 7-9. 59
Slika 7-9. Funkcije PLC-a za kombinaciju '011' 60
8 LISTING PROGRAMSKOG KÔDA PLC-a int k = 0; // Definisanje varijabli char AX, BX, CX, DX, EX, FX, JK, TX, Q1, Q2, Q3 = 0; char clk, clkk = 1; void main() { TRISA = 0b111111; PORTA = 0b000000; TRISB = 0b11111110; PORTB = 0b00000000; TRISC = 0b10111100; PORTC = 0b00000000; TRISD = 0b10000000; PORTD = 0b00000000; CMCON = 7; ADCON1 = 0x06; // Definisanje i inicijalizacija // pinova PORTOVA A, B, C i D // Definisanje pinova A porta kao // digitalnih do { // Formiranje Beskonacne Petlje if (k == 0) { Delay_ms(2000); // Prilikom starta, tj. prilikom prvog // obilaska petlje - kasenjenje je dve // sekunde } k++; delay_ms(400); clkk = clk; // Takt za flip-flopove je 0,4 sekunde // Opis funkcije I kola AX = (PORTC.F5 && PORTC.F4); // Opis funkcije ILI kola BX = (PORTC.F5 PORTC.F4); // Opis funkcije I kola CX = (PORTC.F3 && PORTC.F2); // Opis funkcije ILI kola DX = (PORTC.F3 PORTC.F2); // Opis funkcije EXILI kola EX = ((PORTC.F5 &&!(PORTC.F4)) (!(PORTC.F5) && PORTC.F4)); // Opis funkcije EXNILI kola 61
FX = ((PORTC.F5 && PORTC.F4) (!(PORTC.F5) &&!(PORTC.F4))); if (clk==1) { // Ako je ivica takta rastuca... PORTD.F0 = 1; // Opis funkcija JK i T flip-flopa Q1 = JK; JK = ((PORTB.F6 && (!Q1)) ((!(PORTB.F5) && Q1))); Q2 = TX; TX = ((!(PORTB.F7) && Q2) (PORTB.F7 && (!Q2))); } else if (clk==0) { // Ako je ivica takta opadajuca... } PORTD.F0 = 0; // Implementacija logike sa Slike 7-7 (1) if ((PORTA.F5==0) && (PORTA.F4==0) && (PORTA.F3==0)) { PORTC.F1 =!AX; PORTC.F0 =!CX; // Funkcija MUX 4/1 if ((PORTA.F1==0) && (PORTA.F0==0)) { PORTB.F0 = PORTB.F4; PORTD.F6 = PORTB.F4; } if ((PORTA.F1==0) && (PORTA.F0==1)) { PORTB.F0 = PORTB.F3; PORTD.F5 = PORTB.F3; } if ((PORTA.F1==1) && (PORTA.F0==0)) { PORTB.F0 = PORTB.F2; PORTD.F2 = PORTB.F2; } if ((PORTA.F1==1) && (PORTA.F0==1)) { PORTB.F0 = PORTB.F1; PORTD.F1 = PORTB.F1; } 62
PORTD.F3 = JK; PORTD.F4 = PORTB.F7; // JK flip-flop // D flip-flop } // Implementacija logike sa Slike 7-8 (2) else if ((PORTA.F5==0) && (PORTA.F4==0) && (PORTA.F3==1)) { PORTD.F1 =!BX; PORTD.F2 =!DX; // Funkcija MUX 2/1 if (PORTA.F0==0) { } PORTB.F0 = PORTB.F4; PORTD.F6 = PORTB.F4; if (PORTA.F0==1) { PORTB.F0 = PORTB.F3; PORTD.F5 = PORTB.F3; } PORTD.F3 = JK; PORTD.F4 = TX; } // JK flip-flop // T flip-flop else if ((PORTA.F5==0) && (PORTA.F4==1) && (PORTA.F3==0)) { PORTD.F1 = EX; PORTD.F2 = FX; // Funkcija MUX 2/1 if (PORTA.F0==0) { } PORTB.F0 = PORTB.F4; PORTD.F6 = PORTB.F4; if (PORTA.F0==1) { PORTB.F0 = PORTB.F3; PORTD.F5 = PORTB.F3; } PORTD.F3 = JK; PORTD.F4 = TX; // JK flip-flop // T flip-flop } 63
else if ((PORTA.F5==0) && (PORTA.F4==1) && (PORTA.F3==1)) { PORTD.F1 = AX; PORTD.F2 =!CX; // Funkcija MUX 2/1 if (PORTA.F0==0) { } PORTB.F0 = PORTB.F4; PORTD.F6 = PORTB.F4; if (PORTA.F0==1) { PORTB.F0 = PORTB.F3; PORTD.F5 = PORTB.F3; } PORTD.F3 = JK; PORTD.F4 = PORTB.F7; // JK flip-flop // D flip-flop } clk =!clkk; // Formiranje takta } while (1); // Kraj Petlje }//~ 64
9 LISTING ASEMBLERSKOG KÔDA PLC-a ; ASM code generated by mikrovirtualmachine for PIC - V. 6.2.0.0 ; ADDRESS OPCODE ASM ; ---------------------------------------------- $0000 $280F GOTO _main $0004 $ GlobalIniPIC_PLC2: $0004 $3000 MOVLW 0 $0005 $1303 BCF STATUS, RP1 $0006 $1283 BCF STATUS, RP0 $0007 $00A1 MOVWF _k+0 $0008 $3000 MOVLW 0 $0009 $00A2 MOVWF _k+1 $000A $3000 MOVLW 0 $000B $00A0 MOVWF _Q3+0 $000C $3001 MOVLW 1 $000D $00A3 MOVWF _clkk+0 $000E $0008 RETURN $000F $ _main: ;PIC_PLC2.c,5 :: void main() { ;PIC_PLC2.c,7 :: TRISA = 0b111111; // Definisanje i inicijalizacija $000F $2004 CALL GlobalIniPIC_PLC2 $0010 $303F MOVLW 63 $0011 $1683 BSF STATUS, RP0 $0012 $0085 MOVWF TRISA ;PIC_PLC2.c,8 :: PORTA = 0b000000; // pinova PORTOVA A, B, C i D $0013 $1283 BCF STATUS, RP0 $0014 $0185 CLRF PORTA, 1 ;PIC_PLC2.c,9 :: TRISB = 0b11111110; $0015 $30FE MOVLW 254 $0016 $1683 BSF STATUS, RP0 $0017 $0086 MOVWF TRISB ;PIC_PLC2.c,10 :: PORTB = 0b00000000; $0018 $1283 BCF STATUS, RP0 $0019 $0186 CLRF PORTB, 1 ;PIC_PLC2.c,11 :: TRISC = 0b10111100; $001A $30BC MOVLW 188 $001B $1683 BSF STATUS, RP0 $001C $0087 MOVWF TRISC ;PIC_PLC2.c,12 :: PORTC = 0b00000000; $001D $1283 BCF STATUS, RP0 $001E $0187 CLRF PORTC, 1 65
;PIC_PLC2.c,13 :: TRISD = 0b10000000; $001F $3080 MOVLW 128 $0020 $1683 BSF STATUS, RP0 $0021 $0088 MOVWF TRISD ;PIC_PLC2.c,14 :: PORTD = 0b00000000; $0022 $1283 BCF STATUS, RP0 $0023 $0188 CLRF PORTD, 1 ;PIC_PLC2.c,16 :: CMCON = 7; $0024 $3007 MOVLW 7 $0025 $1683 BSF STATUS, RP0 $0026 $009C MOVWF CMCON ;PIC_PLC2.c,17 :: ADCON1 = 0x06; // Definisanje pinova A porta kao $0027 $3006 MOVLW 6 $0028 $009F MOVWF ADCON1 ;PIC_PLC2.c,21 :: do { // Formiranje Beskonacne Petlje $0029 $ L_main_0: ;PIC_PLC2.c,24 :: if (k == 0) { // Prilikom starta, tj. prilikom prvog ukljucenja... $0029 $3000 MOVLW 0 $002A $1283 BCF STATUS, RP0 $002B $0622 XORWF _k+1, 0 $002C $1D03 BTFSS STATUS, Z $002D $2830 GOTO L_main_71 $002E $3000 MOVLW 0 $002F $0621 XORWF _k, 0 $0030 $ L_main_71: $0030 $1D03 BTFSS STATUS, Z $0031 $2850 GOTO L_main_2 ;PIC_PLC2.c,26 :: Delay_ms(2000); $0032 $300B MOVLW 11 $0033 $00FC MOVWF STACK_12 $0034 $30FF MOVLW 255 $0035 $00FB MOVWF STACK_11 $0036 $30FF MOVLW 255 $0037 $00FA MOVWF STACK_10 $0038 $0BFC DECFSZ STACK_12, F $0039 $283B GOTO $+2 $003A $2842 GOTO $+8 $003B $0BFB DECFSZ STACK_11, F $003C $283E GOTO $+2 $003D $2841 GOTO $+4 $003E $0BFA DECFSZ STACK_10, F $003F $283E GOTO $-1 $0040 $283B GOTO $-5 $0041 $2838 GOTO $-9 $0042 $3033 MOVLW 51 $0043 $00FB MOVWF STACK_11 66
$0044 $30FF MOVLW 255 $0045 $00FA MOVWF STACK_10 $0046 $0BFB DECFSZ STACK_11, F $0047 $2849 GOTO $+2 $0048 $284C GOTO $+4 $0049 $0BFA DECFSZ STACK_10, F $004A $2849 GOTO $-1 $004B $2846 GOTO $-5 $004C $3088 MOVLW 136 $004D $00FA MOVWF STACK_10 $004E $0BFA DECFSZ STACK_10, F $004F $284E GOTO $-1 ;PIC_PLC2.c,28 :: } $0050 $ L_main_2: ;PIC_PLC2.c,30 :: k++; $0050 $0AA1 INCF _k, 1 $0051 $1903 BTFSC STATUS, Z $0052 $0AA2 INCF _k+1, 1 ;PIC_PLC2.c,31 :: delay_ms(400); // Takt za flip-flopove je 0,4 sekunde $0053 $3003 MOVLW 3 $0054 $00FC MOVWF STACK_12 $0055 $30FF MOVLW 255 $0056 $00FB MOVWF STACK_11 $0057 $30FF MOVLW 255 $0058 $00FA MOVWF STACK_10 $0059 $0BFC DECFSZ STACK_12, F $005A $285C GOTO $+2 $005B $2863 GOTO $+8 $005C $0BFB DECFSZ STACK_11, F $005D $285F GOTO $+2 $005E $2862 GOTO $+4 $005F $0BFA DECFSZ STACK_10, F $0060 $285F GOTO $-1 $0061 $285C GOTO $-5 $0062 $2859 GOTO $-9 $0063 $300B MOVLW 11 $0064 $00FB MOVWF STACK_11 $0065 $30FF MOVLW 255 $0066 $00FA MOVWF STACK_10 $0067 $0BFB DECFSZ STACK_11, F $0068 $286A GOTO $+2 $0069 $286D GOTO $+4 $006A $0BFA DECFSZ STACK_10, F $006B $286A GOTO $-1 $006C $2867 GOTO $-5 $006D $3018 MOVLW 24 $006E $00FA MOVWF STACK_10 $006F $0BFA DECFSZ STACK_10, F 67
$0070 $286F GOTO $-1 ;PIC_PLC2.c,32 :: clkk = clk; $0071 $0824 MOVF _clk, 0 $0072 $00A3 MOVWF _clkk ;PIC_PLC2.c,35 :: AX = (PORTC.F5 && PORTC.F4); $0073 $3000 MOVLW 0 $0074 $1A87 BTFSC PORTC, 5 $0075 $3001 MOVLW 1 $0076 $00F1 MOVWF STACK_1 $0077 $0871 MOVF STACK_1, 0 $0078 $1903 BTFSC STATUS, Z $0079 $2884 GOTO L_main_4 $007A $3000 MOVLW 0 $007B $1A07 BTFSC PORTC, 4 $007C $3001 MOVLW 1 $007D $00F1 MOVWF STACK_1 $007E $0871 MOVF STACK_1, 0 $007F $1903 BTFSC STATUS, Z $0080 $2884 GOTO L_main_4 $0081 $3001 MOVLW 1 $0082 $00F0 MOVWF STACK_0 $0083 $2885 GOTO L_main_3 $0084 $ L_main_4: $0084 $01F0 CLRF STACK_0, 1 $0085 $ L_main_3: $0085 $0870 MOVF STACK_0, 0 $0086 $00A5 MOVWF _AX ;PIC_PLC2.c,37 :: BX = (PORTC.F5 PORTC.F4); $0087 $3000 MOVLW 0 $0088 $1A87 BTFSC PORTC, 5 $0089 $3001 MOVLW 1 $008A $00F1 MOVWF STACK_1 $008B $0871 MOVF STACK_1, 0 $008C $1D03 BTFSS STATUS, Z $008D $2897 GOTO L_main_6 $008E $3000 MOVLW 0 $008F $1A07 BTFSC PORTC, 4 $0090 $3001 MOVLW 1 $0091 $00F1 MOVWF STACK_1 $0092 $0871 MOVF STACK_1, 0 $0093 $1D03 BTFSS STATUS, Z $0094 $2897 GOTO L_main_6 $0095 $01F0 CLRF STACK_0, 1 $0096 $2899 GOTO L_main_5 $0097 $ L_main_6: $0097 $3001 MOVLW 1 $0098 $00F0 MOVWF STACK_0 $0099 $ L_main_5: $0099 $0870 MOVF STACK_0, 0 68
$009A $00A6 MOVWF _BX ;PIC_PLC2.c,39 :: CX = (PORTC.F3 && PORTC.F2); $009B $3000 MOVLW 0 $009C $1987 BTFSC PORTC, 3 $009D $3001 MOVLW 1 $009E $00F1 MOVWF STACK_1 $009F $0871 MOVF STACK_1, 0 $00A0 $1903 BTFSC STATUS, Z $00A1 $28AC GOTO L_main_8 $00A2 $3000 MOVLW 0 $00A3 $1907 BTFSC PORTC, 2 $00A4 $3001 MOVLW 1 $00A5 $00F1 MOVWF STACK_1 $00A6 $0871 MOVF STACK_1, 0 $00A7 $1903 BTFSC STATUS, Z $00A8 $28AC GOTO L_main_8 $00A9 $3001 MOVLW 1 $00AA $00F0 MOVWF STACK_0 $00AB $28AD GOTO L_main_7 $00AC $ L_main_8: $00AC $01F0 CLRF STACK_0, 1 $00AD $ L_main_7: $00AD $0870 MOVF STACK_0, 0 $00AE $00A7 MOVWF _CX ;PIC_PLC2.c,41 :: DX = (PORTC.F3 PORTC.F2); $00AF $3000 MOVLW 0 $00B0 $1987 BTFSC PORTC, 3 $00B1 $3001 MOVLW 1 $00B2 $00F1 MOVWF STACK_1 $00B3 $0871 MOVF STACK_1, 0 $00B4 $1D03 BTFSS STATUS, Z $00B5 $28BF GOTO L_main_10 $00B6 $3000 MOVLW 0 $00B7 $1907 BTFSC PORTC, 2 $00B8 $3001 MOVLW 1 $00B9 $00F1 MOVWF STACK_1 $00BA $0871 MOVF STACK_1, 0 $00BB $1D03 BTFSS STATUS, Z $00BC $28BF GOTO L_main_10 $00BD $01F0 CLRF STACK_0, 1 $00BE $28C1 GOTO L_main_9 $00BF $ L_main_10: $00BF $3001 MOVLW 1 $00C0 $00F0 MOVWF STACK_0 $00C1 $ L_main_9: $00C1 $0870 MOVF STACK_0, 0 $00C2 $00A8 MOVWF _DX ;PIC_PLC2.c,43 :: EX = ((PORTC.F5 &&!(PORTC.F4)) (!(PORTC.F5) && PORTC.F4)); 69
$00C3 $3000 MOVLW 0 $00C4 $1A87 BTFSC PORTC, 5 $00C5 $3001 MOVLW 1 $00C6 $00F1 MOVWF STACK_1 $00C7 $0871 MOVF STACK_1, 0 $00C8 $1903 BTFSC STATUS, Z $00C9 $28CC GOTO L158_ex_L_main_16 $00CA $1E07 BTFSS PORTC, 4 $00CB $28D7 GOTO L_main_16 $00CC $ L158_ex_L_main_16: $00CC $1A87 BTFSC PORTC, 5 $00CD $28D5 GOTO L172_ex_L_main_16 $00CE $3000 MOVLW 0 $00CF $1A07 BTFSC PORTC, 4 $00D0 $3001 MOVLW 1 $00D1 $00F1 MOVWF STACK_1 $00D2 $0871 MOVF STACK_1, 0 $00D3 $1D03 BTFSS STATUS, Z $00D4 $28D7 GOTO L_main_16 $00D5 $ L172_ex_L_main_16: $00D5 $01F0 CLRF STACK_0, 1 $00D6 $28D9 GOTO L_main_15 $00D7 $ L_main_16: $00D7 $3001 MOVLW 1 $00D8 $00F0 MOVWF STACK_0 $00D9 $ L_main_15: $00D9 $0870 MOVF STACK_0, 0 $00DA $00A9 MOVWF _EX ;PIC_PLC2.c,45 :: FX = ((PORTC.F5 && PORTC.F4) (!(PORTC.F5) &&!(PORTC.F4))); $00DB $3000 MOVLW 0 $00DC $1A87 BTFSC PORTC, 5 $00DD $3001 MOVLW 1 $00DE $00F1 MOVWF STACK_1 $00DF $0871 MOVF STACK_1, 0 $00E0 $1903 BTFSC STATUS, Z $00E1 $28E9 GOTO L196_ex_L_main_22 $00E2 $3000 MOVLW 0 $00E3 $1A07 BTFSC PORTC, 4 $00E4 $3001 MOVLW 1 $00E5 $00F1 MOVWF STACK_1 $00E6 $0871 MOVF STACK_1, 0 $00E7 $1D03 BTFSS STATUS, Z $00E8 $28EF GOTO L_main_22 $00E9 $ L196_ex_L_main_22: $00E9 $1A87 BTFSC PORTC, 5 $00EA $28ED GOTO L207_ex_L_main_22 $00EB $1E07 BTFSS PORTC, 4 $00EC $28EF GOTO L_main_22 70
$00ED $ L207_ex_L_main_22: $00ED $01F0 CLRF STACK_0, 1 $00EE $28F1 GOTO L_main_21 $00EF $ L_main_22: $00EF $3001 MOVLW 1 $00F0 $00F0 MOVWF STACK_0 $00F1 $ L_main_21: $00F1 $0870 MOVF STACK_0, 0 $00F2 $00AA MOVWF _FX ;PIC_PLC2.c,48 :: if (clk==1) { // Ako je ivica takta rastuca... $00F3 $0824 MOVF _clk, 0 $00F4 $3A01 XORLW 1 $00F5 $1D03 BTFSS STATUS, Z $00F6 $2927 GOTO L_main_23 ;PIC_PLC2.c,50 :: PORTD.F0 = 1; $00F7 $1408 BSF PORTD, 0 ;PIC_PLC2.c,52 :: Q1 = JK; $00F8 $082C MOVF _JK, 0 $00F9 $00AB MOVWF _Q1 ;PIC_PLC2.c,53 :: JK = ((PORTB.F6 && (!Q1)) ((!(PORTB.F5) && Q1))); $00FA $3000 MOVLW 0 $00FB $1B06 BTFSC PORTB, 6 $00FC $3001 MOVLW 1 $00FD $00F1 MOVWF STACK_1 $00FE $0871 MOVF STACK_1, 0 $00FF $1903 BTFSC STATUS, Z $0100 $2904 GOTO L232_ex_L_main_29 $0101 $082B MOVF _Q1, 0 $0102 $1903 BTFSC STATUS, Z $0103 $290B GOTO L_main_29 $0104 $ L232_ex_L_main_29: $0104 $1A86 BTFSC PORTB, 5 $0105 $2909 GOTO L242_ex_L_main_29 $0106 $082B MOVF _Q1, 0 $0107 $1D03 BTFSS STATUS, Z $0108 $290B GOTO L_main_29 $0109 $ L242_ex_L_main_29: $0109 $01F0 CLRF STACK_0, 1 $010A $290D GOTO L_main_28 $010B $ L_main_29: $010B $3001 MOVLW 1 $010C $00F0 MOVWF STACK_0 $010D $ L_main_28: $010D $0870 MOVF STACK_0, 0 $010E $00AC MOVWF _JK ;PIC_PLC2.c,54 :: Q2 = TX; $010F $082E MOVF _TX, 0 71
$0110 $00AD MOVWF _Q2 ;PIC_PLC2.c,55 :: TX = ((!(PORTB.F7) && Q2) (PORTB.F7 && (!Q2))); $0111 $1B86 BTFSC PORTB, 7 $0112 $2916 GOTO L260_ex_L_main_35 $0113 $082D MOVF _Q2, 0 $0114 $1D03 BTFSS STATUS, Z $0115 $2922 GOTO L_main_35 $0116 $ L260_ex_L_main_35: $0116 $3000 MOVLW 0 $0117 $1B86 BTFSC PORTB, 7 $0118 $3001 MOVLW 1 $0119 $00F1 MOVWF STACK_1 $011A $0871 MOVF STACK_1, 0 $011B $1903 BTFSC STATUS, Z $011C $2920 GOTO L274_ex_L_main_35 $011D $082D MOVF _Q2, 0 $011E $1903 BTFSC STATUS, Z $011F $2922 GOTO L_main_35 $0120 $ L274_ex_L_main_35: $0120 $01F0 CLRF STACK_0, 1 $0121 $2924 GOTO L_main_34 $0122 $ L_main_35: $0122 $3001 MOVLW 1 $0123 $00F0 MOVWF STACK_0 $0124 $ L_main_34: $0124 $0870 MOVF STACK_0, 0 $0125 $00AE MOVWF _TX ;PIC_PLC2.c,57 :: } $0126 $292C GOTO L_main_36 $0127 $ L_main_23: ;PIC_PLC2.c,59 :: else if (clk==0) { // Ako je ivica takta opadajuca... $0127 $0824 MOVF _clk, 0 $0128 $3A00 XORLW 0 $0129 $1D03 BTFSS STATUS, Z $012A $292C GOTO L_main_37 ;PIC_PLC2.c,61 :: PORTD.F0 = 0; $012B $1008 BCF PORTD, 0 ;PIC_PLC2.c,63 :: } $012C $ L_main_37: $012C $ L_main_36: ;PIC_PLC2.c,66 :: if ((PORTA.F5==0) && (PORTA.F4==0) && (PORTA.F3==0)) { $012C $3000 MOVLW 0 $012D $1A85 BTFSC PORTA, 5 $012E $3001 MOVLW 1 $012F $00F1 MOVWF STACK_1 72
$0130 $0871 MOVF STACK_1, 0 $0131 $3A00 XORLW 0 $0132 $1D03 BTFSS STATUS, Z $0133 $29F7 GOTO L_main_40 $0134 $3000 MOVLW 0 $0135 $1A05 BTFSC PORTA, 4 $0136 $3001 MOVLW 1 $0137 $00F1 MOVWF STACK_1 $0138 $0871 MOVF STACK_1, 0 $0139 $3A00 XORLW 0 $013A $1D03 BTFSS STATUS, Z $013B $29F7 GOTO L_main_40 $013C $3000 MOVLW 0 $013D $1985 BTFSC PORTA, 3 $013E $3001 MOVLW 1 $013F $00F1 MOVWF STACK_1 $0140 $0871 MOVF STACK_1, 0 $0141 $3A00 XORLW 0 $0142 $1D03 BTFSS STATUS, Z $0143 $29F7 GOTO L_main_40 $0144 $ L313_ex_L_main_40: ;PIC_PLC2.c,68 :: PORTC.F1 =!AX; $0144 $0825 MOVF _AX, 0 $0145 $3001 MOVLW 1 $0146 $1D03 BTFSS STATUS, Z $0147 $3000 MOVLW 0 $0148 $00F0 MOVWF STACK_0 $0149 $3000 MOVLW 0 $014A $1870 BTFSC STACK_0, 0 $014B $3002 MOVLW 2 $014C $0607 XORWF PORTC, 0 $014D $3902 ANDLW 2 $014E $0687 XORWF PORTC, 1 ;PIC_PLC2.c,69 :: PORTC.F0 =!CX; $014F $0827 MOVF _CX, 0 $0150 $3001 MOVLW 1 $0151 $1D03 BTFSS STATUS, Z $0152 $3000 MOVLW 0 $0153 $00F0 MOVWF STACK_0 $0154 $3000 MOVLW 0 $0155 $1870 BTFSC STACK_0, 0 $0156 $3001 MOVLW 1 $0157 $0607 XORWF PORTC, 0 $0158 $3901 ANDLW 1 $0159 $0687 XORWF PORTC, 1 ;PIC_PLC2.c,72 :: if ((PORTA.F1==0) && (PORTA.F0==0)) { $015A $3000 MOVLW 0 $015B $1885 BTFSC PORTA, 1 $015C $3001 MOVLW 1 73
$015D $00F1 MOVWF STACK_1 $015E $0871 MOVF STACK_1, 0 $015F $3A00 XORLW 0 $0160 $1D03 BTFSS STATUS, Z $0161 $297D GOTO L_main_43 $0162 $3001 MOVLW 1 $0163 $0505 ANDWF PORTA, 0 $0164 $00F1 MOVWF STACK_1 $0165 $0871 MOVF STACK_1, 0 $0166 $3A00 XORLW 0 $0167 $1D03 BTFSS STATUS, Z $0168 $297D GOTO L_main_43 $0169 $ L334_ex_L_main_43: ;PIC_PLC2.c,73 :: PORTB.F0 = PORTB.F4; $0169 $3000 MOVLW 0 $016A $1A06 BTFSC PORTB, 4 $016B $3001 MOVLW 1 $016C $00F1 MOVWF STACK_1 $016D $3000 MOVLW 0 $016E $1871 BTFSC STACK_1, 0 $016F $3001 MOVLW 1 $0170 $0606 XORWF PORTB, 0 $0171 $3901 ANDLW 1 $0172 $0686 XORWF PORTB, 1 ;PIC_PLC2.c,74 :: PORTD.F6 = PORTB.F4; $0173 $3000 MOVLW 0 $0174 $1A06 BTFSC PORTB, 4 $0175 $3001 MOVLW 1 $0176 $00F1 MOVWF STACK_1 $0177 $3000 MOVLW 0 $0178 $1871 BTFSC STACK_1, 0 $0179 $3040 MOVLW 64 $017A $0608 XORWF PORTD, 0 $017B $3940 ANDLW 64 $017C $0688 XORWF PORTD, 1 ;PIC_PLC2.c,75 :: } $017D $ L_main_43: ;PIC_PLC2.c,77 :: if ((PORTA.F1==0) && (PORTA.F0==1)) { $017D $3000 MOVLW 0 $017E $1885 BTFSC PORTA, 1 $017F $3001 MOVLW 1 $0180 $00F1 MOVWF STACK_1 $0181 $0871 MOVF STACK_1, 0 $0182 $3A00 XORLW 0 $0183 $1D03 BTFSS STATUS, Z $0184 $29A0 GOTO L_main_46 $0185 $3001 MOVLW 1 $0186 $0505 ANDWF PORTA, 0 $0187 $00F1 MOVWF STACK_1 74
$0188 $0871 MOVF STACK_1, 0 $0189 $3A01 XORLW 1 $018A $1D03 BTFSS STATUS, Z $018B $29A0 GOTO L_main_46 $018C $ L362_ex_L_main_46: ;PIC_PLC2.c,78 :: PORTB.F0 = PORTB.F3; $018C $3000 MOVLW 0 $018D $1986 BTFSC PORTB, 3 $018E $3001 MOVLW 1 $018F $00F1 MOVWF STACK_1 $0190 $3000 MOVLW 0 $0191 $1871 BTFSC STACK_1, 0 $0192 $3001 MOVLW 1 $0193 $0606 XORWF PORTB, 0 $0194 $3901 ANDLW 1 $0195 $0686 XORWF PORTB, 1 ;PIC_PLC2.c,79 :: PORTD.F5 = PORTB.F3; $0196 $3000 MOVLW 0 $0197 $1986 BTFSC PORTB, 3 $0198 $3001 MOVLW 1 $0199 $00F1 MOVWF STACK_1 $019A $3000 MOVLW 0 $019B $1871 BTFSC STACK_1, 0 $019C $3020 MOVLW 32 $019D $0608 XORWF PORTD, 0 $019E $3920 ANDLW 32 $019F $0688 XORWF PORTD, 1 ;PIC_PLC2.c,81 :: } $01A0 $ L_main_46: ;PIC_PLC2.c,83 :: if ((PORTA.F1==1) && (PORTA.F0==0)) { $01A0 $3000 MOVLW 0 $01A1 $1885 BTFSC PORTA, 1 $01A2 $3001 MOVLW 1 $01A3 $00F1 MOVWF STACK_1 $01A4 $0871 MOVF STACK_1, 0 $01A5 $3A01 XORLW 1 $01A6 $1D03 BTFSS STATUS, Z $01A7 $29C3 GOTO L_main_49 $01A8 $3001 MOVLW 1 $01A9 $0505 ANDWF PORTA, 0 $01AA $00F1 MOVWF STACK_1 $01AB $0871 MOVF STACK_1, 0 $01AC $3A00 XORLW 0 $01AD $1D03 BTFSS STATUS, Z $01AE $29C3 GOTO L_main_49 $01AF $ L390_ex_L_main_49: ;PIC_PLC2.c,84 :: PORTB.F0 = PORTB.F2; $01AF $3000 MOVLW 0 $01B0 $1906 BTFSC PORTB, 2 75
$01B1 $3001 MOVLW 1 $01B2 $00F1 MOVWF STACK_1 $01B3 $3000 MOVLW 0 $01B4 $1871 BTFSC STACK_1, 0 $01B5 $3001 MOVLW 1 $01B6 $0606 XORWF PORTB, 0 $01B7 $3901 ANDLW 1 $01B8 $0686 XORWF PORTB, 1 ;PIC_PLC2.c,85 :: PORTD.F2 = PORTB.F2; $01B9 $3000 MOVLW 0 $01BA $1906 BTFSC PORTB, 2 $01BB $3001 MOVLW 1 $01BC $00F1 MOVWF STACK_1 $01BD $3000 MOVLW 0 $01BE $1871 BTFSC STACK_1, 0 $01BF $3004 MOVLW 4 $01C0 $0608 XORWF PORTD, 0 $01C1 $3904 ANDLW 4 $01C2 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,87 :: } $01C3 $ L_main_49: ;PIC_PLC2.c,89 :: if ((PORTA.F1==1) && (PORTA.F0==1)) { $01C3 $3000 MOVLW 0 $01C4 $1885 BTFSC PORTA, 1 $01C5 $3001 MOVLW 1 $01C6 $00F1 MOVWF STACK_1 $01C7 $0871 MOVF STACK_1, 0 $01C8 $3A01 XORLW 1 $01C9 $1D03 BTFSS STATUS, Z $01CA $29E6 GOTO L_main_52 $01CB $3001 MOVLW 1 $01CC $0505 ANDWF PORTA, 0 $01CD $00F1 MOVWF STACK_1 $01CE $0871 MOVF STACK_1, 0 $01CF $3A01 XORLW 1 $01D0 $1D03 BTFSS STATUS, Z $01D1 $29E6 GOTO L_main_52 $01D2 $ L418_ex_L_main_52: ;PIC_PLC2.c,90 :: PORTB.F0 = PORTB.F1; $01D2 $3000 MOVLW 0 $01D3 $1886 BTFSC PORTB, 1 $01D4 $3001 MOVLW 1 $01D5 $00F1 MOVWF STACK_1 $01D6 $3000 MOVLW 0 $01D7 $1871 BTFSC STACK_1, 0 $01D8 $3001 MOVLW 1 $01D9 $0606 XORWF PORTB, 0 $01DA $3901 ANDLW 1 $01DB $0686 XORWF PORTB, 1 76
;PIC_PLC2.c,91 :: PORTD.F1 = PORTB.F1; $01DC $3000 MOVLW 0 $01DD $1886 BTFSC PORTB, 1 $01DE $3001 MOVLW 1 $01DF $00F1 MOVWF STACK_1 $01E0 $3000 MOVLW 0 $01E1 $1871 BTFSC STACK_1, 0 $01E2 $3002 MOVLW 2 $01E3 $0608 XORWF PORTD, 0 $01E4 $3902 ANDLW 2 $01E5 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,92 :: } $01E6 $ L_main_52: ;PIC_PLC2.c,94 :: PORTD.F3 = JK; // JK flip-flop $01E6 $3000 MOVLW 0 $01E7 $182C BTFSC _JK, 0 $01E8 $3008 MOVLW 8 $01E9 $0608 XORWF PORTD, 0 $01EA $3908 ANDLW 8 $01EB $0688 XORWF PORTD, 1 ;PIC_PLC2.c,95 :: PORTD.F4 = PORTB.F7; // D flip-flop $01EC $3000 MOVLW 0 $01ED $1B86 BTFSC PORTB, 7 $01EE $3001 MOVLW 1 $01EF $00F1 MOVWF STACK_1 $01F0 $3000 MOVLW 0 $01F1 $1871 BTFSC STACK_1, 0 $01F2 $3010 MOVLW 16 $01F3 $0608 XORWF PORTD, 0 $01F4 $3910 ANDLW 16 $01F5 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,97 :: } $01F6 $2B3E GOTO L_main_53 $01F7 $ L_main_40: ;PIC_PLC2.c,100 :: else if ((PORTA.F5==0) && (PORTA.F4==0) && (PORTA.F3==1)) { $01F7 $3000 MOVLW 0 $01F8 $1A85 BTFSC PORTA, 5 $01F9 $3001 MOVLW 1 $01FA $00F1 MOVWF STACK_1 $01FB $0871 MOVF STACK_1, 0 $01FC $3A00 XORLW 0 $01FD $1D03 BTFSS STATUS, Z $01FE $2A68 GOTO L_main_56 $01FF $3000 MOVLW 0 $0200 $1A05 BTFSC PORTA, 4 $0201 $3001 MOVLW 1 77
$0202 $00F1 MOVWF STACK_1 $0203 $0871 MOVF STACK_1, 0 $0204 $3A00 XORLW 0 $0205 $1D03 BTFSS STATUS, Z $0206 $2A68 GOTO L_main_56 $0207 $3000 MOVLW 0 $0208 $1985 BTFSC PORTA, 3 $0209 $3001 MOVLW 1 $020A $00F1 MOVWF STACK_1 $020B $0871 MOVF STACK_1, 0 $020C $3A01 XORLW 1 $020D $1D03 BTFSS STATUS, Z $020E $2A68 GOTO L_main_56 $020F $ L462_ex_L_main_56: ;PIC_PLC2.c,102 :: PORTD.F1 =!BX; $020F $0826 MOVF _BX, 0 $0210 $3001 MOVLW 1 $0211 $1D03 BTFSS STATUS, Z $0212 $3000 MOVLW 0 $0213 $00F0 MOVWF STACK_0 $0214 $3000 MOVLW 0 $0215 $1870 BTFSC STACK_0, 0 $0216 $3002 MOVLW 2 $0217 $0608 XORWF PORTD, 0 $0218 $3902 ANDLW 2 $0219 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,103 :: PORTD.F2 =!DX; $021A $0828 MOVF _DX, 0 $021B $3001 MOVLW 1 $021C $1D03 BTFSS STATUS, Z $021D $3000 MOVLW 0 $021E $00F0 MOVWF STACK_0 $021F $3000 MOVLW 0 $0220 $1870 BTFSC STACK_0, 0 $0221 $3004 MOVLW 4 $0222 $0608 XORWF PORTD, 0 $0223 $3904 ANDLW 4 $0224 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,106 :: if (PORTA.F0==0) { $0225 $3001 MOVLW 1 $0226 $0505 ANDWF PORTA, 0 $0227 $00F1 MOVWF STACK_1 $0228 $0871 MOVF STACK_1, 0 $0229 $3A00 XORLW 0 $022A $1D03 BTFSS STATUS, Z $022B $2A40 GOTO L_main_57 ;PIC_PLC2.c,108 :: PORTB.F0 = PORTB.F4; $022C $3000 MOVLW 0 $022D $1A06 BTFSC PORTB, 4 78
$022E $3001 MOVLW 1 $022F $00F1 MOVWF STACK_1 $0230 $3000 MOVLW 0 $0231 $1871 BTFSC STACK_1, 0 $0232 $3001 MOVLW 1 $0233 $0606 XORWF PORTB, 0 $0234 $3901 ANDLW 1 $0235 $0686 XORWF PORTB, 1 ;PIC_PLC2.c,109 :: PORTD.F6 = PORTB.F4; $0236 $3000 MOVLW 0 $0237 $1A06 BTFSC PORTB, 4 $0238 $3001 MOVLW 1 $0239 $00F1 MOVWF STACK_1 $023A $3000 MOVLW 0 $023B $1871 BTFSC STACK_1, 0 $023C $3040 MOVLW 64 $023D $0608 XORWF PORTD, 0 $023E $3940 ANDLW 64 $023F $0688 XORWF PORTD, 1 ;PIC_PLC2.c,110 :: } $0240 $ L_main_57: ;PIC_PLC2.c,112 :: if (PORTA.F0==1) { $0240 $3001 MOVLW 1 $0241 $0505 ANDWF PORTA, 0 $0242 $00F1 MOVWF STACK_1 $0243 $0871 MOVF STACK_1, 0 $0244 $3A01 XORLW 1 $0245 $1D03 BTFSS STATUS, Z $0246 $2A5B GOTO L_main_58 ;PIC_PLC2.c,113 :: PORTB.F0 = PORTB.F3; $0247 $3000 MOVLW 0 $0248 $1986 BTFSC PORTB, 3 $0249 $3001 MOVLW 1 $024A $00F1 MOVWF STACK_1 $024B $3000 MOVLW 0 $024C $1871 BTFSC STACK_1, 0 $024D $3001 MOVLW 1 $024E $0606 XORWF PORTB, 0 $024F $3901 ANDLW 1 $0250 $0686 XORWF PORTB, 1 ;PIC_PLC2.c,114 :: PORTD.F5 = PORTB.F3; $0251 $3000 MOVLW 0 $0252 $1986 BTFSC PORTB, 3 $0253 $3001 MOVLW 1 $0254 $00F1 MOVWF STACK_1 $0255 $3000 MOVLW 0 $0256 $1871 BTFSC STACK_1, 0 $0257 $3020 MOVLW 32 $0258 $0608 XORWF PORTD, 0 79
$0259 $3920 ANDLW 32 $025A $0688 XORWF PORTD, 1 ;PIC_PLC2.c,116 :: } $025B $ L_main_58: ;PIC_PLC2.c,119 :: PORTD.F3 = JK; // JK flip-flop $025B $3000 MOVLW 0 $025C $182C BTFSC _JK, 0 $025D $3008 MOVLW 8 $025E $0608 XORWF PORTD, 0 $025F $3908 ANDLW 8 $0260 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,120 :: PORTD.F4 = TX; // T flip-flop $0261 $3000 MOVLW 0 $0262 $182E BTFSC _TX, 0 $0263 $3010 MOVLW 16 $0264 $0608 XORWF PORTD, 0 $0265 $3910 ANDLW 16 $0266 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,122 :: } $0267 $2B3E GOTO L_main_59 $0268 $ L_main_56: ;PIC_PLC2.c,123 :: else if ((PORTA.F5==0) && (PORTA.F4==1) && (PORTA.F3==0)) { $0268 $3000 MOVLW 0 $0269 $1A85 BTFSC PORTA, 5 $026A $3001 MOVLW 1 $026B $00F1 MOVWF STACK_1 $026C $0871 MOVF STACK_1, 0 $026D $3A00 XORLW 0 $026E $1D03 BTFSS STATUS, Z $026F $2ACF GOTO L_main_62 $0270 $3000 MOVLW 0 $0271 $1A05 BTFSC PORTA, 4 $0272 $3001 MOVLW 1 $0273 $00F1 MOVWF STACK_1 $0274 $0871 MOVF STACK_1, 0 $0275 $3A01 XORLW 1 $0276 $1D03 BTFSS STATUS, Z $0277 $2ACF GOTO L_main_62 $0278 $3000 MOVLW 0 $0279 $1985 BTFSC PORTA, 3 $027A $3001 MOVLW 1 $027B $00F1 MOVWF STACK_1 $027C $0871 MOVF STACK_1, 0 $027D $3A00 XORLW 0 $027E $1D03 BTFSS STATUS, Z $027F $2ACF GOTO L_main_62 80
$0280 $ L525_ex_L_main_62: ;PIC_PLC2.c,125 :: PORTD.F1 = EX; $0280 $3000 MOVLW 0 $0281 $1829 BTFSC _EX, 0 $0282 $3002 MOVLW 2 $0283 $0608 XORWF PORTD, 0 $0284 $3902 ANDLW 2 $0285 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,126 :: PORTD.F2 = FX; $0286 $3000 MOVLW 0 $0287 $182A BTFSC _FX, 0 $0288 $3004 MOVLW 4 $0289 $0608 XORWF PORTD, 0 $028A $3904 ANDLW 4 $028B $0688 XORWF PORTD, 1 ;PIC_PLC2.c,129 :: if (PORTA.F0==0) { $028C $3001 MOVLW 1 $028D $0505 ANDWF PORTA, 0 $028E $00F1 MOVWF STACK_1 $028F $0871 MOVF STACK_1, 0 $0290 $3A00 XORLW 0 $0291 $1D03 BTFSS STATUS, Z $0292 $2AA7 GOTO L_main_63 ;PIC_PLC2.c,131 :: PORTB.F0 = PORTB.F4; $0293 $3000 MOVLW 0 $0294 $1A06 BTFSC PORTB, 4 $0295 $3001 MOVLW 1 $0296 $00F1 MOVWF STACK_1 $0297 $3000 MOVLW 0 $0298 $1871 BTFSC STACK_1, 0 $0299 $3001 MOVLW 1 $029A $0606 XORWF PORTB, 0 $029B $3901 ANDLW 1 $029C $0686 XORWF PORTB, 1 ;PIC_PLC2.c,132 :: PORTD.F6 = PORTB.F4; $029D $3000 MOVLW 0 $029E $1A06 BTFSC PORTB, 4 $029F $3001 MOVLW 1 $02A0 $00F1 MOVWF STACK_1 $02A1 $3000 MOVLW 0 $02A2 $1871 BTFSC STACK_1, 0 $02A3 $3040 MOVLW 64 $02A4 $0608 XORWF PORTD, 0 $02A5 $3940 ANDLW 64 $02A6 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,133 :: } $02A7 $ L_main_63: ;PIC_PLC2.c,135 :: if (PORTA.F0==1) { $02A7 $3001 MOVLW 1 81
$02A8 $0505 ANDWF PORTA, 0 $02A9 $00F1 MOVWF STACK_1 $02AA $0871 MOVF STACK_1, 0 $02AB $3A01 XORLW 1 $02AC $1D03 BTFSS STATUS, Z $02AD $2AC2 GOTO L_main_64 ;PIC_PLC2.c,136 :: PORTB.F0 = PORTB.F3; $02AE $3000 MOVLW 0 $02AF $1986 BTFSC PORTB, 3 $02B0 $3001 MOVLW 1 $02B1 $00F1 MOVWF STACK_1 $02B2 $3000 MOVLW 0 $02B3 $1871 BTFSC STACK_1, 0 $02B4 $3001 MOVLW 1 $02B5 $0606 XORWF PORTB, 0 $02B6 $3901 ANDLW 1 $02B7 $0686 XORWF PORTB, 1 ;PIC_PLC2.c,137 :: PORTD.F5 = PORTB.F3; $02B8 $3000 MOVLW 0 $02B9 $1986 BTFSC PORTB, 3 $02BA $3001 MOVLW 1 $02BB $00F1 MOVWF STACK_1 $02BC $3000 MOVLW 0 $02BD $1871 BTFSC STACK_1, 0 $02BE $3020 MOVLW 32 $02BF $0608 XORWF PORTD, 0 $02C0 $3920 ANDLW 32 $02C1 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,139 :: } $02C2 $ L_main_64: ;PIC_PLC2.c,141 :: PORTD.F3 = JK; // JK flip-flop $02C2 $3000 MOVLW 0 $02C3 $182C BTFSC _JK, 0 $02C4 $3008 MOVLW 8 $02C5 $0608 XORWF PORTD, 0 $02C6 $3908 ANDLW 8 $02C7 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,142 :: PORTD.F4 = TX; // T flip-flop $02C8 $3000 MOVLW 0 $02C9 $182E BTFSC _TX, 0 $02CA $3010 MOVLW 16 $02CB $0608 XORWF PORTD, 0 $02CC $3910 ANDLW 16 $02CD $0688 XORWF PORTD, 1 ;PIC_PLC2.c,144 :: } $02CE $2B3E GOTO L_main_65 $02CF $ L_main_62: 82
;PIC_PLC2.c,146 :: else if ((PORTA.F5==0) && (PORTA.F4==1) && (PORTA.F3==1)) { $02CF $3000 MOVLW 0 $02D0 $1A85 BTFSC PORTA, 5 $02D1 $3001 MOVLW 1 $02D2 $00F1 MOVWF STACK_1 $02D3 $0871 MOVF STACK_1, 0 $02D4 $3A00 XORLW 0 $02D5 $1D03 BTFSS STATUS, Z $02D6 $2B3E GOTO L_main_68 $02D7 $3000 MOVLW 0 $02D8 $1A05 BTFSC PORTA, 4 $02D9 $3001 MOVLW 1 $02DA $00F1 MOVWF STACK_1 $02DB $0871 MOVF STACK_1, 0 $02DC $3A01 XORLW 1 $02DD $1D03 BTFSS STATUS, Z $02DE $2B3E GOTO L_main_68 $02DF $3000 MOVLW 0 $02E0 $1985 BTFSC PORTA, 3 $02E1 $3001 MOVLW 1 $02E2 $00F1 MOVWF STACK_1 $02E3 $0871 MOVF STACK_1, 0 $02E4 $3A01 XORLW 1 $02E5 $1D03 BTFSS STATUS, Z $02E6 $2B3E GOTO L_main_68 $02E7 $ L586_ex_L_main_68: ;PIC_PLC2.c,148 :: PORTD.F1 = AX; $02E7 $3000 MOVLW 0 $02E8 $1825 BTFSC _AX, 0 $02E9 $3002 MOVLW 2 $02EA $0608 XORWF PORTD, 0 $02EB $3902 ANDLW 2 $02EC $0688 XORWF PORTD, 1 ;PIC_PLC2.c,149 :: PORTD.F2 =!CX; $02ED $0827 MOVF _CX, 0 $02EE $3001 MOVLW 1 $02EF $1D03 BTFSS STATUS, Z $02F0 $3000 MOVLW 0 $02F1 $00F0 MOVWF STACK_0 $02F2 $3000 MOVLW 0 $02F3 $1870 BTFSC STACK_0, 0 $02F4 $3004 MOVLW 4 $02F5 $0608 XORWF PORTD, 0 $02F6 $3904 ANDLW 4 $02F7 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,152 :: if (PORTA.F0==0) { $02F8 $3001 MOVLW 1 $02F9 $0505 ANDWF PORTA, 0 83
$02FA $00F1 MOVWF STACK_1 $02FB $0871 MOVF STACK_1, 0 $02FC $3A00 XORLW 0 $02FD $1D03 BTFSS STATUS, Z $02FE $2B13 GOTO L_main_69 ;PIC_PLC2.c,154 :: PORTB.F0 = PORTB.F4; $02FF $3000 MOVLW 0 $0300 $1A06 BTFSC PORTB, 4 $0301 $3001 MOVLW 1 $0302 $00F1 MOVWF STACK_1 $0303 $3000 MOVLW 0 $0304 $1871 BTFSC STACK_1, 0 $0305 $3001 MOVLW 1 $0306 $0606 XORWF PORTB, 0 $0307 $3901 ANDLW 1 $0308 $0686 XORWF PORTB, 1 ;PIC_PLC2.c,155 :: PORTD.F6 = PORTB.F4; $0309 $3000 MOVLW 0 $030A $1A06 BTFSC PORTB, 4 $030B $3001 MOVLW 1 $030C $00F1 MOVWF STACK_1 $030D $3000 MOVLW 0 $030E $1871 BTFSC STACK_1, 0 $030F $3040 MOVLW 64 $0310 $0608 XORWF PORTD, 0 $0311 $3940 ANDLW 64 $0312 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,156 :: } $0313 $ L_main_69: ;PIC_PLC2.c,158 :: if (PORTA.F0==1) { $0313 $3001 MOVLW 1 $0314 $0505 ANDWF PORTA, 0 $0315 $00F1 MOVWF STACK_1 $0316 $0871 MOVF STACK_1, 0 $0317 $3A01 XORLW 1 $0318 $1D03 BTFSS STATUS, Z $0319 $2B2E GOTO L_main_70 ;PIC_PLC2.c,159 :: PORTB.F0 = PORTB.F3; $031A $3000 MOVLW 0 $031B $1986 BTFSC PORTB, 3 $031C $3001 MOVLW 1 $031D $00F1 MOVWF STACK_1 $031E $3000 MOVLW 0 $031F $1871 BTFSC STACK_1, 0 $0320 $3001 MOVLW 1 $0321 $0606 XORWF PORTB, 0 $0322 $3901 ANDLW 1 $0323 $0686 XORWF PORTB, 1 ;PIC_PLC2.c,160 :: PORTD.F5 = PORTB.F3; 84
$0324 $3000 MOVLW 0 $0325 $1986 BTFSC PORTB, 3 $0326 $3001 MOVLW 1 $0327 $00F1 MOVWF STACK_1 $0328 $3000 MOVLW 0 $0329 $1871 BTFSC STACK_1, 0 $032A $3020 MOVLW 32 $032B $0608 XORWF PORTD, 0 $032C $3920 ANDLW 32 $032D $0688 XORWF PORTD, 1 ;PIC_PLC2.c,162 :: } $032E $ L_main_70: ;PIC_PLC2.c,164 :: PORTD.F3 = JK; // JK flip-flop $032E $3000 MOVLW 0 $032F $182C BTFSC _JK, 0 $0330 $3008 MOVLW 8 $0331 $0608 XORWF PORTD, 0 $0332 $3908 ANDLW 8 $0333 $0688 XORWF PORTD, 1 ;PIC_PLC2.c,165 :: PORTD.F4 = PORTB.F7; // D flip-flop $0334 $3000 MOVLW 0 $0335 $1B86 BTFSC PORTB, 7 $0336 $3001 MOVLW 1 $0337 $00F1 MOVWF STACK_1 $0338 $3000 MOVLW 0 $0339 $1871 BTFSC STACK_1, 0 $033A $3010 MOVLW 16 $033B $0608 XORWF PORTD, 0 $033C $3910 ANDLW 16 $033D $0688 XORWF PORTD, 1 ;PIC_PLC2.c,167 :: } $033E $ L_main_68: $033E $ L_main_65: $033E $ L_main_59: $033E $ L_main_53: ;PIC_PLC2.c,169 :: clk =!clkk; // Formiranje takta $033E $0823 MOVF _clkk, 0 $033F $3001 MOVLW 1 $0340 $1D03 BTFSS STATUS, Z $0341 $3000 MOVLW 0 $0342 $00A4 MOVWF _clk ;PIC_PLC2.c,171 :: } while (1); // Kraj Petlje $0343 $2829 GOTO L_main_0 ;PIC_PLC2.c,172 :: }//~ $0344 $2B44 GOTO $ 85
10 - LABORATORIJSKA VEŢBA Već je napomenuto da ukoliko je pin nekog porta definisan kao izlazni, nikako ne treba dovoditi na njega logičku '0' ili logičku '1'. Da bi se povezalo kolo kao na Slici 10-2, neophodno je postaviti kratkospajače i položaje pinova A5-A3 kao na Slici 10-3. Pinovi PC1 i PC0 su izlazi logičkih NI kola i dovodeni su, respektivno, na ulaze JK i D flip-flopa, kao i na MUX 4/1. Ideja laboratorijske vežbe je da studenti provere funkcionalnost kola sa Sike 10-1, a zatim da, uz pomoć asistenta realizuju neko drugo kolo. Kao što je napomenuto u sedmom poglavlju, na raspolaganju su četiri kombinacije. Student može uz nadzor asistenta da realizuje i neku drugu kombinaciju dopisujući redove programskog koda u mikroc-u. Slika 10-1. Raspored klema/konektora i prekidaĉa na ploĉi 86
Slika 10-2. Kolo koje treba realizovati Slika 10-3. Realizacija logike sa Slike 10-2 87
PB7 je ulaz D flip-flopa, a PB6 (J) i PB5 (K) su ulazi JK flip-flopa, PC5-PC4 (1) i PC3-PC2 (2) predstavljaju ulaze NI logičkih kola, PD4 predstavlja izlaz D flip-flopa, a PD3 predstavlja izlaz JK flip-flopa, PB4-PB1 su ulazi multipleksera 4/1, PB0 je izlaz multipleksera 4/1, PD7 je ulaz demultipleksera 1/4, PD6-PD5, PD2-PD1 su izlazi demultipleksera 1/4, PC1 je izlaz NI logičkog kola (1), a PC0 je izlaz NI logičkog kola (2), PD0 pin registruje trenutak internog taktovanja flip-flopova. Taktovanje je reda 400 milisekundi kako bi posmatrač mogao da ih uoči. Opisivanje svakog kola u mikroc-u za kombinaciju '000' // Opis funkcije I kola: AX = (PORTC.F5 && PORTC.F4); // Opis funkcije I kola: CX = (PORTC.F3 && PORTC.F2); // Opis funkcija JK flip-flopa: Q1 = JK; JK = ((PORTB.F6 && (!Q1)) ((!(PORTB.F5) && Q1)));... PORTC.F1 =!AX; PORTC.F0 =!CX; realizacija NI kola (komplement I logiĉke funkcije) realizacija NI kola (komplement I logiĉke funkcije) // Opis funkcija i realizacija multipleksera 4/1: if ((PORTA.F1==0) && (PORTA.F0==0)) { PORTB.F0 = PORTB.F4; PORTD.F6 = PORTB.F4; } if ((PORTA.F1==0) && (PORTA.F0==1)) { PORTB.F0 = PORTB.F3; PORTD.F5 = PORTB.F3; } if ((PORTA.F1==1) && (PORTA.F0==0)) { PORTB.F0 = PORTB.F2; PORTD.F2 = PORTB.F2; } if ((PORTA.F1==1) && (PORTA.F0==1)) { PORTB.F0 = PORTB.F1; PORTD.F1 = PORTB.F1; } PORTD.F3 = JK; PORTD.F4 = PORTB.F7; realizacija JK flip-flopa realizacija D flip-flopa 88
Vežba Dovesti napajanje preko adaptera, koji treba da bude podešen na 7.5V (nestabilisani jednosmerni napon). Proveriti za kombinaciju PA4-PA3= 000 PLC kontrolera, koje su opisane u osmom poglavlju. Skicirati dijagrame ulaznih i izlaznih veličina (logičkih vrednosti). Uz nadzor asistenta, preko klema/konektora i spoljašnjih vodova (izolovanih žica) napraviti bar jednu logičku šemu. Proveriti logičku šemu za sve moguće kombinacije. Skicirati dijagrame ulaznih i izlaznih veličina. Napomene: Ukoliko je pin nekog porta definisan kao izlazni, nikako ne treba dovoditi na njega logičku '0' ili logičku '1'. Pinovi Porta A su direktno su stalno povezani na konektor sa prekidačima SW-CN5, s obzirom da se radi o kontrolišućim pinovima. Ukoliko pin nekog porta nije povezan pre priključivanja napajnja, njegovo stanje biće identično stanju koje je definisano kao početno u kodu u mikroc-u Pre priključivanja napajanja, na potenciometru AC/DC adaptera treba izabrati 7.5V nestabilisano. Slika 10-4. Mapa programske memorije mikrokontrolera PIC16F877A 89