home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 08 / hitech / zeitmess.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-06-01  |  5.2 KB  |  161 lines

  1. (* ------------------------------------------------------ *)
  2. (*                   ZEITMESS.PAS                         *)
  3. (*            Zeitmessung im Mikrobereich                 *)
  4. (*        (c) 1989  Ulrich Telle  &  TOOLBOX              *)
  5. (* ------------------------------------------------------ *)
  6. {$B-,I-,R-,S-,V-,N+}           { damit's schneller geht... }
  7.  
  8. UNIT ZeitMess;
  9.  
  10. INTERFACE
  11.  
  12. TYPE SuperZeit = ARRAY[1..3] OF WORD;
  13.  
  14.   { Prozeduren und Funktionen für SuperZeit-Manipulationen }
  15.   { Beschreibung im Implementationsteil                    }
  16.  
  17. PROCEDURE ZeitProlog;
  18. PROCEDURE ZeitEpilog;
  19. PROCEDURE ZeitLesen(VAR t : SuperZeit);
  20. FUNCTION  ZeitWandeln(t : SuperZeit) : EXTENDED;
  21. FUNCTION  ZeitDauer(Start, Stop : SuperZeit) : EXTENDED;
  22. FUNCTION  ZeitDauerString(Start, Stop : SuperZeit) : STRING;
  23. FUNCTION  UhrZeit : STRING;
  24.  
  25. IMPLEMENTATION
  26.  
  27. CONST
  28.   PIC        = $20;                       { 8259 }
  29.   TimerC     = $43;                       { 8253 Kontrolle }
  30.   Timer0     = $40;                       { 8253 Zähler 0  }
  31.   TimerMode2 = $34;                       { 8253 Modus 2   }
  32.   TimerMode3 = $36;                       { 8253 Modus 3   }
  33.   TimerTicks = 1193.182;      { 8253 Taktfrequenz pro msec }
  34.  
  35. VAR
  36.   Korrektur   : EXTENDED;          { Korrektur für Stopuhr }
  37.   ExitProcAlt : POINTER;   { Zeiger auf alte Exit-Prozedur }
  38.  
  39.   PROCEDURE ZeitProlog;
  40.               { Zeitgeber-Baustein 8253 auf Modus 2 setzen }
  41.   BEGIN
  42.     Port [TimerC] := TimerMode2;
  43.     Port [Timer0] := 0;
  44.     Port [Timer0] := 0;
  45.   END;
  46.  
  47.   PROCEDURE ZeitEpilog;
  48.               { Zeitgeber-Baustein 8253 auf Modus 3 setzen }
  49.   BEGIN
  50.     Port [TimerC] := TimerMode3;
  51.     Port [Timer0] := 0;
  52.     Port [Timer0] := 0;
  53.   END;
  54.  
  55.   PROCEDURE ZeitLesen (VAR t : SuperZeit);
  56.   VAR
  57.     irr, b1, b2 : BYTE;
  58.   BEGIN
  59.     INLINE($FA);   { CLI }
  60.     Port[PIC] := $0A;    { Anforderung an den              }
  61.                          { Interrupt-Controller, Auslesen  }
  62.                          { des Interrupt Request Registers }
  63.     Port[TimerC] := 0;   { Zählerstand in 8253 Register    }
  64.     irr := Port[PIC];    { IRR lesen                       }
  65.     b1  := Port[Timer0]; { niederwertiger Zählerstand      }
  66.     b2  := Port[Timer0]; { höherwertiger Zählerstand       }
  67.     t[2] := MemW[$0040:$006C];
  68.                          { niederwertiger DOS-Zeitzähler   }
  69.     t[3] := MemW[$0040:$006E];
  70.                          { höherwertiger DOS-Zeitzähler    }
  71.     INLINE($FB);   { STI }
  72.     t[1] := NOT (word(b2) SHL 8 + b1);
  73.                          { Zählerstand des Timers          }
  74.     IF Odd(irr) AND (t[1] < 128) THEN BEGIN
  75.                          { Korrektur, wenn Timer-Interrupt }
  76.       Inc(t[2]);         {                 anliegt         }
  77.       IF t[2] = 0 THEN Inc(t[3]);
  78.     END;
  79.   END;
  80.  
  81.   FUNCTION ZeitWandeln (t : SuperZeit) : EXTENDED;
  82.   VAR
  83.     treal : EXTENDED;
  84.     j     : INTEGER;
  85.   BEGIN
  86.     treal := 0.0;
  87.     FOR j := 3 DOWNTO 1 DO
  88.       treal := treal * 65536.0 + t[j];
  89.     ZeitWandeln := treal / TimerTicks;
  90.   END;
  91.  
  92.   FUNCTION ZeitDauer (Start, Stop : SuperZeit) : EXTENDED;
  93.   BEGIN
  94.     ZeitDauer := ZeitWandeln(Stop) - ZeitWandeln(Start)
  95.                                    - Korrektur;
  96.   END;
  97.  
  98.   FUNCTION ZeitDauerString(Start, Stop: SuperZeit) : STRING;
  99.   VAR
  100.     tstr : STRING;
  101.   BEGIN
  102.     Str(ZeitDauer(Start, Stop):0:3, tstr);
  103.     ZeitDauerString := tstr;
  104.   END;
  105.  
  106.   FUNCTION UhrZeit : STRING;
  107.   VAR
  108.     t            : SuperZeit;
  109.     treal        : EXTENDED;
  110.     tint         : LONGINT;
  111.     tstr1, tstr2 : STRING[20];
  112.   BEGIN
  113.     ZeitLesen(t);
  114.     treal := ZeitWandeln(t);
  115.     Str(treal:0:3, tstr1);      { Milli- und Mikrosekunden }
  116.     tstr1 := Copy(tstr1, Length(tstr1)-6, 7);
  117.     tint  := Trunc(treal / 1000.0);             { Sekunden }
  118.     Str((tint MOD 60):2, tstr2);
  119.     IF tstr2[1] = ' ' THEN tstr2[1] := '0';
  120.     tstr1 := tstr2 + ',' + tstr1;
  121.     tint  := tint DIV 60;                        { Minuten }
  122.     Str((tint mod 60):2, tstr2);
  123.     if tstr2[1] = ' ' THEN tstr2 := '0';
  124.     tstr1 := tstr2 + ':' + tstr1;
  125.     Str(tint DIV 60, tstr2);                     { Stunden }
  126.     UhrZeit := tstr2 + ':' + tstr1;
  127.   END;
  128.  
  129.   PROCEDURE ZeitEichen;
  130.   CONST
  131.     Anzahl = 500;    { Magische Zahl (vom Himmel gefallen) }
  132.   VAR
  133.     j         : INTEGER;
  134.     t1, t2    : SuperZeit;
  135.     Differenz : EXTENDED;
  136.   BEGIN
  137.     Korrektur := 1.0E+10;
  138.     FOR j := 1 TO Anzahl DO BEGIN
  139.       ZeitLesen(t1);
  140.       ZeitLesen(t2);
  141.       Differenz := ZeitWandeln(t2) - ZeitWandeln(t1);
  142.       IF Differenz < Korrektur THEN Korrektur := Differenz;
  143.     END;
  144.   END;
  145.  
  146. {$F+}                        { WICHTIG für Exit-Prozeduren }
  147.   PROCEDURE ZeitMessExit;
  148.   BEGIN
  149.     ExitProc := ExitProcAlt;
  150.     ZeitEpilog;
  151.   END;
  152. {$F-}
  153.  
  154. BEGIN                               { Unit-Initialisierung }
  155.   ExitProcAlt := ExitProc;          { Exit-Prozedur merken }
  156.   ExitProc := @ZeitMessExit;           { und eigene setzen }
  157.   ZeitProlog;                    { ZeitMess initialisieren }
  158.   ZeitEichen;                    { Korrekturterm bestimmen }
  159. END.
  160. (* ------------------------------------------------------ *)
  161. (*                Ende von ZEITMESS.PAS                   *)