Разработка GSM-сигнализации

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

Рубрика Коммуникации, связь, цифровые приборы и радиоэлектроника
Вид курсовая работа
Язык русский
Дата добавления 10.11.2014
Размер файла 1,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА

"Разработка GSM-сигнализации "

Содержание

  • Список принятых сокращений
  • Введение
  • 1. Задание на разрабатываемое устройство
  • 1.1 Требования к охранным, пожарным шлейфам
  • 1.2 Требования к входным и выходным исполнительным органам
  • 1.3 Требования к конфигурированию и настройке устройства
  • 2. Электронные компоненты печатной платы
  • 2.1 Технические характеристики и параметры основных компонентов печатной платы
  • 2.2 Применяемые схемотехнические решения
  • 3. Программное обеспечение микроконтроллера
  • 3.1 Основная структура проекта
  • 3.2 Задачи операционной системы реального времени
  • 3.3 Взаимодействие задач и прерываний
  • 3.4 Функции обработчиков прерываний
  • 3.5 RTOS задачи проекта
  • 3.6 Передача параметров настройки по USB
  • 4. Программное обеспечение Windows Form C#
  • 4.1 Определение общей структуры приложения
  • 4.2 Создание библиотеки из ссылочных типов содержащие поля данных
  • 4.3 Основная сборка проекта
  • Заключение
  • Список литературы
  • Приложения

Список принятых сокращений

МК - микроконтроллер

ПО - программное обеспечение

ПП - печатная плата

ОСРВ - операционная система реального времени

ДУ - дистанционное управление

СФР - специальный функциональный регистр

ПК - персональный компьютер

Введение

Разрабатываемая GSM-сигнализация предназначена для оповещения, персонала зданий и сооружений о нарушении охранного режима и состояния пожарной обстановки при срабатывании пожарных датчиков (температурного, датчика задымления и т.д.). Сигнал от сработавшего датчика охранной или пожарной сигнализации с помошью сотовой связи, отправляется на запрограммированный номер. Данное устройство не содержит, каких либо дополнительных средств защиты от различных генераторов шума и блокираторов, но в нем заложена возможность дополнительного канала связи в виде подключения устройства к локальной сети Ethernet (программирование и подключение к локальной сети в данной работе не описывается).

Данная работа содержится описание двух основных направлений работы над устройством:

разработка ПО микроконтроллера;

разработка ПО для конфигурирования устройства.

В качестве основного исполнительного модуля сигнализации GSM используется 32 битный микроконтроллер STM32F407VGT [1], разработка приложения для встраиваемой системы выполняется на языке Си с использованием среды разработки Keil uVision4, используя компилятор armcc.

ПО для конфигурирования устройства разрабатывалось, используя Windows Form, Visual Studio2010.

Дополнительно при программировании использовались уже готовые примеры и библиотечные модули, например для ядра микроконтроллера использовалась библиотека CMSIS, для применения USB - пример STM32_USB_Device_Library от STMicroelectronics для ядра системы реального времени операционная система FreeRTOS [2].

1. Задание на разрабатываемое устройство

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

1.1 Требования к охранным, пожарным шлейфам

Основное требование к устройству способность подключения пожарных (дымовые оптические - ДИП34А, ИП212 тепловые ИП114), охранных датчиков (инфракрасные датчики движения АСТРА5,6) и простых магнитоконтактных герконовых датчиков (ИО-112).

Также должна обеспечиваться возможность подключения дополнительных датчиков например датчиков влажности с возможностью задания порогов срабатывания датчиков с помощью программного обеспечения. Почти все современные датчики по типу действия являются активными - питаются от цепей напряжением от 10 до 30 Вольт и при изменении своего состояния например при срабатывании пожарного датчика или нарушении охранной зоны изменяют внутреннее сопротивление датчика тем самым изменяя напряжение снимаемого с делителя напряжения подключенного параллельно данному шлейфу в нашем устройстве.

Шлейф для охранно-пожарной сигнализации это электрическая цепь, соединяющая выходные цепи извещателей, включающая в себя вспомогательные элементы и соединительные провода и предназначенная для передачи на приемно-контрольный прибор извещений, а в некоторых случаях и для подачи электропитания на извещатели. Для шлейфа в нормативных документах [3] приведено требование об обязательном контроле исправности шлейфов системы пожарной сигнализации. Действительно, при обрыве шлейфа, в зависимости от места неисправности, отключается часть или все пожарные извещатели. При коротком замыкании шлейфа все пожарные извещатели подключенные к нему становятся неработоспособными. Разрабатываемое устройство должно обеспечивать контроль состояния шлейфов и выдавать сигнал предупреждения при появлении неисправности посредством сотовой связи.

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

1.2 Требования к входным и выходным исполнительным органам

Устройство должно иметь по меньшей мере 4 входа. Так как сигнализация требует дистанционного отключения, включения каналов охраны (в нашем случае каждый номер канала охраны соответствует своему номеру шлейфа) то будет использоваться модуль четырех канального дистанционного управления 433 МГц - MP324 Рис. 2.2.1 Необходимо предусмотреть возможность такого конфигурирования устройства при котором под каждую из четырех кнопок брелока можно запрограммировать определенный канал охраны. Например к одному каналу подключены все датчики охраны внутри здания, другой канал все наружные датчики охраны - периметровая охрана. Соответственно нажимаем одну кнопку ставим весь объект на охрану, нажимаем вторую, снимаем все с охраны, нажимаем третью ставим не охрану периметр, но охрана внутри здания выключена. Также дополнительно должно быть возможность ручного управления сигнализацией используя кнопки с временной выдержкой которую можно сконфигурировать с помощью ПО.

Рис 2.2.1 Модуль сигнализации KIT MP324

Для дополнительной возможности постановки и снятия с охраны устройство должно быть снабжено входом для подключения iButton по однопроводному интерфейсу 1-Wire разработанной Dallas Semiconductor. Вход для подключения iButton должен иметь супрессорную защиту от статических разрядов порта микроконтроллера.

