Вы находитесь на странице: 1из 28

Содержание.

Видимые элементы уравления. ................................................................................................................. 1


Дополнительные элементы управления. .................................................................................................. 2
Переключатель. ........................................................................................................................................... 5
Выпадающий список. .................................................................................................................................. 6
Кнопка .......................................................................................................................................................... 7
Числовой редактор...................................................................................................................................... 8
Шестнадцатеричный редактор. ................................................................................................................. 8
Последовательность шестнадцатеричных байт. ...................................................................................... 8
Текстовая метка. .......................................................................................................................................... 9
Изображение. ............................................................................................................................................10
Программный код. ....................................................................................................................................11
Глобальные переменные..........................................................................................................................11
Операции умножения (*), деления(/) и деления по модулю(%). .........................................................13
Операции сложения и вычитания. ...........................................................................................................13
Операции сдвига ( << и >>). ......................................................................................................................13
Побитовые операции – ИЛИ (|), И (&), исключающее ИЛИ (^). ............................................................14
Операции увеличения (++) и уменьшения (--). .......................................................................................14
Операция присваивания (=)......................................................................................................................14
Операции составного присваивания (*=, /=, +=, -=, &=, ^=, |=, >>=, <<=)..............................................14
Процедуры. ................................................................................................................................................15
Условный оператор if. ...............................................................................................................................16
Операторы циклов. ...................................................................................................................................16
Взаимодействие с визуальными компонентами....................................................................................18
Управление питанием (переменная POWER). ........................................................................................23
Функция захвата входящих импульсов (IRQ_ENABLE, IRQ_FLAG, CAPT_CLOCK, CAPT_MODE,
CAPT_VALUE). .............................................................................................................................................24
Функция генерации импульсов по шаблону (STREAM_PIN, StreamOut). ..............................................26
ШИМ генератор (PWM0, PWM1, PWM2). ................................................................................................27

Видимые элементы уравления.

Содержимое пункта «Микросхема» главного меню программы полностью описывается в


исходном тексте скрипта. Начало описания меню начинается со слова Menu и завершается словом
EndMenu. Между этими двумя словами размещаются строки с описанием пунктов выпадающего
меню.
В общем виде описание пункта меню имеет следующий вид

Текст_меню,имя_процедуры,код_кнопки,клавиша_быстрого_доступа.

Текст_меню – эта часть будет отображаться в названии пункта выпадающего меню. Обязательная
часть описания пункта меню.
Имя_процедуры – имя процедуры в коде скрипта, которая будет вызываться при выборе этого
пункта меню. Обязательная часть описания пункта меню.
Код_кнопки – условный код кнопки на панели инструментов программы, которая дублирует этот
пункт меню. Необязательная часть пункта меню.
Клавиша_быстрого_доступа – текстовое название клавиши, при нажатии на которую будет
выполняться этот пункт меню. Обычно это клавиши F1-F10. Необязательная часть пункта меню.

Все элементы описания отделяются друг от друга запятой.


В качестве описания можно указать один символ «-» (минус), в этом случае реальное меню будет
содержать линию разделителя в этом месте.

Следующий рисунок демонстрирует исходный текст описания меню и вид меню в программе.

Условные коды кнопок на панели инструментов программы.

Если какая-то кнопка не задействована в скрипте (не описана в меню), то она будет отображаться
в неактивном состоянии и будет недоступна для нажатия.

Необязательные параметры Код_кнопки и Клавиша_быстрого_доступа могут отсутствовать в


описании, но запятые разделяющие эти параметры, должны присутствовать. Рисунок для примера:

Символ «&» в тексте пункта меню используется для обозначения клавиши быстрого вызова на
символьной клавиатуре. Следующий символ в реальном меню будет отображаться подчеркнутым.
Но отображение подчеркивания зависит от выбранной темы программы и Windows и
отображается не всегда.

В некоторых случаях скрипт не предусматривает использование меню. В этом случае все описание
меню в скрипте должно отсутствовать. При загрузке такого скрипта пункт «Микросхема» в
главном меню программы будет неактивным.

Дополнительные элементы управления.


При необходимости в скрипте можно задать дополнительные визуальные элементы управления,
которые будут отображаться на панели вверху редактора программы.

Могут быть использованы следующие визуальные элементы:

Переключатель

Выпадающий список

Кнопка

Числовой редактор

Шестнадцатеричный редактор

Последовательность шестнадцатеричных байт

Текстовая метка

Кроме того могут быть использованы два элемента, предназначенных только для визуального
оформления панели скрипта:

Группа

Изображение

При использовании дополнительных элементов сначала должна быть описана панель, в которой
будут отображаться визуальные компоненты:

Window(c=”Панель элементов”;w = 300;h=200;a=h)


{
… внутри фигурных скобок размещается описание визуальных элементов.
}

Первый параметр описания С=”Панель элементов” – заголовок панели. Он никак не отображается


на экране, но он обязательно должен присутствовать.
Второй параметр w=300 (или width=300) – длина панели компонентов в пикселях.
Третий параметр h=200 (или height=200)– высота панели в пикселях.
Четвертый параметр a=h (или align=h) – ориентация панели на экране. Может иметь два значения:

a=h – панель располагается горизонтально надо редактором программы.


a=v – панель располагается вертикально справа от редактора программы.

Исходный текст пустого скрипта с описанием панели визуальных компонентов (непонятные строки
«Editor» будут описаны далее):

Исходный текст скрипта Вид

Window(C = "Тест визуальных компонентов"; w=300;h=200;align=h)


{
}

Editor
{
(C="EEPROM";size=1024;mode=8)
}

$HOST

Если же изменить ориентацию панели (выделено красным цветом):

Исходный текст скрипта Вид

Window(C = "Тест визуальных компонентов";w=300;h=200;align=v)


{
}

