Телефонная карточка на микросхеме at90s2343 фирмы atmel

Переходим от AT90S2313 к Attiny2313

Телефонная карточка на микросхеме at90s2343 фирмы atmelМикроконтроллер AT90S2313 фирмы Atmel снят с производства, поэтому найти его сейчас крайне трудно.На смену ему пришел Attiny2313, который продается на каждом углу.Тем не менее, проекты под AT90S2313 присутствуют в интернетах и старой литературе по AVR.Чтобы переделать прошивку МК под attiny нужно внести некоторые изменения в программу.

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

Список главных изменений, требующих корректировки в программе и схеме устройства под AT90S2313: -Фьюзы(FUSE)!!! — включают в себя еще ряд новых фишек, речь о них пойдет ниже. -Новые значения рабочего напряжения МК. -Изменены названия некоторых регистров. -Изменен порядок работы с прерываниями. -Изменения в работе таймеров. Прежде всего, нам потребуется библиотека под новый МК.

Как правило, во всех более-менее современных компиляторах эта библиотека уже имеется.Подключаем ее в программе в первую очередь:#include или в зависимости от названия библиотеки#include Теперь обо всем поподробнее. Первое нововведение, оно же является наиболее важным + с ним нужно проявлять наибольшую осторожность — фьюзы(они нужны для управления всякими фичами МК).

В AT90S2313 их было всего 2, и трогать их практически не приходилось, так как один из них отвечал за время старта МК, а второй за возможность программировать контроллер.Как видно, функции очень специфические, поэтому используются редко. В новом МК фьюзов стало на 15 больше, спектр их действия расширился, поэтому при работе с Attiny встречи с ними уже не избежать.

В каждом программаторе есть раздел настройки FUSE. В Uniprof это кнопка FUSE вверху:

Нажав на нее, мы увидим табличку с фьюзами и lock-битами:

Я уже писал, что с фьюзами надо быть поосторожнее.Убить МК можно, неправильно выставив фюьзы RSTDISBL и SPIEN.Как раз тот самый, что мы не трогали в At90S2313.Впрочем, говорят, что SPIEN у attiny сбросить через последовательный программатор нельзя, но я не проверял и никому не советую.

RSTDISBL, проще говоря, отвечает за роль 1ой ноги микросхемы и влияет также на возможность программирования. Биты, находящиеся в таблице в колонке low отвечают за задержку перед запуском программы в МК и за использование встроенного тактового генератора.Это, кстати еще одно важное нововведение, у Attiny2313 есть встроенный тактовый генератор(4/8 МГц/128 кГц).

Схема готового устройства может стать компактнее, паять туда кварц не надо, конечно, если не нужна более низкая/высокая частота.При изменении частоты нужно обязательно проверить частоту в проекте, при неверно выставленной частоте девайс может работать не так, как вы хотите.Возможно использовать и кварц как обычно, нужно только выставить биты по-другому.

Кстати, по умолчанию включено деление тактовой частоты на 8(CKDIV8), в большинстве случаев ненужная опция, если вы ее специально включили, наверное, знаете, что делаете 🙂 Биты из колонки high(помимо RSTDISBL и SPIEN, о которых уже было сказано) отвечают за управление такими штуками, как отладочный провод, собачий таймер(watchdog — перезагружает МК, если не получает от него ответ, за некоторое время), защита от низкого напряжения(не дает включится МК при напряжении ниже заданного), защита EEPROM. Lock-биты управляют защитой от копирования прошивки МК(нужны, наверное, только если вы продаете девайс)).

Удобно рассчитывать фьюзы с помощью этого калькулятора.Только обратите внимание на то, что обозначает поставленная галочка в вашем программаторе.Например, в PonyProg она означает совсем не то, что она означает в Uniprof:

Что касается рабочего напряжения: Для старого контроллера оно составляет 2,7-6,0 вольт. Для Attiny оно ниже: 1,8-5,5. Изменения претерпели названия регистров и некоторых битов.При переходе на новый МК надо изучить программу на наличие обращений к этим регистрам и битам и свериться со следующей таблицей.

Биты поменяли имена, но их адреса и функции остались прежними.

