Організація циклів і систем реального часу BASCOM-8051

Bascom пропонує повний набір операторів для побудови повторюваних програм При програмуванні можуть застосовуватися три основні конструкції:

а) безумовний цикл, який застосовується при постійному повторенні одних і тих же дій Конструкція такого циклу будується за допомогою операторів DO .. LOOP і служить основою головного циклу майже кожної програми Конструкція безумовного циклу застосовується там, де потрібна за один прохід перевіряти

кілька умов (точніше більше одного умови)

б) умовний цикл повторюється, поки виконується, що визначає його, умова Такий цикл будується за допомогою операторів WHILE .. WEND Природно, ця конструкція може застосовуватися рідше, там, де потрібно перевіряти виконання єдиного умови

в) умовний цикл, побудований за допомогою операторів DO .. LOOP UNTIL, також може використовуватися в обмежених випадках, але його виконання залежить від невиконання умов або, навпаки, виконання заданих умов стає причиною його припинення

Далі, як приклад використання циклічних конструкцій, наведена спрощена програма цифрового синтезатора частоти і з регульованим рівнем виходу Програма, перебуваючи в головному циклі, очікує приходу керуючої команди, яка повинна містити значення встановлюваної частоти або напруги Визначення типу команди проводиться за першому символу (V або H) Далі слід цифрове значення, виражене в вольтах або кілогерцах Прийняте повідомлення перетвориться і направляється у виконавчі пристрої: ЦАП рівня вихідної напруги, цифровий синтезатор і групу реле (або аналогових ключів), що включають вихідний фільтр, відповідний воспроизводимой частоті У наведеній програмі використовуються конструкції всіх видів циклів Також є основні елементи системи відліку реального часу, що працює паралельно з основною програмою Для цього введено лічильник, модифікується в перериванні, з періодичністю в 10 мс Звичайно, в даному прикладі така система використовується з незначного приводу – створення тимчасової затримки, проте при необхідності її функції можна істотно розширити, наприклад, для формування в портах сигналів управління заданої тривалості або частоти

‘—————————————— Програма синтезатора частоти

‘——————————————

Dim B_tim As Bit біт йде відлік часу Dim Temp As Byte тимчасові дані

Dim R_tim As Byte лічильник коротких інтервалів

Dim Frng As Byte номер межі частоти

Dim R_bw As Integer код ЦАП і 16-бітові дані

Dim R_bd As Long 32-бітові дані

Dim R_fld As Single напругу або число з плаваючою точкою

Dim R_frq As Single значення частоти з плаваючою точкою

Dim Ibuf As String * 16 приймальний буфер

‘———————

‘Підключення синтезатора AD9850

B_data Alias P33:B_clk Alias P32:B_fqud Alias P31:B_ress Alias P34 ———————

‘Підключення ЦАП рівня AD766

B_datu Alias P10 : B_clku Alias P12 : B_ldu Alias P11

‘———————

‘TIMER1 в режимі 8-біт таймера з внутр тактується для синхронізації UART Config Timer1 = Timer, Gate = Internal, Mode = 2

$ Crystal = 12000000 при кварці 12 МГц

$ Baud = 4800 швидкість 48 кБ

Th1 = 243: Start Timer1 константа швидкості

‘——————— Призначення режимів переривань

On Timer0 Timer_0_int Nosave вектор переривання

Enable Timer0 дозволити переривання таймера 0

Enable Interrupts взагалі дозволити переривання

Th0 = & HD8: Tl0 = & HFD щоб переривання настало не пізніше 10 мс

‘——————— Mc:

Do Головний цикл

Input Ibuf тут чекаємо приходу керуючої команди

Temp = Asc (ibuf) вважаємо код першого символу прийнятої рядки

If Temp = & H48 Then це частота HXXXXXXXX?

Goto Herz End If

If Temp = & H56 Then це напруга VXXXXXXXX?

Goto Volt End If

Loop

‘———————

‘Обробка даних про напругу

Volt:

Temp = Len (ibuf) визначимо довжину прийнятої рядки

