58
Univerzitet u Nišu Elektronski fakultet Katedra za elektroniku MIKROKONTROLERI Jun 2013 Prijem impulsno - širinski modulisane TV komande pomoću mikrokontrolera _______________________________________________________ ___________

TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

Embed Size (px)

Citation preview

Page 1: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

Univerzitet u Nišu Elektronski fakultetKatedra za elektroniku

MIKROKONTROLERIJun 2013

Prijem impulsno - širinski modulisane TV komande pomoću mikrokontrolera__________________________________________________________________

Profesor: Student:Prof. dr Branislav Petrović Predrag Nedeljković 13000

Page 2: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

1. UVOD

U realnom svetu, mikrokontroleri nas svuda okružuju. Oni su prisutni u svim aplikacijama počev od kućne elektronike pa do najsofisticiranijih uređaja u oblasti profesionalne elektronike, automatske kontrole i robotike. Prijem TV komande je samo jedna od oblasti primene mikrokotrolera. Ova primena mikrokontrolera zasniva se na upotrebi mikrokontrolera kod predaje kao automata koji generiše predajnu sekvencu impulsa u zavisnosti od pritisnutog tastera, a takođe i kod prijema generisane sekvence. Ovde je potrebno izvršiti izvesnu sinhronizaciju u pogledu komuniciranja u vremenskom domenu i sinhronizaciji na nivou frejma. Nadalje u tekstu, mi ćemo se zadržati na ulozi kontrolera kao prijemnika.

Kao sto smo malo ranije napomenuli mikrokontroler se koristi za prijem TV komande. Kao generator kontrolnog TV signala na izvorištu koristi se koristi se PCM predajnik za daljinsku kontrolu koji sa odredištem komunicira preko LED diode koja daje svetlosne impulse određene talasne dužine i u određenim vremenskim trenucima koji su generisani od strane predajnika. Kao predajnik izabran je PCM predajnik M710LB1 firme SGS-THOMSON Microelectronics. Za ovakve aplikacije obično se koristi par prijemnik-predajnik (koder - dekoder). Međutim, mi se nismo odlučili za ovaj pristup već smo se odučili za pristup emuliranja prijemnika. Drugim rečima, mikrokontroler uz sebe nema dekoder koji je usklađen sa predajnikom i koji mu daje poslatu informaciju u serijskom ili paralelnom obliku, već on sam prima signal koji je kodiran na određen način (signal je impulsno kodiran u nasem slučaju) i dekodira ga u skladu sa informacijom koja je poslata od strane predajnika. Informacija se prima preko IR senzora.

Zbog toga što se pomoću mikrokontrolera ne prima dekodirana informacija, veoma je bitno znati sve parametre predaje, pre svega način sinhronizacije i način slanja informacije. Ovo podrazumeva poznavanje algoritma rada predajnika. Da bismo objasnili princip prijema TV komande pomoću mikrokontrolera mi ćemo najpre objasniti princip rada predajnika, a nakon toga ćemo objasniti sam princip prijema. Dakle, naša naredna celina biće posvećena M710LB1 PCM predajniku za daljinsku kontrolu firme SGS-THOMSON Microelectronics. Posebno će pažnja biti posvećena frejmu koji se šalje od strane predajnika.

1.1 Opis kola M710LB1

Ovo kolo razvijeno je za daljinsku kontrolu u korisničkim aplikacijama (TV, radio, video rekorderi) kao i apliacija za potrebe razvoja na polju industrije. Koristi visokopouzdan transmisioni kod koji ima kapacitet od 1024 kanala (64 komande x 16 adresa). Svaka predajna reč sastoji se od 4 adresna bita koji specificiraju adresu i 6 bitova kojima se specificira komanda. Jedna komanda (prva - 000000) koristi se za “kraj transmisije” kada se dugme otpusti. Njima su dodati i dodatni birovi koji se predaju u cilju sinhronizacije predajnika i prijemnika i za proveru sigurnosti predaje. Organizacija adresa omogućava širok opseg simultanih aplikacija bez međusobne interferencije sistema. Prijemnik prihvata i dekodiranu komandu jedino ako se ona poklapa sa adresom koja je selektovana u samom prijemniku. 16 adresa je dostupno za ovu namenu.

2

Page 3: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Referentni oscilator je kontrolisan keramičkim čip LC rezonatorom. Korisniku su dostupna dva predajna moda: Flash i Carrier. Kolo je dostupno u 28-pinskom DIL kućištu. Na slikama 1.1 i 1.2 dati su pinout i način izbora adrese i komande, respektivno.

1.1 Pinout M710LB1 1.2 Selekcija adrese i način izbora komande

Za naše dalje izlaganje nisu bitni električni parametri kola niti jedan drugi parametar, jer se suštinski ne bavimo projektovanjem hardvera predajnika. Međutim, ono što je nama bitno jeste organizacija adresa i komandi. Ona je data u tabelama 1.1 i 1.2.

Tabela 1.1 Organizacija adresa i komandi kola M710LB1

3

Page 4: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Tabela 1.2 Nastavak tabele 1.1

Opis funkcije kola

Kolo predaje signal pomoću infracrvene svetlosti koristeći impulsno kodnu modulaciju. Svaka reč se sastoji od 12 bitova. Binarna informacija bita određena je vremenskim intervalom između 2 impulsa. Ako je T vremenska baza, ovi bitovi se kodiraju kao na slici pored.

Različit kod za svaku parnu i neparnu jedinicu poboljšava mogućnost prepoznavanja pogrešnih kodova. Na primer greška može prouzrokovati promenu 10 na 01 što se vrlo lako detektuje.

Dodatno, bit parnosti je dodat takođe da bi se povećala pouzdanost transmisije. Ovaj bit je 1 ako je broj predatih jedinica paran dok je 0 ako je taj broj neparan.

Kao dodatak prethodnom, svaka reč sadrži preliminarni impuls, startni impuls i stop impuls. Razmak između preliminarnog i startnog impulsa je 4T. Ovo je posle 1T praćeno sa 11 impulsa podatka (jedan bit parnosti) i zvršava se posle 4T intervala sa stop impulsom.

4

Page 5: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Posledica prethodno rečenog je da se reč u kojoj se binarna 0 ponavlja deset puta ima ukupno trajanje od 21T. Reč koja sadrži sve jedinice ima ukupno trajanje 36T. Na slici 1.3 dat je primer poslate reči.

Slika 1.3 Primer poslate reči

Sinhronizacija između prijemnika i predajnika

Predajnik i prijemnik mogu raditi sa različitim referentnim frekvencijama. Tipične vrednostu frekvencije kristalnog čip rezonatora koje su odgovarajuće sistemu mogu biti između 440 i 550 kHz.

Sinhronizacija između prijemnika i predajnika neophodna je da se pokrije širok opseg tolerancija frekvencije koja je prethodno navedena, u prijemniku postiže se merenjem vremenskog intervala između preliminarnog i startnog impulsa, pamćenjem te vrednosti i njenim korišćenjem kao vremenske baze T.

Pritisak na jedan od tastera koji je konektovan na odgovarajuće pinove kola (slika 1.2) mora biti najmanje dug 25ms. Višestruk pritisak tastera istovremeno se ne prihvata. Komandna informacija se šalje repetitivno u intervalima od 102ms sve dok je taster pritisnut. Kada se kontakt prekine, kolo posle 18ms šalje „reč end of transmision“ i vraća se u standby mod. Ukoliko se kontakt prekine u toku slanja komande kolo nastavlja da šalje do kraja. Nakon pauze od 18ms ono šalje „end of transmission“ kod.Funkcija prijemnika zavisna od dužine od pritiska na taster data je na slici 1.4.

