# &microbe;

## Вступ і загальні зауваження щодо синтаксису

Microbe компілює програми, написані на нетиповій мові програмування для PIC і є супутньою програмою&ktechlab;. Синтаксис мови програмування розроблено так, щоб він відповідав програмам &flowcode;. Запустити `microbe` з командного рядка можна так:

    microbe [параметри] [вхідний.microbe] [вихідний.asm]

Параметри роботи програми:

- `--show-source` — додати кожен з рядків початкового коду &microbe; у код асемблера як коментар перед командами асемблера, що відповідають цим рядкам.

- `--no-optimize` — запобігати оптимізації команд, створених на основі коду. Зазвичай, оптимізації безпечні, тому цей параметр, в основному, корисний лише для діагностики проблем.

Файл вхідного коду .microbe має містити дані щодо PIC призначення. Такі дані вказують на початку файла .microbe. Наприклад, назвою PIC16F84 є «P16F84».

### Проста цілісна програма &microbe;

    P16F84

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

    end

### Правила щодо назв

До назв і міток змінних застосовуються такі правила:

- Назви і мітки можуть складатися лише з цифр і латинських літер [a..z][A..Z][0..9], а також символів підкреслювання, «_».

- Назви і мітки розрізняються за регістром символів.

- Назви і мітки не можуть починатися з цифри.

- Назви і мітки не можуть починатися з __ (подвійного підкреслювання), оскільки воно використовується компілятором.

### Правила щодо уживання дужок

Фігурні дужки, {}, позначають початок і кінець блоку коду. Їх можна розташовувати будь-де до початку і після кінця блоку коду. Приклади прийнятних блоків коду:

    інструкція1 {
            якийсь код
    }

    інструкція2 {
            ще якийсь код }

    інструкція3
    {
            інший код
    }

    інструкція5 {
            блок коду
    } інструкція6

### Коментування

Додавання коментарів має той самий синтаксис, що і у C. «//» робить коментарем решту символів рядка. «/*» і «*/» використовуються для багаторядкових коментарів.

    // Це коментар
    x = 2
    /* А це багато-
    рядковий коментар */

### Структура програми

На початку програми має бути вказано ідентифікатор PIC. Основна частина програми має завершуватися командою end. Підпрограми має бути розміщено після команди end.

### Підпрограми

Підпрограму можна викликати з будь-якого місця у коді. Синтаксис:

    sub НазваПідропрограми
    {
            // Код...
    }

Підпрограму викликають командою call НазваПідпрограми.

## Довідник з мови &microbe;

### if

Розгалуження за умовою. Синтаксис:

    if [вираз] then [інструкція]

або

    if [вираз] then
    {
            [блок інструкцій]
    }

Те саме для else:

    else [інструкція]

або

    else
    {
            [блок інструкцій]
    }

#### if

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

### alias

Створює альтернативну назву рядка. Синтаксис:

    alias [початкова_назва] [альтернативна_назва]

### repeat

Виконувати блок інструкцій повторно, аж доки не буде виконано контрольну умову. Перевірка виконання умови відбувається після виконання блоку інструкцій, отже блок інструкцій завжди буде виконано принаймні один раз. Синтаксис:

    repeat
    {
            [блок інструкцій]
    }
    until [вираз]

### while

Подібно до repeat надає змогу повторно виконувати блок інструкцій. Втім, контрольна умова перевіряється до виконання, а не після нього. Отже, якщо контрольна умова не виконується на першому кроці, блок інструкцій не буде виконано. Синтаксис:

    while [вираз]
    {
            [блок інструкцій]
    }

### goto

Призводить до продовження виконання коду з інструкції, яка є наступною після вказаної мітки. Синтаксис:

    goto [мітка]

Синтаксис мітки:

    мітка:

Вважається, що варто уникати використання goto. Використання інструкцій перевірки або підпрограм робить програми набагато зручнішими для читання і розуміння.

#### goto

    goto MyLabel

    ...

    [MyLabel]:
    // Тут продовжуватиметься виконання коду

### call

Викликає підпрограму. Синтаксис:

    call [НазваПідпрограми]

де НазваПідпрограми — назва підпрограми, яку викликають.

### delay

Ця команда призупиняє виконання коду на вказаний період часу. Проміжок часу задається у мілісекундах. Синтаксис:

    delay [проміжок]

У поточній версії &microbe; припускає, що PIC працює на частоті 4 МГц, тобто виконання кожної інструкції триває 1 мікросекунду. Якщо ваш мікроконтролер працює на іншій частоті, проміжок слід пропорційно скоригувати.

### sevenseg

