# µbe;

## Inleiding en algemene syntaxis

Microbe compileert programma's geschreven in de speciale taal voor PICs, en is een programma dat bij &ktechlab; hoort. De syntax is ontworpen voor een &flowcode; programma. De syntax voor het opstarten van `microbe` vanaf de commandoregel is:

    microbe [options] [input.microbe] [output.asm]

waarbij de opties zijn:

- `--show-source` - Voegt elke regel van de µbe; broncode als commentaar toe aan de assembly uitvoer voor de assembly instructies zelf in die regel.

- `--no-optimize` - Voorkomt optimalisatie van de uit de broncode gegenereerde instructies. Optimalisatie is normaal gesproken veilig, en daarom wordt deze optie hoofdzakelijk gebruikt bij debugging.

Het .microbe invoer-bestand moet de PIC identificeren door de PIC-naam aan het begin van het .microbe bestand te plaatsen; ⪚ de naam van een PIC16F84 is "P16F84".

### Eenvoudig compleet µbe; programma

    P16F84

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

    end

### Naamconventies

De volgende regels zijn van toepassing op namen van variabelen en labels:

- Ze kunnen alleen alfanumerieke tekens [a..z][A..Z][0..9] bevatten en de underscore "_".

- Ze zijn hoofdlettergevoelig.

- Ze mogen niet met een cijfer beginnen.

- Ze zouden niet mogen beginnen met __ (dubbele underscore), omdat dit gereserveerd wordt voor gebruik door de compiler.

### Conventies voor haakjes

Accolades, {}, geven de start en het eind van een code block aan. U kunt ze overal voor de start en achter het eind van een code block plaatsen. Voorbeelden van acceptabele code blocks:

    statement1 {
            enige code
    }

    statement2 {
            andere code }

    statement3
    {
            andere code
    }

    statement5 {
            codeblok
    } statement6

### Commentaar

Commentaar plaatsten gaat zoals bij C. // maakt van de rest van de regel commentaar. /* en */ geeft een meerregelige commentaar aan.

    // dit is een commentaar
    x = 2
    /* En dit is
    meerregelig commentaar */

### Programma structuur

U moet de PIC id aan het begin van het programma toevoegen. Het eind van het hoofdprogramma geeft u aan met end. Subroutines moet u achter end plaatsen.

### Subroutines

U kunt van elke plaats in de code een subroutine aanroepen. Syntax:

    sub SubName
    {
            // Code...
    }

De subroutine roept u aan met call `SubName`.

## Referentie µbe; taal

### if

Conditionele tweesprong. Syntax:

    if [expression] then [statement]

of

    if [expression] then
    {
            [statement block]
    }

Vergelijkbaar met else:

    else [statement]

of

    else
    {
            [statement block]
    }

#### if

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

### alias

Vervangt een tekenreeks door een ander als alias. Syntax:

    alias [from] [to]

### repeat

Herhaalt het uitvoeren van het statement block uit totdat de expressie waar is. De controle of de expressie waar is, wordt na het statement block uitgevoerd, daarom zal de statement block altijd tenminste een keer worden uitgevoerd. Syntax:

    repeat
    {
            [statement block]
    }
    until [expression]

### while

Vergelijkbaar met repeat, dit herhaalt het uitvoeren van het statement block uit. Maar de controle of de expressie waar is wordt voor de de uitvoer gedaan, niet daarna. daarom zal als uitkomst van de controle op de expressie negatief is, de statement nooit worden uitgevoerd. Syntax:

    while [expression]
    {
            [statement block]
    }

### goto

Dit zorgt dat het programma verdergaat met de volgende statement na het opgeven label. Goto syntax:

    goto [labelname]

Label syntax:

    labelname:

Het vermijden van het gebruik van goto wordt vaak als goed programmeren gezien. Het gebruik van control statements en subroutines zal resulteren in een beter leesbaar programma.

#### goto

    goto MyLabel

    ...

    [MyLabel]:
    // Code gaat verder op dit punt

### call

Roept een subroutine aan. Syntax:

    call [SubName]

waarbij `SubName` de naam van de subroutine is die u aanroept.

### delay

Dit veroorzaakt dat het uitvoeren van de code voor de opgeven periode stopt. De interval is in millisecondes. Syntax:

    delay [interval]

Op dit moment, wordt door µbe; aangenomen dat de PIC werkt met een kloksnelheid van 4MHz - &ie; elke instructie heeft 1 microseconde nodig om verwerkt te worden. Als dat niet het geval is, dan moet u de interval proportioneel aanpassen.

### sevenseg

Dit wordt gebruikt voor het definiëren van de pinbezetting van een (common cathode) zeven segment display verbonden met de PIC. Syntax:

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

waar [a]...[g] de pinnen van de PIC zijn waarmee de respectievelijke segmenten van de zeven segment display zijn verbonden. De pinnen kunnen zowel als PORTX.N of RXN worden geschreven.

