Sitemap
Hinweis
GPS
Experimente mit ELEXS und Palmtop
Die Faszination alter programmierbarer Taschenrechnern
Die Entwicklungsgeschichte der programmierbaren Taschenrechner
Vorstellung: Privileg PR 56 D-NC
Vorstellung: Casio FX-602P
Über Spielautomaten und ihre Emulatoren
Age of Empires
Über den Zufall

Zurück zu:
Artikel
Experimente mit ELEXS und Palmtop
Weiter auf dieser Ebene:
Bilder
Counter

1
Code
Experimente mit ELEXS und Palmtop

RS232

Das ist meine Unit für Turbo-Pascal 5.0. Sie ist die Basis für meine Programme und enthält folgenden Prozeduren und Funktionen:

  • procedure Init;
  • procedure SetPIN (PIN : byte);
  • procedure ClearPIN (PIN : byte);
  • function GetPIN (PIN : byte) : Boolean;
  • function GetVolt : Real;
  • function GetSteps : Integer;
  • function GetTemperature : Real;

procedure Init

Muß man immer am Anfang des Programms aufrufen.

procedure SetPIN (PIN : byte)

Setzt einen Ausgang auf 'High'. Mögliche Werte für PIN sind TXD, DTR, RTS, CTS, DSR, RI, DCD. Was diese Konstanten bedeuten, kann man bei 'ELEXS' nachlesen.

procedure ClearPIN (PIN : byte)

Setzt einen Ausgang auf 'Low'. Mögliche Werte für PIN sind TXD, DTR, RTS, CTS, DSR, RI, DCD. Was diese Konstanten bedeuten, kann man bei 'ELEXS' nachlesen.

function GetPIN (PIN : byte) : Boolean

Prüft, ob an einem Eingang 'Low' oder 'High' anliegt. Gibt 'False' oder 'True' zurück. Mögliche Werte für PIN sind TXD, DTR, RTS, CTS, DSR, RI, DCD. Was diese Konstanten bedeuten, kann man bei 'ELEXS' nachlesen.

function GetVolt : Real

Gibt die am Analog/Digital-Wandler anliegende Spannung in Volt zurück. Bereich ist ca. 0.2 - 7 Volt.

function GetSteps : Integer

Gibt die Spannung in Form eines Integer-Zahlenwertes zurück. Bereich ist 89 - 243. Wer selbst noch Turbo-Pascal einsetzt, kann diesen Bereich anpassen und vielleicht durch Feintuning die Genauigkeit noch etwas verbessern.

function GetTemperature : Real

Gibt die aktuelle Temperatur eines angeschlossenen Conrad Temperatur-Moduls zurück.

Meine ursprünglichen Probleme beim Umsetzen des Visual Basic Code in Turbo-Pascal waren im wesentlichen darin begründet, dass ich fälschlicherweise dachte, dass der elektronische Vorgang viel zu schnell für einen Palmtop sei. Die Annahme basierte auf der Vorstellung, dass ELEXS ja für moderne (und damit mehrhundertfach schnellere) Computer konzipiert ist, meinem Versäumnis die Dauer der Aufladung des Kondensators nachzurechnen und dem fehlenden Quellcode für die Prozedur TIMEINIT und der Funktion TIMEREAD () aus der ELEXS.DLL, so daß ich deren Funktionsweise bis heute nicht verstehe.

Aber der Vorgang dauert lange genug, so dass auch mit Turbo-Pascal auf einem Palmtop vernünftige Werte ermittelt werden können.

Code

unit RS232;

interface

procedure Init;
procedure SetPIN (PIN : byte);
procedure ClearPIN (PIN : byte);
function  GetPIN (PIN : byte) : Boolean;
function  GetVolt : Real;
function  GetSteps : Integer;
function GetTemperature : Real;

const

  BA = $3F8; (* COM 1 *)

  TXD = 1;
  DTR = 2;
  RTS = 3;
  CTS = 4;
  DSR = 5;
  RI  = 6;
  DCD = 7;

var

  CntBegin       : Integer;
  CntEnd         : Integer;
  Cnts           : Integer;
  RangeBegin     : Real;
  RangeEnd       : Real;
  Range          : Real;
  Multiplicator  : Real;

implementation

procedure Init;
var
  i     : Byte;
  Dummy : Byte;