Slika 1.4. Funkcija prijemnika zavisna od dužine pritiska na taster

Transmisioni mod

5

Page 6: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

M710LB1 može operisati u dva transmisiona moda - Fleš i Carrier (koja su data na slikama 1.5 i 1.6 respektivno).

Slika 1.5 Fleš mod

Slika 1.6 Carrier mod

Adresne i komandne informacije

Informacije o adresi i komandi šalje na način koji je prikazan na slici 1.7. Na istoj slici dat je kod koji se šalje u zavisnosti od toga kako su odgovarajući pinovi spojeni na odgovarajući masu ili napajanje.

Slika 1.7. Način kodiranja adresne informacije i predajni frejm

6

Page 7: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

2. PRIJEM KOMANDE SA M710LB1 POMOĆU MIKROKONTROLERA PIC18F45K22

U prethodnom poglavlju detaljno je opisan postupak slanja TV komande pomoću PCM predajnika za daljinsku kontrolu. Takođe, videli smo kako se pomoću istog vrši sinhronizacija na nivou frejma. Drugim rečima, videli smo kako treba sinhronizovati prijemnik da bi bio spreman da prihvati komandu poslatu od strane predajnika. Pored ovoga, videli smo organizaciju reči koja se šalje pomoću PCM predajnika.

Na bazi prethodno rečenog, napravili smo firmver koji emulira funkciju prijemnika TV komande a sam princip pisanja firmvera objasnićemo nešto kasnije. Pored ovoga biće dat pregled registara mikrokontrolera PIC18F45k22 koji se koristi u sistemu. Takođe, biće data šema realizacije razvojnog sistema koji je realizovan od strane autora teksta na Elektronskom fakultetu, kao i lejaut dizajn projektovanog sistema u softverskom paketu Altim Summer designer 2009.

2.1 Princip prijema komande pomoću mikrokontrolera PIC18F45K22

Princip prijema TV komande pomoću mikrokontrolera PIC18F45k22 nije jedinstven i zavsan je od projektanta embedded sistema. Mi smo se ovde opredelili za jedan od principa, a u tekstu koji sledi objasnićemo ovaj princip.

Prvi korak u celoj priči nakon izbora moda rada PCM predajnika je proglasavanje pina na koji je vezan IR senzor, kao ulaznog pina kojim se prihvata komanda. Ovaj pin se takođe bira (saglasno sa našim konceptom) takod da bude izvor eksternog prekida. Izabrani mod predajnika za koji je rađen fimrver prijemnik je fleš mod. Princip je sledeći: Dolaskom preliminarnog impulsa na pin eksternog prekida, generiše se interapt koji prekida tekuću rutinu procesora. Zatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i meri vreme od dolaska preliminarnog impulsa do dolaska start impulsa (slika 1.3). U okviru iste rutine zabranjuje se eksterni prekid sve do trenutka kada je cela poruka primljena. Tajmer treba podesiti tako da se obezbedi sto veća rezolucija odmeravanja signala sa kako bi dolazni impulsi bili sto valjano detektovani. Ovde se bira rezolucija od 5us koja je dovoljna da se detektuju dolazeći impulsi. Da bi se izvršila korektna sinhronizacija između prijemnika i predajnika ovo vreme treba da bude 4T – 400 us sa odstupanjem +/- 10% (slika 1.5).

Detektovanjem start impulsa ekstrahuje se informacija u proteklom vremenu od start impulsa i ukoliko je ono u granicama 4T +/-10% imamo informaciju da je poruka koja je detektovana poslata od strane predajnika sa kojim se vrši komunikacija a ne od strane nekog drugog sistema koji je slučajno upao u naš komunikacioni kanal i inicirao komunikaciju sa našim prijemnikom. Nadalje se sa ekstrahovanom periodom T vrši odmeravanje signala na pinu eksternog interapta. Ceo postupak se izvršava u prekidnoj rutini tajmera 1.

7

Page 8: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Kada je start impuls detektovan, i kada je ekstrahovana perioda semplovanja T, nakon isteka vremena periode T proverava se da li je dosao impuls sinhronizacije. Ako jeste, onda su sistemi korektno sinhronizovani i tada čega sledi prijem frejma. U skladu sa slikom 1.7, prvo se primaju 4 bita komande, 6 bitova adrese i bit parnosti.

U zavisnosti od pozicije bita u reči (frejmu) bitovi su kodirani na određen način. Ovo je objašnjeno u sekciji 1.1 ali da bismo pojasnili stvar mi ćemo ovo opet objasniti. Ako se na mestu bilo kog bita u frejmu nalazi nula, mikrokontroler je detektuje ako je nakon vremena T primi impuls. Ukoliko se na parnoj poziciji u reči nalazi bit 1, onda se on detektuje ako mikrokontroler nakon vremena 3T primi impuls, a ako se isti bit nalazi na neparnoj poziciji u reči on se detektuje prijemom impulsa nakon vremena 2T. Na ovom nivou mikrokontroler nije svestan ni adrese ni komande već se samo primaju bitovi. Bitovi se primaju sve dok se ne primi i poslednji bit – bit parnosti.

Trenutno tekst nećemo opterećivati dekodiranjem komande već ćemo se skoncetrisati samo na prijem. U nastavku, prvo ćemo dati najbitnije registre mikrokontrolera PIC18F45k22 a zatim ćemo dati kod i naglasiti preostle detalje.

2.2 Arhitektura mikrokontrolera PIC18F45K22

Ovo je visoko-performansni RISC mikrokontroler iz grupe familije PIC18F4xK22 Microchip -ovih mikrokontrolera koja poseduje:

- RISC procesorsko jezgro- Prošireni set instrukcija koji je opcion i dizajniran sa ciljem da se optimizuje re-enterant ulazni

kod- Do 1024 EEPROM memorije- Do 64KB kodne memorije- Do 3896 bajtova programske memorije- 16MIPS operacija- 16-bitnu dužinu instrukcije i 8-bitnu stazu podataka- Nivoe prioriteta prekida- 31- nivovski hardverski stek sa softverskim pristupom

Ostale karakteristike mikrokolera iz ove familije, među kojima i PIC18F45K22 date su u tabeli 2.1

Tabela 2.1 Karakteristike mikrokontrolera iz familije PIC18F4xk22, među njima i PIC18F45k22

8

Page 9: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Na slici 2.1 Dat je arhitekturni blok dijagram mikrokontrolera PIC18F45k22 koja prikazuje unutrašnju strukturu mikrokontrolera.

slika 2.1 Arhitekturni blok dijagram mikrokontrolera PIC18F45k22

9

Page 10: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Organizacija memorije mikrokontrolera

Arhitektura mikrokontrolera podrazumeva tri tipa memorije: Programska memorija RAM memorija za podatke EEPROM za podatke

Ovaj mikrokontroler je tipičan predstavnik Harvard arhitekture i od njega programska memorija i memorija za podatke koriste različite magistrale što omogućava istovremeni pristup dvama memorijskim prostorima. U praktičnim primenama, EEPROM za podatke može biti korišćen kao periferalni uređaj koji se može adresirati i kome se može pristupiti kroz set kontrolnih registara. Na slici 2.2 data je organizacija programske memorije.