То же самое можно сказать и про эти регистры:Если в проекте использовались прерывания, нужно свериться с данной таблицей:Она показывает изменения векторов прерывания и новые векторы прерывания, которых не было в AT90S2313Следовательно, заменяем в программе векторы прерывания в соответствии с таблицей.

В работе таймеров также произведены изменения. В таймере TCNT1 в режиме ШИМ неиспользуемые разряды теперь автоматически сбрасываются в ноль, в результате чего исключается счет до 0хFFFF там, где он не запланирован.

Очистка OCR1xH в режиме ШИМ в Attiny происходит в соответствии с разрядностью режима, а не сбрасыванием 6 значащих знаков. Функция сброс по результату сравнения в новом МК проходит по другому алгоритму, т.е. не по первому совпадению значений, а по последнему. OCR1x = 0x02 с разрешенным предделением на 8(расстановка флагов).

Для AT90S2313:

Для Attiny2313:UART в новой серии микроконтроллеров заменен на USART, поддрживающих передачу данных на удвоенной скорости и работающий, как регистр FIFO(First In, First Out «первым пришёл — первым ушёл»).Включение/отключение FIFO, кстати, управляется конфигурационным битом S8515C.

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

В общем, старался, как мог интерпретировать атмеловские рекомендации и дополнить их своими пояснениями.Надеюсь хоть что-нибудь из этого кому-нибудь пригодится…

Источник: http://we.easyelectronics.ru/blog/AVR/675.html

Как быстро запрограммировать контроллер AVR (classic, tiny, mega)

Дата публикации: 17 марта 2010.

Читайте также:  Переделка компьютерного бп lc-200c в зарядное устройство для автомобильных аккумуляторов

Рейтинг:  5 / 5

    Схема получила свое название от отладочных плат Atmel для быстрого начала работы с микроконтроллерами AVR. Если вы хотите, чтобы ваш программатор почти в точности соответствовал классическому программатору STK200, то следует поставить перемычку для определения программатора программным обеспечением. Перемычка должна соединять выводы 2-12.

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

Кроме того, когда программатор подключен к параллельному порту, следует избегать короткого замыкания его выводов.


    Рассмотрим последовательность действий по загрузке программы в микроконтроллер на примере ATmega8.

    При первом запуске PonyProg попросит произвести калибрацию и указать тип используемого программатора с помощью двух предупреждающих сообщений.

    Сделаем так, как он просит. Зайдем в меню “Setup” и выберем пункт “Calibration”.

     При появлении предупреждения убедимся, что, кроме PonyProg, у нас не запущено никаких приложений, загружающих процессор и жесткий диск.

     После чего нажмем “Yes” и подождем несколько секунд. После выполнения процесса калибрации появится сообщение об успешном завершении.

    Если что-то пошло не так, калибрацию стоит провести заново.

    Теперь выберем в меню “Setup” пункт “Interface Setup…”.

    В появившемся окне выберем параллельный порт и способ работы с этим портом (в Windows2000/XP мы должны выбрать “AVR ISP I/O” и использовать стандартный LPT-порт).

Внимание! Не указывайте порт, к которому подключен модем: это может вывести его из строя.

     Указать тип микроконтроллера можно, воспользовавшись меню “Device” – “AVR micro”.

    Когда все приготовления выполнены, загрузим в PonyProg файл с откомпилированной программой.

      Подсоединим шлейф программатора STK200 к программируемому микроконтроллеру, убедимся, что все подключено правильно, и подадим питание. Если корпус ATmega8 не начал заметно нагреваться, можно загружать подготовленную программу во FLASH-память микроконтроллера. В меню “Command” выберем пункт “Write Program (FLASH)” и дождемся успешного завершения загрузки.

     Программатор PonyProg позволяет также загружать данные в EEPROM-память, считывать данные из памяти микроконтроллера, стирать память и программировать FUSE-биты.

Печать E-mail

Авторизация

Сейчас 208 гостей и ни одного зарегистрированного пользователя на сайте

Источник: https://radioparty.ru/prog-avr/78-avr-classic-tiny-mega.html

NM9211Программатор микроконтроллеров серии AT89S/AT90S фирмы ATMEL