Также устройство должно иметь входы для подключения дополнительных датчиков температуры DS18B20 для температурного контроля помещений.

Требования к выходам устройства. Устройство должно содержать не менее двух выходных реле, с контактами коммутирующими нагрузку 1кВт, четыре выхода для коммутации реле 12 Вольт 0.5 Ампер и дополнительно резервные выходы без гальванической и каскадной развязки для возможности будущего расширения контактных групп выходов.

1.3 Требования к конфигурированию и настройке устройства

GSM-сигнализация должна конфигурироваться используя программное обеспечение работающей под операционной системой Windows 7. Программное обеспечение должно предусматривать возможность настройки таких параметров как количество используемых каналов (шлейфов) сигнализации, настройке телефонов по которому выполняется оповещение при наступлении определенного события, должны вводиться данные о владельце телефона. Каждый канал должен иметь два настраиваемых уровня входного напряжения для оповещения об аварии на данном шлейфе (короткое замыкание, обрыв) и два дополнительных уровня для оповещения (пожарные датчики работают в паре и имеют два порога, срабатывании одного датчика соответствует сообщению - предупреждение, срабатывание двух - пожар). Для каждого канала должна быть возможность активации данного порога или деактивации с помощью брелока и программируемой выдержкой времени, и при срабатывании определенного порога срабатывание программируемого выхода.

Конфигурирование устройства должно выполняться используя USB интерфейс.

сигнализация оповещение пожарный датчик

2. Электронные компоненты печатной платы

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

2.1 Технические характеристики и параметры основных компонентов печатной платы

К основным компонентам применяемым в нашем устройстве являются: микроконтроллер STM32F407VGT в корпусе LQFP - 100, GSM модуль SIM900E. Так как микроконтроллер имеет 100 выводов и при начальном проектировании, количества выводов было недостаточно, то были применены аналоговые мультиплексоры в цепях аналоговых и дискретных входов.

Основные характеристики микроконтроллера STM32F407VGT: максимальная тактовая частота 168 МГц Cortex-M4F, 1 Мб флэш-памяти программ, 192 Кб ОЗУ, 3 x 12-разрядных АЦП, 2 x 12-разрядных ЦАП, Ethernet MAC 10/100, USB FS/HS OTG, 2 x CAN, 4 х USART, 3 х SPI, 3 x I2C, SDIO. Основными параметрами для нас здесь являются - объем оперативной памяти. Так как мы используем FreeRTOS, а за использование ядра операционной системы реального времени OCPB приходится платить: расходом памяти для хранения ядра, расход памяти для хранения стэка каждой задачи, таймеров семафоров, мьютексов и других объектов ОСРВ. Вторым важным параметром является тактовая частота ядра микроконтроллера и частота периферийных шин, от них зависит и суммарное потребление устройства. Источником опорной частоты служит внешний кварцевый резонатор 8MHz, используется контур фазовой автоподстройки частоты ФАПЧ для разгона системной частоты до 168 MHz. Настройки частот можно выполнить вручную в файле system_stm32f4xx. c задаются с использованием директив define. Либо воспользоваться специальным программным обеспечением STM32CubeMX Рис. 3.1.1.

Рис. 3.1.1 Настройка тактовых частот ядра и периферии микроконтроллера

Основные характеристики GSM модуля SIM900E: два диапазона GSM 900/1800 МГц (частота работы определяется при вставленной Sim карте), управление AT командами, класс мощности 4 (2 Вт в диапазонах 900 МГц), класс мощности 1 (1 Вт в диапазонах 1800 MГц). Основными параметрами данного модуля является управление AT командами. Все команды делятся на базовые, так называемые S-команды и расширенные. Практически все команды работают в 3 режимах - тестовом, чтения и записи. Так как основное назначение сигнализации является отправка SMS сообщения то для нас важно отправка сообщений на русском языке. SIM900E поддерживает два режима: отправка сообщений в текстовом режиме (в этом режиме все буквы кодируются в ASC2 формате отправка сообщений только латиницей) и в режиме PDU - специальный режим когда сообщение кодируется hex кодом и сообщение обрамляется специальными параметрами, такими как длинна сообщения, длинна номера, интернациональный формат номера и. т.д. При этом текущей кодировкой в этом режиме является формат UCS2 - аналог формата Unicod16.

2.2 Применяемые схемотехнические решения

От выполнения данных решений Рис. П.2.1 напрямую зависит реализация программного кода микроконтроллера. Ввод и измерение аналоговых сигналов с шлейфов сигнализации Рис 3.2.1, всего данных шлейфов в устройстве шестнадцать.

Рис 3.2.1 Реализация аналогового входа одного шлейфа сигнализации

Датчики пожарной и охранной сигнализации подключаются к клемной колодке справа XS1,XS3…XS16. Текущее напряжение с датчиков снимается с выводов SH_ADC1… SH_ADC16 - это аналоговые входа, они подаются в микроконтроллер не на прямую, а мультиплексируются аналоговыми мультиплексорами Рис 3.2.2.

Рис 3.2.2 Мультиплексирование аналоговых входов МК

На Рис 3.2.2 шлейфа сигнализации SH_ADC1 - SH_ADC8 мультиплексируются на два вывода ключа 1D и 2D напряжение с этих выводов подаются для измерения в микроконтроллер. Наше устройства содержит два таких ключа для ввода напряжений шлейфов, таким образом мы экономим 8 выводов микроконтроллера (4 - вывода используется для управления мультиплексором и 4 - для ввода сигнала в МК). Однако за экономию выводов приходится усложнять программное обеспечение, необходимо контролировать текущее положение ключей чтобы сохранять результаты замеров в соответствующую ячейку буфера для дальнейшей обработки.