begin
  Port [BA + 3] := 128;
  Port [BA + 0] := 6;     (* 19200 Baud *)
  Port [BA + 1] := 0;
  Port [BA + 3] := 7;     (* 8-Bit, n-Parity, 2 Stopbits *)
  Port [BA + 1] := 0;     (* keine Interrupts *)
  Port [BA + 4] := 0;     (* DTR = 0, RTS = 0 *)
  for i:= 1 to 3 do
    Dummy := Port [BA];   (* UART leeren *)
end;

procedure SetPIN (PIN : byte);
begin
  case PIN of
    TXD : begin (* 6 *)
      Port [BA + 3] := Port [BA + 3] OR 64;
    end;
    DTR : begin (* 0 *)
      Port [BA + 4] := Port [BA + 4] OR 1;
    end;
    RTS : begin (* 1 *)
      Port [BA + 4] := Port [BA + 4] OR 2;
    end;
  end;
end;

procedure ClearPIN (PIN : byte);
begin
  case PIN of
    TXD : begin (* 6 *)
      Port [BA + 3] := Port [BA + 3] AND 191;
    end;
    DTR : begin (* 0 *)
      Port [BA + 4] := Port [BA + 4] AND 254;
    end;
    RTS : begin (* 1 *)
      Port [BA + 4] := Port [BA + 4] AND 253;
    end;
  end;
end;

function GetPIN (PIN : byte) : Boolean;
var
  Value : Byte;
begin
  Value := 0;
  case PIN of
    CTS : begin (* 4 *)
      Value := Port [BA + 6] AND 16;
    end;
    DSR : begin (* 5 *)
      Value := Port [BA + 6] AND 32;
    end;
    RI : begin  (* 6 *)
      Value := Port [BA + 6] AND 64;
    end;
    DCD : begin (* 7 *)
      Value := Port [BA + 6] AND 128;
    end;
  end;
  if Value > 0 then begin
    GetPIN := True;
  end else begin
    GetPIN := False;
  end;
end;

function GetVolt : Real;
var
  U        : Real;
  i        : Integer;
  DelayCnt : Integer;
begin
  SetPIN (DTR);
  SetPIN (RTS);
  SetPIN (TXD);
  U := 0;
  while GetPIN (RI) do;
  for i := 1 to 255 do begin
    if GetPIN (RI) then begin
      SetPIN (DTR);
    end else begin
      ClearPIN (DTR);
      U := U + 1;
    end;
    DelayCnt := 0;
    while DelayCnt < 100 do inc (DelayCnt);
  end;
  ClearPIN (DTR);
  GetVolt := RangeBegin + (U - CntBegin)*Multiplicator;
end;

function GetSteps : Integer;
var
  U        : Integer;
  i        : Integer;
  DelayCnt : Integer;
begin
  SetPIN (DTR);
  SetPIN (RTS);
  SetPIN (TXD);
  U := 0;
  while GetPIN (RI) do;
  for i := 1 to 255 do begin
    if GetPIN (RI) then begin
      SetPIN (DTR);
    end else begin
      ClearPIN (DTR);
      U := U + 1;
    end;
    DelayCnt := 0;
    while DelayCnt < 100 do inc (DelayCnt);
  end;
  ClearPIN (DTR);
  GetSteps := round ((U - CntBegin));

  GetSteps := random (50) + 100;
end;

function GetTemperature : Real;
var
  i           : Integer;
  Counter     : Integer;
  Sign        : Real;
  Value       : Integer;
begin
  SetPIN (RTS);
  SetPIN (TXD);
  repeat begin
    while GetPIN (CTS) do;
    if not GetPIN (DCD) then begin
      Sign := -1;
    end else begin
      Sign := 1;
    end;
    Counter := 0;
    while not GetPIN (CTS) do inc (Counter);
    if Counter > 17 then begin
      Value := 0;
      for i := 1 to 12 do begin
        while GetPIN (CTS) do;
        if not GetPIN (DCD) then begin
          Value := Value or 1;
        end;
        Value := Value shl 1;
        while not GetPIN (CTS) do;
      end;
      Value := Value shr 1;
    end;
  end; until Counter > 17;
  GetTemperature := (((Value and 3840) shr 8)*10 +
                     ((Value and 240) shr 4) +
                     (Value and 15)/10)*Sign;
end;

begin
  CntBegin       := 89;
  CntEnd         := 243;
  Cnts           := CntEnd - CntBegin;

  RangeBegin     := 0.2;
  RangeEnd       := 7;
  Range          := RangeEnd - RangeBegin;

  Multiplicator  := Range/Cnts;

  Init;
end.

Diese Seite wurde mit BrainStorm generiert 
Copyright © 1991 - 2013 by Thomas Ell