Современные аппаратные средства связи микроконтроллера с компьютером по интерфейсу RS-232. Часть 2

№ 4’2006
Как видим, для формирования сигнала RST используется приемник RS-232 (13-12 выводы преобразователя ADM3202), на вход которого подается сигнал с линии DTR, а для формирования сигнала PSEN — коммутатор DG419, на вход управления которого (6-й вывод) подается сигнал с линии RTS.

Все статьи цикла:

1.3.5. Сопряжение микроконтроллеров семейства MSC12XX с компьютером

На рис. 9 показана схема сопряжения микроконтроллеров семейства MSC12XX с компьютером по интерфейсу RS-232 для ISP и штатного режима работы.

Рис. 9. Схема сопряжения микроконтроллеров семейства MSC12XX с компьютером по интерфейсу RS-232 для программирования в режиме ISP и штатного режима работы
Рис. 9. Схема сопряжения микроконтроллеров семейства MSC12XX с компьютером по интерфейсу RS-232 для программирования в режиме ISP и штатного режима работы

Как видим, для формирования сигнала RST используется приемник RS-232 (13-12 выводы преобразователя ADM3202), на вход которого подается сигнал с линии DTR, а для формирования сигнала PSEN — коммутатор DG419, на вход управления которого (6-й вывод) подается сигнал с линии RTS. Сравнив схемы формирования сигналов RST и PSEN на рис. 9 c ранее обсуждавшимися схемами (рис. 5а и рис. 6а и б), можно заметить, что они идентичны.

Обмен сигналами платы с линиями интерфейса RS-232 осуществляется через разъем IDC10P (X1).

На плате предусмотрен 2-контактный разъем (P1), на который подается внешнее питание +3,3 В. Для индикации включения питания можно использовать светодиод (LD1 и R5).

Для работы микроконтроллера используется кварцевый резонатор Z1, снабженный двумя конденсаторами C6 и C7. Вывод EA микроконтроллера установлен в высокий уровень с помощью резистора R4.

Схема, приведенная на рис. 9, достаточно проста. На ней можно заметить еще один 6-контактный разъем IDC6P (X2), к которому подключены источник питания +3,3 В, «земля» и четыре сигнала: VddT, RSTT, PDA и PCL, которые подаются на разъем соответственно с выводов P1.0, P1.1, P1.2 и P1.3 микроконтроллера. Этот разъем и соответствующие сигналы предназначены для программирования микроконтроллеров семейства P89LPC9XX в режиме внутрисхемного программирования (ICP) с помощью микроконтроллера MSC1210. Более подробно мы разберем эту возможность далее (п. 1.3.6).

На рис. 10 приведена фотография платы, на которой вручную смакетирована схема (рис. 9).

Рис. 10. Фотография макетной платы схемы сопряжения для микроконтроллера MSC1210. Верхняя стрелка указывает на разъем IDC6 (для подключения кабеля сопряжения с платой ICP микроконтроллеров P89LPC9XX), нижняя указывает на панельку PGA64 (для установки платы-переходника с микроконтроллером ADUC8XX)
Рис. 10. Фотография макетной платы схемы сопряжения для микроконтроллера MSC1210. Верхняя стрелка указывает на разъем IDC6 (для подключения кабеля сопряжения с платой ICP микроконтроллеров P89LPC9XX), нижняя указывает на панельку PGA64 (для установки платы-переходника с микроконтроллером ADUC8XX)

Микроконтроллер MSC1210 распаен на плате-переходнике, которая вставлена в панельку PGA64 (вариант разводки переходника приведен в книге автора [1], a внешний вид платы — на рис. 11). Забегая немного вперед, отметим, что на (рис. 10) можно увидеть еще одну панельку PGA64 (показанную нижней стрелкой), в которую вставляется плата-переходник с микроконтроллером ADUC847[2]. Разъем IDC6 (X2 на рис. 9) показан здесь верхней стрелкой.

Рис. 11. Фотография платы&переходника для микроконтроллера MSC1210 (корпус TQFP64)
Рис. 11. Фотография платы&переходника для микроконтроллера MSC1210 (корпус TQFP64)

1.3.6. Сопряжение микроконтроллеров семейств P89LPC9XX с компьютером

