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

ИНТЕГРИРОВАННАЯ СРЕДА ДРАКОН.

КУРС МОЛОДОГО БОЙЦА

Урок 1.

УВЛЕКАТЕЛЬНОЕ НАЧАЛО
Содержание
§1. ВВЕДЕНИЕ........................................................................................................3
§2. ПРИ ПЕРВОМ ЗАПУСКЕ ИС ДРАКОН ЕЁ НУЖНО НАСТРОИТЬ ................4
§3. ПРОГРАММА УПРАВЛЕНИЯ ДВЕРНОГО ЗАМКА........................................5
§4. НАЧАЛО РАБОТЫ ...........................................................................................6
§5. КОНСТРУИРУЕМ АЛГОРИТМ .........................................................................7
§6. ПРИСТУПАЕМ К ПРОГРАММИРОВАНИЮ ..................................................13
§1. ВВЕДЕНИЕ

Интегрированная Среда ДРАКОН (далее ИС ДРАКОН) обладает


своеобразным интерфейсом, особенности которого не полностью рас-
крыты в её справке. Из-за этого первые попытки использования вы-
зывают заметные трудности.
Не волнуйтесь! Это дело поправимое.

Курс молодого бойца поможет вам совершить первые шаги по


созданию дракон-схемы, и генерации исходного текста программы.
Здесь нет описания языка ДРАКОН, анализа его возможностей,
достоинств и недостатков. Перед вами простая пошаговая инструкция.
С помощью этой инструкции вы легко убедитесь, что ИС ДРА-
КОН Геннадия Тышова — это полезный инструмент для практической
работы. Инструмент, который существенно повышает производитель-
ность труда программиста.
§2. ПРИ ПЕРВОМ ЗАПУСКЕ ИС ДРАКОН
ЕЁ НУЖНО НАСТРОИТЬ

1) В пункте главного меню «Вид» ставим галочки на всех трёх пунктах:

2) В пункте главного меню «Программирование» ставим метку выбора


напротив нужного языка (в данном примере это будет Си).
3) В пункте главного меню «Программирование» нажимаем «Путь для
программных файлов».

4) В открывшемся окне выбора файла выбираем любой файл в ката-


логе с исходными файлами нашей программы, и нажимаем «От-
крыть».
Внимание. Файл не будет открыт, просто ИС ДРАКОН запомнит ката-
лог, где впоследствии будет сохранять файлы с исходными текстами,
сгенерированными из дракон-схем.

5) Остальные пункты пока не трогаем.

6) Для сохранения настроек не требуется нажимать кнопок типа «ОК»,


«Сохранить» и т.п.
Все настройки ИС сохраняет в файле «Dragon.ini».

Вот и все. ИС ДРАКОН готова к работе.

§3. ПРОГРАММА УПРАВЛЕНИЯ ДВЕРНОГО ЗАМКА

В качестве первого примера создадим программу для микро-


процессора, управляющего приводом дверного замка.
AKK SX1
аккумулятор 4.2В 1
2
OP
CL 3
DV 4
L1 DS 5
6
7
R3 0.5 R4 220 DD1 VD1 M1 8
Q2 8 1 K1 K2 M2 9
7 DC SC
5

2 GND 10
6 Is SE 3 GND 11
+ 5 VCC C 4 GND 12
ADJ GND C2
C3 AKK 13
3

1
2

1
2
220.0 C1

220.0 MC34063 14
R7 10K R8 100K 470 KN 15
R6 +
4.7K M2
R9 + C4 M1
1K 220.0 мотор привода
ригеля

VD2 R32 150ED6 LED


Индикатор R10
открытого 3.3K
R11 300K R12 330
замка DS

DD2
R13 22K R15 R16 R17 R18 контакт DS1990
VT10 BC847C 470 470 470 470
R271.5K 1 18
2 RA2 RA1 17 VT2 VT3 VT4
3 RA3 RA0 16
4 Ra4 OSC1 15
PIC16F628

5 R OSC2 14
6 GND +5 13
RB0 RB7
7
RB1 RB6
12 R19 22K CL ригель закрыт
8 11
RB2 RB5
ригель открыт
4000.0

9 10 R20 22K OP
RB3 RB4
C6

+ R21 22K DV дверь закрыта


R22 22K KN кнопка нажата
C7 C8 C9 C10 C11

0.22 0.1 0.1 0.1 0.1 При запертой двери


LS1
все концевики разомкнуты
VD3

VD4
VD5
R24 3.3K
VT5
R25 6.8K
VT6
R26 6.8K
VT7

Замок
§4. НАЧАЛО РАБОТЫ

7) В пункте главного меню «Файл» выбираем пункт «Новый лист», по-


том «Сохранить лист как», и сохраняем файл под осмысленным име-
нем, например «Замок».

