![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Широтно-импульсная модуляцияСодержание книги
Поиск на нашем сайте
Из всех счётчиков контроллера Atmega8 только таймер счётчик T/C2 имеет режим широтно-импульсной модуляции (ШИМ). Структурная схема T/C2 в режиме ШИМ приведена на рис. 2.4.1.
Режим Быстрой ШИМ таймера счётчика T/C2 обеспечивает высокочастотное генерирование ШИМ-сигнала. Этот режим отличается от режима ШИМ с фазовой коррекцией тем, что имеет пилообразное изменение значения регистра TCNT2 с левосторонним наклоном (рис. 2.4.2). Режим с фазовой коррекцией имеет двустороннее пилообразное изменение значения регистра TCNT2. Режим быстрой ШИМ генерирует прямоугольные импульсы, период которых определяется временем заполнения счётного регистра TCNT2 от 0 до 255 тактовыми сигналами, которые проходят через предделитель частоты. Длительность импульсов определяется значением в регистре совпадения OCR2. Скважность определяется отношением периода к длительности. 8-битный счётный регистр TCNT2 таймера-счётчика T/C2 доступен по чтению и по записи. Однако запись в этот регистр блокируется в течение следующего такта после совпадения со значением регистра OCR2, так как в это время происходит запрос внутреннего прерывания по сигналу TOV2, по которому формируется возрастающий фронт ШИМ-импульса. Содержимое 8-битного регистра совпадения OCR2 (OutPut Compare Register 2) непрерывно сравнивается со значением счётчика TCNT2. При совпадении формируется ниспадающий фронт импульса на выходе совпадения OC2 микроконтроллера. Описание битов регистра управления TCCR2 приведено на рис. 2.4.3. Бит FOC2 в режиме ШИМ не используется, поэтому должен быть равен нулю. Описание битов WGM (Waveform Generation mode) генерации формы импульсов приведено в табл. 2.4.1. Таблица 2.4.1
Для генерации неинвертированных импульсов в быстром режиме ШИМ необходимо записать в биты COM (Compare Output Mode) следующие значения: COM21 1, COM20 0, для инвертированных импульсов: COM21 1, COM20 1. Описание битов CS (Clock Select) выбора коэффициента предделителя частоты тактовых импульсов приведено в табл. 2.4.2. Таблица 2.4.2
Период одного ШИМ-импульса можно вычислить по формуле:
T = 256*N / f такт, где N – один из коэффициентов предделителя 8, 32, 64, 128, 256, 1024. Пример 2.4.1. Рассмотрим задачу управления электродвигателем с использованием режима быстрой ШИМ на основе T/C2. На рис. 2.4.4 изображена схема подключения кнопок SW1, SW2 и двигателя постоянного тока к контроллеру. Двигатель управляется с линии PB3 (OC2), которая в режиме ШИМ является выходом ШИМ-импульсов. При включении контроллера двигатель начинает вращаться со средней скоростью. Кнопки SW1 и SW2 подключены к линиям внешних прерываний контроллера INT0 и INT1 соответственно. Кнопка SW1 предназначения для плавного уменьшения частоты вращения двигателя, SW2 – для увеличения. Однократное нажатие кнопки SW1 уменьшает на 4 длительность импульса, открывающего транзистор, а нажатие SW2 – увеличивает на 4. На листинге 2.4.1 приведена программа управления двигателем. Таймер T/C2 инициализируется с помощью установки битов регситра TCCR2: v 1 << WGM21 | 1 << WGM20 – режим Быстрой ШИМ; v 1 << COM21 | 0 << COM20 – импульсы ШИМ неинвертированы; v 0 << CS22 | 0 << CS21 | 1 << CS20 – без предделения частоты. Листинг 2.4.1. .INCLUDE "m8def.inc"
;======================================================== ; MACRO ;======================================================== .MACRO outi ldi rTemp, @1 out @0, rTemp .ENDM
;======================================================== ; INTERRUPTS VECTOR ;======================================================== .ORG 0x00 rjmp RESET .ORG INT0addr rjmp INT_0 .ORG INT1addr rjmp INT_1 .ORG OC2addr rjmp ERROR .ORG OVF2addr rjmp ERROR .ORG ICP1addr rjmp ERROR .ORG OC1Aaddr rjmp ERROR .ORG OC1Baddr rjmp ERROR .ORG OVF1addr rjmp ERROR .ORG OVF0addr rjmp ERROR .ORG SPIaddr rjmp ERROR .ORG URXCaddr rjmp ERROR .ORG UDREaddr rjmp ERROR .ORG UTXCaddr rjmp ERROR .ORG ADCCaddr rjmp ERROR .ORG ERDYaddr rjmp ERROR .ORG ACIaddr rjmp ERROR .ORG TWIaddr rjmp ERROR .ORG SPMRaddr rjmp ERROR
.ORG INT_VECTORS_SIZE ERROR: rjmp ERROR; ловушка
;======================================================== ; DEFs ;======================================================== .DEF rTemp = R16
;======================================================== ; INTERRUPTS ;========================================================
INT_0:; Прерывание с кнопки подключенной к PD2(INT0)
; Здесь должна быть антидребезговая задержка примерно 500 микросекунд ; и сброс флага прерывания, но т.к. в симуляции дребезга нет, то учитывать ; его не будем
in rTemp,OCR2; читаем текущее значение OCR2 subi rTemp,4; уменьшаем на 4 длительность импульса,
out OCR2,rTemp; тем самым уменьшая скважность ШИМ reti
INT_1:; прерывание с кнопки подключенной к PD3(INT1)
;Здесь также нужна антидребезговая задержка и сброс флага прерывания ; в GIFR
in rTemp,OCR2; длительность импульса увеличиваем на 4 subi rTemp,-4; инструкции addi нет, приходится вычитать ; отрицательное значение out OCR2, rTemp reti
;======================================================== ; MAIN ;======================================================== RESET: cli; маскируем все прерывания outi SPL, low(RAMEND); инициализируем указатель стека outi SPH, high(RAMEND)
outi PORTD, (1 << PORTD2 | 1 << PORTD3); подтяжка ~100k ; к питанию outi DDRD, 0x00; все пины порта D на вход outi DDRB, 0xFF; все пины порта B на выход
; Настройка таймера/счетчика2 в режим Быстрой ШИМ с ; неинвертированным выходом и без делителя частоты
outi TCCR2,(1 << WGM21 | 1 << WGM20 | 1 << COM21 | 1 << CS20) outi OCR2,0x80; устанавливаем длит-ть импульса (скважность = 50%)
outi MCUCR,(1 << ISC11 | 1 << ISC01); настройка прерываний по ; спаду уровня на ножках INT0, INT1 outi GICR,(1 << INT0 | 1 << INT1); включаем прерывания ; INT0 и INT1
sei; включаем все прерывания
MAIN_LOOP: rjmp MAIN_LOOP; зацикливаемся в ожидании прерывания Скомпилируйте программу и выполните её пошагово до цикла ожидания прерываний. Убедитесь, что регистры контроллера содержат необходимые значения (рис. 2.4.5). Обратите внимание, что регистр сравнения OCR2 не содержит число 0x80, которое записывалось в него макросом outi OCR2,0x80. Дело в том, что операции записи в этот регистр вступают в силу только после прерывания, вызванного переполнением счётчика TCNT2, а до этого «замораживаются». Так сделано для того, чтобы изменение значения OCR2, произведённое в текущий период ШИМ-импульса, вступало в силу в начале следующего периода. Поэтому в течение первого периода можно увидеть только увеличение значения регистра TCNT2 от 0 до 255 (0xFF), так как значение OCR2 = 0 и формирование ШИМ-импульса не происходит. Только при переполнении регистра TCNT2 он приобретёт нулевое значение, совпадающее со значением в OCR2, возникнет прерывание, которое модифицирует регистр OCR2 значением 0x80. На линии PINB3 при этом будет оставаться нулевое значение. Если не задействовать кнопки SW1 и SW2, то при дальнейшем автовыполнении (рис. 2.4.6) на линии PINB3 в течение второго, третьего и последующих импульсов можно наблюдать ШИМ со скважностью 0,5. Такая скважность обусловлена тем, что значение OCR2 = 0x80 составляет половину максимального значения регистра TCNT2.
На рисунке 2.4.7 показана диаграмма изменения значений TCNT2 и линии PINB3. Как видно из рисунка половину периода составляет ширина импульса. Вплоть до значения TCNT2 < 0x80 значение PINB3 = 0, а начиная со значения TCNT2 = 0x80 и выше бит PINB3=1. По переполнению TCNT2 и переходу его в ноль, линия PINB3=0. Такая ШИМ со скважностью 0,5 будет продолжаться до тех пока не будет нажата и отпущена одна из кнопок SW1 или SW2. Для того, чтобы наблюдать увеличение скважности ШИМ надо во время паузы щелчком мышки установить бит PIND2 в единицу, выполнить хотя бы один шаг программы, чтобы AVR Studio зарегистрировал “нажатие SW1”. После этого сбросить бит PIND2 в ноль и выполнить один шаг. При этом AVR Studio на линии PIND2 зарегистрирует спадающий фронт импульса (кнопка SW1 отпущена) и будет вызвано прерывание INT_0. Оно уменьшит значение OCR2 на 4, уменьшая тем самым ширину импульса. Нажатие и отжатие кнопки SW2 (PIND3) будет увеличивать ширину импульса на 4 с помощью прерывания INT_1.
Таким образом, мощность, пропускаемая транзистором на обмотку электродвигателя будет регулироваться малыми дискретами, создавая впечатление плавного управления частотой вращения. Задание 2.4.1. Разработать программу для инверсной ШИМ с величиной изменения OCR2, равной 0x30, для увеличения и уменьшения скважности. Задание 2.4.2. Разработать электрическую схему и программу для включения, выключения и управления частотой вращения электродвигателя постоянного тока с использованием трёх кнопок (вкл/выкл, увеличение, уменьшение), опрашиваемых программно. Задание 2.4.3. Разработать электрическую схему и программу для плавного программного уменьшения до нуля яркости свечения лампы переменного тока с использованием динистора. Подсказка: Значение OCR2 должно плавно уменьшаться от 255 до 0 в течение нескольких секунд. Приложение А. Таблица ASCII-кодов
Таблица А.1. Коды основной таблицы ASCII-символов
Таблица А.2. Коды дополнительной таблицы ASCII-символов (Россия)
Приложение Б. Система команд процессоров Intel семейства IA-32 В этом приложении кратко описаны основные команды процессоров Intel семейства IA-32, используемые в реальном режиме адресации. В описании каждой команды приведены флаги, состояние которых изменяется после выполнения команды. Состояния флагов обозначаются символами: 1 – флаг устанавливается; 0 – флаг сбрасывается ? – состояние флага не определено; * – состояние флага изменяется по специально оговорённым правилам. Таблица Б.1. Условные обозначения операндов
Операнды команды имеют следующие обозначения: мнемокод операнд-приёмник, операнд-источник или мнемокод dest, source
Формат команды: AAA
AAD – Коррекция перед делением ASCII-чисел. Преобразовывает неупакованные двоично-десятичные числа, находящиеся в регистрах AH и Формат команды: AAD
Формат команды: AAM
Формат команды: AAS
ADC – Сложение с учётом переноса. Складывает два операнда и прибавляет к результату значение флага переноса. Размеры операндов должны быть одинаковы. Формат команды:
ADC mem, reg ADC reg, mem ADC reg, imm ADC mem, imm
ADD – Сложение. Складывает два операнда. Размеры операндов должны быть одинаковы. Формат команды:
ADD mem, reg ADD reg, mem ADD reg, imm ADD mem, imm
AND – Логическое побитовое И. Результат помещается в операнд-приёмник. Формат команды:
AND mem, reg AND reg, mem AND reg, imm AND mem, imm
Формат команды: BOUND reg32, mem64
BSF, BSR – Сканирование битов. Сканируются биты операнда-источника, пока не будет найден первый единичный бит. Если такой бит найден, флаг нуля ZF сбрасывается, а в регистр-приёмник помещается индекс единичного бита. Иначе флаг ZF устанавливается. BSF сканирует от младшего к старшему биту, BSR – в обратном направлении.
BSF reg16, r/m16 BSF reg32, r/m32
BSWAP – Обмен байтов. Реверсирует порядок следования байтов указанном регистре (переставляет нулевой и третий, первый и второй).
BSWAP reg32
BT, BTC, BTR, BTS – Тестирование битов. Копирует бит операнда-приёника, номер которого задан в операнде-источнике, во флаг переноса CF, а затем в зависимости от команды, инвертирует, сбрасывает или устанавливает этот бит в операнде-приёмнике. Команда BTC инвертирует, BTR – сбрасывает, BTS – устанавливает. Формат команды:
BT r/m32, imm8 BT r/m16, r16 BT r/m32, r32
CALL – Вызов процедуры. Помещает в стек адрес следующей команды и передаёт управление по адресу, указанному в операнде. При вызове ближней процедуры (в том же сегменте кода), в стек помещается только смещение следующей команды. При вызове дальней процедуры – сегмент и смещение следующей команды. Формат команды:
CALL farlabel CALL mem16 CALL mem32 CALL reg
Формат команды: CWB
Формат команды: CDQ
Формат команды: CLC
Формат команды: CLD
Формат команды: CLI
Формат команды: CMC
CMP – Сравнить. Сравнивает операнды путём неявной операции вычитания операнда-источника из операнда-приёмника. Формат команды:
CMP mem, reg CMP reg, mem CMP reg, imm CMP mem, imm
CMPS, CMPSB, CMPSW, CMPSD – Сравнить две строки. Сравнивает две строки в памяти, адреса которых заданы в регистрах DS:ESI и ES:EDI путём неявного вычитания источника из приёмника. CMPS сравнивает явно заданные операнды, CMPSB – сравнивает байты, CMPSW – сравнивает слова, CMPSD – сравнивает двойные слова. Значения регистров ESI и EDI автоматически увеличиваются на 1, 2 или 4, если флаг направления (DF) установлен, и уменьшаются – если сброшен. Величина увеличения/уменьшения определяется размером операндов.
CMPS mem8, mem8 CMPS mem16, mem16 CMPS mem32, mem32 CMPSB CMPSW CMPSD
CMPXCHG – Сравнить и обменять. Сравнивает операнд-приёмник с содержимым аккумулятора. Если они равны, операнд-источник копируется в операнд-приёмник, иначе – операнд-приёмник копируется в аккумулятор.
CMPXCHGreg, reg CMPXCHGmem, reg
Формат команды: CWD
Формат команды: DAA
DAS – Десятичная коррекция после вычитания. Преобразовывает двоичное число, находящееся в AL и полученное в результате выполнения команд SUB и SBB в упакованный десятичный формат.
DEC – Декремент. Вычитает единицу из указанного операнда.
DEC reg DEC mem
DIV – Беззнаковое целочисленное деление. Деление операнда, находящегося в регистрах AX или DX:AX или EDX:EAX, на соответственно 8-, 16-, 32-разрядное беззнаковое целое число, находящееся в одном из регистров или в памяти. При использовании 8-разрядного делителя, делимое находится в AX, частное – в AL, остаток – в AH. При использовании 16-разрядного делителя, делимое находится в DX:AX, частное – в AX, остаток – в DX. При использовании 32-разрядного делителя, делимое находится в EDX:EAX, частное – в EAX, остаток – в EDX.
DIV reg DIV mem
IDIV –Целочисленное деление со знаком. Деление операнда, находящегося в регистрах AX или DX:AX или EDX:EAX, на соответственно 8-, 16-, 32-разрядное целое число со знаком, находящееся в одном из регистров или в памяти. При использовании 8-разрядного делителя, делимое находится в AX, частное – в AL, остаток – в AH. При использовании 16-разрядного делителя, делимое находится в DX:AX, частное – в AX, остаток – в DX. При использовании 32-разрядного делителя, делимое находится в EDX:EAX, частное – в EAX, остаток – в EDX. Как правило, команде IDIV предшествует команда CWB или CWD, с помощью которой знак делимого расширяется влево на нужное число разрядов.
IDIV reg IDIV mem
IMUL –Целочисленное умножение со знаком. Умножение целого числа со знаком, находящегося в аккумуляторе. При использовании 8-разрядного множителя, множимое находится в AL, произведение – в AX. При использовании 16-разрядного множителя, множимое находится в AX, произведение – в DX:AX. При использовании 32-разрядного множителя, множимое находится в EAX, произведение – в EDX:EAX. Как правило, команде IDIV предшествует команда CWB или CWD, с помощью которой знак делимого расширяется влево на нужное число разрядов. Если значение старшей половины произведения не является расширением знакового разряда из младшей половины произведения, то устанавливаются флаги OF, CF.
IMUL r/m8 IMUL r/m16 IMUL r/m32 IMUL r16, r/m16 IMUL r16, imm8 IMUL r16, imm16 IMUL r32, r/m32 IMUL r32, imm8 IMUL r32, imm32 IMUL r16, r/m16, imm8 IMUL r16, r/m16, imm16 IMUL r32, r/m32, imm8 IMUL r32, r/m32, imm32
IN – Ввести данные из порта. Вводит данные из порта и помещает в аккумулятор. Номер порта задаётся в виде 8-разрядной константы (00h‑0FFh), либо 16-разрядного адреса (0000h‑0FFFFh), загруженного в регистр DX.
IN accum, imm IN accum, DX
INC – Инкремент. Прибавляет единицу к указанному операнду.
INC reg INC mem
INS, INSB, INSW, INSD – Ввести строку из порта. Вводит из порта поток байтов, слов или двойных слов и сохраняет их в памяти по адресу, указанному в регистровой паре ES:EDI. Номер порта задаётся в регистре DX. После ввода данных значение EDI автоматически изменяется в зависимости от флага направления на 1, 2 или 4 байта. Величина изменения определяется из названия команды: INSB – на 1 байт, INSW – на 2 байта, INSD– на 4 байта. Перед любой из описываемых команд можно использовать префикс повторения REP.
INS dest, DX REP INSB dest, DX REP INSW dest, DX REP INSD dest, DX
INT – Вызов прерывания. Генерирует программное прерывание. Перед вызовом процедуры обработки прерывания флаги IF и TF сбрасываются, а в стек помещаются текущие значения флагов и адрес возврата: содержимое регистров CS и IP.
INT imm INT 3; для отладки
Формат команды: INTO
IRET, IRETD – Возврат из прерывания. Завершает процедуру обработки прерывания путём извлечения из стека и восстановления регистра флагов и адреса возврата. Команды IRET и IRETD применяются при 16- и 32-разрядном программировании соответственно.
IRET
Jусловие – Условный переход. Переход на метку. Принцип формирования элемента "условие" команды условного перехода показан в нижеуказанной таблице Б.2. Таблица Б.2. Принцип формирования элемента "условие" команды условного перехода.
Мнемоники команды условного перехода приведены в таблице Б.3. Таблица Б.3. Мнемоники условного перехода
Jусловие метка
Формат команды: JCXZ shortlabel JECXZ shortlabel
Формат команды: JMP shortlabel JMP nearlabel JMP farlabel JMP reg16 JMP reg32 JMP mem16 JMP mem32
Формат команды: LAHF
LDS, LES, LFS, LGS, LSS – Загрузить дальний указатель. Загружает содержимое памяти одновременно в сегментный регистр (DS, ES, FS, GS или SS) и в указанный в первом операнде регистр общего назначения.
LDS reg, mem LES reg, mem LFS reg, mem LGS reg, mem LSS reg, mem
LEA – Загрузить текущий адрес. Вычисляет 32-разрядный текущий адрес операнда и загружает его в РОН. Команда очень похожа на команду mov…offset, за исключением того, что команда LEA вычисляет адрес во время выполнения программы, а не во время её компиляции.
LEA reg, mem
LODS, LODSB, LODSW, LODSD – Загрузить строковые данные в аккумулятор. Загружает в аккумулятор содержимое байта, слова или двойного слова, адресуемого через регистр DS:ESI. При использовании LODS необходимо явно указать операнд-источник в памяти. Содержимое регистра ESI автоматически увеличивается/уменьшается на 1,2 или 4, в зависимости от флага направления DF.
LODS mem LODSB LODSW LODSD
LOOP – Организовать цикл. Уменьшает счётчик цикла ECX на единицу и, если ECX больше нуля, передаёт управление по указанной короткой метке, иначе – передаёт управление следующей команде.
LOOP shortlabel
LOOPE, LOOPZ – Организовать цикл, если ZF=1. Уменьшает счётчик цикла ECX на единицу и, если ECX больше нуля и флаг нуля ZF=1, то передаёт управление по указанной короткой метке, иначе – передаёт управление следующей команде.
LOOPE shortlabel LOOPZ shortlabel
LOOPNE, LOOPNZ – Организовать цикл, если ZF=0. Уменьшает счётчик цикла ECX на единицу и, если ECX больше нуля и флаг нуля ZF=0, то передаёт управление по указанной короткой метке, иначе – передаёт управление следующей команде.
LOOPNE shortlabel LOOPNZ shortlabel
MOV – Переслать. Копирует байт, слово или двойное слово из операнда-источника в операнд-приёмник. Формат команды:
MOV mem, reg MOV reg, mem MOV reg, imm MOV mem, imm MOV reg16, segreg MOV segreg, reg16 MOV mem16, segreg MOV segreg, mem16
MOVS, MOVSB, MOVSW, MOVSD – Переслать строку. Копирует байт, слово или двойное слово из памяти, адресуемой регистровой парой DS:ESI, в память, адресуемую регистровой парой ES:EDI. В команде MOVS должны быть указаны оба операнда. Содержимое регистров автоматически изменяется на 1, 2 или 4 в зависимости от типа команды. Если DF=1, то ESI и EDI уменьшаются, иначе – увеличиваются. Формат команды: MOVS dest, source
MOVSB MOVSW MOVSD
Формат команды: MOVSX reg16, reg8 MOVSX reg16, mem8 MOVSX reg32, reg8 MOVSX reg32, mem8 MOVSX reg32, reg16 MOVSX reg32, mem16
Формат команды: MOVSZ reg16, reg8 MOVSZ reg16, mem8 MOVSZ reg32, reg8 MOVSZ reg32, mem8 MOVSZ reg32, reg16 MOVSZ reg32, mem16
Формат команды: MUL reg MUL mem
NEG – Инверсия знака. Изменяет знак числа на противоположный, вычисляя его двоичный дополнительный код.
NEG reg NEG mem
Формат команды: NOP
NOT – Логическое отрицание. Побитная инверсия.
NOT reg NOT mem
OR – Логическое ИЛИ. Формат команды: OR reg, reg OR mem, reg OR reg, mem OR reg, imm OR mem, imm
OUT – Вывести данные в порт. Выводит байт, слово или двойное слово из аккумулятора в порт. Первый операнд определяет номер порта, который задаётся в виде 8-разрядной константы (00h-0FFh), либо 16-разрядного адреса (0000h-0FFFFh), загруженного в регистр DX.
OUT imm, accum OUT DX, accum
OUTS, OUTSB, OUTSW, OUTSD – Вывести строку в порт. Выводит поток байтов, слов или двойных слов из памяти, адрес которой указан в регистровой паре ES:EDI, в порт. Номер порта указывается в регистре DX. После вывода данных EDI автоматически изменяется согласно флагу направления и размеру используемых операндов. Перед командой может использоваться префикс повторения REP.
OUTS dest, DX REP OUTSB dest, DX REP OUTSW dest, DX REP OUTSD dest, DX
POP – Вытолкнуть данные из стека. Копирует содерж
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-06-29; просмотров: 631; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.201.123 (0.016 с.) |