Використовується для визначення прив’язки контактів для (типового катодного) сегментного індикатора, який з’єднано з PIC. Синтаксис:

    sevenseg [назва] [a] [b] [c] [d] [e] [f] [g]

де [a]...[g] — контакти PIC, з якими з’єднано відповідні сегменти сегментного індикатора. Контакти можна записувати або у форматі PORTX.N, або у форматі RXN.

Щоб показати цифру на сегментному індикаторі, прив’язка контактів обробляється як придатна лише для запису змінна.

#### Визначення даних для сегментного індикатора і виведення цих даних

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

### keypad

Використовується для визначення карти контактів для клавіатури, яку з’єднано з PIC. Синтаксис:

    keypad [назва] [рядок 1] ... [рядок 4] [стовпчик 1] ... [стовпчик n]

де [рядок 1] ... [рядок 4] і [стовпчик 1] ... [стовпчик n] — контакти PIC, з якими з’єднано відповідні рядки і стовпчики клавіш на клавіатурі (у поточній версії кількість рядків змінити не можна). Докладніший опис карт контактів наведено у розділі .

Стовпчики клавіатури має бути з’єднано через резистори у 100 кОм із землею. Контакти рядків має бути налаштовано як виходи, а контакти стовпчиків — як входи. Після визначення клавіатури робота з нею здійснюється за допомогою придатної лише для читання змінної.

#### Визначення клавіатури і читання з клавіатури

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

Типово, значеннями, які повертає клавіатура є:

- значення цифри, якщо натиснуто клавішу цифри (від 1 до 3 у верхньому рядку; шістнадцяткові цифри від A до D у четвертому рядку і далі за додатковими стовпчиками).

- 253 для клавіші у рядку 4, стовпчику 1.

- 254 для клавіші у рядку 4, стовпчику 3.

Ці значення можна перевизначити за допомогою команди alias, використовуючи назву Keypad_x_y для клавіші у рядку x, стовпчику y (нумерація рядків і стовпчиків починається з 1). Наприклад, щоб надати клавіші із зірочкою на клавіатурі 4x3 нульовий номер, можна скористатися такою командою:

#### Прив’язування клавіші на клавіатурі до значення

    alias Keypad_4_1 0

## Введення-виведення даних PIC

### Напрямок порту

Напрямок порту встановлюється встановленням значення TRIS*, де «*» — літера порту. Приклад:

#### Встановлення напрямків портів

    TRISB = b'01111001'

Вище контакти RB1, RB2 і RB7 на PORTB визначено як виходи, а інші контакти на PORTB — як входи. У цьому прикладі b'01111001' — двійкове представлення типу виходів. 1 праворуч відповідає виходу на RB0, а 0 ліворуч — входу на RB7.

### Введення-виведення з порту

З портом можна працювати як зі змінною. Приклад:

#### Запис до порту

    x = PORTA

Наведена вище команда встановлює значення PORTA для змінної x.

### Введення-виведення з контактів

Кожен контакт на порту можна отримати дописуванням перед номером контакту назви порту. Наприклад, контакт 2 (починаємо з контакту чи ніжки 0) на PORTA позначається як PORTA.0. Синтаксис встановлення стану контакту:

    PORTX.N = СТАН

, де СТАН може приймати значення high (відкрито) або low (закрито). Синтаксис перевірки стану контакту:

    if PORTX.N is СТАН then

Поєднуючи ці приклади, маємо:

#### Встановлення і тестування стану контакту

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

## Змінні

Усі змінні є 8-бітовими невід’ємними цілими числами у діапазоні від 0 до 255. У &microbe; передбачено підтримку типових унарних (над однією змінною) і бінарних (над двома змінними) дій, підтримку яких передбачено у PIC. Крім того, у &microbe; передбачено підтримку ділення і множення.

### Унарні дії

- rotateleft x — виконує зсув ліворуч бітів змінної x.

- rotateright x — виконує зсув праворуч бітів змінної x.

- increment x — збільшує на одиницю змінну x. Якщо значенням x було число 255, після збільшення значення буде занулено.

- decrement x — зменшує на одиницю змінну x. Якщо значенням x було число 0, після зменшення значенням буде 255.

### Арифметика

Підтримувані дії:

- Додавання: x + y

- Віднімання: x - y

- Множення: x * y

- Ділення: x / y

- Двійкове виключне АБО: x XOR y

- Двійкове І: x AND y

- Двійкове АБО: x OR y

### Порівняння

Підтримувані дії:

- Рівність: x / y

- Нерівність: x != y

- Є більшим: x > y

- Є меншим: x < y

- Є більшим або рівним: x >= y

- Є меншим або рівним: x <= y

Приклад:

#### Порівняння

    if PORTA
    >= 5 then
    {
            ...
    }