# &microbe;

## Introducció i sintaxi general

El microbe compila els programes escrits en el llenguatge personalitzat per als PIC, com a programa complementari del &ktechlab;. La sintaxi ha estat dissenyada per a adaptar-se a un programa de &flowcode;. La sintaxi per a executar el `microbe` des de la línia d'ordres és:

- `--show-source` — Col·loca cada línia des del codi font de &microbe; com a un comentari a la sortida en assemblador abans de les instruccions en assemblador per a aquesta línia.

- `--no-optimize` — Evita l'optimització de les instruccions generades des de la font. L'optimització sol ser segura, de manera que aquesta opció és útil sobretot per a depurar.

El fitxer d'entrada `.microbe` haurà d'identificar el PIC de destinació inserint el nom del PIC a la part superior del fitxer, &pex;, el nom d'un PIC16F84 és P16F84.

### Programa de &microbe; complet i senzill

    P16F84

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

    end

### Convencions de la nomenclatura

Les regles següents s'apliquen als noms i etiquetes de les variables:

- Només poden contenir caràcters alfanumèrics [a..z][A..Z][0..9] i el guió baix _.

- Distingeixen entre majúscules i minúscules.

- No poden començar amb un número.

- No han de començar amb __ (doble subratllat), ja que està reservat perquè l'utilitzi el compilador.

### Convencions de les claus

Les claus, {}, indiquen l'inici i el final d'un bloc de codi. Poden aparèixer en qualsevol lloc abans de l'inici i després del final del bloc de codi. Exemples de blocs de codi acceptables:

    sentència1 {
            algun codi
    }

    sentència2 {
            un altre codi }

    sentència3
    {
            un altre codi
    }

    sentència5 {
            bloc_de_codi
    } sentència6

### Comentar

Comentar és similar a C. Les «//» comenten la resta de la línia. I les «/*» i «*/» denoten un comentari de múltiples línies.

    // Aquest és un comentari
    x = 2
    /* Aquest és un comentari
    de múltiples línies */

### Estructura del programa

L'identificador PIC s'ha d'inserir a la part superior del programa. El final del programa principal s'indica amb end. Les subrutines s'han de col·locar després de end.

### Subrutines

Es pot cridar a una subrutina des de qualsevol part del codi. Sintaxi:

    sub SubNom
    {
            // Codi...
    }

La subrutina es crida amb call SubNom.

## Referència del llenguatge &microbe;

### if

Claus condicionals. Sintaxi:

    if [expressió] then [sentència]

o

    if [expressió] then
    {
            [bloc_de_sentències]
    }

De manera similar per a la resta:

    else [sentència]

o

    else
    {
            [bloc_de_sentències]
    }

#### if

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

### alias

L'àlies d'una cadena a una altra. Sintaxi:

    alias [des de] [a]

### repeat

Executa el bloc de sentències repetidament fins que l'expressió s'avalua com a certa. L'avaluació de l'expressió es realitza després del bloc de sentències, de manera que el bloc de sentències sempre s'executarà almenys una vegada. Sintaxi:

    repeat
    {
            [bloc_de_sentències]
    }
    until [expressió]

### while

Similar a «repeat», això executarà repetidament el bloc de sentències. No obstant això, l'expressió s'avaluarà abans de l'execució, no després. Llavors, si l'expressió s'avalua com a falsa en el primer pas, el bloc de sentències no s'executarà. Sintaxi:

    while [expressió]
    {
            [bloc_de_sentències]
    }

### goto

Això fa que l'execució del codi continuï en la següent sentència després de l'etiqueta especificada. Sintaxi de «goto»:

    goto [nom_etiqueta]

Sintaxi de l'etiqueta:

    nom_etiqueta:

Sovint es considera una bona pràctica de programació evitar l'ús de «goto». L'ús de sentències de control i subrutines donarà com a resultat un programa molt més llegible.

#### goto

    goto Etiqueta_meva

    ...

    [Etiqueta_meva]:
    // El codi continuarà en aquest punt

### call

Crida a una subrutina. Sintaxi:

    call [SubNom]

on SubNom és el nom de la subrutina a cridar.

### delay

Fa que s'aturi l'execució del codi durant el període de temps especificat. L'interval serà en mil·lisegons. Sintaxi:

    delay [interval]

En l'actualitat, el &microbe; assumeix que el PIC està operant a una freqüència de 4 MHz, &ead;, cada instrucció triga 1 microsegon a executar-se. Si aquest no és el cas, l'interval s'haurà d'ajustar proporcionalment.

### sevenseg

