# µbe;

## Introducción y sintaxis general

Microbe compila programas escritos en el lenguaje personalizado para PIC, como programa complementario de &ktechlab;. La sintaxis se ha diseñado para que se ajuste a un programa &flowcode;. La sintaxis para ejecutar `microbe` en la línea de órdenes es:

    microbe [opciones] [entrada.microbe] [salida.asm]

, donde las opciones son:

- `--show-source`: Coloca cada línea del código fuente de µbe; como un comentario en la salida de ensamblador antes de las instrucciones de ensamblador de cada línea.

- `--no-optimize`: Evitar la optimización de las instrucciones generadas desde el código fuente. La optimización suele ser segura, por lo que esta opción se usa principalmente para depuración.

El archivo de entrada .microbe debe identificar el PIC de destino insertando el nombre del PIC al principio del archivo .microbe; por ejemplo, el nombre del PIC16F84 es «P16F84».

### Sencillo programa µbe; completo

    P16F84

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

    end

### Convenciones de nombres

Las siguientes reglas se aplican a los nombres y etiquetas de variables:

- Solo pueden contener caracteres alfanuméricos [a..z][A..Z][0..9] y el signo de subrayado «_».

- Se distingue entre mayúsculas y minúsculas.

- No pueden empezar con un número.

- No deben empezar con «__» (doble subrayado), ya que esto está reservado para el uso del compilador.

### Convenciones de paréntesis

Las llaves, {}, indican el inicio y el final de un bloque de código. Pueden aparecer en cualquier lugar antes y después del inicio del bloque. Ejemplos de bloques de código aceptables:

    instrucción1 {
            código
    }

    instrucción2 {
            otro código }

    instrucción3
    {
            otro código
    }

    instrucción5 {
            bloque de código
    } instrucción6

### Comentarios

Los comentarios son similares a los de C. // comenta el resto de la línea. /* y */ denotan un comentario de varias líneas.

    // Esto es un comentario
    x = 2
    /* Esto es un
    comentario multilínea */

### Estructura del programa

El ID del PIC se debe insertar al principio del programa. El final del programa principal se indica con «end». Las subrutinas deben colocarse después de «end».

### Subrutinas

Se puede llamar a una subrutina desde cualquier parte del código. Sintaxis:

    sub NombreSubrutina
    {
            // Código…
    }

La subrutina se se llama con «call `NombreSubrutina`».

## Referencia del lenguaje µbe;

### if

Ramificación condicional. Sintaxis:

    if [expresión] then [instrucción]

o

    if [expresión] then
    {
            [bloque de instrucciones]
    }

De igual modo para else:

    else [instrucción]

o

    else
    {
            [bloque de instrucciones]
    }

#### if

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

### alias

Alias de una cadena a otra. Sintaxis:

    alias [desde] [hasta]

### repeat

Ejecuta el bloque de instrucciones repetidamente hasta que la expresión se evalúa como verdadera. La evaluación de la expresión se realiza después del bloque de instrucciones, por lo que este siempre se ejecutará al menos una vez. Sintaxis:

    repeat
    {
            [bloque de instrucciones]
    }
    until [expresión]

### while

Similar a repeat, ejecuta repetidamente el bloque de instrucciones. Sin embargo, la expresión se evalúa antes de la ejecución, no después. Por lo tanto, si la expresión se evalúa como falsa en la primera pasada, el bloque de instrucciones no se ejecutará. Sintaxis:

    while [expresión]
    {
            [bloque de instrucciones]
    }

### goto

Esto hace que la ejecución del código continúe en la instrucción siguiente a la etiqueta indicada. Sintaxis de goto:

    goto [nombreetiqueta]

Sintaxis de la etiqueta:

    nombreetiqueta:

Se suele considerar una buena práctica evitar el uso de goto. El uso de instrucciones de control y de subrutinas generará un programa mucho más legible.

#### goto

    goto MiEtiqueta

    …

    [MiEtiqueta]:
    // El código continúa en este punto

### call

Llama a una subrutina. Sintaxis:

    call [NombreSubrutina]

donde `NombreSubrutina` es el nombre de la subrutina que se llama.

### delay

Hace que la ejecución del código se detenga durante el período de tiempo indicado. El intervalo se expresa en milisegundos. Sintaxis:

    delay [intervalo]

Actualmente, µbe; asume que el PIC opera a una frecuencia de 4 MHz; cada instrucción tarda 1 microsegundo en ejecutarse. De no ser así, el intervalo debe ajustarse proporcionalmente.