NM9211 – Программатор микроконтроллеров серии AT89S/AT90S фирмы ATMEL купить в Мастер Кит. Драйвер, программы, схема, отзывы, инструкция, своими руками, DIY

NM9211 – Программатор микроконтроллеров серии AT89S/AT90S фирмы ATMEL купить в Мастер Кит. Драйвер, программы, схема, отзывы, инструкция, своими руками, DIY

У нас Вы можете купить Мастер Кит NM9211 – Программатор микроконтроллеров серии AT89S/AT90S фирмы ATMEL: цена, фото, DIY, своими руками, технические характеристики и комплектация, отзывы, обзор, инструкция, драйвер, программы, схема

Мастер Кит, NM9211, Программатор микроконтроллеров серии AT89S/AT90S фирмы ATMEL, цена, описание, фото, купить, DIY, своими руками, отзывы, обзор, инструкция, доставка, драйвер, программы, схема

https://masterkit.ru/shop/28032

Предлагаемый набор позволит радиолюбителю собрать простой и надежный программатор микроконтроллеров серии AT89S/AT90S фирмы ATMEL, реализующий возможность как внутрисхемного программирования, так и программирования самой микросхемы непосредственно.

Программатор позволяет программировать микросхемы имеющие возможность загрузки ПЗУ программ и ЭСПЗУ данных через SPI порт. Предусмотрена возможность регулирования напряжения питания программируемых устройств.

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

В комплект набора входит дискета 3,5 дюйма с программным обеспечением. !Состав программного обеспечения. WavrAsm – ассемблер для микроконтроллеров под Windows/DOS. AVRProg – программа работы с программатором под Windows. Nm9211.hex – прошивка контроллера программатора. !Технические характеристики. Напряжение питания (от внешнего источника, через стабилизатор на DA1): 9 – 37 В (типовое – 12 В).

Диапазон регулировки напряжения питания программируемого устройства: 3 – 8 В (типовое – 5 В). Размеры печатной платы: 45х67 мм. !Состав устройства. Программатор состоит из преобразователя уровней логических сигналов (VD1, VD2, VT1, VT2), микросхемы программатора (DD1) и регулируемого стабилизатора напряжения (DA1). !Конструкция.

Конструктивно программатор выполнен на печатной плате из фольгированного стеклотекстолита. Для фиксации платы зарезервированы монтажные отверстия под винты 2,5 мм. Конструкция устройства позволяет монтировать программатор в корпусе BOX-G025 c использованием соответствующих монтажных отверстий.

Подстроечный резистор R9 позволяет плавно изменять значение напряжения питания программируемого устройства. Устройство позволяет программировать следующие микросхемы: – AT90S1200, AT90S2313, AT90S2323, AT90S2343; – AT90S8414, AT90S8515, AT89S8252.

Необходимое условие программирования – равенство питающих напряжений программатора и программируемого микроконтроллера, поэтому можно использовать напряжение питания программируемого устройства вместо внешнего источника (при внутрисхемном программировании), при этом необходимо отключить последний.

На плате программатора зарезервировано место под установку кварцевого генератора (C6, C7, R12, ZQ2) и колодки DIP-20 для непосредственного программирования микросхем. !Порядок сборки. 1. Проверьте комплектность набора согласно перечню элементов. 2. Отформуйте выводы радиоэлементов. Подготовьте проволочные перемычки J1 (10 мм), J2, J3, J4 (7.5 мм), J5 (5 мм).

Примечание: В качестве материала для перемычек можно использовать обрезки выводов резисторов или конденсаторов. 3. Установите все детали в следующей последовательности: сначала малогабаритные, а потом все остальные элементы; 4. Используя монтажные провода, распаяйте разъемы DB-9F и BLD-6 2×3; 5. Соберите разъем DB-9F в корпус DP-9C; 6.

Промойте плату от остатков флюса этиловым или изопропиловым спиртом. !Доработка корпуса.