Editor
{
(C="EEPROM";size=1024;mode=8)
}

$HOST

За описанием окна может следовать описание редактора программы. Если же это описание
отсутствует, то редактор в программе отображаться не будет. В этом случае панель визуальных
компонентов будет отображаться в центре рабочей области программы. В этом случае
информация об ориентации панели игнорируется (но она должна присутствовать!!!).

Исходный текст скрипта Вид

Window(C = "Тест визуальных компонентов"; w=300;h=200;align=v)


{
}

$HOST
Редактор программы может содержать одну или две фиксированных закладки с данными. Эти
закладки должны быть описаны в скрипте. Формат описания следующий:

Для одной закладки:

Editor
{
(C="EEPROM";size=1024;mode=8;bytes=16)
}

Для двух закладок:

Editor
{
(C="EEPROM"; size=1024; mode=8)
(C="FLASH"; size=65536; mode=16)
}

Первый параметр C="EEPROM" – текстовая надпись, которая будет отображаться на закладке.


Второй параметр size=1024 – размер редактора в байтах.
Третий параметр mode=8 (или mode=16) задает режим отображения данных в редакторе –
байтами (8 бит) или словами (16 бит) при загрузке скрипта. Пользователь затем может изменить
режим отображения.

Вот как будет выглядеть редактор с описанием выше:

Первая описанная закладка будет отображаться левее.


Все визуальные элементы управления должны описываться внутри фигурных скобок описания
окна.

Переключатель.

Общий вид описания переключателя:

Checkbox(caption=”Переключатель”;left = 5;top=5;value=1;name=cb1)

Checkbox – признак описания переключателя. Далее в круглых скобках описываются параметры


переключателя, разделенные точкой с запятой. Общий вид описания параметра имеет вид:

имя_параметра = значение

caption=”Переключатель” – текстовая метка, которая будет отображаться возле переключателя


left=5 – горизонтальная позиция переключателя на панели
top=5 – вертикальная позиция переключателя на панели
value=1 – начальное состояние переключателя при загрузке скрипта. Может иметь значения «1»
или «0»
name=cb1 – имя переключателя (cb1), по которому можно будет обращаться к переключателю из
текста скрипта. Имена для всех визуальных компонентов должны быть уникальными (!).

Кроме указания полных названий параметров, можно использовать только начальные буквы
названий параметров

caption = c
left = l
top = t
value = v

Последовательность описания параметров в круглых скобках может быть произвольной.

Исходный текст скрипта Вид


Window(C = "Тест визуальных компонентов"; w=300;h=60;align=h)
{
checkbox(caption="Переключатель 1";left=5;top=5;value=1;name=cb1)
checkbox(c="Переключатель 2";l=5;t=25;v=0;n=cb2)
}

Editor
{
(C="EEPROM";size=1024;mode=8)
(C="FLASH";size=65536;mode=16)
}

$HOST

Выпадающий список.
Общий вид описания выпадающего списка:

list(caption="Выпадающий список";l=120;top=65;w=100;items="Строка 0",


"Строка 1",
"Строка 2",
"Строка 3",
"Строка 4",
"Строка 5")
Параметры l (left), t (top) имеют такое же значение, как и для переключателя. Кроме того,
выпадающий список имеет еще два параметра:
width (или просто w) – длина активной области списка.
Items (или просто i) – набор текстовых строк, которые будут отображаться в списке. Строки
записываются в двойных кавычках и отделяются друг от друга запятой.

Исходный текст скрипта Вид


Window(C = "Тест визуальных компонтов"; w=300;h=100;align=h)
{
checkbox(caption="Переключатель 1";left=5;top=5;value=1;name=cb1)
checkbox(c="Переключатель 2";l=5;t=25;v=0;n=cb2)
list(caption="Выпадающий список";l=120;top=65;w=100;items="Строка 0",
"Строка 1",
"Строка 2",
"Строка 3",
"Строка 4",
"Строка 5";
name=list1)
}

Editor
{
(C="EEPROM";size=1024;mode=8)
(C="FLASH";size=65536;mode=16)
}

$HOST

Следует обратить внимание, что параметр left (l) задает координату рисования активной области
списка, а не текстовой подписи.

Кнопка
Общий вид описания кнопки

Button(caption="Кнопка";left=5;top=5;width=60;height=25;proc=proc1)

caption=”Кнопка” – текстовая метка, которая будет отображаться на кнопке


left=5 – горизонтальная позиция кнопки на панели
top=5 – вертикальная позиция кнопки на панели
width=60 – длина кнопки
height=25 – высота кнопки
proc=proc1 – «proc1» имя функции в тексте кода скрипта, которая будет запускаться при нажатии
на эту кнопку. Процедура с таким именем обязательно должна быть, иначе будет получена
ошибка при компиляции скрипта.

Исходный текст скрипта Вид


Window(C = "Тест визуальных компонтов"; w=300;h=50;align=h)
{
Button(caption="Кнопка";left=5;top=5;width=60;height=25;proc=proc1)
}

Editor
{
(C="EEPROM";size=1024;mode=8)
(C="FLASH";size=65536;mode=16)
}

$HOST

proc proc1() – эта функция обязательно должна быть!


{
}
Числовой редактор.

Шестнадцатеричный редактор.

Эти элементы практически аналогичны. Они служат для ввода и отображения числового значения.
Числовой редактор работает с числами в обычном десятичном виде, шестнадцатеричный – в
шестнадцатеричном (HEX) виде.

Общий вид описания:

Десятичный редактор
digit(c="Десятичное число";left=100;top=10;width=80;name=digit1;value=1234)

Шестнадцатеричный редактор
hexedit(c="НEX число";left=100;top=35;width=80;name=hexdigit1;value=1234)

