Mikrokontroler PIC16f628a
PIC (Peripheral Interface Controller) je družina mikrokontrolerjev proizvajalca Microchipa. V tej družini obstaja veliko mikrokontrolerjev z različnimi zmogljivostmi. Najenostavnejši so zgrajeni v 8-pinskem ohišju (ohišju z 8 nožicami, priključki), zmogljivejši pa so zgrajeni v 40-pinskem ohišju. Na enem integriranem vezju vsebujejo centralno procesno enoto (CPE), programski in podatkovni pomnilnik ter različne vhodno-izhodne naprave. Njihovo uporabnost določa program, ki ga vanje vpišemo. Pri programiranju bomo uporabili mikrokontroler PIC16F628A, zato moramo poznati njegove osnovne karakteristike.
Slika 1: Mikrokontroler PIC16f628a (vir: http://www.microchip.com/wwwproducts/en/PIC16F628A)
Njegove najpomembnejše značilnosti so:
Ima 16 vhodno-izhodnih pinov, ki jih lahko programsko krmilimo.
Napetost napajanja Vdd je 5 V.
Vsebuje 2 k programskega pomnilnika Flash, 224 bajtov pomnilnika RAM in 128 bajtov podatkovnega pomnilnika EEPROM.
Vsebuje časovnike TMR0, TMR1 in TMR2 in pozna 10 načinov sprožitev prekinitev.
Centralna procesna enota (CPE) je 8-bitna.
Maksimalna frekvenca zunanjega oscilatorja je 20 MHz.
Vsebuje notranja 4 MHz- in 48 kHz-oscilatorja.
Vsebuje dva analogna komparatorja.
Omogoča PWM (Pulse width modulation), pulzno širinsko modulacijo.
Pozna 35 instrukcij za programiranje v zbirnem jeziku.
Centralna procesna enota CPE izvaja instrukcije. Vgrajen ima 8-bitni delovni register, v katerega se shranjujejo podatki po izvedbi posameznih instrukcij.
Programski pomnilnik je sestavljen iz 2048 lokacij. V vsako lokacijo lahko vpišemo 14-bitni podatek. Instrukcija zavzame eno lokacijo. Posebno vlogo imata prva in peta lokacija. V prvi se nahaja instrukcija oziroma ukaz, ki se bo izvedel takoj po vklopu mikrokontrolerja. V peti se začne del programa, ki se izvede ob prekinitvi.
Podatkovni pomnilnik RAM je razdeljen na štiri banke: banko 0, banko 1, banko 2 in banko 3. Prvih 32 lokacij je namenjenih SFR-registrom (Special function registers), ki služijo za komuniciranje z ostalimi enotami mikrokontrolerja. Na naslednjih 96 lokacijah je 224 bajtov GPR-registrov (General purpose registers). Na zadnjih 16 lokacijah se GPR-registri prelivajo v vse štiri banke.
Opis osnovne vloge posameznih priključkov mikrokontrolerja PIC16F628A:
Slika 2: Oznake priključkov mikrokontrolerja PIC16F628A
OSC1 – vhod zunanjega kristalnega oscilatorja (določanje takta).
OSC2 – izhod zunanjega kristalnega oscilatorja.
MCLR – "master clear", ponastavitveni vhod (reset). Ponastavljamo s stanjem logične 0, delovanje programa v stanju logične 1.
RA0 do RA7 – vhodno-izhodni pini na porta.
RA4/T0CKI – pin je tipa "open drain". Pozna dve stanji: maso, kadar je pin v stanju logične 1, in veliko impedanco, ko je v stanju logične 0. Če vežemo svetlečo diodo med +5 V in pin RA4, se bo vklopila, če bomo ta pin postavili v stanje logične 0. Če pa vežemo svetlečo diodo med pin RA4 in maso, se ne bo nikoli vklopila. Pin RA4 lahko uporabimo za štetje impulzov s časovnikom TMR0.
RB0/INT – pin RB0 je lahko izbran za zunanji vir prekinitev. Lahko ga določimo kot vhodni ali kot izhodni pin mikrokontrolerja.
RB1 do RB7 – vhodno-izhodni pini. Pini RB4 do RB7 so lahko izbrani za zunanji vir prekinitev.
Vss – masa.
VDD – napetost napajanja +5 V.
Programski pomnilnik Flash:
Programski pomnilnik Flash uporabljamo za vpisovanje programa v mikrokontroler. Vanj lahko shranimo 2048 besed (word), dolgih 14 bitov od naslova 0000h do 07FFh. Vsebina programskega pomnilnika Flash se ne izbriše, če mikrokontrolerju izklopimo napajanje. Po podatkih proizvajalca se vsebina ohrani najmanj 40 let. Programski pomnilnik Flash omogoča večkratno vpisovanje programa, po podatkih proizvajalca do 100.000 vpisov. Ponastavitveni (reset) vektor se nahaja na naslovu 0000h, prekinitveni vektor pa na naslovu 0004h.
Slika 3: Programski pomnilnik Flash
Podatkovni pomnilnik RAM:
Podatkovni pomnilnik RAM (Random access memory) je razdeljen na štiri banke: banko 0, banko 1, banko 2 in banko 3. Vsaka banka ima 128 bajtov spominskega prostora. Vsebuje SFR- in GPR-registre. SFR-registri zavzemajo prvih 32 lokacij v vsaki banki. Preko njih komuniciramo z ostalimi enotami mikrokontrolerja. Na sliki 4 vidimo, da se nekateri SFR-registri in njihove vrednosti prelivajo v druge banke. Tako se na primer register PORTB iz banke 0 (naslov 06h) preliva z registrom PORTB v banki 2 (naslov 106h).
GPR-registri zavzemajo 224 bajtov podatkovnega pomnilnika RAM, od katerih se jih 16 bajtov na zadnjih lokacijah preliva v vse štiri banke. V banki 0 zavzemajo GPR-registri še 80 bajtov (od 20h do 6Fh), v banki 1 tudi 80 bajtov (od A0h do EFh), v banki 2 pa še 48 bajtov (od 120h do 14Fh) podatkovnega pomnilnika RAM. Vsebine GPR-registrov se izgubijo, ko mikrokontrolerju izklopimo napajanje.
Če želimo brati ali pisati v register podatkovnega pomnilnika RAM, se moramo nahajati v banki, v kateri je želeni register.
Programski števec:
V mikrokontrolerju PIC16F628A je programski števec 13-biten register. V njem se vedno nahaja naslov naslednje instrukcije, ki se bo v programu izvedla. Dosegljiv je preko PCLATH- in PCL-registrov. PCL-register vsebuje spodnjih 8 bitov programskega števca. Lahko ga poljubno beremo ali pa vanj vpisujemo. Zgornjih 5 bitov programskega števca pa najdemo v registru PCLATH, ki ni direktno dosegljiv.
Slika 4: Organizacija podatkovnega pomnilnika RAM
Podprogrami:
Podprogram je del programa, ki je ločen od glavnega programa. Pokličemo ga po potrebi. Če želimo, da se neki del programa izvede večkrat, za ta del programa izdelamo podprogram. Podprogram iz glavnega programa pokličemo z instrukcijo CALL. V parametru te instrukcije navedemo labelo oziroma naslov, ki pomeni ime podprograma. Podprogram vedno začnemo z labelo, zaključimo pa z instrukcijo RETURN, ki poskrbi, da se iz podprograma vrnemo v glavni program na instrukcijo, ki sledi instrukciji CALL.
Instrukcija CALL povzroči skok na podprogram z labelo, ki je zapisana v parametru te instrukcije. Podprogrami se nahajajo na koncu glavnega programa, pred direktivo END. Če bi ga zapisali kar med glavnim programom, bi se izvedel tudi takrat, ko ga ne bi poklicali.
Podprograme lahko pokličemo tudi iz podprograma, vendar le do meje 8 podprogramov v globino. Delovanje podprogramov prikazuje slika 5.
Slika 5: Delovanje podprogramov
Aritmetična logična enota:
Za izvajanje vseh instrukcij v mikrokontrolerju PIC skrbi 8-bitna aritmetična logična enota ALU (Arithmetic logic unit). Lahko sešteva in odšteva 8-bitna števila ter z njimi izvaja nekatere logične operacije (AND, OR, XOR, NOT …). Po izvršitvi vsake instrukcije se v registru STATUS postavijo trije biti na ustrezne vrednosti. Iz njihovih vrednosti lahko ugotovimo, kakšen je dobljeni rezultat. Ta je lahko pozitiven, negativen, enak 0 ali napačen. Te tri bite imenujemo zastavice.
SFR-registri:
V gradivu so opisani tisti SFR-registri, ki jih bomo uporabljali pri izdelavi vaj. Podrobnejše opise najdemo v kataloških podatkih proizvajalca mikrokontrolerja PIC16F628A.
Register STATUS (RAM naslov: 03h, 83h, 103h, 183h)
Tabela 1: Register STATUS
Bit 0, C (Carry bit): Zastavica C se pri seštevanju postavi na 1, če nastane prenos na bitu 8 (najpomembnejši bit) dobljenega rezultata. Zastavica C se pri seštevanju postavi na 0, če ni prenosa na bitu 8 dobljenega rezultata.
Bit 1, DC (Digit carry): Zastavica DC se pri seštevanju postavi na 1, če nastane prenos med 4. in 5. bitom dobljenega rezultata. Zastavica DC se pri seštevanju postavi na 0, če ni prenosa med 4. in 5. bitom dobljenega rezultata.
Bit 2, Z (Zero): Zastavica Z se postavi na 1, če je rezultat zadnje instrukcije število 0. Zastavica Z se postavi na 0, če rezultat zadnje instrukcije ni enak številu 0.
Bit 3, /PD (Power-down bit): 1 => po vklopu, z instrukcijo clrwdt. 0 => v režimu delovanja SLEEP.
Bit 4, /TO (Time-out bit): 1 => po vklopu, z instrukcijo clrwdt, z instrukcijo sleep. 0 => WDT (Watchdog timer) je prekoračil vrednost.
Bit 5-6, RP: bita za izbiro banke podatkovnega pomnilnika RAM pri direktnem naslavljanju.
00 => banka 0 (00h–7Fh)
01 => banka 1 (80h–FFh)
10 => banka 2 (100h–17Fh)
11 => banka 3 (180h–1FFh)
Bit 7: IRP: bit za izbiro banke podatkovnega pomnilnika RAM pri indirektnem naslavljanju.
1 => banki 2, 3 (100h – 1FFh)
0 => banki 0, 1 (00h – FFh)
Register OPTION (naslov RAM: 81h, 181h)
Tabela 2: Register OPTION
Bit 0-2: Biti PS0, PS1 in PS2 se uporabljajo za nastavitev preddelilnika. Z njihovo vrednostjo določimo, kolikšen bo faktor deljenja preddelilnika (slika 9). Kateremu časovniku bo služil preddelilnik, določa bit 3 (PSA) v registru OPTION.
Tabela 3: Preddelilnik
Bit 3, PSA (Prescaler assignment): 1 => preddelilnik dodeli stražnemu mehanizu. 0 => preddelilnik dodeli časovniku.
Bit 4, T0SE (Timer 0 source edge select): 1 => časovnik se bo povečal pri prehodu iz visokega logičnega nivoja na pinu RA4 v nizkega. 0 => časovnik se bo povečal pri prehodu iz nizkega logičnega nivoja na pinu RA4 v visokega.
Bit 5, T0CS (Timer 0 clock source select): 1 => časovnik dobiva impulze za proženje iz pina RA4. 0 => časovnik dobiva impulze za proženje iz strojnega takta.
Bit 6, INTEDG (Interrupt edge select): 1 => prekinitev na pinu RB0 se sproži ob prehodu signala iz nizkega logičnega nivoja v visokega. 0 => prekinitev na pinu RB0 se sproži ob prehodu signala iz visokega logičnega nivoja v nizkega.
Bit 7, RBPU (PORTB pull-up enable bit): 1 => izključi upore, ki ohranjajo priključke PORTB na potencialu logične 1. 0 => vključi upore, ki ohranjajo priključke PORTB na potencialu logične 1.
Register INTCON (RAM naslov: 0Bh, 8Bh, 10Bh, 18Bh)
Tabela 4: Register INTCON
Bit 0, RBIF (PORTB change interrupt flag): 1 => nastala je prekinitev na pinih RB4− RB7. 0 => ni prekinitve na pinih RB4−RB7.
Bit 1, INTF (RB0/INT interrupt flag): 1 => nastala je prekinitev na pinu RB0. 0 => ni prekinitve na pinu RB0.
Bit 2, T0IF (TMR0 overflow interrupt flag): 1 => nastala je prekinitev na časovniku TMR0. 0 => ni prekinitve na časovniku TMR0.
Bit 3, RBIE (PORTB change interrupt enable): 1 => omogočeno je proženje prekinitev s spremembo logičnega nivoja na pinih RB4−RB7. 0 => proženje prekinitev s spremembo logičnega nivoja na pinih RB4−RB7 je onemogočeno.
Bit 4, INTE (RB0/INT interrupt enable): 1 => omogočeno je proženje prekinitev s spremembo logičnega nivoja na pinu RB0. 0 => proženje prekinitev s spremembo logičnega nivoja na pinu RB0 je onemogočeno.
Bit 5, T0IE (TMR0 overflow interrupt enable): 1 => omogočeno je proženje prekinitev na časovniku TMR0. 0 => proženje prekinitev na časovniku TMR0 je onemogočeno.
Bit 6, PEIE (Peripheral interrupt enable): 1 => omogočimo odzivanje mikrokontrolerja na prekinitve, ki jih določimo v registru PIE 1 (Peripheral interrupt enable). 0 => onemogočimo odzivanje mikrokontrolerja na prekinitve, ki jih določimo v registru PIE 1.
Bit 7, GIE (Global interrupt enable): 1 => omogočeno je odzivanje mikrokontrolerja na prekinitve. 0 => onemogočeno je odzivanje mikrokontrolerja na prekinitve.
Registra PORTA in TRISA:
Pin RA4 lahko uporabimo kot vhod, kot izhod (pin RA4 je tipa open drain => pozna dve stanji: maso, kadar je na stanju logične 0 in veliko impedanco, kadar je v stanju logične 1. Pin RA4 nikoli ne da +5 V izhoda, ampak le maso.) ali kot števni vhod za timer TMR0.
Pin RA5 lahko uporabimo samo kot vhod.
Vse ostale pine na PORTA (RA0 - RA3 in RA6 - RA7) lahko uporabljamo kot vhodne ali kot izhodne pine.
Kadar uporabljamo zunanji kristalni oscilator, ga priključimo med pina RA6 in RA7 (določimo s konfiguracijskimi biti). V tem primeru TRISA register ignorira bita 6 in 7.
Če uporabljamo pine na PORTA kot digitalne, vhodno/izhodne pine, moramo ustrezno nastaviti bite v registru CMCON.
Primer nastavitve:
clrf PORTA ;inicializacija PORTA
movlw b'00000111'
movwf CMCON ;omogočimo vhodno/izhodne pine (izklopimo komparatorje)
bcf STATUS,RP1
bsf STATUS,RP0 ;banka 1
movlw b'00011111'
movwf TRISA ;RA0 - RA4 so vhodi, RA5 je vedno vhod (bit 5 v TRISA se vedno prebere kot "1"
;RA6 - RA7 sta odvisna od izbire oscilatorja (konfiguracijski biti)
Pini na PORTA so povezani s funkcijo komparatorja in napetostne reference. Zato delovanje pinov na PORTA določimo z ustrezno izbiro bitov v registru CMCON (Comparator control register) in registrom VRCON (Voltage reference control register).
Kadar za PORTA izberemo funkcijo komparatorja, register TRISA ravno tako nadzoruje smer pinov na PORTA, zato moramo paziti, da pravilno določimo vhodno/izhodne pine. Pina RA3 in RA4 sta v tem primeru izhoda komparatorjev.
Tabela 5: Register CMCON
Delovanje kompararorjev:
Delovanje kompararorjev in njihovih vhodov določimo z nastavitvijo bitov CM0, CM1, CM2 in CIS v registru CMCON. Takoj po vklopu mikrokontrolerja so ti biti postavljeni v stanje 0. To pomeni, da so pini RA0 - RA3 določeni kot analogni pini (AN0 - AN3).
Kadar komparatorja ne uporabljamo in želimo pine na PORTA uporabljati kot digitalne, moramo postaviti bite CM0, CM1, CM2 v stanje 1 takoj na začetku programa.
Z vrednostjo bita CIS določimo priključitve komparatorjevih vhodov. Uporabljamo ga v analognem načinu delovanja, kadar želimo primerjati več analognih signalov. Z dvema komparatorjema lahko primerjamo z referenčno napetostjo (Vref) največ štiri različne analogne signale. Stanje bitov CM2, CM1, CM0 je takrat 010, bit CIS pa enkrat 0, drugič 1.
Vse možne kombinacije prikazuje slika 6.
Slika 6: Delovanje komparorjev v odvisnosti od nastavitve bitov CM0 - CM2 in bita CIS v registru CMCON