Ibuf = Mid (2, Temp) відкинемо префікс V

R_fld = Val (ibuf) перетворимо в число (у вольтах)

R_fld = R_fld * 1092267 2 ^ 15/3 = 1092267 перет розряди ЦАП

R_bw = R_fld перетворити в ціле число

Gosub Sload_766 завантаження даних в ЦАП AD766, AD1851

Goto Mc

‘———————

‘Обробка даних про частоту

Herz:

Temp = Len (ibuf) визначимо довжину прийнятої рядки

Ibuf = Mid (2, Temp) відкинемо префікс H

R_frq = Val (ibuf) перетворимо в число (в кілогерц)

R_fld = R_frq * 71582788 2 ^ 32 / Fclk = 4294967296/60000 kHz R_bd = R_fld перет в ціле 32-розр число

Gosub Sload_9850 завантаження даних в синтезатор AD9850

Gosub Sel_rf опр номер діапазону, соотв частоті

Gosub Set_com підключимо відповідний фільтр

Goto Mc

‘——————————————

‘Підпрограма обчислення границі частоти Результат в Frng:

‘0 – DC (менше 5 Гц), 1 – 0005-110 kHz, 2 – 110-175 kHz, 3 – 175-280 kHz

‘4 – 280-440 kHz, 5 – 440-700 kHz, 6 – 700-1100 kHz, 7 – 11-175 МHz

‘8 – 175-28 МHz, 9 – 28-44 М, 10 – 44-7 МHz, 11 – 7-11 МHz —–

Sel_rf:

Frng = 0 инициализируем лічильник меж

Do

R_fld = Lookup (frng, Hlim_fr) вважаємо чергове значення верхньої межі

If R_fld> R_frq Then порівняємо з поточною частотою

Goto S_rfe якщо нижче верхньої межі – виходимо

End If

Incr Frng перейдемо до наступного межі і повторити цикл

Loop Until Frng = 12 поки всі межі не будуть пройдені

S_rfe: Return

‘Таблиця значень верхньої межа діапазонів воспроизводимой частоти в кГц

Hlim_fr:

Data 0005 , 110 , 175 , 280 , 440 , 700

Data 1100 , 1750 , 2800 , 4400 , 7000

‘—————————————— Підпрограма завантаження даних в синтезатор AD9850

Sload_9850:

Set B_fqud: Reset B_fqud скинути інтерфейс

Set B_clk: Reset B_clk заклацнути код послідовного режиму Set B_fqud: Reset B_fqud дозволити послідовний режим висунути дані з R_bd в режимі 3 (мол спочатку, _-_)

Shiftout B_data, B_clk, R_bd, 3 висунути останній байт з режимом і фазою Temp = 0: Shiftout B_data, B_clk, Temp, 3

Set B_fqud: Reset B_fqud виконувати завантажені дані

Return

‘———————

‘Підпрограма завантаження даних в ЦАП AD766, AD1851

Sload_766:

‘Висунути дані з R_bw в режимі 0 (ст спочатку,-_-)

Shiftout B_datu , B_clku , R_bw , 0

Reset B_ldu: Set B_ldu завантажити дані

Return

‘——————————————

‘Підпрограма завантаження даних комутації для підключення на вихід

‘Синтезатора відповідного фільтра за допомогою поляризованих реле

Set_com:

Set P23: Gosub Wait_30ms включити відбійну обмотку всіх реле на 30 мс

R_bw = Lookup (frng, Tab_com) завантаження даних портів

P2 = High (r_bw): P0 = Low (r_bw) перезапис в порти

Gosub Wait_30ms включити обмотку потрібного реле на 30 мс

P2 = & b11110000: P0 = 0 очистити порти

Return —– Tab_com:

‘Таблиця сост портів упр реле, в залежності від діапазону частоти

‘ПОРТ 2 ПОРТ 0

‘Реле ф до 44 МГц – ¬ – реле фільтра до 28 МГц

‘Реле ф до 7 МГц – ¬ | | – реле фільтра до 175 МГц