Как видно, описания отличаются только именем класса (digit или hexedit). Параметр value
необязательный, он задает начальное значение, которое будет отображаться в редакторе при
загрузке скрипта. При отсутствии этого параметра начальное значение будет равно нулю. Все
остальные параметры должны быть указаны обязательно.

Исходный текст скрипта Вид


Window(C = "Тест визуальных компонтов"; w=300;h=80;align=h)
{
digit(c="Десятичное число";left=100;top=10;width=80;name=digit1;value=1234)
hexedit(c="НEX число";left=100;top=35;width=80;name=hexdigit1;value=1234)
}

Editor
{
(C="EEPROM";size=1024;mode=8)
(C="FLASH";size=65536;mode=16)
}

$HOST

proc proc1()
{
}

Последовательность шестнадцатеричных байт.

Этот элемент служит для отображения цепочки байт в шестнадцатеричном виде.

Описание:

hexbytes(c="Security bytes";name=sec_bytes;left=490;top = 10;w=200;value = 8;


items="FF FF FF FF FF FF FF FF")

В данном случае параметр value задает количество байт, которые будут отображаться в редакторе,
items – текстовая строка в кавычках с начальными значениями байт. Параметр items –
необязательный, если он не указан, то начальные значения байт будут равны нулю.
Исходный текст скрипта Вид
Window(C = "Тест визуальных компонтов"; w=300;h=80;align=h)
{
hexbytes(c="Security bytes";name=sec_bytes;left=100;top = 10;
w=200;value = 8;items="FF FF FF FF FF FF FF FF")
hexbytes(c="Байты";name=bytes;left=100;top = 35;w=200;value = 5)
}

Editor
{
(C="EEPROM";size=1024;mode=8)
(C="FLASH";size=65536;mode=16)
}

$HOST

Текстовая метка.
Текстовая метка служит для отображения какой-либо текстовой информации на экране.

Описание:

Label(c="Текстовая метка";name=lbcb;left= 5;top=75)

Длина метки автоматически корректируется в зависимости от ее текста.

Группа
Группа представляет собой визуальный компонент с рамкой и необязательным заголовком.
Предназначен для визуального отделения других визуальных элементов управления.

Описание:

Group(c="Группа 1";left=5;top=5;w=250;h=120)

c (caption) – текстовый заголовок группы. Остальные элементы задают положение группы на


панели.
За описанием группы обязательно должны следовать фигурные скобки, внутри которых должны
располагаться описания визуальных компонентов, которые будут отображаться внутри этой
группы. Причем координаты расположения компонентов будут отсчитываться от верхнего левого
угла группы, а не от левого верхнего угла панели.

Исходный текст скрипта Вид


Window(C = "Тест визуальных компонтов"; w=300;h=120;align=h)
{
Group(c="Группа 1";left=5;top=5;w=150;h=60)
{
label(c="Метка 1";name=lb1;left=5;top=15)
checkbox(c="Переключатель 1";name=cb1;left=5;top=30)
}
label(c="Надпись вне группы";l=5;top=70)
Group(c="Группа 2";left=160;top=5;w=150;h=100)
{
label(c="Метка 2";name=lb2;left=5;top=15)
checkbox(c="Переключатель 2";name=cb2;left=5;top=30)
}
}
Editor
{
(C="EEPROM";size=1024;mode=8)
(C="FLASH";size=65536;mode=16)
}

$HOST

Изображение.
Также на панели можно разместить изображение.

Общее описание:

picture(c="logo.png";l=10;t=20;w=0;h=0)

с (caption) – имя файла изображения, сам файл должен находиться в папке Pictures программы.
Возможно расположение файла во вложенных папках в папке Pictures программы, тогда имя
файла должно содержать слева имя вложенной папки, отделенное левым слэшем.

Параметры w (width) и h(height) необязательные. Если хотя бы один из этих параметров


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

Поддерживаются три типа файлов изображения – JPEG, BMP и JPEG.

Следующий пример показывает отображение одной и той же картинки в разных форматах

Исходный текст (картинка PNG расположена во вложенной папке audi в папке Pictures, остальные
в папке Pictures):

Window(C = "Тест визуальных компонтов"; w=400;h=120;align=h)