Семейство микроконтроллеров P89LPC9XX было разработано всего 3 года назад (2002—2003 г.) и продолжает пополняться новыми микросхемами. Некоторые из микроконтроллеров семейства (например, P89LPC93XX) имеют две возможности внутрисистемного программирования (In-System-Programming-ISP): первая — по интерфейсу RS-232 (называемая в описании собственно ISP), вторая по синхронному 2-проводному скоростному последовательному интерфейсу типа C2. В описании для избежания путаницы программирование по этому интерфейсу называют ICP — In-Circuit-Programming (внутрисхемное программирование). Этот интерфейс состоит всего из двух сигналов: PDA — DATA (данные — входные и выходные) и PCL — CLock (синхросигнал, стробирующий данные). Этот интерфейс чем-то напоминает интерфейс SPI — разница в том, что в SPI входные (MISO) и выходные (MOSI) данные «разнесены» — и в точности соответствует синхронному режиму работы UART 51-совместимого микроконтроллера. Такой интерфейс (C2) имеют все микроконтроллеры семейства P89LPC9XX (кроме P89LPC932). Справедливости ради отметим, что микроконтроллеры семейств MSC12XX тоже снабжены подобным интерфейсом, но информация о нем закрыта и предназначена для коммерческих эмуляторов-программаторов. Такой же интерфейс имеют некоторые микроконтроллеры C8051FXX (например, C8051F330) от Silicon Laboratories (информация открыта). Программирование некоторых «маленьких» (8-выводных) микроконтроллеров Philips (P89LPC90X) возможно только в режиме ICP (то есть исключительно по интерфейсу C2). И хотя подобный интерфейс никак непосредственно не связан с интерфейсом RS-232, автор счел необходимым привести пример программирования микроконтроллеров P89LPC9XX в режиме ICP по нескольким причинам.

Во-первых, хотя микроконтроллеры семейств P89LPC90X и «маленькие», они обладают уникальными свойствами, среди которых очень высокое быстродействие (1–2 такта на цикл); встроенный 10-разрядный АЦП (P89LPC904); встроенный 24-разрядный системный таймер; выходной сигнал с порта можно настроить на три типа выхода: стандартный, двухтактный (пушпульный) и с открытым стоком; кроме того, это семейство микроконтроллеров отличается крошечными размерами (в SOIC-корпусах) и потребляет крайне мало энергии (буквы LP — Low Power в названии микроконтроллера отражают это свойство).

Во-вторых, более мощные микроконтроллеры семейства P89LPC9XX, помимо интерфейса RS-232—для ISP, имеют такoй же интерфейс (C2), и по нему тоже можно запрограммировать микроконтроллер, тем более, что в данном случае возможности программирования в режиме ICP гораздо шире, чем в режиме ISP (см. описание на ICP и ISP для микроконтроллеров семейств P89LPC9XX).

В-третьих (и это основная причина), на примере программирования устройств семейства P89LPC9XX в режиме ICP с помощью микроконтроллера, сопряженного с компьютером по интерфейсу RS-232 (например, того же P89LPC938 или MSC1210), автором будут продемонстрированы практические свойства нового алгоритма обмена по интерфейсу RS-232.

Этот алгоритм разработан автором и приведен в уже упоминавшейся книгe [1]. Его основное свойство заключается в синхронизации каждого байта аппаратным способом, но не с помощью линий квитирования DTRDSR или RTS-CTS (стандартный аппаратный способ), а с помощью линий данных TxD и RxD. В отличие от известного программного способа синхронизации XON-XOFF (он также производится с помощью линий данных TxD и RxD), аппаратный способ синхронизации обладает несомненным преимуществом. Это преимущество заключается в высокой надежности обмена, что особенно важно на больших скоростях (например, 115 200 бод). Недостаток стандартного аппаратного способа синхронизации обмена по интерфейсу RS-232 заключается в необходимости использования самих линий квитирования (DTR-DSR или RTS-CTS). Использовать же линии квитирования нежелательно по двум причинам: во-первых, при сопряжении микроконтроллера с компьютером они заняты и используются для других целей (см. 1.3.2, пп. 1–4), во-вторых, даже безотносительно к тому, заняты линии квитирования или нет, для синхронизации они должны использоваться, а это дополнительные провода. Если осуществляется сопряжение компьютера с микроконтроллером с использованием общей «земли», то есть они связаны гальванически, то лишние два провода особого значения не имеют (хотя и это не всегда так). Но если для связи используется гальванически развязанный интерфейс RS-232, то для каждой линии квитирования нужно делать свою гальваническую развязку, и в этом случае схема сопряжения микроконтроллера с компьютером значительно усложняется. Использование же линий данных (TxD и RxD) для аппаратной синхронизации, с одной стороны, не требует дополнительных проводов (в том числе гальванических развязок) при осуществлении обмена данными, а с другой,—позволяет производить обмен с теми же надежностью и скоростью, свойственными аппаратному способу синхронизации [1].