Ввод дискретных сигналов от кнопки и от пульта дистанционного управления Рис 3.2.3 также выполняется через мультиплексор. Ввод сигналов от брелока выполняется так, что при нажатии на кнопку и соответствии положения ключа мультиплексора напряжение 5В (вход МК RF должен быть толерантен к напряжению 5В) с входа RF пропадает. Вход key от кнопок в МК должен быть подтянут к напряжению питания 3.3 Вольт, при нажатии на соответствующую кнопку падение напряжения на входе key =0Вольт.

Рис 3.2.3 Ввод дискретных сигналов в МК

Реализация выходных сигналов Рис 3.2.4 Четыре выхода предназначены для управления слаботочной нагрузкой 12В 0.5А, остальные без каскадов соединены напрямую с выводами МК.

Рис 3.2.4 Выходные сигналы МК.

3. Программное обеспечение микроконтроллера

Проект для микроконтроллера создан в среде разработки Keil uVision4. При написании кода вначале были составлены отдельные проекты и проверена их работа из примеров STM32F4xx_USB_Exemple для работы с USB, составлен отдельный проект для проверки АЦП и вывода их значений в окно терминала по USART, проект для работы с Sim900 опробована отправка сообщений, проект для работы с однопроводным интерфейсом 1-Wire проверена работа считывания 64 битного ключа iButton и работа термодатчиков. Основным проектом стал проект работы ОСРВ FreeRTOS. В этот проект затем добавлялся код из всех остальных вышеописанных проектов. Основная проблема соединения проектов заключалась в том, что некоторые из проектов содержали разную настройку частоты тактирования периферии. В настоящий момент существует программное обеспечение STM32F4 CubeMX позволяющее настроить все используемые выводы на нужную периферию, задать настройки необходимых прерываний, добавить ОСРВ, включить в проект использование драйверов USB, при необходимости добавить стек протоколов TCP/IP LwIP, после чего данная программа сгенерирует готовый шаблон кода со всеми необходимыми настройками.

3.1 Основная структура проекта

Проект содержит группу файлов распределенных по назначению Рис 4.1.1 Каждая группа хранится в отдельной папке.

Основные файлы проекта хранятся в папках STM32F4xx_StdPeriphDriver - хранятся основные функции и настройки управления для: _adc. c - аналогово-цифрового преобразования, _exit - внешние прерывания на выводах, _dma-управлением непрямого доступа к памяти минуя процессор (используем для копирования значений замеров по шлейфам в буфер), _usart - периферия для асинхронной передачи данных используя интерфейс RS232 (используется два интерфейса один для управления GSM модулем Sim900, второй для вывода отладочной информации в окно терминала), _rcc-настройка тактовых частот периферийных шин, _tim-настройка и работа с таймером 1-wire устройств.

Рис 4.1.1 Структура проекта МК

Системные настройки находятся в папке STM32F4xx, это startup_stm32f4xx. s - ассемблерный файл содержит определение таблицы векторов прерываний, определение размера стека (для сохранения контекста при вызове функций и в нем же сохраняются значения СФР специальных функциональных регистров R0-R3,LR,PSR,PC) и кучи (для работы с памятью используя memset, memcpy, malloc, для нужд ОСРВ выделяется отдельная куча из пространства RAM памяти) из этого файла вызывается вначале основная функция инициализации ядра void SystemInit (void) которая находится в файле system_stm32f4xx. c. Затем управление передается в main ().

Для конфигурации USB содержится несколько папок. В нашем проекте используется конфигурация USB OTG Device Virtual Com Port (OTG-on-the-go подключение на ходу). Virtual COM Port - это отдельный подкласс USB устройств когда обмен выполняется по интерфейсу RS232, в этом случае STMElectronics поставляет уже готовый драйвер (VCP_V1.3.1.) под Windows 7 для работы с виртуальным портом. Это упрощает разработку устройства, так как в случае использования полноценного HID (Human interface devices) устройства необходимо описывать дескриптор устройств, интерфейса, конфигурации, конечных точек. Для непосредственной работы с данными служит файл usbd_cdc_vcp. c в папке App, этот файл согласно документации [4] - пользовательский уровень для интерфейса USB, папка USB Driver содержит файлы нижнего уровня где происходит взаимодействие рабочих регистров с функциями нижнего уровня. Взаимодействие пользовательских функций и обработка прерываний с драйверами нижнего уровня выполняется с помощью функций среднего уровня в папке USB Device. В папке USB Device в файле usbd_cdc_core. c содержутся основные дескрипторы устройства. Максимальная скорость передачи информации по USB в нашем случае состовляет 64Кб\сек, а само устройство определяется как FS (full speed) 12Мбит\с.

Папка RTOS содержит функции для работы ОСРВ. Файлы входящие в эту структуру: heap_4. c - содержит механизм выделения памяти для нужд FreeRTOS, tasks. c,queue. c, croutine. c - содержат реализацию механизма задач, реализация очередей и сопрограмм.

Папка User - содержит пользовательские файлы для работы с Sim900, 1-Wire устройствами и АЦП. Основной файл приложения, где начинается выполнение пользовательских задач - app. c.

3.2 Задачи операционной системы реального времени

Сигнализация GSM должна быть мультизадачной - поочередно выполнять поставленные задачи в порядке их приоритета и важности. В нашем проекте определим следующие задачи: задача обработки измерений напряжений шлейфов сигнализации (в ПО конфигурации шлейфы обозначены как канал1-канал16), задача определения состояния входов и в соответствии с активированным входом она должна активировать необходимый канал, задача отправки SMS сообщения, задача инициализации USB - после выполнения инициализации она удаляет сама себя из планировщика, задачи попеременного мигания светодиодов (в них также выполняется инициализация GSM модуля SIM900 если она проходит неуспешно, может повторяться несколько раз, и выполняется проверка необходимости срабатывания выхода), задачи считывания температуры и номера с устройств 1-wire:

xTaskCreate (vTaskLED1, (signed char *)

"LED1”, configMINIMAL_STACK_SIZE, NULL, 2,&xTaskXandleSvet);

xTaskCreate (vTaskLED2, (signed char *)

"LED2”, configMINIMAL_STACK_SIZE, NULL, 1, (xTaskHandle *) NULL);

xTaskCreate (vInitUSB, (signed char *)

"InitUSB”, configMINIMAL_STACK_SIZE, NULL, 3

(xTaskHandle *) NULL);

xTaskCreate (vInitOwire, (signed char *)

"InitOwire”, configMINIMAL_STACK_SIZE, NULL, 1, (xTaskHandle *) NULL);

xTaskCreate (vOwireNomer, (signed char *)

"OwireNomer”, configMINIMAL_STACK_SIZE, NULL, 2, (xTaskHandle *) NULL);

xTaskCreate (vObrabUstADC, (signed char *)

"ObrabUstavok”, configMINIMAL_STACK_SIZE, NULL, 1, (xTaskHandle *) NULL);

xTaskCreate (vObrVhodov, (signed char *)

"vObrabVhodov”, configMINIMAL_STACK_SIZE, NULL, 1, (xTaskHandle *) NULL);

xTaskCreate (vOtpravSMS, (signed char *)

"OtpravSms”, configMAXIMAL_STACK_SIZE, NULL, 2,&OtpSoobSim);

vTaskStartScheduler (); - запускаем планировщик

FreeRTOS позволяет достаточно гибко управлять приоритетами выполнения задач, позволяет приостановить или выгрузить задачу из очереди планировщика или изменить ее приоритет в ходе ее выполнения, или из другой задачи используя ее хэндл и содержит дополнительные функции таймеры, очереди, семафоры. Хэндл или описание - каждой задаче задается свой номер по которому ОСРВ распознает текущую выполняемую задачу, этот номер и есть хэндл задачи, например для задачи отправки SMS хэндлом является OtpSoobSim-указав его из другой задачи мы можем изменить ее приоритет или приостановить выполнение. ОСРВ поддерживает три типа многозадачности: вытесняющую, кооперативную, гибридную. Все основные настройки ОСРВ находятся в файле FreeRTOSconfig. h:

#defineconfigUSE_PREEMPTION 1-установили вытесняющую многозадачность, каждая задача выполняется в течении одного кванта времени планировщика, в проекте этот квант #define configTICK_RATE_HZ ( (portTickType) 1000) равен 1милисекунду. Для каждой созданной нами задаче выделяется стек размер которого #define configMINIMAL_STACK_SIZE ( (unsigned short) 100) равен 200 байт. Для работы ОСРВ выделяется область памяти, под все задачи и механизмы, в куче равной configTOTAL_HEAP_SIZE ( (size_t) (60 * 1024) 60 Кбайт. Максимальное число приоритетов задач равно 5.

После создания наших задач планировщик отдаст управление, задаче с самым большим приоритетом - это задача инициализации USB "InitUSB" с приоритетом 3 (после выполнения данная задача удаляется из планировщика и освобождает стек ОСРВ). После этого он отдаст управление задачам "LED1" - где выполняется инициализация GSM модуля в течении 13 секунд vTaskDelay (13000) и пока эта задача временно блокирована планировщик отдаст управление другой задаче с приоритетом 2 - задаче отправки SMS - OtpravSms но данная задача ждет данные в очереди, а поскольку данных в очереди нету то xStatus=xQueueReceive (xQueueSoob,&ReciveData,0) выполнение этой задачи планировщиком приостанавливается

vTaskSuspend (NULL); - а вот возобновить теперь выполнение этой задачи может только задача сравнения значений АЦП она же отправляет в очередь номер телефона на который необходимо отправить сообщение. Как только планировщик отсчитает 13 сек с момента блокирования "LED1" она разблокируется и управление снова передается ей, если инициализация прошла успешно, в ее теле понижается ее же приоритет до 1 и происходит попеременной мигание светодиодов - говорит об успешной инициализации. В нашем случае каждой задаче планировщик уделяет каждой задачи 1мсек, через 1 мсек происходит прерывание системного таймера SysTick при этом данные задачи сохраняются в стеке задачи. Это прерывание запускает планировщик который оценивает есть ли готовые, неблокированные к выполнению задачи и в порядке приоритета отдает управление той, у которой приоритет максимальный. В данном случае если высокоприоритетная задача не имеет временной блокировки или приостановки, задачи с меньшим приоритетом никогда не получат управления.

3.3 Взаимодействие задач и прерываний

Рассмотрим как обрабатываются прерывания без ОСРВ. Каждый тип прерывания микроконтроллера имеет свой приоритет. Его можно установить в СФР где для задания приоритета выделено 4 бита - это соответствует уровням приоритета от 0 до 15. Однако данные биты различными комбинациями могут быть разделены на подгруппы (например 2 бита на приоритет группы и 2 на приоритет подгруппы).

В нашем проекте выполним настройку при которой все 4 бита - соответствуют уровням приоритета, без деления на подгруппы:

NVIC_PriorityGroupConfig (NVIC_PriorityGroup_4);

Правила обработки прерывания без деления на подгруппы:

- вызов прерывания с более высоким приоритетом приостанавливает выполнение текущего обработчика;

- выполнение функции обработки прерывания не может быть прервано вызовом с тем же или более низким уровнем приоритета;

- при одновременном вызове несколько прерываний будут обработаны в порядке приоритета, при одинаковом приоритете по возрастанию номера прерывания (порядковые номера задаются в файле STM32F4xx. h);

В нашем проекте задаем следующие приоритеты прерываний (0-означает максимально возможный приоритет):

1) прерывание получения данных от модуля Sim900 по USART_2 (файл Sim900. c)

NVIC_InitStructure. NVIC_IRQChannelPreemptionPriority = 0;

2) прерывание таймера TIM3 запуска преобразований АЦП (по истечении установленной выдержки времени происходит прерывание, в программе прерывания выполняется запуск преобразования, установка приоритета в файле ADC. c)

NVIC_InitStructure. NVIC_IRQChannelPreemptionPriority = 4;

3) прерывание при получении данных по USB (файл usb_bsp. c)

NVIC_InitStructure. NVIC_IRQChannelPreemptionPriority = 0;

4) прерывание по нажатию кнопок, и управлению с брелока (файл app. c)

NVIC_InitStructure. NVIC_IRQChannelPreemptionPriority = 4;

Самый низкий приоритет у прерываний TIM3 и прерываний по нажатию кнопок, и эти прерывания имеют одинаковый приоритет, чтобы они не приостанавливали друг друга. А самые высокие приоритеты имеют обработчики прерываний по USB - при программировании конфигурации устройства и получение сообщения по Sim900. Такие настройки выбраны потому что самыми приоритетными задачами является конфигурирование устройства по USB, при этом передача информации между ПК и МК не должно прерываться низкоприоритетными прерываниями, и получение сообщений по GSM связи которое будет выполнять управление сигнализацией.

Приоритет задач не имеет никакого отношения к приоритету прерываний. Задачи не выполняются во время выполнения обработчиков прерываний. Ядро FreeRTOS позволяет с помощью макросредства config MAX_SYSCALL_INTERRUPT_PRIORITY задать наибольший приоритет прерывания, из обработчика которого можно вызывать API функции FreeRtos. Что-бы защитить выполнение текущего кода задачи от прерываний используются критические секции - это участки кода, во время выполнения которого запрещены прерывания процессора, и не происходит прерывание контекста каждый квант времени, а также запрещено прерывание системного таймера SysTick.

Определим в нашем проекте

#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 3

т.е. на все прерывания с приоритетом до 3 (это прерывание USB и прерывание получения информации модулем Sim900) не влияют критические секции, так что ничего что делает ядро в текущий момент, не помешает выполнению текущего обработчика. Например в задаче "LED1” выполняется инициализация Sim900 следующим образом:

void vTaskLED1 (void *pvParameters)

{

taskENTER_CRITICAL (); // вхожу в критическую секцию

Init_Sim900 (2,4,0); // передаем две команды AT

Init_Sim900 (0,1,0); // передаем команду отключение эха

Init_Sim900 (8,13,0); // включаем текстовый режим

taskEXIT_CRITICAL (); // выходим из критической секции

……….

}

В вышеприведенном примере при входе в критическую секцию - когда выполняется инициализация SIM900 запрещаем прерывания по TIM3 (запуску АЦП преобразования), и прерывания брелока. Также критические секции используются при отправке SMS сообщения (задача "OtpravSms") - в этот момент выполняется последовательность из нескольких команд прерывать выполнение которых нельзя.

3.4 Функции обработчиков прерываний

Рассмотрим некоторые фрагменты кода для нескольких функций обработчиков прерываний (файл stm32fxxx_it. c):

1) Прерывание по таймеру выполняются каждые 2,5 милисекунды, в обработчике прерывания выполняется анализ положения ключей мультиплексора каналов сигнализации, и в зависимости от текущего положения переключаются мультиплексоры на следующие входы. После того как завершится каждое преобразование АЦП, DMA сохраняет значения напряжений по каналам в глобальном массиве (объявленном в app. c): __IO uint16_t ADC3ConvertedValue [16]. Таким образом полный цикл замеров по всем каналам завершится после четырех преобразований 4*2.5=10 мсек.

Void TIM3_IRQHandler (void)

{

………

if (DMA_GetCurrDataCounter (DMA2_Stream0) ==0x10) // массив пуст

{

GPIOE->BSRRH= GPIO_BSRR_BS_7; // переключаем мультиплексор

GPIOE->BSRRH= GPIO_BSRR_BS_8;

// отдаем семафор задаче обработки результатов замеров

xSemaphoreGiveFromISR (xSemPrerADC,NULL)

}

// если массив заполнен на ј

else if (DMA_GetCurrDataCounter (DMA2_Stream0) ==0xC)

{

GPIOE->BSRRL= GPIO_BSRR_BS_7; // переключаем мультиплексор

GPIOE->BSRRH= GPIO_BSRR_BS_8;

} ……

// обновляем значение счетного регистра таймера

capture = TIM_GetCapture1 (TIM3);

TIM_SetCompare1 (TIM3, capture + CCR1_Val);

// запускаем следующее преобразование АЦП

ADC_SoftwareStartConv (ADC1);

/*передаем управление не планировщику, а если есть на очереди прерывание

то в следующее прерывание, не допуская лишнее переключение

контекста*/

portYIELD_FROM_ISR (1);

}

2) Прерывание по нажатию кнопок и брелока. Мультиплексоры как аналоговых сигналов, так и дискретных управляются от одних и тех же выводов МК. По Рис 3.2.3 прерывания на брелоке настроены на появление логической единицы (точнее появление 5В через нажатую кнопку на брелоке) на выводе RF, прерывания кнопок настроены на появление логического нуля на выводе key (на key включена подтяжка к питанию 3.3 Вольт). Таким образом, при возникновении прерывания, номер нажатой кнопки соответствует положению мультиплексорного ключа в данный момент времени. Зная продолжительность кратковременного нажатия кнопки 105 мсек и продолжительность каждого переключения мультиплексора 2.5 мсек, для четырех кнопок будем выполнять счет нажатий и сравнивать его со значением 105/4*2.5=10 равным десяти. Определение что кнопка нажата будем выполнять в задаче "vObrabVhodov" где для каждой кнопки сравниваем значение счета со значением 10 и если chetEXTIA [номер кнопки] >=10 значит кнопка нажата. Но перед сравнением значений мы будем блокировать выполнение этой задачи каждые vTaskDelay (105) - 105мсек.

Счет выполняем в программе прерывания:

void EXTI15_10_IRQHandler (void) // вызов при нажатии любой кнопки

{

// определяем текущее положение ключа мультиплексора

uint8_t Ukaz=DMA_GetCurrDataCounter (DMA2_Stream0);

// если прерывание на линии RF - это радиобрелок

if (EXTI_GetITStatus (EXTI_Line14)! = RESET)

{

switch (Ukaz)

case 0x10: // ключ мультиплексора в положении S1

// дополнительно считываем текущее состояние

if ( (VhodRF [4] = (GPIOE->IDR & GPIO_Pin_14)? 1: 0))

// увеличиваем счет для кнопки обрабатываемый в задаче vObrabVhodov

chetEXTIA [4] ++;

break;

…….

}

// очищаем флаг прерывания

EXTI_ClearITPendingBit (EXTI_Line14);

// передаем управление следующему прерыванию

portYIELD_FROM_ISR (1);

}

3.5 RTOS задачи проекта

Рассмотрим фрагменты кода реализации некоторых задач:

1) Задача обработки уставок АЦП - vObrabUstADC. В программе конфигурирования сигнализации под Windows7 пользователь выбирает необходимый канал, для каждого канала существует возможность настройки четырех уставок АЦП и уставок времени АЦП. Уставки АЦП - это те значения выше или ниже которых (направление работы также выбирается пользователем) выполняется набор действий. Эти действия также настраиваются пользователем и могут выполнять отправку SMS сообщений, срабатывание определенного выхода сигнализации. Уставка времени АЦП нужна для защиты от наводок и бросков напряжений в канале. Пользователь может задать время в диапазоне значений 250-500 мсек.