‘Реле ф до 11 МГц-¬ | | | | – реле фільтра до 11 МГц

‘Відбійна обмотка-¬ | | | | | | – реле фільтра до 700 кГц

‘Завжди 1 – ¬ | | | | | | | | – реле фільтра до 440 кГц

‘Завжди 1 – ¬ | | | | | | | | | | – реле фільтра до 280 кГц

‘Завжди 1 – ¬ | | | | | | | | | | | | – реле фільтра до 175 кГц

‘Завжди 1 – ¬ | | | | | | | | | | | | | | – реле фільтра до 110 кГц

Data &ampB11110000 , &ampB00000001       DC

Data & B11110000, & B00000001 5 -110 КГЦ

Data & B11110000, & B00000010 110-175 КГЦ

Data & B11110000, & B00000100 175-280 КГЦ

Data & B11110000, & B00001000 280-440 КГЦ

Data & B11110000, & B00010000 440-700 КГЦ

Data & B11110000, & B00100000 700-1100 КГЦ

Data & B11110000, & B01000000 1 1-175 МГЦ

Data & B11110000, & B10000000 1 75-28 МГЦ

Data & B11110001, & B00000000 2 8-44 МГЦ

Data & B11110010, & B00000000 4 4-7 МГЦ

Data & B11110100, & B00000000 7 -11 МГЦ

‘—————————————— Обробка переривання таймера 0

Timer_0_int:

Counter0 = & HD8FD: Start Timer0 період прерів 10 мс

‘Компілюється простіше, якщо завантажувати лічильники наступним чином:

‘Th0 = & HD8: Tl = & HFD Ffffh-10000 = D8fdh – період прерів 10 мс

$asm

Jnb {b_tim}, Tim0_i1 обробка лічильника реального часу

Djnz {r_tim}, Tim0_i1 зменшувати до нуля

Clr B_tim коли досягнемо нуля – очистимо біт

Tim0_i1:

$end Asm Return

‘——————————————

‘Підпрограма затримки, що використовує переривання

Wait_30ms:

Set B_tim : R_tim = 3

While B_tim = 1 цикл буде повторювати наразі, не очиститься B_tim Idle чекаємо в останове

Wend Return

‘——————————————

Крім циклів, що задаються за допомогою згаданих спеціальних конструкцій, Bascom використовує приховані цикли, виконуються всередині деяких операторів:

а) WAIT, WAITMS, DELAY – тимчасової затримки Умова виходу з циклу (закінчення виконання оператора) – витікання заданого інтервалу времкені

б) BITWAIT – очікування заданого рівня бита Вихід з циклу – надходження заданого логічного

рівня біта

в) DEBOUNCE – періодичного опитування стану біта Вихід з циклу – також надходження заданого логічного рівня біта

г) WAITKEY – очікування прийому символу Вихід їх циклу – прийом символу

д) INPUT, INPUTHEX – очікування введення символьного значення змінної Вихід з циклу – прийом символу роздільника

е) INPUTBIN – очікування введення двійковій змінної Вихід з циклу – прийом необхідної кількості байтів для заповнення змінної

Циклічна конструкція FOR .. NEXT є, по суті, оператором багаторазового дії,

забезпечує виконання інших операцій задане число разів Bascom забезпечує роботу цієї конструкції з усіма типами числових змінних і констант Необхідно, щоб забезпечити правильну роботу циклу FOR .. NEXT, задавати однакові значення розмірності змінних (або констант), що визначають початкове і кінцеве значення, а також збільшення Рекомендується так будувати програму, щоб цикли FOR .. NEXT використовували тільки байтові або двобайтні параметри При цьому скомпільований код працює швидко і надійно При використанні в якості параметрів циклу чисел у форматі з плаваючою точкою, швидкодія різко знижується (приблизно до 10 мс на крок), і зростає обсяг генерованого коду У следующес розділі наведено цікавий приклад використання циклів FOR .. NEXT

Джерело: МЛКуліш, ДОВІДНИК З ПРОГРАМУВАННЯ BASCOM-8051, Краснодар 2001

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*