Вышеуказанные три причины и привели автора к необходимости конструирования двух макетных плат, схемы которых приведены на рис. 12 и 13.

Рис. 12. Схема сопряжения микроконтроллера P89LPC938 с компьютером по интерфейсу RS-232 для программирования в режиме ISP и штатного режима работы (штатный режим работы P89LPC938 может быть использован для программирования микроконтроллеров семейств P89LPC9XX в режиме ICP)
Рис. 12. Схема сопряжения микроконтроллера P89LPC938 с компьютером по интерфейсу RS-232 для программирования в режиме ISP и штатного режима работы (штатный режим работы P89LPC938 может быть использован для программирования микроконтроллеров семейств P89LPC9XX в режиме ICP)
Рис. 13. Схема платы ICP для микроконтроллеров P89LPC93X и P89LPC90X
Рис. 13. Схема платы ICP для микроконтроллеров P89LPC93X и P89LPC90X

На рис. 12 показана схема сопряжения микроконтроллера P89LPC938 с компьютером по интерфейсу RS-232.

Как видно из схемы, для формирования сигнала RST используется интерфейсный сигнал DTR, который, пройдя через приемник микросхемы преобразователя ADM231L (DD1, выводы 9,10), попадает на затвор КМОП-транзистора прямой проводимости BS250 (T2). Сток транзистора соединен с выводом RST микроконтроллера P89LPC938 (DD2).

Для формирования сигнала питания Vdd используется сигнал RTS, который напрямую подается на затвор такого же транзистора (Т1). Сток транзистора T1 соединен с выводом Vdd микроконтроллера. Ранее уже обсуждались две схемы формирования сигналов RST и Vdd (рис. 7а и рис. 8а), поэтому принцип их функционирования должен быть понятен.

Остальные два передатчика и приемник преобразователя ADM231L используются для сопряжения линий данных микроконтроллера TXDM и RXDM с линиями данных TxD и RxD и линией квитирования DSR интерфейса RS-232. Для питания преобразователя ADM231L (V+) используется напряжение +12 В; вывод Vcc подключен к источнику питания +3,3 В. Такое использование преобразователя позволяет получить с выходoв передатчиков сигналы (RxD и DSR) с размахом в ±11,5 В, что почти в шесть раз больше размаха сигнала передатчика (TxDM) микроконтроллера (0…+3,3 В). Приемник преобразователя формирует сигнал RXDM с размахом 0…+3,3 В из сигнала TxD RS-232 с размахом около ±10 В. Максимальная скорость обмена преобразователя ADM231L составляет около 230 кбод, поэтому на скорости в 115 200 бод он работает безукоризненно.

В качестве источника питания +3,3 В используется малопотребляющий стабилизатор LP2950Z3.3 (DA1).

Для программирования микроконтроллеров семейства P89LPC9XX в режиме ICP с помощью микроконтроллера P89LPC938 на плате предусмотрен 6-контактный разъем типа IDC6 (X2), на который подаются сигналы PDA и PCL, сигнал VddT, предназначенный для управления включением-выключением питания Vdd программируемого микроконтроллера, и сигнал RSTT, управляющий его выводом RST. Все четыре сигнала (PDA, PCL, VddT и RSTT) формируются микроконтроллером P89LPC938 (DD2).

Кроме сигналов управления, на разъем X2 подается питание (+3,3 В, контакт № 3) и «земля» (контакт № 1).

На рис. 12 можно заметить «маленький» микроконтроллер P89LPC904 (DD3), который сопряжен с компьютером аналогично микроконтроллеру P89LPC938 (DD2). Это сделано для проверки на работоспособность записанной в него тестовой программы обмена по RS-232.

Микроконтроллер P89LPC938 (DD2) установлен в панельку PLCC28, а микроконтроллер P89LPC904 — в панельку DIP8.

