|  |  |
| --- | --- |
|  |  *See artikkel räägib mikrokontrollerite perekonnast; kompileerimise meetodi kohta vaata Positsioonist sõltumatu kood* |

---

16-bitine PIC24 mikrokontroller joonlaua kõrval
**PIC** on RISC tüüpi käsustikuga mikrokontroller, mida arendab firma Microchip Technology. Tänapäeval mõistetakse lühendi all tavaliselt ingliskeelset nimetust "Peripheral Interface Controller", kuid algselt tähendas see "Programmable Interface Controller" ning vahepeal ka "Programmable Intelligent Computer". Esimene PIC mudel oli tegelikult PIC1650, mille töötas välja firma General Instruments. Osakond, mis selle välja arendas, eraldus aga hiljem ning sai iseseisvaks firmaks nimega Microchip Technology.

PIC on tänapäeval laialt kasutuses nii tööstustoodetes kui ka hobi korras mikrokontrolleritega tegelevate inimeste poolt. Põhjuseks on madal hind, suur kasutaja arv ja palju arendustööriistu, millega lihtsalt PIC arhitektuurile tarkvara saab luua.

Ülesehitus
----------

PIC on Harvardi arhitektuuriga mikrokontroller, mis tähendab, et kood ja andmed on eraldatud erinevatesse mäludesse. Ainsaks erandiks on 32-bitised PIC mikrokontrollerid, kus kood ja andmed on samas mälus ning mis kasutavad Von Neumanni arhitektuuri. Kuna PIC on RISC tüüpi käsustikuga, siis üksikud käsud teevad korraga vähe muutusi. Seetõttu on sellel kõikide käskude suurus baitides alati sama ning suurema osa käskude täitmiseks kulub enamasti üks tsükkel, välja arvatud käskude puhul, mis muudavad järgmise tõlgendatava käsu asukohta, näiteks hüppekäskude puhul.

PIC kasutab ühte vaheregistrit W0, mis osaleb väga paljudes erinevates käskudes automaatselt ning mida ei saa asendada käsus teise registriga. Kõik RAM piirkonnad on tegelikult nagu registrid, mida saab kasutada käskudes nii sisendi kui väljundi jaoks. Isegi riistvara kontrollimise registrid on paigutatud andmemälu piirkonda. Varasematel PIC versioonidel sai andmepiirkonnast korraga adresseerida ainult väikest osa ehk 256 baiti. Erinevate 256 baidi suuruste mälupiirkondade vahel vahetamiseks pidi muutma spetsiaalset staatuse registrit.

PIC pinu, kus hoitakse funktsioonide väljakutsumisahela talletamiseks tagasipöördumisaadresse, on riistvaraline ning asub eraldi andmemälust. Kuna PIC seeriani 18 ei olnud võimalik käskudega riistvaralist pinu otse muuta ega lugeda, kuid alates seeriast 18 on see võimalik.

Kõik PIC mikrokontollerid käsitlevad ja adresseerivad andmeid 8-bitiste tükkidena. Koodimälus ei pruugi aga sama olukord olla, kuna erinevatel seeriatel on ühe käsu suurus bittides erinev, näiteks leidub 12-bitiste ja 14-bitiste käskudega mudeleid. PIC18 seerias on ühe käsu suurus 16 bitti.

PIC-del on riistvaraline pinu, milles hoitakse tagasipöördumisaadresse. Riistvaraline pinu ei ole varasematel PIC seadmetel tarkvaraliselt kättesaadav, kui 18 seeria seadmetel on selle jaoks võimalused olemas. Riistvaraline tugi parameetrite talletamiseks pinus puudus varasemates seeriates, kuid seerias 18 on seda parandatud, mistõttu 18 seeria sobib paremini kõrge astme kompilaatorite jaoks kui varasemad seeriad.

### Andmemälu

Andmemälu ja registrite mälu on PIC puhul sünonüümid. Isegi spetsiaalse eesmärgiga registrid on paigutatud andmepiirkonda. Mälu adresseerimise viis oleneb PIC seeriast. Varasematel oli mälu jagatud 256 baidi suurusteks piirkondadeks, mille vahel vahetamiseks pidi muutma ühe registri väärtust. Ainuke register, mis ei asu tavaliselt põhimälus, on vaheregister W, mille abil on seega võimalik liigutada andmeid ühest adresseerimispiirkonnast teise. Hilisemates seeriates lisati käsud, millega sai liigutada andmeid otse ühest piirkonnast teise.

Isegi erinevate mälupiirkondade kasutamisel oli mälu hulk väga piiratud. PIC16 seeria puhul oli staatuse registris piirkonna määramiseks vaid 2 bitti, mis tähendab, et see toetas ainult kuni nelja piirkonda, mis tähendas, et maksimaalselt sai kasutada ainult 1 kilobaiti mälu.

