- •Общие сведения
- •Техническое задание на проектирование
- •Варианты заданий
- •Формирование управляющего воздействия у1
- •Формирование управляющего воздействия y2
- •Формирование управляющего воздействия y3
- •Светодиодная индикация
- •Организация подсистемы прерываний
- •Выбор элементной базы
- •Реализуемый алгоритм
- •Требования к оформлению
- •Основные этапы разработки
- •Разработка микропроцессорного модуля
- •Описание элементной базы мпм
- •Микропроцессор i82386sx
- •Реализация системного контроллера
- •Шинные формирователи шин адреса и данных
- •Генератор тактовых импульсов и схема сброса
- •Реализация подсистемы прерываний
- •Разработка модуля ввода-вывода
- •Параллельно-программируемый адаптер кр580вв55
- •Разработка модуля таймера
- •Работа пит в режиме 0 (программируемый таймер)
- •Работа пит в режиме 3
- •Разработка памяти мпс
- •Распределение адресного пространства памяти
- •Разработка модулей пзу и озу
- •Распределение адресного пространства ввода/вывода
- •Разработка по
- •Литература
Разработка по
Для упрощения написания и последующего восприятия программы, возможности ее частичного написания до разработки аппаратной части МПС и для уменьшения затрат времени на отладку программы, ее следует разрабатывать с использованием символической формы обозначения различных устройств, параметров, констант и т.д.Например, при обращении к УВВ с помощью команд IN и OUT, нецелесообразно использование числовых значений адресов УВВ, выделенных им в АПУВВ. Гораздо удобнее в тексте программы указывать символические имена этих устройств, кратко обозначающих их названия или выполняемые ими функции. Для связи символических имен с их числовыми значениями используется директива EQU.
Используем введенные при распределении АПП и АПУВВ символические имена устройств ППА и ПИТ и присвоенные им значения адресов. При этом получим следующее начало программы:
;----------------------------------------------------------------------------------------------
;-- kp_386_Real_NoOS.asm --
;-- Текст программы для курсового проекта по ОЭВМ (i386). --
;-- После включения питания или сброса регистры процессора --
;-- установлены: CS = F000h; IP = FFF0h; DS = SS = ES = 0. --
;-- Код программы должен быть размещен в микросхеме ПЗУ --
;-- в микросхеме ПЗУ начиная с нулевой ячейки --
;----------------------------------------------------------------------------------------------
;-- Адреса переменных, в сегменте данных ОЗУ. Размер переменных - слово
Data_X EQU 0h ; переменная Х (данные с шины Х)
Data_K EQU 2h ; переменная K (константа с тумблеров)
Data_X EQU 4h ; переменная Х (данные с шины Х)
Data_Y1 EQU 6h ; результат вычисления функции Y1
Data_Y2 EQU 8h ; результат вычисления функции Y2
Data_Y3 EQU 0Ah ; результат вычисления функции Y3
;-- Определение констант
Adr_IRQ EQU 40h ; Адрес вектора в таблице прерываний
PIC_ICW1 EQU 0 ; Адрес контроллера прерываний (A0 = 0)
PIC_ICW2 EQU 2 ; Адрес контроллера прерываний (A0 = 1)
PIT_0 EQU 8 ; Адрес регистра состояния счетчика 0 ПИТ
PIT_1 EQU 10 ; Адрес регистра состояния счетчика 1 ПИТ
PIT_2 EQU 12 ; Адрес регистра состояния счетчика 2 ПИТ
PIT_CW EQU 14 ; Адрес регистра управления ПИТ
PPA_A EQU 16 ; Адрес регистра порта А ППА
PPA_B EQU 18 ; Адрес регистра порта B ППА
PPA_C EQU 20 ; Адрес регистра порта C ППА
PPA_CW EQU 22 ; Адрес регистра управления ППА
ORG 0 ; Начальный адрес микросхемы ROM
;----------------------------------------------------------------------------------------------
;-- Инициализация --
;----------------------------------------------------------------------------------------------
ProgramBegin:
cli ; Запрет аппаратных прерываний
; -- Установка сегмента данных на ОЗУ
mov ax, 400h
mov ds, ax
; -- Установка вектора прерывания (адрес подпрограммы обработки прерывания)
mov ax, offset ProgramPrer ; Определение смещения адреса
; подпрограмм мы обработки прерывания
mov es:Adr_IRQ, ax ; Запись в два младших байта ТВП
; по адресу Adr_IRQ
push cs
pop ax
mov es:Adr_IRQ + 2, ax
;-- Программирование ППА
mov al, 10010000b ; Управляющее слово для ППА
out PPA_CW, al
;-- Программирование ПИТ
call ProgramCalculateY2SetPIT
call ProgramCalculateY3SetPIT
;-- Программирование контроллера прерываний
mov al, 00010010b ; Запись ICW1 в КП (работа КП)
out PIC_ICW1, al
mov al, 01000000b ; Запись ICW2 в КП (номер вектора прерывания)
out PIC_ICW2, al
mov al, 00000000b ; Запись OCW1 в КП (маскирование прерываний)
out PIC _ICW1, 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, PPA_A
mov ds:Data_X, ax
; Принять и сохранить значение К
in ax, PPA_B
mov ds:Data_K, ax
pop bx
pop dx
pop ax
ret
;----------------------------------------------------------------------------------------------
;-- Подпрограмма рассчитывает У1 и выводит его в порт С --
;----------------------------------------------------------------------------------------------
ProgramCalculateY1SetY1SetInd:
push ax
push dx
push bx
; расчет У1
mov ds:Data_Y1, ax ; сохранение результата
; Вывод в порт С
mov bx, ax
and ax, 0000000000001111b ; выделение младшей тетрады в ax
and bx, 0000000011110000b ; выделение старшей тетрады в bx
or ax, bx ; младшая и старшая тердады в общий регистр ax
out PPA_C, al
pop bx
pop dx
pop ax
ret
;----------------------------------------------------------------------------------------------
;-- Подпрограмма расчета Y2 и программирования ПИТ --
;----------------------------------------------------------------------------------------------
ProgramCalculateY2SetPIT:
push ax
push dx
; расчет У2
mov dx, ds:Data_X
mov ax, ds:Data_K
xor ax, dx
mov bx,ax
mov ax, ds:Data_K
not ax
cmp ax, dx
jl y2min
mov ax, dx
y2min:
add bx
mov ds: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:Data_X
mov ax, ds:Data_K
cmp ax,dx
jg y3max
mov ax,dx
rcl ax,1
mov ds: Data_Y3, ax
; Программирование ПИТ для У3
mov ax, 0000000001010000b ; записать младший байт в счетчик 0
; и установить режим 3
out PIT_U, al
out PIT_1, dl
mov ax, 0000000001100000b ; записать старший байт
out PIT_U, al
out PIT_1, dh
mov ax, 0000000001000000b ; защелкнуть
out PIT_U, al
pop dx
pop ax
ret
;-- После сброса процессор выполняет команду из адреса CS:FFF0h
ORG 0FFF0h
jmp ProgramBegin
end ProgramBegin