Доработка корпуса производится в следующей последовательности: – распилите верхнюю крышку на расстояние 20 мм от торца и просверлите 2 отверстия (диаметром 4 мм под подстроечный резистор и диаметром 3 мм под светодиод) на ней; – с торца крышки просверлите отверстие диаметром 6 мм под разъем питания, а также сделайте выемку под провод радиусом 3 мм; – на торце нижней части корпуса также сделайте выемку под провод радиусом 4 мм; – установите печатную плату на нижнюю часть корпуса и закрепите ее саморезами диаметром 3 мм и длиной не более 6 мм (в комплект набора не входят); – установите верхнюю крышку корпуса, используя штатные саморезы. !Порядок настройки программатора. Правильно собранный программатор не требует настройки. Однако перед его использованием необходимо проделать несколько операций: 1. Проверьте правильность монтажа. !Внимание! Особенно внимательно проверьте правильность установки транзисторов, диодов, микросхемы и электролитических конденсаторов. 2. Проверьте правильность подключения источника питающего напряжения и программируемого устройства (микроконтроллера). 3. Установите движок подстроечного резистора R9 в среднее положение, что соответствует напряжению питания около 5 В. 4. Подключите программатор к одному из COM портов. 5. Установите с прилагаемой дискеты программное обеспечение на Ваш компьютер. ПРИМЕЧАНИЕ: На дискете находится: A:AVRPROGavrprog.exe – программа для работы с программатором под Win9x; A:WAVRASMavrasm.zip – архив содержит инсталлятор ассемблера для микроконтроллеров под Win9x /Win3.1/DOS, со всеми необходимыми библиотеками. Для установки необходимо распаковать архив и запустить файл setup.exe; A:NM9211.hex – файл прошивки микроконтроллера программатора. 6. Подайте напряжение питания на программатор. 7. В процессе работы при обнаружении ошибок программирования измените напряжение питания микроконтроллеров, вращая движок подстроечного резистора R9 (3 – 6 В). !Обновление 2007 года Обновленное ПО позволяет программировать новые микроконтроллеры ATMEL серий tiny и mega. По сравнению с предыдущей версией, данное программное обеспечение улучшает стабильность работы программатора. Новая прошивка так же поддерживает работу с зарекомендовавшими себя программами AVRStudio, AVRProg, loader. Скорость связи как и прежде – 19200бит/с Скачать Прошивка микроконтроллера ATTiny3213/AT90S2313 программатора версии 3.8 Скачать Программа под WIN-XP AVROSPII

Читайте также:  Новейшие мониторы физической активности компании renesas

Copyright www.maxx-marketing.net

Источник: https://masterkit.ru/shop/28032

Смарт-карты известных мировых производителей

Сохрани ссылку в одной из сетей:

Смарт-карта питается от внешнего источника питания. Для этого необходим блок питания, состоящий из понижающего трансформатора с напряжением на вторичной обмотке от 7,5 до 15 В. Схема стабилизатора напряжения изображена на рисунке 9.

Рис. 9

Для питания карты нужно напряжение диапазона 4,75 – 5,25 В. Для этого используется интегральный стабилизатор КР142ЕН5А (на схеме СН1) с фиксированным выходным напряжением 4,9 – 5,1 В.

Чтение и запись смарт-карты через параллельный порт компьютера

Обмен информацией между картой и интерфейсным устройством.

Вся суть стандарта ISO 7816 сводится к стандартному: карта может работать в двух режимах: асинхронном и синхронном. В первом из них данные передаются на линию I/O в асинхронном полудуплексном режиме. Во втором режиме все то же самое, но только передача данных синхронизируется сигналом CLK.

И в том, и в другом случае, обмен данными производится пакетами по 8 бит, то бишь по 1 байту. За исключением маленьких технических нюансов, весь режим передачи данных полностью аналогичен передаче данных по параллельному (LPT) порту в первом режиме и по последовательному (СОМ) – во втором.

Ниже приведена диаграмма сигналов для типа ISO 7816-1 (сброс, чтение и запись):

+21V                                     _____________

+5V ____________________________________|             |_________________ Vpp

+0V : :

                                        :             : _____

+5V                  ___________________:_____________:_________________ Reset

0V  ________________|                   :             :

                    :                   :             :

+5V     ____        :      ____         :       ______:______

0V  ___|    |_______:_____|    |________:______|      :      |__________ Clock

       :    :       :     :    :        :      :      :      :

+5V    :    :       :     :    :        :______:______:      :           _