Això es fa servir per a definir l'assignació dels pins per a una pantalla de set segments (càtode habitual) connectada al PIC. Sintaxi:

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

on [a]...[g] són els pins del PIC als quals s'adjunten els segments respectius de la pantalla de set segments. Els pins es poden escriure com a PORTX.N o RXN.

Per a mostrar un número en els set segments, l'assignació dels pins es tracta com una variable de només escriptura.

#### Definició i sortida a un set segments

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

### keypad

Això es fa servir per a definir l'assignació dels pins per a un teclat numèric connectat al PIC. Sintaxi:

    keypad [nom] [fila 1] ... [fila 4] [columna 1] ... [columna n]

on [fila 1] ... [fila 4] i [columna 1] ... [columna n] són els pins del PIC als quals s'adjunten les respectives files i columnes del teclat numèric (de moment, el nombre de files és no modificable). Per a obtenir més informació sobre les assignacions dels pins, vegeu la (a dalt).

Les columnes del teclat numèric s'han de baixar a terra mitjançant resistències de 100 k. Els pins de la fila s'han de configurar com a sortides i els pins de la columna com a entrades. Una vegada s'ha definit el teclat numèric, es tractarà com una variable de només lectura.

#### Definir i llegir des d'un teclat numèric

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

De manera predeterminada, els valors retornats per un teclat numèric són:

- El valor del nombre si és una tecla numèrica (1 a 3 a la fila superior, hexadecimal des de l'A fins a la D a la quarta columna i continuant per a cada columna addicional).

- 253 per a la tecla a la fila 4, columna 1.

- 254 per a la tecla a la fila 4, columna 3.

Aquests valors es poden redefinir utilitzant l'ordre «alies», on el nom de la tecla a la fila «x», columna «y» (files i columnes que comencen amb 1), és «Keypad_x_y». Per exemple, per a donar-li el valor zero a la tecla d'asterisc en un teclat numèric de 4x3, s'utilitzarà el següent àlies:

#### Assignar un valor a una tecla del teclat numèric

    alias Keypad_4_1 0

## E/S del PIC

### Direcció del port

La direcció del port s'estableix assignant un valor a TRIS*, on «*» és la lletra del port. Per exemple:

#### Establint les direccions dels ports

    TRISB = b'01111001'

L'anterior estableix els pins RB1, RB2 i RB7 a PORTB com a sortides i els altres pins en PORTB com a entrades. En aquest exemple, b'01111001' és una representació binària del tipus de sortida. L'1 de la dreta representa una sortida a RB0 i el 0 de l'esquerra representa una entrada a RB7.

### E/S del port

El port pot tractar-se com una variable. Per exemple:

#### Escrivint a un port

    x = PORTA

Tot l'anterior assigna el valor de PORTA a la variable «x».

### E/S dels pins

Cada pin sobre un port s'obté anteposant el número del pin al nom del port, &pex;, el pin 2 (començant pel pin 0) a PORTA es coneix com a PORTA.0. La sintaxi per a establir un estat del pin és:

    PORTX.N = ESTAT

on ESTAT pot ser high o low. La sintaxi per a provar l'estat d'un pin és:

    if PORTX.N is ESTAT then

Combinant aquests exemples, tenim:

#### Establint i provant l'estat dels pins

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

## Variables

Totes les variables són enters de 8 bits sense signe, el qual dona un interval des de 0 fins a 255. El &microbe; admet les operacions unàries típiques (actuant sobre una variable) i les operacions binàries (actuant sobre dues variables) que són admeses pel PIC. A més, el &microbe; també admet la divisió i la multiplicació.

### Operacions unàries

- rotateleft x — Gira la variable «x» cap a l'esquerra a través del transport.

- rotateright x — Gira la variable «x» cap a la dreta a través del transport.

- increment x — Augmenta la variable «x». Si «x» té un valor de 255, llavors «x» s'arrodoneix a 0.

- decrement x — Disminueix la variable «x». Si «x» té un valor de 0, llavors «x» s'arrodoneix a 255.

### Aritmètica

Operacions admeses:

- Suma: x + y

- Resta: x - y

- Multiplicació: x * y

- Divisió: x / y

- XOR binari: x XOR y

- AND binari: x AND y

- OR binari: x OR y

### Comparació

Operacions admeses:

- Igual: x == y

- No és igual: x != y

- És més gran que: x > y

- És més petit que: x < y

- És més gran o igual que: x >= y

- És més petit o igual que: x <= y

Per exemple:

#### Comparació

    if PORTA
    >= 5 then
    {
            ...
    }