Alates seeriast 18 olid olemas spetsiaalsed registrid FSR ja INDF. FSR sisaldas tegelikku asukohta, mida INDF registri lugemisel ja kirjutamisel tegelikult kasutati. Hiljem lisati juurde veel võimalus FSR poolt viidatud asukohta ühe registri võrra suurendada või vähendada, mis lihtsustas oluliselt järjestikku asetsevate andmetega töötamist.

Väline mälu, mis ei asu mikrokontrolleri sees, ei ole tavaliselt otse käskudega otse adresseeritav, välja arvatud mõnede seeria 18 mudelitel.

### Koodimälu

Koodimälu on tavaliselt realiseeritud kui ROM-, EPROM-, EEPROM- või flash-ROM-mäluna. ROM-mälu puhul ei olnud koodimälu vajadusel võimalik üle kirjutada ning ei sobinud seega arenduskomplektide jaoks. EPROM küll parandas olukorda, kuid mälu ülekirjutamine oli siiski tülikas, kuna selleks pidi eelnevalt rakendama UV-kiirgust. Alles EEPROM võimaldas elektriliselt andmeid kustutada. Tänapäeval on väga palju kasutusel aga just flash-ROM.

8-bitistel PIC mikrokontrolleritel on koodimälu võimalik otse adresseerida ainult PIC17 ja mõnedel PIC18 mudelitel. Hilisematel on see juba võimalik ning 32-bitistel asub koodimälu juba andmemäluga koos.

### Käsustik

PIC-de käsustiku suurus varieerub sõltuvalt PIC mudelist 35 käsust 80 käsuni. Käsustik sisaldab käske registrite peal operatsioonide tegemiseks, vaheregistrite (ingl. k accumulator) kasutamiseks ning programmi võrdluste ja nende tulemuste põhjal koodis hüpete tegemiseks.

Mõnda käsku, näiteks bittide muutmist ja testimist, saab teha suvalise adresseeritava registri peal, kuid mitme parameetriga käsud kasutavad alati vaheregistrit W, kus W on alati kas sisendiks, väljundiks või mõlemaks. W (mõnel seerial on mitu W registrit) on ainus register, mis ei asu seadme põhimälus. W registrisse peab näiteks sisestama kõik konstandid, enne kui neid saab teistesse registritesse ümber tõsta.

PIC käsustik jaguneb umbes järgmiselt :

* Andmete ülekande käsud, mille abil saab liigutada andmeid ühest registrist teise või siis registrist vaheregistrisse W või vastupidi.
* Aritmeetilised ja loogika käsud, mille abil saab teha matemaatilisi tehteid ja loogilisi võrdlusi.
* Tehted kindlate bittidega, mille abil saab teatud biti väärtust muuta (BCF ja BSF).
* Hüppefunktsioonid, mis võivad kasutada pinu või mitte ja sõltuda eelmiste käskude tulemustest.

### Jõudlus

Arhitektuuri ülesehitus on suunatud jõudluse ja hinna suhte maksimeerimisele. PIC arhitektuur on siiani üks lihtsamaid ja odavamaid. Harvardi arhitektuur, mida PIC kasutab ning kus kood ja andmed asuvad eraldi mäludes, lihtsustab oluliselt mikroskeemi ülesehitust ning seetõttu võimaldab väga madala hinna ja elektritarbe juures suhteliselt suurt taktsagedust.

Aeg katkestuste tekkimise ja nende täideviimise alustamise vahel on täpselt kolm tsüklit. Välised katkestused peavad olema sünkroonitud protsessori neljataktilise käskude tsükliga, kuid sisemised on automaatselt sünkroonitud. Katkestuse alustuseks olev konstantne aeg võimaldab katkestuste abil loodud taimeritel olla alati ühtlase intervalliga. See küll ei kehti kõige uuemate PIC seeriate puhul, kus katkestuste pikkus võib varieeruda.

Ajalugu
-------

Mitmed varasemad EPROM PIC mikrokontrollerid
Algse PIC mikrokontrolleri ehitas 1975. aastal General Instruments. Esimene PIC ei olnud mõeldud iseseisvaks protsessoriks, vaid seda kasutati selleks, et mõned sisend-väljund operatsioonid nende 16-bitisest põhiprotsessorist CP1600 ümber tõsta, kuna CP1600 oli just nendes operatsioonides väga aeglane. Algselt oli lühendi PIC tähendus "Programmable Interface Controller", kuid üsna varsti vahetati see välja tähendusega "Programmable Intelligent Computer".

1989. aastal müüs General Instruments oma mikrokontrolleritega tegeleva osakonna maha ja see hakkas tegutsema nime Microchip Technology all. PIC oli üks vähestest projektidest, mida selleks ajaks polnud pooleli jäetud. Microchip langetas oluliselt PIC mikrokontrollerite müügihinda lootuses, et need võetakse laialt kasutusse ning see korvab hinnavahe. See taktika töötas ja Microchip hakkas üsna pea välja töötama üha uusi PIC variante.