Bij het tonen van een cijfer op de zeven segment, wordt de pin bezetting behandelt als een alleen lezen variabele.

#### Een uitvoer naar een zeven segment definiëren

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

### toetsenbordje

Dit gebruikt u om de pinnen van een PIC te definiëren waaraan een toetsenbordje is verbonden. Syntax:

    keypad [name] [rij 1] ... [rij 4] [colum 1] ... [colum n]

waar [rij 1] ... [rij 4] en [colum 1] ... [colum n] de pinnen van de PIC zijn waaraan de respectievelijke rijen en kolommen van het toetsenbordje zijn verbonden (op dit moment kunt u het aantal rijen niet wijzigen). zie sevenseg (hierboven) voor meer informatie over pin bezetting.

U moet de kolommen van het toetsenbord met 100k weerstanden omlaag trekken naar aarde. U moet de pinnen van de rijen als uitgang configureren en de pinnen van de kolommen als ingangen. Nadat het toetsenbordje is gedefinieerd, wordt het behandelt als een read only variabel.

#### Een toetsenbord definiëren en uitlezen

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

De waarden die u van een toetsenbord inleest zijn standaard:

- De waarde van het getal als het numerieke toets is (1 tot 3 voor de bovenste rij; hexadecimal A tot D langs de vierde kolom omlaag en verder voor elke extra kolom).

- 253 voor de toets in rij 4, kolom 1.

- 254 voor de toets in rij 4, kolom 3.

U kunt deze waarden herdefiniëren door gebruik van het alias commando, waarbij de naam van de toets in rij x, kolom y (rijen en kolommen starten bij 1), is Keypad_x_y. Bijvoorbeeld, om de ster toets op een 4x3 toetsenbord de waarde nul te geven, moet u de volgende alias gebruiken:

#### De toets van een toetsenbord vervangen door een waarde

    alias Keypad_4_1 0

## PIC I/O

### Poort richting

De poort richting stelt u in door een waarde toe te kennen aan TRIS*, waar * de poortletter is. Als voorbeeld:

#### Poort richtingen instellen

    TRISB = b'01111001'

Dit hierboven stelt de pinnen RB1, RB2 en RB7 op PORTB in als uitgangen, en de andere pinnen op PORTB als ingangen. In dit voorbeeld is b'01111001' een binaire representatie van het output type. De 1 aan de rechterkant stelt een uitgang op RB0 voor, en de 0 aan de linkerkant stelt een ingang op RB7 voor.

### Port I/O

U kunt een poort behandelen alsof het een variabele is. Bijvoorbeeld:

#### Naar een poort schrijven

    x = PORTA

Dit hierboven koppelt de waarde van PORTA aan de variabele x.

### Pin I/O

De pin van een poort kunt u krijgen door het pinnummer vooraf te laten gaan door de naam van de poort; ⪚ Pin 2 (startend van Pin 0) van PORTA is bekend als PORTA.0. De syntax voor het instellen van de status van een pin is:

    PORTX.N = STATE

waar STATE kan zijn hoog of laag. De syntax voor het testen van de status van een pin is:

    if PORTX.N is STATE then

Door deze voorbeelden te combineren krijgen we:

#### Testen en instellen van de pin-status

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

## Variabelen

Alle variabelen zijn 8-bit unsigned integers, in de range van 0 tot 255. µbe; ondersteund de standaard bewerkingen met maar een variabele en binaire bewerkingen (werkend met twee variabelen) die door de PIC kunnen worden uitgevoerd. Daarnaast ondersteund µbe; ook delen en vermenigvuldigen.

### Bewerkingen met één variabele

- rotateleft x - Verschuift de bits van variabele X naar links, waarbij de bit die links eraf valt weer rechts wordt toegevoegd.

- rotateright x - Verschuift de bits van variabele X naar rechts, waarbij de bit die rechts eraf valt weer links wordt toegevoegd.

- increment x - Verhoogt de variabele x met 1. Als x de waarde van 255 heeft, dan klapt x om naar 0.

- decrement x - Vermindert de variabele x met 1. Als x de waarde van 0 heeft, dan klapt x om naar 255.

### Rekenen

Ondersteunde bewerkingen:

- Optellen: x + y

- Aftrekken: x - y

- Vermenivuldigen: x * y

- Delen: x / y

- Binaire XOR: x XOR y

- Binaire AND: x AND y

- Binaire OR: x OR y

### Vergelijken

Ondersteunde bewerkingen:

- Is gelijk aan: x == y

- Is niet gelijk aan: x != y

- Is groter dan: x > y

- Is kleiner dan: x < y

- Is groter of gelijk aan: x >= y

- Is kleiner of gelijk aan: x <= y

Bijvoorbeeld:

#### Vergelijken

    if PORTA
    >= 5 then
    {
            ...
    }