# µbe;

## Introduzione e sintassi generale

Microbe compila i programmi scritti in un linguaggio personalizzato per i PIC, come programma che lavora insieme a &ktechlab;. La sintassi è stata progettata per adattarsi ai programmi in &flowcode;. Per avviare `microbe` da riga di comando la sintassi è:

    microbe [opzioni] [input.microbe] [output.asm]

, mentre le opzioni sono:

- `--show-source` - mette ogni riga di codice sorgente di µbe; come commento nell'output assembly, prima delle istruzioni assembly stesse della riga.

- `--no-optimize` - previene l'ottimizzazione delle istruzioni generate da quel sorgente. L'ottimizzazione è in genere sicura, perciò quest'opzione viene usata principalmente durante il debug.

Il file .microbe in ingresso deve identificare il PIC a cui è destinato inserendo il nome di tale PIC all'inizio del file .microbe; ad esempio, il nome di un PIC16F84 è «P16F84».

### Un programma µbe; semplice ma completo

    P16F84

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

    end

### Convenzioni sui nomi

Per i nomi delle variabili e per le etichette si applicano le seguenti regole:

- Possono contenere solo caratteri alfanumerici [a..z][A..Z][0..9] e il trattino basso "_".

- Distinguono le maiuscole.

- Non possono iniziare con un numero.

- Non dovrebbero iniziare con __ (doppio trattino basso), in quanto questo è riservato per il compilatore.

### Convenzioni sulle parentesi

Le parentesi graffe, {}, indicano l'inizio e la fine di un blocco di codice. Possono comparire in qualsiasi punto prima dell'inizio e dopo la fine del blocco di codice. Esempi accettabili di blocchi di codice:

    istruzione1 {
            del codice
    }

    istruzione2 {
            altro codice }

    istruzione3
    {
            altro codice
    }

    istruzione5 {
            blocco di codice
    } istruzione6

### Commentare

I commenti sono simili a quelli del C, cioè // per commentare il resto della riga, mentre /* e */ denotano un commento multi-riga.

    // Questo è un commento
    x = 2
    /* Come lo è questo
    commento multi-riga */

### Struttura del programma

L'identificativo del PIC deve essere inserito all'inizio del programma, mentre la fine del programma principale è denotata con end. Le subroutine devono essere messe dopo l'end.

### Subroutine

Una subroutine può essere chiamata in qualsiasi parte nel codice. Sintassi:

    sub NomeSub
    {
            // Codice...
    }

La subroutine viene chiamata con call `NomeSub`.

## Riferimenti al linguaggio µbe;

### if

Diramazione condizionale. Sintassi:

    if [espressione] then [istruzione]

o

    if [espressione] then
    {
            [blocco di istruzioni]
    }

Lo stesso per else:

    else [istruzione]

oppure

    else
    {
            [blocco di istruzioni]
    }

#### if

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

### alias

Chiama una stringa in un altro modo. Sintassi:

    alias [da] [a]

### repeat

Esegue ripetutamente il blocco di istruzioni finché l'espressione viene valutata come vera (true). Questa valutazione viene eseguita prima del blocco di istruzioni, quindi questo sarà sempre eseguito almeno una volta. Sintassi:

    repeat
    {
            [blocco di istruzioni]
    }
    until [espressione]

### while

Simile a repeat, esegue ripetutamente il blocco di istruzioni. Tuttavia l'espressione viene valutata prima dell'esecuzione, non dopo. Quindi, se questa viene valutata come falsa (false) al primo passaggio, il blocco di istruzioni non viene proprio eseguito. Sintassi:

    while [espressione]
    {
            [blocco di istruzioni]
    }

### goto

Provoca l'esecuzione del codice dopo l'etichetta specificata e prosegue all'istruzione successiva. Sintassi del goto:

    goto [nomeetichetta]

. Sintassi dell'etichetta:

    labelname:

. Viene spesso considerata una buona pratica quella di evitare l'uso del goto: l'utilizzo di istruzioni di controllo e di subroutine farà infatti sì che il programma risulti molto più leggibile.

#### goto

    goto MiaEtichetta

    ...

    [MiaEtichetta]:
    // il codice continuerà in questo punto

### call

Chiama una subroutine. Sintassi:

    call [NomeSub]

, dove `NomeSub` è il nome della subroutine da chiamare.

### delay

Fa sì che l'esecuzione del codice si fermi per un certo periodo di tempo. L'intervallo è in millisecondi. Sintassi:

    delay [intervallo]

Al momento µbe; presume che il PIC stia operando alla frequenza di 4MHz, cioè che ciascuna istruzione impieghi 1 microsecondo per essere eseguita. Se non fosse questo il caso è necessario regolare opportunamente l'intervallo.

