Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
101
Добавлен:
26.05.2014
Размер:
5 Кб
Скачать
{-----------------------------------------------}
{ (c) …ўбвЁЈ­ҐҐў „.‚.                           }
{ €бЇ®«м§®ў ­ЁҐ бЁ¬¬г«пв®p  MCS96 ¤«п Їp®б¬®вp  }
{ p Ў®вл Їp®Јp ¬¬л ¤«п ¬ЁЄp®Їp®жҐбб®p .         }
{                                               }
{ ‘Є®¬ЇЁ«Ёpг©вҐ EXAMPLE.BIN  - ЁбЇ®«­Ё¬л© д ©«  }
{ ¤«п MCS96. ‡ ЇгбвЁвҐ ¤ ­­л© н¬¬г«пв®p ¤«п     }
{ ®в®Ўp ¦Ґ­Ёп pҐ§г«мв в®ў p Ў®вл Їp®Јp ¬¬л      }
{                                               }
{ б¬. в Є¦Ґ EXAMPLE.A96                         }
{-----------------------------------------------}

Uses Crt, Graph, a96sim;
type
  Float = single;
Const
  TickPerTime  = $100;
  TimeStep     = 0.001/TickPertime; { и Ј а бзҐв  }

  AmplitudeY   = 100;  {  ¬Ї«Ёвг¤  ўл室  }


  { ¤«п Ё­ЁжЁ жЁЁ Јp дЁЄЁ }
  Driver  : Integer = Detect;
  Mode    : Integer = 0;
  DrvPath = 'C:\BP\BGI'; { ў®§¬®¦­® г ‚ б ¤pгЈ®© Їгвм Є BGI-¤p ©ўҐp ¬ }

Var
  X,Y   : Float;
  t,i   : Integer;

  MCS196    : TSimulator; { ЋЃљ…Љ’ - ќЊ“‹џ’ЋђЂ ¬ЁЄp®Їp®жҐбб®p  MCS96 }
  Prog      : Pointer;    { ЎгдҐp ¤«п Їp®Јp ¬¬л }
  ProgSize  : Word;       { p §¬Ґp Їp®Јp ¬л }
  c         : char;
  Task      : Byte;

  TimeGrid  : Integer;

Procedure LoadProg(const filename:String);
Var
  F : File;
Begin
  Assign(F, filename);
  reset(f,1);
  ProgSize:=FileSize(F);
  Getmem(Prog, ProgSize);
  BlockRead(F, Prog^, ProgSize);
  Close(F);
  if IoResult<>0 then
  begin
    Writeln('ЋиЁЎЄ  ў з⥭ЁЁ д ©«  EXAMPLE.BIN');
    Halt;
  end;
End;




{----------------------------------------------}
{ Њ®¤Ґ«м н«ҐЄвதўЁЈ вҐ«п.                     }
{   U-­ Їа殮­ЁҐ.                              }
{   ‚®§ўа й Ґв - бЄ®а®бвм                      }
{----------------------------------------------}
Function Engin( U : Float ) : Float;
Const
  A1 : Float = 0;
  A2 : Float = 0;

  K  = 1;     { Є®нд. ЇҐаҐ¤ зЁ }
  Te = 0.01;  { н«ҐЄваЁзҐбЄ п Ї®бв®п­­ п ўаҐ¬Ґ­Ё }
  Tm = 0.03;  { ¬Ґе ­ЁзҐбЄ п Ї®бв®п­­ п ўаҐ¬Ґ­Ё  }
begin
  A1:=A1+(U-A1)*TimeStep/Te;
  A2:=A2+(A1-A2)*TimeStep/Tm;
  Engin:=A2*K;
end;


{---------------------------------------------}
{ ђЁбгҐв Ї®«Ґ Ја дЁЄ                          }
{---------------------------------------------}
Procedure DrawField;
var
  x, y : Integer;
  s    : string[6];
const
  LastTime : Integer = 0;
