# µbe;

## Uvod in splošna sintaksa

Microbe prevaja programe, napisane v jeziku po meri za PIC, kot spremljevalni program za &ktechlab;. Sintaksa je bila zasnovana tako, da ustreza &flowcode; programu. Sintaksa za zagon `microbe` iz ukazne vrstice je:

    microbe [možnosti] [input.microbe] [output.asm]

, kjer so možnosti:

- `--show-source` - postavi vsako vrstico µbe; izvorno kodo kot komentar v izhodu sestavljanja pred samimi ukazi zbirnika za to vrstico.

- `--no-optimize` – Prepreči optimizacijo ukazov, ustvarjenih iz vira. Optimizacija je običajno varna, zato se ta možnost uporablja predvsem za odpravljanje napak.

Vhodna datoteka .microbe mora identificirati ciljni PIC tako, da vstavi ime PIC na vrh datoteke .microbe; ⪚ ime PIC16F84 je "P16F84".

### Enostavni popoln µbe; program

    P16F84

    a = 0
    repeat
    {
            PORTA = a
            a = a + 1
    }
    until a == 5

    end

### Pravila poimenovanja

Za imena in oznake spremenljivk veljajo naslednja pravila:

- Vsebujejo lahko samo alfanumerične znake [a..z][A..Z][0..9] in podčrtaj "_"

- Razlikujejo med velikimi in malimi črkami..

- Ne morejo se začeti s številko.

- Ne smejo se začeti z __ (dvojni podčrtaj), saj je to rezervirano za uporabo s strani prevajalnika.

### Konvencije oklepajev

Zavita oklepaja, {}, označujeta začetek in konec bloka kode. Lahko se pojavita kjerkoli pred začetkom in po koncu bloka kode. Primeri sprejemljivih kodnih blokov:

    statement1 {
            some code
    }

    statement2 {
            other code }

    statement3
    {
            other code
    }

    statement5 {
            code block
    } statement6

### Komentiranje

Komentiranje je podobno C. // komentar v preostaneku vrstice. /* in */označujejo večvrstični komentar.

    // This is a comment
    x = 2
    /* As is this
    multiline comment */

### Struktura programa

PIC ID mora biti vstavljen na vrh programa. Konec glavnega programa je označen z end. Podprogrami morajo biti postavljeni za end.

### Podprogrami

Podprogram je mogoče poklicati od kjer koli v kodi. Sintaksa:

    sub SubName
    {
            // Code...
    }

Podprogram se pokliče s call `SubName`.

## µbe; jezikovna referenca

### if

Pogojno razvejanje. Sintaksa:

    if [expression] then [statement]

or

    if [expression] then
    {
            [statement block]
    }

Similarly for else:

    else [statement]

or

    else
    {
            [statement block]
    }

#### if

    if porta.0 is high then
    {
            delay 200
    }
    else
    {
            delay 300
    }

### vzdevek

Vzdevek enega niza v drugega. Sintaksa:

    alias [from] [to]

### repeat

Ponavljajoče izvaja blok stavkov, dokler izraz ni ocenjen kot resničen. Vrednotenje izraza se izvede po bloku stavkov, tako da bo blok stavkov vedno izveden vsaj enkrat. Sintaksa:

    repeat
    {
            [statement block]
    }
    until [expression]

### while

Podobno kot ponavljanje, to večkrat izvede blok stavkov. Vendar je izraz ovrednoten pred izvedbo, ne po njej. Torej, če je izraz ob prvem prehodu ovrednoten kot false, se blok stavkov ne bo izvedel. Sintaksa:

    while [expression]
    {
            [statement block]
    }

### goto

To povzroči, da se izvajanje kode nadaljuje pri naslednjem stavku za navedeno oznako. Sintaksa Goto:

    goto [labelname]

Sintaksa oznake:

    labelname:

Izogibanje uporabi goto se pogosto šteje za dobro programsko prakso. Uporaba kontrolnih stavkov in podprogramov bo povzročila veliko bolj berljiv program.

#### goto

    goto MyLabel

    ...

    [MyLabel]:
    // Code will continue at this point

### call

Pokliče podprogram. Sintaksa:

    call [SubName]

, kjer je `SubName` ime podprograma, ki ga želite poklicati.

### delay

To povzroči, da se izvajanje kode ustavi za dano časovno obdobje. Interval je v milisekundah. Sintaksa:

    delay [interval]

Trenutno µbe; predpostavlja, da PIC deluje na frekvenci 4MHz - &ie; vsako navodilo traja 1 mikrosekundo za izvedbo. Če temu ni tako, je treba interval sorazmerno prilagoditi.

### sevenseg

To se uporablja za definiranje preslikave nogic za katodni sedemsegmentni zaslon (s skupno katodo), povezan s PIC. Sintaksa:

    sevenseg [ime] [a] [b] [c] [d] [e] [f] [g]

kjer je [a] ...[g] so nogice PIC, na katere so pritrjeni ustrezni segmenti sedemsegmentnega zaslona. Nogice so lahko zapisane kot PORTX.N ali RXN.