Сигналы с линий интерфейса RS-232 подаются на плату через разъем IDC10 (X1).

На рис. 13 показана схема сопряжения микроконтроллеров P89LPC938 и P89LPC904 с интерфейсом C2, предназначенная для программирования микроконтроллеров в режиме ICP.

Из схемы видно, что сигналы с линий интерфейса C2 (PCL, PDA, RSTT), а также питания (+3,3 В) и «земли» с разъема IDC6P (X1), попадают на соответствующие им выводы микроконтроллеров P89LPC938 и P89LPC904, установленных в панельках (PLCC28 и DIP8 соответственно). Сигнал управления включением-выключением питания (VddT) с 5-го контакта разъема X1 попадает на затвор КМОП-транзистора прямой проводимости BS250 (T1). На стоке транзистора формируется сигнал питания Vdd, который подается на соответствующие выводы микроконтроллеров.

Рис. 14. Схема кабеля связи платы ISP с платой ICP
Рис. 14. Схема кабеля связи платы ISP с платой ICP

На рис. 14 приведена схема кабеля сопряжения платы ISP с платой ICP. Кабель представляет собой обычный плоский 6-жильный кабель длиной 10–15 см с установленными на концах разъемами IDC6M.

На рис. 15 представлена фотография общего вида двух плат, сопряженных между собой кабелем связи.

Рис. 15. Фотография платы ISP для микроконтроллеров семейств P89LPC93X и платы ICP для микроконтроллеров P89LPC93X и P89LPC90X (платы условно разделены пунктиром)
Рис. 15. Фотография платы ISP для микроконтроллеров семейств P89LPC93X и платы ICP для микроконтроллеров P89LPC93X и P89LPC90X (платы условно разделены пунктиром)

Здесь необходимо добавить, что плата ICP для P89LPC9XX может использоваться совместно как с вышеописанной платой ISP для P89LPC93X, так и совместно с другими микроконтроллерами. Если, например, разработчик имеет дело с микроконтроллерами семейства MSC12XX, и ему необходимо запрограммировать микроконтроллер семейства P89LPC9XX, то на макетной плате, на которой установлен, например, микроконтроллер MSC1210, достаточно установить разъем IDC6P (X2 на рис. 9) и соединить соответствующие сигналы разъема с портами микроконтроллера MSC1210 (рис. 9), после чего соединить обе платы кабелем связи (рис. 14). В этом случае необходимость в макетной плате ISP (рис. 12) отпадает.

Рис. 16. Общий вид платы ISP микроконтроллера MSC12XX, сопряженной с платой ICP для семейства P89LPC9XX кабелем связи (плата ICP для P89LPC9XX показана в прямоугольнике, очерченном пунктиром)
Рис. 16. Общий вид платы ISP микроконтроллера MSC12XX, сопряженной с платой ICP для семейства P89LPC9XX кабелем связи (плата ICP для P89LPC9XX показана в прямоугольнике, очерченном пунктиром)

На рис. 16 показан общий вид платы ISP для микроконтроллера MSC12XX, сопряженной с платой ICP для семейств P89LPC9XX кабелем связи.

1.3.7. Кабель связи микроконтроллеров с компьютером

Обе макетные платы с микроконтроллерами семейств MSC12XX (рис. 9) и P89LPC93X (рис. 12) для сопряжения с компьютером по интерфейсу RS-232 используют один и тот же кабель, схема которого приведена на рис. 17. Кабель представляет собой обычный плоский 10-жильный кабель длиной 1–1,5 м, снабженный на одном конце 10-контактным разъемом IDC10M и распаянный с другого на стандартный 9-контактный разъем DB9M, использующийся в компьютерах для подключения к COM-порту.

Рис. 17. Схема кабеля связи микроконтроллеров с компьютером
Рис. 17. Схема кабеля связи микроконтроллеров с компьютером

1.4. Гальванические развязки для интерфейса RS-232

Гальванически изолированный интерфейс RS-232 применяется во многих устройствах, где по тем или иным причинам либо нежелательно, либо просто невозможно (или опасно) соединять напрямую общие цепи «земли» и питания компьютера и самого устройства.

