epst2l.tex KB 20010518 - Klaus Betzler's … und Steuergerät 9 Digital I/O Relay DAC ADC SC12 Logic...

33
epst2l.tex KB 20010518 Basierend auf einem Ein-Chip-Microcontroller wurde ein Mess- und Steuergerät konzipiert, das in seinen Funktionen flexibel konfiguriert werden kann. Es ist ins- besondere für Praktikumsanwendungen geeignet, Ziel ist zunächst die Verwen- dung im Elektronik-Praktikum [1]. Neben den dort benötigten Versorgungsspan- nungen(+5 V, +12 V, +15 V, -15 V) enthält das System derzeit 4 A/D-Wandler (12 Bit, Messbereich -10. . . +10 V), 4 D/A-Wandler (12 Bit, 2 Spannungsausgän- ge mit -10. . . +10 V, 2 Stromausgänge mit -20. . . +20 mA), je 8 digitale Ein- und Ausgänge (TTL), sowie 8 Relaisausgänge mit einpoligen Umschaltern. Der verwendete Ein-Chip-Controller (Beck IPC@CHIP SC12) ist kompatibel mit dem alten PC/XT-Standard (Intel 80186), Programme dafür können mit 16-Bit- Compilern für Intel-Prozessoren erstellt werden (Borland C, Microsoft Visual C++ Version 1.52). Als Betriebssystem enthält der Controller ein fast vollständiges DOS mit verschiedenen Erweiterungen (u. a. zur Steuerung der zusätzlichen E/A-Pins des Prozessors). Darüber hinaus ist ein TCP/IP-System mit Telnet-, FTP- und WWW-Server vom Hersteller implementiert, so dass – geeignete Soft- ware vorausgesetzt – das Gerät komplett über eine Ethernet-Verbindung fern- steuerbar ist.

Transcript of epst2l.tex KB 20010518 - Klaus Betzler's … und Steuergerät 9 Digital I/O Relay DAC ADC SC12 Logic...

FACHBEREICH PHYSIK

Elektronik�Praktikum

Mess- und Steuergerät epst2l.tex KB 20010518

Basierend auf einem Ein-Chip-Microcontroller wurde ein Mess- und Steuergerätkonzipiert, das in seinen Funktionen flexibel konfiguriert werden kann. Es ist ins-besondere für Praktikumsanwendungen geeignet, Ziel ist zunächst die Verwen-dung im Elektronik-Praktikum [1]. Neben den dort benötigten Versorgungsspan-nungen (+5 V, +12 V, +15 V, -15 V) enthält das System derzeit 4 A/D-Wandler(12 Bit, Messbereich -10. . . +10 V), 4 D/A-Wandler (12 Bit, 2 Spannungsausgän-ge mit -10. . . +10 V, 2 Stromausgänge mit -20. . . +20 mA), je 8 digitale Ein- undAusgänge (TTL), sowie 8 Relaisausgänge mit einpoligen Umschaltern.

Der verwendete Ein-Chip-Controller (Beck IPC@CHIP SC12) ist kompatibel mitdem alten PC/XT-Standard (Intel 80186), Programme dafür können mit 16-Bit-Compilern für Intel-Prozessoren erstellt werden (Borland C, Microsoft Visual C++Version 1.52). Als Betriebssystem enthält der Controller ein fast vollständigesDOS mit verschiedenen Erweiterungen (u. a. zur Steuerung der zusätzlichenE/A-Pins des Prozessors). Darüber hinaus ist ein TCP/IP-System mit Telnet-,FTP- und WWW-Server vom Hersteller implementiert, so dass – geeignete Soft-ware vorausgesetzt – das Gerät komplett über eine Ethernet-Verbindung fern-steuerbar ist.

2 Elektronik–Praktikum Physik

Inhaltsverzeichnis

1 Specifications 3

2 Safety Instructions 3

3 The Single-Chip Microcontroller SC12 4

3.1 Functional Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3.2 Pin Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3.3 Address Map (Memory and I/O) . . . . . . . . . . . . . . . . . . . 6

3.4 DOS Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3.5 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

4 Hardware of the Measurement and Control System 8

4.1 Block Diagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

4.2 Address and Data Logic . . . . . . . . . . . . . . . . . . . . . . . . 9

5 Software of the Device 10

5.1 Peripheral Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

5.2 I/O Cards on the Peripheral Bus . . . . . . . . . . . . . . . . . . . 13

5.3 Test Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

5.4 Socket Implementation . . . . . . . . . . . . . . . . . . . . . . . . . 16

5.5 Ethernet Communications Program . . . . . . . . . . . . . . . . . . 17

6 PC Programs 19

6.1 C/C++ – UNIX (Linux) . . . . . . . . . . . . . . . . . . . . . . . . . 19

6.2 C/C++ – Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

6.3 Microsoft Foundation Classes (MFC) . . . . . . . . . . . . . . . . . 21

6.4 Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

6.5 Java and MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

6.6 Measurement Samples . . . . . . . . . . . . . . . . . . . . . . . . 24

Anhang A: Technische Beschreibung des Herstellers 26

Anhang B: Schaltpläne 30

Mess- und Steuergerät 3

1 Technische Daten

Mess- und Steuergerät:

� Ein-Chip-Controller SC12,

� 10BaseT-Ethernet-Anschluss,

� 2 serielle Schnittstellen,

� 4 A/D-Wandler-Eingänge 12 Bit, -10. . . +10 V, RE = 1M,

� 2 D/A-Wandler-Ausgänge 12 Bit, -10. . . +10 V, max. �20 mA,

� 2 D/A-Wandler-Ausgänge 12 Bit, -20. . . +20 mA, max. �10 V,

� 8 digitale Ausgänge, TTL,

� 8 digitale Eingänge, TTL,

� 8 Umschaltrelais, einpolig, maximale Strombelastung 1 A.

Netzgerät, vom Mess- und Steuergerät unabhängig zur Versorgung von Ver-suchsschaltungen, getrennt einschaltbar:

� +5 V, max. 2 A,

� +12 V, max. 1 A,

� +15 V, max. 1 A,

� -15 V, max. 0.5 A.

2 Sicherheitshinweise

Alle internen und externen Spannungen sind aus Sicherheitsgründen masse-bezogen und mit dem Schutzleiter verbunden. Dadurch führen alle schwarzenAusgangsbuchsen das Potenzial des Schutzleiters.

Niemals ein Gerät mit Schutzleiteranschluss an einer Steckdose ohne Schutz-leiter betreiben!

Aufgrund der seit dem 01.01.1996 geltenden Vorschriften des EMVG’s ist diesGerät nur für den internen Gebrauch zugelassen.

Reparaturen, Veränderungen oder Umbauten dürfen nur von Fachkräften aus-geführt werden.

4 Elektronik–Praktikum Physik

3 Der Ein-Chip- Microcontroller SC12

Abbildung 1: Der Ein-Chip-MicrocontrollerSC12, etwa in Originalgröße.

Mit dem SC12-Microcontroller hat die Firma Beck [2] einen kompletten PC in ei-nem 32-poligen Standardgehäuse integriert. Seine wesentlichen Eigenschaftenin Stichworten:

� 80186 PC (AT) auf einem Chip,

� 20 MHz Prozessortakt,

� Ethernet-Anschluss 10BaseT,

� 2 serielle Schnittstellen,

� 512 kB Flash-Speicher, 512 kB DRAM,

� Externer 8-Bit Adress/Datenbus für E/A,

� 14 programmierbare E/A-Leitungen,

� 3 interne Timer, 2 extern verfügbar,

� Interrupt-Controller für 6 externe Interrupts,

� PC-kompatibles BIOS und DOS auf dem Chip,

� RTOS-Erweiterungen für das BIOS,

� Vollständiger TCP/IP-Stack,

� WWW-Server, FTP-Server, Telnet-Server.