Za prikaz številke na segmentu sedmih se preslikava nogice obravnava kot spremenljivka samo za pisanje.

#### Definiranje in izpis v sedem segmentov

    sevenseg seg1 RB0 RB1 RB2 RB3 RB4 RB5 RB6
    seg1 = x + 2

### keypad

To se uporablja za definiranje preslikave nogic za tipkovnico, povezano s PIC. Sintaksa:

    keypad [ime] [vrstica 1] ... [vrstica 4] [stolpec 1] ... [stolpec n]

kjer [vrstica 1] ... [vrstica 4] in [stolpec 1] ... [stolpec n] so nogice PIC, na katere so pritrjene ustrezne vrstice in stolpci tipkovnice (trenutno število vrstic ni spremenljivo) . Glejte sevenseg (zgoraj) za več informacij o preslikavah nogic.

Stolpce tipkovnice je treba potegniti navzdol preko 100k uporov na maso. Nogice vrstic morajo biti konfigurirane kot izhodi, nogice stolpcev pa kot vhodi. Ko je tipkovnica definirana, se obravnava kot spremenljivka samo za branje.

#### Definiranje in branje s tipkovnice

    keypad keypad1 RB0 RB1 RB2 RB3 RB4 RB5 RB6
    x = keypad1

Privzeto so vrnjene vrednosti za tipkovnico:

- Vrednost številke, če je številska tipka (1 do 3 v zgornji vrstici; šestnajstiški A do D navzdol v četrtem stolpcu in nadaljevanje za vsak dodatni stolpec).

- 253 za tipko v vrstici 4, stolpec 1.

- 254 za tipko v vrstici 4, stolpec 3.

Te vrednosti je mogoče na novo definirati z uporabo ukaza alias, kjer je ime tipke v vrstici x, stolpcu y (vrstice in stolpci, ki se začnejo pri 1), Keypad_x_y. Če želite na primer tipki zvezdica na tipkovnici 4x3 dati vrednost nič, bi uporabili naslednji vzdevek:

#### Določanje vzdevka tipke na tipkovnici za vrednost

    alias Keypad_4_1 0

## PIC I/O

### Smer vrat

Smer vrat se nastavi tako, da se TRIS* dodeli vrednost, kjer je * črka vrat. Na primer:

#### Nastavitev smeri vrat

    TRISB = b'01111001'

Zgornje nastavi nogice RB1, RB2 in RB7 na PORTB kot izhode, druge nogice na PORTB pa kot vhode. V tem primeru je b'01111001' binarna predstavitev vrste izhoda. 1 na desni predstavlja izhod na RB0, 0 na levi pa vhod na RB7.

### Vrata I/O

Vrata je mogoče obravnavati kot spremenljivko. Na primer:

#### Pisanje na vrata

    x = PORTA

Zgornje dodeljuje vrednost PORTA spremenljivki x.

### Pin I/O

Vsako nogico na vratih dobimo tako, da pred številko nogice dodamo ime vrat; ⪚ Pin 2 (začenši z nogico 0) na PORTA je znan kot PORTA.0. Sintaksa za nastavitev stanja nogice je:

    PORTX.N = STATE

, kjer je STATE lahko high ali low. Sintaksa za preizkus stanja nogice je:

    if PORTX.N je STATE then

S kombiniranjem teh primerov imamo:

#### Nastavitev in testiranje stanja nogice

    TRISA = 0
    TRISB = 255
    if PORTA.3 is high then
    {
            PORTB.5 = low
    }
    else
    {
            PORTB = PORTA + 15
    }

## Spremenljivke

Vse spremenljivke so 8-bitna nepredznačena cela števila, ki v obsegu od 0 do 255. µbe; podpira tipične unarne operacije (delujejo na eno spremenljivko) in binarne operacije (delujejo na dve spremenljivki), ki jih podpira PIC. Poleg tega µbe; podpira tudi deljenje in množenje.

### Unarne operacije

- rotateleft x – Zasuka spremenljivko x levo skozi prenos.

- rotateright x – Zasuka spremenljivko x desno skozi prenos.

- inkrement x – Poveča spremenljivko x. Če ima x vrednost 255, se x zaokroži na 0.

- zmanjšaj x – Zmanjša spremenljivko x. Če ima x vrednost 0, se x zaokroži na 255.

### Aritmetika

Podprte operacije:

- Seštevanje: x + y

- Odštevanje: x - y

- Množenje: x * y

- Deljenje: x / y

- Binarni XOR: x XOR y

- Binarni AND: x AND y

- Binarni OR: x OR y

### Primerjava

Podprte operacije:

- Enakost: x == y

- Neenakost: x != y

- Je večje od: x > y

- Je manjše kot: x < l

- Je večje ali enako: x >= y

- Je manjše ali enako: x <= y

Na primer:

#### Primerjava

    if PORTA
    >= 5 then
    {
            ...
    }