Вывод сигнала происходит циклически –выведя отсчеты от 0 до N, N+1 отсчет программа будет выводить как нулевой. Интервал между отсчетами можно менять, перемещая ползунок регулятора “F”, при этом будет изменяться частота выходного сигнала. Значение “N” можно изменить с помощью мыши. После изменения значения в окошке “N” необходимо закончить текущий цикл цифро-аналогового преобразования и начать новый, чтобы программа смогла сформировать новый массив отсчетов. Из-за того, что программа, работая в ОС “WINDOWS” обращается к шине ISA без буферизации данных, на экране осциллографа будет заметна нестабильность выходной частоты. Выход осуществляется нажатием на кнопку “Stop DAC”.
При нажатии с помощью мыши на кнопку “Start ADC”(Начать аналогово-цифровое преобразование) кнопка изменит свое название на “Stop ADC” (Закончить аналогово-цифровое преобразование) и в окно редактирования будет выводиться значение напряжения подаваемого с переменного резистора на вход АЦП. Вывод с АЦП происходит циклически. Сначала программа задает режим работы ППА КР580ВВ55А для формирования сигнала запуска АЦП, производит формирование сигнала запуска на выводе PC5 ППА, после чего переводит ППА КР580ВВ55А в режим приема сигнала готовности данных от АЦП. После регистрации сигнала готовности выводом PC3 ППА программа переводит ППА в режим передачи данных с АЦП на шину ISA. Восьмибитное значение, считанное с АЦП, преобразуется в соответствующее ему десятичное значение напряжения и выводится на экран. Далее программа снова формирует сигнал запуска АЦП и цикл повторяется. Выход осуществляется нажатием на кнопку “Stop ADC”.
При нажатии на кнопку “Start LED’s shining” кнопка изменит свое название на “Stop LED’s shining” и начнется циклическое зажигание светодиодов подключенных к выводам PC4-PC7 ППА КР580ВВ55А.
Это достигается возможностью задавать состояние любого вывода порта C независимо от других. Программа с интервалом 100мс устанавливает состояние предыдущего вывода порта C в 0, а текущего – в 1. После остановки периодического зажигания светодиодов нажатием на кнопку “Stop LED’s shining” в правой части окна программы появятся 4 checkbox’а: PC7 - PC4. При выборе любого из них с помощью мыши будет зажигаться светодиод на соответствующем выводе ППА КР580ВВ55А.
В любой момент времени из программы можно выйти, нажав “exit”.
Листинг программы FESTU1.pas, разработанной в среде Delphi, приведен в приложении 1.
4. Содержание отчета
- структурная схема подключения адаптера КР580ВВ55А к интерфейсу ISA;
- электрическая схема лабораторной установки
- фрагменты программы (ассемблерных вставок), в которых выполняется ввод или вывод данных через порты 330-333Н;
- распределение адресов внешних устройств: ЦАП, АЦП и светодиоды;
- временные диаграммы работы микросхемы АЦП с сигналами “Запуск”, ”Готовность данных” и ”Шина данных АЦП”
Приложение1.
unit festu;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, ComCtrls;
type
TLAB_CPU = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Label1: TLabel;
Timer1: TTimer;
label2: TLabel;
ScrollBar1: TScrollBar;
Edit2: TEdit;
Label3: TLabel;
PC7: TCheckBox;
PC6: TCheckBox;
PC5: TCheckBox;
PC4: TCheckBox;
MainMenu1: TMainMenu;
exit: TMenuItem;
help: TMenuItem;
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure load(Sender: TObject);
procedure PC7Click(Sender: TObject);
procedure PC6Click(Sender: TObject);
procedure PC5Click(Sender: TObject);
procedure PC4Click(Sender: TObject);
procedure exitClick(Sender: TObject);
procedure helpClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
LAB_CPU: TLAB_CPU;
counter:integer;
counter1:integer;
counter2:integer;
counter3:integer;
counter4:integer;
b1:word;
a:integer;
b:integer;
DAC_enabled:integer;
shin_en:integer;
ADC_enabled:integer;
voltage: byte;
volt:extended;
c:byte;
outport: array[0..255] of byte;
volt_str:string;
output:byte;
ccc:integer;
bbb:integer;
ed2txt:integer;
ready:byte;
hfile:^char;
n_quant:byte;
start:byte;
implementation
uses help;
{$R *.DFM}
{создание массива отсчетов для вывода на ЦАП. количество отсчетов
задается переменной n_quant }
procedure init_sine;
var a:byte;
begin
for a:=0 to n_quant do begin
outport[a]:=round(127+127*sin(a*(360/n_quant)*Pi/180));
end;
end;
{процедура обработки нажатия кнопки 'Start LEDs shining' ;
выполняет зажигание светодиодов по кругу процедурой TLAB_CPU.Timer1Timer }
procedure TLAB_CPU.Button3Click(Sender: TObject);
begin
shin_en:=1;
counter:=counter+1;
timer1.interval:=100 ;
label1.Caption:='Message';
label2.Visible:=false;
scrollbar1.Visible:=false;
label3.Visible:=false;
edit2.Visible:=false;
pc7.visible:=true;
pc6.visible:=true;
pc5.visible:=true;
pc4.visible:=true;
pc7.checked:=false;
pc6.checked:=false;
pc5.checked:=false;
pc4.checked:=false;
if (counter=1) then
begin button3.caption:='Stop LED"s shining' ;
timer1.Enabled:=true; edit1.text:=' Shining started!';
button1.Visible:=false;
button2.Visible:=false;
pc7.visible:=false;
pc6.visible:=false;
pc5.visible:=false;
pc4.visible:=false;
end;
if counter=2 then begin button3.caption:='Start LED"s shining';
timer1.Enabled:=false; edit1.text:=' Shining stopped!';
button1.Visible:=true;
button2.Visible:=true;
lab_cpu.Color:=clgreen;
end;
if counter=2 then counter:=0;
{начальная инициализация портов: PA-ввод, PB-ввод, PC-вывод}
asm
mov dx,333h
mov al,10010001b
out dx,al
end;
end;
{процедура обработки нажатия кнопки 'Start ADC';
выполняет имерение напряжения на входе АЦП и выдает его значение
на экран}
procedure TLAB_CPU.Button2Click(Sender: TObject);
begin
label1.Caption:='VOLTAGE';
label2.Visible:=false;
scrollbar1.Visible:=false;
label3.Visible:=false;
edit2.Visible:=false;
pc7.visible:=false;
pc6.visible:=false;
pc5.visible:=false;
pc4.visible:=false;
counter4:=counter4+1;
if counter4=1 then begin button2.caption:='Stop ADC' ;
timer1.Enabled:=false;
button1.Visible:=false;
button3.Visible:=false;
end;
if counter4=2 then begin button2.caption:='Start ADC';
timer1.Enabled:=false;
button1.Visible:=true;
button3.Visible:=true;
end;
if counter4=2 then counter4:=0;
{цикл считывания значений с АЦП}
repeat
asm {начальная инициализация портов. PC0-3 -ввод PC4-7вывод
PA -ввод PB-вывод}
mov ax,10011011b {запись управляющего слова в аккумулятор}
mov dx,333h {запись адреса порта D в регистр dx }
out dx,ax {запись управляющего слова в порт D}
end;
{цикл ожидания сигнала запуска АЦП}
repeat
asm
mov dx,332h {запись в dx адреся PC }
in al,dx {чтение из PC в аккумулятор }
mov start,al {перемещение данных с PC в переменную start }
end ;
until start=32;
{цикл опроса PC на наличие сигнала готовности данных от АЦП . Готовность
регистрируется PC3 , состояние порта в этот момент 00000000b}
repeat
{чтение состояния PC:}
asm
mov dx,332h {запись в dx адреся PC }
in al,dx {чтение из PC в аккумулятор }
mov ready,al {перемещение данных с PC в переменную ready }
end ;
until ready=0;
{считывание данных с АЦП портом А в переменную voltage }
asm
mov dx,330h {запись в dx адреса PA}
in al,dx {чтение из PA в аккумулятор}
mov voltage,al {перемещение данных из аккумулятора в переменную
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.