Разработка программного обеспечения низкого уровня



 

Для персонального компьютера семейства 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!