МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ЧЕРНІВЕЦЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
ІМЕНІ ЮРІЯ ФЕДЬКОВИЧА
ФІЗИЧНИЙ ФАКУЛЬТЕТ
КАФЕДРА КСМ
7.0915.01 Комп’ютерні системи та мережі
Апаратно–програмний комплекс GSM-МТМ
(дипломний проект)
2009
Анотація
В дипломному проекті обґрунтовано побудову апаратно–програмного комплексу, вибір апаратних та програмних засобів та введення комплексу в дію. Описані основні сервісні функції мобільних телефонів стандарту GSM.
Також створена програма, що дозволяє вести статистику вхідних та вихідних дзвінків, статистику використання комплексу його абонентами.
Комплекс створено на базі комп’ютера IBM 486DX4 (100МГц). Програмна частина комплексу парцює під операційною системою DOS6.22 і написана на мові Borland C++3.1. Програма обробки інформації написана на Visual Basic 5.0 з використанням Microsoft Access 2000 і працює під OS Windows 98. На даний момент комплекс перебуває на стадії тестування і розміщений на фірмі “New Com”.
Метою даного дипломного проекту є заощадження коштів організації де буде застосований цей дипломний проект.
Даний дипломний проект містить сторінок друкованого тексту, 6 – малюнків, 4 – додатки.
The summary
In the degree project the construction of a hardware-software complex, Realised choice hardware, software and proved the complex in action. The described basic service functions of mobile telephones of the standard GSM.
Also created program, which permits to conduct statistics of entrance and initial bells, statistics of use of a complex by his subscribers.
The complex is created on the basis of the computer IBM 486DX4 (100Мгц). The program part of a complex works under operational system DOS6.22 and written on language Borland C ++ 3.1. The program witch processing the information written on Visual Basic 5.0 with use Microsoft Access 2000 and works under OS Windows 98. Now complex is at a stage of testing and placed on the " New Com " office.
The purpose of the given degree project is the saving the money of organization where this degree project will be applied.
The given degree project contains 103 — pages of the printed text, 6 — figures, 4 — additions.
Зміст
Вступ
1. Аналітичний огляд
1.1 Аналоги, їх недоліки та передумови розробки
1.2 Область призначення та застосування
1.3 Вибір програмної та апаратної платформи
1.4 Технічні характеристики
2. Теоретичні відомості
2.1 Принципи стільникового зв'язку
2.2 Система команд керування мобільним телефоном
2.3 Специфіка програмування апаратних переривань на прикладі переривання від СОМ порта
2.4 Аналіз елементної бази, інтерфейси комплексу
2.5 Алгоритм роботи комплексу
3. Практична частина
3.1 Підключення компонентів та настроювання апаратної частини
3.2 Розробка драйвера послідовного інтерфейсу
3.3 Розробка програми bridge для комплексу МТМ?GSM
3.4 Програма обробки інформації про дзвінки
3.5 Тестування комплексу
6. Охорона праці
6.1 Загальні положення
6.2 Експлуатація комплексу у автономному режимі
6.3 Електромагнітне випромінювання та поля від ЕОМ
6.4 Шум, пов'язаний з ВДТ
6.5 Параметри освітлення робочого місця та робочого приміщення
6.6 Температура і вологість у приміщенні
6.7 Організація робочого місця
5. Економічний розрахунок
5.1 Розрахунок економічної вигоди при використанні комплексу
5.2 Розрахунок собівартості програмного комплексу
Висновки
Література
Додатки
Вступ
Одним з важливих атребутів ділової людини є його комунікабельність. Здатність швидко реагувати на зміни подій оточуючого світу. Ці умови послужили приводом для створення цілих класів радіомереж різних типів. У нашому регіоні в умовах конкуренції визначилися наступні мережі:
з аналогових мереж: NMT 450i, Алтай, мережа транкінгового зв’язку, мережі пейджинкові мережі.
із цифрових мереж найефективнішим та широкодоступним виявився стандарт GSM. Зараз у Чернівцях діють мережі стандартів GSM900, GSM1800.
Перевага стандарту GSM полягає у веденні конфіденційних переговорів, та найменьше випромінення абонентських терміналів, що безперечно має суттєве значення для здоров’я людини. Проте за час розвитку GSM розвинулися і інші мережі зв’язку. Основна з них – міська телефонна мережа (МТМ). Вона не забезпечує мобільність абонентів, проте розмова через мережу МТМ коштує значно дершевше ніж аналогічна розмова між абонентами GSM.
Різні групи населення користуються різними мережами, але деколи необхідно скористатися послугами двох мереж одночасно, тобто здійснити зв’язок між абонентами різних мереж. Таку послугу мережі МТМ та GSM надають за невиправдано високою ціною. Тому зараз існує велика кількість персональних з’єднувачів (мостів) цих мереж. Вони призвані зменшити вартість розмови між абонентами різних мереж, до загальної вартості розмови абонентів у кожній з мереж окремо. Кілька таких “мостів” вже сертифіковані на Україні та в Росії. Найвідоміший з них – це ЕС СОМ Bridge. Але для колективного використання, наприклад в організаціях такі “мости” не пристосовані, оскільки в них не реалізовані функції колективного використання “мостів”. А саме: персональна тарифікація для кожного абонента, ведення журналу вхідних та вихідних дзвінків, незручне або неможливе підключення нових абонентів, обробка журналу дзвінків, не реалізована функція здійснення дзвінка з МТМ в мережу GSM, не на всіх “мостах” реалізований захист від несанкціонованого підключення. Інший суттєвий недолік вищевказаних “мостів” – їхня вартівсть. У проаналізованій мною літературі “мостів”, що б реалізовували вищевказані функціональні можливості, знайдено не було.
Отже розроблений апаратно програмний комплекс (надалі комплекс), дозволяє використовувуючи один абонентський термінал мережі GSM та одину телефонну лінію мережі МТМ, зідйснювати дзівнки з однієї мережі в іншу в обох напрямках, вести журнал дзвінків, надавати звіти по накопиченій інформації у вигляді таблиць та діаграм, дозволяє вести персональну тарифікацю для вхідних та вихідних дзвінків а також здіснює захист від несанкціонованого підключення. Основне призначення такого комплексу–спільне використання комплексу в невеликих організаціях (кількість користувачів ≤ 100), де частина персоналу (директор, водії, агенти, та ін.) виконують свою роботу поза офісом, а інша частина пресоналу(секретарі, бугалтера, інший персонал організації) перебуває на своєму постійному робочому місці для підтримки зв’язку з офісом, та іншими абонентами мережі МТМ.--PAGE_BREAK--
1. Аналітичний огляд
1.1 Аналоги, їх недоліки та передумови розробки
Великої популярності набули стільникові системи зв’язку. Основною з них є мережа GSM. Вона швидко розростається і популярна у багатьох країнах світу. Ця популярність зумовлена зручністю мобільних телефонів, (малі розміри абонентських терміналів, мала вага, висока якість переговорів) та бажанням у довільний момент часу мати можливість спілкуватися з колегами та знайомими. Але ціна розмови, між різними абонентами мережі або навіть різними мережами не є однаковою. Тому на ринку з’явилося багато додаткових пристроїв, які різними способами намагаються зменшити вартість розмови. Аналіз ринку таких пристроїв показав, що вони існують у великій кількості, але більшість з них володіє основним недоліком: зв’язок здійснюється в одному напрямку (GSM®MTM), тобто зателефонувати з мобільного телефону на міський телефон можна, а навпаки ні. А вартість пристроїв, що здійснюють двосторонній зв'язок надто велика і виправдовує витрачні на неї кошти лише через тривалий період експлуатації. Інший, не менш важливий недолік, полягає у тому, що для таких “мостів” не реалізовані у повному обсязі функції колективного використання ресурсів (ведення статистики дзвінків, виділення абоненту ресурсів, інші.)
Одним з представників є ЕССОМ bridge [1] – односторонній міст. Він містить порівняно обмежений набір функцій. До числа таких функцій входять комутація мобільного телефону GSM на міську телефонну мережу, пам’ять на 10 номерів та можливість використання моста кількома людьми. Як видно з опису додаткові функції колективного використання не реалізовані. Наприклад функції, які б враховували напрямок розмови, ведення обліку дзвінків, тарифікація для кожного абоненту комплексу, зняття інформації для аналізу вхідних та вихідних дзвінків, добавлення та знищення абонентів комплексу, захист комплексу від несанкціонованого підключення та інші можливості, які необхідно використовувати при експлуатації таких пристроїв в організаціях.
Тому доцільніше розробити власний апаратно–програмний комплекс МТМ↔GSM, який було б зручно експлуатувати в невеликих організаціях та який задовільняв би користувачів комплексу за своєю функціональністю.
1.2 Область призначення та застосування
Апаратно–програмний комплекс призначений для здійснення телефонних переговорів, між мобільними телефонами системи GSM (Global System Position) та телефонами мережі МТМ (міська телефонна мережа), а також здійснює обробку вхідних та вихідних дзвінків.
Дана розробка є актуальною для організацій, які ведуть переговори з мобільного телефону на міську телефонну мережу. Використовуючи міст МТМ↔GSM для дзвінків по місту, можна заощадити кошти організації.
Дана розробка є оригінальною в тому плані, що використовуючи прості, легкодоступні компоненти та мови програмування високого різвня вдалося створити потужну систему, що поєднує дві мережі зв'язку. Комплекс реалізує інтерфейс для його колективного використання в організаціях.
До переваг розробки можна віднести:
Велику кількість, у порівнянні з аналогами, абонентів комплексу (50 абонентів);
Зручний інтерфейс;
Можливість здійснення дзвінків у двох напрямках;
Можливість обробки дзвінків;
Ведення журналу вхідних та вихідних дзвінків;
Захист від несанкціонованого підключення;
Персональна тарифікація для кожного абонента комплекса.
До недоліків можна віднести:
Порівняно великі лінійні розміри, та вага комплексу;
Живлення комплексу від мережі електроживлення.
Комплекс можна застосовувати, як для особистих потреб, так і для невеликих організацій, яким потрібно підтримувати зв'язок з абонентами МТМ, та вести облік дзвінків. Застосування комплексу у великих організаціях є недоцільним, оскільки кількість абонентів у таких організаціях надто велика (>50), а неможливість паралельної обробки кількох абонентів зменшує його ефективність. Як альтернативу цьому недоліку, можна використати кілька таких комплексів в одній організації.
1.3 Вибір програмної та апаратної платформи
Із розрахунку економічності була вибрана ОС ДОС6.22 та мова програмування Assembler з компілятором Тasm 4.0 та мова Borland C++3.1
На мові Асемблер зручно писати програми, які напряму звертаються до обладнання. Мова С++ підтримує взаємодію з модулями написаними на Асемблері, тому вона підходить для даної задачі, а зручний інтерфейс та ручне управління вільними ресурсами робить її зручною для написання таких типів програм. Вибір програмної частини здійснювався таким чином, щоб максимально ефективно та швидко реалізувати алгоритм роботи комплексу.
Для аналізу інформації про дзвінки використовується програма написана на VBA у поєднанні з Microsoft Access 2000, та Microsoft OutLook 2000.
Апаратна платформа складаєтсья з комп’ютера IBM 486 DX4, мікроконтроллера приймача DTMF M8870 фірми Motorola, узгоджувач інтерфейсів мікросхема MAX232, яка узгоджує СОМ інтерфейс мобільного телефону, СОМ інтерфейс комп’ютера, та комутаційної плати. У якості підсилювачів сигналу використовуються транзистори серії КТ3102.
Усе апаратне забезпечення виготовлене сторонніми виробниками на замовлення.
1.4 Технічні характеристики
Основні технічні характеристики наведені в таблиці:
Назва параметру
Значення
Вхідний опір для телефонної лінії в режимі розмови
600 ±120Ом
Вхідний опір для телефонної лінії в режимі очікування
не менше 10кОм
Трансгібридне затухання не меньше
(відносно 600 Омної телефонної лінії)
12 Дб
Коефіцієнт гармонік
(при рівні сигналу –10Дб,
частоті сигналу 1000Гц,
тоці шлейфу 25мА)
5%
Максимальний рівень вихідного сигналу в лінії
2дБ
Напруга живлення
12В, постійна
Струм живлення
Вага
3 Кг
Розмір (висота, ширина, довжина)
40,30,50 (см)
2. Теоретичні відомості
2.1 Принципи стільникового зв'язку
Історія створення
У 1982 році Європейська Конфернція Адміністрацій Пошти та Електрозв’язку (СЕРТ) створила групу для розробки єдиного стандарту цифрового сотового зв’язку в діапазоні 900МГц. У результаті роботи цієї групи з’явився стандрат GSM (Global System for Mobile Соммunісаtіоns — глобальна система рухливого зв'язку). продолжение
--PAGE_BREAK--
До особливостей цього стандарту можна віднести менші, у порівнянні з аналоговими стандартами, розміри і вага телефонних апаратів; більший час роботи телефонів без підзарядки акумулятора, та інші. В основному ці переваги досягаються за рахунок обладнання базової станції, що постійно аналізує рівень сигналу, прийнятого від телефону абонента. У тому випадку, коли рівень вище необхідного, автоматично знижується випромінювана потужність;
Мережа GSM900. Основні характеристики:
Відносно висока ємність мережі;
Низький рівень промислових перешкод у даному частотному діапазоні;
Максимальний захист від підслуховування і нелегального використання номера (вище захист тільки в GSM-1800), що досягається за рахунок використання алгоритмів шифрування з відкритим ключем;
Зв'язок на відстані до 35 км від найближчої базової станції;
Найнижча серед стільникових стандартів потужність випромінювання абонентських терміналів.
У стандарті GSM-900 для максимального захисту від несанкціонованого підключення застосовується спеціальний модуль дійсності абонента — SIM-карта. Ця картка, із вбудованою мікросхемою, в якій зберігається спеціальна інформація про конкретного абонента, вона видається абоненту при підключенні телефону і може бути використана з будь-якою моделлю мобільного телефону стандарту GSM. Щоб викрадач не зміг нею скористатися, в ній записаний спеціальний ідентифікаційний номер (РІN-код), який потрібно набирати при кожному включенні телефону. Якщо три рази підряд неправильно набрати РІN-код, SIM-карта тимчасово заблокується. Використання SIM-карти також зручне тим, що при зміні абонентом телефону не потрібно змінювати свій мобільний номер, абонент просто переставляє карту, і всі збережені на ній дані (включаючи записну книжку) стають доступними у новому мобільному телфоні.
На сьогодні у Чернівцях є два оператори мережі GSM900: це УМЗ (Український Мобільний Зв'язок) та Київстар Дж. Ес. Ем.
Унікальною можливістю GSM, яка не підтримується аналоговими системами зв’язку, є двонаправлена передача коротких повідомлень SMS(Short Message Service), (до 160 байт), переданих у режимі з проміжним збереженням даних. Адресату, що є абонентом GSM або користувачем Internet, можна послати повідомлення, після чого відправнику надсилається підтвердження про одержання цього повідомлення. Короткі повідомлення можна використовувати в режимі широкомовлення, наприклад для того, щоб сповістити абонентів про зміну умов дорожнього руху в регіоні, погодні умови, курси іноземних валют, тощо.
Поточні специфікації, визначені ETSI (European Telecomunication Standarts Insitute) [1], у вигляді додаткових можливостей описують послуги по перенесенню інформації і наданню послуг зв'язку (наприклад, перенаправлення виклику у випадку недосяжності або зайнятого мобільного телефону абонента GSM, автовідповідач, та ін.).
Незабаром очікується поява нових можливостей, таких як ідентифікація виклику, розміщення виклику в черзі, переговори одразу кількох абонентів та ін. Такий стандарт розробляється на основі GSM і стане третім стрибком у розвитку стільникового зв’язку. Його назва UMTS (Universal Mobile Tyelecommunication System)
Відповідно до визначень ETSI, мережа GSM може надавати наступні типи послуг:
Послуги по перенесенні інформації (bearer services);
Висока якість передачі мовної інформації;
Низька вартість обладнання і послуг, що надаватимуться;
Можливість підтримки портативного обладнання користувача;
Підтримка міжнародного роумінгу;
Забезпечення конфіденційності переговорів;
Сумісність з ISDN.
Стандарт GSM-1800 (DCS-1800) та його особливості.
GSM-1800 (DCS-1800) — Global System for Mobile Соммunісаtіоns — глобальна система рухливого зв'язку. Це цифровий стандарт із діапазоном частот 1710-1880 МГц є модифікацією стандарту GSM-900. До особливостей цього стандарту можна віднести наступні характеристики:
Максимальна випромінювальна потужність мобільних телефонів стандарту GSM-1800 – 1Вт (для порівняння в GSM-900 – 2Вт). Тобто найнижча випромінювальна потужність з усіх відомих стільникових систем зв’язку;
Високий захист від підслуховування і нелегального використання номера;
Висока ємність мережі, що важливо для великих міст;
Максимальне віддалення абонента від базової станції — 5-6 кілометрів.
Система кодування сигналу PCM і використання SIM-карт аналогічна стандарту GSM-900. На сьогодні у Чернівцях мережа GSM-1800 реалізована оператором “Український Мобільний Зв'язок”
Збілшення попускної здатності та перспективи розвитку
Оскільки радіоспектр має обмежені ресурси, необхідно оптимально розподілити ширину смуги між усіма можливими користувачами. Метод, застосований з цією метою в GSM, — це комбінація методів множинного доступу TDMA і FDMA (Time and Frequency Division Multiple Access). Спочатку смуга частот у 25 Мгц поділяється на смуги в 200 Кгц. Кожній станції відповідає своя смуга (чи кілька смуг). Абоненти кожної окремої смуги розділені в часі. Кожному абоненту відповідає один кадр. Вісім кадрів поєднуються у фрейм. 26 фреймів, у свою чергу, утворять мультифрейм, які повторюються циклічно. Довжина мультифрейма — 120 мілісекунд. На один кадр приходиться 1/208 мультифрейма, тобто близько 0.6 мілісекунди. Канали визначаються числом і позицією відповідних їм циклічних кадрів, і вся палітра повторюється приблизно кожні 3 години. Вони поділяються на запропоновані канали (dedicated channels), або канали трафіку і загальні канали (common channels), або канали керування, які використовуються рухливими станціями в пасивному режимі.
GSM — система цифрова, тому вимагає оцифровування аналогових сигналів. Метод, що використовується існуючими телефонними системами і мережею ISDN для мультеплексування аналогових ліній на високошвидкісних каналах і оптичних лініях, називається імпульсно-кодовою модуляцією PCM (Pulse Coded Modulation). Швидкість вихідного потоку в PCM 64 Кбіт/с занадто висока для передачі по радіоканалам системи GSM. Дослідницька група GSM вивчила кілька алгоритмів кодування, поки не зупинила свій вибір на схемі кодування RPE-LTP (Regular Pulse Excitation-Long Term Prediction). Схема здійснює переклад мовного потоку, що надходить зі швидкістю 64 Кбіт/c, у потік зі швидкістю 13 Кбіт/с, і назад, зі збереженням якості переданого сигналу.
Номер абонента GSM прикріплений до географічного положення базової станції і зовсім не залежить від того в якій точці знаходиться абонент мережі.
Стандарт GSM сумісний у першу чергу з ISDN (Integrated Services Digital Network) та IN (Intelligent Network). Основні функціональні елементи GSM входять у розроблювальний зараз міжнародний стандарт глобальної системи рухливого зв'язку UMTS (Universal Mobile Telecommunications System), яка у майбутньому замінить GSM. У системі UMTS будуть використовуватися усі види множинного доступу. Тобто вона буде побудована таким чином, що використовуватиме TDMA, FDMA, CDMA. Основний напрямок цього стандарту буде зроблений на інтеграцію з іншими мережами, зокрема планують збільшити швидкість передачі даних по модемах з 9600 до 115200, проте більшість параметрів та специфікацій вона успадкує від GSM.
2.2 Система команд керування мобільним телефоном
Стандарт GSM 07.07, GSM 05.07 були прийнятий ETSI (European Telecommunication Standards Institute) 15.03.2000 року [4]
Вони складаються з АТ команд, які використовуються при керуванні модемом, та розширеного набору АТ команд, яким користуються для виконання специалізованих функцій мобільного телефону.
В роботі приведемо лише ті АТ команди, які необхідні для коректної роботи комплексу:
Позначення команди
Результат виконання команди
ATD#######;
Набрати номер #######
ATA
Підняти трубку
ATZ
Завантажити заводську конфігурацію трубки
При використанні розширених АТ команд більшість команд має три режими виконання:
“команда”=? – видає список параметрів, якщо мобільний телефон підтримує дану команду. У протилежному випадку видає повідомлення про невірно введену команду; продолжение
--PAGE_BREAK--
“команда”=[,,] – задає значення для параметрів які передбачені даною командою. Для деяких команд неможливе виконання команди у цьому режимі;
“команда”? – виводить в СОМ порт значення параметрів команди
При реалізації комплексу були задіяні натсупні розширені команди:
Позначення команди
Результат виконання команди
AT+CLIP = 1
пересилає номер телефону на СОМ порт
AT+CHUP
Завершення телефонної розмови
AT+CPAS?
Статус телефонної розмови:
0 – розмова завершилася
3 – встановлення зв’язку
4 – розмова ведеться
AT+CCLK?
Прочитати поточний час у форматі: YY.MM.DD,HH:MM:SS
Після обробки команди мобільний телефон обов’язково повертає код виконання команди:
Код помилки
Позначення помилки
Пояснення
OK
Команда виконалася успішно
2
RING
З мережі GSM надійшов дзвінок
3
NO CARRIER
Немає несучої
4
ERROR
Невизначена помилка. Для детального визначення помилки необхідно задати команду АТ+СМЕЕ= [4]
6
NO DIALTONE
Станція у відповідь на дзвінок не видає сигнал
7
BUSY
Віддалена станція перевантажена і не може обробити запит
2.3 Специфіка програмування апаратних переривань на прикладі переривання від СОМ порта
Ініціалізація COM-порта
СОМ портом управляє мікросхема UART. Тому спочатку проведемо ініціалізацію UART. Cкидуємо регістри стану лінії, стану модему і даних. Це досягається простим зчитуванням значень цих регістрів:
; скидаємо регістр стану лінії
mov dx,LSR; LSR — адреса регістра стану лінії
in al,dx
jmp $+2; затримка
; скидаємо регістр стану модему
mov dx,MSR; де MSR — адреса регістра стану модему
in al,dx
jmp $+2; затримка
; скидаємо регістр даних
mov dx,DAT; де DAT — адреса регістра даних
in al,dx
jmp $+2; затримка
Ці регістри необхідно скинути для того, щоб надалі не заважали старі значення, які могли залишитися від роботи інших програм.
Після того як ми скинули регістри UART, можна приступити власне до ініціалізації COM-порту. Під час ініціалізації задається формат даних — довжина слова, кількість стопових бітів, наявність контролю по парності і швидкість обміну.
Для задання швидкості обміну даними треба перевести регістр даних і регістр керування перериваннями в режим уведення значення дільника частоти тактового генератора. Цей режим встановлюється записом одиниці в старший біт регістра керування лінією (LCR):
// переводимо регістр даних і регістр
// керування перериваннями у режим уведення
// значення дільника частоти тактового генератора
ctl = inp(LCR); // LCR — адреса регістра керування
// установлюємо старший біт регістра
outp(LCR_N, ctl | 0x80);
// обчислюємо значення для дільника частоти
//(змінна baud визначає швидкість обміну,
// яку ми хочемо установити)
switch(baud) {
case 110: div = 1040; break;
case 150: div = 768; break;
case 300: div = 384; break;
case 600: div = 192; break;
case 1200: div = 96; break;
case 2400: div = 48; break;
case 4800: div = 24; break;
case 9600: div = 12; break; продолжение
--PAGE_BREAK--
case 19200: div = 6; break;
case 38400: div = 3; break;
case 57600: div = 2; break;
case 115200: div =1; break;
default: return(-1); break;
}
// записуємо значення дільника частоти,
// молодший байт у регістр даних, старший –
// у регістр керування перериваннями
// ICR — адреса регістра керування перериваннями
outp(ICR, (div >> 8) & 0x00ff);
// DAT — адреса регістра даних
outp(DAT, div & 0x00ff);
// переводимо регістр даних і регістр
// керування перериваннями назад у звичайний
// для них режим
ctl = inp(LCR); // LCR — адреса регістра керування
//скидаємо старший біт регістра
outp(LCR, ctl & 0x7f);
Потім треба визначити формат даних. Для цього запишемо нове керуюче слово в регістр LCR:
// записуємо нове керуюче слово
outp(LCR, 00000011B);
// керуюче слово 00000011B встановлює довжину
// слова 8 біт, один стоповий біт, скасовує перевірку
// на парність і скасовує режим фіксації парності
Останнім кроком в ініціалізації регістрів UART є ініціалізація регістра керування перериваннями. Ми повинні спеціально вказати послідовному адаптеру, коли він повинен генерувати переривання.
Створення процедури обробки переривання для СОМ порта
Послідовний асинхронний адаптер можна запрограмувати таким чином, що кожний раз, коли він прийме чи передасть черговий байт, буде згенероване відповідне переривання. Переривання можуть генеруватися асинхронним адаптером у таких випадках:
змінився стан лінії приймача: відбулося переповнення приймача, відбулася помилка парності чи синхронізації, лінія перейшла в стан BREAK (розрив);
дані прийняті і доступні для читання через регістр даних;
регістр передавача порожній;
змінився стан модему: змінився стан ліній CTS, RI, DCD, DSR.
Існує можливість окремо забороняти чи дозволяти певний тип переривання. Для цього необхідно встановити відповідні біти в регістрі керування перериваннями.
Кожному COM-порту відповідає, крім базової адреси його регістрів, лінія IRQ [3]. Стандартний розподіл апаратних переривань такий:
COM-порт
IRQ
Номер переривання
COM1
IRQ4
INT 0Ch
COM2
IRQ3
INT 0Bh
COM3
IRQ4
INT 0Ch
COM4
IRQ3
INT 0Bh
Для встановлення власного оброблювача переривання від СОМ порту необхідно замінити процедуру обробки переривання, яка встановлена операційною системою або БІОСом на власну процедуру обробки переривання. Після цього дозволити переривання, яке було встановлено.
При реалізації процедури обробки переривання необхідно керуватися таким алгоритмом:
1. Визначити причину переривання
Для цього потрібно проаналізувати стан бітів D1 D2, які визначають причину переривання:
Біти D2 D1
Причина переривання
00
переривання по лінії стану;
01
буфер передавача порожній;
10
дані прийняті;
11
змінився стан модему.
У залежності від того, яке відбулося переривання, його треба відповідним чином обробити.
Алгоритм роботи для кожного типу переривання від СОМ порта:
Відбулося переривання по лінії стану
Прочитати регістр стану лінії і конкретизувати причину переривання (дане переривання скидається після читання регістра стану лінії). Якщо це необхідно, подати основній програмі сигнал про помилку, що відбулася, з метою її усунення. Наприклад, у випадку розриву лінії (BREAK) (віддалений модем повісив трубку), можна було б спробувати відновити зв'язок.
Переривання по прийому даних
Черговий символ прийнятий, і його можна прочитати через регістр даних. Переривання скидається після читання регістра даних. Прийнятий байт необхідно записати в прийомний буфер програми, з якого згодом його прочитає основна програма. Буфер приймача зручно організувати у виді черги. продолжение
--PAGE_BREAK--
Буфер передавача порожній
Переривання відбувається у випадку, якщо буфер передавача порожній і можна передати COM-порту черговий символ. Можна організувати буфер передавача програми, у який програма буде записувати дані, призначені для відправки через COM-порт. У цьому випадку, коли прийде переривання, треба прочитати черговий символ з програмного буфера і записати його в регістр даних. Переривання скидається після запису чергового символу в регістр даних UART. Якщо немає даних для передачі (програмний буфер передавача порожній), можна заборонити це переривання через регістр керування перериваннями.
Змінився стан модему
Переривання відбувається при зміні стану вхідних ліній CTS, RI, DCD, DSR. Стан цих ліній можна визначити, прочитавши регістр стану модему MSR. Це переривання використовується для виявлення сигналу RING на телефонній лінії. Переривання автоматично скидається після читання регістра стану модему.
За час який переривання оброблялося може наступити нове переривання по ліній IRQ, тому необхідно проаналізувати біт D0. У випадку коли переривання знову згенероване (біт D0 регістра ідентифікації переривань дорівнює одиниці). Тоді перед завершенням обробки переривання необхідно обробити наступне переривання відповідно до стану бітів D1, D2. Так варто робити до тих пір, поки не будуть оброблені всі переривання (біт D0 не буде рівний нулю).
Виконавши всі вищевказані застереження та вимоги для виходу з процедури обробки переривання необхідно передати контролеру переривань команду обробки кінця переривання. Для цього посилається в порт з адресою 20h команда кінця переривання і здійснюється вихід з процедури обробки переривання:
mov al,20h
out 20h,al
iret
Установка оброблювача переривань
Необхідно установити оброблювач переривань, змінивши відповідний елемент таблиці векторів переривань. Адреса старого оброблювача зберігається в глобальних змінних.
Останнім кроком в ініціалізації регістрів UART є установка регістра керування перериваннями, у який записується занчення причин при настанні яких генеруються переривання. Наприклад, щоб дозволити генерацію переривань при надходженні чергового символу, треба записати значення для бітів D1,D2 відповідно 0 та 1 у регістрі керування перериваннями:
// установлюємо регістр керування перериваннями
//ICR — адреса регістра керування перериваннями
outp(port_adr+ICR, 1);
На цьому етап ініціалізації регістрів UART можна вважати закінченим. Тепер COM-порт готовий до обміну через нього даними з мобільним телефоном.
Ініціалізація мобільного телефону
Ініціалізація мобільного телефону здійснюється через передачу мобільному телефону АТ команд, які реалізовані в стандарті 07.07, 05.07 міжнародної організації ETSI 15.03.2000 року.
Для ініціалізації мобільного телефону завантажимо стандартну (заводську) конфігурацію параметрів стільникового термінального обладнання.
Для цього передамо мобільному телефону команду ATZ. Якщо ініціалізація пройшла успішно мобільний телефно поверне “ОК”. Після цього задамо режим передачі номеру телефону на СОМ порт: АТ+CLIP = 1
Список основних команд приведений у пункці 2.2 цього розділу [4].
Після ініціалізації мобільного телефону, комплекс переходить у режим очікування дзвінків. Якщо у процесі роботи мобільний телефон повернув на СОМ порт команду , то команда розпізнана, виконана без помилок.
Завершення програми
Для завершення комунікаційної програми, що використовує переривання, необхідно скинути сигнали DTR і RTS і заборонити через контролер переривань переривання від COM-порту:
// зчитуємо стан регістра маски переривань
mov dx,21h
in dx,al
// забороняємо переривання від порту COM1
or al,00010000b
// записуємо нове значення в регістр
// маски переривань
out dx,al
Потім потрібно відновити старий вектор оброблювача переривань і вийти з програми. Якщо програму завершити некоректно, то при наступних завантаженнях драйвер СОМ порту буде працювати некоректно.
2.4 Аналіз елементної бази, інтерфейси комплексу
При виборі елементної бази враховувалась ціна деталей. Вибір зроблено на мобільному телефоні Motorola який підтримує інтерфейс через СОМ порт на швидкості 9600кбіт/с, Система команд управління мобільним телефоном схожа з системою HYPES і визначена міжнародною організацією ETSI.
Для управління мобільним телефоном використовується інтерфейс RS232C через СОМ порт комп'ютера. Швидкість 9600 є відносно малою швидкістю обміну даними, тому ЕОМ використовується малопотужна IBM PC 486DX4. Вона має менші габарити і вартість. Але за рахунок цього збільшились вимоги до часових характеристик програмного забезпечення оскільки без втрат необхідно передати та прийняти дані з мобільного телефону. Для того, щоб була можливість впевниного прийому–передачі даних необхідно використовувати буферизований ввід–вивід. Такий (буферизований) ввід–вивід досягаєтсья за допомогою використання апаратних переривань. При реалізації апаратного буфера для мікроконтроллера UART16xxx без помилок реалізована лише мікросхема UART1685A, яка не використовується в комп'ютерах IBM PC486DX2, тому для виконання поставленого завдання потрібно реалізувати програмний буфер даних. Його можна реалізувати написавши додатковий драйвер СОМ порту. Тобто написати спеціальну програму, яка обслуговуватиме апаратне переривання.
Використавши мікроконтроллер DTMF cерії M8870 фірми Motorola, та DTMF набір з телефонного апарату комплекс реалізує інтерфейс між користувачем. У якості узгоджуючого пристрою використовується мікросхема MAX232. У якості підсилювачів телефонного сигналу використовуються підсилювачі на базі транзисторів серії КТ1023.
Для розділення вхідних та вихідних сигналів, та узгодження НЧ сигналу з телефонною лінією використовується узгоджуючий трансформатор.
Опис інтерфейсів комплексу
Живлення
Комутуюча плата комплексу вмонтована вередину системного блоку комп’ютера IBM486DX4, тому її живлення здійснюється безпосередньо від системного блоку живлення. Системний бок живлення живиться від міської електромережі з напругою 220В, 50Гц. Потужність системного блоку з комутуючою платою
Роз‘єм RJ11
Для підключення тональної телефонної лінії або міні АТС у комплекс вмонтований роз’єм RJ11. Структурна схема цього роз’єму приведена на рис 1.
рис. 1 Підключення телефонної лінії до роз’єму RJ11
Підключення мобільного телефону до СОМ порту
/>
рис. 2. Стандартний роз’єм мобільного телефону
В мобільний телефон вмонтований роз’єм приведений на рис. 2. Позначення виводів цього роз’єму приведене в таблиці 1.
Таблиця 1. Позначення та назви сигналів для мобілього телефону
№
Назва
Функція
Вхід/вихід продолжение
--PAGE_BREAK--
1
DC in
DC для заряда батереї
Вхід/вихід
2
Data in
Прийом даних
Вхід
3
DG
Цифрова земля
4
Data out
Відправка даних
Вихід
5
Vcc
+5V вихід
Вихід
6
Test
Ключ для виключення телефону підключивши +5V.
Тест
7
Mute
0 — номрмальний, 1- музика при визові
8
Ext/Int
Протативний / віддалений вхід
9
GND
Аналогова земля
10
Accsessory
Зв’язаний з мікрофоном / динаміком
11
BF in
BF вхід
Вхід
12
BF out
BF вихід
Вихід
Для СОМ та LPT портів приведені лише схематичні позначення, оскільки вони входять до стандартного комплекту системного блоку IBM486DX4
Таблиця 2. Позначення виводів для СОМ порта:
№
Назва
Функція
Вхід/вихід
1
DCD
Детектор прийнятого з лінії сигналу(Data Carrier Detect, DCD)
Вхід
2
RD
Прийняті дані(Received Data, RD)
Вхід
3
TD
Передані дані(Transmitted Data, TD)
Вихід
4
DTR
Готовність вихідних даних(Data Terminal Ready, DTR)
Вихід
5
SG
Сигнальне заземлення(Signal Ground, SG)
-
6
DSR
Готовність даних(Data Set Ready, DSR)
Вхід
7
RTS
Запит для передачі(Request to send, RTS)
Вихід
8
CTS
Скидання для передачі(Clear to Send, CTS)
Вхід
9
RI
Індикатор виклику(Ring Indicator, RI)
Вхід
Таблиця 3. Позначення виводів для LPT порта: продолжение
--PAGE_BREAK--
№
Назва
Функція
Вхід/вихід
9
D7
D7=1 підняти трубку в МТМ, D7=0 – опустити трубку в МТМ
Вихід
10
ACK
Четвертий розряд цифри ДТМФ декодера
Вхід
11
BUSY
Строб ДТМФ декодера
Вхід
12
PE
Третій розряд цифри ДТМФ декодера
Вхід
13
SCLPT
Другий розряд цифри ДТМФ декодера
Вхід
15
ERROR
Перший розряд цифри ДТМФ декодера
Вхід
20
GND
Сигнальна земля
-
Інтерфейс з комутуючою платою є внутрішній, але для розуміння алгоритму роботи комплексу приведемо позначення виводів на комутуючій платі
Таблиця 4. Комутуючий пристрій
№
Назва
Функція
Вхід/вихід
1
BF out
Аналоговий вихід
Вихід
2
BF in
Аналоговий вхід
Вхід
3
K1
Сигнал підняти
Вхід
4
RI out
Сигнал дзвінок з МТМ
Вихід
5
DTMF STROBE
Строб ДТМФ декодера
Вихід
6
DTMF D1
Перший розряд цифри ДТМФ декодера
Вихід
7
DTMF D2
Другий розряд цифри ДТМФ декодера
Вихід
8
DTMF D3
Третій розряд цифри ДТМФ декодера
Вихід
9
DTMF D4
Четвертий розряд цифри ДТМФ декодера
Вихід
10
ком. МТМ
D7=1 підняти трубку в МТМ, D7=0 – покласти трубку в МТМ
Вихід
2.5 Алгоритм роботи комплексу
Алгоритм роботи комплексу приведений в альбомі схем. На функціональній блок-схемі зображені:
А1 – блок генерування сигналу дзвінок, A2 – блок підняття та опускання трубки, A3–блок введення виведення та підсилення аналогових сигналів, A4– конвертор TTL / RS232C, A5– DTMF контролер, A6 –живлення комплексу, A7 – зарядний та комутуючий пристрій, 1– кабель з’єднувальний мобільного телефону з комутуючою платою, 2 – кабель з’єднувальний комутуючої плати з СОМ портом, 3–кабель RJ11 з’єднує телефонну лінію з комутуючою платою, 4– кабель з’єднання комутуючої плати з LPT портом.
Розглянемо два випадки:
Пристрій очікує дзвінка з міста;
У разі надходження дзвінка з міста, спрацьовує блок A2, після чого в ТЛ (телефонна лінія) подається звуковий сигнал. Почувши звуковий сигнал (два коротких гудка) користувач повинен набрати код. Набір проводитися у тональному режимі з абонентського телефону. При натисканні користувачем клавіші, спрацьовує DTMF контролер (А5), який на LPT порт виводи подає розкодований двійковий код набраної клавіші. Програма оборобки зчитує з LPT порту кілька таких сигналів, запам’ятовує їх. Після того як ідентифікаційний код користувача комплексу набраний програма переглядає таблицю всіх кодів абонентів комплексу і знаходить запис з даним кодом. У тому випадку, коли користувач не набрав код, або набрав його неправильно подається звуковий сигнал (три гудка), що сповіщає про те, що система відмовила користувачу в доступі. Після цього спрацьовує блок В, який кладе трубку і система переходить у початковий стан. Якщо користувач набрав правильний код, програма посилає в порт СОМ команду АТD###########; де ########### — номер телефону, що відповідає набраному користувачем коду. Мобільний телефон одержавши таку команду з СОМ порта негайно починає її виконувати. Тобто набирає номер телефону. Попередні установки мобільного телефону настроєні таким чином, що після того, як номер телефону набраний низкочастотні сигнали подаються з мобільного телефону у телефонну лінію мережі МТМ, тобто відбувається комутація. Програма обробки телефонних дзвінків перевіряє чи віддалений абонент відповів на телефонний дзвінок. У тому випадку коли абонент відповів на телефонний дзвінок Якщо так, то відбуваєтсья телефонна розмова двох абонентів. Після закінчення розмови мобільний телефон передає комплексу час початку та кінця розмови, і за допомогою комутуючого блока В комплекс кладе трубку МТМ. У мережі GSM мобільний телефон кладе слухавку автоматично. продолжение
--PAGE_BREAK--
Випадок коли абонент GSM телефонує в місто.
Мобільний телефон через інтерфейс RS232C та конвертор А4 надсилає програмі номер телефону користувача. Програма аназалізує таблицю відповідності номерів телефонів. У тому випадку коли номер телефону прописаний у таблиці комутатор А2 піднімає трубку на лінії МТМ і користувачеві подається звуковий сигнал (два коротких гудки). Після цього користувач повинен набрати у форматі DTMF номер телефону, куди він хоче зателефонувати. Після того як мобільний телефон повідомить через СОМ порт, що розмова завершилася комутатор A2 покладе трубку в мережі МТМ. Час розмови також фіксується і відображений у log.txt файлі, куди записуються всі вхідні та вихідні дзвінки у форматі:
початок розмови.
тривалість (сек)
вартість (коп)
номер телф. GSM
Напрямок дзвінка
DTMF набір
Також ведеться облік використаних користувачем комплексу грошей. У тому випадку коли авансова сума внесена користувачем вичерпана, комплекс автоматично відмовляється обслуговувати такого користувача.
3. Практична частина
3.1 Підключення компонентів та настроювання апаратної частини
Відладка апаратної частини пристрою полягає у встановлені відповідності рівнів сигналів між мобільним телефоном та СОМ портом.
Вона проводиться при виготовленні комплексу один раз. Для цього використовується мікросхема MAX232 яка перетворює рівнень 5В у 12В і навпаки окремо для ліній Rx та Tх. Ця мікросхема являє собою генератор тактової частоти, помножувач напруги, та перетворювач змінної напруги в постійну. Вона підключається за стандартною схемою включення. Також необхідно встановити робочі режими на підсилюючих транзисторах, та використати стандартне включення DTMF мікроконтроллера.
Для того, щоб підключити роз'єм динаміка до телефонної лінії необхідно підключити його через резистор 100 Ом до напруги 5В а від резистора через конденсатор до телефонної лінії. Схема зображена на рис. 1. Таке підключення зумовлене специфікою побудови PC Speakerа на материнській платі. Його вихід зроблено за схемою з відкритим колектором.
Перевірити правильність підключення мобільного телефону до СОМ порта можна за допомогою програми HiperTerminal.
3.2 Розробка драйвера послідовного інтерфейсу
Драйвер повинен забезпечувати буферизований ввід-вивід з СОМ порта в програму. А після закінчення роботи програми відновлювати старий контролер переривань.
Інтерфейс драйвера з програмою складається з наступних функцій:
Іnstаllсом(comNo) – У залежності від номеру СОМ порту встановлює процедуру обробки апаратного переривання
OpenCOM(speed:byte) – готує СОМ порт для роботи для порту визначеного в процедурі InstallCOM визначає швидкість обміну даними, кількість стопових бітів, контроль передачі. Функція реалізує апаратний протокол встановлення зв'язку
Sread() – функція читає з програмного буфера символ, що надійшов, та видаляє його з буфера і передає програмі, що визвала цю функцію.
Swrite(b:byte) – процедура записує символ у програмний буфер для передачі його через СОМ порт, символ буде передано коли наступить переривання “буфер передавача порожній”.
CloseCOM() – закінчує роботу з СОМ портом на встановленій швидкості. Функція реалізує апаратний протокол закінчення роботи DTE та DCE обладнання.
RestoreCOM() – процедура проводити заміну процедури обробки апаратних переривань. Відновлює попередні настроювання, що були до початку роботи програми.
IsRing():byte – перевіряє чи був виклик з МТМ і якщо був виклик з МТМ те функція повертає число > 0 в іншому випадку функція повертає код 0.
Буфер для передачі має розмір 512 байт. Буфер для прийому даних має розмір 1024байти. Буферів з такими розмірами достатньо для забезпечення надійної передачі даних між мобільним телефоном та СОМ портом.
Тексти функцій приведені в додатку 4
3.3 Розробка програми bridge для комплексу МТМ↔GSM
Програма взаємодіє з драйвером і реалізує роботу комплексу. Текст програми приведений в додатках. Програма складається з наступних процедур та функцій:
Void main(void) – основна процедура з якої починається виконання програми. У цій процедурі спочатку викликається завантаження поточної конфігурації процедура getConfig() після чого проводитися ініціалізація мобільного телефону. Після ініціалізації програма переходить у режим очікування. У разі виклику з телефонних мереж програма викликає функції Void PhoneMobiline(), Void PhoneCity().
Int getUserID(int char) – ця функція визначає чи є код, який увів користувач МТМ або телефон, номер якого надійшов з GSM, у таблиці відповідності користувачів комплексу. Процедура також перевіряє значення авансової суми внесеної абонентом комплексу.
Void PhoneMobiline() – у цій процедурі реалізований алгоритм роботи комплексу у випадку коли дзвінок надійшов з GSM.
Void PhoneCity() – у цій процедурі реалізований алгоритм роботи пристрою у випадку коли дзвінок надійшов з МТМ.
Void StartToking() – продерура очікує коли встановиться зв‘язок з віддаленим абонентом, і інспектує час розмови. Після цього викликає функції SaveLog() та SaveMoney() для збереження інформації про розмову та авансовий внесок абонента.
Void SaveLog() – ця процедура відкриває файл Log.txt та записує туди стрічку результату розмови в форматі:
початок розмови.
тривалість (сек)
вартість (коп)
номер телф. GSM
Напрямок дзвінка
DTMF набір
Void SaveMoney() – Процедура записує нове значення кредиту абонента комплексу у файлі Users.txt.
Формат файлу:
код
№ тел. GSM
Вартість вхідного дзвінка з МТМ
(за 1 хв)
Вартість вихідного дзвінки з GSM (за 1 хв)
Кредит наданий користувачеві комплексу в копійках
(макс. 99999 коп)
Напрямок дзвінка
Void getConfig() – Процедура занходить файл setup.cfg і завантажує з нього параметри програми. До параметрів входять:
Void SendStr() – ця процедура надсилає до мобільного телефону стрічку сиволів, по черзі викликаючи функцію swrite(char ch).
Крім основних функцій у програмі реалізований інтерфейс з користувачем через телефонну лінію. Для того, щоб використати допоміжні функції, які реалізовані у комплексі необхідно увести пароль, який записаний у файлі конфігурації setup.cfg. Для використання тієї чи іншої сервісної функції необхідно зателефонувати на комплекс з МТМ і після двох гудків увести значчення пароля. (пароль складається з цифр від 0..9), у випадку коли пароль був введений вірно, комплекс відповість двома короткими гудками і буде очікувати вводу сервісної функції. При одержанні значення (коду) сервісної функції комплекс одразу виконає її. продолжение
--PAGE_BREAK--
3.4 Програма обробки інформації про дзвінки
При експлуатації комплексу групою людей, виникає потреба у аналізі різного роду інформації з подальшим представленням рахунку клієнтам для оплати. Для аналізу табличних даних зручно використати Microsoft Access 2000, який є сам по собі універсальним редактором баз даних і найкаще підходить для проектування невеликих баз даних.
Обробка результатів комплексу здійснюється за наступним алгоритмом:
Вставити чисту дисекту типу FDD 3,5’’ у дисковод на комплексі;
Зателефонувати на комплекс;
Після запрошення (два коротких гудки) ввести пароль;
Після підтвердження (два коротких гудки) увести код сервісної функції. Якщо все зроблено правильно, то комплекс запише дані про користувачів та дзвінки на дискету FDD 3,5’’
На коп’ютері де всановлений Microsoft Accsess 2000 необхідно запустити програму GSM_MTM.mdb обробки телефонних дзвінків.
При завантаженні програми з’явиться стартова форма.
/>
Програма складається з наступних підпрограм:
Підпрограма друку та перегляду звітів
Підпрограма аналізу інформації
Підпрограма сервісних функцій
Також у стартовій формі необхідно ввеси звітний період, тобто початкову та кінцеву дату звітного періоду.
Підпрограма сервісних функцій визивається при натисканні клавіші “Сервіс”. На екрані виводиться форма з сервісними функціями:
/>
До сервісних функцій входять:
Імпорт даних у програму обробки дзвінків;
При виборі цієї команди виконується імпорт даних з дискети FDD3,5’’ у програму обробки. При цьому вважається, що після імпорту, дані на дискеті знищуються.
Експорт файлу користувачів
Програма обробки дзінків експортує таблицю з користувачами у зрозумілому для комплексу форматі у файлі users.txt.
Експорт файлу протоколу.
Ця функція реалізує перенесення даних з БД Access 2000 у текстовий файл. Вона реалізована для сусісності з майбутніми версіями та архівування даних. Програма експортує дані про дзвінки у текстовий файл log.txt
Також у цій формі запам‘ятовується виконання сервісних функцій.
Функція Аналіз
Після імпортування даних необхідно вибрати у основній формі підопцію “Аналіз”. Завантажиться форма з наступними сервісними функціями:
1. Показати користувачів у яких завдаток менше за 3 грн.
На екрані відобразиться відповідний запит
2. Показати файл протоколу за звітній період (звітній період вводиться в основній формі)
Інколи необхідно переглянути статистику або переконатися у правильній роботі комплексу. Тому зазвичай ця функція програми не використовується, але на прохання замовника не була видалена з робочої версії, оскільки комплекс працює у режимі тестування.
/>
На формі зображена статистика використання комплексу його абонентами. Червоним кольором відображено час розмови (сек), синім кольором показано (кількість грошей (коп)), що використані при розмовах через комплекс за звітній період.
Функція звітів
/>
Третя форма реалізує систему звітів, які необхідні при представлені рахунку за розмови користувачам комплексу.
Звіт по поточному користувачу. У цьому звіті представлена інформація з звітній період, (звітній період вводиться у основній формі), та про конкретного користувача, який був у той момент активним. Звіт має наступний вигляд:
/>
Загальний звіт по імпортованій базі даних призначений для власника комплексу і надає оперативну інформацію по всій базі даних за звітній період. Звіт має наступний вигляд:
/>
Програма написана на мові Visual Basic, що поставляється разом з Microsoft Access 2000 і є зручною мовою для написання скриптів, та застосування СОМ технології для інтеграції з іншими офісними програмами [6].
Також у програмі реалізована відправка SMS повідомлень через інтернет. Ця операція реалізується за допомогою UMC шлюзу з адресою sms.umc.com.ua. Для відправлення SMS повідомлення абоненту GSM необхідно на адресу +3@umc.com.ua відправити листа. Оператор, який здійснює обробку даних може в автоматичному режимі надіслати користувачам повідомлення про те, що авансовий внесок вичерпано.
3.5 Тестування комплексу
Настройка параментрів комплексу знаходяться у файлі config.sys
Initialize AT+CLIP=1 // Ініціалізація мобільного телефону
Dropline AT+CHUP // покласти трубку на мобільному телефоні
DialPrefix ATD // команда набору номеру перфікс
DialSuffix; // команда набору номену суфікс
DeviceCOM COM1 // номер COM порту. Базова адреса береться з БІОСа
CharDelay 0 // затримка між переданими символами
Speed 9600 // швидкість передачі СОМ
StopBits 1 // кількість стопових біт
LPT_ADDRESS 888 //базова адреса LPT потру
tarifConnect 16 // тарифікація при з’єднанні
MaxTime 300 // максимальний час розмови
NumDigits 3 // кількість цифр при наборі коду
Після настройки параметрів у файлі config.sys необіхдно запустити файл bridge.exe який переведе систему у робочий режим. На цьому етапі система готова до зідйснення комутацій GSM«МТМ.
Як результат роботи комплексу приведемо уривок з файлу log.dat
Дата
Тривалість розмови
Сума витрачених грошей коп.
Номер абонента моста
Напрям розмови
03/03/12,18:41:07
3
27
380674080486
з GSM
03/03/12,18:41:07 продолжение
--PAGE_BREAK----PAGE_BREAK--
GSM->MTM
2,88
0,27
Економ
MTM->GSM
1,44
1,22
Сума заощаджена на дзвінках через комплекс виражається наступною формулою:
/>(1)
де /> — заощаджена сума (грн)
/>— середній час розмови за день
/>— кількість користувачів комплексу
/>-кількість днів
/>— різниця між дзвінком без комплексу та з використанням комплексу (табличні дані)
Статистика, яка накопичена у результаті використання комплексу показує, що кожний користувач комплексу телефонує додому принаймі один раз на день, кількість користувачів комплексу />становить 30, тоді протягом місяця кількість заощаджених коштів становитиме у середньому
N = 30*1*30(2,88-1,28) = 1440 (грн/міс)
Зрозуміло, що при підключенні до комплексу мобільного телефону з іншим стартовим пакетом, сума заощаджених коштів буде іншою.
5.2 Розрахунок собівартості програмного комплексу
Основним завданням техніко-економічного обгрунтування дипломного проекту є визначення величини економічного ефекту від використання основних та другорядних результатів, які одержані в даній дипломному проекті. Оцінка ефективності прийнятого рішення повинна бути комплексною і враховувати всі його аспекти.
Проведемо оцінку витрат праці на розробку програмного забезпечення для комплексу, при цьому виходимо з того, що розмір вихідного тексту запису алгоритму і даних в основному визначає затрати праці />та час розробки />програмного продукту:
/>
де />— кількість вихідних команд в тисячах.
В якості вихідної команди приймаємо рядок програми. Загальний об'єм вихідного тексту програм складає приблизно 1800 рядків. Тоді:
/>
Продуктивність праці розробників програмного забезпечення визначається наступним чином:
/>
Тоді ми отримуємо, що продуктивність праці розробників:
277,8
Час необхідний для розробки програмного продукту, можна визначити за формулою:
/>
де />— строк розробки програмного продукту;
/>— коефіцієнт вірності постановки завдання;
/>— час розробки алгоритму;
/>— час настройки та тестування;
/>— час на підготовку тексту;
/>— час на розробку документації.
Останні величини обчислюються по наступним формулам:
/>
/>
/>
/>
/>
/>
де К — залежить від ступеня підготовки програміста;
/>— кількість рядків програми (в тис.).
Підставляємо значення в останні формули враховуючи, що К=0,8 (стаж роботи до 2-х років).
/>
/>
/>/>
/>
/>
/>
Тоді час, який необхідний для розробки програмного продукту дорівнює:
/>
Визначимо собівартість години роботи ПК. Для цього розраховуються поточні витрати на експлуатацію комп'ютера. До їх складу включаються витрати на електроенергію і амортизаційні відрахування на реновацію від вартості комп'ютера та інше.
Витрати на електроенергію визначають множенням витрати електроенергії за одну годину на вартість 1 кВт/год електроенергії і на час роботи комп'ютера за рік. Час роботи комп'ютера за рік визначається множенням кількості робочих днів у рік на час роботи комп'ютера за день:
/>
де />— середня кількість робочих днів у рік.
Середня кількість робочих днів у рік буде рівна:
/>
Тоді, час роботи ПК за рік дорівнює:
/> продолжение
--PAGE_BREAK--
Витрати енергії визначаються за формулою:
/>
де />— витрати електроенергії за одну годину;
/>— вартість 1 кВт/год електроенергії;
/>— час роботи комп’ютера за рік.
Тоді витрати енергії складають:
/>
Амортизаційні відрахування визначаються множенням вартості комплекса на норму амортизаційних відрахувань 10%:
/>
Річна заробітна плата обслуговуючого персоналу (бугалтера, що буде обробляти інформацію про дзвінки 200 грн.) складає:
/>
Відрахування на соціальне страхування, складають 3% від загальної заробітної плати за рік:
/>
Вартість витрачених матеріалів складає 2% від вартості обчислювальної техніки:
/>
Утримання на ремонт приміщень, в яких знаходяться засоби обчислювальної техніки, складає 3% від вартості обчислювальної техніки:
/>
Кількість комплексів, що реалізовують зв’язок: />
Собівартість години роботи на комп'ютері визначається наступним співвідношенням:
/>
Підставляємо значення в останню формулу й отримаємо:
/>
Рахуємо прямі витрати на виконання дипломної роботи, які визначаються наступним добутком:
/>
де />— собівартість години роботи на комп’ютері;
/>— час необхідний для розробки програмного продукту.
Підставляємо значення й одержуємо:
/>
Накладні витрати, що включають витрати на освітлення, опалення і т. п. приймаються в розмірі 40-50% від суми прямих витрат:
/>
Загальні витрати на виконання дипломної роботи:
/>
Підставляємо дані й одержуємо:
/>
Визначення ціни на програмний продукт визначається наступним співвідношенням:
/>
де В — витрати на виконання дипломного проекту;
P — рівень рентабельності, в нашому випадку P = 30;
K — коефіцієнт, що залежить від науково-технічного рівня, в нашому випадку К = 1,1.
Підставляємо ці значення й отримаємо ціну програмного продукту, яка дорівнює:
/>
Річний економічний ефект від програми обробки дзвінків визначається за наступною формулою:
/>
де: />— витрати на розв’язання задачі традиційними методами;
/>— періодичність розв’язку задачі, для нашого випадку T = 12;
/>— приведені витрати.
Для визначення параметру />використовується наступна формула:
/>
де: />— трудомісткість на обробки дзвінків з комплексу, вимірюється в годинах;
/>— заробітна плата виконавця за одну годину.
Підставляємо значення в останню формулу й одержуємо:
/>
Для визначення параметру />використовується наступна формула:
/>
де: />— загальний об’єм вихідного тексту програмного додатка;
/>— собівартість години роботи на комп’ютері;
/>— продуктивність праці розробників програмного забезпечення;
/>— нормативно-галузевий коефіцієнт (/>).
/>— ціна програмного продукту.
Отже приведені витрати дорівнюють:
/>
Тоді річний економічний ефект дорівнює:
/> продолжение
--PAGE_BREAK--
6. Охорона праці
6.1 Загальні положення
Охорона праці – система законодавчих актів, соціально-економічних, організаційно-технічних, гігієнічних і лікувально-профілактичних заходів та засобів, що забезпечують безпеку, збереження здоров’я та працездатність людини в процесі роботи.
Все різноманіття нормативних документів, що включають поняття охорони праці, за яких виключено або значно послаблено вплив на працюючих шкідливих та небезпечних факторів трудового середовища.
6.2 Експлуатація комплексу у автономному режимі
Вміст шкідливих речовин, не попвинен перевищувати концентрацій, вказаних у переліку “Предельно допустимых концентраций загрязняющих веществ в атмосферном воздухе населенных мест” №3086-84 від 27.08.84р. Для озону концентрація не повинна перевищувати 0.03 мг/м3. Температурні норми повинні бути від 100 до 250. Приміщення де експлуатується комплекс не повинно бути запилене, вологість повітря не більше 55%. Комплекс необхідно розміщувати щонайменьше за два метри від робочого місця оператора, або в окремій кімнаті.
6.3 Електромагнітне випромінювання та поля від ЕОМ
ЕОМ з моніторами на основі електронно-променевих трубок є джерелом кількох видів електромагнітного випромінювання, зокрема мікрохвиль нетеплової інтенсивності. Види випромінювання:
рентгенівське випромінювання;
оптично випромінювання;
високочастотні електромагнітні поля;
низькочастотні електромагнітні поля;
електростатичні поля (ГОСТ 12.1045-84);
іонізуюче випромінювання;
випромінювання та поля радіочастотного діапазону (регламентуються ГОСТ 12.1.006.-84).
6.4 Шум, пов’язаний з ВДТ
ЕОМ є потенційним джерелом цілого ряду звуків, що містять як коливання, які можна почути, так і коливання ультразвукового діапазону. Цей шум справляє негативний вплив на функціональний стан користувача.
Відомо, що шум несприятливо діє на людину, особливо, при довготривалому впливі. У користувача, діяльність якого пов’язана з переробкою інформації, що часто супроводжується елементами творчості, це виражається у зниженні розумової працездатності (наприклад, швидкість обробки тексту зменшується на 10-15%, зростає кількість помилок), у прискореному розвитку зорового стомлення, підвищенні витрати енергії (на 17%), появі головного болю, розвитку безсоння, послаблення уваги та ін.
Вимірювання шуму на робочих місцях здійснюється згідно ГОСТ 12.1.050-86 та ГОСТ 23941-79.
Згідно ГОСТ 12.1.003-83 шум у приміщенні, де виконують роботу, пов’язану з виробленням концепцій, створення нових програм, творчістю, не повинен перевищувати 40 дБА. Під час виконання операторської та близької до неї діяльності рівень шуму не повинен перевищувати 65 дБА.
6.5 Параметри освітлення робочого місця та робочого приміщення
Невикористовуване рентгенівське випромінювання, а також випромінювання в ультрафіолетовому, інфрачервоному та радіочастотному діапазонах повинні відповідати гігієнічним нормам згідно з ГОСТ 12.2.003-74, ГОСТ 12.3.002-75, ГОСТ 12.1.006-84.
Згідно з тимчасовими санітарними нормами і правилами для працівників обчислювальних центрів № 4559-88 освітлення в приміщення з ЕОМ має бути змішаним (природним і штучним). Доцільно, щоб орієнтація світлових отворів для приміщень з ЕОМ була на північ. Природне освітлення повинно здійснюватись у вигляді бічного освітлення і відповідати нормальним рівням за санітарними нормами і правилами 11-4-79 “Природне і штучне освітлення. Норми проектування”.
6.6 Температура і вологість у приміщенні
Як оптимальні мікрокліматичні параметри прийнято вважати такі, що при тривалому та систематичному впливі на людину забезпечують збереження нормального функціонального та теплового стану організму без напруження реакцій терморегуляції, створюють відчуття теплового комфорту та є передумовою збереження високого рівня працездатності.
За даними ВООЗ, оптимальні значення температури повітря у приміщенні становлять 19-23% ˚С. Рекомендується відносна вологість повітря 55%. Швидкість руху повітря не повинна перевищувати на рівні обличчя 0.1 м/с.
6.7 Організація робочого місця
Робоче місце (РМ) — це обладнаний технічними засобами (засобами відображення інформації, органами управління, допоміжним обладнанням) простір, де здійснюється діяльність виконавця (або групи виконавців).
Удосконалення організації РМ є однією з умов, що сприяють підвищенню продуктивності праці, тому питанню організації РМ необхідно приділити особливу увагу. За літературними даними, при правильній організації РМ продуктивність праці, операторів ЕОМ від 8 до 20%.
Основним обладнанням робочого місця користувача ЕОМ є монітор, клавіатура, робочий стіл, стілець (крісло); допоміжним — пюпітр, підставка для ніг, шафи, полиці та ін. Вимоги до них відображені у нормативних документах: ВСПиПРВЦ; ГОСТ 12.2.032-78; ГОСТ 22269-76.
Робочі місця з ЕОМ повинні розташовуватися на відстані не менше як 1.5 м від стіни з віконними прорізами, від інших стін — на відстані 1м, між собою на відстані не менше 1.5 м. При розміщенні робочих місць необхідно виключити можливість прямого засвічування екрана джерелом природного освітлення. Джерело природного освітлення (вікно) не повинно також потрапляти в зону прямого спостереження користувача.
При розміщенні ЕОМ на робочому місці потрібно забезпечити простір для користувача величиною не менше як 850 мм з урахуванням виступаючих частин обладнання та застосування (при необхідності) спецодягу. Для стіп має бути передбачено простір по глибині та висоті не менше 150 мм, по ширині — не менше як 530 мм.
При розміщенні робочих місць з відеотерміналами та персональними ЕОМ необхідно забезпечити виконання наступних вимог:
робочі місця з відеотерміналами та персональними ЕОМ розміщуються на відстані не менше 1 м від стін зі світловими прорізами;
відстань між бічними поверхнями відеотерміналів має бути не меншою за 1,2 м;
відстань між тильною поверхнею одного відеотермінала та екраном іншого не повинна бути меншою 2,5 м;
прохід між рядами робочих місць має бути не меншим 1 м.
Вимоги цього пункту щодо відстані між бічними поверхнями відеотерміналів та відстані між тильною поверхнею одного відеотерміналу та екраном іншого враховуються також при розміщенні робочих місць з відеотерміналами та персональними ЕОМ в суміжних приміщеннях, з урахуванням конструктивних особливостей стін та перегородок.
Конструкція робочого місця користувача відеотерміналу (при роботі сидячи) має забезпечувати підтримання оптимальної робочої пози з такими ергономічними характеристиками: ступні ніг — на підлозі або на підставці для ніг; стегна — в горизонтальній площині; передпліччя — вертикально; лікті — під кутом 70 — 90 град. до вертикальної площини; зап'ястя зігнуті під кутом не більше 20 град. відносно горизонтальної площини, нахил голови — 15 — 20 град. відносно вертикальної площини.
Якщо користування відеотерміналом та персональною ЕОМ є основним видом діяльності, то вказане обладнання розміщується на основному робочому столі, як правило, з лівого боку.
Якщо використання відеотерміналу та персональної ЕОМ є періодичним, то устаткування, як правило, розміщується на приставному столі, переважно з лівого боку від основного робочого столу. Кут між поздовжніми осями основного та приставного столів має бути 90—140 град.
Висота робочої поверхні столу для відеотерміналу має бути в межах 680—800 мм, а ширина — забезпечувати можливість виконання операцій в зоні досяжності моторного поля.
Рекомендовані розміри столу: висота — 725 мм, ширина — 600—1400 мм, глибина — 800 — 1000 мм.
Робочий стіл для відеотерміналу повинен мати простір для ніг висотою не менше 600 мм, шириною не менше 500 мм, глибиною на рівні колін не менше 450 мм, на рівні витягнутої ноги — не менше 650 мм.
Робочий стіл для відеотерміналу, як правило, має бути обладнаним підставкою для ніг шириною не менше 300 мм та глибиною не менше 400 мм, з можливістю регулювання по висоті в межах 150 мм та кута нахилу опорної поверхні — в межах 20 град. Підставка повинна мати рифлену поверхню та бортик на передньому краї заввишки 10 мм.
Робоче сидіння (сидіння, стілець, крісло) користувача відеотерміналу та персональної ЕОМ повинно мати такі основні елементи: сидіння, спинку та стаціонарні або знімні підлокітники. продолжение
--PAGE_BREAK--
У конструкцію сидіння можуть бути введені додаткові елементи, що не є обов'язковими: підголовник та підставка для ніг.
Робоче сидіння користувача відеотерміналу та персональної ЕОМ повинно бути підйомно-поворотним, таким, що регулюється за висотою, кутом нахилу сидіння та спинки, за відстанню спинки до переднього краю сидіння, висотою підлокітників.
Ширина та глибина сидіння повинні бути не меншими за 400 мм. Висота поверхні сидіння має регулюватися в межах 400—500 мм, а кут нахилу поверхні — від 15 град. вперед до 5 град. назад.
Висота спинки сидіння має становити 300±20 мм, ширина — не менше 380 мм, радіус кривизни в горизонтальній площині — 400 мм. Кут нахилу спинки повинен регулюватися в межах 0—30 град. відносно вертикального положення. Відстань від спинки до переднього краю сидіння повинна регулюватись у межах 260 — 400 мм.
Для зниження статичного напруження м'язів рук необхідно застосовувати стаціонарні або знімні підлокітники довжиною не менше 250 мм, шириною — 50—70 мм, що регулюються по висоті над сидінням у межах 230±30 мм та по відстані між підлокітниками в межах 350 — 500 мм.
Поверхня сидіння, спинки та підлокітників має бути напівм'якою, з неслизьким, ненаелектризовуючим, повітронепроникним покриттям та забезпечувати можливість чищення від бруду.
Екран відеотермінала та клавіатура мають розташовуватися на оптимальній відстані від очей користувача, але не ближче 600 мм, з урахуванням розміру алфавітно-цифрових знаків та символів.
Розташовувати відеотермінал на робочому столі необхідно так, щоб поверхня екрана знаходилася на відстані 400-700 мм від очей користувача. Розташування екрану відеотерміналу має забезпечувати зручність зорового спостереження у вертикальній площині під кутом ±30 град. від лінії зору працівника.
Клавіатуру слід розміщувати на поверхні столу або на спеціальній, регульованій за висотою, робочій поверхні окремо від столу на відстані 100 — 300 мм від краю, ближчого до працівника. Кут нахилу клавіатури має бути в межах 5 — 15 град.
Розміщення принтера або іншого пристрою введення-виведення інформації на робочому місці має забезпечувати добру видимість екрану відеотермінала, зручність ручного керування пристроєм введення-виведення інформації в зоні досяжності моторного поля: по висоті 900 — 1300 мм, по глибині 400 — 500 мм.
При потребі високої концентрації уваги під час виконання робіт з високим рівнем напруженості суміжні робочі місця з відеотерміналами та персональними ЕОМ необхідно відділяти одне від одного перегородками висотою 1,5 — 2 м.
Рекомендується розміщувати елементи робочого місця таким чином, щоб витримувалася однакова відстань очей користувача від екрана, клавіатури, тримача документів.
Принтер треба розташувати так, щоб доступ до нього користувача та його колег був зручним.
Висновки
Результатом даного дипломного проекту є спроектований та впроводжений апаратно-програмний комплекс GSM↔MTM. Реалізована можливість двостороннього зв’язку між мережами GSM та MTM, комплекс реалізує персональну тарифікацію для кожного абонента та напрямки куди абонент може телефонувати, реалізований захист від несанкціонованого підключення, розроблений зручний інтерфейс для добавлення та знищення абонентів комплексу, а також швидка і надійна обробка статистичних даних, друк звітів, функції пошуку та редагування. А також при наявності Internet підключення, функція оперативного повідомлення абонентів про зміни.
Тестування комплексу підтвердило те, що зідйсненні дзвінки через комплекс по тарифам, для абонентів комплексу значно дешевші ніж при зідйсненні дзвінків на телефон мережі МТМ. Підтримуєсться достатньо висока якість переговорів, завдяки реалізації додаткових засобів, забезпечується висока надійність та відмовостійкість.
Апаратно–програмний комплекс введений в дію (у режимі тестування) на фірмі “New Com”. Він використовує всі вище описані функції та режими. Скарг, щодо роботи комплексу не надходило.
У загальному апаратно–програмний комплекс GSM↔MTM показав себе в роботі, як конкурентноспроможній продукт.
У процесі роботи над дипломним проектом мною була підготовлена і прочитана доповідь на 9 міжнародній конференції, що проводилася на території Технічного університету Поділля. Під час створення дипломного проекту були використані знання, одержані під час навчання.
Література
Самуйлов К.Е., Нікітіна М. В. “Как устроена сеть GSM”, www.udn.msk.su/gsm/index.htm, e-mail:ksam@udn.msk.su
Александр Фролов, Григорий Фролов “Программирование модемов“ Том 4, М.: Диалог-МИФИ, 1993, 236 стр.
Александр Фролов, “Язык СИ”, М: «Питер», 1999г, 450с., ил.
http://www.simens.com/index.htmСистема команд мобільного телефону (англ.) s25modCom.pdf, 52 Kb.
ECCOM bridge руководство по експлуатации, 1996г.,, ECCOM_BRIDGE.PDF, 491Kb
Справка по Visual Basic 5.0, %Program files%Microsoft Exchange/office/1049/vbaoff9.chm
Cправка по Microsoft Outlook 2000, %program files%Microsoft Exchange/Office/1049/vbaoutl9.chm
Справка по Microsoft Access 2000, %windir%help/Access.chm
Манн Ентони.
М23 Visual Basic 5. Руководство разработчика.:
Пер. с англ. – К.: Диалектика, 1997–705с.: ил. – Парал. тит. англ.
ISDN 966–506–115–1 (рус)
Конспекс лекцій по Access, Мунтяну Р.П. викладач кафедри КСМ, Чернівецького Національного Університету 2001 рік
ГОСТ 19.001-77 ЕСПД. Общие положения.
ГОСТ 19.101 -77 ЕСПД, Виды программ и программных документов.
ГОСТ 19.104-78 ЕСПД. Основные надписи.
ГОСТ 19.105-78 ЕСПД. Общие требования к программным документам.
ГОСТ 19,401-78 ЕСПД. Текст программы.
ГОСТ 19.402-78 ЕСПД. Описание программы.
ДОДАТОК 1
Затверджено
Л.ФФ.57149-ТП 12 01-1
“ПРОГРАМНО-АПАРАТНИЙ КОМПЛЕКС MTM↔GSM”
ПРОГРАМА ОБРОБКИ ДЗВІНКІВ
ТЕКСТ ПРОГРАМИ
Анотація
Опис програми Л.ФФ.57149-ТП 12 01-1 містить текст програми bridge.c. Текст програми містить коментарі у важко зрозумілих місцях.
#include
#include
#include
#include
#include
#include
#include
#include «uart.h» продолжение
--PAGE_BREAK--
#include «get_word.h»
#include «common.h»
#include «modem.h»
//#include «mod_link.h»
//#include «timer.h»
#include «tools.h»
#include «conf.h»
const PHONE = 1;
const MOBILPHONE = 2;
char *device = «COM1»; // номер послідовного порта, у форматі
// COMn, де n від 1 до 4
chardelay = 0, // затримка передачі між символами
unsigned speed = 9600; // швидкість обміну даними
char initialize[80]; // команда ініціалізації
char dropline[80]; // команда покласти трубку
char dialPrefix[80]; // префікс номера
char dialSuffix[80]; // суфікс номера
char maxTime [80]; // максимальний час розмови
char numDigits [80]; // максимальна кількість цифр у наборі коду
char LPT[10]; //Адреса порту прінтера
int LPTin = 1;
int LPTout = 0;
int PhoneNum;
char dialNumber[80]; // телефонній номер
int tarifIn;
int tarifOut;
double money;
double START_money;
int dir;//напрям розмови
int tarifConnect;
int countSec = 0;
extern void Csleep(time_t interval); // затримка виконання програми на задану кількість секунд
extern void Cdelay(int milliseconds); // затримка виконання програми на задану кількість мілісекунд
void PhoneDown(void); // покласти трубку на МТМ
int initializeDevice(void); // ініціалізація пристрою
char * waitRing(void); // Очікуємо дзвінок
void saveLog(char *timeStart,char *timeEnd,char *Number,char *direction); // записати ЛОГ файл
void beep(int no){ // біпер в МТМ
while (no>0){
Cdelay(100);
sound(700);
Cdelay(100);
nosound();
no--;
}
}
void decUserMoney(int direct){
// Тарифікація на міст (Direct=PHONE – тарифікація на місто, у іншому випадку
//на мобільний телефон)
float tOut1 = tarifOut/60.0; //GSM
if (direct == PHONE) money = money — tOut1;
else{
if (countSec == 0) money = money — tarifIn;
countSec++;
if(countSec == 60) countSec = 0;
};
};
//почати розмову поки не закінчиться ліміт або гроші
void StartToking(int direction){
char timeStart[80];
char timeEnd[80];
char buf[80];
char * tim;
int i=0;
//очистили буфер
if (r_count_pending()>0) sread(buf,r_count_pending(),0);
Cdelay(200);
do{
sendstr(«AT+CPAS»); //команда видає 4 коли мобільні телефони встановили зв‘язок
Cdelay(200);
if (r_count_pending()>0) {
sread(buf,r_count_pending(),0); // 0 при наборі номера
if (strstr(buf,"+CPAS: 0")!=NULL) {
printf("\nКiнець зв'язку!!! \n");
Csleep(1);
PhoneDown(); продолжение
--PAGE_BREAK--
return;
};
if (strstr(buf,"+CPAS: 4")!=NULL){
//початок розмови зчитуємо час
if (r_count_pending()>0) sread(buf,r_count_pending(),0);
sendstr(«AT+CCLK?»);
Cdelay(200);
if (r_count_pending()>0) sread(timeStart,r_count_pending(),0);
for (i=0;i
if ((timeStart[i]=='O')&&(timeStart[i+1]=='K')){
break;
}
timeStart[i+2]='\0';
printf(timeStart);
printf("\n");
break;
}
}
} while(1);
i = atoi(maxTime);
countSec = 0;
//почати відлік часу і зменшити гроші на рахунку абонента
do{
decUserMoney(direction);
if (i==30) beep(4); // чотири гудка коли часу залишилось 30 сек
sendstr(«AT+CPAS»);
Cdelay(200);
sread(buf,r_count_pending(),0);
Cdelay(700);
if (strstr(buf,"+CPAS: 0")!=NULL){
break; // розмову закінчено
}
if (i
i--;
}while ((i>0)&&(!kbhit()));
//кiнець розмови зчитуємо час
if (r_count_pending()>0) sread(buf,r_count_pending(),0);
sendstr(«AT+CCLK?»);
Cdelay(200);
if (r_count_pending()>0) sread(timeEnd,r_count_pending(),0);
for (i=0;i
if ((timeEnd[i]=='O')&&(timeEnd[i+1]=='K')) break;
timeEnd[i+2]='\0';
printf(timeEnd);
sendstr(«AT+CHUP»);
sendstr("\nATZ");
printf("\nКiнець зв'язку!!! \n");
Csleep(1);
PhoneDown();
if (direction == PHONE) {
if (START_money!=money) money = money — tarifConnect;
saveLog(timeStart,timeEnd,dialNumber,«з MTM»);
}
else saveLog(timeStart,timeEnd,dialNumber,«з GSM»);
};
// підняти трубку на МТМ
void PhoneUp(){
asm{
mov dx,LPTout
mov al,080h
out dx,al;
}
};
// Опустити трубу
void PhoneDown(){
asm{
mov dx,LPTout
mov al,00h
out dx,al;
}
};
// вивести повідомлення про помилку
void error(int no){
printf("\n\nПОМИЛКА!!!\n");
switch (no){
case 0:printf("\nOk!");break;
case 1:printf("\n Пристрiй не вдаєтсья проiнiцiалiзувати...\n");break;
case 2:printf("\n");break; продолжение
--PAGE_BREAK--
case 3:printf("\n Надто велика затримка при наборi номера...\n");break;
case 4:printf("\n Номера в базi даних не iснує або у власника номеру закiнчився час\n");break;
}
};
// очікування дзвінків (з МТМ або з GSM)
char * waitRing(){
char rString[200];
char *ch;
int i=0;
int fromCity;
Csleep(1);
rString[0]='\0';
sendstr(«ATZ»);// повторна ініціалізація
Cdelay(100);
sendstr(«AT+CLIP=1»);
Cdelay(200);
while (r_count_pending()!=0) sread(rString,r_count_pending(),0);
do{
rString[0]='\0';
Csleep(1);
fromCity = isRing();
if (fromCity!=0) {
if (r_count_pending()>0) sread(rString,r_count_pending(),0);
return «CITY»; // надійшов дзвінок з міста
}
if (r_count_pending()>40) { // дзвінок надійшов з мобільного телефону
sread(rString,r_count_pending(),0);
ch = strstr(rString,«38»);
i=0; while((ch[i]>='0')&&(ch[i]
dialNumber[0]='\0';
strcat(dialNumber,ch); // визначаємо номер мобільного телефону
if (ch!= NULL) return «MOBIL»;
}
}while (!kbhit());
return «BREAK»;
};
// шукаємо номер у базі і у разі якщо номер існує і на рахунку є гроші повертаємо його реквізити
int getPhoneNumber(int op,int *code,char *phone,int *tarifIn,int *tarifOut,double *money,int *dir){
//op == 1 == in phone->...
//op == 2 == out code->...
FILE *handle;
char Scode[5],
SPhone[15],
StarifIn[5],
StarifOut[5],
Smoney[8],
Sdir[6],
buf[100],
sbuf[15];
int i,j,index;
handle = fopen(«Users.dat», «r»);
if (handle == NULL) return -1;
index = -1;
itoa(*code,Scode,10);
j=strlen(Scode);
if (j
for (i=j-1;i>=0;i--) Scode[2-(j-i-1)]=Scode[i];
for (i=0;i
}
while(!feof(handle)){
index ++;
fgets(buf,100,handle);
i=0;
while (buf[i]!=' ')sbuf[i]=buf[i++];sbuf[i]='\0';
if ((op==PHONE)&&(strcmp(sbuf,Scode)==0)){
j=0;i++;while(buf[i]!=' ')phone[j++]=buf[i++];phone[j]='\0';
j=0;i++;while(buf[i]!=' ')StarifIn[j++]=buf[i++];StarifIn[j]='\0';
j=0;i++;while(buf[i]!=' ')StarifOut[j++]=buf[i++];StarifOut[j]='\0';
j=0;i++;while(buf[i]!=' ')Smoney[j++]=buf[i++];Smoney[j]='\0';
j=0;i++;while(buf[i]!='\n')Sdir[j++]=buf[i++];Sdir[j]='\0';
break;
}//end if op
else{
j = atoi(sbuf);
*code = j;
j=0;i++;while(buf[i]!=' ')sbuf[j++]=buf[i++];sbuf[j]='\0';
if ((op==MOBILPHONE)&&(strcmp(sbuf,phone)==0)){ продолжение
--PAGE_BREAK--
j=0;i++;while(buf[i]!=' ')StarifIn[j++]=buf[i++];StarifIn[j]='\0';
j=0;i++;while(buf[i]!=' ')StarifOut[j++]=buf[i++];StarifOut[j]='\0';
j=0;i++;while(buf[i]!=' ')Smoney[j++]=buf[i++];Smoney[j]='\0';
j=0;i++;while(buf[i]!='\n')Sdir[j++]=buf[i++];Sdir[j]='\0';
break;
}
}
};// end while
if (feof(handle)) {
fclose(handle);
return -1;
};
*tarifIn = atoi(StarifIn);
*tarifOut = atoi(StarifOut);
tarifConnect = atoi(StarifConnect);
if (strstr(Sdir,«MT»)!=NULL)*dir=PHONE;
if (strstr(Sdir,«GSM»)!=NULL)*dir=MOBILPHONE;
if (strstr(Sdir,«MTGSM»)!=NULL)*dir=3;
START_money = atof(Smoney);
*money = atof(Smoney);
fclose(handle);
if ((op==*dir)||(*dir == 3))return index;
else return -1;
};
// після розмови залишок зберігаємо у файлі
void SaveMoney(int index){
FILE* handle;
char Smoney[20];
char buf[100];
long siz = 0;
int i,j;
char Sdelta[40];
int k = 0,delta = 0;
//перевiрка визначаємо рiзницю часу
//index=index+1;
//кiнець
handle = fopen(«Users.dat», «rb+»);
if (handle == NULL) return;
while((!feof(handle))&&(index-->0)) {
fgets(buf,100,handle);
siz += strlen(buf);
};
i=0;k=0;
fgets(buf,100,handle);
while (buf[i]!=' ')i++;
i++;while (buf[i]!=' ')i++;
i++;while (buf[i]!=' ')i++;
i++;while (buf[i]!=' ')i++;
k = i+1;
ltoa(money,Smoney,10);
j=strlen(Smoney);
if (j
for (i=j-1;i>=0;i--) Smoney[5-(j-i)]=Smoney[i];
for (i=0;i
};
fseek(handle,siz+k,SEEK_SET);
fwrite(&Smoney,strlen(Smoney),1,handle);
fclose(handle);
};
// отримуємо час розмови у секундах для визначення часу розмови
unsigned long getSec(char *tim){
char *Ssec;
int i = 0,k = 0,numDigit=0;
unsigned long res = 0;
Ssec = strstr(tim,",");
Ssec[10]='\0';
while (Ssec[i]!='\0') {
if ((Ssec[i]'9')){i++;continue;};
if (k==2){
if (i>4) res=res*60+numDigit; numDigit=0; k=0;
}
numDigit=numDigit*10+(Ssec[i]-48);
k++; i++;
}
return res*60+numDigit;
}
// записуємо протокол розмови у формі дата розмови час розмови кількість витрачених грошей
// номер телефону з якої сторони був дзвінок МТМ чи GSM продолжение
--PAGE_BREAK--
void saveLog(char * timeStart,char * timeEnd,char *phoneNumber,char *direction){
FILE * f;
char Smoney[20];
double mresult = 0;
unsigned long intmres = 0;
unsigned long tStart = getSec(timeStart);
unsigned long tEnd = getSec(timeEnd);
char spase[3] = " ";
int i,j,delta = 0;
char Sdelta[10];
if (tStart>tEnd){
tEnd+=3600;
}
delta = tEnd-tStart;
itoa(delta,Sdelta,10);
f=fopen(«Log.dat»,«at»);
i=0;
while ((timeStart[i]>'9')||(timeStart[i]
for (j=i;j
intmres = ((long)(money));
if (strcmp(direction, «з GSM»)==0) money = intmres;
else money = intmres-1;
mresult = START_money-money;
ltoa(mresult,Smoney,10);
fwrite(timeStart,strlen(timeStart),1,f);
fwrite(spase,strlen(spase),1,f);
fwrite(Sdelta,strlen(Sdelta),1,f);
fwrite(spase,strlen(spase),1,f);
fwrite(Smoney,strlen(Smoney),1,f);
fwrite(spase,strlen(spase),1,f);
fwrite(phoneNumber,strlen(phoneNumber),1,f);
fwrite(spase,strlen(spase),1,f);
fwrite(direction,strlen(direction),1,f);
fputs("\n",f); fclose(f);
};
// отримати число видане контролером DTMF
int getDigit(int criticalTime){
int i,res = 0;
char b;
char *st;
while((inportb(LPTin)&STROB)==0);
do{
b = inportb(LPTin);
delay(60);
if (criticalTime--
}while ((b&STROB)!= 0);
if ((b & DIGIT1)!=0) res = res+1;
if ((b & DIGIT2)!=0) res = res+2;
if ((b & DIGIT3)!=0) res = res+4;
if ((b & DIGIT4)!=0) res = res+8;
itoa(res,st,10);
if (criticalTime
else return res;
};
//************************************************************************************************************
//********************** обробити дзвінок з міста ***********************************
//********************************************************************************************************
void phoneCity(){
int digit[3];//читаємо кому абонент телефонної лiнiї хоче подзвонити
int i,no = 0;
int PhoneNum = 0;
int tarifUser;
int isDigit,credits;
int MD = atoi(numDigits);
char *st,
temp[30] ;
int NoUser; // номер абонента в списку користувачів мережою
PhoneUp();
Cdelay(1500);
beep(2); // два гудка говорять про готовність приймача прийняти код
do{
isDigit = getDigit(100);
if (isDigit
beep(3);
error(3);
PhoneDown();
return; продолжение
--PAGE_BREAK--
}
if (isDigit>10) continue;
isDigit%=10;
digit[no++] = isDigit;
PhoneNum=PhoneNum*10+digit[no-1];
}while ((isDigit>=0)&&(no
itoa(PhoneNum,st,10);
temp[0] = '\0';
strcat(temp,"\nНабраний додатковий номер ");;
strcat(temp,st);
strcat(temp,"\n");
printf(temp);
//Ок!
dialNumber[0]='\0';
beep(1);
// отримуємо реквізити номера
no = getPhoneNumber(PHONE,&PhoneNum,dialNumber,&tarifIn,&tarifOut,&money,&dir);
if (no
beep(3);
error(4);
PhoneDown();
return;
};
temp[0] = '\0';
dialNumber[0]=' ';
strcat(temp, dialPrefix);
strcat(temp, dialNumber);
strcat(temp, dialSuffix);
sendstr(temp);
Csleep(1);
credits = tarifUser;
StartToking(PHONE);
SaveMoney(no);
};
//*******************************************************************************************************
//**************** обробити дзвінок з мобільного телефону *****************************
//*******************************************************************************************************
void phoneMobiline(void){
int i = 0;
char phone[15];
char temp[80];
int no,creditUser = -1;
// знаходимо стрiчку з номером телефону звiдки телефонують
// перевiряємо чи номер присутнiй у базi i чи достатньо у нього часу для розмови
// функцiя повертає час що залишився в абонента або -1,
// якщо часу немає або абонент вiдсутнiй у бд
no = getPhoneNumber(MOBILPHONE,&PhoneNum,dialNumber,&tarifIn,&tarifOut,&money,&dir);
if (no
// пiднiмаємо трубку i подаємо сигнал готовностi beep
PhoneUp();
while (1){
printf("\nПiднiмаю трубку...\n");
sendstr(«ATA»);
Csleep(1);
sread(temp,r_count_pending(),0);
if (strstr(temp,«OK»)!=NULL) break;
}
StartToking(MOBILPHONE);
SaveMoney(no);
}
//******************************************************************************************************
//****************** Ініціалізація пристрою ************************************************
//******************************************************************************************************
int initializeDevice(){
int i,j;
char buf[80];
getconfig();
LPTout = atoi(LPT);
LPTin = LPTout+1;
// устанавливаем обработчик преріваний и инициализируем
// регистрі UART и контроллера преріваний
PhoneDown();
openline(device, speed);
// очищаємо буфер прийому
while (sread(buf,1,0));
printf("\nІнiцiалiзiруєм пристрiй\n\n"); продолжение
--PAGE_BREAK--
// передаем модему стрічку ініціалізації
// (строка инициализации определяется ключевім словом Initialize
// в файле конфигурации setup.cfg)
sendstr(initialize);
// ожидаем ответа модема
sleep(modemTimeout);
// считіваем и отображаем на экране ответное сообщение модема
if(r_count_pending() > 0) {
sread(buf, i = r_count_pending(), 0);
buf[i] = '\0';
for(j = 0; j
beep(1); return 0;
}else {
printf("\nНе вдалося проiнiцiалiзувати пристрiй. Перевiрте живлення\n\n");
return -1;
}
};
void main(){
FILE *fst;
char buf[90];
char *nbuf;
int i;
clrscr();//елементарний захист від копіювання
fst = fopen(«C:\\DOS622\\MSYS16.SY_»,«r»);
if (fst == NULL){
printf("\n\n\n\t\t\t\tКрадена версiя!!!\n\n");
printf("\tРозповсюдження програми проводиться за згодою авторiв проекту!!!\n");
sound(1000);
Csleep(3);
nosound();
getch();
return;
}
fclose(fst);
if (initializeDevice()
printf("\nРобочий режим включений!!!");
isRing();
while (!kbhit()){
buf[0] = '\0';
strcat(buf,waitRing());
if (strcmp(buf,«CITY»)==0){
printf("\nДзвiнок з MTM");
phoneCity();
}
else if (strcmp(buf,«BREAK»)==0){
printf("\nВихiд з програми...");
break;
} else{
printf("\nДзвiнок з GSM");
phoneMobiline();
}
};
Csleep(1);
closeline();
}
ДОДАТОК 2
Затверджено
Л.ФФ.57149-ТП 12 02-1
“ПРОГРАМНО-АПАРАТНИЙ КОМПЛЕКС MTM↔GSM”
ПРОГРАМА ПОСЛІДОВНОЇ ПЕРЕДАЧІ ДАНИХ
ТЕКСТ ПРОГРАМИ
Анотація
Опис програми Л.ФФ.57149-ТП 12 02-1 містить текст програми UART.ASM. Текст програми містить коментарі у важко зрозумілих місцях.
; UART.ASM
; модуль управления модемом і COM-портом нижнього рівня
; Визначаємо розміри буферу приймача та передавача
R_SIZE EQU 2048; размір буфера, що приймає
S_SIZE EQU 500; размір буфера, що передає
; номери оброблювачів переривань
INT_COM1 EQU 0Ch; COM1
INT_COM2 EQU 0Bh; COM2
INT_COM3 EQU 0Ch; COM3
INT_COM4 EQU 0Bh; COM4
; порти контролери переривань 8259
OCR EQU 20H; управляючий регістр 8259
IMR EQU 21H; регістр маски переривань 8259
; константи для управління контролером переривань продолжение
--PAGE_BREAK--
E_IRQ4 EQU 00010000B
D_IRQ4 EQU 11101111B
EOI4 EQU 01100100B
E_IRQ3 EQU 00001000B
D_IRQ3 EQU 11110111B
EOI3 EQU 01100011B
; область змінних BIOS
; адреса базовых регістрів послідовних асинхронних адаптерів
BIOS_VAR SEGMENT AT 40H
rs232_base DW 4 DUP(?)
BIOS_VAR ENDS
;
; таблиця для кожного COM-порта
SP_TAB STRUC
RING DB ?; 1 — ring 0-no ring
port DB ?; 1, 2, 3 или 4
; параметри для цього рівня переривань
int_com DB ?; номер переривання
e_irq DB ?
d_irq DB ?
eoi DB ?
; оброблювачі переривань для цього рівня
int_hndlr DW?; зміщення оброблювача переривань
old_com_off DW?; зміщення попереднього оброблювача переривань
old_com_seg DW?; сегмент попереднього попереднього
; параметри COM-порта
installed DB ?; чи встановлений порт не комп’ютері? (1=да,0=ні)
baud_rate DW ?
device_conn DB ?; M(Модем), D(Нуль-модем)
parity DB ?; N(ONE), O(DD), E(VEN), S(PACE), M(ARK)
stop_bits DB ?; 1, 2
; лічильники помилок
error_block DW 8 DUP(?)
; порти 8250
DATREG DW ?; регістр даних
IER DW ?; регістр управління перериваннями
IIR DW ?; регістр ідентифікації преривання
LCR DW ?; регістр керування лінією
MCR DW ?; регістр керування модемом
LSR DW ?; регістр стану лінії
MSR DW ?; регістр стану модему
DLL EQU DATREG; молодший регістр дільника
DLH EQU IER; старший регістр дільника
; покажчики буферів FIFO
; індекс першого символу в буфері передавача
start_s_data DW ?
; індекс першого вільного елемента буфера передавача
end_s_data DW ?
; індекс першого символу в буфері приймача
start_r_data DW ?
; індекс першого вільного елемента буфера приймача
end_r_data DW ?
; лічильники кількості символів у буферах
size_s_data DW ?; число символів у буфері передавача
size_r_data DW ?; число символів у буфері приймача
; буфера
send_buf DB S_SIZE DUP(?); буфер передавача
reciave_buf DB R_SIZE DUP(?); буфер приймача
SP_TAB ENDS
EFRAME EQU error_block+6; помилка синхронізації
EPARITY EQU error_block+8; помилка парності
EOVFLOW EQU error_block; відбулося переповнення буфера
EDSR EQU error_block+12; модем не відповів сигналом DSR
EOVRUN EQU error_block+2; помилка переповнення
EBREAK EQU error_block+4; виявлений запит на переривання
EXMIT EQU error_block+10; помилка при передачі
ECTS EQU error_block+14; модем не відповів сигналом CTS
;
DGROUP GROUP _DATA
_DATA SEGMENT public 'DATA'
DIV50 DW 2304
; поточний номер області даних порту
CURRENT_AREA DW AREA1
; область даних для кожного порту
AREA1 SP_TAB ; область даних COM1
AREA2 SP_TAB ; область даних COM2 продолжение
--PAGE_BREAK--
AREA3 SP_TAB ; область даних COM3
AREA4 SP_TAB ; область даних COM4
_DATA ENDS
COM_TEXT SEGMENT PARA public 'CODE'
ASSUME cs:COM_TEXT,ds:DGROUP,es:NOTHING
public _select_port
public _save_com
public _install_com
public _restore_com
public _open_com
public _close_com
public _dtr_on
public _dtr_off
public _r_count
public _s_count
public _receive_com
public _send_com
public _break_com
public _com_errors
public _com_ring
; вибір активного порту
; [bp+6] — номер порту
_select_port PROC FAR
push bp
mov bp, sp
mov ax, [bp+6]; одержуємо в ax аргумент функції
cmp al,1; установлений порт 1?
je port1; да
cmp al,2; установлений порт 2?
je port2; да
cmp al,3; установлений порт 3?
je port3; да
cmp al,4; установлений порт 4?
je port4; да
jmp set_carrent_area
port1:
mov ax,OFFSET DGROUP:AREA1; вибираємо область даних COM1
jmp short set_carrent_area
port2:
mov ax,OFFSET DGROUP:AREA2; вибираємо область даних COM2
jmp short set_carrent_area
port3:
mov ax,OFFSET DGROUP:AREA3; вибираємо область даних COM3
jmp short set_carrent_area
port4:
mov ax,OFFSET DGROUP:AREA4; вибираємо область даних COM4
set_carrent_area:
; записуємо в перемінної CURRENT_AREA зсув
; поточної області даних
mov CURRENT_AREA,ax
mov sp,bp
pop bp
ret
_select_port ENDP
;
; збереження поточного вектора COM переривання
_save_com PROC FAR
push bp
mov bp,sp
push si
; записуємо в si покажчик на поточну область даних
mov si,CURRENT_AREA
push es
mov AREA1.int_hndlr,OFFSET int_hndlr1
mov AREA2.int_hndlr,OFFSET int_hndlr2
mov AREA3.int_hndlr,OFFSET int_hndlr3
mov AREA4.int_hndlr,OFFSET int_hndlr4
; зберігаємо старий вектор переривання
mov ah,35H
mov al,int_com[si]; номер переривання
int 21h
; записуємо в перемінні old_com_off і old_com_seg
; відповідно сегмент і зсув старого вектора переривання
mov old_com_off[si],bx
mov bx,es
mov old_com_seg[si],bx
pop es
pop si
mov sp,bp продолжение
--PAGE_BREAK--
pop bp
ret
_save_com ENDP
; install_com: установити активний порт
; повертає в регістрі ax — 1 при успішній установці
; і 0 у випадку помилки
_install_com PROC FAR
push bp
mov bp,sp
push si
mov si,CURRENT_AREA
push es
cmp installed[si],1
jne go_install
jmp alredy_ok
; очищаємо лічильники помилок
go_install:
mov WORD PTR EOVFLOW[si],0; переповнення буфера передавача
mov WORD PTR EOVRUN[si],0; помилка переповнення при прийомі
mov WORD PTR EBREAK[si],0; виявлений запит на переривання
mov WORD PTR EFRAME[si],0; помилка синхронізації
mov WORD PTR EPARITY[si],0; помилка парності
mov WORD PTR EXMIT[si],0; помилка при передачі
mov WORD PTR EDSR[si],0; не отриманий сигнал DSR
mov WORD PTR ECTS[si],0; не отриманий сигнал CTS
; визначаємо базова адреса використовуваного COM порту
mov bx,BIOS_VAR
mov es,bx
ASSUME es:BIOS_VAR
cmp port[si],1; порт 1?
je adr_3F8
cmp port[si],2; порт 2?
je adr_2F8
cmp port[si],3; порт 3?
je adr_3E8
cmp port[si],4; порт 4?
je adr_2E8
int 20H
adr_3F8:
mov ax,3F8H
jmp cmp_bios
adr_2F8:
mov ax,2F8H
jmp cmp_bios
adr_3E8:
cmp rs232_base+4,0
je adr_3E8_A
mov ax,rs232_base+4
jmp cmp_bios
adr_3E8_A:
mov ax,3E8H
mov rs232_base+4,ax
jmp cmp_bios
adr_2E8:
cmp rs232_base+6,0
je adr_2E8_A
mov ax,rs232_base+6
jmp cmp_bios
adr_2E8_A:
mov ax,2E8H
mov rs232_base+6,ax
; перевіряємо чи існує визначена відповідна змінна
; BIOS
cmp_bios:
cmp ax,rs232_base
je set_reg_adr
cmp ax,rs232_base+2
je set_reg_adr
cmp ax,rs232_base+4
je set_reg_adr
cmp ax,rs232_base+6
jne bad_exit
set_reg_adr:
mov bx,DATREG
mov cx,7
set_next_reg_adr:
mov WORD PTR [si][bx],ax
inc ax
add bx,2
loop set_next_reg_adr продолжение
--PAGE_BREAK--
; установлюємо вектор переривання на наш оброблювач
mov AREA1.int_hndlr,OFFSET int_hndlr1
mov AREA2.int_hndlr,OFFSET int_hndlr2
mov AREA3.int_hndlr,OFFSET int_hndlr3
mov AREA4.int_hndlr,OFFSET int_hndlr4
mov ah,25H
mov al,int_com[si]; номер переривання
mov dx,OFFSET DGROUP:int_hndlr[si]
push ds
push cs
pop ds
int 21h
pop ds
; піднімаємо прапор — порт установлений
alredy_ok:
mov installed[si],1
pop es
; повертаємо 1
mov ax,1
pop si
mov sp,bp
pop bp
ret
; порт не встановлений
bad_exit:
mov installed[si],0
pop es
; повертаємо 0
mov ax,0
pop si
mov sp,bp
pop bp
ret
_install_com ENDP
; відновлення векторів переривань
_restore_com PROC FAR
push bp
mov bp,sp
push si
; відзначаємо COM порт як не активний
mov si,CURRENT_AREA
mov installed[si],0
; відновлюємо вектор переривання
mov ah,25H
mov al,int_com[si]
mov dx,old_com_off[si]
mov bx,old_com_seg[si]
push ds
mov ds,bx
int 21h
pop ds
pop si
mov sp,bp
pop bp
ret
_restore_com ENDP
; відкрити COM порт
; скидання буферів передавача і приймача,
; ініціалізація регістрів UART 8250
; дозвіл переривань від UART 8250
; (програмування контролера переривань)
; [bp+6] = швидкість обміну
; [bp+8] = спосіб з'єднання — M(Модем), D(Нуль-модем)
; [bp+10] = парність — N(ONE), O(DD), E(VEN), S(PACE), M(ARK)
; [bp+12] = кількість стопових бітів 1, 2
_open_com PROC FAR
push bp
mov bp,sp
push si
mov si,CURRENT_AREA
; забороняємо переривання
cli
mov ax,[bp+6]
mov baud_rate[si],ax
mov bh,[bp+8]
mov device_conn[si],bh
mov bl,[bp+10]
mov parity[si],bl
mov ch,[bp+12]
mov stop_bits[si],CH
; скидаємо буфери і покажчики продолжение
--PAGE_BREAK--
mov start_s_data[si],0
mov end_s_data[si],0
mov start_r_data[si],0
mov end_r_data[si],0
mov size_s_data[si],0
mov size_r_data[si],0
; чи перевіряємо установлений вже оброблювач переривань
test installed[si],1
jnz reset_uart
jmp exit_open
reset_uart:
; установлюємо регістри UART 8250
; скидаємо регістр керування модемом
mov al,0
mov dx,MCR[si]
out dx,al
jmp $+2
; скидаємо регістр стану лінії
mov dx,LSR[si]
in al,dx
jmp $+2
; скидаємо регістр даних
mov dx,DATREG[si]
in al,dx
jmp $+2
; скидаємо регістр стану модему
mov dx,MSR[si]
in al,dx
; визначаємо дільник частоти тактового генератора
mov ax,50
mul DIV50
div baud_rate[si]
mov bx,ax
; переключаємо регістир даних і регістр керування перериваннями
; для введення дільника частоти тактового генератора
mov dx,LCR[si]
mov al,80H
out dx,al
jmp $+2
; уводимо молодший байт дільника частоти тактового генератора
mov dx,WORD PTR DLL[si]
mov al,bl
out dx,al
jmp $+2
; уводимо старший байт дільника частоти тактового генератора
mov dx,WORD PTR DLH[si]
mov al,bh
out dx,al
jmp $+2
; визначаємо парність і кількість стоп-бітів
mov al,03H
cmp parity[si],'O'
jne next1
mov al,0ah
jmp short next3
next1:
cmp parity[si],'E'
jne next2
mov al,1ah
jmp short next3
next2:
cmp parity[si],'M'
jne next3
mov al,2ah
next3:
test stop_bits[si],2
jz stop1
or al,4
stop1:
mov dx,LCR[si]
out dx,al
; дозволяємо переривання для 8259 і 8250
; установлюємо регістр маски переривань щоб
; дозволити переривання від асинхронного порту
in al,IMR
and al,d_irq[si]
out IMR,al
; дозволяємо генерацію переривань при готовності прийнятих
; даних, по стані «BREAK» і помилково
mov dx,IER[si] продолжение
--PAGE_BREAK--
mov al,0Dh
out dx,al
jmp $+2
; установлюємо DTR, RTS, OUT2
mov dx,MCR[si]
mov al,0bh
out dx,al
exit_open:
sti
pop si
mov sp,bp
pop bp
ret
_open_com ENDP
; забороняємо переривання від асинхронного порту
_close_com PROC FAR
push bp
mov bp,sp
push si
mov si,CURRENT_AREA
test installed[si],1
jz exit_close
; забороняємо переривання UART 8250
mov dx,IER[si]
mov al,0
out dx,al
; маскуємо переривання від UART
mov dx,IMR
in al,dx
or al,e_irq[si]
jmp $+2
out dx,al
exit_close:
pop si
mov sp,bp
pop bp
ret
_close_com ENDP
; процедура повертає 1 якщо з МТМ надійшов дзвінок
_com_ring proc far
push bp
mov bp,sp
push si
mov si,CURRENT_AREA
test installed[si],1
jz exit_com_ring
xor ax,ax
mov al,BYTE PTR RING[si]
nop
mov RING[si],0
nop;
exit_com_ring:
pop si
mov sp,bp
pop bp
ret
_com_ring endp
; ДОПОМІЖНІ ФУНЦІЇ
; знімаємо сигнал DTR
_dtr_off PROC FAR
push bp
mov bp,sp
push si
pushf
push ax
push dx
push si
mov si,CURRENT_AREA
test installed[si],1
jz exit_dtr_off
; установлюємо регістр керування модемом,
; скидаємо сигнали DTR і RTS
mov dx,MCR[si]
mov al,08H
out dx,al
exit_dtr_off:
pop si
pop dx
pop ax
popf
pop si
mov sp,bp
pop bp продолжение
--PAGE_BREAK--
ret
_dtr_off ENDP
; установлюємо сигнал DTR
_dtr_on PROC FAR
push bp
mov bp,sp
push si
pushf
push ax
push dx
push si
mov si,CURRENT_AREA
test installed[si],1
jz exit_dtr_on
; установлюємо регістр керування модемом,
; установлюємо сигнали DTR, RTS, OUT2
mov dx,MCR[si]
mov al,0bh
out dx,al
exit_dtr_on:
pop si
pop dx
pop ax
popf
pop si
mov sp,bp
pop bp
ret
_dtr_on ENDP
;
; повертаємо в регістрі ax число байтів у регістрі приймача,
; а в регістрі dx загальний розмір буфера приймача
_r_count PROC FAR
push bp
mov bp,sp
push si
pushf
push si
mov si,CURRENT_AREA
mov ax,0
mov dx,R_SIZE
test installed[si],1
jz exit_r_count
; записуємо в регістр ax число символів у буфері приймача
mov ax,size_r_data[si]
exit_r_count:
pop si
popf
pop si
mov sp,bp
pop bp
ret
_r_count ENDP
; одержуємо черговий символ з буфера приймача,
; отриманий символ віддаляється з буфера
_receive_com PROC FAR
push bp
mov bp,sp
push si
pushf
push bx
push si
mov si,CURRENT_AREA
mov ax,-1
test installed[si],1
jz exit_receive_com
; повертаємося якщо буфер приймача порожній
cmp size_r_data[si],0
je exit_receive_com
mov ah,0
mov bx,start_r_data[si]
mov al,reciave_buf[si][bx]
cmp parity[si],'N'
je no_parity
; якщо виробляється перевірка на парність, то маскуємо старший біт
and al,7FH
no_parity:
inc bx
cmp bx,R_SIZE
jb rec_ptr_no_max
mov bx,0
rec_ptr_no_max: продолжение
--PAGE_BREAK--
mov start_r_data[si],bx
dec size_r_data[si]
exit_receive_com:
pop si
pop bx
popf
pop si
mov sp,bp
pop bp
ret
_receive_com ENDP
; функція повертає в регістрі ax число вільних байт у
; буфері передавача, а в регістрі dx загальний розмір буфера передавача
_s_count PROC FAR
push bp
mov bp,sp
push si
pushf
push si
mov si,CURRENT_AREA
mov ax,0
mov dx,S_SIZE
test installed[si],1
jz exit_s_count
mov ax,S_SIZE
sub ax,size_s_data[si]
exit_s_count:
pop si
popf
pop si
mov sp,bp
pop bp
ret
_s_count ENDP
; помістити символ у буфер передавача
; [bp+6] — символ
_send_com PROC FAR
push bp
mov bp,sp
push si
mov al,[bp+6]
pushf
push ax
push bx
push dx
push si
mov si,CURRENT_AREA
test installed[si],1
jz exit_send_com
cmp size_s_data[si],S_SIZE
jl no_s_EOVFLOW
; відбулося переповнення буфера передавача
inc WORD PTR EOVFLOW[si]
jmp short exit_send_com
no_s_EOVFLOW:
mov bx,end_s_data[si]
mov send_buf[si][bx],al
inc bx
cmp bx,S_SIZE
jl no_send_ptr_max
mov bx,0
no_send_ptr_max:
mov end_s_data[si],bx
inc size_s_data[si]
; зчитуємо регістр керування перериваннями
mov dx,IER[si]
in al,dx
; завершуємо функцію якщо дозволені переривання після передачі байта
test al,2
jnz exit_send_com
; дозволяємо переривання після передачі байта, після прииема байта,
; при виявленні стану «BREAK» і при виникненні помилки
mov al,7
out dx,al
exit_send_com:
pop si
pop dx
pop bx
pop ax
popf
pop si
mov sp,bp продолжение
--PAGE_BREAK--
pop bp
ret
_send_com ENDP
; передаємо вилученому модему сигнал «BREAK»
_break_com PROC FAR
push bp
mov bp,sp
push si
pushf
push ax
push cx
push dx
mov si,CURRENT_AREA
test installed[si],1
jz exit_break_com
; передаємо сигнал «BREAK»
mov dx,LCR[si]
in al,dx
jmp $+2
or al,40h
out dx,al
mov cx,0C000h
do_BREAK:
loop do_BREAK
and al,0BFh
out dx,al
exit_break_com:
pop dx
pop cx
pop ax
popf
pop si
mov sp,bp
pop bp
ret
_break_com ENDP
; повертаємо в dx:ax покажчик на лічильники помилок
_com_errors PROC FAR
push bp
mov bp,sp
mov ax,OFFSET DGROUP:CURRENT_AREA
add ax,error_block
mov dx,ds
mov sp,bp
pop bp
ret
_com_errors ENDP
; заповнюємо лічильники помилок
set_err PROC NEAR
test al,2
jz test1
inc WORD PTR EOVRUN[si]
test1:
test al,4
jz test2
inc WORD PTR EPARITY[si]
test2:
test al,8
jz test3
inc WORD PTR EFRAME[si]
test3:
test al,16
jz exit_set_err
inc WORD PTR EBREAK[si]
exit_set_err:
ret
set_err ENDP
; протокол модему для передачі даних
modem_protocol PROC NEAR
cmp device_conn[si],'M'
jne no_modem
; установлюємо сигнали DTR, RTS і OUT2
mov dx,MCR[si]
mov al,00001011B
out dx,al
jmp $+2
; очікуємо поки модем відповість про готовність сигналом DSR
mov cx,1000
mov dx,MSR[si]
wait_dsr:
in al,dx
test al,20H продолжение
--PAGE_BREAK--
jnz test_cts
loop wait_dsr
; модем не відповів сигналом DSR
inc WORD PTR EDSR[si]
jmp short no_modem
test_cts:
; очікуємо поки модем відповість про готовність сигналом CTS
mov cx,1000
wait_cts:
in al,dx
test al,10H
jnz test_lcr
loop wait_cts
; модем не відповів сигналом CTS
inc WORD PTR ECTS[si]
test_lcr:
no_modem:
; чи перевіряємо порожній регситр збереження передавача
mov dx,LSR[si]
in al,dx
test al,20H
jnz s_reg_empty
; помилка при передачі
inc WORD PTR EXMIT[si]
s_reg_empty:
ret
modem_protocol ENDP
; оброблювач переривань від COM1
int_hndlr1 PROC FAR
push si
mov si,OFFSET DGROUP:AREA1
jmp short handle_int
; оброблювач переривань від COM2
int_hndlr2 PROC FAR
push si
mov si,OFFSET DGROUP:AREA2
jmp short handle_int
; оброблювач переривань від COM3
int_hndlr3 PROC FAR
push si; SAVE si
mov si,OFFSET DGROUP:AREA3
jmp short handle_int
;
; оброблювач переривань від COM4
int_hndlr4 PROC FAR
push si; SAVE si
mov si,OFFSET DGROUP:AREA4
;
; оброблювач переривань
handle_int:
push ax
push bx
push cx
push dx
push bp
push di
push ds
push es
mov ax,DGROUP
mov ds,ax
next_pr:
; передаємо контролеру переривань команду кінця обробки
; переривання
mov dx,OCR
mov al,eoi[si]
out dx,al
next_inter:
; зчитуємо значення регістра ідентифікації переривання
mov dx,IIR[si]
in al,dx
; визначаємо причину переривання
; виявлено сотояние «BREAK» чи відбулася помилка
cmp al,0
je MSTAT_int
; дані прийняті і доступні для читання
cmp al,4
je RX_int
; буфер передавача порожній
cmp al,2
je TX_int
; змінився стан ліній CTS, RI, DCD, DSR продолжение
--PAGE_BREAK--
cmp al,6
je LSTAT_int
; завершуємо обробку переривань
jmp FAR PTR exit_handler
LSTAT_int:
; зчитуємо регістр стану лінії і викликаємо функцію
; set_err, що визначить причину переривання
mov dx,LSR[si]
in al,dx
mov al,0FFh
mov RING[si],al
call set_err
jmp next_inter
MSTAT_int:
; зчитуємо регістр стану модему
mov dx,MSR[si]
in al,dx
mov al,0FFh
mov RING[si],al
jmp next_inter
TX_int:
; дивимося їсти чи дані для передачі модему
cmp size_s_data[si],0
jg have_data_for_send
; якщо буфер передавача порожній переустановлюємо регістр
; керування перериваннями
mov dx,IER[si]
mov al,0Dh
out dx,al
jmp next_inter
have_data_for_send:
; передаємо символ модему відповідно до стану
; ліній RS-232-З
call modem_protocol
; передаємо черговий символ з буфера передавача
mov bx,start_s_data[si]
mov al,send_buf[si][bx]
mov dx,DATREG[si]
out dx,al
inc bx
cmp bx,S_SIZE
jb ptr_no_max
mov bx,0
ptr_no_max:
mov start_s_data[si],bx
dec size_s_data[si]
jmp next_inter
; дані прийняті і доступні для читання
RX_int:
; зчитуємо прийнятий байти із регістра даних UART
mov dx,DATREG[si]
in al,dx
cmp size_r_data[si],R_SIZE
jl no_r_EOVFLOW
; буфер приймача переповнений, збільшуємо відповідний
; лічильник помилок
inc WORD PTR EOVFLOW[si]
jmp next_inter
no_r_EOVFLOW:
mov bx,end_r_data[si]
mov reciave_buf[si][bx],al
inc size_r_data[si]
inc bx
cmp bx,R_SIZE
jb no_max_r_ptr
mov bx,0
no_max_r_ptr:
mov end_r_data[si],bx
jmp next_inter
exit_handler:
mov al,20h
out 20h,al
pop es
pop ds
pop di
pop bp
pop dx
pop cx
pop bx
pop ax
pop si
iret
int_hndlr4 ENDP
int_hndlr3 ENDP
int_hndlr2 ENDP
int_hndlr1 ENDP
COM_TEXT ENDS
END