{
Group(c="PNG";left=5;top=5;w=150;h=100) { picture(c="audi\audi_logo_2.png";l=10;t=20;w=0;h=0 }
Group(c="BMP";left=160;top=5;w=150;h=100) { picture(c="audi_logo.bmp";l=10;t=20;w=0;h=0) }
Group(c="JPEG";left=320;top=5;w=150;h=100) { picture(c="audi_logo.jpg";l=10;t=20) }
}

Editor
{
(C="EEPROM";size=1024;mode=8)
(C="FLASH";size=65536;mode=16)
}

$HOST

Результат:
У исходной BMP картинки фон был черный. Цвет левого верхнего пиксела для BMP картинки
принимается за прозрачный и заменяется цветом фона панели. JPG картинка отображается без
изменений.

Программный код.

Программный код разделен на две секции: первая исполняется на компьютере, вторая


загружается в программатор и исполняется там.

Началом секции кода для компьютера служит метка $HOST, для программатора - $DEVICE. В
общем виде полный исходный файл имеет формат:

Описание меню (может отсутствовать)


Описание визуальных элементов (может отсутствовать)
Описание редактора (может отсутствовать)

$HOST

… Код для компьютера

$DEVICE

… Код для программатора

Синтаксис языка скриптов аналогичен синтаксису языка Си. Компилятор не различает заглавные и
прописные символы в тексте. Все символы во время компиляции преобразуются в заглавные.
Язык имеет следующий список зарезервированных слов, которые не могут быть использованы в
качестве имен переменных или процедур:

if, while, else, define, return, break, for, do, proc, var, byte, word, dword, int, delay, device, continue,
backup, public, string

Язык поддерживает директиву подстановки #define

Описание подстановки имеет вид:

#define идентификатор строка


Конец идентификатора определяется по первому встреченному пробелу. Все последующие
появления в тексте идентификатора заменяются соответствующей строкой.

Например:

#define NULL 0

Все последующие встреченные в тексте идентификаторы NULL будут заменены на символ нуля.

Глобальные переменные.
Поддерживаются три типа глобальных переменных:

byte – байт (8 бит)


word – слово (16 бит)
dword – двойное слово (32 бита)
и массивы этих переменных.

Все переменные имеют беззнаковый тип (только положительные значения).

Так же в секции $HOST могут быть использованы стоковые переменные string.

Глобальные переменные должны быть объявлены в тексте программы до начала процедуры,


которая будет их использовать. Объявление начинается с указания типа переменной, затем после
пробела следуют имена переменных, разделенные запятыми. Завершается объявление точкой с
запятой.

Примеры:

byte cnt,ttt,www,eee;
word w1,w3,w4;
dword dw4,dw5;

имена переменных не должны совпадать с зарезервированными словами языка и именами


других переменных.

Объявление массивов переменных.

byte b[10],bb[40],array[4];

В квадратных скобках после имени массива указывается размер массива. При таком объявлении
начальные значения элементов массива имеют случайные значения.

Кроме того массив может быть задан явным перечислением его элементов:

byte barray[] = {1,2,3,4,5,6,7,8};

при таком объявлении размер массива вычисляется автоматически.

byte sarray[] =”массив”;

при таком объявлении массив будет содержать коды символов строки “массив” и в конце
автоматически будет добавлен 0.

word warray[32] = {10,20,30,40};

при таком объявлении массив будет иметь 32 элемента, первые из них будут иметь значения
10,20,30,40, остальные будут иметь значение 0.

Строковые переменные служат для манипуляции со стоковыми переменными.

string s1, ss2;

Внутри процедуры могут быть объявлены только локальные переменные с помощью


зарезервированного слова var:

proc test()
{
var a,b,c,d;
}
Локальные переменные всегда имеют размер 32 бита и являются беззнаковыми.

Операции умножения (*), деления(/) и деления по модулю(%).


Операции имеют вид:

выражение1*выражение2
выражение1/выражение2
выражение1%выражение2

Если результат умножения (*) превышает максимально допустимое значение (0xFFFFFFFF), то


происходит потеря старших значащих бит. Операндами могут быть все поддерживаемые
выражения (переменные, числа). При вычислении все операнды автоматически преобразуются в
32-битный вид.

Если при делении выражение2 равно 0, то результат деления будет неопределенный.

При операции деления по модулю (%) результатом будет остаток от деления выражения1 на
выражение2. Например:

a = 9 % 5 – результат 4
a = 9 % 3 – результат 0

Операции сложения и вычитания.


Операции имеют вид:

выражение1+выражение2
выражение1-выражение2

Операции вычисляются слева направо. Операндами могут быть все поддерживаемые выражения
(переменные, числа). При вычислении все операнды автоматически преобразуются в 32-битный
вид.

Если при сложении результат превышает значение 0xFFFFFFFF, то происходит потеря старших
значащих бит.
Если при вычитании выражение2 больше чем выражение1 (ожидается отрицательный результат),
то результатом будет двоичное дополнение до нуля. Например:

a = 0-1 – результатом будет 0xFFFFFFFF

Операции сдвига ( << и >>).

Операции имеют вид:

выражение1 << выражение2


выражение1 >> выражение2

Операции выполняются слева направо. Выражение1 может быть только переменной. При сдвиге
освобождаемые биты заполняются нулями.
Побитовые операции – ИЛИ (|), И (&), исключающее ИЛИ (^).

Операции имеют вид:

выражение1 | выражение2
выражение1 & выражение2
выражение1 ^ выражение2

Операции выполняются слева направо.

Операции увеличения (++) и уменьшения (--).


Операции имеют вид

выражение++
выражение--

Операция выполняется справа налево. выражение может быть только переменной.

выражение x++
эквивалентно выражению x = x + 1

выражение x--
эквивалентно выражению x = x - 1

Операция присваивания (=).

Операция имеет вид:

выражение1 = выражение2;

Операция выполняется справа налево.


выражение2 может быть составным. выражение1 может быть только переменной или массивом.
результат выражения всегда имеет размер 32 бита. Если выражение1 имеет меньший размер, то
при присваивании лишние старшие биты отбрасываются.

Операции составного присваивания (*=, /=, +=, -=, &=, ^=, |=, >>=, <<=).

Запись операции составного присваивания

x операция= y эквивалентна x = x операция y

Например выражение

d *= (4+6);

эквивалентно выражению

d = d *(4+6);
Процедуры.
Код для компьютера представляет собой набор процедур, которые запускаются при помощи
меню программы или кнопок на панели инструментов или кнопок на панели визуальных
компонентов.

Общий вид описания процедуры следующий:

proc имя_процедуры(param1,param2,param3)
{
… код процедуры
}

proc – зарезервированное слово, означающее начало процедуры.


имя_процедуры – имя процедуры, может быть любым словом, не совпадающим с
зарезервированными словами языка и именами других процедур или переменных.
За именем процедуры в круглых скобках перечисляются имена параметров, передаваемых в эту
процедуру. Эти параметры автоматически объявляются как локальные переменные типа var для
этой процедуры.

Процедура может не иметь параметров, в таком случае после имени процедуры указываются
пустые круглые скобки. Процедуры, вызываемые пользователем из меню или кнопками, должны
быть именно такими, без параметров.

Если какая-то процедура вызывает другую процедуру, то вызываемая процедура должна


находиться выше по тексту, что бы компилятор уже знал количество параметров, которое нужно
этой процедуре.

Например процедура p1 должна вызывать процедуру p2. Тогда в тексте они должны идти в
следующем порядке:

proc p2(a,b)
{
var c;
c = a+b;
return(c);
}

proc p1()
{
var a;
a = p2(34,67);
}

Для возврата значения из вызываемой процедуры в вызывающую служит оператор return.


Оператор имеет вид:

return(выражение); или
return;

во втором случае оператор не возвращает значения, а служит для досрочного выхода из


процедуры. При достижении такого оператора управление передается вызывающей процедуре, а
если текущая процедура была вызвана пользователем, то выполнение кода завершается.
Процедура может иметь несколько операторов return. Обычно это связано с проверкой какого-
нибудь условия.

Возвращаемое значение всегда имеет размер dword (32 бита).

Если функция не имеет оператора return, то процедура завершается после выполнения


последнего оператора тела процедуры.

Условный оператор if.


Оператор if используется для разветвления вычислительного процесса в зависимости от
некоторого условия.

Оператор if имеет вид:

If(выражение)
оператор1;
else
оператор2;

или

If(выражение)
{
операторы1;
}
else
{
операторы2;
}

выражение должно быть простым условием сравнения. Составные операторы сравнения не


поддерживаются.

Выполнение оператора if сводится к следующему:


1. Если выражение истинно или не равно нулю, то выполняется оператор1, а оператор2
(если он есть) игнорируется.
2. Иначе оператор1 игнорируется и выполняется оператор2.

Ключевое слово else и оператор2 могут отсутствовать. Например:

If(a < b)a = 0;


if(a < 0) a = c;
else a = b;

Операторы циклов.

Поддерживается два оператора циклов: for и while.

Общий вид цикла while:

while(выражение) оператор;
или

while(выражение)
{
…операторы;
}
Оператор или операторы внутри цикла выполняются до тех пор, пока выражение истинно или не
равно нулю.

Если внутри цикла встречается оператор break, то выполнение цикла завершается немедленно,
независимо от истинности выражения.

while(a != 100)
{

If(a = 55) break; // если переменная а будет равна 55, то цикл завершится немедленно

}

Если внутри цикла встречается оператор continue, то выполнение цикла возвращается в начало
цикла, все операторы, следующие за оператором continue, игнорируются.

Общий вид цикла for:

for(выражение1;выражение2;выражение3)
оператор ;

или

for(выражение1;выражение2;выражение3)
{
…операторы
}

выражение1 описывает инициализацию цикла. Выполняется один раз при запуске цикла.
выражение2 описывает условие проверки завершения цикла, проверяется при каждой итерации
цикла. Цикл продолжается, пока выражение2 истинно.
выражение3 описывает приращение цикла на шаг, вычисляется после каждой итерации.

Все три выражения в заголовке цикла for не являются обязательными. Любое из трех или все три
выражения могут отсутствовать, однако разделяющие их точки с запятой опускать нельзя. Если
опущено выражение2 (проверка условия завершения цикл), считается, что оно постоянно истинно.
Таким образом, оператор for вида

for(;;)
{
…операторы
}

представляет собой бесконечный цикл. В таком случае необходимо обеспечить проверку


завершения цикла и выход из него при помощи оператора break внутри тела цикла.
Если внутри тела цикла встречается оператор continue, то выполнение цикла продолжается с
начала цикла, все последующие операторы за continue игнорируются.
Взаимодействие с визуальными компонентами.

Все визуальные компоненты имеют параметр name. Для обращения к элементу необходимо
использовать это имя. Фактически имя элемента является глобальной переменной.
Например, если имеется переключатель, описанный следующим образом:

checkbox(caption="Переключатель 1";left=5;top=5;value=1;name=cb1)

то имя этого переключателя будет cb1 (name=cb1), выражение

a = cb1;

присвоит переменной “а” текущее состояние переключателя: 1 – если переключатель активен


(помечен), 0 – если неактивен.

Если же присвоить имени переключателя какое-нибудь значение, то состояние переключателя на


панели измениться. Если присвоить 0, то переключатель будет выключен, если любое ненулевое
значение – будет включен.

Пример для выпадающего списка:

list(caption="Выпадающий список";l=120;top=65;w=100;items="Строка 0",


"Строка 1",
"Строка 2",
"Строка 3",
"Строка 4",
"Строка 5";
name=list1)

Имя переменной для списка будет list1. Эта переменная содержит индекс выбранной в данный
момент строки в списке. Самая первая строка имеет индекс 0. Если же переменной list1 присвоить
какое-либо значение, то в списке отобразится строка с указанным индексом. Если присвоенное
значение превышает количество строк в списке, то будет отображаться строка с максимальным
индексом.

Имя-переменная для числового редактора и шестнадцатеричного редактора содержит число,


которое было введено пользователем на экране. Если присвоить числовому или
шестнадцатеричному редактору какое-либо значение, то это значение отобразится на экране.

Обращение к последовательности байт производится как к массиву. Имя массива – имя


последовательности байт, далее в квадратных скобках – индекс байта, к которому нужно
обратиться. Самый левый байт на экране имеет индекс 0. Если индекс превышает количество байт
в редакторе, то запись в байт игнорируется, а чтение дает неопределенный результат.

Пример:

hexbytes(c="Байты";name=bytes;left=100;top = 35;w=200;value = 5)

Что бы записать значение 0х12 в самый левый байт, нужно в тексте скрипта записать:

bytes[0] = 0x12;
Периферийные устройства программатора.
Программатор имеет:

Последовательный порт UART.


Последовательная шина SPI.
Шим-генератор PWM (3 канала)
АЦП (4 канала, 10 бит)
Порты общего назначения: PORTA, PORTB, PORTD, PORTE.

Порты общего назначения.

Разводка портов по разъему программатора показана на рисунке:

Если включен внутренний узел, управляющий какой-либо альтернативной функцией в порту, то


данный вывод становится недоступен через регистр порта. При выключении аппаратного узла
вывод становится вновь доступным.
Для установки высокого уровня на нужном выводе порта (работающего на выход) необходимо
записать в соответствующий бит порта «1», для установки низкого уровня – «0».
При чтении регистра порта будут прочитаны значения, физически присутствующие на выводах
порта.

PORTA
Номер бита
7 6 5 4 3 2 1 0
порта
Номер вывода 1 17 2 - - 22 21 20
Направление Выход Выход Вход - - Выход Выход Выход
Альтернативная
RTS TXD RXD - - PWM2 PWM1 PWM0
функция

PORTB
Номер бита
7 6 5 4 3 2 1 0
порта
Номер вывода - 4 3 16 18 - - 19
Направление - Выход Выход Вход Выход - - Вход
Альтернативная
- SPCK MOSI MISO SPI_CS - - -
функция
PORTD
Номер бита
7 6 5 4 3 2 1 0
порта
Номер вывода - 5 - - - - 6 -
Направление - Вход - - - - Вход -
Альтернативная
- IRQ - - - - RDY -
функция

PORTE
В отличие от остальных портов (PORTA, PORTB, PORTD) PORTE является квазидвунаправленным 8-
битным портом общего назначения. Все выводы этого порта не имеют альтернативных функций.

Номер бита
7 6 5 4 3 2 1 0
порта
Номер вывода 26 25 24 23 10 9 8 7

Выхода порта PORTE выполнены по схеме с открытым коллектором с внутренним подтягивающим


резистором 4.7К. Для разрешения ввода информации в порт необходимо в нужный бит записать
«1».

Последовательный порт.

Расположение сигнальных выводов на разъеме программатора:

Вывод 2 (RXD) – вход последовательного порта.


Вывод 17 (TXD) – выход последовательного порта.
Вывод 1 (RTS) – используется для аппаратного управления направлением передачи драйвера
RS485 при выбранном режиме работы RS485. В других режимах отключен от аппаратного порта и
доступен для управления через регистры портов общего ввода-вывода.
Управление последовательным портом осуществляется при помощи двух регистров: UART_CR и
UART_DATA

UART_CR – регистр настройки работы режима порта.

Назначение битов UART_CR следующее:

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
- - Вкл Режим Контроль Количество Длина символа - Скорость
Выкл работы четности стоп-бит

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Скорость
Бит 29
1: последовательный порт включен
0: последовательный порт выключен
Если аппаратный UART включен, то его выводы недоступны для уравления через регистры портов
общего назначения.
Биты 28,27 – режим работы
00: стандартный UART
01: режим RS485
10: режим IrDA
11: режим Манчестер
Биты 26,25,24 – контроль четности
000: дополнение до четного количества «1»
001: дополнение до нечетного количества «1»
010: принудительный «0»
011: принудительная «1»
100: контроль четности отключен
Биты 23,22 – количество стоп-бит
00: 1 стоп-бит
01: 1.5 стоп-бита
10: 2 стоп-бита
Биты 21,20,19 – длина символа в битах
000: 5 бит
001: 6 бит
010: 7 бит
011: 8 бит
100: 9 бит
Биты 17… 0
Числовое значение скорости. Максимальное значение 460800.

Регистр UART_DATA служит для передачи информации через последовательный порт. При записи
любого значения в этот регистр это значение будет немедленно выдано на передачу.

Если при чтении UART_DATA 15 бит прочитанного значения установлен (прочитано значение
0x8XXX), то во входном буфере порта нет данных. Если же данные есть, то 15 бит будет сброшен и
младшие биты UART_DATA будут содержать символ, принятый последовательным портом.

UART имеет внутренний входной буфер размером 32 символа. При выключении и последующем
включении UART входной буфер очищается, все непрочитанные символы теряются.

Пример инициализации порта:

Скорость: 19200
Размер символа: 8 бит
Паритет: отключен
Количество стоп-бит: 1.5
Режим работы: нормальный

UART_CR = (1<<29) | (0<<27) | (4<<24) | (1<<22) | (3<<19) | 19200;


Универсальная последовательная шина SPI

Выводы, используемые SPI, показаны на рисунке.

PORTB.6/SPCK – вывод тактирования передачи/приема


PORTB.5/MOSI – выход данных
PORTB.4/MISO – вход данных
PORTB.3/SPI_CS – выход сигнала «выбор кристалла» для подчиненного устройства

Управление режимом работы SPI производится через регистр SPI_CS

31 30 29 28 27 26 25 24
Вкл/выкл Медленно - - - - - -

23 22 21 20 19 18 17 16
- - - - - - - -

15 14 13 12 11 10 9 8
Делитель/задержка

7 6 5 4 3 2 1 0
HW_CS NCPHA CPOL

Бит 31
0: SPI выключена
1: SPI включена
Бит 30
0: «Быстрый» режим
1: «Медленный режим»
Если этот бит равен установлен в «0», то значения битов 15…8 (делитель/задержка)
рассматриваются как делитель опорной частоты для получения тактовой частоты шины SPI.
Опорная частота равна 48Мгц. Таким образом, максимальная частота работы SPI может быть 48/1
= 48МГц, минимальная 48Мгц/255 = 188.235 Кгц. Если такая частота слишком высокая, то бит 30
следует установить в «1». В этом случае биты делитель/задержка задают длительность тактового
импульса SPI в микросекундах.
Биты 15…8
Делитель частоты тактирования или длительность тактового импульса
Бит 2
0: режим аппаратного управления SPI_CS отключен.
1: режим аппаратного управления выводом SPI_CS включен. Программатор будет самостоятельно
переводить SPI_CS в «0» перед началом передачи и восстанавливать в «1» после завершения
передачи.
Бит 1
0: пассивное состояние линии SPCK – «0»
1: пассивное состояние линии SPCK – «1»

Управление питанием (переменная POWER).

Управление питанием выходов-входов программатора осуществляется при помощи переменной


POWER. Назначение битов переменной следующее:

Номер бита
переменной Назначение
POWER
Управление питанием выходных пинов программатора (напряжение VCC). Так же
VCC присутствует на выводах 31, 32 разъема и может быть использовано для
питания внешнего устройства.
0
«0» - VCC выключено.
«1» - VCC включено.
При чтении возвращается текущее состояние питания VCC.
Управление уровнем VCC
1 «0» - VCC = 3.3В
«1» - VCC = 5В
Управление выходом 12/10В (выводы 29,30).
«0» - 12/10 В выключено.
2
«1» - 12/10 В включено.
При чтении возвращается текущее состояние выхода 12/10В.
Управление уровнем 12/10В
3 «0» - 10В
«1» - 12В
4 Управление выходом 5В, получаемых от внешнего источника питания
программатора (не от USB). Вывод 16.
«0» - 5В выключено.
«1» - 5В включено.
Индикатор подключения внешнего источника питания.
5 «0» - внешний источник питания отключен
«1» - внешний источник питания подключен

Индивидуальное управление питаниями следует осуществлять с помощью операций OR (|) и


AND(&). Например в следующем случае

POWER = 1;

произойдет включение VCC. Но при этом его уровень будет 3.3В и выхода 12/10 и
дополнительных 5 вольт отключатся если они были включены до этого, потому что в эти биты
будут записаны нули. Поэтому для включения только VCC, не затрагивая остальные биты, следует
записать

POWER |= 1;

Значения всех битов сохраняются, пока на программатор подано питание.


Функция захвата входящих импульсов (IRQ_ENABLE, IRQ_FLAG,
CAPT_CLOCK, CAPT_MODE, CAPT_VALUE).

Входом для импульсов может быть только вывод PORTD.6 (IRQ).

Включение функции захвата прерывания производится записью «1» в переменную IRQ_ENABLE.


Выключение – записью «0» в эту же переменную.

IRQ_ENABLE = 1; // захват включен


IRQ_ENABLE = 0; // захват выключен

Фактически это разрешает программный захват прерывания от входа PORTD.6 (IRQ). Факт наличия
прерывания (любой фронт на входе IRQ) можно определить по состоянию переменной IRQ_FLAG.
Если при чтении этой переменной она имеет ненулевое значение, то было зарегистрировано
изменение уровня на входе IRO. ЗНАЧЕНИЕ ПЕРЕМЕННОЙ IRQ_FLAG АВТОМАТИЧЕСКИ
СБРАСЫВАЕТСЯ В «0» ПРИ ЧТЕНИИ!!! Ненулевое значение хранится в переменной от момента
прерывания до первого чтения этой переменной. Следующий рисунок демонстрирует состояние
IRQ_FLAG в различных вариантах. Предполагается, что до этого прерываний не было, поэтому
первое значение IRQ_FLAG равно «0».

Дополнительно имеется возможность захватывать длительность импульсов, приходящих на вход


IRQ_FLAG. Управляется эта функция при помощи переменных CAPT_MODE и CAPT_CLOCK.

CAPT_CLOCK задает частоту, с которой будут считаться длительности входящих имульсов.

Значение CAPT_CLOCK Частота счета


CAPT_CLOCK = 0 24 МГц
CAPT_CLOCK = 1 6 МГц
CAPT_CLOCK = 2 1.5 МГц
CAPT_CLOCK = 3 375 кГц
CAPT_CLOCK = 4 46875 Гц

Любые другие значения недопустимы.

CAPT_MODE задает режим работы захвата импульсов.


Бит 31 Биты 30…24 Биты 23…16 Биты 15…8 Биты 7…0
Режим захвата Граница 0 Граница 1 Граница 2 Граница 3

Если в бит 31 будет записано значение 0, то режим захвата работает следующим образом:
При чтении переменной CAPT_VALUE она содержит значение, которое насчитал таймер между
двумя предыдущими прерываниями по входу IRQ. Это значение изменяется только при
очередном прерывании, между прерываниями оно содержит последнее захваченное значение.

Максимальное значение длины импульса – 65535 (0xFFFF). Если длительность импульса


превышает это значение, то таймер продолжит отсчет с нуля, соответственно, значение будет
некорректное. Значения битов Граница 0, Граница 1, Граница 2 и Граница 3 в этом режиме не
используются.
Например, если частота таймера счета задана равной 375 кГц, а на вход IRQ поступают импульсы
длительностью 125 микросекунд, то после очередного прерывания CAPT_VALUE будет содержать
значение

125 мкС = 1000000/125 = 8кГц


375000 / 8000 = 46,875 (фактически будет 46)

что попадает в допустимые значения таймера (0…65535).

Если же частота счета будет задана 1.5МГц, то длительность импульса получится

1500 000 / 8000 = 187,5 (фактически будет 187)

Если же в 31 бит записана «1», то режим захвата работает с учетом битов Граница 0, Граница 1,
Граница 2 и Граница 3. Причем должны обязательно выполнятся условия:

Граница 0 < Граница 1


Граница 2 < Граница 3

При чтении значения CAPT_VALUE присходит следующее:


Бит 7 содержит значение полярности последнего пришедшего импульса: «1» - высокий уровень,
«0» - низкий уровень.
Младшие 7 бит содержат код принятого импульса:
Если Граница 0 <= длительность импульса <= Граница 1, то результат 0
Если Граница 2 <= длительность импульса <= Граница 3, то результат 1
Если оба этих условия не выполняются, то результат будет 255.

Предположим, что нужно обеспечить прием и декодирование импульсной последовательности


состоящей из импульсов длительностью 125 и 250 микросекунд.

Частоту тактирования выбираем 46875 Гц (CAPT_CLOCK = 4). При этом значения захвата будут:

125мкС (8кГц): 46875/8000 = 5,8


250мкС (4кГц) 46875/4000 = 11,7

В значение Граница 0 и Граница 1 записываем значения, в которые должна попадать


длительность короткого импульса:

Граница 0 = 2, Граница 1 = 8

В значение Граница 2 и Граница 3 записываем значения, в которые должна попадать


длительность длинного импульса:

Граница 0 = 9, Граница 1 = 14

Значение CAPT_MODE будет:


CAPT_MODE = 0x80000000 | (2<<24)|(8<<16)|(9<<8)|14;

Общий вид инициализации захвата:


CAPT_CLOCK = 4;
CAPT_MODE = 0x80000000 | (2<<24)|(8<<16)|(9<<8)|14;
IRQ_ENABLE = 1;

После этого после каждого прерывания значение CAPT_VALUE будет содержать следующие
возможные значения:

0x80 – положительный импульс длительностью 125мкС


0x00 – отрицательный импульс длительностью 125мкС
0x81 – положительный импульс длительностью 250мкС
0x01 – отрицательный импульс длительностью 250мкС

Значения границ в переменной CAPT_MODE можно изменять «на ходу», новые записанные
значения будут использоваться в первом возникшем прерывании.

Функция генерации импульсов по шаблону (STREAM_PIN, StreamOut).

До вызова функции необходимо задать контакт порта, на который будет осуществляться вывод
последовательности импульсов. Делается это присвоением переменной STREAMPIN:

STREAMPIN = PORTA.3;

После такого присвоения вывод импульсов будет производиться на указанный контакт порта. Этот
контакт будет использоваться всегда для вывода импульсов, пока переменной STREAMPIN не
будет присвоено новое значение. При смене скрипта необходимо опять указать контакт порта.
Естественно, выбираемые контакты должны быть выходами.

Непосредственно вывод импульсной последовательности производится функцией StreamOut:

StreamOut(source,n_pulses,pulse_width);

Первый параметр (source) – шаблон, по которому будут генериться импульсы, может быть или
переменной или именем байтового массива.
Второй параметр (n_pulses) – количество импульсов, максимально 16383 импульса
Третий параметр (pulse_width) – длина импульса в микросекундах, максимально допустимая
длительность импульса – 10900 микросекунд.

Пример:

StreamOut(0xAA00AA00,32,10);

В этом случае будет выдана следующая последовательность импульсов


Всего будет выдано 32 импульса и длина каждого импульса будет равна 10 микросекунд. В
качестве шаблона может быть любая переменная или константа.

Важное замечание: как бы ни был указан шаблон, он всегда дополняется слева до 32 битного
значения нулями. Передача битов начинается с самого старшего (левого бита) и биты выдаются
слева направо. Например, такая команда

StreamOut(0x55,8,100);

Выдаст на выход 8 нулей, потому что будет выдано 8 старших бит значения 0x00000055.

Использование одной переменной ограничивает длину выдаваемой посылки 32 битами. Если


нужно выдать посылку с большим количеством бит, то в качестве шаблона необходимо указать
имя байтового массива. Пример:

Byte sbuffer[40];

StreamOut(sbuffer,256,100);

В этом случае на выход будет побитово выдано содержимое массива sbuffer, начиная с нулевого
байта. Биты в байтах выдаются, начиная со старшего (левого) бита. Всего будет выдано 256 бит
или 256/8 = 32 байта. Длительность одного бита будет равна 100 микросекунд. Естественно,
массив должен быть заполнен нужным образом до вызова функции StreamOut.

Во время выполнения функции StreamOut все процессорное время отдано на выполнение этой
функции, что бы получить точные длины импульсов. В это время программатор не будет
реагировать на команды от компьютера, не будут считать внутренние счетчики. Например при
выполнении команды

StreamOut(sbuffer,1000,10000);

Программатор «зависнет» на 1000 * 10000мкс = 10 секунд! Следует избегать такого использования


функции.

ШИМ генератор (PWM0, PWM1, PWM2).

Программатор имеет встроенный генератор широтно-модулированных импульсов. Генератор


имеет 3 независимых выхода:

PORTA.0 – PWM0
PORTA.1 – PWM1
PORTA.2 – PWM2
Управление осуществляется записью значений в переменную с соответствующим именем.
Формат записываемых данных имеет вид:

Старшие 25 бит (31…7) Младшие 7 бит (6…0)


Частота Значение ШИМ

Частота – числовое значение частоты генерации в герцах.


Значение ШИМ работает следующим образом: длительность периода импульсов условно
принимается равной 127 тактов. Если значение ШИМ равно например 63, то первые 64 такта
выход будет иметь низкое значение, а последующие 63 – высокое.

Например для генерации частоты 8000 Гц со скважностью 50% в канале PWM0 необходимо
записать:

PWM0 = (8000<<7)|63;

Но значение ШИМ имеет ограничения. Выходная частота генератора задается делением опорной
частоты 48МГц на целое число больше 1. Таким образом, в районе максимальных частот сетка
будет следующая:

Частота Реально возможный шим


48/2=24 МГц 2
48/3=16 МГц 2…3
48/4=12 МГц 2…4
48/5=9.6 МГц 2…5
48/6=8 МГц 2…6
48/7=6.857142МГц 2…7
48/8=6 МГц 2…8
48/9=5.333333 МГц 2…9
48/10=4.8 МГц 2…10
48/11=4,363636 МГц 2…11
48/12=4 МГц 2…12

Программатор автоматически пересчитывает значение ШИМ в зависимости от указанной частоты.

Генерация частоты будет выполняться постоянно, без всякого программного участия. В режиме
ШИМ соответствующие выводы программатора недоступны для программного управления.

Для выключения режима ШИМ необходимо в соответствующую переменную записать нулевое


значение. Режим ШИМ выключается, и вывод становится доступным для программного
управления.

Оценить