U ovoj arhitekturi implemantiran je 21-bitni programski brojač (PC), koji može da adresira masksimalno 2M bita programskog memorijskog prostora. Pristup fizičkim lokacijama između maksimalne moguće i maksimalne implementirane vraća sve 0 (nop operaciju).

Mikrokontroler poseduje 2 interapt adrese. Vektorska adresa reseta je 0000h, dok su vektori adresa na koje se skače nakon interapta 0008h i 0018h.

Slika 2.2 Organizacija programske memorije mikrokontrolera PIC18F45K22

Organizacija programske memorije nam trenutno nije od preterano velikog značaja s obzirom da kod kod koji pišemo nije mašinski zavisan. Mašinski kod – asembler procesora generiše kompajler pa smo oslbođeni dubljeg poznavanja arhitekture. Naš posao je, međutim upoznati se sa registrima koji su nam od relevantnog značaja za projekat. Naime, naš projekat je baziran na određenim prekidima, pa ćemo zbog

10

Page 11: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

toga dati pregled relevantnih registara. Za nas najbitniji su prekidi eksternog interapta0 i tajmera1. U kodu koji će biti dat kasnije određene operacije dešavaju se sa prekidima serijske komunikacije i tajmera0 pa će zbog ovoga ce i njima pridruženi registri biti opisani ali sa malo manje detalja.

Prekidi mikrokontrolera

Mikrokontroler PIC18F45K22 ima više izvora prekida i osobinu dodeljivanja prioriteta izvorima prekida kojima može biti pridružen visok (IPH) ili nizak (IPL) prioritet (eksterni prekid INT0 ne poseduje bit prioriteta). Adresa na koju procesor skače kada se desi prekid visokog prioriteta je 0008h dok je za prekid visokog prioriteta ova adresa 0018h. Prekid sa visokim prioritetom istiskuje prekid sa niskim koji je tekući u datom trenutku.

19 registara se koristi za kontrolu prekida:

INTCON, INTCON2, INTCON3 – registri koje je moguće čitati i u njih vršiti upis i sadrže različite bitove dozvole, prioriteta i flegove.

PIR1, PIR2, PIR3, PIR4, PIR5 – sadrže individualne bitove za periferne prekide. PIE1, PIE2, PIE3, PIE4, PIE5 – sadrže bitove dozvole za periferne prekide. IPR1, IPR2, IPR3, IPR4, IPR5 – sadrže bitove prioriteta za svaki prekid RCON

Ukoliko registri za dodelu prioriteta prekidima nisu (INTCON2, INTCON3) podešeni tada mikrokontroler difoltno radi u kompatibilnom modu. U ovom modu mikrokontroler skače na jedinstvenu adresu 0008h (adresa prekida nižeg prioriteta) kada se javi prekid. Setovanjem PEIE/GIEL bita INTCON registra dozvoljavaju se periferni prekidi kada je setovan bit globalnog prekida GIE/GIEH. Resetovanjem PIE/GIE bita, zabranjuje se periferalni prekid procesoru. GIE/GIEH bit INTCON registra je bit kojim se vrši dozvola perifernih i svih ostalih prekida. Ako je setovan svi maskirani prekidi su omogućeni, dok se njegovim resetovanjem brane svi prekidi mikrokontrolera.

Iako u našem programu ne koristimo osobinu prioriteta prekida, mi ćemo staviti doznanja da se ona omogućava setovanjem IPEN bita RCON registra. Resetovanjem istog, zabranjujemo osobinu prioriteta prekida a mikrokontroler standardno radi u kompatibilnom modu. Kada je IPEN setovan, bitovi kojima se inače vrši globalna dozvola prekida (GIE) i dozvola perifernih prekida (PEIE) sada postaju bitovi za dozvolu višeg i nižeg nivoa prekida, respektivno.

Ukoliko je prioritet prekida uključen i ako je aktivna prekidna programska rutina nižeg nivoa, ako dođe prekid višeg nivoa procesoru, prekida se izvršenje prekidne putine nižeg nivoa, a ulazi se u rutinu prekida višeg nivoa. Obrnuta situacija nema efekta i ne dolazi do istiskivanja prekida višeg nivoa. Na slici 2.3 data je prekidna logika.

11

Page 12: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Slika 2.3 Prekidna logika

Registri mikrokontrolera

INTCON (engleski naziv Interrupt control register)

Prva dva bita ovog registra objašnjeni su kada je bilo reči o prekidima mikrokontrolera. TMR0IE i INT0IE su bitovi dozvole tejmera0 i eksternog prekida0, respektivno. Setovanjem ovih bitova dozvoljavaju se prekidi ovih periferija. Njihovim resetovanjem, ovi prekidi su zabranjeni. Niži nibl registra služi za detekciju prekida tajmera0, eksternog prekida itd.

PIR1(Peripheral interrupt1 request flag register1)

Ovaj registar sadrži flagove prekida serijske komunikacije, A/D konvertora, tajmera1 itd.

12

Page 13: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

PIE1(Peripheral interrupt enable flag register1)

Ovaj registar sadrži bitove dozvole perifernih prekida ADC-a, serijske komunikacije, tajmera 1 i 2 itd. Njihovim individualnim setovanjem dozvoljavaju se ovi periferalni prekidi. U suprotnom su zabranjeni.

Tajmer0 modul

Karakteristike tajmer0 modula: Softverski izbor rada u kao brojačkog-tajmerskog modula Registri sa mogućnošću upisa – čitanja Deljivi softverski 8-bitni preskaler Selektabilni izvor takta (utitrašnji – spoljašnji) Interrupt overflow

TCON: registar (timer0 control register)

TMR0ON: bit za on/off kontrolu rada tajmera 1 - dozvoljava rad tajmera 0 - dozvoljava rad tajmera

T08BIT: bit za selekciju 8/16 bitnog moda rada tajmera 1 – tajmer se konfiguriše za rad u 8-bitnom modu 0 - tajmer se konfiguriše za rad u 16-bitnom modu T0CS: bit izbora izvora takta 1 – takt se uzima sa T0CKI pina 0 - takt se uzima sa instrukcionog kloka

T0SE: bit izbora ivice okidanja 1 – tajmer se inkrementira pri tranziciji sa niskog na visoko 0 – inkrement pri tranziciji sa visokog na nisko

13

Page 14: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

PSA: bit pridruženja preskalera tajmer0 modulu 1 - tajmer 0 preskaler nije pridružen modulu. Klok tajmera zaobilazi preskaler 0 - tajmer 0 preskaler pridružen modulu. Ulaz kloka tajmera0 dolazi sa izlaza preskalera

T0PS<2:0>: Selekt bitovi preskalera tajmera0 111 = 1:256 podeljena vrednost 110 = 1:128 podeljena vrednost 101 = 1:64 podeljena vrednost 100 = 1:32 podeljena vrednost 011 = 1:16 podeljena vrednost 010 = 1:8 podeljena vrednost 001 = 1:4 podeljena vrednost 000 = 1:2 podeljena vrednost

Pošto smo objasnili kontrolni registar tajmera nula, bez posebnog objašnjenja na slikama 2.4 i 2.5 date su šeme operacije kada je tajmer konfigurisan za osmobitni i šesnaestobitni mod rada. Na ovim slikama princip rada je očigledan. Neophodno je dodati da se uz TCON registar podešavaju još 2 registra tajmera0. Ovo su registri TMR1H i TMR1L koji služe da se u njih upiše vreme koje je potrebno izmeriti i nakon kojeg se generiše prekid tajmera0. Ovi registri su osmobitni.

