В этом заключительном примере мы объединили ранее полученные знания по аппаратному подключению и программному обслуживанию различных устройств ввода и вывода информации. В каждом параграфе данной главы мы рассмотрели какой-то отдельный тип устройства ввода/вывода. И для каждого устройства привели фрагмент программного кода, который необходим для его обслуживания. Эти фрагменты могут быть использованы Вами в реальных разработках. На примере электронного кодового замка мы покажем Вам, как воспользоваться полученными ранее знаниями.
Рассмотренная ранее матричная клавиатура используется для ввода четырех символов кода доступа. Если последовательность этих символов совпадает с эталонной последовательностью, которая хранится в памяти программы, то доступ разрешается. Если же введенная последовательность символов ошибочная, то доступ блокируется. Для информирования пользователя о состоянии системы доступа используется символьный ЖК индикатор.
Далее мы приводим функциональную схему аппаратных средств, блок-схему алгоритма работы и полную программу управления кодовым замком.
5.8.1. Схема подключения периферийных устройств
Электрическая схема подключения клавиатуры на 16 клавиш и символьного ЖК индикатора к выводам портов МК семейства 68HC12 приведена на рис. 5.22. Линии порта PORT B обслуживают матричную клавиатуру. В соответствии с электрической схемой линии PORTB[0]…PORTB[3] должны работать в режиме вывода, а линии PORTB[4]…PORTB[7] — в режиме ввода. Восьмиразрядная шина данных интерфейса индикатора подключена к выводам порта PORT P. Так же, как и в примере параграфа 5.6.2, мы будем производить только операции записи в контроллер управления индикатором. Поэтому порт PORT P будет постоянно работать в режиме вывода. Линии управления индикатором подключены к выводам PORTDLC2: PORTDLC3.
Рис. 5.22. Функциональная схема аппаратных средств для системы кодового замка
Можно убедиться, что рассмотренные ранее по отдельности схемы подключения клавиатуры и ЖК индикатора полностью повторены, вплоть до конкретных выводов портов. Поэтому мы сможем воспользоваться ранее приведенными программами управления без каких-либо изменений.
5.8.2. Программа управления
На рис. 5.23 представлена блок-схема алгоритма управления кодовым замком. Ниже приведен полный текст программного кода программы управления, составленный по этой блок-схеме алгоритма.
Рис. 5.23. Блок-схема алгоритма управления кодовым замком
/*------------------------------------------------------------------------*/
/* filename: lock.c программа управления электронной системой доступа */
/* Число символов кода доступа равно 4. Правильная кодовая комбинация:C963*/
/* Аппаратная конфигурация: */
/* PORTB 8 линий интерфейса клавиатуры */
/*PORTP 8 линий шины данных интерфейса ЖК индикатора */
/*PORTDLC2 RD/WR, PORTDLC3 E. */
/*------------------------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
#include
#include
/*используемые функции*/
char which_key(unsigned int keypress); //определение, какая клавиша
//нажата
void delay_100us(void); //задержка 100 мкс
void delay_5ms(void); //задержка 5 мс
void initialize_lcd(void); //инициализация контроллера ЖК
//индикатора
void initialize_key(void); //инициализация портов для
//клавиатуры
void putchars(unsigned char с); //запись одного символа в индикатор
void putcommands(unsigned char d); //запись одной команды в индикатор
void lcd_print(char *string); //запись в индикатор строки символов
char keypad(unsigned int keypress, int row);
void main(void) {
int first = 0х01; //инициализация служебных переменных для опроса
int second = 0х02; //клавиатуры
int third = 0х04;
int fourth = 0х08;
int i,j,k, count = 0;
unsigned int keypress;
char key;
int length=4;
char pin[] = {'С', '9', '6', '3'}; //задание эталонной последовательности
//символов
char code[4]; //массив для введенной пользователем
//последовательности символов
initialize_lcd() ; //инициализация ЖК индикатора
initialize_key(); //инициализация портов для клавиатуры
for (k=0; k<4; k++) //разрешает 4 раза ввести комбинацию из
{ //4 символов
count = 0;
putcommands(0x01);
lcd_print("Enter Code:");
while (count < length) //обработка 4 нажатий клавиатуры
{
for(i=0; i<=50; i++) //ожидание ввода символа
{
PORTB = 0х01; //опрос первого ряда клавиатуры
keypress = PORTB;
key = keypad(keypress, first);
if (key != 'Z') //если клавиша нажата
{
printf("%c", key);
code[count] = key; //записать очередной символ в
//массив ввода
count++; //перейти к сканированию следующего
//символа
}
}
for(i=0; i<= 50; i++) // ожидание ввода символа
{
PORTB = 0х02; //опрос второго ряда клавиатуры
keypress = PORTB;
key = keypad(keypress, second);
if (key != 'Z') {
printf("%с", key);
code[count] = key; //записать очередной символ в
//массив ввода
count++; //перейти к сканированию следующего
//символа
}
}
for(i=0; i<= 50; i++) //ожидание ввода символа
{
PORTB = 0х04; //опрос третьего ряда клавиатуры
keypress = PORTB;
key = keypad(keypress, third);
if (key != 'Z') {
printf("%c", key);
code[count] = key; //записать очередной символ в
//массив ввода
count++; //перейти к сканированию следующего
//символа
}
}
for(i=0; i<= 50; i++) //ожидание ввода символа
{
PORTB = 0х08; //опрос четвертого ряда клавиатуры
keypress = PORTB;
key = keypad(keypress, fourth);
if (key != 'Z') {
printf("%c", key);
code[count] = key; //записать очередной символ в
//массив ввода
count++; //перейти к сканированию следующего
//символа
}
}
} //очередные 4 символа введены, можно сверять с эталонными
/*Проверка соответствия кода на эталонный*/
j = 0;
for(i=0;i<3;++i) //проверка по каждому символу эталонной
//последовательности
{
if(pin[i]==code[i]) //очередной символ правильный
{
j++;
} else //очередной символ неправильный
{
j--;
}
}
if (j == (length - 1)) //если j=3, то все символы введены правильно
{
putcommands(0x01);
lcd_print("Access Granted");
}
else //символы введены неправильно
{
putcommands(0x01);
lcd_print("Access Denied");
}
}
putcommands(0x01);
lcd_print(" Goodbye ! "); //конец попыток ввода
}
/*--------------------------------------------------------------------*/
/*Перечень функций, которые использованы в этой программе */
/*--------------------------------------------------------------------*/
/* Функции, программный код которых был приведен ранее по тексту главы*/
char which_key(unsigned int keypress);
void delay_5ms(void);
void delay_100us(void);
void initialize_lcd(void);
void putchars(unsigned char с);
void putcommands(unsigned char d);
void lcdprint(char *string);
char keypad(unsigned int keypress, int row);
//Функция, которая приведена ниже
void initialize_key(void)
/*------------------------------------------------------------------------*/
/* Функция initialize_key устанавливает направление передачи линий портов */
/* для обслуживания клавиатуры */
/*------------------------------------------------------------------------*/
void initialize_key(void) {
DDRB = 0x0F; //линии PORTB[0]…PORTB[3] на вывод
//линии PORTB[4]…PORTB[7] на ввод
PORTB = 0х00; //четыре младших линии порта PORTB в 0
}
/*-------------------------------------------------------------------------*/
5.9. Интерфейс МК с аналоговыми датчиками
Оглавление
-
ПРЕДИСЛОВИЕ
-
Структура книги
-
Учебные системы
-
Целевая аудитория
-
Благодарности
-
Глава 1 ПЕРВОЕ ЗНАКОМСТВО СО ВСТРАИВАЕМЫМИ СИСТЕМАМИ
-
1.1. Что такое встраиваемая система?
-
1.2. Особенности встраиваемых систем
-
1.2.1. Работа в реальном времени
-
1.2.2. Миниатюризация размеров и процесс тестирования
-
1.2.3. Минимизация энергии потребления
-
1.2.4. Интерфейс пользователя и интерфейс сопряжения с объектом
-
1.2.5. Многозадачность
-
1.2.6. Минимизация стоимости
-
1.2.7. Ограничение объема памяти
-
1.2.8. Программно–аппаратный дуализм
-
1.3. Введение в микроконтроллеры семейства 68HC12 и HCS12
-
1.4 Микроконтроллеры HCS12
-
1.4.1. Семейство HCS12
-
1.4.2. Обозначения МК
-
1.4.3. Модельный ряд HCS12
-
1.5. Заключение по главе 1
-
1.6. Вопросы и задания
-
Глава 2 ПРОГРАММИРОВАНИЕ ВСТРАИВАЕМЫХ СИСТЕМ И СТРУКТУРНОЕ ПРОЕКТИРОВАНИЕ
-
2.1. Почему мы программируем микроконтроллеры на Си?
-
2.2. Преимущества программирования на языке ассемблер
-
2.3. Преимущества языков высокого уровня
-
2.3.1. Выбираем язык высокого уровня для программирования встраиваемых систем
-
2.3.2. Краткая история языка Си
-
2.4. Оптимальная стратегия — программирование на Си и на ассемблере
-
2.5. Структурное проектирование
-
2.5.1. Основные положения метода структурного проектирования
-
2.5.2. Документирование программ
-
2.5.3. Как язык Си соотносится со структурным проектированием
-
2.6. Рабочие тетради
-
2.6.1. Порядок ведения записей
-
2.6.2. Содержание записей
-
2.7. Блок схемы алгоритмов
-
2.8. Пример применения
-
2.9. Заключение по главе 2
-
2.10 Что ещ е почитать?
-
2.11 Вопросы и задания
-
Глава 3 ОСНОВЫ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ НА СИ
-
3.1. Введение в программирование на Си
-
3.1.1. Глобальные и локальные переменные
-
3.2. Типы данных в Си
-
3.3. Операторы языка Си
-
3.4. Функции
-
3.4.1. Что такое функция?
-
3.4.2. Основная программа
-
3.4.3. Прототипы функций
-
3.4.4. Описание функций
-
3.4.5. Вызов функций, передача параметров, возврат полученных значений
-
3.5. Файлы заголовков
-
3.6. Директивы компилятора
-
3.6.1. Директивы условной компиляции
-
3.7. Конструкции программирования
-
3.8. Операторы для организации программных циклов
-
3.8.1. Оператор FOR
-
3.8.2. Оператор WHILE
-
3.8.3. Оператор DO-WHILE
-
3.9. Операторы принятия решения
-
3.9.1. Оператор IF
-
3.9.2. Оператор IF-ELSE
-
3.9.3. Оператор IF-ELSE IF-ELSE
-
3.9.4. Оператор SWITCH
-
3.10. Массивы
-
3.11. Указатели
-
3.12. Структуры
-
3.13. Процесс программирования и отладки микропроцессорной системы
-
3.13.1. Технология создания программного кода
-
3.13.2. Режим отладки BDM
-
3.13.3. Аппаратные и программные средства отладчика P & E от компании PEMICRO
-
3.13.4. Эмуляторы
-
3.13.5. Логические анализаторы
-
3.14. Особенности компилятора и ассемблера
-
***
-
3.15. Заключение по главе 3
-
3.16. Что еще почитать?
-
3.17. Вопросы и задания
-
Глава 4 МИКРОКОНТРОЛЛЕРЫ 68HC12 И HCS12: АРХИТЕКТУРА И ПРОГРАММИРОВАНИЕ
-
4.1. Аппаратные средства микроконтроллеров семейства 68HC12
-
***
-
4.2. Аппаратные средства МК семейства HCS12
-
4.3. Режимы работы МК семейства 68HC12/HCS12
-
4.3.1. Рабочие режимы
-
4.3.2. Режимы работы отладочной платы M68EVB912B32
-
4.4. Назначение выводов МК
-
4.5. Регистры специальных функций МК
-
4.5.1. Виртуальный адрес блока регистров
-
4.6. Порты ввода/вывода
-
4.6.1. Спецификация портов ввода/вывода
-
4.7. Подсистема памяти МК B32
-
4.7.1. Карта памяти МК B32
-
4.7.2. Изменение адресов в карте памяти МК
-
4.8. Подсистема памяти МК DP256
-
4.9. Состояния сброса и прерывания МК
-
4.9.1. Реакция МК на внешние события
-
4.10. Состояния сброса и прерывания в МК 68HC12
-
4.10.1. Состояние сброса МК
-
4.10.2. Прерывания
-
4.10.3. Вектора исключений
-
4.10.4. Система приоритетов для исключений
-
4.10.5. Регистры подсистемы прерывания
-
4.11. Процесс перехода к подпрограмме прерывания
-
4.12. Оформление подпрограммы прерывания на Си
-
4.13. Система тактирования
-
4.13.1.Система тактирования отладочной платы MC68HC912B32EVB
-
4.14. Подсистема реального времени — модуль таймера
-
4.14.1. Структура модуля таймера
-
4.14.2. Счетчик временной базы
-
4.14.3. Регистры для управления счетчиком временной базы
-
4.14.4. Каналы захвата/сравнения
-
4.14.5. Счетчик событий
-
4.15. Модуль меток реального времени
-
4.16. Модуль таймера ECT в составе МК МC68HC12BE32 и HCS12
-
4.16.1. Небуферированные каналы входного захвата
-
4.16.2. Буферированные каналы входного захвата
-
4.16.3. Особенности счетчиков событий
-
4.16.4. Регистры управления модуля EST
-
4.17. Обмен информацией в последовательном коде: многофункциональный последовательный интерфейс
-
4.17.1. Термины последовательного обмена
-
4.18. Контроллер асинхронного обмена SCI
-
4.18.1. Передатчик контроллера SCI
-
4.18.2. Приемник контроллера SCI
-
4.18.3. Регистры контроллера SCI
-
4.18.4. Алгоритмы программного об служивания контроллера SCI
-
4.18.5. Пример программирования контроллера SCI
-
4.19. Синхронный последовательный интерфейс SPI
-
4.19.1 Концепция интерфейса SPIФункциональная схема обмена между двумя контроллерами SPI
-
4.19.2. Алгоритмы работы контроллера SPI
-
4.19.3. Регистры контроллера SPI
-
4.19.4. Алгоритмы программного обслуживания контроллера SPI
-
4.19.5 Периферийные ИС с интерфейсом SPI
-
4.20. Введение в теорию аналого-цифрового преобразования
-
4.20.1. Частота дискретизации сигнала
-
4.20.2. Представление аналоговой величины в цифровом коде
-
4.20.3.Квантование по уровню и разрешающая способность
-
4.20.4 Скорость потока данных оцифровки
-
4.21. Принцип действия АЦП
-
4.21.1. АЦП последовательного приближения
-
4.22. Подсистема аналого-цифрового преобразования МК 68HC12
-
4.22.1 Структура и порядок функционирования
-
4.22.2. Регистры управления модуля ATD
-
4.22.3. Пример программирования модуля ATD
-
4.22.4. Обслуживание прерываний от модуля ATD
-
4.23. Особенности модуля ATD в составе МК семейства HCS12
-
4.23.1. Выбор разрядности АЦП
-
4.23.2. Представление результата измерения
-
4.23.3. Запуск измерительной последовательности от внешнего сигнала
-
4.23.4. Программируемое число преобразований в измерительной последовательности
-
4.23.5. Увеличение числа аналоговых входов
-
4.23.6. Регистры модуля ATD HCS12
-
4.24. Подсистема широтно-импульсной модуляции
-
4.24.1. Структура модуля PWM
-
4.24.2. Режимы центрированной и фронтовой ШИМ
-
4.24.3. Система тактирования
-
4.24.4. Регистры модуля PWM
-
4.24.5. Примеры программирования модуля PWM
-
4.25. Ограничение энергии потребления
-
4.25.1. Как остановить МК 68HC12
-
4.25.2. Как вывести МК 68HC12 из состояния пониженного энергопотребления
-
4.26. Советы по использованию платы отладки MC68EVB912B32
-
4.27. Заключение по главе 4
-
4.28. Что еще почитать?
-
4.29. Вопросы и задания
-
Глава 5 ОСНОВЫ СОПРЯЖЕНИЯ МК С УСТРОЙСТВАМИ ВВОДА/ВЫВОДА
-
5.1. Электрические характеристики МК 68HC12
-
5.1.1. Нагрузочные характеристики
-
5.1.2. Что произойдет, если Вы должным образом не учтете электрические характеристики периферийных ИС?
-
5.1.3. Входные и выходные характеристики логических элементов
-
5.2. Устройства дискретного ввода: кнопки, переключатели, клавиатуры
-
5.2.1. Кнопки и переключатели
-
5.2.2. DIP переключатели
-
5.2.3. Клавиатуры
-
5.3. Устройства индикации: светодиоды, семисегментные индикаторы, индикаторы логического выхода с тремя состояниями
-
5.3.1. Светодиоды
-
5.3.2. Семисегментные индикаторы
-
5.3.3. Индикаторы для логического выхода с тремя состояниями
-
5.4. Программное обслуживание дискретных входов и выходов
-
5.5. Подавление механического дребезга контактов переключателей
-
5.5.1. Аппаратная защита от механического дребезга контактов
-
5.5.2. Программная защита от механического дребезга контактов
-
5.5.3. Пример программной защиты
-
5.6. Жидкокристаллические индикаторы
-
5.6.1. Краткие сведения о жидкокристаллических индикаторах
-
5.6.2. Сопряжение МК с символьным ЖК индикатором
-
5.6.3 Сопряжение МК с графическим ЖК дисплеем
-
5.7. Управление электрическим двигателем
-
5.7.1. Силовые полупроводниковые ключи
-
5.7.2. Оптоэлектронная потенциальная развязка
-
5.7.3. Инвертор напряжения
-
5.8. Кодовый замок
-
5.8.1. Схема подключения периферийных устройств
-
5.8.2. Программа управления
-
5.9. Интерфейс МК с аналоговыми датчиками
-
5.10. Интерфейс RS-232
-
5.11. Заключение по главе 5
-
5.12. Что еще почитать?
-
5.13. Вопросы и задания
-
Глава 6 ДОБРО ПОЖАЛОВАТЬ В РЕАЛЬНЫЙ МИР!
-
6.1. Ужасные истории об ошибках проектирования
-
6.1.1. Случай квадратичного генератора
-
6.1.2. Случай таймера для лазерного излучения
-
6.2. Правила обращения с микросхемой 68НС12 и рекомендации по проектированию
-
6.2.1. Рекомендации по обращению со CMOS
-
6.2.2. Рекомендации по проектированию на CMOS
-
6.3. Исследование помех
-
6.3.1. Что такое помехи
-
6.3.2. Электромагнитная совместимость
-
6.3.3. Спецификации системы помех — не будем крепки задним умом!
-
6.3.4. Методы снижения помех
-
6.4. Защитное программирование
-
6.5. Методики испытаний на наличие помех
-
6.5.1. Обнаружение помех
-
6.5.2. Испытание на чувствительность к помехам
-
6.5.3. Испытания на электромагнитную совместимость
-
6.6. Управление энергопотреблением
-
6.6.1. Параметры потребляемой мощности для микроконтроллера 68HC12
-
6.6.2. Типы батарей
-
6.6.3. Емкость батарей
-
6.6.4. Стабилизация напряжения
-
6.6.5. Схемы супервизора для микропроцессора
-
6.6.6. Меры энергосбережения
-
6.7. Заключение по главе 6
-
6.8. Что еще прочитать?
-
6.9. Вопросы и задания
-
Глава 7 ПРИМЕРЫ ВСТРОЕННЫХ СИСТЕМ УПРАВЛЕНИЯ
-
7.1. Система привода робота, движущегося вдоль стенок лабиринта
-
7.1.1. Описание проекта
-
7.1.2. Подсистемы 68HC12, используемые в проекте
-
7.1.3. Компоненты системы
-
7.1.4. Структура программы и блок-схема алгоритма
-
7.1.5. Программный код
-
7.2. Лазерный проектор
-
7.2.1. Описание проекта
-
7.2.2. Подсистемы 68HC12 используемые в проекте
-
7.2.3. Описание некоторых компонентов системы
-
7.2.4. Аппаратные средства
-
7.2.5. Структура программы и блок-схема алгоритма
-
7.2.6. Программный код
-
7.2.7. Испытания устройства
-
7.2.8. Заключительные испытания системы управления
-
7.3. Цифровой вольтметр
-
7.3.1. Описание проекта
-
7.3.2. Системы 68HC12 используемые в проекте
-
7.3.3. Расчет интерфейса модуля ATD
-
7.3.4. Структура программы и блок-схема алгор итма
-
7.3.5. Программа управления
-
7.3.6. Измерение неэлектрических величин
-
7.4. Стабилизация скорости вращения двигателя с использованием оптического тахометра
-
7.4.1. Описание проекта
-
7.4.2. Немного теории
-
7.4.3. Анализ
-
7.4.4. Структура программы и блок-схема алгоритма
-
7.4.5. Программный код
-
7.4.6. Испытания
-
7.5. Парящий робот
-
7.5.1. Описание проекта
-
7.5.2. Системы HCS12 используемые в проекте
-
7.5.3. Теоретическое обсуждение
-
7.5.4. Структура программы и блок-схема алгоритма
-
7.5.5. Программный код
-
7.5.6. Некоторые комментарии
-
7.6. Система защиты компьютера, основанная на нечеткой логике
-
7.6.1. Описание проекта
-
7.6.2. Использование системы HCS12
-
7.6.3. Основы теории
-
7.6.4. Структура программы и блок-схема алгоритма
-
7.6.5. Описание системы
-
7.6.6. Обсуждение проекта
-
7.6.7. Программный код
-
7.6.8. Некоторые комментарии
-
7.7. Электронная версия игры в «15»
-
7.7.1. Описание проекта
-
7.7.2. Системы HCS12 используемые в проекте
-
7.7.3. Основы теории
-
7.7.4. Схемное решение, структура программы и блок-схема алгоритма
-
7.7.5. О компонентах системы
-
7.7.6. Программный код
-
7.7.7. Некоторые комментарии
-
7.8. Программирование резидентного Flash ПЗУ микроконтроллера B32 в составе платы отладки MC68HC912B32EVB
-
7.9. Заключение по главе 7
-
7.10. Что еще прочитать?
-
7.11. Вопросы и задания
-
Глава 8 ОПЕРАЦИОННЫЕ СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ
-
8.1. Рассказ: официант — «живая» операционная система реального времени
-
8.2. Что является целью ОСРВ?
-
8.3. Обзор концепций
-
8.3.1. Требования к динамическому распределению RAM
-
8.3.2. Динамическое распределение памяти
-
8.3.3. Структуры данных
-
8.4. Основные понятия
-
8.4.1. Что такое задача?
-
8.4.2. Управление задачами
-
8.4.3. Компоненты многозадачных систем
-
8.5. Типы операционных систем реального времени
-
8.5.1. Системы с циклическим опросом
-
8.5.2. Циклический опрос с прерываниями
-
8.5.3. Карусельные системы
-
8.5.4. Смешанные системы
-
8.5.5. Системы с управлением по прерыванию
-
8.5.6. Кооперативная многозадачность
-
8.5.7. Многозадачные системы с преимущественным приоритетом
-
8.6. Проблемы ОСРВ
-
8.6.1. Конкуренция
-
8.6.2. Повторная входимость
-
8.6.3. Межзадачные связи
-
8.6.4. Безопасность, проверка и безотказная работа
-
8.6.5. Главный вопрос
-
8.7. Выполнение операционной системы реального времени
-
8.8. Пример применения: ОСРВ циклического опроса
-
8.8.1. Краткий обзор проекта
-
8.8.2. Пример кода
-
8.8.3. Испытание контроллера усилителя
-
8.9. Другая прикладная программа: цикл опроса с прерываниями
-
8.10. Сложное прикладное устройство: имитатор ОСРВ
-
8.10.1. Краткий обзор проекта
-
8.10.2. Типовой код
-
8.11.Заключение по главе 8
-
8.12. Что еще почитать?
-
8.13. Вопросы и задания
-
Глава 9 РАСПРЕДЕЛЕННЫЕ СЕТИ С ИНТЕРФЕЙСОМ msCAN
-
9.1. Компьютерные сети
-
9.2. Промышленные сети
-
9.3. Сети с протоколом CAN
-
9.3.1. Протокол CAN
-
9.3.2. Модуль контроллера последовательного обмена msCAN12
-
9.3.3. Проблемы синхронизации
-
9.3.4. Конфигурирование модуля msCAN12 для работы в сети
-
9.4. Различия между контроллерами msCAN в составе 68HC12 и HCS12
-
9.5. Пример программирования контроллера msCAN Схема включения аппаратных средств для двух отладочных плат Axiom
-
9.6. Контроллер последовательного обмена BDLC
-
9.7. Заключение по главе 9
-
9.8. Что еще почитать?
-
9.9. Вопросы и задания
-
Примечания