Zbirni jezik (assembler)

Zbirnik je programski jezik, ki ga lahko uvrstimo tik nad strojni jezik. Je jezik kratic, ki so ga uvedli programerji, da bi poenostavili uporabo strojnega jezika. Namesto da bi bili strojne kode strojnih ukazov prepisovali iz tabel, so ukaze poimenovali s kraticami, ki si jih je laže zapomniti kot številke. Zbirni jezik je predstavljen v razumljivejši obliki z mnemoniki ali smiselnimi okrajšavami. Zbirni jezik strojne ukaze oziroma instrukcije predstavlja v simbolični obliki in se ne more izvajati neposredno, saj ga je treba prej prevesti v strojni jezik.

Vsaka od 35 instrukcij mikrokontrolerja PIC16F628a ima v zbirnem jeziku svojo okrajšavo, ki jo imenujemo mnemonik. Zbirniški prevajalnik prevaja program, napisan v zbirnem jeziku po vrsticah tako, da mnemonike prevede v strojno kodo ukaza, ki jo razume centralna procesna enota mikrokontrolerja. Strojno kodo vpisuje v datoteko s končnico .hex, ki jo nato s programatorjem prenesemo v programski pomnilnik mikrokontrolerja.

Program v zbirnem programskem jeziku je sestavljen iz stolpca instrukcij, njihovih parametrov in komentarjev. Komentarji niso obvezni, vendar je program s komentarji preglednejši, saj nam ti opisujejo njegovo delovanje. V veliko pomoč so tudi pri odpravljanju napak.

Slika 1: Program v zbirnem jeziku

Labele ali naslove pišemo skrajno levo. Postavimo jih lahko kamor koli pred instrukcijo ali v novo vrstico med programom. Instrukcije ali ukaze pišemo s tabulatorsko tipko odmaknjene od levega roba, sledijo pa jim parametri. Če je parametrov več, jih moramo ločiti z vejicami. Komentarje lahko pišemo na konec katere koli vrstice ali v svojo vrstico, vedno pa jih moramo začeti s podpičjem.

Instrukcije mikrokontrolerja:

Direktive in konfiguracijski biti:

Direktive so ukazi v programu, ki se ne prevedejo v strojno kodo. Prevajalniku povejo, kako naj prevaja posamezne dele programa.

Direktiva list p=16f628a na začetku programa določi tip uporabljenega mikrokontrolerja, v našem primeru PIC16F628A.

Direktiva #include <p16f628a.inc> vključi v program datoteko p16f628a.inc, ki vsebuje imena registrov v mikrokontrolerju.

Direktiva org določi naslov programskega pomnilnika, kamor se bo vpisoval program. Naslov je podan kot parameter tej direktivi.

Z direktivo end zaključimo program.

S konfiguracijskimi biti lahko izbiramo med zunanjim in notranjim oscilatorjem, vrsto oscilatorja, vlogo ponastavitvenega vezja (reset vezja), stabilizacijo oscilatorja pred izvajanjem programa, ko mikrokontroler priključimo na napajalno napetost, vključimo oziroma izključimo časovnik stražnega mehanizma (Watchdog timer), zaščitimo program pred kopiranjem, določimo pa lahko še nekatere druge parametre, ki jih v naših vajah ne bomo uporabljali. Vsi parametri so za posamezne tipe mikrokontrolerjev opisani v karakterističnih podatkih proizvajalca Microchipa.

Konfiguracijske bite nastavimo z določitvijo vrednosti posameznih bitov v registru CONFIG. Do tega registra, njegov specialni naslov v podatkovnem pomnilniku je 2007h, lahko dostopamo le med programiranjem.

Register CONFIG (RAM naslov: 2007h)

Tabela 1: Register CONFIG

Nastavitev konfiguracijskih bitov za vaje:

Konfiguracijske bite lahko določimo na začetku programa, takoj za direktivo #include na dva načina. Prvi način opisuje imena konfiguracijskih bitov in njihovo stanje, drugi način pa vrednosti vseh konfiguracijskih bitov, najpogosteje zapisanih v heksadecimalnem številskem sistemu. Ker že poznamo direktive, zapišimo prve tri vrstice programa:

         list     p=16f628a ;Tip mikrokontrolerja.

        #include     <p16f628a.inc> ;Vključi v program datoteko p16f628a.inc, ki vsebuje imena registrov v mikrokontrolerju.

        __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_MCLRE_ON &_LVP_OFF &_XT_OSC

Konfiguracijski biti določajo izklop zaščite pred kopiranjem, izklop stražnega mehanizma, vklop stabilizacije oscilatorja, omogočena sta ponastavljanje in uporaba pina RB4 ter uporaba zunanjega kristalnega oscilatorja.

Za opisane nastavitve je vrednost registra CONFIG zapisana v binarni obliki:

    __CONFIG b'10000100101001'

Zapišimo še vrednost registra CONFIG v heksadecimalnem zapisu:

    __CONFIG 0x2129

Določitev vhodno-izhodnih pinov mikrokontrolerja:

Mikrokontrolerju PIC16f628a določimo nekatere pine kot vhodne in nekatere kot izhodne zaradi vezja, s katerim deluje. Glavna naloga mikrokontrolerja je namreč ta, da na posamezne pine pošilja napetost +5 V (1) ali napetost 0 V (0) in preverja, ali je na določenih pinih napetost +5 V (1) ali je ni (0). V odvisnosti od vezja, s katerim bo deloval, določimo ustrezne pine kot vhodne oziroma kot izhodne.

Slika 2: Določitev vhodno-izhodnih pinov mikrokontrolerja

Mikrokontroler PIC16f628a ima 16 vhodno-izhodnih pinov, ki so razdeljeni na port A in port B. Programsko so pini združeni v register PORTA in register PORTB. Smer vsakega pina (ali bo deloval kot vhodni ali kot izhodni pin) določimo z vrednostjo bitov v registru TRISA za PORTA in v registru TRISB za PORTB. Če ima določen pin v registru TRIS vrednost 0, bo deloval kot izhodni pin, če pa ima vrednost 1, bo deloval kot vhodni pin. Na sliki 2 vidimo, da so pini RA0, RA2, RA4, RA5, RB0, RB1, RB2 in RB7 določeni kot vhodni pini, drugi pa kot izhodni pini.

Od vseh 16 pinov mikrokontrolerja PIC16f628a imajo nekateri posebno vlogo:

Program za določitev vhodno-izhodnih pinov, kot je prikazano na sliki 2 je:

     list p=16f628a         ;Tip mikrokontrolerja.

    #include <p16f628a.inc>      ;Vključi v program datoteko p16f628a.inc.

    __CONFIG 0x2129 ;Konfiguracijski biti.

    

    org 0x000                                        ;Reset vektor.

    goto Glavni                                      ;Nadaljuj izvajanje programa na naslovu Glavni.

    org 0x004                                        ;Prekinitveni vektor.

Glavni

    bcf STATUS,5                                     ;Banka 0

    movlw b'00000111'

    movwf CMCON                                    ;Prve tri bite registra CMCON postavimo na 1 => Onemogočimo komparatorje na PORTA.

    bsf STATUS,5                                   ;Banka 1 (peti bit registra STATUS postavimo na 1).

    movlw b'00110101'

    movwf TRISA                                    ;Pini RA0, RA2, RA4 in RA5 so vhodni, drugi so izhodni.

    movlw b'10000111'

    movwf TRISB                                    ;Pini RB0, RB1, RB2 in RB7 so vhodni, drugi so izhodni.

    bcf STATUS,5

    clrf PORTB                                     ;Inicializacija PORTB (register PORTB je v banki 0).

end