B. Kainka, H.- J. Berndt

PC-Schnittstellen unter Windows

FAQ und updates, siehe auch Homepage von Hans-Joachim Berndt

Französische Ausgabe: Je programme les interfaces de mon PC sous Windows (http://www.elektor.presse.fr)

Niederländische Ausgabe: PC-Poorten onder Windows (http://www.elektuur.nl)

Englische Ausgabe: PC Interfaces under Windows (http://www.elektor-electronics.co.uk)
(see chapter 1 on the homepage of the translater Geoffrey Home)

Vorwort

Auf den meisten PCs scheinen die Tage des alten Betriebssystems DOS endgültig gezählt. Die breite Einführung von Windows hat einerseits zu erhöhtem Komfort geführt. Andererseits bedauern gerade viele Hobbyanwender, daß vieles nun nicht mehr so ohne weiteres geht, was unter DOS kein Problem war. Ein Windows-Programm hat nicht mehr in gleicher Weise die vollständige Kontrolle über den Rechner wie ein DOS-Programm.

Unter DOS wurden zahlreiche sehr einfache Anwendungen entwickelt, die direkt auf Schnittstellenleitungen des PC zugreifen. Leuchtdioden oder einfache Schalter lassen sich ja ohne weitere Hilfsmittel z.B. direkt an eine COM-Schnittstelle anschließen. Auch einfache Schaltungen zur Steuerung externer Hardware können direkt angesteuert werden. Unter Windows erscheint dieser einfache Ansatz zunächst versperrt. Aber wozu die lange Vorrede, wenn es nicht doch Lösungen gäbe. Dieses Buch will Möglichkeiten des direkten Zugriffs auf die Schnittstellen unter Windows zeigen.

Ziel des Buchs ist es unter anderem, viele bereits vorhandene Schaltungen wieder zum Einsatz zu bringen. Es baut weitgehend auf seinem DOS-Vorgänger "PC-Schnittstellen angewandt" auf. Daneben werden aber auch einige neue Ansätze gezeigt, die sich gerade mit den neuen Möglichkeiten von Windows ergeben. Allgemein wird in diesem Buch nur noch Windows 95/98 eingesetzt. Die bevorzugten Programmiersprachen sind Visual Basic und Delphi, also die Windows-Nachfolger von GW-Basic und Q-Basic sowie Turbo Pascal. Viele vorhandene DOS-Programme lassen sich mit den neuen Werkzeugen relativ einfach auf die Windows-Ebene heben.

Wir wünschen unseren Lesern viel Erfolg!

Hans-Joachim Berndt und Burkhard Kainka

 

Vorwort

1 Einleitung

1.1 Die PORT.DLL

1.2 DLL-Aufrufe in Visual Basic 5

1.3 DLL-Aufrufe unter Delphi

2 Die serielle Schnittstelle

2.1 DLL-Funktionen zur seriellen Schnittstelle

2.2 RS232-Zugriffe in Visual Basic

2.3 RS232-Zugriffe in Delphi

2.4 Zugriff über Portbefehle

3 Direkte digitale Ausgaben

3.1 Zeitschaltuhr

3.2 Ansteuerung von Servos

3.3 Schrittmotorsteuerung

4 Direkte digitale Eingaben

4.1 Zeitliche Registrierung von Ereignissen

4.2 Nachbildung logischer Schaltungen

5 Einfache Analog/Digital-Wandler

5.1 Messung von Widerständen

5.2 Spannungsmessung

5.3 Ein 4-Kanal-A/D-Wandler

5.4 Messung an einem Transistor

6 Frequenzmessung

6.1 Software-Zähler

6.2 Temperatur- und Luftfeuchtemessung

6.3 Ein Spannungs/Frequenz-Wandler

6.4 Ein Frequenzplotter

7 Synchrone, serielle Datenübertragung

7.1 Serielle Ausgabe

7.2 Serielle Eingabe

7.3 Ein seriell auslesbarer A/D-Wandler

8 Ein Mehrzweck-Interface

8.1 Die Hardware und ihre Ansteuerung

8.2 Das universelle Meßprogramm COMPACT

8.3 Automatischer IC-Test

9 Der parallele Druckerport

9.1 Ein- und Ausgangsleitungen

9.2 Bidirektionale Druckerschnittstellen

10 Parallele Datenausgaben

10.1 Ein Funktionsgenerator

10.2 Steuerung einfacher Maschinen

11 16-Bit-Porterweiterung

11.1 Der Portbaustein 8243

11.2 Erweiterung auf 32 Portleitungen

11.3 Ein Eprommer

12 Der I²C-Bus

12.1 Datenübertragung und Adressierung

12.2 Ansteuerung über die parallele Schnittstelle

12.3 Anschluß an die serielle Schnittstelle

12.4 Der Porterweiterungsbaustein PCF8574

12.5 Der A/D- und D/A-Wandler PCF8591

12.5 Ein Speicheroszilloskop

13 Der Joystick-Port

13.1 Analoge und digitale Eingänge

13.2 Spannungsmessung

13.3 Grenzwertüberwachung

13.4 Ein Schaltausgang

13.5 Ein Digitalzähler

13.6 Joystickaufrufe über Treiber

14 Die Soundkarte

14.1 Aufnahme und Wiedergabe

14.2 Ein Oszilloskop in Excel

14.3 Ein Oszilloskop in Delphi

14.4 Berechnete Soundausgaben

14.6 Ein Hörtest mit der Soundkarte

5 Video-Capture-Karten

15.1 Darstellen eines Bildes

15.2 Meßwerte aus Farbinformationen

15.3 Längenmessung mit der Videokamera

16 Asynchrone serielle Übertragung

16.1 Auslesen einer seriellen Maus

16.2 Digitale Steuerungen über die RS232

16.3 Der ST62-Mikrocontroller-UART

16.4 Ein serieller Bus

Anhang

Literatur

Referenz zur PORT.DLL

Portbefehle

Serielle Schnittstelle

Soundkarte

Zeitroutinen

Sachverzeichnis

 

1 Einleitung

Jeder Versuch, mit Computern reale Prozesse zu steuern oder zu überwachen, erfordert zunächst einmal eine geeignete Verbindung zur Außenwelt des Rechners. Ein Programm muß in der Lage sein, Informationen von außen zu erfassen und Steuerungen an äußeren Geräten vorzunehmen. Die verarbeiteten Informationen können in binärer Form, also als Ja/Nein- Entscheidungen, oder als analoge Größen (größer/kleiner) vorliegen.

Das erforderliche Tor zur Außenwelt wird durch Interfaces geöffnet. Für PCs nach dem Industriestandard haben sich folgende Formen von Interfaces durchgesetzt:

- Erweiterungskarten werden in den Rechner gesteckt und erlauben höchste Arbeitsgeschwindigkeiten, sind allerdings auch mit hohen Kosten verbunden.

- Standardschnittstellen verbinden den PC mit externen Interface-Schaltungen. Üblich sind z.B. Interfaces an der seriellen RS232-Schnittstelle, die sich relativ preiswert aufbauen lassen.

- Interfaces mit einem eigenen Prozessor führen Aufgaben weitgehend ohne Datenaustausch mit dem PC durch. Der Anwender muß sich dabei zusätzlich mit der Programmierung dieser Systeme auseinandersetzen.

- Die ohnehin vorhandenen Schnittstellen des PC, also die serielle Schnittstelle, die Druckerschnittstelle und oft auch der Joystick-Anschluß, lassen sich direkt als Interface nutzen. Damit erübrigt sich für zahlreiche Anwendungen jegliche zusätzliche Hardware.

Die direkte Verwendung vorhandener Schnittstellen eignet sich besonders für einfache Versuche. So lassen sich z.B. an die serielle Schnittstelle ohne weiteres Schalter oder Leuchtdioden direkt anschließen, womit viele interessante Projekte möglich werden. Die Druckerschnittstelle stellt eine größere Zahl direkt ansprechbarer Leitungen zu Verfügung, mit denen hohe Übertragungsgeschwindigkeiten zu erreichen sind.

Viele Einschränkungen lassen sich durch einfache Zusatzschaltungen überwinden. So ist die Erfassung von Spannungen mit wenigen zusätzlichen Bauteilen möglich, wenn man etwas komplexere Programme und geringere Geschwindigkeiten in Kauf nimmt. Auch Projekte mit vielen Ein/Ausgabeleitungen lassen sich mit geringem zusätzlichen Aufwand durchführen.

Allgemein werden in diesem Buch Verfahren vorgestellt, die mit weniger Hardware und etwas rechenzeitintensiveren Programmen arbeiten. Der Leser sollte Vorerfahrungen mit einer Programmiersprache haben und über Grundkenntnisse der Elektronik verfügen. Die vorgestellten Schaltungen sind meist so einfach, daß sie problemlos auf Lochrasterplatinen aufgebaut werden können. Alle Projekte in diesem Buch sind in sich geschlossenen und eignen sich für den direkten Nachbau. Darüber hinaus stellen sie Bausteine für weitergehende Entwicklungen zur Verfügung, wobei die komplexeren Verfahren die sichere Anwendung geeigneter Meßgeräte erforderlich machen. Der interessierte Leser sollte z.B. über ein Oszilloskop verfügen.

Die in diesem Buch eingesetzten Programmiersprachen für das Betriebssystem Windows95/98 sind Visual Basic 5 und Delphi 3 und 4. Alle Programmbeispiele befinden sich mit auf der CD zum Buch.

 

1.1 Die PORT.DLL

Die besondere Schwierigkeit unter Windows ist der Zugang zu den Schnittstellen des PC. Deshalb wird hier eine universell einsetzbare DLL (Dynamic Link Library, eine Windows-Funktionsbibliothek) eingesetzt, die ihrerseits in Delphi 3 geschrieben wurde. Eine DLL erfüllt die Funktion einer Spracherweiterung für unterschiedliche Programmiersprachen. Die speziell für dieses Buch entwickelte PORT.DLL befindet sich auf der CD. Die DLL muß ins Windows-Systemverzeichnis kopiert werden, damit sie von jedem Programm benutzt werden kann. Alternativ kann sie auch im Programmverzeichnis des jeweiligen EXE-Programms stehen.

Die PORT.DLL erfüllt folgende Aufgaben:

 

Die DLL kann unter ganz unterschiedlichen Programmiersystemen verwendet werden. Außer den in diesem Buch benutzen Sprachen können ihre Funktionen z.B. auch aus C-Programmen aufgerufen werden. Ein einmal entwickeltes Programm kann daher leicht auf andere Programmiersysteme übertragen werden. Außerdem kann man die DLL in Word- oder Excel-Makros ansprechen (Vgl. Kap 1.2 und Kap. 14, nähere Hinweise finden sich auch in [5]).

Die Entwicklung einer allgemeinen DLL zum Zugriff auf beliebige Hardware läuft in gewisser Weise der Windows-Philosophie entgegen, alle Hardware-Zugriffe über Treiber zu regeln. Ein Treiber gehört immer zu einem ganz bestimmten Gerät. Für kleine Hardware-Experimente ist da eigentlich kein Platz. Der korrekte Weg der Entwicklung eines Treibers ist aber so aufwendig, daß er praktisch nur von großen Firmen begangen werden kann.

Unter DOS gab es in jeder Programmiersprache Port-Befehle (GWBASIC: INP und OUT, in Turbo Pascal: PORT[..]), mit denen man direkt auf die gesamte Hardware des PC zugreifen konnte. Unter Windows 3.1 waren die Beschränkungen noch relativ begrenzt, so daß man sich leicht daran vorbeimoglen konnte. Sogar Delphi 1 besaß noch den alten PORT-Befehl.

Unter Windows 95 wird es schon schwieriger. In Visual Basic 5 gibt es keine direkte Möglichkeit für allgemeine Portzugriffe mehr. Ab Delphi 3 gelingt ein direkter Zugriff auf Portadressen nur noch mit Hilfe eines Assembler-Inlinecodes. Dieser wird in der DLL verwendet, um einen allgemeinen Zugriff nun auch wieder in Visual Basic zu ermöglichen. Das Betriebssystem läßt sich jedoch nicht mehr ohne weiteres "hintergehen", so daß man z.B. eine Schnittstelle erst ganz ordnungsgemäß anmelden muß, bevor man beliebige Dinge mit der zugehörigen Hardware tun kann.

Unter Windows NT schließlich scheint der Zug für den Hobbyentwickler endgültig abgefahren. Das System ist so auf Sicherheit hin entwickelt, daß niemand mehr direkt auf die Hardware zugreifen darf. Was bleibt, ist noch der ordnungsgemäße Weg über Treiber. Allgemeine Hardware sollte dabei über die serielle Schnittstelle angesprochen werden. Hier sind weiterhin alle Zugriffe möglich, da keine Portzugriffe, sondern ordnungsgemäße Systemroutinen verwendet werden.

Allgemein muß betont werden, daß es in diesem Buch um die experimentelle Arbeit mit PC-Schnittstellen geht. Die Entwicklung der vorgestellten Programme erfolgte unter Windows95 und Windows98 mit 32-Bit-Systemen (Visual Basic 5 und Delphi 4). Dabei besteht immer das Risiko, daß ein Programm auf bestimmten Rechnern nicht mehr läuft. Eine Schnittstelle könnte z.B. in einem System anders installiert sein, als es vorgesehen war. Oder man gerät an eine neue Windows-Version, die wieder etwas anders mit den Schnittstellenzugriffen umgeht. Man sollte also nicht versuchen, auf dieser Basis professionelle Entwicklungen durchzuführen. Sonst könnte es leicht passieren, daß man vor lauter bösen Anrufen frustrierter Anwender auf eine ferne Insel fliehen muß.

 

1.2 DLL-Aufrufe in Visual Basic 5

Die grundlegende Verwendung einer DLL soll hier an einem einfachen Beispiel zunächst ohne zusätzliche Hardware gezeigt werden. Der PC-Lautsprecher wird über Bausteine angesteuert, die über Portbefehle gesteuert werden können. Er läßt sich entweder mit einem Timer steuern, um einen Ton mit bestimmter Frequenz auszugeben, oder man steuert ihn über eine Ausgabeleitung des PIO-Bausteins 8255 im PC direkt. Auch so kann man Töne erzeugen, indem man nämlich eine Leitung in schneller Folge ein- und ausschaltet. Dies soll hier geschehen, um einerseits die grundsätzliche Einbindung einer DLL kennenzulernen und andererseits das Zeitverhalten unter Windows zu untersuchen.

Der Lautsprecher wird über Bit 1 des Port B am 8255 gesteuert. Der Baustein belegt die Adressen ab 60h (96 dez) im I/O-Bereich des PC. Port B liegt an der Adresse 97. Portausgaben sind immer 8 Bit breit, so daß acht Leitungen gleichzeitig geschaltet werden. Es darf jedoch nur die zweite Leitung (Bit 1) verändert werden, denn Bort B des PIO-Bausteins steuert noch vieles andere. Deshalb muß der Portzustand zunächst gelesen werden, um nur ein Bit zu verändern. Wer diese Bitbeißerei bis hierhin noch nicht ganz verstanden hat, der soll sich deshalb keine Gedanken machen, denn erstens befindet sich das fertige Programmbeispiel auf der CD, und zweitens gestaltet sich vieles für die nach außen zugänglichen Schnittstellen wesentlich einfacher.

Für den Zugang zu den einzelnen Portadressen des PC bietet die DLL zwei spezielle Funktionen:

In Visual Basic kann OutPort als Sub (Prozedur) eingebunden werden, InPort dagegen muß eine Funktion sein. Die einzelnen Elemente einer DLL werden mit dem DECLARE-Befehl angegeben. Damit die Datenübergabe zwischen Visual Basic und der DLL richtig funktioniert, müssen alle Übergabeparameter ByVal deklariert werden, d.h. als Wert im Gegensatz zur Übergabe einer Referenz-Adresse. Unter dem 32-Bit-Betriebssystem Windows95/98 muß bei der Deklaration die Großschreibung beachtet werden. In der DLL wurden alle Funktionen nur mit Großbuchstaben bezeichnet, was nun auch bei der Bezeichnung im aufrufenden Programm eingehalten werden muß. Die Deklarationen müssen sich in einem eigenen Modul (hier: Module1.bas) befinden, das in das Projekt TON eingebunden wird.

Abb. 1.1 Das Projekt Ton

Declare Sub OUTPORT Lib "PORT.DLL" (ByVal Adr As Integer,

ByVal Dat As Integer)

Declare Function INPORT Lib "PORT.DLL" (ByVal Adr

As Integer) As Integer

Declare Sub DELAY Lib "PORT.DLL" (ByVal Zeit As Integer)

Listing 1.1 Die Deklarationen im Module1.bas

InPort und OutPort sind nun im gesamten Projekt verwendbar. Zusätzlich wurde auch gleich die Delay-Prozedur deklariert, die weiter unten verwendet werden soll. Eine erste Tonausgabe soll in einer schnellen Schleife 100 Rechteckimpulse am Lautsprecher erzeugen, die dann als Ton hörbar sein sollten. Die einzelnen Bitmanipulationen der Portausgabe mit OutPort verwenden die logischen Funktionen AND und OR, um jeweils nur eine Leitung des mit InPort gelesenen Ports zu verändern. Auch diese Funktionen werden an späterer Stelle noch genauer erläutert.

Das Programm soll ein einfaches Formular mit einer Schaltfläche "Ton" verwenden. Die Lautsprecherleitung wird 100 mal ein- und ausgeschaltet. Damit man z.B. bei einem PC mit 200 MHz überhaupt einen Ton hören kann, müssen zusätzliche Wartezeiten eingefügt werden. Sie werden hier durch Zählschleifen bis 10000 gebildet.

Abb. 1.2 Das Programmfenster

Private Sub Command1_Click()

For n = 1 To 100

OUTPORT 97, (INPORT(97) Or 2)

For t = 1 To 10000: Next t

OUTPORT 97, (INPORT(97) And 253)

For t = 1 To 10000: Next t

Next n

End Sub

Listing 1.2 Tonausgabe über den Lautsprecher (TON.FRM)

Betätigt man die Ton-Schaltfläche, dann ist tatsächlich ein Ton zu hören. Die genaue Tonhöhe ist vom verwendeten Rechner abhängig. Außerdem zeichnet sich der Ton nicht gerade durch eine große Reinheit aus. Vielmehr klingt er reichlich verrauscht und kratzig, man könnte auch sagen krächzend. Die Ursache dafür liegt im Zeitverhalten von Windows.

Die durch die Verzögerungsschleifen gebildeten Wartezeiten können keinesfalls gleichmäßig ausfallen, weil Windows so ganz nebenbei noch viele andere Aufgaben erledigen muß. Es muß z.B. die Maus beobachtet werden, und es müssen eventuell parallel laufende Prozesse verwaltet werden. Man spricht deshalb gern davon, daß Windows nicht "echtzeitfähig" ist, daß man also mit Windows schnelle Prozesse nicht zuverlässig steuern kann. Allerdings ist das relativ, denn es kommt immer darauf an, wie schnell und wie zuverlässig man es braucht. Saubere Töne kann man jedenfalls schon mal nicht erwarten, wenn man wie im vorigen Programmbeispiel vorgeht.

Zählschleifen sind allerdings ohnehin nicht die erste Wahl, wenn es um Zeitverzögerungen geht. Vielmehr liefert Windows selbst bessere Mittel, um genauere Verzögerungen im Millisekundenbereich zu erhalten. Sie werden über die Delay-Funktion der DLL zugänglich. Die Tonausgabe kann daher durch die Verwendung von Delay wesentlich verbessert werden. Leider ist die höchste Ausgabefrequenz nur 500 Hz, wenn man einmal pro Millisekunde den Portzustand wechselt.

 

Private Sub Command1_Click()

For n = 1 To 100

OUTPORT 97, (INPORT(97) Or 2)

DELAY 1

OUTPORT 97, (INPORT(97) And 253)

DELAY 1

Next n

End Sub

Listing 1.3 Tonausgabe mit Delay (Ton2.frm)

Der nun erzeugte Ton hört sich schon wesentlich besser an, wenn auch noch immer nicht so rein, wie er rein elektronisch zu erzeugen wäre. Das Ergebnis läßt sich mit der DLL-Prozedur RealTime (true) noch wesentlich verbessern (vgl. Kap3.2). Man erhält hier aber immerhin schon einen groben Eindruck davon, wie weit die Echtzeitfähigkeit von Windows gehen kann. Genauere Untersuchungen könnte man mit einem Oszilloskop durchführen. Aber dafür eignen sich eher Programme, die eine Schnittstellenleitung z. B. an der seriellen COM-Schnittstelle schalten.

Neben einer Delayfunktion für Millisekunden gibt es in der DLL auch noch eine Verzögerung im Mikrosekundenraster. Auch diese greift intern auf Windows-Aufrufe zurück.

Alle DLL-Aufrufe sollten in einem externen Basic-Modul PORTS.BAS deklariert werden. Es kann dann problemlos in jedes neue Projekt eingeladen werden. Ohne sich noch um die genauen Konventionen der Deklaration kümmern zu müssen, hat der Programmierer nun den Zugriff auf alle DLL-Funktionen. Die PORT.DLL muß dann mit dem kompilierten Pragramm weitergegeben werden und entweder im Windows-Verzeichnis oder im Verzeichnis des EXE-Programms stehen.

Declare Function OPENCOM Lib "Port" (ByVal A$) As Integer
Declare Sub CLOSECOM Lib "Port" ()
...

Listing 1.4 Das Modul PORTS.BAS mit allen Deklarationen für VB5

In ähnlicher Weise lassen sich die DLL-Funktionen auch in VBA deklarieren (vgl. [5]). Man kann also prinzipiell alle Versuche aus diesem Buch auch mit Word oder Excel durchführen. Die Programme lassen sich dann als Makro aus der Anwendung heraus starten. Ab Word 7 und Excel 7 lauten die Deklarationen wie in Visual Basic 5. Das folgende Beispiel zur Tonerzeugung mit dem PC-Lautsprecher wurde mit Word 97 gebildet. Weitere VBA-Beispiele finden sich in Kap. 14.

Abb. 1.3 Ein Makro in Word97

In Word 97 kann auch in einem Makro eine User-Form verwendet werden, die eigene Steuerelemente enthalten kann. Dann muß vor "Declare" das Schlüsselwort "Private" stehen. Ebenso werden alle Funktionen und Prozeduren mit "Private" gebildet.

 

1.3 DLL-Aufrufe unter Delphi

Auch in Delphi 4 sollen alle Portzugriffe nur über die PORT.DLL erfolgen. Das erste Beispiel ist wieder eine einfache Tonerzeugung über den PC-Lautsprecher. Das Programm enthält zwei Schaltflächen zur Tonerzeugung, wobei einmal (Ton1) mit einer Zählscheife und einmal (Ton2) mit Delay gearbeitet wird.

Abb. 1.4 Das erste Delphi-Programm

Die DLL-Erweiterungen werden wie normale Prozeduren und Funktionen in der selben Unit angegeben und enthalten statt eines Programmcodes den Hinweis auf die externe DLL. Die Schlüsselworte "stdcall" und "external" regeln die Übergabe der Parameter an die DLL und sind entscheidend für einen korrekten Aufruf.

Wichtig ist auch die Wahl der geeigneten Typen für die übergebenen Variablen. Es hat sich gezeigt, daß mache Integer-Typen nicht mehr zwischen den einzelnen Delphi-Versionen kompatibel sind. Es kann also insbesondere dann Probleme geben, wenn man einen Quelltext aus Dephi 3 in Delphi 4 verwenden möchte oder umgekehrt. Keine Probleme hat man mit den Typen Word (16 Bit ohne Vorzeichen) und DWord (32 Bit ohne Vorzeichen) sowie Real.

In Delphi darf die eigentliche Unit (*.pas) nicht den selben Namen wie das Projekt (*.dpr) tragen. In diesem Buch soll daher durchgehend ein P für "Projekt" an den Namen der Projektdatei angehängt werden. Zur Unit TON1.PAS gehört daher das Projekt TON1P.DPR. Beim Compilieren entsteht daher zunächst das ausführbare Programm TON1P.EXE, das aber der besseren Übersicht wegen auf der CD in TON1.EXE umbenannt wurde.

 

unit Ton1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Ton1: TButton; Ton2: TButton;

procedure Ton1Click(Sender: TObject);

procedure Ton2Click(Sender: TObject);

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure OUTPORT (adr: Word; Wert: Word);

stdcall; external 'PORT.dll';

function INPORT (adr: Word):Integer;

stdcall; external 'PORT.DLL';

procedure DELAY (ms: Word);

stdcall; external 'PORT.DLL';

procedure TForm1.Ton1Click(Sender: TObject);

var n, t: Integer;

begin

For n := 1 to 100 do begin

OutPort (97, (InPort (97) OR 2));

For t := 1 to 10000 Do;

OutPort (97, (InPort (97) AND 253));

For t := 1 to 10000 Do;

end;

end;

procedure TForm1.Ton2Click(Sender: TObject);

var n: Integer;

begin

For n := 1 to 100 do begin

OutPort (97, (InPort (97) OR 2));

Delay (1);

OutPort (97, (InPort (97) AND 253));

Delay (1);

end;

end;

end.

Listing 1.5 Tonausgaben in Delphi (Ton1.pas)

Wählt man eine Zählschleife zur Zeitverzögerung, dann wird sehr schnell die insgesamt gegenüber Visual Basic etwa 10 mal größere Ausführungsgeschwindigkeit sichtbar. Mit einem 200-MHz-PC ergibt sich für eine Zählschleife bis 10000 eine Frequenz von ca. 5 kHz. Bei noch schnelleren Rechnern ist der Ton kaum noch hörbar.

Viele Anwendungen sind auf einen zuverlässigen Zeitablauf unabhängig vom verwendeten Rechner angewiesen. Über die Delay-Prozedur ergibt sich prinzipiell in jeder Umgebung dasselbe Zeitverhalten. Mit einem Klick auf Ton2 erhält man einen konstanten Ton von 500 Hz, der auf Delay basiert.

Auch in Delphi ist es sinnvoll, alle Deklarationen der DLL in einem eigenen Modul, hier in Form einer Unit unterzubringen. Die Unit PORTINC.PAS (in der compilierten Form PORTINC.DCU) kann dann in jedes neue Projekt eingebunden werden, so daß man sich nie mehr um die einzelnen Deklarations-Konventionen kümmern muß.