Durch die PC-kompatiblen BIOS- und DOS-Funktionen sind 16-Bit-PC-Program-me in der Regel auf dem SC12 lauffähig, wenn man auf einige Funktionen –insbesondere im Bereich der Ein- und Ausgabe – verzichtet. Dadurch ist esmöglich, Programme mit billigen, älteren Standard-Compilern zu erstellen. Na-heliegend ist die Programmierung in C mit Borland C bzw. Microsoft C oder dieProgrammierung in C++ mit Microsoft Visual C++ (die letzte 16-Bit-Version ist1.52). Die erweiterten Funktionen des SC12 können über zusätzliche Software-Interrupts genutzt werden, somit ist nirgendwo eine Programmierung in Assem-bler oder die Verwendung von Spezial-Compilern erforderlich.

Ein Bedienterminal kann entweder an eine der seriellen Schnittstellen ange-schlossen werden oder übers Netz durch einen Telnet-Client realisiert werden.Fertige Programme werden per FTP auf die insgesamt 256 kB große Flash-Diskoder auf eine RAM-Disk1 geladen und von dort gestartet.

autoexec.bat.1 Bis zu 256 kB des DRAM-Speichers können beim Systemstart als RAM-Disk konfiguriert wer-

den (CHIP.INI).

Mess- und Steuergerät 5

3.1 Funktionsübersicht

Das Blockdiagramm in Abbildung 2 verdeutlicht den Hardware-Aufbau des SC12.Die zentrale Einheit des Controllers ist eine 80186-CPU, die mit 20 MHz getak-tet wird. Insgesamt sind 1 MB Speicher vorhanden, jeweils 512 kB als Flash-EPROM und als DRAM. Eine Hälfte des Flash-Speichers enthält die Firmwa-re des Controllers, BIOS und DOS mit ihren spezifischen Erweiterungen, dieandere Hälfte ist als logische Disk konfiguriert (Laufwerk A:). Weiterhin inte-griert sind eine Watchdog-Schaltung und verschiedene Ein/Ausgabe-Bausteine(Ethernet, 2 serielle Schnittstellen, DMA, programmierbare E/A-Leitungen, Ti-mer, Interrupt-Eingänge, I2C-Bus).

Abbildung 2: Schematische Übersicht über die im SC12 zusammengefasstenfunktionalen Blöcke.

Eine vollständige Adressierung des im 80186 verfügbaren Speicher- und Ein/Ausgabe-Addressbereichs ist nur auf dem internen Bus möglich, nach außengeführt ist ein gemultiplexter 8-Bit-Adress/Daten-Bus für den Betrieb externerEin/Ausgabe-Bausteine. Weitere Anschlusspins können als zusätzliche Adress-leitungen oder als Chip-Select-Leitungen zur Auswahl von Adressbereichen kon-figuriert werden (die Chip-Select-Signale entsprechen den dekodierten Adress-bits 8,9 und 10).

3.2 Pinbelegung

Wie schon aus dem Blockdiagramm Abbildung 2 ersichtlich ist, reichen die 32 An-schlusspins nicht aus, um alle Funktionen eindeutig zu trennen, viele Anschlüs-se sind mehrfach belegt (Abbildung 3). Ein Programm, das bestimmte Funk-

6 Elektronik–Praktikum Physik

tionen benutzen will, muss daher zunächst immer dafür sorgen, dass die An-schlüsse genau auf die gewünschte Funktionalität umprogrammiert werden.

Abbildung 3: Pinbelegung des SC12.

3.3 Adressbereiche (Speicher und E/A)

Abbildung 4: Speicher- und Ein/Ausgabe-Adressen des Microcontrollers SC12.Die Adressblöcke im Ein/Ausgabe-Bereich sind jeweils mit den vermerkten Chip-Select-Leitungen verbunden.

Der Prozessor 80186 kann 1 MB Speicher- und 64 kB Ein/Ausgabe-Bereichadressieren (20 Bit bzw. 16 Bit). Im SC12 ist der Speicheradressbereich durch

Mess- und Steuergerät 7

den eingebauten Speicher voll ausgenutzt, die Aufteilung ist in Abbildung 4 dar-gestellt: 512 kB DRAM und 512 kB Flash-EPROM. Wie beim PC üblich, liegtdas RAM im unteren Adressbereich, das ROM im oberen. Die Hälfte des Flash-Speichers ist als schreibbare, nichtflüchtige Disk konfiguriert (Laufwerk A:), ma-ximal die Hälfte des RAMs kann als RAM-Disk eingerichtet werden (LaufwerkE:). Im Ein/Ausgabe-Bereich sind nicht alle Adressen verfügbar, zugunsten derdekodierten Chip-Select-Leitungen wurde auf vollständige Adressierbarkeit ver-zichtet (falls mehr als die so verfügbaren Adressen benötigt werden, können diePIO-Leitungen entsprechend genutzt werden). Mit den Chip-Select-Leitungenwerden jeweils getrennte 8-Bit-Adressbereiche selektiert, so wird CS0 aktiviert,wenn eine Adresse zwischen 0 und 0FFh angewählt wird, CS1 bei Adressenzwischen 100h und 1FFh usw.

3.4 DOS-Erweiterungen

Zur Steuerung der zusätzlichen Funktionen des Controllers SC12 wurde dasfür Betriebssystemaufrufe unter DOS übliche System der Software-Interruptsum verschiedene Zusatzaufrufe erweitert. Logisch zusammengehörige Funktio-nen sind jeweils einem Software-Interrupt im Bereich 0xA0. . . 0xAF zugeordnet,die speziellen Funktionen werden über das Register AH ausgewählt, Parameterwerden in den übrigen Registern übergeben.

Unter anderem umfassen die zusätzlichen Software-Interrupts die folgenden Be-reiche:

0xA1, HAL_INT: Hardware Abstraction Layer, Zugriffe auf die Systemhardware (Datenbus,programmierbare Ein/Ausgabe-Leitungen, Timer).

0xA2, PFE_INT: Pin Function Enabler, die Funktionen der mehrfach belegten Anschlus-spins werden dadurch festgelegt.

0xAA, I2C_INT: Funktionen der I2C-Schnittstelle.

0xAB, CGI_INT: Konfiguration des Webservers und Installation von CGI-Programmen imSystem.

0xAC, TCP_INT: Zugriff auf das TCP/IP-System. Implementiert sind die meisten Berkeley-Style-Funktionen wie open, close, bind, connect, listen, ac-cept, send, receive, ...

0xAD, RTX_INT: Echtzeit-Erweiterungen des Betriebssystems (RTOS – Real Time Opera-ting System).

Ausführlich beschrieben sind die einzelnen Funktionsaufrufe im Teil BIOS APIder Dokumentation [3].

Der Aufruf der Software-Interrupts erfolgt in C/C++ mit der Funktion int86x.Das folgende Programmfragment würde die Chip-Select-Leitungen CS0, CS5und CS6 zur Verwendung freigeben:

const unsigned short PFE_INT = 0xA2;const unsigned char ENABLECS = 0x83;const unsigned short CSMASK = (1<<0) | (1<<5) | (1<<6);...

8 Elektronik–Praktikum Physik

union REGS inregs, outregs;struct SREGS segregs;...inregs.h.ah = ENABLECS;inregs.x.dx = CSMASK;int86x(PFE_INT, &inregs, &outregs, &segregs); .

3.5 Konfiguration

Die Betriebsart der Hardware und des TCP/IP-Systems wird in mehreren Schrit-ten konfiguriert. Beim Systemstart werden für die programmierbaren Prozessor-pins bestimmte Anfangswerte eingestellt. Danach wird die Datei CHIP.INI ge-lesen, und es werden die dort vermerkten Grundeinstellungen übernommen, un-ter anderem IP-Adresse bzw. DHCP, RAM-Disk, Betriebsart der seriellen Schnitt-stellen, User und Passwörter sowie Betrieb der TCP/IP-Dienste. Schließlichwerden die in der Datei AUTOEXEC.BAT vermerkten Kommandos bzw. Pro-gramme ausgeführt.

Ein Benutzerprogramm kann dann die Konfiguration über die zuständigen Be-triebssystemaufrufe nochmals verändern und an seine Erfordernisse anpassen.

Die Konfigurationsmöglichkeiten werden in der Dokumentation [3] der Herstel-lerfirma sehr ausführlich und relativ vollständig beschrieben. Die Startkonfigura-tion der Prozessorpins ist im Abschnitt IPCChip Initialization der BIOS-API-PDF-Datei angegeben, die möglichen Einträge für CHIP.INI im Abschnitt CHIP.INIDocumentation, die Kommandos für den Befehlsinterpreter im Abschnitt Com-mand Processor.

