Главная » Bascom-8051, Basic, Железо » Организация циклов и систем реального времени BASCOM-8051

0

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 P3.3:B_clk Alias P3.2:B_fqud Alias P3.1:B_ress Alias P3.4 ‘———————

‘подключение ЦАП уровня AD766

B_datu Alias P1.0 : B_clku Alias P1.2 : B_ldu Alias P1.1

‘———————

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

$crystal = 12000000             ‘при кварце 12 МГц

$baud = 4800                    ‘скорость 4.8 кБ

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 * 10922.67      ‘2^15/3 = 10922.67 преобр. разряды ЦАП

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 * 71582.788     ‘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 – 0.005-110 kHz, 2 – 110-175 kHz, 3 – 175-280 kHz

‘4 – 280-440 kHz, 5 – 440-700 kHz, 6 – 700-1100 kHz, 7 – 1.1-1.75 МHz

‘8 – 1.75-2.8 МHz, 9 – 2.8-4.4 М, 10 – 4.4-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 0.005! , 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 P2.3 : 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

‘ реле ф. до 4.4 МГц–¬      — реле фильтра до 2.8 МГц

‘ реле ф. до 7 МГц –¬¦     ¦ — реле фильтра до 1.75 МГц

‘ реле ф. до 11 МГц-¬¦¦     ¦¦ — реле фильтра до 1.1 МГц

‘ отбойная обмотка-¬¦¦¦     ¦¦¦ — реле фильтра до 700 кГц

‘ всегда 1       -¬¦¦¦¦     ¦¦¦¦ — реле фильтра до 440 кГц

‘ всегда 1      -¬¦¦¦¦¦     ¦¦¦¦¦ — реле фильтра до 280 кГц

‘ всегда 1     -¬¦¦¦¦¦¦     ¦¦¦¦¦¦ — реле фильтра до 175 кГц

‘ всегда 1    -¬|||||||     ||||||| — реле фильтра до 110 кГц

Data &B11110000 , &B00000001       ‘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-1.75 МГЦ

Data &B11110000 , &B10000000       ‘1.75-2.8 МГЦ

Data &B11110001 , &B00000000       ‘2.8-4.4 МГЦ

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

По теме:

  • Комментарии