### sevenseg

Se usa para definir la asignación de pines de una pantalla de siete segmentos (cátodo común) conectada al PIC. Sintaxis:

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

donde [a]…[g] son ​​los pines del PIC a los que se conectan los respectivos segmentos de la pantalla de siete segmentos. Los pines se pueden escribir como PORTX.N o RXN.

Para mostrar un número en la pantalla de siete segmentos, la asignación de pines se trata como una variable de solo escritura.

#### Definición y salida a una pantalla de siete segmentos

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

### keypad

Se usa para definir la asignación de pines de un teclado conectado al PIC. Sintaxis:

    keypad [nombre] [fila 1]… [fila 4] [columna 1]… [columna n]

donde [fila 1]… [fila 4] y [columna 1]… [columna n] son los pines del PIC a los que se conectan las respectivas filas y columnas del teclado (hasta la actualidad, el número de filas no se puede modificar). Consulte sevenseg(más arriba) para más información sobre la asignación de pines.

Las columnas del teclado deben conectarse a tierra mediante resistencias de 100 kΩ. Los pines de las filas deben configurarse como salidas y los de las columnas como entradas. Una vez definido el teclado, se trata como una variable de solo lectura.

#### Definir y leer desde un teclado

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

De forma predeterminada, los valores devueltos por un teclado son:

- El valor del número si se trata de una tecla numérica (de 1 a 3 para la fila superior, hexadecimal A a D hasta la cuarta columna y continuando por cada columna adicional).

- 253 para la tecla de la fila 4, columna 1.

- 254 para la tecla de la fila 4, columna 3.

Estos valores se pueden redefinir usando la instrucción «alias», donde el nombre de la tecla de la fila x, columna y (las filas y las columnas empiezan por 1), es Keypad_x_y. Por ejemplo, para que la tecla estrella en un teclado de 4x3 dé el valor cero, se usaría el siguiente alias:

#### Asignar un valor a una tecla del teclado

    alias Keypad_4_1 0

## E/S de PIC

### Dirección del puerto

La dirección del puerto se establece asignando un valor a TRIS*, donde * es la letra del puerto. Por ejemplo:

#### Definición de direcciones de puertos

    TRISB = b'01111001'

Lo anterior define los pines RB1, RB2 y RB7 de PORTB como salidas, y el resto de pines de PORTB como entradas. En este ejemplo, b'01111001' es la representación binaria del tipo de salida. El 1 de la derecha representa una salida en RB0, mientras que el 0 de la izquierda representa una entrada en RB7.

### E/S de puertos

El puerto se puede tratar como una variable. Por ejemplo:

#### Escritura en puertos

    x = PORTA

Lo de arriba asigna el valor de PORTA a la variable x.

### E/S de pines

Cada pin de un puerto se obtiene anteponiendo el nombre del puerto al número de pin. Por ejemplo, el pin 2 (empezando desde el pin 0) de PORTA, se conoce como PORTA.0. La sintaxis para definir el estado de un pin es:

    PORTX.N = ESTADO

donde ESTADO puede ser high o low. La sintaxis para comprobar el estado de un pin es:

    if PORTX.N is ESTADO then

Combinando estos ejemplos, tenemos:

#### Definición y comprobación del estado de un pin

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

## Variables

Todas las variables son enteros sin signo de 8 bits, en el intervalo de 0 a 255. µbe; permite las operaciones unarias (que actúan sobre una variable) y las operaciones binarias (que actúan sobre dos variables) típicas del PIC. Además, µbe; también permite la división y la multiplicación.

### Operaciones unarias

- rotateleft x: Rota la variable x a la izquierda con acarreo.

- rotateright x: Rota la variable x a la derecha con acarreo.

- increment x: Aumenta la variable x. Si x vale 255, x vuelve a tener el valor 0.

- decrement x: Disminuye la variable x. Si x vale 0, x vuelve a tener el valor 255.

### Aritmética

Operaciones permitidas:

- Adición: x + y

- Sustracción: x - y

- Multiplicación: x * y

- División: x / y

- XOR binario: x XOR y

- Y binario: x AND y

- O binario: x OR y

### Comparación

Operaciones permitidas:

- Igual a: x == y

- Distinto de: x != y

- Mayor que: x > y

- Menor que: x < y

- Mayor o igual que: x >= y

- Menor o igual que: x <= y

Por ejemplo:

#### Comparación

    if PORTA
    >= 5 then
    {
            …
    }