4 Hardware des Steuergeräts

Zugunsten einer robusten Konzeption wurde darauf verzichtet, die Möglichkei-ten der Controller-Hardware voll auszunutzen. So wird beispielsweise auf dasMultiplexen von Adressen und Daten verzichtet, da dies Schwierigkeiten mitlangsamer Peripherie bringen könnte. Stattdessen wurde ein Bus mit getrenn-ten Adress- und Datenleitungen implementiert, der auch quasistatisch betriebenwerden kann.

4.1 Blockdiagramm

Den modularen Aufbau des Steuergeräts skizziert Abbildung 5. Kernstück ist derEin-Chip-Controller SC12 mit Ethernet-Anschluss und 2 seriellen Schnittstel-len. Über eine Logik-Schaltung wird ein Peripheriebus mit getrennten Adress-,Daten- und Steuerleitungen betrieben. An diesem Bus werden die Ein/Ausgabe-Karten für digitale Ein/Ausgabe, Relais, D/A- und A/D-Wandler betrieben.

Daten- und Adressbus sind jeweils 8 Bit breit. Daten werden zwischen Con-troller und Peripherie als ganze Bytes transportiert. Beim Adressbus werden dieniederwertigen 4 Bits zur Adressierung einer Ein/Ausgabe-Karte verwendet (Ba-sisadresse), die oberen 4 Bits für zusätzliche Aufgaben wie z. B. Subadressen

Mess- und Steuergerät 9

Digital I/O Relay DAC ADC

SC12

Logic Address

Data

1 . . . 8Switch

1U

41...8In

1...8Out

2 3I

3 41 2RS232

Ethernet

RS232

Abbildung 5: Blockdiagramm des Steuergeräts.

(ADC und DAC). Die Basisadressen 0 und 0Fh sind reserviert: 0 wird grund-sätzlich freigehalten, kann somit als ‘ungültige Adresse’ verwendet werden, 0Fhwird für Spezialzwecke wie Reset oder Kalibrierung benutzt.

4.2 Adress- und Datenlogik

SC12

Data

Data

Address

Address

Data OutID In Data In

IOWR

IORD

CS0

IDRD

DATARD

ADWR

DATAWR

CS6

CS5

ControlLogic

CS CS CS CS

Abbildung 6: Adress- und Datenlogik des Steuergeräts. Die Richtungen derBustreiber sind durch Pfeile angedeutet. Der Treiber für die Adressleitungenenthält zusätzlich ein Register, um die Adressen statisch auf ihrem Zustand zuhalten.

Die Adress- und Datenleitungen des Peripheriebusses werden vom 8-Bit-Da-tenbus des Microcontrollers über Bustreiber gesetzt und gelesen. Das Schemazeigt Abbildung 6. Als Funktionen sind implementiert:

� Setzen (Schreiben) der Adressleitungen (Address),

� Lesen eines Identifikations-Bytes (ID In), über das der Typ einer Ein/Ausgabe-Karte festgestellt wird2,

� Setzen (Schreiben) der Datenleitungen (Data Out),

� Lesen der Datenleitungen (Data In).

2 Über zusätzliche Datenleitungen im Peripheriebus, die auch für andere Aufgaben genutzt wer-den können.

10 Elektronik–Praktikum Physik

Die zugehörigen Chip-Select-Signale für die Bustreiber (ADWR, IDRD, DATA-WR, DATARD) werden in der Kontroll-Logik aus den Steuersignalen des Micro-controllers gebildet:

ADWR = CS0 & IOWRIDRD = CS0 & IORDDATAWR = CS6 & IOWRDATARD = CS5 & IORD

Diese Verknüpfungen müssen bei der Programmierung des Microcontrollers ingeeigneter Form nachgebildet werden.

Die obigen Signale sind real in negativer Logik ausgeführt, die Verknüpfungs-gleichungen müssten also etwa so lauten:

ADWR = CS0 | IOWR. . . = . . .

Für das Verständnis und auch als Basis für die Programmierung ist jedoch dieobige Formulierung in positiver Logik hinreichend.

Adressen und ID-Bytes der derzeit vorhandenen Karten sind in Tabelle 1 zu-sammengestellt.

Tabelle 1: Basisadres-sen und Identifikations-Bytes der aktuellenEin/Ausgabe-Karten.

Ein/Ausgabe-Karte Adresse ID-Byte

Digital-Ein/Ausgabe 4 0x0D

Relais 6 0x0B

Analog/Digital-Konverter 8 0x0C

Digital/Analog-Konverter 9 0x0E

5 Software des Steuergeräts

Software für das Steuergerät kann auf einem PC mit 16-Bit-Compilern für MS-DOS, gegebenenfalls aber auch direkt in Assemblercode erstellt werden. Diehier beschriebenen Programmteile wurden mit der Visual-C++-Entwicklungsum-gebung von Microsoft erstellt. Die jüngste dafür noch verwendbare Version ist1.52 aus dem Jahre 1993, spätere Versionen erzeugen nur noch 32-Bit-Code.

Abweichend von den Voreinstellungen muss bei den Projektoptionen als ‘Pro-ject Type’ MS-DOS application (.EXE), als ‘CPU’ 80186 / 80188 und als ‘Struc-ture Member Byte Alignment’ 1 Byte eingestellt werden. Zweckmäßigerweisewerden die Programme sofort im Release Modus kompiliert, da sie meist aufdem Host-PC nicht lauffähig sind. Der Transfer der Programme auf den Mi-crocontroller erfolgt über eine FTP-Verbindung, gestartet werden sie von einerTelnet-Konsole oder über ein an eine der seriellen Schnittstellen3 angeschlosse-nes Terminal (PC mit Terminal-Programm). Als FTP-Programm unter Windowseignet sich beispielsweise WS_FTP von Ipswitch [4], als Terminal-Programm fürTelnet und serielle Schnittstellen Tera Term Pro [5]; beide sind frei verfügbar.

3 Die Geschwindigkeit der seriellen Schnittstellen kann über die Datei CHIP.INImodifiziert wer-den (Beschreibung im Abschnitt CHIP.INI Documentation der BIOS-API-Dokumentation [ 3]), dieVoreinstellung ist 19200 Baud. Fest eingestellt sind 8 Datenbits, kein Paritätsbit und 1 Stopbit.

Mess- und Steuergerät 11

5.1 Peripheriebus

Die Definitionen und Klassen zur Busansteuerung sind in der Datei IOPORT.Hzusammengefasst.

Zuerst werden die konkreten Parameter der Hard- und Software auf aussage-kräftige symbolische Namen umgesetzt:

typedef unsigned short USHORT;

const USHORT CSAD = 0, // Chip SelectsCSID = 0,CSRD = 5,CSWR = 6;

const USHORT PFE_INT = 0xA2, // Pin Function ConfigurationENABLEDATA = 0x80,ENABLECS = 0x83,NOALE = 0,BIDIRECT = 0xFFFF,CSMASK = (1<<CSAD) | (1<<CSID)

| (1<<CSRD) | (1<<CSWR);

const USHORT ADDIO = 4, // Standard AddressesADREL = 6,ADADC = 8,ADDAC = 9,ADCAL = 15; // Calibration

const USHORT IDREL = 0x0b, // Identification BytesIDDIO = 0x0d,IDADC = 0x0c,IDDAC = 0x0e;

struct portID {USHORT id;char * idstring;

};const struct portID ID[] = {{IDREL, "Relay"},{IDDIO, "Digital I/O"},{IDADC, "ADC"},{IDDAC, "DAC"}

};

Die beiden ersten Gruppen betreffen die Spezifika der Hardware-Auslegung –Chip-Select-Leitungen und die Konstanten für die Pin-Konfiguration des Control-lers. Der Rest betrifft die derzeit vorhandenen Ein/Ausgabe-Karten – Standard-Adressen, Identifikations-Bytes und Identifikations-Strings.

Die Klasse IOConfig implementiert die DOS-Aufrufe für die Pin-Konfiguration– ALE wird deaktiviert, der Datenbus wird auf bidirektionalen Betrieb eingestellt,die benötigten Chip-Select-Leitungen werden aktiviert:

class IOConfig {

12 Elektronik–Praktikum Physik

private:void EnableData() {

union REGS inregs, outregs;struct SREGS segregs;inregs.h.ah = ENABLEDATA;inregs.h.al = NOALE;inregs.x.dx = BIDIRECT;int86x(PFE_INT, &inregs, &outregs, &segregs);

}void EnableCS() {

union REGS inregs, outregs;struct SREGS segregs;inregs.h.ah = ENABLECS;inregs.x.dx = CSMASK;int86x(PFE_INT, &inregs, &outregs, &segregs);

}public:IOConfig() {

EnableData();EnableCS();

}};

Im Konstruktor der Klasse werden die beiden für die Pin-Konfiguration benötig-ten Funktionen ausgeführt.

Die Klasse IOPort setzt dann die in Abschnitt 4.2 beschriebene Ansteuerlogikfür den Peripheriebus in Softwareanweisungen um – mit AddressWr, IdRd,DataWr, DataRd werden die zugehörigen Latches selektiert und gesetzt bzw.gelesen. Die gewünschten Chip-Select-Leitungen des Controllers werden durchentsprechende Ein/Ausgabe-Adressen (CS<<8) aktiviert. Die Kombination vonAdressen mit Daten ergibt die ‘gewohnten’ Ein/Ausgabe-Kommandos OutPortund InPort:

class IOPort : private IOConfig {protected:USHORT addr;enum {HBE = 1<<4};

void AddressWr(USHORT address) {_outp(CSAD<<8, address);

}USHORT IdRd() {

return _inp(CSID<<8);}void DataWr(USHORT data) {

_outp(CSWR<<8, data);}USHORT DataRd() {

return _inp(CSRD<<8);}void OutPort(USHORT address, USHORT data) {

AddressWr(address);DataWr(data);

}

Mess- und Steuergerät 13

USHORT InPort(USHORT address) {AddressWr(address);return DataRd();

}public:IOPort(USHORT a) : addr(a) {}USHORT Addr() { return addr; }USHORT Identify() {

AddressWr(addr);return IdRd();

}char * IDString() {

USHORT thisID = Identify();for (int i=0; i<sizeof(ID)/sizeof(portID); i++)if (ID[i].id == thisID)

return ID[i].idstring;return "";

}};

Die Klasse basiert auf IOConfig, im Konstruktor wird daher (außer der Adresszu-weisung) auch der Konstruktor dieser Basisklasse ausgeführt, d. h. es wird au-tomatisch für die richtige Pin-Konfiguration gesorgt, wenn ein IOPort–Objektin einem Programm verwendet wird. Mit Identify und IDString könnendie einzelnen Ein/Ausgabe-Karten identifiziert werden.

5.2 Ein/Ausgabe-Karten am Peripheriebus

Auf IOPort basieren die Klassen für die Ein/Ausgabe-Karten (ebenfalls in derDatei IOPORT.H). Die Adressen werden – wenn vom aufrufenden Programmnicht anders vorgesehen – jeweils auf die Standardwerte eingestellt.

Im Konstruktor der abgeleiteten Klassen wird überprüft, ob die richtige Karteunter der angegebenen Adresse vorhanden ist, wenn nicht, wird die Adresse(addr) auf null gesetzt. Ein Programm, das eine Ein/Ausgabe-Karte verwendenwill, kann die Adresse mit der Funktion Addr der Basisklasse IOPort, dieauf alle Kartenklassen vererbt wird, überprüfen und entsprechend reagieren.Andererseits ist ein Ein- oder Ausgabeaufruf mit Adresse null ohne Wirkung, dasich unter der Adresse keine Peripherie befindet.

Die Klasse DigitalIO enthält die Funktionen Write und Read zum Setzenund Lesen der TTL-Aus- und -Eingänge der digitalen Ein/Ausgabe-Karte:

class DigitalIO : public IOPort {public:DigitalIO(USHORT addr = ADDIO) : IOPort(addr) {

if (Identify()!=IDDIO)addr = 0;

}void Write(USHORT data) {

OutPort(addr, data);}USHORT Read() {

return InPort(addr);

14 Elektronik–Praktikum Physik

}void Reset() {Write(0);}

};

Bei der Relais-Karte ist nur eine Write-Funktion definiert (das Negieren derDatenbits ist schaltungstechnisch notwendig):

class Relay : public IOPort {public:Relay(USHORT addr = ADREL) : IOPort(addr) {

if (Identify()!=IDREL)addr = 0;

}void Write(USHORT data) {

OutPort(addr, ~data); }void Reset() {Write(0);}

};

Die Write-Funktion in der Klasse DAC für die D/A-Wandler-Ausgänge ist et-was aufwendiger, da die Karte vier Ausgabekanäle enthält. Der Beschriftungdes Steuergeräts entsprechend wird eine Kanaladresse 1. . . 4 erwartet, sie wirdfür die interne Adressierung auf 0. . . 3 umgesetzt und in die Adressbits 5 und 6geschoben. Mit Adressbit 4 werden die oberen 4 Bits des 12-Bit-Ausgabewertsaktiviert (HBE), das auf LO gesetzte Adressbit 7 (LE) sorgt dafür, dass der bisdahin zwischengespeicherte Wert an den Ausgang weitergeleitet wird. Eineweitere kleine Komplikation ergibt sich durch die Ausgangsverstärker, die bei-den Spannungsausgänge (Kanäle 1 und 2) sind so geschaltet, dass ein Digi-talwert von 0 einer Spannung von +10 V, einer von 4095 -10 V entspricht, beiden Stromausgängen (Kanäle 3 und 4) entspricht 0 einem Strom von -20 mA,4095 einem von +20 mA, die Nullpunkte liegen jeweils bei einem Digitalwert von2048. Die Software sorgt dafür, dass ein an die Write-Funktion übergebenerDigitalwert von 2047 dem maximalen positiven (+10 V bzw. +20 mA), von -2047dem maximalen negativen Ausgangswert entspricht (-10 V bzw. -20 mA).

class DAC : public IOPort {private:enum {LE = 1<<7};

public:DAC(USHORT addr = ADDAC) : IOPort(addr) {

if (Identify()!=IDDAC)addr = 0;

}void Write(USHORT channel, short data) {

channel--;if (channel>3)return;

if (channel<2)data = 2048-data;

elsedata = 2048+data;

USHORT ad = addr | (channel<<5) | LE;OutPort(ad, data);ad = addr | (channel<<5) | HBE;OutPort(ad, data>>8);

Mess- und Steuergerät 15

AddressWr(0);}void Reset(){

for (int i=1; i<5; i++)Write(i,0);

}};

In der Read-Funktion der Klasse ADC für die A/D-Wandler-Eingänge wird dieKanaladresse ähnlich wie in DAC gebildet, sie liegt auf den Adressbits 6 und7. Die A/D-Wandlung wird durch eine Ausgabe auf die entsprechende Adressegestartet, nach kurzer Warteschleife kann der Wert gelesen werden. Auch hierwieder HBE zum Lesen der 4 oberen Bits des Digitalwerts:

class ADC : public IOPort {private:int n;void Wait(int duration) {

for (int i=0; i<duration; i++)n = i+i;

}public:ADC(USHORT addr = ADADC) : IOPort(addr) {

if (Identify()!=IDADC)addr = 0;

}short Read(USHORT channel) {

channel--;if (channel>3)return 0;

USHORT ad = addr | (channel<<6);OutPort(ad, 0);Wait(10);short lobyte = DataRd() & 0xFF;short hibyte = InPort(ad | HBE) & 0x0F;AddressWr(0);return (hibyte<<8) + lobyte -2048;

}void Calibrate() {

AddressWr(ADCAL);AddressWr(0);Wait(100);

}};

Der Eingang des 12-Bit-A/D-Wandlers ist so beschaltet, dass der Spannungs-bereich -10. . . +10 V auf die Digitalwerte 0. . . 4095 umgesetzt wird. Durch denAbzug von 2048 vom ursprünglichen Digitalwert wird ein dem symmetrischenMessbereich -10. . . +10 V besser entsprechender ebenfalls zum Nullpunkt sym-metrischer Ausgabewertebereich -2047. . . +2047 erreicht. In der Funktion Ca-librate wird kurzzeitig die Spezialadresse für die Kalibrierung am Adressbusangelegt und damit die Kalibrierung des A/D-Wandlers veranlasst.

