Текст_меню,имя_процедуры,код_кнопки,клавиша_быстрого_доступа.
Текст_меню – эта часть будет отображаться в названии пункта выпадающего меню. Обязательная
часть описания пункта меню.
Имя_процедуры – имя процедуры в коде скрипта, которая будет вызываться при выборе этого
пункта меню. Обязательная часть описания пункта меню.
Код_кнопки – условный код кнопки на панели инструментов программы, которая дублирует этот
пункт меню. Необязательная часть пункта меню.
Клавиша_быстрого_доступа – текстовое название клавиши, при нажатии на которую будет
выполняться этот пункт меню. Обычно это клавиши F1-F10. Необязательная часть пункта меню.
Следующий рисунок демонстрирует исходный текст описания меню и вид меню в программе.
Если какая-то кнопка не задействована в скрипте (не описана в меню), то она будет отображаться
в неактивном состоянии и будет недоступна для нажатия.
Символ «&» в тексте пункта меню используется для обозначения клавиши быстрого вызова на
символьной клавиатуре. Следующий символ в реальном меню будет отображаться подчеркнутым.
Но отображение подчеркивания зависит от выбранной темы программы и Windows и
отображается не всегда.
В некоторых случаях скрипт не предусматривает использование меню. В этом случае все описание
меню в скрипте должно отсутствовать. При загрузке такого скрипта пункт «Микросхема» в
главном меню программы будет неактивным.
Переключатель
Выпадающий список
Кнопка
Числовой редактор
Шестнадцатеричный редактор
Текстовая метка
Кроме того могут быть использованы два элемента, предназначенных только для визуального
оформления панели скрипта:
Группа
Изображение
При использовании дополнительных элементов сначала должна быть описана панель, в которой
будут отображаться визуальные компоненты:
Исходный текст пустого скрипта с описанием панели визуальных компонентов (непонятные строки
«Editor» будут описаны далее):
Editor
{
(C="EEPROM";size=1024;mode=8)
}
$HOST
Editor
{
(C="EEPROM";size=1024;mode=8)
}
$HOST
За описанием окна может следовать описание редактора программы. Если же это описание
отсутствует, то редактор в программе отображаться не будет. В этом случае панель визуальных
компонентов будет отображаться в центре рабочей области программы. В этом случае
информация об ориентации панели игнорируется (но она должна присутствовать!!!).
$HOST
Редактор программы может содержать одну или две фиксированных закладки с данными. Эти
закладки должны быть описаны в скрипте. Формат описания следующий:
Editor
{
(C="EEPROM";size=1024;mode=8;bytes=16)
}
Editor
{
(C="EEPROM"; size=1024; mode=8)
(C="FLASH"; size=65536; mode=16)
}
Переключатель.
Checkbox(caption=”Переключатель”;left = 5;top=5;value=1;name=cb1)
имя_параметра = значение
Кроме указания полных названий параметров, можно использовать только начальные буквы
названий параметров
caption = c
left = l
top = t
value = v
Editor
{
(C="EEPROM";size=1024;mode=8)
(C="FLASH";size=65536;mode=16)
}
$HOST
Выпадающий список.
Общий вид описания выпадающего списка:
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)
Editor
{
(C="EEPROM";size=1024;mode=8)
(C="FLASH";size=65536;mode=16)
}
$HOST
Шестнадцатеричный редактор.
Эти элементы практически аналогичны. Они служат для ввода и отображения числового значения.
Числовой редактор работает с числами в обычном десятичном виде, шестнадцатеричный – в
шестнадцатеричном (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
необязательный, он задает начальное значение, которое будет отображаться в редакторе при
загрузке скрипта. При отсутствии этого параметра начальное значение будет равно нулю. Все
остальные параметры должны быть указаны обязательно.
Editor
{
(C="EEPROM";size=1024;mode=8)
(C="FLASH";size=65536;mode=16)
}
$HOST
proc proc1()
{
}
Описание:
В данном случае параметр 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
Текстовая метка.
Текстовая метка служит для отображения какой-либо текстовой информации на экране.
Описание:
Группа
Группа представляет собой визуальный компонент с рамкой и необязательным заголовком.
Предназначен для визуального отделения других визуальных элементов управления.
Описание:
Group(c="Группа 1";left=5;top=5;w=250;h=120)
$HOST
Изображение.
Также на панели можно разместить изображение.
Общее описание:
picture(c="logo.png";l=10;t=20;w=0;h=0)
с (caption) – имя файла изображения, сам файл должен находиться в папке Pictures программы.
Возможно расположение файла во вложенных папках в папке Pictures программы, тогда имя
файла должно содержать слева имя вложенной папки, отделенное левым слэшем.
Исходный текст (картинка PNG расположена во вложенной папке audi в папке Pictures, остальные
в папке Pictures):
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 NULL 0
Все последующие встреченные в тексте идентификаторы NULL будут заменены на символ нуля.
Глобальные переменные.
Поддерживаются три типа глобальных переменных:
Примеры:
byte cnt,ttt,www,eee;
word w1,w3,w4;
dword dw4,dw5;
byte b[10],bb[40],array[4];
В квадратных скобках после имени массива указывается размер массива. При таком объявлении
начальные значения элементов массива имеют случайные значения.
Кроме того массив может быть задан явным перечислением его элементов:
при таком объявлении массив будет содержать коды символов строки “массив” и в конце
автоматически будет добавлен 0.
при таком объявлении массив будет иметь 32 элемента, первые из них будут иметь значения
10,20,30,40, остальные будут иметь значение 0.
proc test()
{
var a,b,c,d;
}
Локальные переменные всегда имеют размер 32 бита и являются беззнаковыми.
выражение1*выражение2
выражение1/выражение2
выражение1%выражение2
При операции деления по модулю (%) результатом будет остаток от деления выражения1 на
выражение2. Например:
a = 9 % 5 – результат 4
a = 9 % 3 – результат 0
выражение1+выражение2
выражение1-выражение2
Операции вычисляются слева направо. Операндами могут быть все поддерживаемые выражения
(переменные, числа). При вычислении все операнды автоматически преобразуются в 32-битный
вид.
Если при сложении результат превышает значение 0xFFFFFFFF, то происходит потеря старших
значащих бит.
Если при вычитании выражение2 больше чем выражение1 (ожидается отрицательный результат),
то результатом будет двоичное дополнение до нуля. Например:
Операции выполняются слева направо. Выражение1 может быть только переменной. При сдвиге
освобождаемые биты заполняются нулями.
Побитовые операции – ИЛИ (|), И (&), исключающее ИЛИ (^).
выражение1 | выражение2
выражение1 & выражение2
выражение1 ^ выражение2
выражение++
выражение--
выражение x++
эквивалентно выражению x = x + 1
выражение x--
эквивалентно выражению x = x - 1
выражение1 = выражение2;
Операции составного присваивания (*=, /=, +=, -=, &=, ^=, |=, >>=, <<=).
Например выражение
d *= (4+6);
эквивалентно выражению
d = d *(4+6);
Процедуры.
Код для компьютера представляет собой набор процедур, которые запускаются при помощи
меню программы или кнопок на панели инструментов или кнопок на панели визуальных
компонентов.
proc имя_процедуры(param1,param2,param3)
{
… код процедуры
}
Процедура может не иметь параметров, в таком случае после имени процедуры указываются
пустые круглые скобки. Процедуры, вызываемые пользователем из меню или кнопками, должны
быть именно такими, без параметров.
Например процедура p1 должна вызывать процедуру p2. Тогда в тексте они должны идти в
следующем порядке:
proc p2(a,b)
{
var c;
c = a+b;
return(c);
}
proc p1()
{
var a;
a = p2(34,67);
}
return(выражение); или
return;
If(выражение)
оператор1;
else
оператор2;
или
If(выражение)
{
операторы1;
}
else
{
операторы2;
}
Операторы циклов.
while(выражение) оператор;
или
while(выражение)
{
…операторы;
}
Оператор или операторы внутри цикла выполняются до тех пор, пока выражение истинно или не
равно нулю.
Если внутри цикла встречается оператор break, то выполнение цикла завершается немедленно,
независимо от истинности выражения.
while(a != 100)
{
…
If(a = 55) break; // если переменная а будет равна 55, то цикл завершится немедленно
…
}
Если внутри цикла встречается оператор continue, то выполнение цикла возвращается в начало
цикла, все операторы, следующие за оператором continue, игнорируются.
for(выражение1;выражение2;выражение3)
оператор ;
или
for(выражение1;выражение2;выражение3)
{
…операторы
}
выражение1 описывает инициализацию цикла. Выполняется один раз при запуске цикла.
выражение2 описывает условие проверки завершения цикла, проверяется при каждой итерации
цикла. Цикл продолжается, пока выражение2 истинно.
выражение3 описывает приращение цикла на шаг, вычисляется после каждой итерации.
Все три выражения в заголовке цикла for не являются обязательными. Любое из трех или все три
выражения могут отсутствовать, однако разделяющие их точки с запятой опускать нельзя. Если
опущено выражение2 (проверка условия завершения цикл), считается, что оно постоянно истинно.
Таким образом, оператор for вида
for(;;)
{
…операторы
}
Все визуальные компоненты имеют параметр name. Для обращения к элементу необходимо
использовать это имя. Фактически имя элемента является глобальной переменной.
Например, если имеется переключатель, описанный следующим образом:
checkbox(caption="Переключатель 1";left=5;top=5;value=1;name=cb1)
a = cb1;
Имя переменной для списка будет list1. Эта переменная содержит индекс выбранной в данный
момент строки в списке. Самая первая строка имеет индекс 0. Если же переменной list1 присвоить
какое-либо значение, то в списке отобразится строка с указанным индексом. Если присвоенное
значение превышает количество строк в списке, то будет отображаться строка с максимальным
индексом.
Пример:
hexbytes(c="Байты";name=bytes;left=100;top = 35;w=200;value = 5)
Что бы записать значение 0х12 в самый левый байт, нужно в тексте скрипта записать:
bytes[0] = 0x12;
Периферийные устройства программатора.
Программатор имеет:
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
Последовательный порт.
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
Режим работы: нормальный
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
Управление питанием выходных пинов программатора (напряжение 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» - внешний источник питания подключен
POWER = 1;
произойдет включение VCC. Но при этом его уровень будет 3.3В и выхода 12/10 и
дополнительных 5 вольт отключатся если они были включены до этого, потому что в эти биты
будут записаны нули. Поэтому для включения только VCC, не затрагивая остальные биты, следует
записать
POWER |= 1;
Фактически это разрешает программный захват прерывания от входа PORTD.6 (IRQ). Факт наличия
прерывания (любой фронт на входе IRQ) можно определить по состоянию переменной IRQ_FLAG.
Если при чтении этой переменной она имеет ненулевое значение, то было зарегистрировано
изменение уровня на входе IRO. ЗНАЧЕНИЕ ПЕРЕМЕННОЙ IRQ_FLAG АВТОМАТИЧЕСКИ
СБРАСЫВАЕТСЯ В «0» ПРИ ЧТЕНИИ!!! Ненулевое значение хранится в переменной от момента
прерывания до первого чтения этой переменной. Следующий рисунок демонстрирует состояние
IRQ_FLAG в различных вариантах. Предполагается, что до этого прерываний не было, поэтому
первое значение IRQ_FLAG равно «0».
Если в бит 31 будет записано значение 0, то режим захвата работает следующим образом:
При чтении переменной CAPT_VALUE она содержит значение, которое насчитал таймер между
двумя предыдущими прерываниями по входу IRQ. Это значение изменяется только при
очередном прерывании, между прерываниями оно содержит последнее захваченное значение.
Если же в 31 бит записана «1», то режим захвата работает с учетом битов Граница 0, Граница 1,
Граница 2 и Граница 3. Причем должны обязательно выполнятся условия:
Частоту тактирования выбираем 46875 Гц (CAPT_CLOCK = 4). При этом значения захвата будут:
Граница 0 = 2, Граница 1 = 8
Граница 0 = 9, Граница 1 = 14
После этого после каждого прерывания значение CAPT_VALUE будет содержать следующие
возможные значения:
Значения границ в переменной CAPT_MODE можно изменять «на ходу», новые записанные
значения будут использоваться в первом возникшем прерывании.
До вызова функции необходимо задать контакт порта, на который будет осуществляться вывод
последовательности импульсов. Делается это присвоением переменной STREAMPIN:
STREAMPIN = PORTA.3;
После такого присвоения вывод импульсов будет производиться на указанный контакт порта. Этот
контакт будет использоваться всегда для вывода импульсов, пока переменной STREAMPIN не
будет присвоено новое значение. При смене скрипта необходимо опять указать контакт порта.
Естественно, выбираемые контакты должны быть выходами.
StreamOut(source,n_pulses,pulse_width);
Первый параметр (source) – шаблон, по которому будут генериться импульсы, может быть или
переменной или именем байтового массива.
Второй параметр (n_pulses) – количество импульсов, максимально 16383 импульса
Третий параметр (pulse_width) – длина импульса в микросекундах, максимально допустимая
длительность импульса – 10900 микросекунд.
Пример:
StreamOut(0xAA00AA00,32,10);
Важное замечание: как бы ни был указан шаблон, он всегда дополняется слева до 32 битного
значения нулями. Передача битов начинается с самого старшего (левого бита) и биты выдаются
слева направо. Например, такая команда
StreamOut(0x55,8,100);
Выдаст на выход 8 нулей, потому что будет выдано 8 старших бит значения 0x00000055.
Byte sbuffer[40];
…
StreamOut(sbuffer,256,100);
В этом случае на выход будет побитово выдано содержимое массива sbuffer, начиная с нулевого
байта. Биты в байтах выдаются, начиная со старшего (левого) бита. Всего будет выдано 256 бит
или 256/8 = 32 байта. Длительность одного бита будет равна 100 микросекунд. Естественно,
массив должен быть заполнен нужным образом до вызова функции StreamOut.
Во время выполнения функции StreamOut все процессорное время отдано на выполнение этой
функции, что бы получить точные длины импульсов. В это время программатор не будет
реагировать на команды от компьютера, не будут считать внутренние счетчики. Например при
выполнении команды
StreamOut(sbuffer,1000,10000);
PORTA.0 – PWM0
PORTA.1 – PWM1
PORTA.2 – PWM2
Управление осуществляется записью значений в переменную с соответствующим именем.
Формат записываемых данных имеет вид:
Например для генерации частоты 8000 Гц со скважностью 50% в канале PWM0 необходимо
записать:
PWM0 = (8000<<7)|63;
Но значение ШИМ имеет ограничения. Выходная частота генератора задается делением опорной
частоты 48МГц на целое число больше 1. Таким образом, в районе максимальных частот сетка
будет следующая:
Генерация частоты будет выполняться постоянно, без всякого программного участия. В режиме
ШИМ соответствующие выводы программатора недоступны для программного управления.