Slika 2.4 Kofiguracija tajmera0 u osmobitnom režimu

Slika 2.5 Kofiguracija tajmera0 u šesnaestobitnom režimu

14

Page 15: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Tajmer1/3/5/7 modul sa kontrolom gejtova

Tajmer1/3/5/7 je 16 – bitni tajmerski/brojački modul koji poseduje sledeće karakteristike:

16-bitni brojačko/tajmerski registarski par TMRxH/ TMRxL Programirljivi interni/eksterni izvor takta 2-bitni preskaler Deljivi sekundarni 32Khz izvor takta Višestruki izvor gejtovanja (dozvole brojanja) Prekid na overflow Buđenje na prekid (eksterni takt, jedino u asinhronom modu) 16-bitna read/write operacija Vremenska baza za capture/compare funkciju Specijalno okidanje događajem (sa CCP/ECCP) Selektabilni polaritet izvora gejtovanja Gate Toggle mod Gate Single-pulse mod Status vrednosti kod gejtovanja Gate Event prekid

Za nas, kao embedded programera veoma je bitno prvih osam karakteristika. Za lakše razumevanje rada ovog modula bitno je razumeti blok dijagram modula koji je dat na slici 2.6.

Slika 2.6 Blok dijagram tajmer1/3/5/7 modula Deo ovog mogula ima sličan princip rada kao i tamer0 modul. Međutim, razlika je u tome što je ovo 16-bitni modul kod koga se bira brojački – tajmerski mod rada, i što on poseduje kontrola gejtovanja. Ona nam trenutno nije od velikog značaja pa je nećemo opisivati već ćemo napomenuti da se ona podešava podešavanjem TGxCON registra. Difoltnim njegovim podesavanjem kada su u ovom registru sve nule,

15

Page 16: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

tajmer1/3/5/7 radi u standardnom modu bez kontrole gejtovanja jer je ovim ona isključena (TMRxGE bit u ovom registru je na nuli). Nadalje će biti objašnje kontrolni registar tajmera1/3/5/7.

TxCON (Timer1/3/5/7 control register)

TMRxCS<1:0>: Tajmer1/3/5/7 selekt bitovi za izbor izvora takta

11 - Rezervisano. Ne koristi se od strane programera.

10 - Tajmer1/3/5 pin izvora takta ili oscilatora :

Ako je TxSOSCEN = 0 eksterni takt je sa TxCKI pina

Ako je TxSOSCEN = 1 takt se ozima sa pinova oscilatora SOSCI/SOSCO

01 – izvor takta Tajmer1/3/5 je sistemski takt FOSC

00 - izvor takta Tajmer1/3/5 je sistemski takt FOSC/4

TxCKPS<1:0>: Selekt bitovi preskalera takta

11 = 1:8 podeljena vrednost 10 = 1:4 podeljena vrednost 01 = 1:2 podeljena vrednost 00 = 1:1 podeljena vrednost

TxSOSCEN: Kontrolni bit dozvole sekundarnog oscilatora

1 – deljeni sekundarni oscilator dozvoljen

0 - deljeni sekundarni oscilator zabranjen

TxSYNC : Kontrolni bit sinhronizacije sa eksternim ulazom takta

TMRxCS<1:0> = 1X

1 – nema sinhronizacije sa eksternim ulazom takta

0 - sinhronizacija sa sistemskim taktom FOSC

TxRD16: Bit dozvole 16-bitnog read/write moda rada

1 - dozvoljava se 16-bitni read/write u registre u jednom ciklusu

0 - dozvoljava se 16-bitni read/write u registre u dva ciklusa

TMRxON: bit dozvole rada tajmera

16

Page 17: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

1 – tajmer uključen

0 – tajmer isključen

2.3 Deo firmvera prijemnika TV komande baziran na mikrokontroleru 18F45K22 kojim se realizuje prijem komande

U ovom poglavlju ćemo opisati postupak prijema TV komande – komande sa PCM predajnika M710LB1. Kako smo već ranije opisali osnovni postupak prijema TV komande, ovde ćemo dati kod i na njemu konkretno objasniti sam postupak sa nešto više detalja.

void interrupt(){

// eksterni prekid if(INTCON.INT0IF == 1){ INTCON.INT0IF = 0; INTCON.INT0IE = 0; PIE1.TMR1IE = 1;

TMR1H = 0xFC; TMR1L = 0x17; T1CON.TMR1ON = 1; device_synchronized = 0; TMR0H = 0xF6; TMR0L = 0x89; T0CON.TMR0ON = 1; }

if(PIR1.TMR1IF == 1){ // prekid tajmera 1 PIR1.TMR1IF = 0; //resetuje se interapt fleg tajmera 1 PIE1.TMR1IE = 0; TMR1H = 0xFC; TMR1L = 0x17; T1CON.TMR1ON = 1; timing_counter++; if(T_ext_bit == 0){ // sinhronizacija komunikacije // u trenutku kada se primi preliminary impuls ukljucuje se tajmer koji // meri 400us sa maksimalnim odstupanjem +/- 10% if(((timing_counter >= 72) && (timing_counter <= 88))&& (IcsPin == 1)){ T_ext_bit = 1;

17

Page 18: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

ext_time = timing_counter; bit_period = timing_counter>>2; PrelPulseCounter = 0; timing_counter = 0; } }

if(start_bit == 0){ if((T_ext_bit == 1)&&(bit_period == timing_counter)&&(IcsPin == 1)){ Received_commandL = 0x00; Received_commandH = 0x00; device_synchronized = 1; start_bit = 1; BitDetectedCounter = 0; } }

if((device_synchronized == 1) && (bit_period == timing_counter)){ timing_counter = 0; if(start_bit == 1){

switch (BitDetectedCounter) { case 1: // prijem adresnog bita 1 if(IcsPin == 1){ Received_commandL|=0x00; BitDetectedCounter++; }

else if((PulseDetectedCounter == 2)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandL|=0x80; BitDetectedCounter++; } else PulseDetectedCounter++; break;

case 2: // prijem adresnog bita 2 if(IcsPin == 1){ Received_commandL|=0x00; BitDetectedCounter++; }

else if((PulseDetectedCounter == 3)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandL|=0x40;

18

Page 19: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

BitDetectedCounter++; } else PulseDetectedCounter++; break;

case 3: // prijem adresnog bita 3 if(IcsPin == 1){ Received_commandL|=0x00; BitDetectedCounter++; }

else if((PulseDetectedCounter == 2)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandL|=0x20; BitDetectedCounter++; } else PulseDetectedCounter++; break; case 4: // prijem adresnog bita 4 if(IcsPin == 1){ Received_commandL|=0x00; BitDetectedCounter++; }

else if((PulseDetectedCounter == 3)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandL|=0x10; BitDetectedCounter++; } else PulseDetectedCounter++; break;

case 5: // prijem komandnog bita 1 if(IcsPin == 1){ Received_commandL|=0x00; BitDetectedCounter++; } else if((PulseDetectedCounter == 2)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandL|=0x08; BitDetectedCounter++; } else

19

Page 20: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

PulseDetectedCounter++; break;

case 6: // prijem komandnog bita 2 if(IcsPin == 1){ Received_commandL|=0x00; BitDetectedCounter++; }

else if((PulseDetectedCounter == 3)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandL|=0x04; BitDetectedCounter++; } else PulseDetectedCounter++; break;

case 7: // prijem komandnog bita 3 if(IcsPin == 1){ Received_commandL|=0x00; BitDetectedCounter++; }

else if((PulseDetectedCounter == 2)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandL|=0x02; BitDetectedCounter++; } else PulseDetectedCounter++; break;

case 8: // prijem komandnog bita 4 if(IcsPin == 1){ Received_commandL|=0x00; BitDetectedCounter++; }

else if((PulseDetectedCounter == 3)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandL|=0x01; BitDetectedCounter++; } else PulseDetectedCounter = 0; break;

20

Page 21: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

case 9: // prijem komandnog bita 5 if(IcsPin == 1){ Received_commandH|=0x00; BitDetectedCounter++; }

else if((PulseDetectedCounter == 2)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandH|=0x80; BitDetectedCounter++; } else PulseDetectedCounter++; break;

case 10: // prijem komandnog bita 6 if(IcsPin == 1){ Received_commandH|=0x00; BitDetectedCounter++; }

else if((PulseDetectedCounter == 3)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandH|=0x40; BitDetectedCounter++; } else PulseDetectedCounter++; break;

case 11: // prijem parity bita if(IcsPin == 1){ Received_commandH|=0x00; BitDetectedCounter++; stop_bit = 1; device_synchronized = 0; }

else if((PulseDetectedCounter == 2)&&(IcsPin == 1)){ PulseDetectedCounter = 0; Received_commandH|=0x80; BitDetectedCounter++; stop_bit = 1; device_synchronized = 0; } else PulseDetectedCounter++; break;

21

Page 22: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

default: break; } }// if(start_bit == 1)

if((stop_bit == 1) && (timing_counter == ext_time)){ INTCON.INT0IE = 1; PIE1.TMR1IE = 1; command_marker = 1; } }// if(PIR1.TMR1IF == 1) { if(PIR1.RCIF == 1){ // prekid serijske komunikacije - prijem bajta uart_rd = RCREG1; FLAG1 = 1; PIE1.RCIE = 0; } if(INTCON.TMR0IF == 1){ T2marker = 1; }// if(INTCON.TMR0IF == 1){ }

}