16 Elektronik–Praktikum Physik

5.3 Testprogramme

Auf den verfügbaren Klassen können einfache Testprogramme für Teilfunktio-nen aufgebaut werden. Das Programm Identify listet die vorhandenenEin/Ausgabe-Karten des Steuergeräts auf:

int main() {printf("\nADDR ID TYPE\n");printf("---------------------\n");for (unsigned short a=1; a<15; a++) {

IOPort p(a);printf("%02X : %02X : %s\n",a, p.Identify(), p.IDString());

}return 0;

}

DAC setzt einen D/A-Kanal auf einen bestimmten Wert:

int main(int argc, char* argv[]){if (argc < 3) {

printf ("\nusage: DAC <channel> <data>\n\n");return 1;

}DAC da;unsigned short channel = atoi(argv[1]);short data = atoi(argv[2]);da.Write(channel, data);return 0;

}

ADC liest und listet alle A/D-Eingänge:

int main(){ADC ad;printf("\nCHANNEL DATA\n");printf("--------------\n");for (unsigned short chan=1; chan<5; chan++)

printf("%4d %5d\n", chan, ad.Read(chan));return 0;

}

Analog arbeiten die Programme Calibr, DigiIO und Relay.

5.4 Socket-Implementierung

Die für TCP/IP-Verbindungen notwendige Socket-Funktionalität ist in der KlassecSocket in der Datei SOCKET.H formuliert. Die Funktionsnamen halten sichweitgehend an die Berkeley-Socket-Konventionen:

typedef unsigned short USHORT;

static const USHORT TCP_INT = 0xAC;

Mess- und Steuergerät 17

class cSocket {private:REGS inregs, outregs;SREGS segregs;sockaddr_in Ad, *pAd;recv_params Rdata, *pRd;send_params Sdata, *pSd;short sd;short established;USHORT error;

public:cSocket()

: established(0), error(0), sd(0), pAd(&Ad),pRd(&Rdata), pSd(&Sdata)

{Rdata.flags = MSG_TIMEOUT;Rdata.timeout = 20000L;Sdata.flags = MSG_DONTWAIT;

};~cSocket()

{ };short Create(unsigned char type = SOCK_STREAM);short Connect();short Bind(USHORT port);USHORT HtoNs(USHORT port);short Listen(short n = 1);short Accept(cSocket& T);short DataAvailable();void ReceiveFlags(USHORT Flag, unsigned long Time);short Receive(char * buffer, USHORT n);void SendFlags(USHORT Flag)

{ Sdata.flags = Flag; };short Send(char * buffer, USHORT n);short Send(char * buffer);short Close();short Established()

{ return established; };short GetError()

{ return error; };};

Die einzelnen Funktionen sind als C++-Wrapper für die eher kryptischen undetwas unhandlichen DOS-Aufrufe (int86) implementiert, als Beispiel die Funk-tion Send:

short cSocket::Send(char * buffer, USHORT n){Sdata.bufferPtr = (char *) buffer;Sdata.bufferLength = n;Sdata.toPtr = NULL;Sdata.tolengthPtr = NULL;

inregs.h.ah = API_SEND;inregs.x.bx = sd;

18 Elektronik–Praktikum Physik

inregs.x.dx = FP_SEG(pSd);inregs.x.si = FP_OFF(pSd);int86(TCP_INT, &inregs, &outregs);

if(outregs.x.dx == (USHORT)API_ERROR) {error = outregs.x.ax;return API_ERROR;

}error = 0;return outregs.x.ax;

}

5.5 Ethernet-Kommunikationsprogramm

Ein einfaches Betriebsprogramm für das Steuergerät (SOCKTEST) korrespon-diert über Ethernet mit Clienten und beantwortet deren Anfragen. Für die Ver-bindung wird ein Server-Socket eingerichtet, der auf Anfragen wartet:

#ifdef TESTvoid INFO(char * s) { printf(s); }void INFO(char * s, char * t) { printf(s, t); }

#elsevoid INFO(char * s) {}void INFO(char * s, char * t) {}

#endif

const unsigned short BUFSIZE = 1024;const unsigned short TCPPORT = 1234;

int main(){dio.Reset();rel.Reset();dac.Reset();cSocket S, *T;char buffer[BUFSIZE+1];

S.Create();S.Bind(TCPPORT);

while(1) { INFO("** Listen\n");S.Listen();T = new cSocket();S.Accept(*T); INFO("** Connect\n");while(T->Established() == 1) {T->Receive(buffer, BUFSIZE); INFO("-> %s\n",buffer);Interprete(buffer); INFO("<- %s",buffer);T->Send(buffer);

}delete T; INFO("** Disconn\n");

}return 0;

}

Im Hauptprogramm main die bei Server-Sockets übliche Funktionsabfolge:

Mess- und Steuergerät 19

� Einrichten des Hauptsockets S mit Create und Bind,

� Warten auf eine Anfrage mit Listen,

� Verbindungsannahme mit Accept auf dem vorher eingerichteten Hilfs-Socket T,

� T erledigt die Kommunikation mit Receive und Send, bis die Verbin-dung durch den Client beendet wird.

