Подключение внешних устройств к компьютерному интерфейсу ISA. Методы подключения устройств сопряжения

Страницы работы

Фрагмент текста работы

Вывод сигнала происходит циклически –выведя отсчеты от 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      {перемещение данных из аккумулятора в переменную

Похожие материалы

Информация о работе