Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Мета роботи






Затверджено

на засіданні кафедри

“Системи автоматизації проектування”

Протокол № 1 від 31.08.2010 р.

Львів – 2010

 

Програмування послідовного інтерфейсу: Методичні вказівки до лабораторної роботи з курсу “Системне програмування та операційні системи” для студентів базового напрямку 6.0804 “Комп’ютерні науки”.

/ Укл.: В.В. Мазур. – Львів: Видавництво Національного університету “Львівська політехніка”, 2010. - 17 с.

 

Укладач Мазур В.В., канд, техн, наук, доц.

 

 

Відповідальний за випуск Ткаченко С.П., канд, техн. наук, доц.

 

 

Рецензент Каркульовський В.І., канд. техн.наук., доц.

 

 

МЕТА РОБОТИ

Мета роботи – засвоїти основи організації обміну інформацією між ЕОМ і отримати практичнi навики програмування вводу-виводу через послідовний інтерфейс.

 

2. КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ

 

2.1. Доступ до послідовного порту

При асинхронному зв'язку машина посилає або приймає байти інформації порціями по одному біту. Тимчасові інтервали між байтами при цьому несуттєві, але дуже важливі інтервали між окремими бітами байта. Сигнал на лінії може бути високого або низького рівня, що відповідає логічним нулю і одиниці, і кажуть, що лінія відмічена (marking), коли рівень високий, і пуста (spacing), коли рівень низький.

Лінія підтримується у відміченому стані, коли по ній не передають даних. При початку передачі байта даних сигнал падає у 0, відмічаючи стартовий біт. Потім слідують вісім бітів даних (іноді менше) у вигляді набору високих і низьких рівнів. Останній біт даних може супроводжуватися бітом парності, що використовується для виявлення помилок, а потім у послідовність включаються 1 або більше стоп-біти, яким відповідає високий рівень. Ці стоп-біти починають відмічений стан, який буде зберігатися доти, поки не почнеться передача наступного байта даних; число стоп-бітів суттєве, оскільки вони встановлюють мінімальний час, який повиннен пройти перед наступним стартовим бітом. На рис. 1. показана ця послідовність.

Звичайно, передаюча і приймальна станції повинні застосовувати один і той же протокол для ланцюжків бітів і працювати з однією і тією ж швидкістю обміну (що вимірюється у бітах за секунду, які також називаються бодами). При обміні можуть легко виникати помилки, тому комунікаційне обладнання надає різносторонню інформацію про статус як самого порту, так і про приєднаного до нього модему. Задачею модему є перетворення сигналу, що генерується портом комунікації, в акустичний сигнал, який може потім бути переданий по телефонному каналу. Більшість модемів надає також додаткові комунікаційні можливості, такі, як автоматичний виклик і відповідь, які не підтримуються самим портом комунікації.

 
 


Рис.1. Передача одного байта послідовних даних

2.2. Програмування мікросхеми UART 8250

Послідовний зв'язок настільки складний, що були розроблені спеціальні мікросхеми, що виконують роботу по формуванню і синхронізації рядків бітів, що складають послідовні дані. Такі мікросхеми називають універсальним асинхронним приймачем-передавачем ( universal asynchronous receiver transmitter або UART). IBM PC використовує UART 8250 фірми Intel.

Операційна система підтримує 2 порти комунікації, тому в машині є 2 мікросхеми. Їх базові адреси зберігаються в комірках 0040: 0000 для СОМ1 і 0040: 0002 для COM2. (Базова адреса - це двобайтова адреса порту, яка є молодша із групи адрес портів, що дають доступ до UART.) На всіх машинах, крім PCjr, COM1 має базову адресу 3F8H, а COM2 - 2F8H; PCjr має свій внутрішній модем за адресою 3F8H, а COM1 - за адресою 2F8H. Для зручності ми надалі будемо завжди нумерувати регістри 3FxH, але все сказане в рівній мірі можна застосовувати і до регістрів 2FxH.