8) Щёлкаем правой кнопкой мышки в пределах появившегося прямо-


угольника, и выбираем в контекстном меню «Вставить Силуэт». На
листе появляется заготовка схемы «силуэт»:
9) ДВОЙНЫМ щелчком по иконе «?Заголовок» открываем текстовое
окно, и вносим имя нашей схемы, например – “Управление замком»:

10) Закрываем текстовое окно кнопкой “Esc”, или щелчком мыши за


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

§5. КОНСТРУИРУЕМ АЛГОРИТМ

11) Разбиваем нашу задачу на части, соответствующие состояниям


замка: «Открыт», «Закрывается», «Закрыт» «Открывается». Каж-
дому состоянию будет соответствовать своя ветка. Сейчас на схеме
только 2 ветки, нужно добавить ещё.

12) На линиях, показывающих связи силуэта, есть белые квадратики.


Это «точки ввода», в них можно добавлять новые элементы графики.
Щёлкаем правой кнопкой мыши по квадратику под иконой «Управле-
ние замком». В открывшемся контекстном меню выбираем пункт
«Блок «Ветка»»:
В схеме появляется ещё одна ветка. Добавляем таким образом на
схему ещё 4 ветки.
Всего теперь на схеме 6 веток. Первая будет заниматься инициализа-
цией процессора, 4 будут соответствовать нашим состояниям, а шес-
тая, заканчивающаяся иконой «Конец», нам не понадобится. Её мы
потом удалим:
13) Редактируем имена веток. Двойной щелчок по телу иконы «?Имя-
Ветки», вводим имя, двойной щелчок по телу следующей иконы и т.д.:

14) Расставляем переходы между ветками. Для этого щелкаем пра-


вой кнопкой по телу иконы «?Адрес» в конце ветки «Инициализация»,
и выбираем в контекстном меню пункт «Для «Адрес» выбрать ветку, <-
X->» , после чего щёлкаем по телу иконы «Закрыто». Повторяем дей-
ствия для других икон «?Адрес». Из ветки «Закрыто» задаём переход
в «Открывается», из «Открывается» - в «Открыто», из «Открыто» - в
«Закрывается», из «Закрывается» в «Закрыто».
15) После расстановки переходов можно удалить ненужную ветку с
иконой «Конец». Щёлкаем правой кнопкой по телу иконы «?ИмяВет-
ки», и выбираем «Удалить»:

16) Зададим условия, при которых будут происходить переходы.


На ветке «Закрыто», ниже иконы «Закрыто», есть точка ввода (белый
квадратик). Щелкаем по нему правой кнопкой, и выбираем в выпав-
шем меню «блок «Обычный цикл»». Появляется икона «Развилка» с
именем «?Вопрос». Двойным щелчком по телу этой иконы открываем
текстовое окно, и пишем условие, при котором будет происходить пе-
реход. В данном случае это «Нажата кнопка?». Если ответ на этот во-
прос «Да» то будет происходить переход на ветку «Открывается». Ес-
ли «Нет» - перехода не будет.

Аналогично расставляем условия переходов для остальных веток:

Логика у нас пока упрощённая, учебная. Сейчас мы к этому приди-


раться не будем.
17) Переходим к управлению мотором замка.
На ветке «Закрыто» в точку ввода ниже иконы «Нажата кнопка?»
вставляем икону «Действие». Меняем имя иконы на «Вкл.
преобразователь».
Ниже иконы «Вкл. преобразователь» вставляем ещё одну икону «Дей-
ствие», и меняем её имя на «Вкл. мотор на открывание»:
Действуя по аналогии, расставляем остальные иконы «действие». При
этом, для облегчения процесса, иконы, или группы икон можно копи-
ровать, выделяя их мышкой, и пользуясь Ctr+C / Ctr+V, или контекст-
ным меню. На ветку «Инициализация» вставляем икону с имененм
«Инициализировать процессор»:
§6. ПРИСТУПАЕМ К ПРОГРАММИРОВАНИЮ

17) Щёлкаем правой кнопкой по полю листа вне схемы «Силуэт», и


выбираем в выпавшем меню «вставить «Гном»». Появляется Гном.
Щёлкаем правой кнопкой по точке ввода ниже иконы «?Комментарий»:

и выбираем «Модуль». Появляется Модуль:

18) Дважды щёлкаем по иконе «Модуль» и вводим в текстовом окне


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

