Разработка программного обеспечения низкого уровня
Для персонального компьютера семейства IBM PC существует две возможности программирования параллельного порта - обращение к физическим адресам регистров порта (нижний уровень) или вызов программного прерывания 17h (верхний уровень). При этом в обоих случаях может использоваться как язык ассемблера, так и один из языков высокого уровня. Однако в связи с тем, что в нашей задаче мы имеем дело с процессами, протекающими в реальном масштабе времени, то для достижения максимальной точности измерений необходимо использовать нижний уровень адресации и язык низкого уровня - язык ассемблера.
Параллельный порт имеет три адреса в адресном пространстве устройств ввода-вывода компьютера:
BASE - регистр данных,
BASE+1 - регистр состояния,
BASE+2 - регистр управления.
Здесь «BASE» - первый адрес порта. Формирование и прием сигналов интерфейса Centronics производится путем записи и чтения выделенных для него портов ввода-вывода. В компьютере может быть использовано до трех интерфейсов Centronics с базовыми адресами 378h, 278h и 3BCh (обычно назначается адрес 378h). Для подключения вторичного прибора мы использовали линию РЕ (контакт 12 интерфейса Centronics). В гидравлических изысканиях при измерении кинематических характеристик требуется определять либо осредненные скорости, при этом необходимо измерять частоту следования импульсов от миковертушки, либо мгновенные скорости, при этом измеряют периоды следования импульсов. Скорости рассчитываются по формулам:
|
|
, (2.2)
, (2.3)
где - осредненная скорость;
- мгновенная скорость;
- тарировочный коэффициент вертушки;
- частота импульсов;
- период импульсов.
В компьютере IBM PC из операционных систем можно получить доступ к системному таймеру, однако, он мало пригоден для измерения частот и тем более периодов импульсов от вертушки, так как частота обновления системного таймера составляет 18.2 гц, а измеряемые частоты находятся в диапазоне 0 - 1000 гц. Среди функций ПЗУ BIOS имеется функция ожидания события:
прерывание Int 15h
код вызова 83h (131)
Запрашивает установку семафора после истечения заданного интервала времени либо отменяет предыдущий запрос.
При вызове. Если запрос на ожидание события
АН=83h
АL=00h
CX:DX= время в микросекундах
ES:BX= сегмент: относительный адрес семафора
Если отмена ожидания события
АН=83h
АL=01h
При возврате. Если при вызове АL=00h и функция выполнена успешно
Флаг переноса сброшен
Если при вызове АL=00h и функция не выполнена (ожидание события уже активно)
Флаг переноса установлен
Если при вызове АL=01h
Ничего не возвращается
Замечания. Возврат из функции осуществляется немедленно. Если функция выполнилась успешно, бит 7 байта семафора устанавливается после истечения заданного интервала. Сброс семафора перед вызовом этой функции лежит на вызывающей программе. Фактическая продолжительность ожидания события всегда является целым число, кратным 976 мкс. Для реализации этой функции используются прерывания от КМОП - микросхемы даты - времени.
|
|
Использование этой функции позволяет получить программируемые аппаратно-независимые отметки времени с более высоким временным разрешением, чем с помощью функции MS-DOS (Int21h с кодом вызова 2CH), возвращающей время в единицах сотых долей секунды. Эта функция не поддерживается на машинах PS/2 моделей 25 и 30.
Использование этой функции позволило нам разработать программы, для измерения осредненных частот следования импульсов. Блок-схема программы представлена на рисунке 2.6, а сама программа на рисунке 2.7. В программу передается время измерения, затем в начале программы ожидается передний фронт импульса входного сигнала (переход от 0 к 1), и только после этого включается отсчет времени, такая последовательность действий необходима для синхронизации часов с входным сигналом. Далее в программе при каждом появлении переднего фронта входного сигнала к счетчику прибавляется 1, после истечения времени измерения значение этого счетчика, содержащее количество периодов входного сигнала, передается в основную программу. Имея значения времени измерения и количества поступивших импульсов можно вычислить среднюю частоту входного сигнала по формуле:
|
|
, (2.4)
где - количество периодов входного сигнала;
- время измерения.
Затем по формуле 2.2 вычисляется значение осредненной скорости.
Программа измерения осредненной скорости написана на языке ассемблера и имеет соглашения со средой Pasсal. Обращение из программы на Паскале имеет вид:
var i:longint;j:integer;sem:byte;
.
j:=os(i);
где i - время измерения в микросекундах;
j - количество поступивших периодов;
sem - служебная переменная.
Программа представленная на рисунке 2.8 использует аппаратный таймер компьютера, который позволяет получить временные отсчеты с высоким разрешением (в отличие от программного таймера).
Для получения объектного кода этих программ необходимо заключить их в файлы с расширением asm и выполнить инструкции следующего вида:
Tasm <имя файла>.
Пример обращения к программе приведенной на рисунке 2.9 смотри в разделе 3 (программа измерения периода).
|
|
Рисунок 2.6 - Блок-схема программы измерения осредненных частот следования импульсов.
; © Абраменко П.И. 1999 г.
; Допускается свободное использование и копирование не в;коммерческих целях.
.model tpascal
.data
extrn sem:byte
.code
os proc far s:word,m:word
public os
m5: mov dx,379h
in al,dx
and ax,20h
jnz m6
jmp m5
m6: mov dx,@data
mov es,dx
mov cx,s
mov dx,m
mov bx,offset sem
mov ah,83h
mov al,00h
mov sem,al
int 15h
mov bx,0000h
m1: mov dx,379h
in al,dx
and ax,20h
jz m1
mov al,sem
and al,80h
jnz m7
inc bx
m3: mov dx,379h
in al,dx
and ax,20h
jz m1
jmp m3
m7: mov ax,bx
ret
os endp
end
Рисунок 2.7 - Программа измерения осредненных частот
Рисунок 2.8 - Блок-схема программы измерения периодов следования импульсов
; © Абраменко П.И. 1999 г.
; Допускается свободное
;использование и копирование
;в не коммерческих целях.
.model tpascal
.data
extrn c:word
.code
public per,pr
per proc far
push ds
mov dx,offset intt
mov ax,seg intt
mov ds,ax
mov ah,25h
mov al,1ch
int 21h
pop ds
ret
per endp
intt proc far
push ax
push ds
mov ax,seg c
mov ds,ax
inc c
pop ds
pop ax
iret
intt endp
pr proc far
mov al,00010000b
out 43h,al
mov ax,0
mov c,ax
mov dx,379h
m1: in al,dx
and ax,20h
jnz m1
m2: in al,dx
and ax,20h
jz m2
mov al,00111100b
out 43h,al
mov ax,0ffffh
out 40h,al
mov al,ah
out 40h,al
m3: in al,dx
and ax,20h
jnz m3
m4: in al,dx
and ax,20h
jz m4
m10: mov al,00010000b
out 43h,al
mov al,00111100b
out 43h,al
in al,40h
mov ah,al
in al,40h
mov dx,ax
mov ah,dl
mov al,dh
mov dx,0ffffh
sub dx,ax
mov ax,dx
mov dx,c
dec dx
dec dx
ret
pr endp
end
Рисунок 2.9 - Программа измерения периодов следования импульсов
Следует отметить, что приведенные в этом разделе программы удовлетворительно работали на машинах 386 модели. Для того чтобы использовать эти программы на машинах моделей 486 и выше, необходимо выполнить предварительную установку таймера. Это можно сделать при помощи программы приведенной на рисунке 2.10.
Мы рекомендуем получить загрузочный модуль этой программы и поместить команду на его запуск в файл autoexec.bat. Получить загрузочный модуль этой программы можно получить, выполнив инструкции:
Tasm <имя файла>; Tlink <имя файла>.
; © Абраменко П.И. 1999 г.
; Допускается свободное использование и копирование в не;коммерческих целях.
dosseg
.model small
cr equ 43h
c0 equ 40h
.stack 200h
.code
mov al,00111100b
out 43h,al
mov ax,0
out 40h,al
mov al,ah
out 40h,al
mov ah,4ch
int 21h
end
Рисунок 2.10 - Программа предварительной установки таймера
Дата добавления: 2016-01-04; просмотров: 18; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!