В разделе 4.3 при описании функции обработчика прерывания по таймеру, определено время полного сканирования напряжения всех каналов 10 мсек, эта функция также отдает семафор-механизм ОСРВ позволяющий обеспечивать синхронизацию выполнения задачи с выполнением прерывания. Как только функция прерывания по окончанию замеров всех 16 каналов отдает семафор, задача захватывает его и происходит обработка значений. Если семафор не доступен, а планировщик запустил данную задачу она должна блокироваться на время не менее 10 мсек. Поскольку сравнение результатов замера каждой уставки АЦП выполняется каждые 10мсек, то выполнив сравнение 25 раз и если замеренное значение будет выше или ниже уставки все 25 раз (или 250 мсек) значит сигнализация сработала, необходимо выполнять дальнейшие действия. Таким образом выполняется защита от наводок оговоренном в техническом задании (см. Раздел 2.1). Основные переменные обрабатываемые в этой задачи являются:

lenkan-количество каналов сконфигурированных пользователем;

masADC [16] - массив с номерами используемых каналов;

UslAktiv [16] [4] - многомерный массив хранит два значения 0 - уставка в данный момент активна, 1-уставка в данный момент не активна. Это дает возможность активировать брелоком необходимую уставку.

ADC3ConvertedValue [ChanelADC [chet]] - массив содержит замеренные значения напряжения