U datom kodu, prijem komande zasnovan je na prekidu tajmera0 i eksternom prekidu a način obrade prekida nije zasniovan na prioritetu već je mikrokontroler programiran za rad u kompatibilnom modu. U kompatibilnom prekidnom modu procesoru se šalje jedinstveni prekid (slike 2.2 i 2.3). U tom trenutku mikrokontroler ulazi u funkciju interrupt(). Ova funkcija od strane mikroC kompajlera podržava rad sa prekidima, i implementira interapt servisnu logiku. U okviru nje sekvencijalno se ispituju prekidi. S obzirom da je kod više familija osmobitnih PIC mikrokontrolera izvor prekida jedinstven, kompajler je prilagođen tako da podrži ovakav način rada.

Zbog toga što procesor nije svestan koji se prekid dogodio, u finkciji interrupt() se ponaosob ispituju flagovi za svaki izvor prekida a prioritet prekida određen je pozicijom na kojoj se ti interapt flegovi ispituju. S obzirom da je u našoj aplikaciji sam dolazak komande najhitniji, kod nas se u okviru funkcije interrupt() najpre ispituje flag eksternog prekida. Pošto je dolazni signal impulsno kodno modulisan sa impulsima kratkog trajanja, naš kod je napisan tako da obezbeđuje preciznu vremensku rezoluciju kako dolazak impulsa ne bi bio propušten. Pošto perioda dolaznog signala sa kojom dolaze impulsi iznosi T=100 us +/-10%, mi smo se opredelili za rezoluciju ispitivanja stanja dolaznog signala od 5us. Ovo smo u kodu obezbedili tako što su TMR1H i TMR1L podešeni na vrednosti TMR1H = FC i TMR1L = 17, a kao mod rada tajmera izabran je 16-bitni sa upisom vrednosti u jednom instrukcionom ciklusu i vremenskom bazom koja je odgovara vremenskoj bazi eksternog kristalnog oscilatora od 20Mhz (50 ns).

22

Page 23: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Ovo je postignuto inicijalizaciom kontrolnog registra tajmera1 na T1CON = 0b01000110. Svo vreme imati u vidu prethodno dati kod.

Dolaskom preliminarnog impulsa komande na pin eksternog interapta0, generiše se prekid prema procesoru. Procesor tada ulazi u opsluživanje funkcije interrupt(). U okviru nje se najpre ispituje flag eksternog prekida koji ako je podignut označava procesoru da se taj prekid desio. Nakon što je ovaj flag podignut, on se resetuje a zatim se procesoru brani eksterni prekid resetovanjem njegovog bita dozvole INTCON.INT0IE. Zatim se dozvoljava se prekid tajmera1, vrši loadovanje startnih vrednosti tajmera1 u registre TMR1H i TMR1L, i startuje tajmer1. U okviru iste if naredbe inicijalizuje se promenljiva device_synchronized koja služi za sinhronizaciju u radu između prijemnika i predajnika.

Na svaki prekid tajmera1 (svakih 5ms) softverski resetujemo njegov interapt fleg, inicijalizujemo njegove registre na pomenute vrednosti i dozvoljavamo njegov rad, ali istovremeno branimo njegov prekid (da bismo se zaštitili od ponovnog preranog ulaska u rutinu obrade prekida i time poremetili dalji rad mikrokontrolera). Takođe na svaki prekid inkrementira se promenljiva timing_counter. Ova promenljiva služi za merenje periode T. Njenim inkrementiranjem i resetovanjem na određenom mestu dobijaju se dva relevantna vremenska parametra: vreme od dolaska preliminarnog bita do dolaska start bita tp, vreme periode T koje se direktno dobija iz tp. Sinhronizacija je izvršena na sledeći način:

Najpre se u rad pušta tajmer1 i na svaki njegov prekid inkrementira se promeniljiva timing_counter i istovremeno provarava da li je njena vrednost u intervalima 72 do 88 (timing_counter*5us = T +/- 10%) i status pina eksternog interapta (deklarisan je sa #define IcsPin PORTB.F0). Ukoliko je promenljiva timing_counter u ovim granicama i na Ics pinu nivo logičke jedinice, to znači da je stigao start_impuls. To znači da smo primili poruku koja je poslata sa našeg transmitera. U ovom trenutku dižemo T_ext_bit na logičku jedinicu. Zatim iz vremena koje je izmereno promenljivom timing_counter ekstrahujemo trajanje periode T koja služi kao baza sa kojom se primaju bitovi informacije. Ekstrakcija se vrši deljenjem vrednosti promenljive timing_counter sa 4 i njenim pamćenjem u promenljivu bit_period. Takođe, u novu promenljivu ext_time se prethodno smešta vrednost promenljive timing_counter. Ova promenljiva nam služi za merenje vremena između primljenog bita parnosti i stop impulsa i bitno je za označavanje kraja frejma. Osim toga vrednosti promenljiva PrelPulseCounter , timing_counter se u okviru ovog ispitivanja inicijalizuju na nulu. Funkciju promenljive PrelPulseCounter objasnićemo nešto kasnije.

Nakon opisanog postupka sledi provera korektne komunikacije. Ako je nakon vremena T na Ics pinu desi logička jedinica onda je sinhronizacija izvršena korektno ( if((T_ext_bit == 1)&&(bit_period == timing_counter)&&(IcsPin == 1)) ). U ovom trenutku inicijalizuju se vrednosti promenljiva Received_commandL i Received_commandH i BitDetectedCounter na vrednost 0 i setuju bit promenljive device_synchronized i start_bit (promenljiva koja kazuje da je primljen start impuls). Sada sledi primanje bitova komande.

Već ranije smo objašnjavali način kodiranja informacija. Ako je mikrokontroler primio jedan impuls za vreme T onda je to nula i on nije zavisan od pozicije bita 0 u frejmu. Ako konroler prima impuls posle isteka vremena 2T i ukoliko je prethodni bit bio paran onda on prima 1. Takođe, kontroler prima 1 ako je prethodni bit bio paran i ako je primljen impuls nakon 3T. Pozicija bita u frejmu je veoma bitna da bi se znalo šta se prima i kako bi na korektan način bile formirane promenljive koje služe za čuvanje primljene informacije(Received_commandL i Received_commandH).

23

Page 24: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Nakon što je promenljiva timing_counter odbrojila periodu T, i nakon što je proverena sinhronizacija prijemnika, u kodu se vrši prijem bitova informacija. Ovo se čini na način opisan u prethodnom pasusu. Sada ćemo to opisati kako je učinjeno u kodu. Pošto je primljen start bit, i odmerena perioda T, u kodu je primenjen koncept konačnog automata veoma slično njegovom opisu u VHDL-u. Logika je implementirana pomoću switch naredbe u okviru koje imamo odgovarajuća ispitivanja i ogleda se u sledećem: Promenljivom BitDetectedCounter kojom se broje detektovani bitovi, selektuje se bit informacije koji treba primiti. Onda se za dati bit ispita da li je posle vremena T primljen impuls i ako jeste onda je to logička nula. Ova logička nula se maskiranjem smesti u promenljivu Received_commandL i Received_commandH zavisno od njene pozicije u frejmu koji šalje predajnik. Međutim, ako posle T nije primljen impuls, onda znači da treba detektovati logičku jedinicu. Zavisno od uslova switcha (case1, case2…), ako je identifikator u okviru uslova paran onda znamo da impuls treba da dođe nakon 2T a, a ako je isti neparan znamo da treba impuls treba da dođe nakon 1T. Kao primer daćemo deo koda koji ovo implemntira da bi se stekao uvid u prethodno dati kod.

case 1: // prijem adresnog bita 1

if(IcsPin == 1){

Received_commandL|=0x00;

BitDetectedCounter++;

}

else if((PulseDetectedCounter == 2)&&(IcsPin == 1)){

PulseDetectedCounter = 0;

Received_commandL|=0x80;

BitDetectedCounter++;

}

else

PulseDetectedCounter++;

break;

case 2: // prijem adresnog bita 2

if(IcsPin == 1){

Received_commandL|=0x00;

BitDetectedCounter++;

24

Page 25: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

}

else if((PulseDetectedCounter == 3)&&(IcsPin == 1)){

PulseDetectedCounter = 0;

Received_commandL|=0x40;

BitDetectedCounter++;

}

else

PulseDetectedCounter++;

break;

Malo bliže objašnjenje koda. U slučaju case1 znamo da treba primiti neparan bit. Ako je na Ics pinu logička jedinica, primljeni bit je bit logičke nule. On se logičkom or naredbom pakuje u promenljivu Received_commandL. U okviru istog ispitivanja inkrementira se promenljiva BitDetectedCounter koja određuje naredni bit koji se prima. Ako na Ics pinu nije jedinica onda se ispituje da li je PulseDetectedCounter (promenljiva koja broji protekle periode T, i njena vrednost može da bude 2 ili 3 ako se prima neparni – parni bit informacije) jednaka 2 što znači da smo primili neparnu jedinicu. Ako njena vrednost nije 2 onda se ona inkrementira. Analogno pakovanju logičke 0 i logička jedinica se pakuje na sličan način na odgovarajuće mesto u promenljivoj Received_commandL. Na isti način funkcioniše i logika u okviru case2. Jedina razlika je ta što se u okviru drugog ispitivanja PulseDetectedCounter poredi sa 3. U slučaju case11 kada je primljen i 11- ti bit informacije (bit parnosti) resetuje se sinhronizacioni bit device_synchronized i setuje sinhronizacioni bit stop_bit. Sada treba odmeriti vreme između imulsa bita parnosti i stop impulsa koji označava kraj frejma. Ovo vreme iznosi 4T. Ovo vreme je identično vremenu koje je proteklo od detekcije preliminarnog i start impulsa. Na početku koda, na mestu gde je vršena sinhronizacija i određivana dužina periode T, sačuvana je i informacija o iznosu vremena 4T. Ta informacija se čuva u promenljivoj ext_time. Na samom kraju interapt rutine tajmera1 vrši se ispitivanje se ispituje da li je stop impuls detektovan. Ukoliko jeste vrednost promenljive timing_counter jednaka vrednosti promenljive ext_time, znači da je stop impuls detektovan i diže se flag command_marker koji označava da je poruka primljena.

2.4 Kod aplikacije koja realizuje prijem TV komande

U prethodnom poglavlju opisan je postupak prijema jednog frejma komande. Međutim, to ne znači i da je sama komanda primljena korektno. Prema opisu kola PCM predajnika daljinske komande koji je opisan u poglavlju 1.1, komanda je primljena tek kada se primi end of transmission kod. Ovo proističe iz izloženog o principu rada kola. On je sledeći: Kada korisnik šalje komandu pritiskom na dugme, predajnik repetitivno šalje komandnu reč u intervalu od 102ms (slika 1.4). U slučaju dužek pritiska na dugme, svakih 102ms predajnik opet repetitivno šalje komandnu reč. Kada se otpusti taster, nakon

25

Page 26: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

završetka repetitivnog slanja komandne reči predajnik čeka 18ms i šalje reč end of transmission koja označava da je poruka poslata. Ovde nećemo ulaziti u slojeve komunikacije OSI modela komuniciranja. Algoritam koji implementira ovu funkciju na c-u implementira se na sledeći način: U while(1) petlji vrši se ispitivanje da li je došla reč end_of_transmission. Sve dok se ova reč ne primi u 2 niza se smeštaju promenljive Received_commandL i Received_commandH. Kada se reč primi, onda se ispita svaka vrednost elemenata nizova. Ako se sve vrednosti međusobno podudaraju, onda je poruka primljena korektno i onda se ulazi u fazu dekodiranja komande. U nastavku će biti dat kod main() funkcije. U okviru nje vrši se više stvari sekvencijalno - ispituje se dolazak TV komande, dekodir ista, osvežava LCD displej. U nastavku će biti priložen kod main() funkcije.

void main(void){

Init();

while(1){

if(command_marker == 1){

command_marker = 0;

if(((Received_commandL&0xF0)==0x40)&&((Received_commandL&0x0F)==0x00)&&((Received_commandH& 0x00) == 0x00)){

while(counter_com >= 1){

if(command[counter_com] == command[counter_com - 1]) cflag = 1;

else {cflag = 0; cnt = 0;

}

if(addres[counter_com] == addres[counter_com - 1])rflag = 1;

else { rflag = 0; counter_com = 0;

}

cnt++;

} //for(cnt=1; cnt<=counter_com; cnt++){

if((cflag && rflag) == 1)checked_parity = CheckParityAndFormCommand(command[counter_com - 1],addres[counter_com - 1]);

if(checked_parity == 1){

26

Page 27: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

if(control(adress_byte, command_byte) == 0){

adresa = adress_byte & 0x3F;

komanda = 0x3F & komanda;

cnt = 0;

if(control(adresa, komanda)== 1){

predajni_bafer[1] = adresa;

predajni_bafer[2] = komanda;

UART_Write(0x39);

cnt++;

while(cnt<3){

if (UART_Tx_Idle() == 1) {

UART_Write(predajni_bafer[cnt]);

cnt++;

}

}

}

}

}

}

else {

command[counter_com]= Received_commandH;

addres[counter_com]= Received_commandL;

counter_com++;

}

}

27

Page 28: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

// opsluzivanja recieve interapta UARTA

if(FLAG1 == 1){

command_buffer[ReceiveCnt] = uart_rd;

if(ReceiveCnt == 2) {

ReceiveCnt = 0;

write = 1;

cb = 1;

}

else ReceiveCnt++;

reception = 0x31;

FLAG1 = 0;

PIE1.RCIE = 1;

blink (3);

}

if(cb == 1){

cb = 0;

blink (3);

DoDevices(command_buffer);

}

if(FLAG1 == 0){

RefreshLCD(counter);

LATA = 0xFE;

28

Page 29: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Delay_Ms(300);

LATA = 0x00;

counter++;

}

}

}

2.5 Pregled korišćenih funkcija u kodu

void Init(){

timing_counter = 0;

cnt = 0;

checked_parity = 0;

device_polled = 0,

RecAddres = 0;

CADDR = 0;

CCOMM = 0;

bit_period = 0;

counter_com = 0;

adresa = 0;

komanda = 0;

start_bit = 0;

stop_bit = 0;

ReceivedCommandBit = 0;

DecodedParityBit = 0;

29

Page 30: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Received_bit = 0,

match = 0;

check = 0;

SerialCommandRecieved = 0;

parity_bit = 0;

parity_flag = 0;

SampleAnotherBits = 0;

RecBit = 0;

TransBit = 0;

prel_pulse_detected = 0;

cflag = 0;

rflag = 0;

PrelPulseCounter = 0;

BitDetectedCounter = 0;

ParityCounter = 0;

PulseDetectedCounter = 0;

Received_commandL = 0;

Received_commandH = 0;

adress_byte = 0;

command_byte = 0;

ReceiveBuf = 0;

DecodeFinished = 0;

device1 = 0;

device2 = 0;

device3 = 0;

device4 = 0;

CA = 0;

CC = 0;

30

Page 31: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

start_bit_expect = 0;

device_synchronized = 0;

command_marker = 0;

T2marker = 0;

for(i=0; i<=3; i++){

pom_niz[i] = 0;

predajni_bafer[i] = 0;

}

for(i=0; i<=25; i++){

command[i] = 0;

addres[i] = 0;

}

ANSELA = 0;

TRISA = 0x00;

INTCON = 0b11110000;

T0CON = 0b00000111;

T1CON = 0b01000110;

PIE1.RCIE = 1;

Lcd_Init();

ANSELB = 0;

C1ON_bit = 0; // Disable comparators

C2ON_bit = 0;

ANSELC = 0;

ANSELD = 0;

TRISD = 0x00;

31

Page 32: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

LATD = 0; // Configure PORTC pins as digital

UART1_Init(9600); // Initialize UART module at 9600 bps

PORTD = 0x00;

Delay_ms(100);

}

void RefreshLCD(char counter_disp){

if(counter_disp == 1){

Lcd_Cmd(_LCD_CLEAR);

Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Out(1,2, txt1);

if(device1 == 1) Lcd_Out(2,1, txt2);

else Lcd_Out(2,1,txt3);

if(device2 == 1) Lcd_Out_Cp(txt2);

else Lcd_Out_Cp(txt3);

if(device3 == 1) Lcd_Out_Cp(txt2);

else Lcd_Out_Cp(txt3);

if(device4 == 1) Lcd_Out_Cp(txt2);

else Lcd_Out_Cp(txt3);

if(write == 1) {

32

Page 33: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

counter = 3;

write = 0;

}

Delay_Ms(300);

} //if(counter_disp == 1){

if(counter_disp == 2){

Lcd_Cmd(_LCD_CLEAR);

Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Out(1,1, txt4);

Lcd_Out(2,1, txt5);

Lcd_Chr_Cp(reception);

if(write == 1) {

counter = 3;

write = 0;

}

Delay_Ms(300);

reception = 0x30;

} // if(counter_disp == 2){

if(counter_disp == 3){

Lcd_Cmd(_LCD_CLEAR);

Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Out(1,1, txt4);

Lcd_Out(2,1, txt6);

33

Page 34: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Lcd_Chr_Cp(transmission);

if(write == 1) {

counter = 3;

write = 0;

}

Delay_Ms(500);

counter = 0;

}//if(counter_disp == 3){

if(Counter_disp == 4){

Lcd_Cmd(_LCD_CLEAR);

Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Out(1,1, txt4);

Lcd_Out(2,1, "COMPLETE MESSAGE");

Delay_Ms(500);

} //if(Counter_disp == 4){

if(Counter_disp == 5){

Lcd_Cmd(_LCD_CLEAR);

Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Out(1,1,"BUFFER CONTENT: ");

Lcd_Out(2,6,command_buffer);

Lcd_Out(2,9, " ");

Delay_Ms(500);

counter = 0;

} //if(Counter_disp == 5){

34

Page 35: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

}

void DoDevices(char *buf){

dk = buf;

ab = 0;

j=0;

while(*dk!=0x00){

pom_niz[j]=*dk;

j++;

dk++;

}

polling_byte = pom_niz[0];

RecAddres = pom_niz[1];

RecCommand = pom_niz[2];

if((polling_byte & 0x39) == 0x39){

if((RecAddres|0x34) == 0x34){

if((RecCommand | 0x31) == 0x31) {

if(Device1 == 1) {

Device1 = 0;

device1 = 0;

}

else {

35

Page 36: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Device1 = 1;

device1 = 1;

}

}

if((RecCommand|0x32)==0x32) {

if(Device2 == 1) {

Device2 = 0;

device2 = 0;

}

else {

Device2 = 1;

device2 = 1;

}

}

if((RecCommand|0x34)==0x34) {

if(Device3 == 1) {

Device3 = 0;

device3 = 0;

}

else {

Device3 = 1;

device3 = 1;

}

}

36

Page 37: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

if((RecCommand|0x38)== 0x38) {

if(Device4 == 1) {

Device4 = 0;

device4 = 0;

}

else {

Device4 = 1;

device4 = 1;

}

}

}

} //

}

char control(char RecAddres, char RecCommand){

char kom = 0;

if((RecAddres|0x34) == 0x34){

if((RecCommand | 0x33) == 0x33) {

if(Device1 == 1) {

Device1 = 0;

device1 = 0;

}

else {

Device1 = 1;

device1 = 1;

37

Page 38: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

}

}

if((RecCommand|0x32)==0x32) {

if(Device2 == 1) {

Device2 = 0;

device2 = 0;

}

else {

Device2 = 1;

device2 = 1;

}

}

if((RecCommand|0x31)==0x31) {

if(Device3 == 1) {

Device3 = 0;

device3 = 0;

}

else {

Device3 = 1;

device3 = 1;

}

}

if((RecCommand|0x30)== 0x30) {

if(Device4 == 1) {

38

Page 39: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Device4 = 0;

device4 = 0;

}

else {

Device4 = 1;

device4 = 1;

}

}

switch(RecCommand){

case 0x33:case 0x32: case 0x31:case 0x30: kom = 0; break;

case 0x34:case 0x35: case 0x36:case 0x37:case 0x38:case 0x39: kom = 1; break;

default: break;

}

}

else kom = 1;

return(kom);

}

void blink (char blink_count){

char k;

for(k = 0; i < blink_count; i++) {

PORTA.F0 = 1;

Delay_ms(75);

PORTA.F0 = 0;

Delay_ms(75);

39

Page 40: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

}

}

char CheckParityAndFormCommand(unsigned char Received_commandH,unsigned char Received_commandL){

/*

- funkcija prima frejm i formira bajtove komande i adrese

- takodje funkcija detektuje broj jedinica i vrsi proveru parnosti

- kada se detektuje jedinica, povecava se ParityCounter;

- ako je detektovan paran broj jedinica i ako je primljena 1-ca

na mestu bita parnosti, funkcija vraca 1 kao znak da je komanda primljena korektno

*/

ParityCounter = 0;

parity = 0;

match = 0;

if((Received_commandH & 0x02)== 0x02) parity = 1; // ekstrakcija bita parnosti

else parity = 0;

if((Received_commandH & 0x40)== 0x40){ // komandni bit 6

ParityCounter++;

command_byte = command_byte|0x20;

}

else command_byte = command_byte|0x00;

if((Received_commandH & 0x80) == 0x80){ // komandni bit 5

ParityCounter++;

40

Page 41: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

command_byte = command_byte|0x10;

}

else command_byte = command_byte|0x00;

if((Received_commandL & 0x01)== 0x01){ // komandni bit 4

ParityCounter++;

command_byte = command_byte|0x08;

}

else command_byte = command_byte|0x00;

if((Received_commandL & 0x02)== 0x02){ // komandni bit 3

ParityCounter++;

command_byte = command_byte|0x04;

}

else command_byte = command_byte|0x00;

if((Received_commandL & 0x20)== 0x04){ // komandni bit 2

ParityCounter++;

command_byte = command_byte|0x02;

}

else command_byte = command_byte|0x00;

if((Received_commandL & 0x10)== 0x08){ // komandni bit 1

ParityCounter++;

command_byte = command_byte|0x01;

}

else command_byte = command_byte|0x00;

41

Page 42: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

if((Received_commandL & 0x08)== 0x08){ // adresni bit 4

ParityCounter++;

adress_byte = adress_byte|0x08;

}

else adress_byte = adress_byte|0x00;

if((Received_commandL & 0x04)== 0x04){ // adresni bit 3

ParityCounter++;

adress_byte = adress_byte|0x04;

}

else adress_byte = adress_byte|0x00;

if((Received_commandL & 0x02)== 0x02){ // adresni bit 2

ParityCounter++;

adress_byte = adress_byte|0x02;

}

else adress_byte = adress_byte|0x00;

if((Received_commandL & 0x01)== 0x01){ // adresni bit 1

ParityCounter++;

adress_byte = adress_byte|0x01;

}

else adress_byte = adress_byte|0x00;

/* ispitivanje broja jedinica primljene komande;

- ako je broj jedinica paran, dize se flag DecodedParityBit

koji nam signalizira ovu situaciju;

- ako je broj jedinica neparan DecodedParityBit se resetuje

42

Page 43: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

*/

if(ParityCounter%2 == 0) DecodedParityBit = 1;

else DecodedParityBit = 0;

/* provera parnosti*/

if(DecodedParityBit == parity) match = 1;

else match = 0;

return(match);

}

3. RAZVOJNI SISTEM ZA DALJINSKU KONTROLU

43

Page 44: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

U prethodnim poglavljima smo se bavili principom prijema impulsno-širinski modulisane TV komande bez detalja koji su vezani za hardver. U ovom odeljku posvetićemo malo pažnje detaljima vezanim za hardver.

Cilj projekta bilo je projektovati sistem koji prima TV komandu i vrši on-off kontrolu uređaja. U predhodnom poglavlju dali smo softver koji je razvijen na mikrokontroleru PIC18F45k22. Mi smo međutim, iz specifičnih razloga rezvili hardver koji je baziran na mikrokontroleru PIC16F1516. Set registara ovog mikrokontorelra je sličan kao kod mikrokontrolera PIC18F45k22 sa tom razlikom što on nema registre koji su vezani za periferije koje ovaj mikrokontroler ne poseduje. Kod je međutim, bio koncepiran na uključivanju periferija koje oba mikrokontrolera sadrže, a razlog razvijanju softvera za PIC18F45k22 je razvojni sistem koji autor ovog seminarskog poseduje i što je na njemu razvio aplikaciju za ovaj mikrokontroler. Projektovanje hardvera zasnovano na PIC16F1516 je opravdano iz praktičnih razloga i zbog toga što je ckod u velikom mašinski nezavisan.

Ovaj razvojni sistem podržava rs232 i rs485 tip žičane komunikacije sa drugim računarima ili uređajima zasnovanim na mikrokontroleru. Takođe on poseduje 4 tiristorska izlaza koji su galvanski izolovani od mikrokontrolera upotrebljenom optokaplerskom izolacijom. Ovim izlazima vrši se on-off kontrola uređaja koji su tu priključeni. Takođe na sistemu imamo 16x2 LCD modul. Kod njega je podžano i ISP način programiranja – na samoj ploči postoji port za programiranje mikrokontrolera.

Galvanska izolacija pinova mikrokontrolera kojima se vrši on-off kontrola uređaja, i tiristora izvršena je optokaplerima sa tiristorskim izlazom MOC3023. Za svaki izlaz postoji po jedan optokapler. Ukljčivanje i isključivanje tiristora vrši se pomoću tranzistora BC547 koji je polarisan za rad u prekidačkom režimu. Prema datasheet-u napravljena je šema povezivanja tiristora na izlazu i optokaplera.

U pogledu komunikacije ploča ima 2 komunikaciona čipa kojima se vrši komunikacija sa računarom. Za rs485 komunikacije, na ploči je predviđen čip SN75176, dok je za rs232 komunikaciju koristi čip max232. Izlazi – ulazi ovih čipova su na određen način povezani na UART priključke mikrokontrolera i na ploči postoje 2 đžampera kojima se vrši izbor komunikacije. Bitna karakteristika ploče je da oba tipa komunikacije ne mogu da budu aktivna istovremeno. Drugim rečima, pozicija džampera određuje komunikacioni protokol koji je aktivan u sistemu.

U smislu debagiranja prigrama na mikrokontroleru, na ploči postoje 3 tastera i 2 led diode. One se takođe biraju pozicioniranjem džampera. Naime, zbog malog broja dostupnih pinova bilo je teško izvesti da veći broj tastera ili dioda kojima se vrši debaging jer se mikrokontroler istovremeno priključuje na LCD displej. Ovaj displej može da radi u paralelnom osmobitnom i u četvorobitnom modu. Mi smo dodavanjem džampera omogućili oba moda rada uz istovremeno omogućavaje ili onemogućavanje funkcije tastera u debaging modu.

Na ploči postoji i blok napajanja. Pošto mikrokontroler radi sa jednosmernim naponom od 5V, mi smo njegovo napajanje izveli sa linearnim stabilizatorom LM7805 koji sistemu daje struju od 2A. U nastavku je dat lejaut sistema.

44

Page 45: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

Slika 3.1 Top lejer sistema

Slika 3.2 Bottom lejer

45

Page 46: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

46

Page 47: TV command receiveres.elfak.ni.ac.rs/Seminar works MCU/Prijem inpulsno... · Web viewZatim, procesor ulaskom u rutinu obrade eksternog prekida podešava tajmer1, pušta ga u rad i

TV command receiver 2013

47