Die auf der rechten Seite eingefügten INFO-Aufrufe dienen dazu, während derTestphase (#ifdef TEST) den Ablauf zu protokollieren (Ausgabe auf die Kon-sole mit printf).

Interprete interpretiert und erledigt die empfangenen Anfragen, für die ein-zelnen Ein/Ausgabe-Karten werden zuvor globale statische Objekte definiert.Die möglichen Kommandos sind listenartig zusammengestellt:

DigitalIO dio;Relay rel;DAC dac;ADC adc;

const char CMDDIN[] = "di";const char CMDDUT[] = "do <data>"; // <data> = 0..255const char CMDREL[] = "re <data>"; // <data> = 0..255const char CMDDAC[] = "da<n> <data>"; // <n> = 1..4

// <data> = -2047..2047const char CMDADC[] = "ad<n>"; // <n> = 1..4

void Interprete(char * buffer){if (buffer[0]==’\0’)

return;for (char * s = buffer; *s; s++)

tolower(*s);if (strncmp(buffer, CMDDIN, 2)==0)

sprintf(buffer, "%3d\r\n", dio.Read());else if (strncmp(buffer, CMDDUT, 2)==0) {

dio.Write(atoi(buffer+3));sprintf(buffer, "OK\r\n");}

else if (strncmp(buffer, CMDREL, 2)==0) {rel.Write(atoi(buffer+3));sprintf(buffer, "OK\r\n");}

else if (strncmp(buffer, CMDDAC, 2)==0) {dac.Write(atoi(buffer+2), atoi(buffer+4));sprintf(buffer, "OK\r\n");}

else if (strncmp(buffer, CMDADC, 2)==0)sprintf(buffer, "%5d\r\n", adc.Read(atoi(buffer+2)));

elsesprintf(buffer, "COMMAND ERROR\r\n");

}

20 Elektronik–Praktikum Physik

Das Programm antwortet mit ‘OK’ bei Ausgabeanweisungen, dem Messwert beiEingabeanweisungen oder einer Fehlermeldung bei nicht erkannten Anweisun-gen. Die Antwort-Strings werden jeweils durch ein Zeilenende (CR, LF) ab-geschlossen, dies erleichtert die Verarbeitung auf der Client-Seite (die Antwortkann in Java mit readLine gelesen werden).

6 PC-Programme

Programme, die über die Ethernet-Verbindung mit dem Steuergerät kommuni-zieren wollen, müssen dazu einen Client-Socket implementieren, der mit demfestgelegten TCP/IP-Port (im obigen Beispiel 1234) des Server-Sockets in Ver-bindung tritt. Die folgenden Beispiele in verschiedenen Programmiersprachenveranschaulichen die prinzipielle Vorgehensweise.

6.1 C/C++ unter UNIX (Linux)

Ein einfaches Konsolprogramm stellt eine Ethernet-Verbindung mit dem Steuer-gerät her, schickt die Tastatureingaben ans Steuergerät und gibt die Antwortenan der Konsole aus:

#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>

const unsigned short PORT = 1234;const char HOSTNAME[] = "ipc1.physik.uni-osnabrueck.de";

int main(){

int S;const int BUFSIZE = 1024;char inbuf[BUFSIZE], outbuf[BUFSIZE];int n;struct sockaddr_in ad;struct hostent *he;

ad.sin_family = PF_INET;ad.sin_port = htons(PORT);he = gethostbyname(HOSTNAME);memcpy(&ad.sin_addr, he->h_addr, 4);

S = socket(PF_INET, SOCK_STREAM, 0);connect(S, (struct sockaddr *) &ad, sizeof(ad));

for (;;) {fgets(inbuf, BUFSIZE, stdin);if ((inbuf[0]==’e’)||(inbuf[0]==’E’))

break;send(S, inbuf, strlen(inbuf), 0);n = recv(S, outbuf, BUFSIZE, 0);

Mess- und Steuergerät 21

outbuf[n] = ’\0’;printf(outbuf);

}

return close(S);}

Die Hauptarbeit besteht zunächst im Erstellen der sockaddr_in-Struktur ad,die die wesentlichen Verbindungsinformationen (IP-Adresse und Port des Ser-vers) enthält. Es wird dann ein Client-Socket etabliert und durch connectmit dem Server verbunden. Die Funktionen send und recv erledigen dieKommunikation, mit close wird die Verbindung am Ende des Programms ab-gebrochen.

Der Übersichtlichkeit halber wurden Fehlerabfragen im Beispielprogramm weg-gelassen, sie sollten auf jeden Fall nach dem Aufruf der Funktionen gethost-byname (gibt im Fehlerfall einen Nullpointer zurück) und connect (gibt beiErfolg 0 zurück) eingebaut werden.

6.2 C/C++ unter Windows

Unter Windows (Microsoft Visual C++ oder MinGW) vereinfachen sich mancheTeile, andere werden komplexer. So wird die Liste der Include-Dateien deutlichkürzer:

#include <stdio.h>#include <windows.h>

Die Socket-Funktionalität des Betriebssystems, die unter Linux ohne weiteresverfügbar ist, muss unter Windows am Anfang des Programms explizit angefor-dert werden:

WORD wVersionRequested = MAKEWORD( 1, 0 );WSADATA wsaData;WSAStartup( wVersionRequested, &wsaData );

Zwei der benötigten Funktionen, connect und close, sehen etwas andersaus als unter Linux:

connect(S, (sockaddr *) &ad, sizeof(ad));

return closesocket(S);

Im Fehlerfall kann die Fehlernummer mit der Funktion WSAGetLastError fest-gestellt werden (eine Liste der zugehörigen symbolischen Fehlerkonstanten fin-det man in der Datei winsock.h).

6.3 Microsoft Foundation Classes (MFC)

Ein Kommunikationsprogramm mit graphischer Oberfläche lässt sich in Visu-al C++ mit Objekten aus den Microsoft Foundation Classes (MFC) erstellen.Die Dialog-Oberfläche wird graphisch zusammengestellt, etwa so, wie in Abbil-dung 7 dargestellt.

22 Elektronik–Praktikum Physik

Für die Implementierung von TCP-Sockets stellen die MFC die Klasse CSocketbereit. Mit Hilfe des Class Wizards werden an die Tasten der Dialogoberflächegeeignete Funktionen gebunden, die ein CSocket-Objekt implementieren undverwenden.

OnConnect stellt beim Drücken der Connect-Taste die Verbindung her:

const unsigned short PORT = 1232;

CSocket * wsSend = NULL;

void CSxDlg::OnConnect(){CString Peer;UINT Port;

UpdateData();try {

if (wsSend)throw ("Already connected, I kill it");

wsSend = new CSocket();if (!wsSend->Create())throw ("Create: Error");

if (!wsSend->Connect(m_Host, PORT))throw ("Connect: No connection");

if (!wsSend->GetPeerName(Peer, Port))throw ("GetPeerName: Error");

}catch (char * err) {

AfxMessageBox (err);OnClose();return;}

m_Host.Format(Peer + " : %d", Port);UpdateData(false);

}

Die Verbindung wird zu dem Server hergestellt, der im Feld Server eingetragenwurde (die damit verbundene Variable ist m_Host), das verwendete Port istim Programm fest eingetragen. Nach dem Verbindungsaufbau werden die mitGetPeerName abgefragten Server-Informationendort abgelegt.

OnSend verschickt den im Feld Message (damit verbundene Variable m_Send)eingegebenen Text, erwartet die Antwort und gibt sie im Feld Answer (damitverbundene Variable m_Recv) aus:

Abbildung 7: Mit Visual C++ erstellteDialogoberfläche eines einfachen Kom-munikationsprogramms.

Mess- und Steuergerät 23

void CSxDlg::OnSend(){UpdateData();try {

if (!wsSend)throw ("No Socket");

if (wsSend->Send(m_Send, m_Send.GetLength())==SOCKET_ERROR)throw ("Send: Error");

Sleep(100);int n = wsSend->Receive(m_Recv.GetBuffer(1000),1000);m_Recv.ReleaseBuffer(n);}

catch (char * err) { AfxMessageBox (err); }UpdateData(false);

}

OnClose schließt die Verbindung:

void CSxDlg::OnClose(){delete wsSend;wsSend = NULL;

}

In allen Funktionen ist eine einigermaßen vollständige Fehlerbehandlung mittry, throw und catch implementiert.

6.4 Visual Basic

Noch einfacher geht’s in Visual Basic, auch hier wird ein Dialog-Fenster gra-phisch erstellt (Abbildung 8. Eingefügt wird dort – im Graphik-Fenster nichtsichtbar – ein Objekt vom Typ Winsock (hier mit dem Namen Socket), in dessenEigenschaftsmenü Servername und Portnummer fest eingetragen werden.

Abbildung 8: Einfachere Version, erstelltmit Visual Basic.

Das eigentliche Programm besteht dann nur noch aus ein paar Zeilen, die er-gänzt werden müssen:

Private Sub SendButton_Click()Socket.SendData (TextIn.Text)TextIn.Text = ""TextOut.Text = "Wait"

End Sub

Private Sub Form_Load()Socket.Connect

End Sub

Private Sub Form_Unload(Cancel As Integer)Socket.Close

End Sub

24 Elektronik–Praktikum Physik

Private Sub Socket_DataArrival(ByVal bytesTotal As Long)Dim Data As StringSocket.GetData (Data)TextOut.Text = Data

End Sub

6.5 Java und MATLAB

Die neueren Versionen von MATLAB (ab Release 11) können auf die Java Virtu-al Machine des Betriebssystems zugreifen, damit hat man die Möglichkeit, eineTCP/IP-Verbindung in einem MATLAB-Skript (oder auch interaktiv im CommandWindow) durch Java-Anweisungen zu realisieren.

Ein kurzes Messprogramm, das über den D/A-Ausgang 3 eine Folge von Strom-werten vorgibt und mit dem A/D-Wandler 1 Spannungswerte misst, könnte etwaso aussehen:

function [v, c] = sockxmplimport java.net.*so = java.net.Socket(’ipc1’, 1234);pause(1);n = 1;for curr=-2000:20:2000,

c(n) = curr;s = sprintf(’da3 %d’, curr);SocketIO(so, s);sData = SocketIO(so, ’ad1’);v(n) = str2double(sData);n = n + 1;

end;pause(1);so.close;

Mit java.net.Socket wird die TCP/IP-Verbindung zum Steuergerät etabliert,am Ende mit close wieder geschlossen.

Zur Kommunikation wird die Funktion SocketIO definiert, die den zu senden-den MATLAB-String in einen Java-String wandelt und diesen über das Output-Stream-Objekt des Sockets verschickt. Auf das InputStream–Objekt wirdein BufferedReader gesetzt, dessen Funktion readLine die Antwort desSteuergeräts liest.

function recvStr = SocketIO(socket, sendStr)str = java.lang.String(sendStr);out = socket.getOutputStream;out.write(str.getBytes);in = socket.getInputStream;isr = java.io.InputStreamReader(in);ibr = java.io.BufferedReader(isr);recvStr = ibr.readLine;

Mess- und Steuergerät 25

6.6 Beispielmessungen

Mit dem vorstehenden MATLAB-Skript wurden die Beispielmessungen der Ab-bildungen 9 und 10 durchgeführt.

Kennlinien von Zenerdioden Kennlinienmessungen an zwei unterschiedli-chen Zenerdioden sind in Abbildung 9 dargestellt. Im linken Teilbild der typischeVerlauf für Dioden mit Zenerspannungen größer als 6 V: Abrupter Lawinendurch-bruch bei größerer Sperrspannung (hier -9 V), der durch niedrig dotierte breitep-n-Übergänge erreicht wird. Rechts der Verlauf bei Dioden mit kleinen Zener-spannungen: Exponentiell einsetzender Tunneleffekt bei kleinen Sperrspannun-gen (hier -3 V) durch hoch dotierte abrupte p-n-Übergänge.

−10 −8 −6 −4 −2 0 2−20

−15

−10

−5

0

5

10

15

20

Voltage [V]

Cur

rent

[mA

]

−10 −8 −6 −4 −2 0 2−20

−15

−10

−5

0

5

10

15

20

Voltage [V]

Cur

rent

[mA

]

Abbildung 9: Kennlinien von zwei verschiedenen Zenerdioden, links ZD 9V1,rechts ZD 3V9.

Genauigkeit von DAC und ADC Zur Abschätzung der relativen Genauig-keiten der D/A- und A/D-Wandler wurde die Kennlinie eines Ohmschen Wider-stands gemessen. Es ergibt sich ein sehr guter linearer Verlauf (Abbildung 10links), etwaige Linearitätsfehler lassen sich aus der Auftragung der Abweichun-gen zwischen Messwert und idealem Verlauf (rechtes Teilbild) beurteilen.

Literatur und Links

[1] http://www.physik.uni-osnabrueck.de/kbetzler/el.

[2] http://www.beck-ipc.de.

[3] http://www.bcl-online.de/mdocumentation/docu.asphttp://www.bcl-online.de/download/api/APIDOC0101B.PDF.

[4] http://www.ipswitch.com/products/index.html.

[5] http://www.vector.co.jp/authors/VA002416/teraterm.html.

26 Elektronik–Praktikum Physik

−10 −5 0 5 10−20

−15

−10

−5

0

5

10

15

20

Voltage [V]

Cur

rent

[mA

]

−2000 −1000 0 1000 2000−2

−1.5

−1

−0.5

0

0.5

1

1.5

2

Current [D/A−Value]

Dev

iatio

n [B

it]

Abbildung 10: Lineare Kennlinie eines Ohmschen Widerstands, rechts die Ab-weichungen der digitalen Messwerte von einer idealen Geraden.

Anhang A: Technische Beschreibung des Herstellers

Das Steuergerät besteht aus einem 19” Grundgerät mit zwei separat schaltba-ren Stromversorgungen, wobei die Ausgangsspannungen und der Netzschalterder 2. Stromversorgung an der Frontplatte zugänglich sind. Ein eingebauterSC12 Microprozessor ermöglicht die Kommunikation der Modulsteckplätze übereine serielle Schnittstelle an der Frontplatte oder direkt über eine TCP/IP-Netz-verbindung (Western-Steckverbindung an der Rückwand). Alle Steckmodule ar-beiten an einem gemeinsamen 64-poligen Steuer- und Versorgungsbus. UmTimingproblemen auf den Busleitungen bei der Ansteuerung von Modulen ausdem Weg zu gehen, wurde dem SC12 Prozessor ein verändertes Buskonzeptaufgesetzt:

1. Der Steuergerätedatenbus D0. . . D7 ist bidirektional, wird aber über ge-trennte CS (ChipSelect) Leitungen des SC12 gesteuert. Das Lesen desSteuergerätedatenbusses erfolgt unter der SC12-Adresse CS5#4 (readonly), das Schreiben des Steuergerätedatenbusses erfolgt unter der SC12Adresse CS6# (write only). So kann sichergestellt werden, dass die jewei-ligen Datenbustreiber eingestellt sind, wenn ein Datenzugriff lesend oderschreibend auf ein Modul erfolgt. Eine spezielle Umsteuerung des Bussesper Software ist nicht erforderlich. Ein Rücklesen der letzten geschriebe-nen Daten ist nicht möglich.

2. Der Steuergeräteadressbus A0–A7 ist statisch und wird nicht gemultiplext.Eine Steuergerätadresse erhält man durch Schreiben eines Datenbytesunter der SC12-Adresse CS0# (read/write). Die unteren 4 Bit adressierenprimär die Steckmodule, die oberen 4 Bit werden für spezielle Adressie-

4 ‘#’ kennzeichnet Signale, die Low Active sind. Fast immer sind die Steuerleitungen an einemPeripheriebus so ausgelegt (negative Logik), um sie – energiesparend – mit Open-Collector -Ausgängen betreiben zu können (der Active-Zustand liegt immer nur kurzzeitig an). Bei denAdress- und Datenleitungen ist dagegen kein Zustand besonders ausgezeichnet, somit positiveund negative Logik äquivalent (beim SC12 in positiver Logik).

Mess- und Steuergerät 27

rung von Komponenten wie ADCs, DACs, Multiplexern oder seriellen Ein-heiten zusätzlich benötigt. Die adressierten Module (0. . . 15) können durchLesen unter der SC12 Adresse CS0# identifiziert werden. Die unteren 4 Bitdes gelesenen Datenbytes identifizieren den Modultyp (Kennung).

3. Der Steuergerätemanagementbus mit den sekundären DatenleitungenSD0. . . SD3 zum Identifizieren der Module und zum schnellen Lesen vonvier seriellen Einheiten sowie mit den Bussteuerleitungen RD#, WR#, BEN#und BDIR.

Bislang sind Kennungen und Adressbereiche für folgende Modultypen festge-legt:

1. Relais-Einschub: Kennung 0x0B, Primäradressbereich 3. . . 6,

2. Digital I/O - Einschub: Kennung 0x0D, Primäradressbereich 1. . . 4,

3. ADC-Einschub: Kennung 0x0C, Primäradressbereich 8. . . 15,

4. DAC-Einschub: Kennung 0x0E, Primäradressbereich 8. . . 15,

5. AD/DA Einschub: verhält sich wie je ein Modul Typ 3 und Typ 4.

Damit ergibt sich folgende Vorgehensweise für die Programmierung:

a.) Modultypen identifizieren durch Adressieren und Lesen mit CS0#.

b.) Prozeduren zur Adressierung, zum Datenbytelesen (CS5#) und Datenby-teschreiben (CS6#) erstellen.

c.) Modulbehandlung.