ResMasADC [16] [4] - массив хранит уставки АЦП введенные пользователем

FlagMas [16] [4] - массив содержит данные по уставкам, сколько раз замеренное значение достигало уставки.

Void vObrabUstADC (void *pvParameters)

{ …….

For (;;)

{

// проверяем доступность двоичного семафора - отдает функция прерывания

if (xSemaphoreTake (xSemPrerADC,10))

{

// сканируем по всем введенным пользователем каналам

for (i=0; i<lenkan; i++)

{

/*в зависимости от направления действия уставки и активности

канала в данный момент*/

if (ADCstr [chet] - >napravl [j] ==0 && UslAktiv [i] [j] ==0)

{ // выполняем необходимое сравнение

if (ADC3ConvertedValue [ChanelADC [chet]] < (ResMasADC [chet] [j] - 0xA))

++FlagMas [i] [j]; // ведем счет данным сравнениям

………….

}…………

}

// если счет достиг уставки по времени

if (FlagMas [i] [j] >=UslovDelFlag [chet] [j])

/*используя очередь передаем в задачу отправки номер канала и номер

уставки, длинна очереди - 16 равна длинне каналов */

DataSoob. nomkan=chet;

DataSoob. nomstrok=j;

xQueueSendToBack (xQueueSoob, (void*) &DataSoob,154);

// выводим задачу отправки из блокированного состояния

vTaskResume (OtpSoobSim); }}}

2) Задача выполняющая отправку SMS сообщений - vOtpravSMS. Как только появляется условие для отправки сообщения, задача обработки уставок сохраняет в очереди структурную переменную которая хранит номер канали и номер уставки и выводит данную задачу из приостановленного состояния. Очередь - механизм ОСРВ позволяющий передавать информацию между задачами, так и между задачами и прерываниями.

Void vOtpravSMS (void *pvParameters)

