Разработка управляющей программы для микроконтроллера HCS12
Семейство однокристальных микроконтроллеров HCS12. Внутренняя или неявная адресация INH. Команды загрузки и пересылки данных, битовых операций, вызова подпрограмм и перехода в режимы пониженного энергопотребления. Основная блок-схема алгоритма, листинг.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 04.06.2014 |
Размер файла | 453,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение
высшего профессионального образования
"Северный Арктический федеральный университет"
Институт математики, информационных и космических технологий
по дисциплине _Современная элементная база вычислительных систем
ТЕМА: __Разработка управляющей программы для микроконтроллера HCS12
студенту МИКТ института 2 курса 373232 группы
Мелехову Дмитрию Валерьевичу
ИСХОДНЫЕ ДАННЫЕ
Микроконтроллер должен формировать:
1. Сигналы управления подъема и опускания.
Сигналы раскрытие дверей лифта.
Сигналы раскрытия дверей шахты лифта.
Сигналы воздействия.
Кнопка нажатия вызова лифта на этаже.
Кнопка указания этажа в кабине лифта.
Вызов диспетчера.
Сигнал давления на пол кабины лифта.
Условие эксплуатации лифта.
Лифт остается на этаже, на котором вышли пассажиры.
Если от номера этажа исходного положения лифта до конечного положения лифта больше трех этажей, то использовать вторую скорость движения. Если перемещение лифта на одни-два-три этажа, использовать первую скорость лифта.
При подъезде к требуемому этажу использовать плавное торможение скорости.
Для точного совмещения положения пола кабины лифта и пола этажа использовать конечный выключатель.
При подъеме вверх игнорировать нажатия кнопки и останавливаться только на этаже кабины лифта.
При опускании вниз «собирать» всех.
Учитывать перегрузку кабины лифта.
При движении пустой кабины и в ожидании вызова выключать свет внутри кабины лифта.
Контроль нажатия клавиатуры внутри кабины.
Предусмотреть программный анализ движения выше местоположения кабины.
Выполнить подсвечивания нажатой цифры этажа.
При нажатии кнопки сброс отменяются все вызовы, что приводит к остановке лифта, при этом если кабина лифта между этажами, то двери не открываются, после остановки кабины лифта движение будет продолжено в соответствии с вновь нажатой кнопкой.
Для движения лифта на специальные этажи ввести определенный код.
Руководитель зав. кафедрой ______________ И.И. Василишин___
(должность) (подпись) (и., о., фамилия)
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ
1. ВНЕШНЕЕ ОПИСАНИЕ
2. РАЗРАБОТКА БЛОК-СХЕМЫ
3.УПРАВЛЯЮЩАЯ ПРОГРАММА
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ВВЕДЕНИЕ
Около 55% проданных в мире процессоров приходится на 8ми битные микроконтроллеры. Более 4 млрд. 8ми битных микроконтроллеров продано в 2006. Они установлены в микроволновках, стиральных машинах, музыкальных центра. При этом они являются однокристальными компьютерами, со своим процессором, памятью, портами ввода-вывода.
Микроконтроллер - это однокристальная ЭВМ. В 1971 придумали разместить всю обвязку процессора (ОЗУ, контроллеры портов, ПЗУ и т.д.) на одном чипе. В 1980 intel уже выпускает первый микроконтроллер. На сегодняшний момент на чипе микроконтроллера содержится процессор, flash память для программ, объемом 1К - 256K; 32 B -- 8KB SRAM (ОЗУ); 64 B - 4KB EEPROM. Тактовая частота 1 - 16 Мгц. Конечно же, цифры только примерные, всё зависит от производителя и модели. Таким образом, микроконтроллер имеет гарвардскую архитектуру, т.е. раздельные памяти данных и программ.
Несмотря на то, что микроконтроллер устройство довольно сложное, их использование значительно упрощает разработку электронных устройств. Аппаратные схемотехнические решения переносятся в плоскость программного кода. Реле в шкафу автоматики заменяется строкой на Си. Этим и достигается огромная гибкость, ведь большинство микроконтроллеров можно перепрошивать не вынимая из платы. Часы-будильник с функцией включения нагрузки (например чайника) в заданное время может быть аппаратно абсолютно таким же, как например блок управления микроволновкой, только программы будут различаться. Именно из-за этого, когда производитель не может себе позволить разработать специализированную микросхему он задает всю логику работы виде программы и зашивает ее в микроконтроллер.
Исторически основной язык - ассемблер. В частности КР1878ВЕ1 программируется только на ассемблере. Для других микроконтроллеров существую компиляторы для языка Си. Для atmelовских микроконтроллеров существует опенсорсный компилятор WinAVR (порт gcc). Также есть компилятор для бейсика Bascom AVR, и даже для языка Forth. Изначально архитектура микроконтроллеров AVR была оптимизирована для того, что бы программы, написанные на Си, выполнялись быстрее.
У микроконтроллера развитая система прерываний. Что бы не нагружать процессор постоянной проверкой состояния (завершилось ли преобразование АЦП, достиг ли счётчик таймера требуемого значения, поступил ли сигнал на порт) включаются прерывания на соответствующие события и пишутся обработчики прерывания. Программа микроконтроллера представляет собой бесконечный цикл.
Таким образом видно, что ничего сложного в микроконтроллерах нет, и практически каждый при желании может делать необходимые для себя гаджеты.
ВНЕШНЕЕ ОПИСАНИЕ
Семейство однокристальных микроконтроллеров HCS12
Компания Freescale Semiconductor (бывший сектор полупроводниковых компонентов компании Motorola) на протяжении многих лет является лидером в производстве полупроводниковых компонентов для встраиваемых приложений. Микроконтроллеры и интегрированные процессоры одна из основных групп её продукции. Freescale Semiconductor обладает одним из наиболее полных портфелей микроконтроллеров (МК) и микропроцессоров среди мировых производителей, непрерывно совершенствуя свой модельный ряд.
В настоящее время Freescale Semiconductor предоставляет разработчикам множество моделей микроконтроллеров и интегрированных процессоров в каждой из классификационных категорий микропроцессорной элементной базы:
Восьмиразрядные МК представлены семейством HCS08;
Шестнадцатиразрядные семействами HCS12(X) и DSP56800/E;
32-разрядные семействами ColdFire, PowerPC и iMx.
Шестнадцатиразрядные МК компании Freescale Semiconductor представлены в настоящее время двумя семействами: HCS12(X) и DSP микроконтроллерами 56800 (DSP Digital Signal Processor процессор Цифровой Обработки Сигналов (ЦОС)).
Все модели МК семейства HCS12(X) обладают характерными отличительными признаками:
имеют экономичное 16-разрядное CISC процессорное ядро, которое позволяет производить операции над 8- и 16-разрядными операндами;
имеют встроенный модуль flash-памяти программ. МК семейства HCS12 и HCS12X обладают модулем flash-памяти третьего поколения (по классификации компании Freescale Semiconductor;
большинство моделей семейства HCS12(X) содержат на кристалле специальный модуль flash ПЗУ с функцией эмуляции EEPROM;
все МК семейства HCS12(X) позволяют реализовать режимы программирования и отладки в системе, благодаря наличию на кристалле модуля внутрисхемной отладки BDM.
Рисунок 1 - Обобщенная структура МК семейства HCS12Cxxx
Обобщенная структура МК семейства HCS12X представлена на рисунке 1. Все МК этого семейства обладают двухпроцессорным ядром. Основной процессор CPUS12X выполнен с использованием архитектуры CISC, длина обрабатываемого слова 16-бит. Второй процессор XGATE дополнительный, имеет RISC-архитектуру, частота шины до 100 МГц, оперирует также с 16-разрядными словами. Основной процессор в составе ядра CPU12X претерпел существенные изменения по отношению к предыдущей версии CPUS12. Добавлены новые команды, существенно улучшены режимы энергопотребления.
Способы адресации
Для выборки операндов из памяти МК семейства HCS12 используют следующие способы адресации:
внутренняя или неявная (INH - Inherent);
непосредственная (IMM - Immediate);
прямая (DIR - Direct):
прямая расширенная (EXT - Extended);
относительная (REL - Relative):
индексная (IDX - Indexed).
Внутренняя или неявная адресация INH
К инструкциям с неявной адресацией относятся команды, которые не требуют для своего выполнения каких либо операндов, например, команда STOP или команда возврата из прерывания RTI.
Неявную адресацию имеют инструкции, которые содержат адрес операнда в коде команды. Все команды с неявной адресацией имеют длину в 1 байт и состоят только из кода операции.
Непосредственная адресация IMM
Код операции команды с непосредственной адресацией размещается в первом байте. Сразу же за кодом операции следуют байты данных. Эти данные не могут быть изменены в ходе выполнения программы, т. к. они расположены непосредственно в памяти программ, т.е. в ПЗУ.
Прямая адресация DIR
Команды с прямой адресацией имеют длину 2 байта. Первый байт предназначен для кода команды, второй байт содержит адрес ячейки памяти, где хранится операнд. Так как МК семейства HCS12 имеют адресное пространство, превышающее диапазон $00..$FF, то во втором байте команды задается только младший байт адреса, а старший автоматически определяется как $00.
Прямая расширенная адресация ЕХТ
Адресное поле команд с прямой расширенной адресацией занимает 2 байта. В поле операнда командной строки указывается полный адрес ячейки памяти, где хранится операнд. Команды с прямой расширенной адресацией позволяют работать со всем адресным пространством МК.
Относительная адресация REL
Относительная адресация используется только в командах условных переходов, которые используются для организации ветвления программ. Команды условных переходов имеют двухбайтовый формат. Первый байт содержит код операции, а второй - смещение адреса следующей команды относительно адреса текущей команды в целочисленном формате со знаком.
Индексная адресация IDX
В командах с индексной адресацией адрес операнда определяется по содержимому двухбайтового индексного регистра X или Y, указателя стека SP или программного счётчика PC.
Система команд
Исходный текст программы на языке Ассемблера состоит из строк, каждая из которых соответствует одной команде.
Команды загрузки и пересылки данных
Команды этой группы осуществляют перемещение данных между ячейками памяти и регистрами центрального процессора. Отличительная особенность команд загрузки и пересылки установка признаков нуля Z и знака N в соответствии со значением перемещаемого числа.
Арифметические команды
Данную группу образуют команды, выполняющие операции сложения, вычитания, инкремента и декремента, однобайтового и двухбайтового сравнения, умножения и деления.
Логические команды и операции сдвига
Данную группу образуют команды, которые выполняют операции логического И, ИЛИ, Исключающего ИЛИ, различные операции сдвига, операции взятия обратного и дополнительного кода. Следует обратить внимание на специальные команды установки признаков без изменения содержимого тестируемых регистров и ячеек памяти (TST и BIT). Все логические команды модифицируют флаги в регистре кода состояния.
Команды битовых операций
Наличие команд битовых операций позволяет существенно сократить управляющие программы по объему кода и времени выполнения.
Команды ветвления
Инструкции ветвления вызывают изменение исполняемой последовательности команд, если выполняются определённые условия. Т.е. с помощью них можно осуществлять переходы между фрагментами программы, тем самым, пропуская или выполняя дополнительные операции. Ядро CPU 12 использует три вида ветвлений: короткие, длинные, по битовым условиям.
Команды вызова подпрограмм
Инструкции перехода на подпрограмму предназначены для передачи управления фрагменту кода, который выполняет определённую задачу. Для вызова подпрограммы может быть использован короткий переход (BSR), переход на подпрограмму (JSR) или расширенный переход (CALL).
Команды перехода в режимы пониженного энергопотребления
Существует две команды перевода микроконтроллера в режим пониженного энергопотребления. Инструкция STOP помещает в стек адрес возврата и содержимое регистров ЦП, а затем выключает систему тактирования. Команда WAI также отправляет в стек адрес возврата и содержимое регистров ЦП. После этого микроконтроллер начинает ожидать поступления запроса на прерывание. При этом система тактирования остаётся включённой.
Для выхода из любого из двух режимов требуется, чтобы произошло прерывание или сброс.
РАЗРАБОТКА БЛОК-СХЕМЫ
Запуск лифта начинается с «холодного старта», закрытия двери и вывода лифта на нижний этаж и установка начальных настроек. Основная блок-схема алгоритма работы лифта представлена на рисунке 2. Далее запускается первый таймер с интервалом в 0,2 секунды (блок схема подпрограммы «Таймер 1» представлена на рисунке 3), в момент срабатывания которого на порту «А» на первом разряде формируется уровень напряжения соответствующий логической единице и запускается второй таймер с интервалом в 10 микросекунд (блок схема подпрограммы «Таймер 2» представлена на рисунке 4). В случае если лифт где либо вызван (произошло нажатие кнопки), сначала происходит проверка, находится ли лифт на нужном этаже, если да то открываются двери, если нет, то происходит проверка, находится ли лифт выше нужного этажа. Если лифт находится выше, то запускается подпрограмма «Движение вверх» (блок схема подпрограммы «Движение вверх» представлена на рисунке 5) и происходит изменение управляющего слова. Если лифт находится ниже, то запускается подпрограмма «Движение вниз» (блок схема подпрограммы «Движение вниз» представлена на рисунке 6) и также меняется управляющее слово.
При запуске подпрограммы «Движение вниз» происходит проверка необходимости изменения скорости. Если необходимо сменить скорость, то скорость меняется. Далее проверяем, достигнут ли нужный этаж. Если да то останавливаем лифт и открываем двери и выходим из подпрограммы. Если нет, то сразу выходим.
Движение вверх происходит по аналогичной схеме.
При запуске подпрограммы «Открытие дверей» (блок схема подпрограммы «Открытие дверей» представлена на рисунке 7) происходит проверка возможности открытия дверей.
Если дверь открывается: проверяем, открылась ли дверь. Если открылась, то запускаем таймер ожидания и переходим в начало подпрограммы. Если нет, то сразу переходим в начало.
Если дверь не открывается: проверяем, открыта ли дверь. Если не открыта, то ждем и снова проверяем, открывается ли дверь. Если открыта, то проверяем, истекло ли время ожидания. Если нет, то ждем и проверяем еще раз. Если да, то закрываем дверь и проверяем, поступил ли сигнал. Если не поступил, то ждем и снова проверяем. Если поступил, то анализируем куда ехать и переходим на метку К.
Рисунок 2 - Основная блок-схема алгоритма
Рисунок 3 - Блок-схема алгоритма подпрограммы «Таймер 1»
Рисунок 4 - Блок-схема алгоритма подпрограммы «Таймер 2»
Рисунок 5 - Блок-схема алгоритма подпрограммы «Движение вверх»
Рисунок 6 - Блок-схема алгоритма подпрограммы «Движение вниз»
Рисунок 7 - Блок-схема алгоритма подпрограммы «Открытие дверей»
УПРАВЛЯЮЩАЯ ПРОГРАММА
RamStart EQU $0000
RomStart EQU $E000
StartVector EQU $FFFE
INITRG EQU $0011
;Num1 EQU $60 ;Адрес младшего байта первого числа; ;
;MOVB #$08, $60; ;MOVB #$09, $61; ;LDAA Num1+1;
EtajGdeLift EQU $0020 ;Показывает на каком этаже находиться лифт;
OtkritiZakritiDvery EQU $0021 ;0 - закрыто 1 - открыть дверь 2 - дверь открыта 3 - закрыть дверь;
SkorostLifta EQU $0021 ;ячейка хранящая условие перехода но более высокую скорость;
SkorostDvijenia EQU $0023 ;0 - низкая скорость 1 - средняя скорость;
DvigatelLifta EQU $0024 ;0 - двигатель выключен 1 - двигатель включён;
TimerOtritihDverei EQU $0025 ;0 - таймер выключен 5 - таймер равен 5 секундам;
VizovLiftaVneKabini EQU $0026
VizovLiftaVKabine EQU $0027
EtajKudaNadoLifty EQU $0028
ORG RomStart
;Холодный старт. Сброс настроек. Закрыть двери. Вывести лифт на нулевой(первый этаж) уровень;
Lift: MOVB #$08, INITRG
MOVB #$01, EtajGdeLift ;этаж где лифт, по умолчанию 1 этаж;
MOVB #$00, TimerOtritihDverei ;по умолчанию таймер выключен, значит в переменной занесён 0;
MOVB #$00, OtkritiZakritiDvery ;по умолчанию закрыты, значит в переменной занесён 0;
MOVB #$00, DvigatelLifta ;по умолчанию выключен, значит в переменной занесён 0;
MOVB #$00, VizovLiftaVneKabini ;по умолчанию лифт не был вызван, значит переменная равна 0;
MOVB #$00, VizovLiftaVKabine ;по умолчанию лифт не был вызван, значит переменная равна 0;
MOVB #$02, SkorostLifta ;Скорость лифта увеличивается если расстояние больше двух этажей;
;Основной цикл лифта;
CikeLifta:
MOVB #$05, EtajKudaNadoLifty
LDAA #$01 ;Если равно 1 то нажали на кнопку вне кабиты;
CMPA VizovLiftaVneKabini ;Сравниваем ячейку А с переменной вызов лифта вне кабины;
BNE VizovLifta ;Если неравны но переходим на метку VizovLifta, иначе продолжаем работу программы;
LDAA #$01 ;Если равно 1 то нажали на кнопку в кабине;
CMPA VizovLiftaVKabine ;Сравниваем ячейку А с переменной вызов лифта вне кабины;
JMP CikeLifta
;Вызов лифта;
VizovLifta:
LDAA EtajKudaNadoLifty ;Здесь указываем этаж на котором мы нажали кнопку вызова;
LDAB EtajKudaNadoLifty
SUBB EtajGdeLift ;Вычитаем из B значение где находиться лифт, а потом заномим в Б это значение;
CMPB SkorostLifta ;Сравниваем ячейку B с переменной Скорость лифта;
BHI Skorost ;Если ячейка Б больше то переходим на метку Skorost, иначе продолжаем работу программы;
JMP go2
Skorost:
MOVB #$01, SkorostDvijenia
go2:
CMPA EtajGdeLift ;Сравниваем ячейку А с переменной ЭтажГдеЛифт;
BNE go ;Если неравны но переходим на метку go, иначе продолжаем работу программы;
JMP quit
go:
CMPA EtajGdeLift ;Сравниваем ячейку А с переменной ЭтажГдеЛифт;
BHI Vverh ;Если мы находимся выше лифта то переходим на метку Vverh, иначе продолжаем работу;
LDAA #$01
STAA DvigatelLifta ;Включаем двигатель, значит в переменную заносим 1;
DEC EtajGdeLift ;Опускаем лифт на один этаж;
JMP VizovLifta
Vverh:
LDAA #$01
STAA DvigatelLifta ;Включаем двигатель, значит в переменную заносим 1;
INC EtajGdeLift ;Поднимаем лифт на один этаж;
JMP VizovLifta
quit:
;Мы на нужном этаже;
LDAA #$00
STAA DvigatelLifta ;Выключаем двигатель, значит в переменную заносим 0;
LDAA #$01
STAA OtkritiZakritiDvery ;Хотим открыть двери лифта, значит в переменную заносим 1;
LDAA #$02
STAA OtkritiZakritiDvery ;Открываем двери, значит в переменную заносим 2;
LDAA #$05
STAA TimerOtritihDverei ;в таймер ввели 5 секунд;
CicleTimera:
LDAA #$00 ;Здесь указываем когда закрыть двери;
CMPA TimerOtritihDverei ;Сравниваем ячейку А с переменной Таймера;
BNE goTimer ;Если неравны но переходим на метку goTimer, иначе продолжаем работу программы;
JMP TimerItsOk ;Время вышло;
goTimer: DEC TimerOtritihDverei
JMP CicleTimera
TimerItsOk:
LDAA #$03
STAA OtkritiZakritiDvery ;Хотим закрыть двери, значит в переменную заносим 3;
LDAA #$00
STAA OtkritiZakritiDvery ;Закрываем двери, значит в переменную заносим 0;
JMP CikeLifta
ORG StartVector
DC.W Lift
ЗАКЛЮЧЕНИЕ
В рамках курсовой работы была написана программа управления лифтом, которая позволяет реализовать движение лифта с этажа на этаж, а также закрывание и открывание двери. Пользователь сам решает, какой этаж ему нужен и где ему удобнее выходить. Так же у лифта мы меняем скорость его передвижения в зависимости от расположенности лифта. Чем лифт ближе, тем скорость меньше, чем дальше - тем скорость выше.
Эта курсовая работа в полной мере помогла нам разобраться с особенностями языка Assembler, а также закрепить их, тем самым достигнув основной цели работы. Таким образом, заданная тема реализована в полном объеме.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
управляющая программа микроконтроллер команда
Бабич Н.П. Компьютерная схемотехника. Методы построения и проектирования работы/ Н.П. Бабич, И.А. Жуков. - Киев: «МК-Пресс», 2004. - 576 с.
Карпов Ю.Г. Теория автоматов. - СПб.: Питер, 2002. - 224 с.
Синтез микроконтроллера: методические указания по выполнению курсовой работы /сост. И.И. Василишин. - Архангельск: Изд-во АГТУ, 2006. - 46 с.
Размещено на Allbest.ru
Подобные документы
Структурная схема микроконтроллеров семейства MCS-51: отличительные особенности, назначение выводов, блок регистров специальных функций. Карта прямоадресуемых бит. Методы адресации, граф команд пересылки, обмена и загрузки. Ввод и отображение информации.
курсовая работа [135,5 K], добавлен 22.08.2011Структурная схема и программная модель микроконтроллеров семейства MCS-51. Особенности и принципы использования регистровой, непосредственной, косвенной, байтовой и битовой адресации данных. Описание формата команд обмена, пересылки, загрузки операндов.
реферат [560,5 K], добавлен 13.12.2010Микропроцессор К580. Прямая, непосредственная и косвенная адресация. Команды перемещения данных, загрузки аккумулятора, запоминания данных, непосредственной загрузки пары регистров, обмена содержимого пар регистров. Команды операции со стеком.
лабораторная работа [14,7 K], добавлен 03.03.2009Разработка системы считывания данных с пяти четырехбитных датчиков. Проектирование структурной схемы микроконтроллера, схемы электрической принципиальной, блок-схемы работы программного обеспечения устройства. Разработка алгоритма основной программы.
контрольная работа [275,4 K], добавлен 08.01.2014Разработка принципиальной схемы и описание работы контроллера клавиатуры/дисплея КР580ВД79. Схема сопряжения микроконтроллера с фотоимпульсным датчиком. Расчет потребляемого тока от источника питания. Блок-схема программы вывода информации на индикацию.
курсовая работа [736,9 K], добавлен 18.02.2011Техническая характеристика микроконтроллера ADuC812 – интегральной 12-разрядной системы сбора информации, включающей в себя прецизионный многоканальный АЦП с самокалибровкой, два 12-разрядных ЦАП. Описание алгоритма работы устройства и листинг программы.
курсовая работа [442,3 K], добавлен 25.12.2012Разработка программы, реализующей таймер прямого хода на базе микроконтроллера AT90S8515. Приложение и среда программирования Algorithm Builder, ее преимущества. Принципиальная схема и назначение переменных. Описание основной программы и подпрограмм.
курсовая работа [1,2 M], добавлен 19.03.2012Функциональная спецификация и структурная схема электронных автомобильных часов-термометра-вольтметра. Разработка алгоритма работы и принципиальной электрической схемы. Получение прошивки программы для памяти микроконтроллера в результате ассеблирования.
курсовая работа [2,0 M], добавлен 26.12.2009Разработка структурной схемы устройства. Принцип работы его блоков: источника напряжения, цифрового программируемого устройства, семисегментного дисплея, датчиков давления и температуры. Разработка алгоритма работы управляющей программы, ее блок-схема.
курсовая работа [2,5 M], добавлен 23.06.2015Описание объекта и функциональная спецификация. Описание ресурсов МК: расположение выводов; исполнение микроконтроллера; особенности микроконтроллеров. Разработка алгоритмов устройства. Описание функциональных узлов МПС и алгоритма их взаимодействия.
курсовая работа [5,2 M], добавлен 27.12.2009