Für die einzelnen Modultypen:

Modultyp 1: Adressieren, (die oberen 4 Adressbits sind beliebig (z. B. alle 0), dannDatenbyte (invertiert) schreiben, als Abschluss deadressieren (nächsteAdresse oder Adresse 0)

Modultyp 2: Adressieren, (die oberen 4 Adressbits sind beliebig (z. B. alle 0), dannDatenbyte schreiben bzw. Datenbyte lesen, als Abschluss deadressieren(nächste Adresse oder 0)

Modultyp 3: Adressieren, oberes Halbbyte der Adresse besteht aus:A4 = HBE (0 = low Byte,1=high Byte des ADC Registers),A5 = 0/1 ( wird nicht verwendet und ist beliebig),A6 = ADR0 (LO-Bit der ADC-Kanaladresse),A7 = ADR1 (HI-Bit ADC-Kanaladresse).Die Wandlung wird gestartet, indem ein beliebiges Datenbyte geschriebenwird. Das Ergebnis muss abgewartet werden (mit geeigneter Zeitschleife,der Interrupt des ADCs wird nicht ausgewertet), bevor weiterhin adressiert,das Low-Byte (8 Bit) und das High-Byte (4 Bit) gelesen werden können.Für die anderen Kanäle gilt analog: adressieren, schreiben, warten, dannlesen, zum Abschluss deadressieren. Die gelesenen Werte repräsentie-ren den Bereich von Hex000 = -10 V, Hex800 = 0 V bis HexFFF = +9.995 V.Der ADC kann kalibriert werden , indem die Primäradresse 15 angewählt

28 Elektronik–Praktikum Physik

wird. Nach deadressieren ist ca. 100 ms zu warten. Dann kann der ADCwieder normal verwendet werden.

Modultyp 4: Adressieren, oberes Halbbyte der Adresse enthält die 8 Eingangsregister-adressen A4, A5, A6 wobei die geraden Adressen jeweils die 8 LSBsenthalten und die ungeraden Adressen die 4 MSBs des 12-Bit-Wertes.Die Eingangsregister werden nacheinander oder einzeln geschrieben, wo-bei A7=LE#=1 bleibt, beim letzten Schreibzugriff jedoch vorher auf A7=0gesetzt werden muss. Zum Abschluss der Prozedur sollte das Modulwieder deadressiert werden (Adresse 0). Die DACs arbeiten im Bipo-larbetrieb, d. h. Hex000 = +10.000 V, HexFFF = -9.995 V, Hex800 = 0 V.Die ersten 4 Eingangsregisteradressen entsprechen bei dem eingebautenModul den Spannungsausgängen, die letzten 4 Eingangsregisteradres-sen entsprechen den Stromausgängen �20 mA, wobei Hex000 = -20 mAHex800 = 0 mA und HexFFF = +19.99 mA entspricht. Bei Hex800 ist even-tuell eine leichte Offsetkorrektur per Software erforderlich.

Technische Daten

Überrahmen:

Netzteil interne Versorgung : 5V 1.5A, +15V 0.2A, -15V 0.2A

Netzteil externe Versorgung : 5V 5A , +15V 1A, +12V 1A, -12V 0.5A , schaltbar an der Front-platte

Ethernet-Anschluss : LAN-Anschluss RJ45 10BaseT auf der Gehäuserückwand,

Serielle Schnittstellen : RS232-Schnittstelle zur lokalen Programmierung des Steuergerätesauf der Frontplatte,RS232-Schnittstelle zum Ansteuern externer Geräte auf der Gehäuserück-wand,

Netzanschluss : 230 V ca. 100 W.

Sicherungen : 2x 2 AT im Geräteanschlussstecker auf der Gehäuserückwand.

Ausstattung:

Modultyp 1 : Relaiseinschub: 8x Umschaltkontakte potenzialfrei, einzeln programmier-bar. Belastbarkeit: 1 A, 30 W. Optische Anzeige des Schaltzustands mit16 LEDs.

Modultyp 2 : Digitalausgang: 8x TTL Ausgang, Standard 10 TTL-Lasten (13mA), max. 5V.Digitaleingang: 8x TTL Eingang mit pullup Widerstand, Eingang offen = lo-gisch 1, Eingangsspannung 0. . . +5 V. Überlastsicher von -5 V bis +10 V.

Modultyp 5 : 4-fach Analog/Digital-Wandler, Auflösung 12 Bit, Spannungsbereich -10.000 Vbis +9.995 V, überlastsicher bis �15 Vdc oder 10 Vac eff. Genauigkeit�1 Bit. Antialiasing Filter 1 kHz.4-fach Digital/Analog-Wandler, Auflösung 12 Bit, 2x Spannungsausgänge+10.000 V bis -9.995 V, Genauigkeit �1 Bit, Tiefpassfilter 1 kHz, 2x Strom-ausgänge -20.00 mA bis +19.99 mA, Genauigkeit �3 Bit.

Mess- und Steuergerät 29

Pinbelegung der Steckverbindungen:

Pin Signal1 Tx+2 Tx–3 Rx+4 n. c.5 n. c.6 n. c.7 n. c.8 Rx–

Tabelle 2: Pinbelegung des 10BaseT-Ethernet-Anschlusses (RJ45-Buchse).

Pin Signal1 DCD2 RxD3 TxD4 DTR5 Gnd6 DSR7 RTS8 CTS9 n. c.

Tabelle 3: Pinbelegung der RS232-Anschlüsse(9-polige Sub-D-Stecker). Alle Handshake-Leitungen (DCD, DTR, DSR, RTS, CTS) sindauf logisch TRUE (+10 V) gesetzt. TxD undRxD können durch interne Steckbrücken ver-tauscht werden.

30 Elektronik–Praktikum Physik

a c+5V Logic � 1 � +5V Logic

Data Bus D7 � 2 � Data Bus D6Data Bus D5 � 3 � Data Bus D4Data Bus D3 � 4 � Data Bus D2Data Bus D1 � 5 � Data Bus D0

0V Logic Ground � 6 � 0V Logic GroundAddress Bus A6 � 7 � Address Bus A5Address Bus A4 � 8 � Address Bus A3Address Bus A2 � 9 � Address Bus A1Address Bus A0 �10 � n. c.

n. c. �11 � n. c.n. c. �12 � n. c.n. c. �13 � n. c.n. c. �14 � n. c.

Address Bus A7 �15 � Management Bus RD#Management Bus SD3 �16 � Management Bus WR#Management Bus SD2 �17 � Management Bus BEN#Management Bus SD1 �18 � Management Bus BDIRManagement Bus SD0 �19 � n. c.

+5V Power �20 � +5V Power+5V Power �21 � +5V Power

0V Power Ground �22 � 0V Power Ground0V Power Ground �23 � 0V Power Ground

n. c. �24 � n. c.n. c. �25 � n. c.

+15V Analog �26 � +15V Analog+15V Analog �27 � +15V Analog–15V Analog �28 � –15V Analog–15V Analog �29 � –15V Analog

0V Analog Ground �30 � 0V Analog Ground0V Analog Ground �31 � 0V Analog Ground0V Analog Ground �32 � 0V Analog Ground

Tabelle 4: Pinbelegung am 64-poligen Peripheriebus.

Mess- und Steuergerät 31

Anhang B: Schaltpläne

Anhang Schaltpläne und Messprotokolle

Universität Osnabrück, FB Physik, Elektronikwerkstatt, Postfach 4469, D-49069 Osnabrück

GerätGeräteteil

AuftragsdatenAuftraggeber

Inv. / Kostenst.

Blatt 1

vonTechniker M.Dr

Konstr.Archiv S 93 - 505

0420

K. Betzler20000911

SC12 Prozessor

Rev. 3

Ra

15.05.01Datum

: Steuergerät f. E-Prakt.

Universität Osnabrück, FB Physik, Elektronikwerkstatt, Postfach 4469, D-49069 Osnabrück

GerätGeräteteil

Auftragsdaten

AuftraggeberInv. / Kostenst.

Blatt 2

vonTechniker M. Dr

Konstr.

Archiv S93 - 5050420

K. Betzler20000911

Digital In/Out

Rev. 3

Ra

15.05.01Datum

: Steuergerät f. E-Prakt.

32 Elektronik–Praktikum Physik

Universität Osnabrück, FB Physik, Elektronikwerkstatt, Postfach 4469, D-49069 Osnabrück

GerätGeräteteil

AuftragsdatenAuftraggeberInv. / Kostenst.

Blatt 3

vonTechniker M. Dr

Konstr.Archiv S93 -555

0420

K. Betzler20000911

Relaisausgang

Rev. 3

Ra

15.05.01Datum

: Steuergerät f. E-Prakt.

Universität Osnabrück, FB Physik, Elektronikwerkstatt, Postfach 4469, D-49069 Osnabrück

GerätGeräteteil

AuftragsdatenAuftraggeber

Inv. / Kostenst.

Blatt 5

vonTechniker M. Dr

Konstr.Archiv S93 -505

0420

K. Betzler20000911

Frontansicht

Rev. 2

Ra

12.12.00Datum

: Steuergerät f. E-Prakt.

Mess- und Steuergerät 33

Uni

vers

itätO

snab

rück

,FB

Phys

ik,E

lekt

roni

kwer

ksta

tt,P

ostf

ach

4469

,D-4

9069

Osn

abrü

ck

GerätGeräteteilAuftragsdaten

AuftraggeberInv. / Kostenst.

Blatt 4von

Techniker M. DrKonstr.

Archiv S 93 -5050420

K. Betzler20000911

AD/DA Wandler Einschub

Rev. 3

Ra

15.05.01Datum

: Steuergerät f. E-Prakt.