\main.c
19) Далее щёлкаем по свободному участку схемы «Силуэт» правой
кнопкой, и выбираем «Взять ссылку в системный буфер». Снова два-
жды щёлкаем по иконе «Модуль», в открывшемся текстовом окне ус-
танавливаем курсор в начало второй строки, и нажимаем Ctr+V. За-
крываем текстовое окно. Икона «Модуль» должна принять сл. вид:
20) Щёлкаем левой кнопкой по третьему слева кваратику под иконой
«Модуль». В открывшемся текстовом окне записываем те строки, ко-
торые должны быть в начале нашего программного файла. В этом
примере мы запишем директивы включения двух заголовочных фай-
лов. Ниже директив пишем две «магических» строчки, начинаю-
щиеся со знаков комментария:

Здесь первый включаемый файл (pic16f6x.h) – файл макроопределе-


ний для нашего процессора. Во втором файле (hard.h) объявлены
функции для работы с нашим контроллером. В этом уроке мы не бу-
дем рассматривать содержание этих функций. Функции очень про-
стые, их имена говорят сами за себя.
Вот содержание файла «hard.h»:

#define RIGEL_LOCK 1
#define RIGEL_UNLOCK 2
#define DOOR_CLOSE 1
#define PRESS_BUTTON 1

char get_state_door ( void );


char get_state_rigel ( void );
char get_state_button ( void );
void dc_dc_on ( void );
void dc_dc_off ( void );
void motor_on_to_open ( void );
void motor_on_to_close ( void );
void motor_off ( void );
void init ( void );

21) В верхнем левом углу листа схемы «Силуэт» тоже есть 4 квадра-
та. Щёлкаем левой кнопкой мышки по третьему слева квадрату . В от-
крывшемся текстовом окне вводим «скелет» функции, которая впо-
следствии будет сгенерирована :
22) Приступаем к программированию икон.
Щёлкаем по третьему квадрату иконы «Нажата кнопка?», и вводим
логическое выражение, результат которого отвечает на вопрос «На-
жата ли кнопка?». В данном случае это следующая строчка:

PRESS_BUTTON == get_state_button()
В тексте программы эта строчка будет целиком помещена в круглых
скобках оператора if, поэтому здесь мы не ставим точку с запятой по-
сле вызова функции:

Далее щёлкаем по третьему квадрату иконы «Вкл. преобразователь»,


и вписываем вызов соответствующей функции:

dc_dc_on();
В икону «Вкл. мотор на открывание» записываем:
motor_on_to_open();
Действуя аналогично, заполняем третьи квадраты всех икон (не забы-
ваем о Ctr+C / Сtr+V).

После заполнения третьих квадратов икон всё готово для полу-


чения текста программного файла.
23) Нажимаем клавишу F9. В заданном при настройке каталоге появ-
ляется файл «main.c» с исходным текстом.
В данном примере сгенерировался вот такой файл:
================================================================================
#include <pic16f6x.h>
#include "hard.h"

/* D:\ABC_2012\ZAMOK\Замок.drt */
/* 1. ИС Дракон. Трансляция маршрутной части. Изме-
нение 04.01.2012 18:59:28 */
/* Схема - Процедура */
void main(void)
{

/* ==================== Шампур */

/* 2. Заголовок // Управление замком */

/* 4. ИмяВетки // Инициализация */

/* 49. Действие // Инициализировать процессор */


init();

/* 5. Адрес // Закрыто */
goto L28;

/* ==================== Шампур */

/* 13. ИмяВетки // Закрыто */

L28:
/* 28. Вопрос // Нажата кнопка? */
if (!(PRESS_BUTTON == get_state_button())) goto L28;

/* 41. Действие // Вкл. преобразователь */


dc_dc_on();

/* 42. Действие // Вкл. мотор на открывание */


motor_on_to_open();

/* 14. Адрес // Открывается */


goto L32;
/* ==================== Шампур */

/* 17. ИмяВетки // Открывается */

L32:
/* 32. Вопрос // Ригель открыт? */
if (!(RIGEL_UNLOCK == get_state_rigel())) goto L32;

/* 43. Действие // Выкл. мотор */


motor_off();

/* 44. Действие // Выкл. преобразователь */


dc_dc_off();

/* 18. Адрес // Открыто */


goto L36;

/* ==================== Шампур */

/* 21. ИмяВетки // Открыто */

L36:
/* 36. Вопрос // Нажата кнопка? */
if (!(PRESS_BUTTON == get_state_button())) goto L36;

/* 45. Действие // Вкл. преобразователь */


dc_dc_on();

/* 46. Действие // Вкл. мотор на закрывание */


motor_on_to_close();

/* 22. Адрес // Закрывается */


goto L40;

/* ==================== Шампур */

/* 25. ИмяВетки // Закрывается */

L40:
/* 40. Вопрос // Ригель закрыт? */
if (!(RIGEL_LOCK == get_state_rigel();)) goto L40;

/* 47. Действие // Выкл. мотор */


motor_off();
/* 48. Действие // Выкл. преобразователь */
dc_dc_off();

/* 26. Адрес // Закрыто */


goto L28;

//