1992. aastaks oli müügil juba kuus PIC varianti. Neli neist olid 12-bitiste käskudega, seeriast PIC16C5x. Müügil oli ka üks 14-bitiste käskudega mikrokontroller PIC16C71. See oli esimene mudel, mis sisaldas analoog-digitaalmuundurit ja võimalust kasutada katkestusi. Veel oli neil müügil üks 16-bitiste käskudega PIC17 seeria mudel PIC17C42, kuid kuna PIC17 seeria erines oluliselt varasematest, siis väga paljud ei läinudki PIC16 pealt üle PIC17 peale.

Põhiliselt müüdi küll ühekordselt kirjutatavaid PIC mudeleid, kuid müügiedu kasvatas väga oluliselt just see, et Microchip tõi müügile EEPROM-mäluga versiooni PIC16C84. Elektriliselt kustutatav mälu tegi arendajate töö palju lihtsamaks ja PIC kogus veelgi populaarsust, sest nüüd oli võimalik mikrokontrollerit lahti ühendamata koodimälu üle kirjutada.

Kuna tekkis vajadus 16-bitiste käskudega seeria järele ning PIC17 ei olnud eriti edukas, arendas Microchip välja uue seeria PIC18, mida nad tutvustasid aastal 2001. PIC18 seeria oli üles ehitatud nii, et PIC16 pealt üleminek oleks võimalikult lihtne ning see seeria osutus selle võrra edukamaks.

Varsti hakkas Microchip välja arendama ka reaalselt 16-bitiseid mikrokontrollereid. Sellised seeriad olid PIC24 ja dsPIC, kus tegelikult käskude pikkus oli 24 bitti. Kuigi erinevus eelmistest seeriatest oli väga suur, kuna 8-bitistelt mikrokontrolleritelt mindi üle 16-bitistele, üritas Microchip teha uued seeriad väliselt sarnase ehitusega.

2007. aastal tuli Microchip välja ka 32-bitiste PIC mikrokontrolleritega, mis suurendasid oluliselt taktsagedust, maksimaalset mälu suurust ning mille peal oli võimalik jooksutada koodi RAM-mälust.

Arendustarkvara
---------------

Microchip Technology pakub vabavaralist tarkvarakomplekti MPLAB, mis sisaldab tööriistu PIC peale tarkvara arendamiseks. Komplekt sisaldab assemblerit, linkerit, emulaatorit ja silurit. C kompilaator, mida Microchip PIC seadmetele pakub ning mis sobib kasutamiseks MPLAB komplektiga, on aga tasuline, kuigi on olemas katseversioon, mis töötab 60 päeva samamoodi kui tasuline, seejärel aga keeratakse kinni mõned koodi optimeerimised. Microchip pakub MPLAB kaubamärgi all kompilaatoreid seeriatele PIC18, PIC24, PIC32 ja dsPIC.

C kompilaatoreid PIC jaoks pakkus ka firma Hi-Tech Software, mis aga osteti Microchip Technology poolt 2009. aastal. Nüüdsest on Microchip kodulehel müügiks ka Hi-Tech poolt loodud kompilaatorid, mis katavad ära seeriad PIC10, PIC12, PIC16 ja PIC18.

Praegu ainus täielikult vabavaraline C kompilaator PIC mikrokontrollerite jaoks on SDCC, mis toetab mitut PIC seeriat. SDCC kasutab GPL litsentsi, seega on avatud lähtekoodiga.

Programmaatorid
---------------

Programmaatoreid kasutatakse selleks, et üle kirjutada mikrokontrolleri koodimälu. Suuremal osal hetkel müüdavatest PIC mikrokontrolleritest saab programmaatorit kasutada ka siis, kui see on elektroskeemi ühendatud. See aga ei olnud võimalik EPROM koodimälu kasutavatel PIC variantidel, seega pidi nendel mikrokontrolleri ümberprogrammeerimiseks elektroskeemist lahti ühendama. Lisaks koodimälu ülekirjutamisele kontrollivad programmaatorid tavaliselt ka seda, et koodimälust välja loetavad andmed vastaksid kirjutatud andmetele.

Programmaatoreid ja silumiseks mõeldud riistvara müüb Microchip ise, kuid ka kolmandad osapooled toodavad sarnaseid seadmeid. Lihtsamad programmaatorid, mille puhul koodimälu ülekirjutamiseks vajalik signaal tuleb otse arvutist, ühenduvad arvutiga tavaliselt jadavärati või paralleelvärati kaudu. Keerulisemad programmaatorid, mis saavad arvutilt ainult kirjutatavad andmed, kuid täpsemalt tegelevad koodimälu kirjutamisega ise, kasutavad mõnikord ka USB-liidest.