0V  ___:____:_______:_____:____:________|      :      |______:__________ R/W

       :    :       :     :    :        :      :      :      :

+5V    :    :       :_____:    :________:      :      :      :__________

0V  XXXXXXXXXXXXXXXXX_____XXXXXX________XXXXXXXXXXXXXXXXXXXXXX__________ Out

       :    :       :     :    :        :

       :    :       :     :    :        :10-    10- :      :

       :    :       :     :    :        :50ms   50ms  :      :

        Сброс        Бит 1        Бит 2                           Бит 3

       карты        чтение        чтение Бит 2 Запись в 1     чтение

Примечание: контакт Reset условно инвертирован.

На первом этапе происходит сброс карты для того, что бы она установилась в изначальное состояние. При этом на контакте I/O появляется значение равное первому биту из цепочки памяти.

После происходит чтение первых двух бит, после чего происходит запись второго бита и чтение третьего. При этом напряжение записи (Vpp) должно быть не менее 5В и не более 21В, чтобы не спалить сам чип.

Напряжение программирования зависит от самих параметров чипа.

В “чистом” виде ячейки памяти чипа типа – ISO 7816-1 содержат “0”, операция записи прошивает в ячейку “1”.

На следующей диаграмме приведена работа чипа типа ISO 7816-2 (сброс и чтение):

__________________

_____|                  |_____________________________________________ Reset

     :                  :

     :        _____     :  _____       _____       _____       _____

_____:_______|     |____:_|     |_____|     |_____|     |_____|     |_ Clk

     :       :          : :     :     :     :     :     :     :     :

_____:_______:__________:_:_____:_____:_____:_____:_____:_____:_____:_

_____:___n___|_____0____:_|_____1_____|_____2_____|_____3_____|___4_:_ (Адрес)

Сначала происходит сброс карты, при этом Reset и Clk устанавливаются в “1”. Затем подаются на контакт Clk импульсы, с помощью которых происходит перемещение по памяти карты. По фронту импульса Clk происходит увеличение на единицу внутреннего счетчика адреса.

По спаду тактового импульса следующий бит данных появляется на выходе. Обычно удобнее представлять информацию в виде байтов. Для этого каждые 8 считанных бит группируют в байт, считая, что первым считывается наименее значащий бит. Таким образом, последовательно считывая 1,0,0,1,0,1,1,1, получим байт 0xE9.

Читайте также:  Советские колонки - какие лучше звучат?

При этом счетчик может быть только увеличен.

Если нужно считать бит с адресом меньше текущего, то счетчик нужно сбросить в 0, а затем увеличить до необходимого значения.

Вся информация, поступающая на карту, производится через порт 0x378 принтера (базовый адрес). Записанный байт появляется на выходных контактах. Мы используем бит 0 (Data 0) для сигнала Reset и бит 1 (Data 1) для сигнала Clk. Чтение выполняется через порт 0x379. В самом старшем бите появится инвертированное значение с входного контакта 11 (Busy).

Основные управляющие команды карты

На рисунке 10 приведена команда сброса карты (Reset).

На рисунке 11 приведена команда стирания бита (установка бита в “0’) (Write).

На рисунке 12 приведена команда увеличения счетчика на один пункт (Clk).

На рисунке 13 приведена команда записи байта (установка битов в “1’) (WriteCarry).

Рис. 10 Рис. 11

Рис. 12 Рис. 13

Описание интерфейса программы

У программы создано единственное управляющее окно (рис. 14):

Рисунок 14

Для того что – бы пользователь не мог изменить размер окна используется свойство формы BorderIcons = [biSystemMenu, biMinimize];

В окне средством отображения считываемой информации является компонент Stringgrid (сетка строк). Этот компонент предназначен для отображения текстовой информации, и для того, что – бы отобразить в нем числовые данные используется функция IntToStr. Для доступа к ячейкам используем свойство Cells[Row,Col].

Так как в стандартном виде Stringgrid одноцветен – приходиться использовать методы OnDrawCell предназначенная для ответа на перерисовку ячейки, где происходит заливка ячеек различным цветом.

В компоненте Stringgrid1 информация отображается в бинарном виде, в Stringgrid2 в шестнадцатеричном виде, в Stringgrid3 в текстовом, в Stringgrid4 в десятичном.

