- •Минобрнауки россии
- •1. Задание на проектирование
- •Общие сведения
- •Техническое задание на проектирование
- •Варианты заданий
- •Формирование управляющего воздействия у1
- •Формирование управляющего воздействияY2
- •Формирование управляющего воздействияY3
- •Светодиодная индикация
- •Организация подсистемы прерываний
- •Выбор элементной базы
- •Реализуемый алгоритм
- •Требования к оформлению
- •Основные этапы разработки
- •Разработка микропроцессорного модуля
- •Описание элементной базы мпм
- •Микропроцессор i82386sx
- •Реализация системного контроллера
- •Шинные формирователи шин адреса и данных
- •Генератор тактовых импульсов и схема сброса
- •Реализация подсистемы прерываний
- •Разработка модуля ввода-вывода
- •Параллельно-программируемый адаптер кр580вв55
- •Разработка модуля таймера
- •Работа пит в режиме 0 (программируемый таймер)
- •Работа пит в режиме 3
- •Разработка памяти мпс
- •Распределение адресного пространства памяти
- •Разработка модулей пзу и озу
- •Распределение адресного пространства ввода/вывода
- •Разработка управляющей программы
- •Литература
Разработка управляющей программы
Для упрощения написания и последующего восприятия программы, возможности ее частичного написания до разработки аппаратной части МПС и для уменьшения затрат времени на отладку программы, ее следует разрабатывать с использованием символической формы обозначения различных устройств, параметров, констант и т.д. Например, при обращении к УВВ с помощью команд IN и OUT, нецелесообразно использование числовых значений адресов УВВ, выделенных им в АПУВВ. Гораздо удобнее в тексте программы указывать символические имена этих устройств, кратко обозначающих их названия или выполняемые ими функции. Для связи символических имен с их числовыми значениями используется директива EQU.
Используем введенные при распределении АПП и АПУВВ символические имена устройств ППА и ПИТ и присвоенные им значения адресов. При этом получим следующее начало программы:
; kp_386_Real_NoOS.asm
; текст программы для курсового проекта по ОЭВМ (i386)
;--------------------------------------------------------------------------------------------
;-- kp_386_Real_NoOS.asm --
;-- Текст программы для курсового проекта по ОЭВМ (i386). --
;-- После включения питания или сброса регистры процессора --
;-- установлены: CS = F000h; IP = FFF0h; DS = SS = ES = 0. --
;-- Код программы должен быть размещен в микросхеме ПЗУ --
;-- в последних 64х килобайтах --
;--------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------
;-- Определение констант --
;-------------------------------------------------------------------------
Adr_ROM_Reset EQU FFFF0h ; Адрес области ROM с которой начинается выполнение команд при включении питания или сброса
Adr_ROM_Start EQU F0000h ; Начальный адрес сегмента кода
Adr_RAM_Begin EQU 0h ; Начальный адрес ОЗУ
Adr_RAM_Data EQU 0400h ; Начальный адрес сегменда данных
Adr_ROM_Stack EQU 7FFFFh ; Максимально возможный адрес ОЗУ, для указания вершины стека
Adr_PIC_A0 EQU 0 ; Адрес контроллера прерываний (A0 = 0)
Adr_PIC_A1 EQU 2 ; Адрес контроллера прерываний (A0 = 1)
Adr_PIT_0 EQU 8 ; Адрес регистра состояния счетчика 0 ПИТ
Adr_PIT_1 EQU 10 ; Адрес регистра состояния счетчика 1 ПИТ
Adr_PIT_2 EQU 12 ; Адрес регистра состояния счетчика 2 ПИТ
Adr_PIT_CW EQU 14 ; Адрес регистра управления ПИТ
Adr_PPA_A EQU 16 ; Адрес регистра порта А ППА
Adr_PPA_B EQU 18 ; Адрес регистра порта B ППА
Adr_PPA_C EQU 20 ; Адрес регистра порта C ППА
Adr_PPA_CW EQU 22 ; Адрес регистра управления ППА
IRQ_n EQU 00001001b ; Адрес – вектор прерывания по варианту задания
Adr_IRQ_n EQU IRQ_n * 4; Адрес начала области из четырех ЯП, в которой размещается адрес первой команды программы обработки прерывания.
Adr_Data_K EQU Adr_RAM_Data + 0; Ячейка в ОЗУ для хранения значения К
Adr_Data_X EQU Adr_RAM_Data + 1; Ячейка в ОЗУ для хранения значения Х
Adr_Data_Y1 EQU Adr_RAM_Data + 2; Ячейка в ОЗУ для хранения значения У1
Adr_Data_Y2 EQU Adr_RAM_Data + 3; Ячейка в ОЗУ для хранения значения У2
Adr_Data_Y3 EQU Adr_RAM_Data + 4; Ячейка в ОЗУ для хранения значения У3
;-----------------------------------------------------------------------------
;-- Подготовка к запуску основной программы после --
;-- включения питания или сброса --
;-- CS = F000h; IP = FFF0H; DS = SS = ES = 0 --
;-----------------------------------------------------------------------------
ORG Adr_ROM_Reset ; Начальный адрес области ROM
jmp Adr_ROM_ Start ; Переход на основную программу по адресу Adr_ROM_Start
ORG Adr_ROM_ Start;
mov ax, Adr_ROM_Start
mov cs, ax
mov ax, Adr_ROM_Stack
mov ss, ax
mov ax, Adr_RAM_Data
mov ds, ax ; -- Установка сегмента данных на ОЗУ
xor ax, ax ; Записать 0 в AX
cli ; Запрет аппаратных прерываний
;-------------------------------------------------------------------------
;-- Установка начальных параметров --
;-- Программирование ПИТ, ППА, КП --
;-- Определение переменных в памяти --
;-------------------------------------------------------------------------
ProgramBegin:
; Установить вектор прерывания (адрес подпрограммы обработки прерывания)
; Настройка es на начало таблицы векторов прерываний - в реальном режиме mov ax, 0h
mov es, ax
mov ax, offset ProgramPrer ; Определение смещения адреса подпрограммы обработки прерывания
mov es:Adr_IRQ_n, ax ; Запись в два младших байта ТВП по адресу Adr_IRQ_n
push cs
pop ax
mov es:Adr_IRQ_n + 2, ax; Запись в два старших байта ТВП по адресу Adr_IRQ_n
; Программирование ППА
mov al, 10010000b ; Управляющее слово для ППА
out Adr_PPA_CW, al
; Установить содержимое сегмента данных
; Указание меток и содержимого (переменных)
call ProgramKlavIn ; опрос клавиатуры для получения К и Х
;Выдать Y3
call ProgramCalculateY3SetPIT
call ProgramCalculateY1SetY1SetInd ; начальная установка У1 и идникации
; Рограммирование ПИТ
call ProgramCalculateY2SetPIT
; Программирование контроллера прерываний
mov al, 00010010b ; Запись ICW1 в КП (работа КП)
out Adr_KP_A0, al
mov al, Adr_IRQ_n ; Запись ICW2 в КП (адрес первого вектора прерывания, с которым работает КП)
out Adr_KP_A1, al
mov al, 00000000b ; Запись OCW1 в КП (маскирования прерываний для разрешения)
out Adr_KP_A1, al
sti ; Разрешение аппаратных прерываний
;-------------------------------------------------------------------------
;-- Начало основной программы --
;-------------------------------------------------------------------------
ProgramStart:
call ProgramKlavIn
call ProgramCalculateY1SetY1SetInd
jmp ProgramStart
;-------------------------------------------------------------------------
;-- Подпрограмма обработки прерывания --
;-------------------------------------------------------------------------
ProgramPrer:
push ax
call ProgramCalculateY2SetPIT
pop ax
iret
;-------------------------------------------------------------------------
;-- Подпрограмма опроса клавиатуры (порта А ППА) --
;-------------------------------------------------------------------------
ProgramKlavIn:
push ax
push dx
push bx
; прнять и сохранить значение Х
in ax, Adr_PPA_A
mov ds:Adr_Data_X, ax
; притянь и сохранить значение К
in dx, Adr_PPA_B
mov ds:Adr_Data_K
pop bx
pop dx
pop ax
ret
;-------------------------------------------------------------------------
;-- Подпрограмма рассчитывает У1 и выводит его в порт С --
;-- (Значение У1 используется для индикации и управшения объектом. --
;-- для индикации старшая тетрада У1 --
;-- для управления объектом младшая тетрада) --
;-------------------------------------------------------------------------
ProgramCalculateY1SetY1SetInd:
push ax
push dx
; расчет У1
mov dx, ds:Adr_Data_X
mov ax, ds:Adr_Data_K
add dx
mov ds:Adr_data_Y1, ax
; Вывод в порт С
mov bx, ax
and ax, 0000000000001111b ; выделение младшей тетрады в ax
and bx, 0000000011110000b ; выделение старшей тетрады в bx
or ax, bx ; младшая и старшая тердады в общий регистр ax
out Adr_PPA_C, al
pop dx
pop ax
ret
;-------------------------------------------------------------------------
;-- Подпрограмма расчета Y2 и программирования ПИТ --
;-- (поскольку надо У2 вычислить только раз при включении питания --
;-- или обработке прерывания) --
;-------------------------------------------------------------------------
ProgramCalculateY2SetPIT:
push ax
push dx
; расчет У2
mov dx, ds:Adr_Data_X
mov ax, ds:Adr_Data_K
add dx
mov ds:Adr_data_Y2, ax
; программирование ПИТ по значению У2
mov ax, 0000000000011110b ; записать младший байт в счетчик 0 и установить режим 3
out Adr_PIT_U, al
out Adr_PIT_0, dl
mov ax, 0000000000101110b ; записать старший байт
out Adr_PIT_U, al
out Adr_PIT_0, dh
mov ax, 0000000000001110b ; защелкнуть
out Adr_PIT_U, al
pop dx
pop ax
ret
;-------------------------------------------------------------------------
;-- Подпрограмма расчета Y3 --
;-------------------------------------------------------------------------
ProgramCalculateY3SetPIT:
push ax
push dx
; расчет У3
mov dx, ds:Adr_Data_X
mov ax, ds:Adr_Data_K
add dx
mov ds:Adr_data_Y3, ax
; Программирование ПИТ для У3
mov ax, 0000000001010000b ; записать младший байт в счетчик 0 и установить режим 3
out Adr_PIT_U, al
out Adr_PIT_1, dl
mov ax, 0000000001100000b ; записать старший байт
out Adr_PIT_U, al
out Adr_PIT_1, dh
mov ax, 0000000001000000b ; защелкнуть
out Adr_PIT_U, al
pop dx
pop ax
ret
;-------------------------------------------------------------------------
;-- конц программы! --
;-------------------------------------------------------------------------
end ProgramBegin