{

for (;;)

{

do

{ // проверяем что очередь не пуста

xStatus=xQueueReceive (xQueueSoob,&ReciveData,0);

if (xStatus==pdPASS)

{ // если существует условие отправки SMS

if (ADCstr [ReciveData. nomkan] - >vidOpovesh [ReciveData. nomstrok] == 0)

// если на один канал сконфигурировано несколько телефонов

for (t=0; (tel=ADCstr [ReciveData. nomkan] - >nomertel [t])! =0xFF; t++)

{ // то отправляем на все телефоны данного канала

taskENTER_CRITICAL ();

Otprav_soob (tel,ReciveData. nomkan,ReciveData. nomstrok);

taskEXIT_CRITICAL ();

vTaskDelay (4340); // задержка 4 сек для отправки SMS SIM900

}

// отправляем пока в очереди есть сообщения

}} while (uxQueueMessagesWaiting (xQueueSoob));

// после чего данная задача сама себя приостанавливает

vTaskSuspend (NULL);

}

Особенности выполнения данной задачи наличие критической секции при вызове функции отправки сообщения. В этой функции выполняется кодирование сообщения и через определенные интервалы времени SIM900 передаются команды управления с сообщением. Одним из недостатков FreeRTOS является то что в критической секции нельзя вызвать функцию vTaskDelay () - блокировки задачи на определенное время, и передачи на это время, управления другим задачам. Данная особенность основана на том, что vTaskDelay () - работает от прерывания SysTick - т.е. при ее вызове разрешаются маскируемые прерывания и автоматически вызывается функция taskEXIT_CRITICAL () выхода из критической секции.

3.6 Передача параметров настройки по USB

При передаче данных от ПО компьютера, оно открывает необходимый COM порт и передает все данные. Драйвер обеспечивающий связь COM порта с пакетами USB передаваемых контроллеру обеспечивает максимальный размер пакета данных 64 бита. Процесс получения данных выполняется через контрольную точку 0. В конце передачи пакета данных генерируется прерывание и вызывается функция обработки данных - VCP_DataRx (uint8_t* Buf, uint32_t Len) в файле usbd_cdc_vcp. c. Чтобы не превысить лимит в 64 байта и избежать потери данных передача данных выполняется по каналам настроенным в пользовательском приложении. Например вначале передаем данные по строкам вначале строка №1 затем строка №2 и. т.д.

Для строки №1 первое передаваемое сообщение будет N79529091812 - это номер телефона, вторым сообщением следует Hиванов Е.П. - это пользователь, С030001 - для этой строки используется четвертый канал который работает с телефонами под индексами 00 и 01 в массиве телефонов и. т.д. Все передаваемые сообщения обрабатываются по первому символу и записываются в соответствующую структуру данных.

Структура получаемых данных описана в файле StructUSB_tel. h:

typedef struct

{

uint8_t Nom_Chan [MAXKANADC]; // номера используемых каналов

uint8_t kolvo; // общее количество телефонов

uint8_t Numb_tel [MAXKOLVOTEL] [12]; // здесь сохраняются телефоны

} Tel_Def;

#define TelefoneM ( (Tel_Def*) TEL_BASE)

#define TEL_BASE 0x080E0000

Где TEL_BASE - базовый адрес структурной переменной телефоны, все данные сохраняем в последнем 11 секторе Flash памяти [5] Рис 4.6.1.

Рис 4.6.1 Карта Flash памяти микроконтроллера

Также определим массив структурных переменных содержащие настройки каналов:

typedef struct

{

uint8_t kolispADC; // количество используемых уставок

uint8_t vidOpovesh [4]; // вид оповещения для каждой уставки

uint8_t SoobSMS [4] [60]; // сообщение для каждой уставки

uint8_t UrovADC [4] [2]; // уставка значений напряжений

uint8_t ZadADC [4] [2]; // задержка для каждой уставки

uint8_t napravl [4]; // направление действия

……….

} KanADC;

#define TEL_BASE 0x080E0000

#define ADCstr ( (KanADC *) ADC_struct) - данные по каналам записываются по адресу 0x080E021D.

Пример реализации функции записи данных во флэш память Рис 4.6.2:

static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len)

{ ……uint8_t fi=0;

if (* Buf=='N') // встретили букву N это телефоны

{

fi=fiS+1; // вспомогательная переменная хранит общее количество тел.

Buf++;

flash_unlock (); // разблокируем flash память для записи

if (fi==0)

flash_erase_page (0x58); // если это первый телефон очищаем память

flash_write_start (); // начинаем запись телефонов

for (pi=0; pi<11; pi++)

TelefoneM->Numb_tel [fi] [pi] =*Buf++;

TelefoneM->Numb_tel [fi] [pi] ='\0';

flash_write_end (); // конец записи во flash

flash_lock (); // блокируем запись

fiS++; // ведем счет текущим телефонам

…….

}

Рис 4.6.2 Запись конфигурационных данных во Flash память

4. Программное обеспечение Windows Form C#

Создадим приложение, для настройки GSM сигнализации, используя Windows Form C# Visual Studio 2010. Перед проектированием приложения определимся со структурой проекта - типы и количество окон (форм), какие поля будет содержать окна, какие данные в них будут вводиться их диапазоны.

4.1 Определение общей структуры приложения

Окна приложения. Структура проекта должна содержать одно главное окно с основными вкладками. Должна быть возможность добавления новых окон и ввод в них новых значений, с возможностью сохранения настроек главного окна. Определим пусть данное окно будет формата MDI - многооконный интерфейс Рис П1.1.

Определим основные вкладки главного окна: данные, входы, выходы. Вкладка данные должна содержать:

Номер телефона - сюда вносится номер куда будет оправляться сообщение или выполняться дозвон, максимальная длинна данных 11 символов, поле для ввода только числовых значений, при вводе букв отображается ошибка;

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

Сообщения - сюда вносим текст отправляемого сообщения. Поле длинной 60 символов, включает как текст так и числа (максимальный размер пакета данных передаваемого по USB 64байта см. п 4.6 Передача параметров настройки по USB);

Канал - окно будет иметь вид выпадающего списка в котором будет выводится Канал1, Канал2, и. т.д. (максимальное количество каналов равно 16). Все параметры канала будут настраиваться при нажатии на кнопку настройки данного канала. Если на вкладке Канал не настроен ни один канал то в данном выпадающем списке не будет ничего отображаться. При нажатии на кнопку настройки канала должно вызываться дочернее окно (форма) - фиксированных размеров содержащее основные поля для настройки.

Дочернее окно должно содержать строки для ввода четырех уставок, основные компоненты которые должны содержаться в строках Рис. П.1.2:

Checkbox - для активации определенной уставки;

Направление срабатывания - для задания режима контроля, выше чем введенное значение в поле уровень АЦП или ниже;

Уровень АЦП - содержит контролируемую уставку напряжения;

Выдержка - хранит время в диапазоне 250-500мсек, возможность редактирования с шагом 10;

Вид оповещения - окно будет иметь вид выпадающего списка в котором будут содержаться следующие значения - Ни звонка ни SMS, SMS, звонок, SMS и звонок. Если выбрано значение звонок то ввод информации в окно сообщения будет невозможным (заблокирован);

Активация АЦП - heckbox для работы с брелками и кнопками, когда при нажатии определенной кнопки активируется необходимая уставка. После выбора данного гаджета становятся активными окна с выпадающим списком для выбора входов - для активации и деактивации и временной выдержки в диапазоне от 1 до 60 сек;

Выходы - окно с выпадающим списком содержащим программные выходы с выход1 по выход10.

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

Окончательный вариант приложения изображен на Рис П.1.3, П.1.4.

4.2 Создание библиотеки из ссылочных типов содержащие поля данных

Для создания библиотеки при разработке проекта используя шаблон Class Library (библиотека классов), создадим сборку с расширением dll которая будет хранить данные в определенных нами полях формы.

Namespace Ustavki

{

…………

[Serializable]

public class Kanal: Ienumerable

{

public Stroka [] str = new Stroka [4];

public Kanal ()

{

for (int I = 0; I < 4; ++i)

str [i] = new Stroka ();

}

public Ienumerator GetEnumerator ()

{

for (int I = 0; I < 4; ++i)

yield return str [i];

}

[Serializable]

public class GlavnOkno

{

public string [] nomer_tel=new string [30];

public string [] famil=new string [30];

public int [] nom_kanal=new int [30];

public bool [,] vhod_usl = new bool [10, 8];

public int [,] vhod_napr = new int [10, 8];

public bool [,] vihod = new bool [10, 8];

public bool [,] vihod_inv = new bool [10, 8];

}

}

Данная библиотека содержит основной тип канал Kanal реализующий интерфейс Ienumerable. При создании главного окна вызывается конструктор данного класса который создает четыре объекта-строки Stroka. Класс Stroka содержит все поля дочернего окна - уровни напряжения АЦП, выдержки времени, различные условия и свойства для доступа к полям. При создании объектов класса Stroka ее поля инициализируются начальными значениями которые выводятся в дочернем окне. Реализовав интерфейс Ienumerable методом GetEnumerator () для объектов типа канал мы получаем доступ к любой строке из 16 каналов используя индексатор. При создании главного окна мы создаем массив объектов Kanal, таким образом каждое вновь созданное окно содержит свои 16 каналов. Кроме того каждое главное окно содержит объект класса GlavnOkno - содержащее открытые поля для номеров телефона, входам, выходам и другим вспомогательным полям. Все типы помечены аттрибутом Serializable что дает возможность сохранять все поля в бинарном файле.

4.3 Основная сборка проекта

Основная сборка проекта содержит конструктор формы основного окна и в основной проект добавлена ссылка на файл dll описанный в 5.2 Данный конструктор запускается при создании главного окна. Также в ней содержутся функции по созданию и заполнению начальными значениями дочерних окон каналов, вспомогательные методы для работы с элементами управления checkbox, элементами datagridview textbox, combobox, button.

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

При работе с COM портом используется класс SerialPort пространства имен System. IO. Port. Технология записи в порт следующая:

1) Создаем символьный поток работающий с unicod символами в файле Dan. txt

StreamWriter f = new StreamWriter ("Dan. txt");

2) Вызываем метод WriteDanToFile () в котором записываем все данные в настроенных каналов построчно (записываем в файл Dan. txt):