Термин «нежелательно» означает, что, например, соединять можно, и компьютер или устройство не выйдет из строя от такого соединения, но устройство будет работать либо некорректно, либо с большими сбоями (это не касается сбоев передачи по интерфейсу RS-232). Например, если в устройстве применяется микроконтроллер с высокоточным (точнее — высокочувствительным) АЦП, и это устройство соединяется с компьютером по интерфейсу RS-232 напрямую, то такой АЦП может легко «ловить» шумы компьютера, в котором их масса, и передавать шум вместо полезного значения измеряемой величины. При этом передача информации по самому интерфейсу будет проходить совершенно без сбоев, и ни устройство, ни компьютер от такого соединения не пострадают. Применительно к системам сбора и обработки информации, получаемой с датчиков (а именно на такие применения микроконтроллеров ориентирована настоящая статья), это означает, что они обязательно должны иметь гальванически изолированный интерфейс RS-232.

Термины же «невозможно или опасно» означают, что при соединении компьютера с устройством по интерфейсу RS-232 без гальванической изоляции может выйти из строя либо само устройство, либо компьютер. Если, например, устройство находится под достаточно высоким потенциалом по отношению к компьютеру (несколько сот либо даже тысяч вольт), то напрямую соединять устройство с компьютером по интерфейсу RS-232 просто нельзя. Причем, большая разность потенциалов может иметь место либо по необходимости (например, устройство напрямую контактирует с пантографом электровоза, находящегося под напряжением в 5000 В относительно «земли»), либо разность потенциалов может возникнуть не специально (например, компьютер оснащен монитором с ЭЛТ, не заземлен, и на мониторе постепенно накапливается высокий электростатический заряд). Часто гальваническую изоляцию осуществляют для обеспечения искробезопасности. Например, требуется периодический съем информации с устройства измерения расхода газа (например, пропан-бутана), которое находится в его атмосфере. Прямое подключение, а особенно отключение интерфейса (вообще любой разрыв контактов) может привести к возникновению искры и в конечном итоге — к взрыву.

Традиционный способ осуществления гальванической развязки — использование оптронов. Широко известны недостатки оптронов, которые уже «навязли в зубах» — это низкая скорость обмена, большие токи включения и потребления, необходимость использования дополнительных резисторов (для включения светодиода оптрона и для подтяжки выхода к питанию), частые сбои в работе, высокая стоимость скоростных оптронов и т. п. С этими недостатками так или иначе мирились, поскольку все равно ничего другого до последнего времени придумано не было (если не считать емкостные развязки типа ISO150 от Burr-Brown стоимостью около $15).

Ивот, наконец, появилась возможность отказаться от использования оптронов. Компания Analog Devices выпустила уникальные по своим свойствам устройства семейства iCoupler. Эти одно- и многоканальные развязки (ADUM120X) используют совершенно иной принцип передачи информации, чем, например, оптроны или емкостные развязки. В развязках ADUM120X информация передается посредством высокочастотного магнитного поля, как в трансформаторных связях. Уникальность их в том, что эти устройства работают на скоростях от 0 до 25 Мбод (!); при этом потребление энергии на скорости 0,1 Мбод (например, 115 Кбод) приблизительно в 10 раз меньше, чем у стандартного оптрона 6N137. Включение и выключение (то есть переключение из одного логического состояния в другое) происходит напряжением (или уровнем сигнала, а не током, как в оптроне). При этом значение тока составляет всего несколько микроампер. Эти развязки дешевле оптронов, если исходить из цены на один канал передачи. Кроме того, они выпускаются в корпусах SOIC, имеющих достаточно малые габариты. Например, двухканальная развязка с передачей в двух направлениях ADUM1201AR (0–1 Mбод при цене $2,5) выпускается в корпусе SOIC8 и имеет размер 5×5×1 мм. И, наконец, эти приборы не требуют для работы никаких внешних компонентов.

Единственный, по мнению автора, недостаток этих развязок — в том, что они работают только с TTL-уровнями сигналов и их нельзя напрямую подключать к линиям интерфейса RS-232 (как, например, оптроны). Правда, этот недостаток легко преодолим, так как существует масса преобразователей интерфейса RS-232 (рис. 1 и 2). Кроме того, в некоторых случаях, когда не требуется высокая скорость работы (например, для формирования сигналов управления режимом работы микроконтроллера, таких как RST, PSEN и т. п.), для развязок вполне можно использовать достаточно дешевые оптроны.