Мікросхема 8250 має 10 програмованих однобайтових регістрів, за допомогою яких керується і контролюється порт комунікації. Більшість з них займається ініціалізацією порту, процесом, в якому виникає багато ускладнень. Доступ до цих 10 регістрів здійснюється через сім адрес портів з номерами 3F8H - 3FEH (або 2F8H - 2FEH). У п'яти випадках регістр, до якого отримуємо доступ через даний порт, залежить від того, як встановлений біт 7 в регістрі контролю лінії, який є єдиним регістром з адресою порту 3FBH. Ось ці регістри:

 

3F8H (OUT, біт 7 = 0 в 3FBH) Регістр зберігання передавача

3F8H (IN, біт 7 = 0 в 3FBH) Регістр даних приймача

3F8H (OUT, біт 7 = 1 в 3FBH) Дільник швидкості обміну (молодший)

3F9H (IN, біт 7 = 1 в 3FBH) Дільник швидкості обміну (старший)

3F9H (OUT, біт 7 = 0 в 3FBH) Регістр дозволу переривання

3FAH (IN) Регістр ідентифікації переривання

3FBH (OUT) Регістр управління лінії

3FCH (OUT) Регістр управління модемом

3FDH (IN) Регістр статусу лінії

3FEH(IN) Регістр статусу модему


Із десяти регістрів тільки шість необхідні для простого послідовного зв'язку. Регістр зберігання передавача містить байт даних, які будуть надіслані [6.], а регістр даних приймача - останній отрийнятий байт даних [7.]. Регістри управління і статусу лінії ініціалізують і управляють лінією зв'язку, використовуючи швидкість обміну, що міститься у двох регістрах дільника швидкості обміну [2.]. З чотирьох регістрів, що залишилися, регістри управління і статусу модему необхідні тільки для зв'язку через модем [5.], а два регістри, пов'язаних з перериваннями - тільки в процедурах, керованих перериваннями [8. ].

Переривання при зв'язку використовують в цілях ефективності. Звичайна комунікаційна процедура безперервно перевіряє регістр статусу лінії, чекаючи символа, що вводиться або вказівки, що все готове для передачі наступного байта даних. Оскільки процесор працює дуже швидко, в порівнянні із звичайними швидкостями, з якими передаються послідовні дані, то цей метод марно витрачає процесорний час, який може використовуватися для обробки даних, що поступають або передаються. З цієї причини мікросхема 8250 може бути встановлена в режим, що спричиняє переривання при появі символа, виникненні помилки і т.п. Це переривання вмить викличе процедуру вашої програми, яка, скажемо, буде передавати наступний символ з комунікаційного буфера.

2.3. Ініціалізація послідовного порту

При ініціалізації (" відкритті") порту комунікації встановлюються всі його параметри. Ці параметри включають в себе довжину слова, число стоп-бітів, установку парності і швидкість обміну. Довжина слова - це число бітів, яке утворює основну одиницю даних. Хоч зазвичай працюють з порціями по 8 біт, але для стандартних файлів ASCII (в яких всі символи мають коди, що не перевищують ASCII 128) досить 7 біт, а для передачі числових даних - всього 4 біт.

Середній рівень

Функція 0 переривання 14Н BIOS ініціалізує порт комунікації. У DX повинен знаходитися номер комунікаційного каналу (COM1 = 0, COM2 = 1). У AL повинен міститися байт, що ініціалізує дані, значення бітів якого може бути наступним:

біти 1-0 довжина слова. 10 = 7 біт, 11 = 8 біт

2 число стоп-бітів. 0 = 1, 1 =2

4-3 парність. 00 або 10 = немає, 01 = непарн., 11 = парн.

7-5 швидкість обміну.

000 = 110 бод

001 = 150 бод

010 = 300 бод

011 = 600 бод

100 = 1200 бод

101 = 2400 бод

110 = 4800 бод

111 = 9600 бод

У даному прикладі порт ініціалізується зі словом, рівним 8 бітам, одним стоп-бітом і парною парністю. Швидкість обміну -1200 бод.

; присвоюємо значення параметрів змінним

MOV WORDLENGTH, 00000011В; довжина слова 8 біт

MOV STOPBITS, 00000000B; 1 стоп-біт

MOV PARITY, 00011000В; парна парність

MOV BAUDRATE, 10000000В; швидкість 1200 бод

; ініціалізувати СОМ1

MOV AL, 0; очищаємо AL

OR AL, WORDLENGTH; встановлюємо потрібні біти

OR AL, STOPBITS

OR AL, PARITY

OR AL, BAUDRATE

MOV AH, 0; функція ініціалізації порту

MOV DX, 0; вибераємо СОМ1

INT 14H; ініціалізувати порт

Низький рівень

Незалежно від того, займаємося ми вводом або виводом, як мінімум, 4 регістри мікросхеми 8250 повинні бути ініціалізованими для операцій обміну. Це регістри дільника швидкості обміну, регістр контролю лінії і регістр дозволу переривання.

Ініціалізація швидкості обміну. Дільник швидкості обміну – це число, на яке треба розділити частоту системних годин (1190000 Гц), щоб отримати бажану швидкість обміну. Наприклад, для швидкості обміну 1200 бод дільник швидкості обміну повинен бути рівний 96, оскільки 1190000/96 приблизно дорівнює 1200. Чим більший дільник, тим менша швидкість обміну. Швидкість обміну 300 бод і менше вимагає двобайтового числа для дільника. Старший байт посилається в 3F9H (або 2F9H), а молодший - в 3F8H (2F8H). У обох випадках біт 7 регістра управління лінії повинен бути встановлений в 1 перед засиланням значення, в іншому випадку за цими двома адресами значення будуть адресовані в інші регістри. Ось деякі значення, необхідні для звичайних швидкостей обміну:

Швидкість обміну 3F9H 3F8H
  04H 17H
  01H 80H
  00H C0H
  00H 60H
  00H 40H
  00H 30H
  00H 20H
  00H 18H
  00H 0CH

 

Завжди встановлюйте регістри швидкості обміну першими, оскільки вони єдині, які вимагають установки біта 7 в регістрі контролю лінії. Після цього треба змінити вміст регістра контролю лінії, скидаючи біт 7, щоб всі інші доступи до регістрів були правильними. Оскільки регістр контролю лінії є регістром тільки для запису, то немає способу повернути біт 7 назад в 1 без одночасної установки всіх інших бітів цього регістра. Зазначимо, що PCjr використовує інших дільників, опис яких ви можете знайти в технічному керівництві.

Ініціалізація регістра контролю лінії. Значення бітів регістра контролю лінії, адреса порту якого рівна 3FBH (або 2FBH), можуть бути наступними:

бити 1-0 довжина символа: 00 = 5 біт, 01=6 біт, 10=7 біт, 11=8 біт

2 число стоп-бітів: 0 = 1, 1 = 1, 5, якщо довжина символів рівна п'яти, інакше - 2

3 парність: 1 = генерується біт парності, 0 = немає

4 тип парності: 0 = непарна, 1 = парна

5 фіксація парності: примушує біт парності завжди бути 0 або 1.

0 = відмінена

1 = завжди 1, якщо біт 3 = 1 & біт 4=0

або 1 = завжди 0, якщо біт 3 = 1 & біт 4 = 1 або

1 = немає парності, якщо біт 3 = 0

6 установка перерви: Викликає виведення строки нулів як сигнал віддаленої станції.

0 = заборонено, 1 = перерва

7 міняє адреси портів інших регістрів

Зазвичай биті 5-7 скинені в 0. Інші описують значення, що визначаються протоколом обміну.

Регістр дозволу переривання. Навіть якщо ви не використовуєте переривання, все одно треба зробити запис в регістр дозволу переривання, щоб бути упевненим, що переривання заборонені. Просто вмістіть в цей регістр 0. Регистр ідентифікації переривання можна ігнорувати.

Ініціалізація інших регістрів пов'язана з модемами. Ясно, що модеми потрібні тільки для зв'язку з віддаленими пристроями, а не для управління сусідніми, такими, як послідовний принтер. У [5] пояснено, як ініціалізувати регістр контролю модему.

У наступному прикладі з області даних BIOS береться базова адреса СОМ1, після чого різні регістри ініціалізуються для швидкості обміну 1200 бод, семибітових даних, парної парності і одного стоп-біта.

; отримуємо базову адресу СОМ1

MOV AX, 40H; ES вказує на область даних BIOS

MOV ES, AX

MOV DX, ES: [0]; отримуємо базову адресу СОМ 1

; ініціалізувати регістри дільника швидкості обміну на 1200 бод

ADD DX, 3; вказуємо на регістр контролю лінії

MOV AL, 10000000В; встановлюємо біт 7

OUT DX, AL; посилаємо байт

DEC DX; вказуємо на старший байт дільника

DEC DX; швидкості обміну

MOV AL, 0; старший байт для 1200 бод

OUT DX, AL; посилаємо старший байт для 1200 бод

DEC DX; вказуємо на молодший байт дільника

MOV AL, 60H; молодший байт дільника для 1200 бод

OUT DX, AL; посилаємо молодший байт

; ініціалізувати регістр контролю лінії

MOV AL, 0; обнулюємо AL

OR AL, 10B; довжина даних 7 біт

OR AL, 000B; 1 стоп-біт

OR AL, 1000B; генерується біт парності

OR AL, 10000B; парна парність

ADD DX, 3; вказуємо на регістр контролю лінії

OUT DX, AL; посилаємо значення ініціалізації

; ініціалізувати регістр дозволу переривання

DEC DX; вказуємо на регістр дозволу

DEC DX; переривання

MOV AL, 0; забороняємо переривання

OUT DX, AL; посилаємо байт

2.4. Установка поточного комунікаційного порту

Є два способи, за допомогою яких програма може визначити, який з комунікаційних портів повинен використовуватися. Один з них – вказівка номера каналу в операторі програми. Другий спосіб – написання програми для обміну через порт СОМ1, але зміна комунікаційного адаптера, доступ до якого йде через СОМ 1.

Область даних BIOS містить місце для чотирьох двобайтовий змінних, в яких знаходяться базові адреси комунікаційних каналів (MS-DOS підтримує тільки перші два з них). Базова адреса порту - це молодша з групи адрес портів, через які можна отримати доступ до даного комунікаційного каналу. Базова адреса для СОМ1 зберігається в комірці 0040: 0000, а для COM2 - в комірці 0040: 0002. Для зміни комунікаційних портів треба просто поміняти ці два значення.

Середній рівень

Якщо програма звертається до комунікаційного порту через переривання 14Н BIOS, то СОМ-порт визначається в DX, що дорівнює 0 або 1 (для СОМ1 або COM2). Замість того щоб присвоювати DX безпосереднє значення, заповнюйте його зі змінної, якій може бути присвоєне значення 0 або 1. Программи, які використовують комунікаційні функції 3 і 4 переривання 21Н, завжди адресуються до СОМ1. У цьому випадку треба поміняти базові адреси:

; обмін базових адрес для СОМ1 і COM2

MOV AX, 40H; ES вказує на область даних BIOS

MOV ES, AX

MOV DX, ES: [0]; поміщуємо 1-у базову адресу в DX

MOV AX, ES: [2]; поміщуємо 2-у базову адресу в AX

MOV ES: [0], АХ; обмінюємо адреси

MOV ES: [2], DX

 

2.5. Визначення статусу комунікаційного порту

Регістр статусу лінії мікросхеми UART 8250 визначає протокол зв'язку. Цей регістр має адресу порту на 5 більшу, ніж базова адреса даного каналу. Звичайно він постійно переглядається в процесі комунікаційного обміну. При передачі даних регістр повідомляє, що попередній символ вже посланий, дозволяючи програмі записати новий символ. При прийомі даних регістр інформує програму про надходження наступного символа, з тим щоб програма могла прочитати його перед тим, як він буде знищений наступним прибулим. Значення бітів цього регістра наступні:

біт: 0 1 = байт даних отриманий

1 1 = отримані дані були перезаписані (попередній символ не був вчасно прочитаний)

2 1 = помилка парності (ймовірно, через шум в лінії)

3 1 = помилка оточення (передача не синхронізована)

4 1 = виявлена перерва (отриманий довгий рядок одиниць, який відображає, що інша станція запитує кінець передачі)

5 1 = регістр збереження передавача пустий (в цей регістр повинні вміщуватися дані, що передаються)

6 1 = регістр зсуву передавача пустий (цей регістр отримує дані з регістра зберігання і перетворює їх в послідовний вид)

7 1 = тайм-аут (пристрій не зв'язаний з машиною)

Середній рівень

Функція 3 переривання 14Н BIOS повертає в АН регістр статусу лінії (AL отримує регістр статусу модему [5]). При вході DX повинен містити номер комунікаційного порту, до якого здійснюється доступ, де СОМ1 = 0, а COM2 = 1. Перевіряється наявність перерви:

MOV AH, 3; номер функції

MOV DX, 1; вибираємо COM2

INT 14H; отримуємо байт статусу

TEST AH, 10000В; виявлена перерва?

JNZ BREAK_DETECT; якщо так, то переходимо до процедури обробки

Низький рівень

З області даних BIOS прочитується базова адреса комунікаційного каналу, до нього додається 5, а потім з отриманої адреси порту прочитується байт статусу.

MOV AX, 40H; ES вказує на область даних BIOS

MOV ES, AX

MOV DX, ES: [2]; отримуємо базову адресу COM2

ADD DX, 5; додаємо 5 для регістра статусу

IN AL, DX; отримуємо байт статусу

TEST AL, 10000B; біт 5 встановлений?

JNZBREAK_DETECT; якщо так, то переходимо до обробки перерви

2.6. Ініціалізація і управління модемом

Є 6 ліній, по яких модеми зв'язуються з комп'ютером (вдосконалені моделі можуть мати додаткові лінії по інтерфейсу RS232). Ось їх назви, скорочення і функцій:

Від комп'ютера до модему

Data Terminal Ready (DTR)Інформує модем, що комп'ютер включений і готовий до зв'язку

(готовність комп'ютера)

Request To Send (RTS) Інформує модем, що комп'ютер чекає посилання даних

(запит на посилку)

Від модему до комп'ютера

Data Set Ready (DSR) Інформує комп'ютер, що модем включений і готовий

(готовність модему)

Clear To Send (CTS) Інформує комп'ютер, що модем готовий почати передачу даних

(готовність до посилки)

Data Carrier Detect (DCD) Інформує комп'ютер, що модем пов'язаний з іншим модемом

(виявлений носій даних)

Ring Indicator (RI) Інформує комп'ютер, що телефонна лінія, до якої приєднаний (індикатор дзвінка) модем, має дзвінок

Спочатку комп'ютер встановлює сигнал DTR, а потім інструктує модем зв'язатися з віддаленою станцією. Після того як модем встановив зв'язок, він встановлює сигнал DSR. Цей сигнал інформує комп'ютер, що модем готовий до зв'язку і в цей момент комп'ютер може встановити сигнал RTS. І якщо модем відповість сигналом CTS, почнеться передача.

Дві стандартні лінії, по яких комп'ютер управляє модемом, доступні через регістр контролю модему мікросхеми UART 8250. Цей регістр має адресу порту на 4 більшу, ніж базова адреса комунікаційного каналу, що використовується. Значення його бітів такі:

Регістр контролю модему

біти 7-5 (завжди 0)

4 1 = вихід UART замкнутий на вхід

3 додатковий користувач призначений на вихід #2

2 додатковий користувач призначений на вихід #1

1 1 = " запит на посилку" активний

0 1 = " готовність комп'ютера" активна

Зазвичай биті 0 і 1 регістра контролю модему встановлені, а інші - рівні 0. Біт 2 рівний 0, за винятком випадків, коли виробник модему призначив його для спеціальних потреб. Біт 3 встановлений тільки у випадку, коли використовуються переривання [8]. Нарешті, біт 4 надає можливість тестування комунікаційних програм без встановлення реального зв'язку. Вихідний сигнал мікросхеми UART подається на вхід, ніби UART приймає послідовні дані. Цю властивість можна застосовувати для тестування правильності роботи самої мікросхеми. Однак при використанні комунікаційних процедур переривання 14Н BIOS вона недоступне.

Чотири лінії, по яких модем посилає інформацію комп'ютеру, керуються регістром статусу модему. Цей регістр розташований за адресою порту на 6 більшою, ніж базова адреса комунікаційного адаптера, що використовується. Ось значення його бітів:

Регістр статусу модему

біт 7 1 = DCD

6 1 = RI

5 1 = DSR

4 1 = CTS

3 1 = зміна в DCD

2 1 = зміна в RI

1 1 = зміна в DSR

0 1 = зміна в CTS

Програма безперервно перевіряє ці біти в ході комунікаційних операцій. Зазначимо, що 4 молодших біта паралельні старшим чотирьом бітам. Ці біти встановлюються в 1 тільки тоді, коли відбувається зміна в статусі відповідного старшого біта з моменту, коли регістр читався останній раз. Всі 4 молодших біта автоматично скидаються при читанні регістра. Програми будь-якого рівня можуть безпосередньо читати цей регістр. Іншою можливістю є використання функції 3 переривання 14Н BIOS, яка повертає регістр статусу модему в AL (при цьому в AH буде міститися регістр статусу лінії). При вході DX повинен містити номер комунікаційного каналу (0 або 1).

Багато які модеми мають значно більше можливостей в порівнянні з тими, що відображені в двох пов'язаних з модемом регістрах. Є можливості автоматичного зв'язку і автоматичної відповіді, які контролюються керуючим рядком. Цей рядок посилається в модем у вигляді звичайних даних. Модем виділяє керуючий рядок з даних по спеціальному символу, що використовується тільки для вказівки початку керуючого рядка. Цей символ може бути попередньо визначений (часто використовується код Esc - ASCII 27) або вибираним користувачем. Модем здатний визначити, наскільки довгим повиннен бути кожний рядок, тому по закінченні рядка він знову розглядає вхідний потік інформації як дані. Кожний модем має свій набір команд. Як приклад розглянемо команди, що використовуються внутрішнім модемом PCjr:

 

Символ Значення Застосування
А відповідь вхід в режим відповіді
Bn перерва посилає сигнал перерви n × 100 мс
Cn відлік n відлічує n дзвінків до відповіді
Dn...n виклик посилає рядок чисел n...n
Fn формат встановлює протокол зв'язку
Н розрив припиняє зв'язок з машиною
I ініціалізація ініціалізувати модем
LR довга відповідь міняє кодову систему, що використовується
М режим модем приймає символи як дані
Nn новий міняє командний символ на n
O originate вхід в режим originate
Р pick-up вхід в режим голосу
Q запит запит статусу модему
R повтор повторити команду зв'язку
Sn швидкість вибір швидкості обміну
Tn...n прозорість ігнорувати керуючі рядки в наступних n...n байтах
V голос перевести модем в режим голосу
W очікування нічого не робити до наступної команди
X передати передача тону виклику
Z тест проводить діагностику обладнання

У відповідь на команду запиту модем видає інформацію про свій стан, посилаючи її в UART як звичайні дані. Крім іншої інформації може повідомлятися, що лінія зайнята. Щоб правильно використати команди управління модемом і інформацію про його статус, треба ретельно вивчити документацію на даний модем. Модем PCjr описаний в технічному керівництві по PCjr. Приведений нижче приклад дають тільки загальну схему встановлення зв'язку через модем.

 

Низький рівень

Схема зв'язку через модем на мові асемблер виглядає так:

; встановлюємо сигнал DTR

MOV DX, BASADR; починаємо з базової адреси

ADD DX, 4; вказуємо на регістр контролю модему

MOV AL, 1; встановлюємо біт 1

OUT DX, AL; посилаємо в порт

; посилаємо керуючий рядок модему для виклику

.

(цей код різний для різних типів модемів)

.

; чекаємо поки буде встановлений сигнал DSR

INC DX; вказуємо на регістр статусу модему

INC DX

TRYAG: IN AL, DX; отримуємо вміст

TEST AL, 10B; перевіряємо другий біт

JZ TRYAG; чекаємо поки він не буде рівний 1

; встановлюємо біт RTS

DEC DX; повертаємося до регістра управління

DEC DX

MOV AL, 3; встановлюємо сигнал RTS

OUT DX, AL; посилаємо в порт

; чекаємо сигналу CTS

INC DX; повертаємося до регістра статусу

INC DX

ON_MO: IN AL, DX; отримуємо байт статусу

TEST AL, 1; перевіряємо біт CTS

JZ ON_МО; не продовжуємо, поки він не встановлений

; тепер можна посилати дані

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.