begin
  { Ї®«Ґ }
  cleardevice;
  SetFillStyle( SolidFill, DarkGray);
  Bar(0,20,GetMaxX,GetMaxY-20);
  SetColor(15);
  OutTextXY(200,0,'"0".."9" - § ¤ вм гбв ўЄг бЄ®p®бвЁ');

  { бҐвЄ  га®ў­Ґ© }
  for x:=-4 to 4 do
  begin
    if x=0 then SetColor( White ) else SetColor( LightGray );
    y:=(GetMaxY+1) div 2 - (GetMaxY-39)*x div 8;
    Line(0,y,GetMaxX,y);

    SetColor( White );
    Str( x * AmplitudeY/4:0:1, s);
    OutTextXY( 4, y-9, s);
  end;

  { бҐвЄ  ўаҐ¬Ґ­Ё }
  While TimeGrid < GetMaxX do
  begin
    SetColor( LightGray );
    Line( TimeGrid, 20, TimeGrid, GetMaxY-20);

    SetColor( White );
    Str( LastTime, s);
    OutTextXY( TimeGrid-TextWidth(s) div 2, GetMaxY-10, s);
    inc(LastTime);
    inc(TimeGrid,round(1/TimeStep/TickPerTime));
  end;
end;

{--------------------------------}
{ бв ўЁв ®зҐpҐ¤­го в®зЄг Јp дЁЄ  }
{--------------------------------}
Procedure PutPoint( v : Float );
Const
  OldY : Integer = 0;
var
  y : Integer;
begin
  y:=(GetMaxY+1) div 2 - round((GetMaxY-39)*v/AmplitudeY/2);

  if t>0 then
  begin
    SetColor( LightRed );
    SetLineStyle( SolidLn, 0, ThickWidth);
    Line( t-1, OldY, t, y);
    SetLineStyle( 0, 0, 0);
  end;
  inc(t);
  OldY := y;
end;



{-------------------------------}
{     Ћб­®ў­ п Їp®Јp ¬¬         }
{-------------------------------}
begin

  MCS196.init(MCS_KR);    { Ё­ЁжЁЁp®ў вм ЊЉ, Є Є 80196KR }
  MCS196.Vref:=5.25;      { ®Ї®p­®Ґ ­ Їp殮­ЁҐ ¤«п Ђ–Џ, Ї®¤ ­­®Ґ ­  ­®¦Єг Vref }

  LoadProg('EXAMPLE.BIN');
  MCS196.WriteData($2080, ProgSize, Prog^); { § Їб вм ў Ї ¬пвм Ї®  ¤pҐбг 2080h }
  Freemem(Prog, ProgSize); { Їp®Јp ¬¬  ў Ї ¬пвЁ ЊЉ. Ќ ¬ ®­  Ў®«миҐ ­Ґ ­г¦­  }



  { гбв ­®ўЁвм Јp д. pҐ¦Ё¬ }
  InitGraph( Driver, Mode, DrvPath );
  TimeGrid:=0;
  DrawField;                            { ­ pЁб®ў вм Ї®«Ґ Јp дЁЄ  }


  { Ћб­®ў­®© жЁЄ« }
  MCS196.reset;           { Ї®¤ вм бЁЈ­ « RESET }
  i:=0;
  t:=0;
  Y:=0;
  Task:=0;
  while true do
  begin
    if KeyPressed then
    begin
      c:=readkey;
      case c of
        #27:Break;
        '0'..'9':
          begin
            Task:=(ord(c)-48)*5;
            MCS196.PortsLegs[2]:=Task;
            MCS196.IntSignals:=MCS196.Intsignals or int_1;
          end;
      end;
    end;
    MCS196.Uin[0]:=Y*5.25/256;  { Џ®¤ вм ­  P0.0 (Ђ–Џ) ­ Їp殮­ЁҐ б ¤ взЁЄ  бЄ®p®бвЁ }
    MCS196.Step; { ўлЇ®«­Ёвм ®¤­г Є®¬ ­¤г ¬ЁЄp®Їp®жҐбб®p  }
    X:=Shortint(MCS196.PortsLegs[1]); { Ї®«гзЁвм 8-ЎЁв­л© бЁЈ­ « б P1 }

    Y:=Engin(X);                { Ї®¤ вм бЁЈ­ « ­  ¤ўЁЈ вҐ«м }
    inc(i);
    if i>=TickPerTime*2 then
    begin
      PutPoint(Y);
      i:=0;
      if t>GetMaxX then
      begin
        t:=0;
        dec(TimeGrid,GetMaxX+1);
        DrawField;
      end;
    end;
    if MCS196.ErFlag then
    begin
      SetFillStyle(1,1);
      Bar(0,0,40,20);
      setcolor(14);
      OutTextXY(5,5,'Џp®жҐбб®p "Ї®ўЁб"');
      break;
    end;
  end;
  readkey;
  MCS196.Done;

  CloseGraph;              { ‡ Єpлвм Јp дЁЄг }
end.
Соседние файлы в папке SIM