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
|