Mõned flash-ROM-i kasutavad PIC versioonid ei vaja ümberprogrammeerimiseks üldse eraldi riistvaralist programmaatorit. Seda meetodit kasutatakse tavaliselt arenduskomplektides ning see saavutatakse lisades koodimällu alglaaduri, mis on võimeline uut tarkvara koodimällu laadima ilma, et see iseennast ümber kirjutaks. See meetod on ka kõige kiirem viis koodimälus muudatuste tegemiseks ning võimaldab kirjutatud koodi kohe käivitada.

Silumine
--------

PIC-le kirjutatud koodi silumiseks on peamiselt kaks võimalust. Kuna PIC on palju väiksema jõudlusega kui tänapäeva PC arvutid, kasutatakse selle jaoks emulaatoreid, mis võivad töötada mitu korda kiiremini kui tegelik mikrokontroller ise. Silumise toega emulaatoreid on PIC mikrokontrolleritele tehtud mitmeid, mille hulgas on nii vabavaralisi kui ka tasulisi emulaatoreid.

Paljud PIC versioonid võimaldavad ka silumist reaalse riistvara peal, kasutades selleks spetsiaalset seadet, mille saab ühendada mikrokontrolleriga ning mis suhtleb protsessoriga spetsiaalse liidese kaudu, mis uuematele PIC-dele sisse on ehitatud. Riistvara peal silumisel aga on piiratud võimalused. Siluja kasutamisel ei ole võimalik muudel otstarvetel kasutada mitmeid sisendiks ja väljundiks mõeldud radasid ja mõningaid mikrokiibi võimalusi ei pruugi üldse silujaga koos kasutada saada.

Eelised ja puudused
-------------------

PIC arhitektuuri on tihti väga mugav kasutusele võtta selle lihtsuse tõttu. Seesama omadus aga tekitab piiranguid, mis mõneks otstarbeks PIC kasutamise ka keerulisemaks teevad. Peamised PIC eelised on järgmised:

* Käsustik on suhteliselt väike ja koosneb lihtsatest käskudest (RISC arhitektuur).
* Sisemise ostsillaatori sagedust on võimalik muuta.
* On olemas lihtsalt kasutatavad tööriistad PIC tarkvara arenduseks ja silumiseks.
* PIC mikrokontrollerid on suhteliselt odavad.
* On loodud palju liideseid, mille kaudu saab mikrokontrolleriga suhelda.

Kõige olulisemad piirangud PIC puhul on järgmised:

* Paljudel seeriatel on ainult üks vaheregister.
* Erinevate mälupiirkondade kasutamiseks tuleb nende vahel vahetada spetsiaalse registri väärtuse muutmise kaudu.
* Paljud käsud töötavad ainult kindlat tüüpi sisendi ja väljundiga. Mõned töötavad ainult konstantidega, mõned registritega ja mõned vaheregistriga, aga üldiselt mitte kõigi nendega.

PIC18 seeria on mõningate varasematel seeriatel leiduvate piirangutega seoses teinud muutusi. Näiteks on riistvaraline pinu adresseeritav. Samuti on PIC18 seeria mikrokontrolleritel lihtsam luua ka tarkvaraline pinu, mis annab arendajale veelgi suurema kontrolli seadme üle. Seega on selle seeria peal juba teoreetiliselt võimalik vahetada mitme tegumi vahel.

Viited
------

1. ↑  "PICmicro Family Tree", PIC16F Seminar Presentation
2. ↑  "PIC Microcontrollers – Chapter 9: Instruction Set".
3. ↑  "History of Microchip Technology". Originaali arhiivikoopia seisuga 12. detsember 2009. Vaadatud 27. novembril 2011.

| * v
* r
Mikrokontrollerid |
| --- |
| Arhitektuurid | 
8051 • ARM • AVR • PIC • C166 • TriCore |
| Perekonnad | 

|  |  |
| --- | --- |
| 4-bitised | 
TLCS-47 |
| 8-bitised | 
AVR • PIC • COP8 • MCS-48 • MCS-51 • Z8 • eZ80 • HC08 • HC11 • H8 • PSoC • TLCS-870 • XC800 |
| 16-bitised | 
C166 • CR16/CR16C • H8 • MSP430 • PIC • R8C • TLCS-900 • XC 2000 • XE166 |
| 32-bitised | 
Am29000 • CRX • FR • FR-V • H8SX • MPC5xx • PIC32 • TLCS-900 • TriCore • Infineon XMC4000 • Infineon AURIX • V850 • ARM |

 |
| Tarkvara | 
gpsim • Atmel Studio • dfu-programmer • FLIP |
| Vaata ka | 
Arduino • Manussüsteem • FPGA • Programmeeritav loogikakontroller |