N79529091812

HИванов

S03080102

……

3) В цикле построчно считываем каждую строку, конвертируем при необходимости значения в кодировку ASC2 и отправляем данные в порт

while ( (s = f. ReadLine ())! = null)

{

byte [] bt=new byte [s. Length];

if ( (s [0]! = 'H') && (s [0]! = 'M'))

{

for (int i = 0; i < s. Length; i++)

bt [i] = Convert. ToByte (s [i]);

}

else

bt = ascii. GetBytes (s);

port. Write (bt, 0, bt. Length);

}

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

Заключение

В процессе создания GSM сигнализации для микроконтроллера написаны базовые функции работы с шлейфами сигнализации, функции отправки SMS сообщений, функции работы с входами, выходами. Также создано приложение под Windows7 для настройки и конфигурирования сигнализации. На стадии разработки программного обеспечения, из за большого количества входных и выходных цепей использованы дополнительные электронные компоненты - мультиплексоры. Добавление любого вспомогательного компонента увеличивает сложность разработки и написания приложений и время на их создание. Кроме того большое количество входных цепей, а в нашей сигнализации только 16 шлефов для подключения датчиков, больше необходимо в каких либо промышленных устройствах, а не бытовых. Более того необходимо учитывать экономическую составляющую и "необходимость" прибора у потребителя. На сегодняшний момент рынок богат на выбор подобными устройствами с разной комплектацией и сравнительно доступными по цене. Также в разработке устройств большую роль играет отладка прибора, с опробованием всех возможных режимов, имитацией всех возможных внештатных ситуаций. Данные отладочные работы проводились в ограниченном объеме.

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

Список литературы

1. Datasheet // http://www.st.com/ URL: http://www.st.com/stonline/stappl/resourceSelector/app? page=fullResourceSelector&doctype=datasheet&LineID=11

2. API Reference // http://www.freertos.org/ URL: http://www.freertos.org/a00106.html

СВОД ПРАВИЛ "Системы противопожарной защиты УСТАНОВКИ ПОЖАРНОЙ СИГНАЛИЗАЦИИ И ПОЖАРОТУШЕНИЯ АВТОМАТИЧЕСКИЕ Нормы и правила проектирования" от 2009 № СП 5.13130.2009 // ФГУ ВНИИПО МЧС России, 2009.

3. UM1021 STM32F105xx, STM32F107xx, STM32F2xx and STM32F4xx USB On-The-Go host and device library // http://www.st.com/ URL: http://www.st.com/st-web-ui/static/active/en/resource/technical/document/ user_manual/CD00289278. pdf

4. http://www.st.com/URL: http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020. pdf

Приложения

Приложение 1. Внешний вид приложения

Рис 1.1 Общий вид формы главного окна приложения

Рис 1.2 Общий вид дочернего окна формы настройки канала

Рис. 1.3 Внешний вид приложения

Рис. 1.4 Настройка входов приложения

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.