### sevenseg

Viene usato per definire la mappatura dei piedini di un display a sette segmenti (a catodo comune) che è connesso al PIC. Sintassi:

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

, dove [a]...[g] sono i piedini del PIC ai quali sono collegati i rispettivi segmenti del display a sette segmenti. I piedini possono essere scritti anche come PORTX.N o RXN.

Per visualizzare un numero sui sette segmenti la mappatura dei piedini viene considerata come una variabile a sola scrittura.

#### Definizione su un sette segmenti e scrittura

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

### keypad

Viene usato per definire la mappatura dei piedini di un tastierino connesso al PIC. Sintassi:

    keypad [nome] [riga 1] ... [riga 4] [colonna 1] ... [colonna n]

, dove [riga 1] ... [riga 4] e [colonna 1] ... [colonna n] sono i piedini del PIC ai quali sono collegate le rispettive righe e colonne del tastierino (al momento il numero delle righe non è modificabile). Vedi sevenseg (sopra) per ulteriori informazioni sulla mappatura dei piedini.

Le colonne del tastierino devono essere collegate a terra tramite una resistenza da 100k. I piedini delle righe devono essere configurati come uscite, mentre quelli delle colonne come ingressi. Una volta che viene definito il tastierino, questo sarà trattato come una variabile a sola lettura.

#### Definizione di un tastierino e lettura

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

I valori predefiniti restituiti dal tastierino sono:

- Il valore del numero se è un tasto numerico (da 1 a 3 nella riga in alto; da A a D esadecimali nella quarta colonna, e così via per ogni colonna aggiuntiva).

- 253 per il tasto nella riga 4, colonna 1.

- 254 per il tasto nella riga 4, colonna 3.

Questi valori possono essere ridefiniti usando i comandi di alias, dove il nome del tasto alla riga x, colonna y (le righe e le colonne iniziano da 1) è Keypad_x_y. Per esempio, per dare al tasto con l'asterisco di un tastierino 4x3 il valore zero possono essere usati i seguenti alias:

#### Assegnazione di un valore al tasto di un tastierino

    alias Keypad_4_1 0

## Ingresso/uscita del PIC

### Direzione della porta

La direzione della porta è impostata assegnando un valore a TRIS*, dove * è la lettera della porta. Per esempio:

#### Impostare la direzione della porta

    TRISB = b'01111001'

Questo imposta i piedini RB1, RB2 e RB7 nella PORTB come uscite, e gli altri come ingressi. In questo esempio, b'01111001' è una rappresentazione binaria del tipo di uscita: l'1 alla destra rappresenta un'uscita su RB0, mentre quello alla sinistra un ingresso in RB7.

### Porte di ingresso/uscita

La porta può essere trattata come una variabile. Per esempio:

#### Scrivere su una porta

    x = PORTA

Qui sopra viene assegnato il valore di PORTA alla variabile x.

### Piedini di ingresso/uscita

Ciascun piedino su una porta è ottenuto anteponendo il numero del piedino al nome della porta; ad esempio il Pin 2 (iniziando dal Pin 0) su PORTA è conosciuto come PORTA.0. La sintassi per impostare uno stato di un piedino è:

    PORTX.N = STATE

dove STATE può essere alto o basso, mentre la sintassi per testare lo stato di un piedino è:

    if PORTX.N is STATE then

. Combinando questi esempi abbiamo:

#### Impostare e testare lo stato del piedino

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

## Variabili

Tutte le variabili sono interi senza segno a 8 bit, compresi nell'intervallo che va da 0 a 255. µbe; supporta le tipiche operazioni unarie (cioè quelle che agiscono su una variabile) e quelle binarie (su due) che sono supportate dal PIC, più le divisioni e le moltiplicazioni.

### Operazioni unarie

- rotateleft x - ruota a sinistra la variabile x attraverso il carry.

- rotateright x - ruota a destra la variabile x attraverso il carry.

- increment x - incrementa la variabile x. Se x vale 255 allora sarà arrotondata a 0.

- decrement x - decrementa la variabile x. Se x vale 0 allora sarà arrotondata a 255.

### Aritmetica

Operazioni supportate:

- Addizione: x + y

- Sottrazione: x - y

- Moltiplicazione: x * y

- Divisione: x / y

- XOR binario: x XOR y

- AND binario: x AND y

- OR binario: x OR y

### Confronto

Operazioni supportate:

- Uguale: x == y

- Non uguale: x != y

- È maggiore di: x > y

- È minore di: x < y

- È maggiore o uguale a: x >= y

- È minore o uguale a: x <= y

Per esempio:

#### Confronto

    if PORTA
    >= 5 then
    {
            ...
    }