При наведении мышки над этими компонентами автоматически подсвечивается соответствующий бит (байт) данных и в компоненте StatusBar1 отображается позиция курсора относительно положения данных в памяти карты.

При нажатии на любую из ячеек компоненты Stringgrid1 компоненте Edit2 присваивается значение адреса этой ячейки.

При двойном щелчке компоненте Edit1 присваивается значение адреса ячейки и происходит сброс карты в начальное положение и переход в указанную позицию.

Компонента Label3 используется для того что – бы определить есть ли напряжение на карте путем нахождения нулевого бита данных.

При нажатии на нее происходит включение таймера Powert, который и определяет работоспособности карты. Если оставить включенной службу определения напряжения на карте происходит незаметно сброс карты, а также смещение адреса счетчика. Повторное нажатие по этой компоненте отключает службу.

Компонента Label13 предназначена для отображения реального значения выхода (I/O) на карте. Так как при манипуляции картой может произойти изменение в её состоянии или значении данных при отсутствии визуального наблюдения.

Компоненты Label5 и Label11 предназначены для отображения адреса (значения счетчика) внутри карты относительно произведенных действий. Если компонента Label11 окрашена в зеленый цвет – что соответствует логической “1” данных.

Компоненты Label1, Label2, Label6, Label7 предназначены для индикации установленных значений на контактах карты. Зеленый цвет соответствует логической единице.

Компонента CheckBox1 предназначена для выбора типа питания (внутреннее или внешнее). При её выборе устанавливается внутреннее питание.

Компонента Button12 предназначена для загрузки раннее сохраненного образа памяти карты и работает совместно с компонентой OpenDialog1 (диалоговая компонента), требуется указать имя открываемого файла.

Компонента Button11 предназначена для сохранения образа памяти карты и работает совместно с компонентой SaveDialog1 (диалоговая компонента), требуется указать имя сохраняемого файла.

Компоненты BitBtn7, BitBtn10, RichEdit1, BitBtn5 предназначены для выполнения сценариев набираемых в текстовой компоненте RichEdit1 и запускаемых кнопкой BitBtn5. Кнопки BitBtn7, BitBtn10 предназначены для загрузки и сохранения скрипта соответственно. Данный скрипт поддерживает 10 команд (null, clk, rst, led, next, iowr, reset, goto, write, writecarry).

Компонента Button9 предназначена для вычисления количества юнитов на карте и перевода их минуты (рис. 15) (если карта относится к продукту фирмы «УкрТелеком»).

Рисунок 15

Компонента Button10 предназначена для определения максимальной скорости перехода по ячейкам памяти карты. При этом замеряется время начала теста и его окончания, а также частота перехода (рис. 16).

Рисунок 16

Компонента Button13 предназначена для определения, является ли карта продуктом фирмы «Харьков Метрополитен» и выдачи дополнительной информации (рис. 17).

Рисунок 17

Компоненты Button3, Edit4, Edit5, Edit3 предназначены для реализации процедуры записи байта данных (Edit4, Edit3) в карту по указанному адресу (Edit5). Если вписать в Edit3 значение байта в десятичном виде – то автоматически в Edit4 отобразится в текстовом виде.

Компоненты BitBtn9, RadioGroup1, RadioGroup2, RadioGroup3, RadioGroup4 предназначены для создания сигналов из различных комбинаций. Можно выбрать на каких контактах карты должен появиться сигнал логической “1” или “0”, а после его послать на карту кнопкой BitBtn9. Сигналы удерживаются на контактах до того момента, когда изменится комбинация или их изменит другая операция.

Компоненты RadioButton1, RadioButton2, RadioButton3, CheckBox2, CheckBox3, CheckBox4 предназначены для создания импульсных сигналов прямоугольной формы с определенной задержкой (указанной в программе).

Компонента Button1 предназначена для проведения тестирования светодиода. Проводится путем посылания активных и пассивных сигналов поочередно. При нормальной работе светодиод мигает 5 раз.

Компоненты Edit2, Button8 предназначены для перехода к любому (

Источник: http://works.doklad.ru/view/b2ArwbqXC3E/2.html

Ссылка на основную публикацию
Adblock
detector