Существуют гальванические развязки, которые питаются энергией от самих линий интерфейса RS-232, а также развязки, для питания которых используются изолированные DC/DC-преобразователи [1]. Еще три года назад (в 2003 г.) единственными реально работающими DC/DC-преобразователями для подобных целей были устройства семейств DCP05XX и DCR05XX мощностью 1–2 Вт производства компании Burr-Brown (TI) по цене около $10–11 (кстати, цена на них до сих пор так и не изменилась). Из-за довольно высокой стоимости приходилось использовать их лишь в самых крайних случаях. В основном же для питания гальванических развязок автор рекомендовал тогда использовать сами линии интерфейса RS-232 по причине «бесплатности» такого питания. Но, как известно, бесплатный сыр бывает только в мышеловке — гальванические развязки с питанием от линий интерфейса имеют много недостатков, перечислять которые очень долго (и не нужно).

В последнее время качество и цена новых DC/DC-преобразователей существенно изменились. Появились новые конвертеры, которые имеют уровень шумов в несколько раз ниже, чем DCR05XX или DCP05XX при стоимости в 2 раза меньше последних. Примером могут служить преобразователи RSD-XX и RQD-XX мощностью 0,25–1,0 Вт от компании Recom и им подобные. Энергии этих DC/DC-конвертеров вполне достаточно для питания даже старых преобразователей интерфейса RS-232 (типа SN75155); эта энергия в несколько раз больше, чем требуется для стандартных преобразователей RS-232 и на порядок (а то и на два) больше, чем для современных. В связи с этим о питании гальванических развязок для интерфейса RS-232 от самих линий этого интерфейса наконец можно забыть. Во всяком случае, все дальнейшее изложение будет посвящено гальваническим развязкам с питанием от DC/DC-преобразователей.

Преимущества таких развязок (применительно к интерфейсу RS-232) заключаются в следующем:

  • повышенная надежность работы, поскольку размах сигнала на линии RxD компьютера может достигать ±10 В и более (благодаря тому, что передатчик берет энергию от отдельного источника питания);
  • длина кабеля связи может достигать 10–15 м;
  • развязки проще и занимают меньше места на плате, чем с питанием от линий RS-232;
  • высокая предсказуемость и «детерминированность» поведения сигналов, вследствие чего резко снижается вероятность «зависания» компьютера, особенно при работе в ОС Windows;
  • подходят для любых типов компьютеров, в том числе имеющих «слаботочный» интерфейс RS-232;
  • не создают высокочастотных электромагнитных помех повышенного уровня, поэтому рекомендуются для работы с прецизионными АЦП.

В качестве примеров гальванически изолированного интерфейса RS-232 с применением DC/DC-конверторов и развязок ADUM120X будут приведены несколько схем, снабженных небольшими комментариями. Для микросхем в планарных корпусах будут приведены варианты разводки плат-переходников в корпуса DIP для возможности их легкого макетирования.

Продолжение следует.

Литература

  1. Кузьминов А. Ю. Интерфейс RS-232. Связь между компьютером и микроконтроллером. М.: Радио и связь, 2004.
  2. Кузьминов А. Ю. Интерфейс RS-232. Связь между компьютером и микроконтроллером. От DOS к Windows98/XP. М.: ДМК-Пресс, 2006 (в печати).
  3. Кузьминов А. Ю. Универсальная система сбора и обработки данных АСИР-3 // Мир ПК. 1996. № 6.
  4. Кузьминов А. Ю. Удаленные системы сбора информации с датчиков на базе однокристальных микроЭВМ // Автоматизация и производство. 1996. № 3.
  5. Кузьминов А. Ю. Однокристальные микро ЭВМ — основа удаленных систем сбора и обработки сигналов, поступающих с датчиков // Электроника и компоненты. 1998. № 2.
  6. Кузьминов А. Ю. Новые MCS51-совместимые микроконтроллеры и их применение в системах сбора информации с датчиков // Контрольно-измерительные приборы и системы. 1997. № 6. 1998. № 7.
  7. www.analog.com
  8. www.atmel.com
  9. www.maxim-ic.com
  10. www.semiconductor-philips.com
  11. www.silabs.com
  12. www.ti.com
  13. www.msdn.microsoft.com/library
  14. www.gapdev.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *