Die serielle Schnittstelle Die RS232 Schnittstelle ( Elektronikversuche mit dem Computer ) Programm Seite Literatur, Geräte 2 Die RS232 Schnittstelle (Theorie) 3 Ausgang schalten Ausgang_Eingang 4 Das Programm : Ausgang_Eingang 5 Halbleiter, Diode, Transistor (Theorie) 6 Blitzlicht Ausgang_Eingang Die Register der RS232 (Theorie) 7 8 Assembler-Programmierung Ausgang-mit-ASM 9 Ampelschaltung Ampel 10 Wechsel-Blinklicht LED-Blinklicht 11 Zeitschaltung Zeituhr 12 Die Eingänge der RS232 13 Berührungssensor Ausgang_Eingang 14 Lichtschranke 1, Zeitmessung Lichtschranke 15 Lichtschranke 2, Rolltreppe Ausgang_Eingang 16 Ladezeit für einen Kondensator Kondensator 17 Reaktionszeit Reaktionszeit 18 Logik NOT; UND/ NAND; OR/ NOR; EXOR Logik 19 Gatter: NOT; UND/NAND; OR/NOR; EXOR Ausgang_Eingang 20,21 -2- Lit: www/AK-modul-bus.de /ELEXS /Experimente www/B-Kainka.de www/hjberndt.de Die Firma AK-modul-bus vertreibt Elektronikbauteile, Elektronikbücher und die hier verwendeten Einbaubuchsen. Auf der Internetseite sind viele Versuche mit der RS232 Schnittstelle veröffentlicht, ebenso die Programme in VB und der Treiber für die RS232 Schnittstelle. B. Kainka schrieb das Buch: Messen, Steuern, Regeln unter Windows; Franzis Verlag. Es enthält eine CD mit Versuchen, die Programme in VB und den Treiber RSLine32.DLL. H.-J. Berndt stellt auf seiner Homepage viele freeware Programme und den Treiber RS232 zur Verfügung. Benötigte Geräte für die hier beschriebenen Versuche: Platine mit Streifenraster, 5.08 mm Rastermaß 20 Stück vergoldete Einbaubuchsen, 2 mm Sub-D Verlängerung 1:1, 9-pol Sub-D Buchse, 9-pol Das Bauteil: Die Buchsen in die Löcher stecken und mit den Leiterbahnen verlöten. Danach werden die Leiterbahnen zwischen den beiden Buchsenreihen unterbrochen. -3- Die RS232 Schnittstelle Die Ausgänge der seriellen Schnittstelle DTR RTS TXD data terminal ready request to send transmit data Endgerät bereit Sendeteil einschalten Sendedaten Die Eingänge der seriellen Schnittstelle CTS DCD DSR RI RXD (sollte man nicht clear to send data carrier detect data set ready ring indicator receive data Sendebereitschaft Empfangssignalpegel Betriebsbereitschaft ankommender Ruf Empfangsdaten ground Masse verwenden) GND Jede Ausgangsleitung liefert eine Leerlaufspannung von +11,49 V und einen maximalen Strom von 10 mA...20 mA. Eine interne Strombegrenzung verhindert eine Überlastung auch im Kurzschlußfall. Die meisten PCs verwenden zwei COM-Schnittstellen COM1 und COM2. Oft ist COM1 mit der Maus belegt. Die Programme suchen die freie COM2 für die Versuche. -4- Ausgang schalten RTS GND Programm Ausgang-Eingang verwenden Man verbindet eine beliebige Ausgangsleitung und GND mit einer Leuchtdiode (LED). Durch Button klick schaltet man den Ausgang an oder aus. Die LED leuchtet, wenn der Ausgang positive Spannung hat. Ist die LED umgekehrt angeschlossen, leuchtet sie, wenn der Ausgang negative Spannung liefert. Zur Programmierung der seriellen Schnittstelle wird die Funktionsbibliothek RSLine32.DLL eingesetzt. Sie befindet sich im aktuellen Verzeichnis. DLL : dynamic link library Eine DLL ist aufgebaut wie eine Unit: Sie ist unabhängig von der verwendeten Programmiersprache und wird erst bei Bedarf in den Speicher geladen. Greifen mehrere Programme auf eine DLL zu, so ist diese nur 1 mal im Speicher vorhanden. Eine Unit wäre dann öfters, d.h. für jedes Programm vorhanden. -5Das Programm Ausgang_Eingang function OPENCOM (A: Integer): Integer; stdcall; external 'Rsline32.DLL'; procedure RTS (An: Integer); stdcall; external 'Rsline32.DLL'; procedure DTR (An: Integer); stdcall; external 'Rsline32.DLL'; procedure TXD (An: Integer); stdcall; external 'Rsline32.DLL'; function CTS (): integer; stdcall; external 'Rsline32.DLL'; function DCD (): integer; stdcall; external 'Rsline32.DLL'; function DSR (): integer; stdcall; external 'Rsline32.DLL'; function RI (): integer; stdcall; external 'Rsline32.DLL'; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin if OPENCOM (1) = 0 then OPENCOM (2); // die COM-Schnittstelle wählen DTR (0); RTS (0); TXD (0); // alle Ausgänge aus end; procedure TForm1.Button1Click(Sender: TObject); begin DTR (1); panel1.color:= clLime; end; // DTR an procedure TForm1.Button2Click(Sender: TObject); begin DTR (0); panel1.color:= clBtnFace; end; // DTR aus procedure TForm1.Button3Click(Sender: TObject); begin RTS (1); panel2.color:= clLime; end; // RTS an procedure TForm1.Button4Click(Sender: TObject); begin RTS (0); panel2.color:= clBtnFace; end; // RTS aus procedure TForm1.Button5Click(Sender: TObject); begin TXD (1); panel3.color:= clLime; end; // TXD an procedure TForm1.Button6Click(Sender: TObject); begin TXD (0); panel3.color:= clBtnFace; end; // TXD aus procedure TForm1.Timer1Timer(Sender: TObject); begin if CTS = 1 then panel4.color := clLime else panel4.color := clBtnFace; if DCD = 1 then panel5.color := clLime else panel5.color := clBtnFace; if DSR = 1 then panel6.color := clLime else panel6.color := clBtnFace; if RI = 1 then panel7.color := clLime else panel7.color := clBtnFace; if RXD = 1 then panel8.color := clLime else panel8.color := clBtnFace; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin DTR (0); RTS (0); TXD (0); // alle Ausgänge aus end; -6- Halbleiter Diode: Leuchtdiode, Fotodiode Transistor -7- Blitzlicht Ein Kondensator kann elektrische Ladung speichern und kurzzeitig als einen stärkeren Strom abgeben. Über das Programm (Ausgang-Eingang) schaltet man RTS an. Der Kondensator wird aufgeladen. Schaltet man jetzt DTR ein, so entsteht ein kurzer Blitz. Der Transistor wird schlagartig über die LED entladen. DTR muß ausgeschaltet werden, bevor der Kondensator neu geladen wird. Man schaltet RTS ein und wieder aus. Der Kondensator ist jetzt geladen und behält seine Ladung mehrere Minuten lang. npn -Transistor BC 548 + _ C B E + RTS 1k LED + mü F DTR 1k GND Programm Ausgang-Eingang verwenden -8- Die Register der RS232 Schnittstelle Im Gerätemanager von WINDOWS findet man für die Schnittstelle COM1 die Angabe Interrupt : 04 E/A-Bereich : 03F8 ... 03FF // 8 Werte Datenbit :8 Das heißt : 1) die Schnittstelle COM1 hat die Adresse 03F8, 2) die Schnittstelle hat 8 Register mit dem Offset 0 ... 7, 3) jedes Register ist 8 Bit breit. Nach ihrer Funktion werden die Register verschieden benannt. In den Registern haben die einzelnen Bits verschiedene Aufgaben: sie steuern die Leitungen DTR, RTS, usw. Sende-Halte-Register Offset: 0 Bit Nr. 7 6 5 4 3 2 1 0 RTS DTR 1 0 Interrupt-Freigabe-Register Offset: 1 Interrupt-Erkennungs-Register Offset: 2 Leitung-Steuer-Register Offset: 3 TXD Modem-Steuer-Register (Ausgang setzen) Offset: 4 Leitungs-Status-Register Offset: 5 Modem-Status-Register (Eingang lesen) Offset: 6 DCD RI DSR CTS Bit Nr. Offset: 7 7 6 5 4 3 2 -9- Assembler-Programmierung Man verbindet RTS und GND mit einer Leuchtdiode (LED). Mit dem Programm (Ausgang_mit_ASM) schaltet man den Ausgang RTS ein oder aus. Das Programm ist in Assembler geschrieben. RTS GND Programm Ausgang_mit_ASM verwenden procedure TForm1.FormCreate(Sender: TObject); begin if OPENCOM (1) = 0 then openCom (2); DTR (0); RTS (0); TXD (0); // alle Ausgänge aus end; procedure TForm1.Button1Click(Sender: TObject); // RTS ein begin asm push ax // AX-Register vom Prozessor sichern push DX // DX-Register vom Prozessor sichern mov DX, 03F8h +4 // die serielle Schnittstelle und das 4.Register auswählen mov al, 2 // bin 0000.0010 ; RTS ist das 2. bit out DX, al // RTS einschalten pop DX // den Wert wieder herstellen pop ax end end; procedure TForm1.Button2Click(Sender: TObject); // RTS aus begin asm push ax push DX mov DX, 03F8h +4 // die serielle Schnittstelle und das 4.Register mov al, 0 // bin 0000.0000 out DX, al // RTS ausschalten pop DX pop ax end end; - 10 - Ampelschaltung Man baut die Schaltung nach Plan auf. Im Programm (Ampel) steuert ein timer die Ausgänge der Schnittstelle und die Farben der 3 shape-Komponenten. DTR RTS TXD GND Programm Ampel verwenden procedure TForm1.FormCreate(Sender: TObject); var i: byte; begin if OPENCOM (1) = 0 then openCom (2); RTS (0); TXD (0); DTR (0); oft:= 0; end; // alle Ausgänge aus procedure TForm1.Timer1Timer(Sender: TObject); begin case oft of 0: begin shape1.Brush.Color:=clred; shape2.Brush.Color:=clgray; shape3.Brush.Color:=clgray; dtr(1); rts(0); txd(0); inc(oft); end; 1: begin shape1.Brush.Color:=clred; shape2.Brush.Color:=clyellow; shape3.Brush.Color:=clgray; dtr(1); rts(1); txd(0); inc(oft); end; 2: begin shape1.Brush.Color:=clgray; shape2.Brush.Color:=clgray; shape3.Brush.Color:=cllime; dtr(0); rts(0); txd(1); oft:= 0; end; end; // of case end; - 11 - Wechsel-Blinklicht Man verbindet DTR und Masse (GND) mit zwei LEDs, wie in der Skizze angegeben. Die LEDs sind verschieden gepolt eingesetzt, also leuchten sie auch bei unterschiedlicher Stromrichtung. Das Programm (LED-Blinklicht) schaltet DTR abwechselnd ein- und aus. Eine /Win32 /TrackBar regelt den timer und so die Blinkfrequenz. Man kann das Blinken abschalten und neu starten. DTR LED LED GND Programm LED-Blinklicht verwenden Eine TrackBar regelt das Timer-Intervall. procedure TForm1.Timer1Timer(Sender: TObject); begin DTR (schalten); // DTR ein schalten:= not schalten and 1; // NOT schalten AND 1 end; // var schalten: byte = 0 ; // ist global definiert invertiert den Wert - 12 - Zeitschaltung Man baut eine einfache Zeitschaltuhr. Es wird die gewünschte Zeit eingeben und die Uhr gestartet. Mit Ablauf der eingestellten Zeit geht die angeschlossene LED an. DTR LED GND Programm Zeituhr verwenden procedure TForm1.FormCreate(Sender: TObject); begin if OPENCOM (1)= 0 then openCom (2); DTR (0); RTS (0); TXD (0); end; procedure TForm1.Button1Click(Sender: TObject); // start var zeit, zeit1: integer; begin DTR (0); zeit := strToint (edit1.text); // so lange ist die Wartezeit zeit1:= GetTickCount ; // Startzeit repeat; application.processMessages; until (getTickCount -zeit1 > zeit ); DTR (1); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin DTR (0); RTS (0); TXD (0); end; - 13 - Die Eingänge der RS232 Schnittstelle CTS DCD DSR RI RXD clear to send data carrier detect data set ready ring indicator receive data Sendebereitschaft Empfangssignalpegel Betriebsbereitschaft ankommender Ruf Empfangsdaten Alle Eingangsleitungen sind für Anschlußspannungen bis +/-12V ausgelegt und für die direkte Verbindung mit den Ausgängen der RS232-Schnittstelle vorgesehen. Bei vielen Versuchen verbindet man daher eine Ausgangs- mit einer Eingangsleitung und fragt ihren Zustand ab. Eine positive Spannung oberhalb ca. 1,25 V wird als logische Eins erkannt. Eine Spannung unter ca. 1 V erscheint als logische Null . Ein offener Eingang erscheint als Null. Das Programm Ausgang-Eingang schaltet die Ausgangsleitung ein, und fragt den Zustand der Eingangsleitung ab. Ist eine Ausgangsleitung über die Lampe mit einer Eingangsleitung verbunden, so erscheinen beide Symbole grün. RTS LED CTS Programm Ausgang-Eingang verwenden - 14 - Berührungssensor Die Leitung DTR hat Spannung. Über die Finger wird ein sehr schwacher Strom von ca. 50 Mikroampere an die Basis weitergeleitet. Der Transistor schaltet durch, er verstärkt den Strom und schaltet die Eingangsleitung DSR ein. Das Signalplättchen wird grün gefärbt. DTR 10 k Finger 10 k DSR Programm Ausgang-Eingang verwenden - 15 - Lichtschranke 1, Zeit messen Bei geringer Helligkeit ist der Widerstand der Fotodiode groß. Es fließt ein schwacher Strom und die Eingangsleitung wird als (AUS) erkannt. Bei großer Helligkeit ist der Widerstand der Fotodiode klein, es fließt ein starker Strom und die Eingangsleitung wird als (EIN) erkannt. Die Fotodiode dient als Eingabeelement. Der PC unterscheidet zwischen hell und dunkel. DTR TXD LED CTS Fotodiode GND Programm Lichtschranke verwenden Aufgabe 1) Die Schaltung aufbauen und das Verhalten der Fotodiode überprüfen. Sie arbeitet richtig, wenn das kurze Drahtstück am (+) Pol angeschlossen ist. 2) Zwischen Fotodiode und Lampe zieht man ein Blatt Papier vorbei. Das Programm misst die Dunkelzeit. Aus der Zeit und der Blattgröße berechnet man die Geschwindigkeit der Bewegung. procedure TForm1.FormCreate(Sender: TObject); begin if OPENCOM (1) =0 then openCom (2); DTR (0); RTS (0); TXD (0); end; procedure TForm1.Button1Click(Sender: TObject); begin DTR (1); // Ausgangsleitung (DTR an TXD (1); // Ausgangsleitung (TXD) an zeit:= 0; // eine globale Variable end; // Strom an procedure TForm1.Button2Click(Sender: TObject); begin DTR (0); RTS (0); TXD (0); end; // Strom aus procedure TForm1.Timer1Timer (Sender: TObject); // timer-intervall = 1 ms begin if CTS = 0 then begin // messen, wenn die Lichtschranke dunkel ist inc (zeit); panel1.caption := intTostr (zeit)+ ' ms'; end else zeit:= 0; end; - 16 - Lichtschranke 2, Rolltreppe + DTR 100 k BC 548 LED (Motor) Fotodiode GND Lampe Programm Ausgang-Eingang verwenden Unterbricht man den Lichtweg zwischen Lampe und Fotodiode, so leuchtet die LED auf, bzw. der Motor läuft an. Diese Schaltung ist an Rolltreppen oder automatischen Türöffnern zu finden. Beachte: Die Fotodiode wird mit dem kurzen Draht an den (+) Pol angeschlossen, die LED mit dem kurzen Draht an den (-) Pol. - 17 - Ladezeit für einen Kondensator Man lädt ein Kondensator (47 µF) über einen Widerstand (1 k) auf. Die Ladezeit hängt von der Kapazität des Kondensators und von der Größe des Widerstand ab. Die Ladezeit wird vom Programm gemessen und auf der grünen Schaltfläche angezeigt. Nach dem Ladevorgang wird die Ausgangsleitung (DTR) auf NULL gesetzt und der Kondensator über die Diode entladen. Man wiederholt den Versuch mit einem Kondensator von (500 µF ). + 11 V DTR LED 1k DSR 47 mü F TXD _ 11 V Programm Kondensator verwenden procedure TForm1.FormCreate(Sender: TObject); begin if OPENCOM (1)= 0 then openCom (2); DTR (0); RTS (0); TXD (0); end; procedure TForm1.Button1Click(Sender: TObject); // messen var zeit1, zeit2: integer; begin DTR (1); // Ausgang ein, Kondensator wird geladen zeit1:= getTickCount; While DSR =0 do begin zeit2:= getTickCount; end; panel1.caption := intTostr (zeit2- zeit1)+ ' ms'; DTR (0); // der Kondensator wird entladen end; procedure TForm1.Button2Click(Sender: TObject); begin panel1.caption:= ' '; end; - 18 - Reaktionszeit Messen der Reaktionszeit mit dem PC. Das Programm schaltet nach zufälliger Wartezeit die LED ein. Man muß dann so schnell wie möglich den angeschlossenen Tastschalter drücken. Die Reaktionszeit wird gemessen. Typische Werte liegen bei 200 Millisekunden (200 ms = 0,2 s). RTS GND DTR DSR Programm Reaktionszeit verwenden procedure TForm1.FormCreate(Sender: TObject); begin if openCom (1) = 0 then openCom (2); DTR (0); RTS (0); TD (0); end; procedure TForm1.Button1Click(Sender: TObject); // Start var zeit1, zeit2, zufallZeit, warten: integer; begin panel1.caption:= ' '; randomize; ZufallZeit := (random (5)+1) * 1000; // werte von 1 bis 5 sek zeit1:= getTickCount; repeat zeit2:= getTickCount; until zeit2- zeit1 >= zufallZeit; RTS (1); // RTS ein, LED leuchtet DTR (1); // DTR ein, Leitung zum Taster if DSR () = 0 then begin zeit1:= getTickCount; repeat zeit2:= getTickCount; until DSR () = 1; warten := zeit2- zeit1; end; panel1.caption := intTostr (warten) + ' ms'; RTS (0); DTR (0); // Leitung aus end; - 19 - Aussagen-Logik Programm Logik verwenden A 0 1 0 1 Eingang B 0 0 1 1 NOT (A) 1 0 1 0 (Not) A AND B 0 0 0 1 logische Verknüpfung NAND A OR B 1 0 1 1 1 1 0 1 (Reihenschaltung) NOR 1 0 0 0 EXOR 0 1 1 0 (Parallelschaltung) Aufgabe 1) Man gibt in die Edit-Fenster Zahlenwerte ein und wählt eine logischen Verknüpfung. 2) Bei <Start> wird das Ergebnis ausgegeben. Methoden logische (bitweise) Verknüpfung procedure TForm1.Button1Click(Sender: TObject); var a, b, c: byte; begin A:= strToint (edit1.text); B:= strToint (edit2.text); case radioGroup1.Itemindex of 0: C:= not A AND 1; // NOT // NOT invertiert alle bits, es entsteht ein negativer Wert // + 1 dazu addiert ergibt das logische NOT 1: C:= A AND B; // AND 2: C:= not (A AND B) AND 1; // NAND 3: C:= A or B; // OR 4: C:= not (A or B) AND 1; // NOR 5: C:= A xor B; // EXOR end; panel1.caption:= radioGroup1.items[radioGroup1.itemIndex]; edit3.text:= intTostr (C); end; end. - 20 - Gatter + A 1 Y DTR R1 NOT BC548 (NPN) RTS (A) R1= 10 k U=11,5 V n p n R1 R1 LED LED R1 NOT (A) Masse Programm Ausgang-Eingang verwenden. Aufgabe 1) DTR ist an und bildet die Stromversorgung für den Transistor. 2) Die Leitung RTS ein und ausschalten. 3) Der Ausgang Y zeigt entgegengesetzte Spannung wie DTR. + DTR R1 A & AND / NAND B BC548 (NPN) LED AND NAND RTS (A) R1= 10 k U= 11,5 V R1 AND n p n LED R1 TXD (B) R1 n p n R1 LED LED R1 Masse Programm Ausgang-Eingang verwenden. NAND - 21 - + DTR A OR / NOR > =1 B BC548 (NPN) R1= 10 k U= 11,5 V R1 OR OR LED NOR RTS (A) R1 n p n LED R1 TXD (B) R1 n p n R1 LED LED R1 Masse Programm Ausgang-Eingang verwenden. NOR