- •Системное программирование
- •Контрольные вопросы
- •2. Программная модель микропроцессора 8086
- •2.1. Представление информации
- •2.2. Регистры микропроцессора
- •2.3. Формат машинной команды
- •2.4. Способы задания операндов команды
- •Контрольные вопросы
- •3. Основные понятия языка ассемблера
- •3.1. Предложения
- •3.2. Директивы определения данных
- •3.3. Выражения
- •Контрольные вопросы
- •4. Сегментированная модель памяти
- •4.1. Сегментирование адресов
- •4.2. Директивы сегментации
- •4.3. Общая структура программы
- •4.4. Модели памяти
- •Контрольные вопросы
- •5. Основные группы команд
- •5.1. Соглашению по описанию команд
- •5.2. Команды пересылки данных
- •5.3. Арифметические команды
- •5.4. Логические команды
- •5.5. Команды переходов
- •5.6. Команды организации циклов
- •5.7. Команды обработки строк
- •5.8. Стековые команды
- •5.9. Команды ввода-вывода
- •5.10. Команды прерываний
- •5.11. Команды управления микропроцессором
- •Контрольные вопросы
- •6. Подпрограммы
- •Контрольные вопросы
- •7. Разработка одномодульной программы
- •7.1. Трансляция и компоновка программы
- •7.2. Отладка программы
- •Контрольные вопросы
- •8. Разработка многомодульных программ
- •8.1. Принципы разработки модулей
- •8.2. Расширенное применение директивы сегментации
- •9. Упражнения
- •Контрольные вопросы
- •Программирование микропроцессорных устройств
- •10. Программирование системного таймера
- •10.1. Описание таймера-счетчика 8254
- •10.2. Режимы работы таймера
- •10.3. Структура регистров таймера
- •10.4. Упражнения
- •Контрольные вопросы
- •11. Программирование контроллера прерываний
- •11.1. Механизм обработки прерываний
- •11.2. Типы прерываний
- •11.3. Приоритеты прерываний
- •11.4. Контроллер прерываний 8259
- •11.5. Идентификация прерываний
- •11.6. Прерывания bios и ms-dos
- •11.7. Упражнения
- •Контрольные вопросы
- •12. Программирование параллельного порта
- •12.1. Интерфейс Centronics
- •12.2. Работа с параллельным портом на низком уровне
- •12.3. Стандартные средства работы с параллельным портом
- •12.4. Упражнения
- •Контрольные вопросы
- •13. Программирование последовательного порта
- •13.1. Основы последовательной передачи данных
- •13.2. Последовательный интерфейс rs-232c
- •13.3. Универсальный асинхронный приемо-передатчик 8250
- •13.4. Порты асинхронного адаптера
- •13.5. Стандартные средства программирования последовательного порта
- •13.6. Упражнения
- •Контрольные вопросы
- •Литература
- •141 Кафедра Вычислительной Техники и Программирования Московского Государственного Открытого Университета
Контрольные вопросы
Каковы этапы разработки многомодульной программы на языке ассемблера?
Опишите структуру модуля на языке ассемблера.
Перечислите параметры и назначение директивы SEGMENT.
Программирование микропроцессорных устройств
10. Программирование системного таймера
Управление периферийными устройствами требует от микропроцессорной системы точного задания временных интервалов между управляющими сигналами. Сделать это программно зачастую невозможно из-за сложного временного расписания обмена данными внутри системы. Поэтому такие задачи поручают программируемым таймерам-счетчикам. С помощью таймера можно формировать временные интервалы произвольной длительности, производить синхронизацию внешних устройств, организовывать счетчики событий, вести счет текущего времени.
Таймеры-счетчики на основе микросхем Intel 8253 и 8254 широко распространены, и их различные модификации можно встретить во многих цифровых устройствах. Например, любой IBM PC совместимый компьютер содержит такой таймер. Отечественными аналогами таймеров являются микросхемы К1810ВИ53 и К1810ВИ54.
10.1. Описание таймера-счетчика 8254
Структурная схема таймера приведена на рис. 30. Он состоит из трех независимых программируемых канала. На схеме показан только первый канал, остальные два являются идентичными. Блок логики чтения-записи управляет обменом данными между тремя счетчиками и шиной данных.
Рис. 30. Структурная схема таймера-счетчика 8253(4).
Назначение выводов микросхемы приведено в табл. 77.
Табл. 77. Назначение выводов.
Вывод |
Описание |
D0…D7 |
Двунаправленная шина данных. |
/WR |
Write (запись). По низкому уровню на входе микропроцессор записывает данные в таймер |
/RD |
Read (чтение). Низкий уровень на входе информирует таймер, что процессор запрашивает чтение состояния счетчика. |
/CS |
Chip Select (выбор микросхемы). Низкий уровень инициирует обмен между процессором и таймером. Не оказывает воздействия на работу счетчиков таймера |
A0, A1 |
Адресные входы. Позволяют выбрать один из трех счетчиков для операции чтения/записи состояния счетчиков. |
CLK0...CLK2 |
Тактовые входы каждого из трех счетчиков. |
GATE0…GATE2 |
Входы разрешения счетчиков. Уровень "1" - разрешение счета. |
OUT0…OUT2 |
Выходы счетчиков. |
Каждый канал включает схемы управления, синхронизации и регистры:
регистр счетчика, работающий на вычитание (16 разрядов);
регистр делителя (16 разрядов).
буферный регистр (16 разрядов);
регистр состояния канала (8 разрядов);
управляющий регистр (8 разрядов);
Каналы подключаются к внешним устройствам при помощи трех линий:
управляющего входа GATE;
входа тактовой частоты CLK;
выхода таймера OUT.
В управляющий регистр записывается слово, определяющее режим работы канала. Схема управления синхронизирует работу отдельных схем в соответствии с запрограммированным режимом работы. Схема синхронизации формирует серию внутренних импульсов с длительностью, определяемой внутренними времязадающими цепями, и периодом, равным периоду внешних тактовых импульсов.
Загрузка регистра счетчика выполняется путем помещения значения делителя в регистр делителя. Делитель помещается в два этапа: сначала записывается младший байт данных (Least Significant Byte, LSB), а затем старший байт данных (Most Significant Byte, MSB). В начале цикла работы канала константа счета из регистра хранения переписывается в счетчик, и затем по тактовым импульсам на входе CLK происходит декремент содержимого счетчика.
Буферный регистр (регистр задвижки) позволяет получить текущее значение регистра счетчика в любой момент времени. Низкий логический уровень сигнала на входе GATE отключает канал от входных импульсов CLK, а высокий – вновь подключает. Поэтому управляющий вход GATE можно использовать для синхронизации момента начала отсчета.
В микропроцессорных системах, построенных на основе архитектуре IBM PC, микросхема таймера принимает импульсы от генератора с опорной частотой 1.19 МГц. Программируемый коэффициент деления таймера может изменяться от 2 до 65535. Следовательно, диапазон возможных выходных частот находится в пределах от 18.2 Гц до 600 кГц.
Назначение каналов следующее:
канал 0 используется счетчиком времени суток;
канал 1 управляет обновлением памяти: выходная линия канала связана с микросхемой прямого доступа к памяти, и ее импульс заставляет контроллер DMA обновить содержимое памяти;
канал 2 связан с динамиком; он производит прямоугольные импульсы для генерации звука.
Выход первого из делителей используется для отсчета времени (канал 0), причем его выход, в свою очередь, связан с контроллером прерываний. Прерывание по таймеру возникает, когда внутренний двухбайтовый счетчик таймера обнулится. Первоначально он содержит значение 65535, т.е. установлен максимально возможный коэффициент делителя. При получении очередного импульса его значение уменьшается на 1. Поэтому период следования импульсов составляет 0,055 сек., а частота равна 18.2 Гц.
Для накопления количества импульсов таймера используется переменная BIOS (базовая система ввода-вывода), расположенная по адресу 0000:046Ch. Она представляет 4-байтный счетчик импульсов. Каждый импульс инициирует прерывание таймера BIOS номер 8, которое увеличивает на единицу значение переменной (рис. 31). Прерывание является аппаратным, поэтому оно обрабатывается всегда независимо от загруженности процессора.
Рис. 31. Изменение счетчика времени суток BIOS.