Die asynchrone Datenübertragung der seriellen Schnittstelle | |
| Eine Kurzzusammenstellung von W.Hennig 04.07.1997. Es wird keine Gewähr für die Richtigkeit übernommen. |
INHALT:
-------
1. RS 232 C Schnittstelle beim PC
2. Datenübertragung mit Handshake
3. Kopplung zweier Datenendgeräte mit Handshake
4. Kopplung zweier Datenendgeräte mit vereinfachten Handshake
5. Kopplung zweier Datenendgeräte ohne Handshake
6. Asynchrone, serielle Datenübertragung
7. Int 14h - BIOS Routinen für die serielle Schnittstelle
7.1 Funktion 0 - initialisiere SCC
7.2 Funktion 1 - sende Zeichen
7.3 Funktion 2 - lese Zeichen
7.4 Funktion 3 - get Status
8. Direkte Programmierung des SCC
9. Senden
10. Empfang
11. Interrupt-Gate
12. Baud-Rate
13. Handshake
14. Timing
15. Die Register des SCC
15.1 Baudraten-Teiler Low Byte
15.2 Baudraten-Teiler High Byte
15.3 Transmit-Holding
15.4 Received Data
15.5 Interrupt Enable
15.6 Interrupt Pending
15.7 Line Control
15.8 Modem Control
15.9 Line Status
15.10 Modem Status
15.11 Scratch
15.12 FIFO Control
16. 8250 SCC
17. Signale von der/zur CPU
18. weitere Ein-/Ausgänge
19. Signale vom Schnittstellentreiber zum SCC
20. Signale vom SCC zum Schnittstellentreiber
21. Logische Pegel nach dem Einschalten des PC
22. Weitere Hinweise
1. RS 232 C Schnittstelle beim PC
Im PC wird eine serielle Schnittstelle nach der RS 232 C Norm verwendet. Diese Schnittstelle wurde ursprünglich für den Datenaustausch zwischen einem Datenendgerät (DTE = Data Terminal Equipment) und einem Datenübertragungsgerät (DCE = Data Communication Equipment) definiert.
Untenstehende Übersicht zeigt die Beschaltung einer RS 232 C Schnittstelle. Die RS 232 C Schnittstelle kann für synchrone oder asynchrone Übertragungen verwendet werden. Definiert ist auch ein Rückkanal.
+--------+ +-----+ +-----+
| 2|------ TxD ----->| | | |
| 15|<----- TxC ------| | | |
| 24|------ TxC ----->| | | |
| 4|------ RTS ----->| | | |
| 5|<----- CTS ------| | | |
| | | | | |
| 3|<----- RxD ------| |-------------------------------->| |
| DTE 17|<----- RxC ------| DCE | Line (Telefonleitung) | DCE |
| 8|<----- DCD ------| |<--------------------------------| |
| 22|<------ RI ------| | | |
| | | | | |
| 20|------ DTR ----->| | | |
| |------ BUSY ---->| | | |
| 6|<----- DSR ------| | | |
| 7|------ GND ------| | | |
| 1|---- CHASSIS ----| | | |
| 9|---- + 12V +-----+ +-----+
| 10|---- - 12V (Modem) (remote
+--------+ Modem)
+--------+ +-----+ +-----+
| 14|----- 2.TxD ---->| | Rückkanal | |
| 19|----- 2.RTS ---->| | | |
| 13|<---- 2.CTS -----| |********************************>| |
| DTE | | DCE | Line (Telefonleitung) | DCE |
| 16|<---- 2.RxD -----| |<********************************| |
| 12|<---- 2.DCD -----| | | |
+--------+ +-----+ +-----+
(Computer)
Bei den im PC üblicherweise eingesetzten Schnittstellenkarten entfallen die oben mit Sternen gezeichneten Signale. Die PC-Schnittstelle kann somit nur asynchron übertragen.
Die Signale auf der Schnittstelle haben keine TTL-Pegel. Es werden spezielle RS 232 Treiber und Empfänger verwendet. Eine logische 1 entspricht einer Spannung von -3V bis -24V. Eine logische 0 wird repräsentiert durch eine Spannung von +3V bis +24V. Im PC wird +/- 12V verwendet.
Mit RS 232 kompatiblen Treibern können bei 19200 Baud ca. 15 m überbrückt werden. Für größere Entfernungen kann die Baud-Rate verringert werden. Für weite Entfernungen werden Modems verwendet. Modems wandeln die logischen Pegel in Frequenzen um, die dann über eine Telefonleitung übertragen werden.
Leitungen für den Sendetakt TxC und den Empfangstakt RxC werden nur für eine synchrone Übertragung benötigt. Es gibt durchaus Modems mit synchroner RS 232 C Schnittstelle. Zur Ansteuerung solcher Modems gibt es auch spezielle PC-Einsteckkarten. Bei einer synchronen Übertragung wird der Schiebetakt immer vom sendenden Teilnehmer erzeugt und synchron mit den Daten gesendet. Da im Modem ohnehin ein Baud-Rate Generator integriert ist, übernimmt das Modem oft auch die Erzeugung von TxC.
Bei den üblichen COMx-Ports im PC wird nur eine RS 232 C Schnittstelle mit asynchronem Übertragungsprotokoll und ohne Rückkanal verwendet. Üblich sind 25 polige oder 9 polige SUB-D 9 Stecker (jeweils Stifte am PC).
Anmerkung: Früher waren am PC-XT durchweg 25polige SUB-D Stecker (Stifte) und am PC-AT 9polige SUB-D Buchsen üblich.
+------------+ +----------+
| 2|------> TxD | 3|------> TxD
| 4|------> RTS | 7|------> RTS
| 5|<------ CTS | 8|<------ CTS
| | | |
| SUB-D 3|<------ RxD | SUB-D 2|<------ RxD
| 25 8|<------ DCD | 9 1|<------ DCD
| Stecker 22|<------ RI | Stecker 9|<------ RI
| | | |
| 20|------> DTR | 4|------> DTR
| 6|<------ DSR | 6|<------ DSR
| 7|------- GND | 5|------- GND
| 1|------- CHASSIS +----------+
| 9|------- +12V PC-AT
| 10|------- -12V
+------------+
PC-XT
Den einzelnen Signalen wird bei der GND Masseleitung
Kopplung mit einem Datenübertragungs- CHASSIS Abschirmung
gerät folgende Bedeutung zugeordnet: +12V Testspannungen
-12V (oft nicht vorhanden)
TxD Sende-Daten vom PC zu Modem
RxD Empfangs-Daten von Modem zu PC
DTR PC signalisiert dem Modem, daß er betriebsbereit ist
DSR Modem signalisiert dem PC, daß es betriebsbereit ist
RTS PC zeigt dem Modem an, daß er senden möchte
CTS Modem signalisiert dem PC, daß er senden darf
DCD Modem signalisiert dem PC mit, daß Daten empfangen werden
RI Klingelzeichen von Gegenstation
2. Datenübertragung mit Handshake
Die serielle Schnittstelle wird zunehmend zur Kopplung zwischen PC und Peripheriegeräten oder einem anderen PC verwendet. Meist wird auf einen Handshake verzichtet, oft wird ein vereinfachter oder abgewandelter Handshake verwendet.
Problemstellung: Der Handshake soll sicherstellen, daß ein Teilnehmer erst sendet, wenn der andere Teilnehmer bereit ist zum Empfang.
Ideal: Die Hardware des Empfängers gibt ein Signal aus "bereit zum Empfang"
Dieses wird weggenommen, sobald ein Zeichen eingelesen wurde, und
erst wieder freigegeben, wenn das Zeichen vom PC aus dem RxD-Buffer
abgeholt wurde. Dieses Signal geht auf CTS der anderen Seite. CTS
unterbindet auf hardwareebene das Senden.
--> ein solches Signal gibt es jedoch bei den im PC verwendeten
Controllern nicht. CTS wirkt nicht direkt auf die Hardware.
Real: Die Steuersignale müssen vom PC per Software gesetzt werden. Wurde ein
Zeichen empfangen muß das Zeichen ausgelesen werden, bevor das nächste
Zeichen kommt. Um "bereit zum Empfang" nach dem Empfang eines Zei-
chens wegzuschalten muß erst der Empfangs-Interrupt betreten werden.
Das Senden des nächsten Zeichens darf nicht schneller erfolgen als
beim PC der Empfangs-Interrupt längstens gesperrt ist. Bei einem PC
ohne seriellen Controller mit FIFO ist deßhalb übe 38 kBaud Schluß.
Dennoch gibt es verschiedene Anwendungen, in denen die Steuersignale der seriellen Schnittstelle verwendet werden. Zum einem zur Kopplung mit einem Modem. Hier besitzen die Steuersignale die in der Norm beschriebenen Eigenschaften.
3. Kopplung zweier Datenendgeräte mit Handshake
+--------+ +--------+ DTR und DSR besitzen hier eine andere
| TxD|----------->|RxD | Funktion als in der Norm festgelegt.
| RxD|<-----------|TxD |
| | | | RTS fungiert als Anforderung zum Sen-
| RTS|----------->|DCD | den. Der andere Teilnehmer empfängt
| CTS|<---+-------|DTR | dies an seinem DCD Eingang als Meldung,
| DSR|<---+ | | daß Daten empfangen werden sollen.
| | | |
| DCD|<-----------|RTS | Wenn er zum Empfang bereit ist, setzt
| DTR|-------+--->|CTS | er sein DTR. Der erste Teilnehmer er-
| | +--->|DSR | hält dadurch die Sendeerlaubnis an CTS
+--------+ +--------+ und DSR.
DTR, DSR und DCD haben hier nicht die in der Norm festgelegte Funktion.
!!!
Die BIOS-Routinen des Int 14h unterstützen die Übertragung zu einem Modem. Zum Senden wird RTS gesetzt und CTS überprüft. Die BIOS-Funktionen können bei dieser Beschaltung verwendet werden.
4. Kopplung zweier Datenendgeräte mit vereinfachtem Handshake
Unter Abwandlung der Signaldefinitionen der RS 232 C Norm kann eine Datenübertragung zwischen zwei Endgeräten mit vereinfachtem Handshake erfolgen.
+--------+ +--------+ +--------+ +--------+
| TxD|----------->|RxD | | TxD|----------->|RxD |
| RxD|<-----------|TxD | | RxD|<-----------|TxD |
| | | | | | | |
| DTR|----------->|DSR | | DTR|--+ +->|DSR |
| DSR|<-----------|DTR | | DSR|<-+ +--|DTR |
| | | | | | | |
| RTS|----------->|CTS | | RTS|----------->|CTS |
| CTS|<-----------|RTS | | CTS|<-----------|RTS |
+--------+ +--------+ +--------+ +--------+
DSR = Betriebsbereitschaft DSR kurzgeschlossen
vom anderen Gerät
!!!
Die BIOS-Routinen des Int 14h unterstützen nicht die Übertragung mit vereinfachten Handshake. Zur Übertragung mit vereinfachten Handshake ist eine eigene Routine zu verwenden
!!!
RTS erhält hier abweichend von der Norm die Bedeutung von "Empfänger bereit, Gegenstation darf senden".
Mit einer eigenen Definition ergibt sich folgende interessante Lösung:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Vereinbart wird, daß ein Teilnehmer nur senden darf, wenn sein Eingang
CTS den gleichen Pegel hat wie sein Ausgang DTR.
Hat ein Teilnehmer ein Zeichen in TxD geschrieben, toggelt er seinen
Ausgang DTR. Der andere Teilnehmer empfängt das DTR auf seinen DCD. Und
wenn er bereit zum Empfang eines Zeichens ist, setzt er seinen Ausgang
RTS auf denselben Pegel wie DCD.
Mit diesem Handshake ist ein überschreiben des Empfangsbuffers nicht
möglich. Allerdings wird die Übertragung langsammer, da erst das nächste
Zeichen gesendet werden kann, wenn das erste auf der anderen Seite ange-
kommen ist.
5. Kopplung zweier Datenendgeräte ohne Handshake
Wird ganz auf einen Handshake verzichtet, so werden minimal nur drei Leitungen benötigt (TxD, RxD und GND). Es empfiehlt sich auch hier DTR mit DSR kurzzuschließen.
+--------+ +--------+
| TxD|----------->|RxD |
| RxD|<-----------|TxD |
| | | |
| DTR|--+ +--|DTR |
| DSR|<-+ +->|DSR |
| DCD|<-+ +->|DCD |
| | | | | |
| CTS|<-+ +->|CTS |
| RTS| |RTS |
+--------+ +--------+
CTS und DCD werden ebenfalls aktiv geschaltet, indem sie mit DTR verbunden werden. Dies hat seinen Grund darin, daß die BIOS-Routine des Int 14 bevor sie ein Zeichen sendet, überprüft, ob DSR und CTS gesetzt sind, das heißt sie wartet auf die Sendeerlaubnis vom Modem. Durch den Kuzschluß von RTS mit CTS wird dies vorgetäuscht.
Da ohne Handshake gesendet wird, muß der Anwender durch ein geeignetes Software-Handshake Protokoll den Erhalt der Daten sicherstellen.
6. Asynchrone, serielle Datenübertragung
Die einzelnen Zeichen werden seriell, das heißt bitweise übertragen. Die Übertragung erfolgt assynchron. Das heißt, der vom Sender verwendete Schiebetakt wird nicht synchron mitübertragen. Im Empfänger muß der Takt aus den Daten zurückgewonnen werden. Dies geschieht mit einem Digital Phase Loocked Loop (DPLL), das mit den Flanken aus RxD synchronisiert wird.
Es wird zeichenweise übertragen. Zwischen den Zeichen wird kein Synchronisiersignal gesendet. Bei jedem Zeichen muß das DPLL im Empfänger deshalb neu synchronisiert werden. Dies wird durch Start- und Stopbits sichergestellt.
In Ruhe (kein Zeichen wird gesendet) ist TxD high (entspricht TxD = -12V an der Schnittstelle). Wird ein Zeichen übertragen, so wird zunächst als Startbit eine 0 ausgegeben (der Empfänger erkennt nun eine Flanke und synchronisiert seinen Empfänger-Schiebetakt darauf). Darauf folgen die Datenbits (5 bis 8 Bits, je nach Mode). Den Datenbits kann noch ein Paritätsbit folgen (außer bei none Parity). Am Schluß werden 1, 1,5 oder 2 Stopbits gesendet. Danach kann sofort das nächste Zeichen folgen. Die Stopbits sind nötig, damit TxD vor dem nächsten Startbit eine minimale Zeit high ist, um das Startbit erkennen zu können.
---|---+ +---------+ +----+ +----+ +---------|-----
| | | | | | | | |
TxD | | | | | | | | |
| | | | | | | | |
+----+ +---------+ +----+ +----+ |
| | d0 | d1 | d2 | d3 | d4 | d5 | d6 | p | | |
| | | | |
Start 7 Datenbits Parity 2 Stop
Beispiel für Übertragung des Zeichens 'S' mit 7 Datenbits, even Parity und 2 StopBits (an der Schnittstelle liegen bei einer logischen 1 in TxD -12V).
Das Low-Bit des Zeichens wird zuerst übertragen. Werden nur Zeichen des Standart-ASCI Codes übertragen, so genügt es, mit 7 Datenbits zu senden. Beim erweiterten ASCI Code sind 8 Datenbits nötig. 5 und 6 Datenbits werden beim PC kaum verwendet.
7. Int 14h - BIOS Routinen für die serielle Schnittstelle
Vom BIOS werden bis zu vier Schnittstellen unterstützt. Während der Initialisierung sucht das BIOS der Reihe nach bei den für serielle Schnittstellen reservierten Port-Adressen nach dem Vorhandensein einer Schnittstelle. Der ersten gefundenen seriellen Schnittstelle wird der Device-Name COM1 zugeteilt, das heißt sie wird in die Tabelle des BIOS für die Port-Adressen der seriellen Schnittstelle (40:000) an erster Stelle eingetragen. Das BIOS eines IBM-XT sucht zumeist nur nach zwei seriellen Schnittstellen. Beim XT sind ja auch nur noch zwei Interrupt-Request Eingänge frei. Aber auch im BIOS eines XT ist Platz für vier Einträge.
Folgende Adressen sind üblich:
COM1: 3F8h...3FFh IRQ4
COM2: 2F8h...2FFh IRQ3
COM3: 3E8h...3EFh IRQ10 (nur AT)
COM4: 2E8h...2EFh IRQ11 (nur AT)
Die BIOS-Funktionen des INT 14h arbeiten ohne Hardware-Interrupt vom SCC. Der SCC besitzt allerdings nur ein Empfangsregister, beim Empfang eines Datenbytes muß dieses deßhalb sofort ausgelesen werden, ansonsten wird es vom nächsten Zeichen überschrieben (Fehler: overrun). Ein Anwenderprogramm muß also genügend oft (abhängig von der Baudrate) den INT 14h aufrufen.
Das BIOS stellt mit dem INT 14h vier Funktionen zur Zugriff auf den SCC bereit. Ist dabei eine Schnittstelle nicht vorhanden, oder eine falsche Funktionsnummer angegeben, so wird kein spezieller Fehlercode zurückgegeben. Der Wert in AX bleibt dann unverändert.
Beim Senden und Empfang eines Zeichens, versucht dies die BIOS-Routine nur eine bestimmte Zeit, danach kehrt die Funktion mit einem Timeout-Fehler zum aufrufenden Programm zurück. Die Timeoutzeit ist vom BIOS festgelegt. Dazu halten neuere BIOS-Versionen im RAM eine Tabelle mit den TimeOut-Werten für jede serielle Schnittstelle: (bei 40:007Ch...40:007Fh je COM-Port ein Byte). Die TimeOut-Zeit ergibt sich damit zu:
TimeOut-Wert * 10000h * 50 Clocks.
Die TimeOut-Zeit ist vom Prozessor-Takt abhängig (beim orginal XT mit 4.31818 MHz beträgt die TimeOut-Zeit ca.: timeOut-Wert * 0.76 sec). Die minimale TimeOut-Zeit ergibt sich bei einem TimeOut-Wert von 1 (ein Wert von 0 entspricht 256).
7.1 Funktion 0 - initialisiere SCC
Aufruf:
AH = 0
DX = SchnittstellenNr: [0 für COM1, 1 für COM2, ...]
Bit 7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
AL = | b | b | b | p | p | s | d | d |
+---+---+---+---+---+---+---+---+
| | | | | | 0 0 ----> 5 Bits pro Zeichen
| | | | | | 0 1 ----> 6 Bits pro Zeichen
| | | | | | 1 0 ----> 7 Bits pro Zeichen
| | | | | | 1 1 ----> 8 Bits pro Zeichen
| | | | | 0 -------> 1 Stopbit
| | | | | 1 -------> 1« Stopbits bei 5 Bit/Zeichen
| | | | | 2 Stopbits bei 6,7 oder 8 Bit/Zeichen
| | | x 0 -----> none Parity
| | | 0 1 -----> odd Parity (ungerade)
| | | 1 1 -----> even Parity (gerade)
0 0 0 -------> 110 Baud
0 0 1 -------> 150 Baud
0 1 0 -------> 300 Baud
0 1 1 -------> 600 Baud
1 0 0 -------> 1200 Baud
1 0 1 -------> 2400 Baud
1 1 0 -------> 4800 Baud
1 1 1 -------> 9600 Baud
Rückgabe:
AX = Statusbyte (siehe Funktion 3)
Das BIOS unterstützt nur Baud-Raten bis 9600 Baud. Dies liegt daran, daß ältere XT's bei höheren Übertragungsraten Schwierigkeiten hatten, über den MSDOS Interrupt 21h (Funktion 03) noch schnell genug empfangene Zeichen auszulesen.
7.2 Funktion 1 - sende Zeichen
Die Funktion setzt zuerst DTR und RTS, danach prüft sie DSR und CTS ab. Nur wenn beide gesetzt sind, wird das Zeichen gesendet (erfüllt den Handshake für ein Modem nach der Norm).
Aufruf:
AH = 1
AL = ASCI Code des zu sendenden Zeichens
DX = SchnittstellenNr: [0 für COM1, 1 für COM2, ...]
Rückgabe:
AL = ASCI Code des Zeichens
Bit 7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
AH = | t | 0 | 0 | x | x | x | x | x |
+---+---+---+---+---+---+---+---+
0 ---> Zeichen wurde gesendet
1 ---> Time-Out Fehler, Zeichen nicht gesendet da entweder CTS
oder DSR nicht gesetzt (Handshake) oder Transmit-Holding
Register noch voll war
7.3 Funktion 2 - lese Zeichen
Die Funktion setzt zuerst DTR und prüft dann, ob DSR gesetzt ist. Nur dann wird versucht ein Zeichen zu empfangen.
Aufruf:
AH = 2
DX = SchnittstellenNr: [0 für COM1, 1 für COM2, ...]
Rückgabe:
AL = ASCI Code des empfangenen Zeichens (wenn vorhanden - siehe AH)
Bit 7 6 5 4 3 2 1 0
+---+---+---+----+----+----+----+----+
AH = | T | 0 | 0 | BE | FE | PE | OE | DR |
+---+---+---+----+----+----+----+----+
0 0 0 ? ? ? ? 1 ---> empfangenes Zeichen in AL
1 0 0 x x x x x ---> timeOut - kein Zeichen
oder DSR nicht gesetzt
Ist ein Zeichen empfangen worden ("T"=0 so geben die anderen Bits Auskunft über das empfangene Zeichen: "BE" (breakError), "FR" (frameError), "PE" (parityError), "OE" (overrunError). Ein Zeichen ist nur gültig, wenn keines dieser Fehlerbits gesetzt ist. Ist das Overrun-Bit gesetzt, so ist dieses Zeichen zwar gültig, jedoch wurde das Zeichen davor überschrieben.
7.4 Funktion 3 - get Status
Aufruf:
AH = 3
DX = SchnittstellenNr: [0 für COM1, 1 für COM2, ...]
Rückgabe:
Bit 7 6 5 4 3 2 1 0
+---+-----+-----+----+----+----+----+----+
AH = | 0 | THE | TSE | BE | FE | PE | OE | DR | Line Status
+---+-----+-----+----+----+----+----+----+
| | | | | | +--- 1,dann Zeichen empfangen
| | | | | +---- 1, dann Overrun-Error
| | | | +---- 1, dann Parity-Error
| | | +---- 1, dann Frame-Error
| | +---- 1, dann Break-Error
| +---- 1, dann Transmit-Shifting Register leer
+----- 1, dann Transmit-Holding Register leer
Bit 7 6 5 4 3 2 1 0
+-----+----+-----+-----+------+------+------+------+
AH = | DCD | RI | DSR | CTS | dDCD | teRI | dDSR | dCTS | Modem Status
+-----+----+-----+-----+------+------+------+------+
Das Modem Status Register gibt den Zustand der Handshake-Leitungen wieder. DCD, RI, DSR und CTS zeigen an, ob die jeweilige Leitung aktiv ist. dDCD, dDSR und dCTS zeigen an, ob sich der logische Zustand der jeweiligen Leitung seit dem letzten Auslesen des Modem Status geändert hat. teRI zeigt an, ob seit dem letzten Auslesen des Modem-Status eine positive Flanke am Pin /RI auftrat (d.h. Klingelzeichen war da, und ist gerade zu Ende).
Achtung: die Funktionen "sende Zeichen" und "lese Zeichen" lesen auch den Modul Status, so daß bei einem folgenden Lesen des Status dDCD,teRI,dDSR und dCTS = 0 sind.
8. Direkte Programmierung des SCC
Der INT 14h unterstützt mit seinen Funktionen nicht alle Möglichkeiten der seriellen Schnittstelle. Dies läßt sich nur durch eine direkte Register-Programmierung des SCC (seriell Communication Controller) erreichen.
Der SCC im PC ist ein UART (Universal Asynchron Receive Transmit) des Typs NS 8250 von NSC (National Semiconductor Corporation). Ein IBM-AT verwendet meist einen NS 16450. Dieser Typ ist abwärtskompatibel zum NS 8250. Neuerdings kommt der Typ NS 16550 zum Einsatz. Er ist wiederum abwärtskompatibel, besitzt aber Receive- und Transmit-FIFO-Register für je 16 Byte.
Das folgenden Bild zeigt eine Übersicht der wichtigsten Anschlüsse und Register des 8250. Anschlüsse wie Takteingänge sind nicht eingezeichnet. Alle Anschlüsse führen TTL-Pegel.
8250 SCC
+---+------------------+-------------------------+
/sccCS ----->|<->|(3F9) Teiler High | |
A0 ----->| +------------------´ ---> Baud Rate Clock |
A1 ----->|<->|(3F8) Teiler Low | |
A2 ----->| +------------------+----+ +----------------+
/IOWR ----->|-->|(3F8) Transmit Holding |-->| Transmit Shift |-----> TxD
/IORD ----->| +-----------------------´ +----------------+
|<--|(3F8) Received Data |<--| Receive Shift |<----- RxD
| +-----------------------´ +----------------+
D0 <---->|<->|(3F9) Interrupt Enable | |
D1 <---->| +-----------------------++ |
D2 <---->|<--|(3FA) Interrupt Pending | |
D3 <---->| +-------------------+----+ |
D4 <---->|<->|(3FB) Line Control | +-----|-----> /OUT2
D5 <---->| +-------------------++ +-----|-----> /OUT1
D6 <---->|<->|(3FC) Modem Control |-----------------+-----|-----> /DTR
D7 <---->| +------------------+-+ +-----|-----> /RTS
|<--|(3FD) Line Status | |
| +------------------++ +--|<----- /CTS
|<--|(3FE) Modem Status |<--------------------+--|<----- /DSR
IntRQ <-----| +-------------------+---+ +--|<----- /RI
|<->|(3FF) Scratch Register | +--|<----- /DCD
+---+-----------------------+--------------------+
Die Signale links werden von der CPU zur Kommunikation mit dem SCC verwendet, und die Signale rechts werden auf die serielle Schnittstelle geschaltet. Dies erfolgt über spezielle RS 232 C - Treiber. Eine logische 1 wird dabei durch eine Spannung von -15V..-3V repräsentiert, und eine logische 0 durch +3V..+12V. Die Signale an der Schnittstelle sind so invertiert gegen den Ausgängen des SCC. Im Ruhezustand sind alle Ausgäng zur Schnittstelle inaktiv, das heißt high.
9. Senden
Schreibt die CPU ein Zeichen in das Transmit-Holding Register, so übernimmt der SCC das Zeichen in das Transmit-Shift Register (sobald dieses leer ist) und beginnt mit der Übertragung an TxD. Das Transmit-Holding Register kann nun schon wieder von der CPU mit dem nächsten Zeichen geladen werden, während der SCC noch mit Senden beschäftigt ist.
10. Empfang
Empfängt der SCC an RxD Daten, so überträgt er diese zunächst in das Receive-Shift Register. Wenn dieses voll ist, wird das Zeichen in das Received-Data Register übertragen. Der Übertrag in das Received-Data Register erfolgt immer ohne Rücksicht darauf, ob sich darin noch das vorhergehende (eventuell noch nicht von der CPU gelesene) Zeichen befindet.
11. Interrupt-Gate
Im PC sind /OUT1 und /OUT2 nicht mit dem Schnittstellenstecker verbunden. /OUT2 wird jedoch als Gate für IntRQ verwendet.
+-------+ Ohne gesetztem /OUT2 (nach Reset) liegt
IntRQ ---| | der IRQ-Eingang des Interrupt-Ctrl. auf
| OR |--- IRQ +5V (=aktiv). Da die Maske in Int-Ctrl.
/OUT2 ---| | nicht gesetzt ist, passiert nichts.
+-------+ Wird vergessen /OUT2 zu setzen, so kommt
nach dem Setzen der Maske ein Interrupt.
Da der Int-Ctrl. flankengetriggert ist,
geschieht dann aber gar nichts mehr.
12. Baud-Rate
Der SCC verfügt über einen eigenen Baudraten Generator, der den Schiebetakt für die serielle Übertragung erzeugt. Der Schiebetakt wird erzeugt über einen Teiler (Zähler mit Vorladewert von 1 bis 65536) und einen 16 stelligen Zähler für Transmit und ein 16 stelliges DPLL für Receive:
+---------------+ Zur Rückgewinnung des Em-
|programierbarer| pfangs-Schiebetaktes wird
SCC-CLK --->| Teiler | ein Digital Phase Locked
1,8432 MHz | 1 ... 65536 | Loop benötigt. Dabei wird
+------+--------+ ein 16 stelliger Zähler
| mit den empfangenen Flan-
| +------+ ken synchronisiert.
+--->| ö 16 |---> TxCLK
| +------+ Die maximale Baudrate ist
| damit 1,8432 MHz ö 1 ö 16
| +------+ = 115 200 Baud.
+--->| ö 16 |---> RxCLK
Flanke in RxD ------->| DPLL |
+------+
13. Handshake
/RTS, /CTS, /DTR, /DSR /CTS und /RI werden im PC als Handshakeleitungen verwendet. Die Handshake-Leitungen haben keinen Einfluß auf TxD und RxD. Sie beeinflussen lediglich das Modem-Status Register und können einen Interrupt auslösen. Ein Handshake muß durch eine geeignete Anwender-Software erfüllt werden, wobei die Software den Zustand der Leitungen überprüft.
14. Timing
Bei 115 000 Baud muß das Receive-Register mindestens alle 87 µs ausgelesen werden. Langsammere Rechner hatten schon über 9600 Baud Schwierigkeiten dies unter Verwendung des MSDOS Systemaufrufs INT 21h Funktion 03 sicherzustellen (das ist auch der Grund, warum nur Baud-Raten bis 9600 Baud von DOS unterstützt werden). Der Betrieb mit hohen Baudraten läßt sich nur unter Verwendung des BIOS INT 14h oder über direkte Registerprogrammierung bewerkstelligen.
Im PC-XT wird der NS 8250 und im PC-AT meist der schnellere Typ NS 16450 oder NS 16550 verwendet. Beim 8250 darf nur alle 755 ns ein Zugriff erfolgen, der schnellere Typ 16450 erlaubt 360 ns. Bei 8086 kompatiblen CPU's dauert ein OUT-Befehl 11 CLOCKs. Die Dauer eines CLOCK hängt vom CPU-Takt ab: 200 ns bei 5 MHz und 25 ns bei 40 MHz. Probleme kann es nur bei Befehlsfolgen wie die untenstehende und schnellen CPU's geben:
CLOCKs/Zeit 5 MHz 8088 40 MHz 80386 150 MHz 80586
IN AL, DX 12/2400 ns 13/325 ns 14/ 93 ns
NOP - - 3/ 20 ns
AND AL, 1 13/2600 ns 6/150 ns 2/ 13 ns
OUT DX, AL 14/2800 ns 10/250 ns 16/106 ns
Beim 8088 dürfte es selbst mit dem 8250 keine Schwierigkeiten geben. Auf den schnelleren 386 wird ohnehin der schnellere 16450 verwendet. Lediglich bei sehr schnellen 486 muß geprüft werden, ob NOP's einzusetzen sind.
15. Die Register des SCC
Die IO-Adressen werden bis auf die Adressen A0...A2 decodiert und den Chip Select Eingang des SCC zugeführt. Der SCC wird somit aktiv für folgende IO-Adressen:
3F8h...3FFh bei der ersten seriellen Schnittstelle
2F8h...2FFh bei der zweiten seriellen Schnittstelle
3E8h...3EFh bei der dritten seriellen Schnittstelle
2E8h...2EFh bei der vierten seriellen Schnittstelle
Die einzelnen Register des SCC lassen sich über A0...A2 auswählen. Als Beispiel wird im folgenden immer die Adresse für die erste serielle Schnittstelle angegeben.
15.1 Baudraten-Teiler Low Byte 3F8h (Offset 0) / DLAB=1 READ/WRITE
15.2 Baudraten-Teiler High Byte 3F9h (Offset 1) / DLAB=1 READ/WRITE
Um auf das Teiler-Register zuzugreifen muß zuvor im "Line-Control" Register das Bit 7 (DLAB = Divisor Latch Access Bit) auf 1 gesetzt werden. Das Teiler-Register kann mit neuen Werten beschrieben oder zurückgelesen werden. Beispiel für Teiler-Werte:
1 --> 115200 Baud
2 --> 57600 Baud 3 --> 38400 Baud 6 --> 19200 Baud
12 --> 9600 Baud 24 --> 4800 Baud 48 --> 2400 Baud
96 --> 1200 Baud 192 --> 600 Baud 384 --> 300 Baud
768 --> 150 Baud 1047 --> 110 Baud 1536 --> 75 Baud
15.3 Transmit-Holding 3F8h (Offset 0) / DLAB=0 WRITE
Dieses Register kann nur beschrieben werden (Lesezugriff betrifft Received-Data Register). Das Bit 7 im "Line-Control" Register (DLAB) muß zuvor auf 0 gesetzt werden. Der Anwender sollte dieses Bit immer defaultmäßig auf 0 halten, und nur zum Zugriff auf das "Teiler" Register auf 1 setzen, anschließend aber wieder zurücksetzen.
Ein neues Zeichen sollte erst dann in das Transmitter-Holding Register geschrieben werden, wenn das Bit 5 (THE = Transmit Holding Empty) im "Line-Status" Register auf 1 ist. Beim Schreiben in Transmit-Holding wird THE gelöscht. THE wird vom SCC wieder gesetzt, wenn das Zeichen aus dem Transmit-Holding ins Transmit-Shift Register übertragen wurde.
15.4 Received Data 3F8h (Offset 0) / DLAB=0 READ
Dieses Register kann nur gelesen werden (Schreibzugriff betrifft Transmit-Holding Register). Das Bit 7 im "Line-Control" Register (DLAB) muß zuvor auf 0 gesetzt werden. Der Anwender sollte dieses Bit immer defaultmäßig auf 0 halten, und nur zum Zugriff auf das "Teiler" Register auf 1 setzen, anschließend aber wieder zurücksetzen.
Received-Data muß ausgelesen werden, bevor das nächste Zeichen empfangen wird. Es ist dann mit einem empfangenen Zeichen geladen, wenn das Bit 0 (DR = Data Received) in "Line-Status" Register auf 1 ist. Ob das gelesenen Zeichen fehlerhaft ist, kann über die anderen Bits im "Line-Status" Register überprüft werden. DR wird beim Lesen von Received-Data gelöscht.
15.5 Interrupt Enable 3F9h (Offset 1) / DLAB=0 READ/WRITE
Der SCC generiert einen Interrupt an die CPU, wenn eines der folgenden Bits im Interrupt Enable Register gesetzt ist:
Bit 7 6 5 4 3 2 1 0
+---+---+---+---+-----+------+------+-----+
| x | x | x | x | Mod | RErr | THEi | DRi |
+---+---+---+---+-----+------+------+-----+
| | | +---- Data Received
| | +----- Transmitter-Holding Empty
| +----- Receiver Error
+---- Modul-Status Changed
Ein "Data Received" Interrupt wird erzeugt, wenn im "Line-Status" Register DR = 1 ist.
Ein "Transmitter-Holding Empty" Interrupt wird erzeugt, wenn THE im "Line-Status" Register von 0 auf 1 wechselt. Er wird auch generiert, wenn THEi enabled wird und zu diesem Zeitpunkt THE = 1 ist.
Ein "Receiver Error" Interrupt wird erzeugt, wenn eines von "BE", "FE", "PE" und "OE" im "Line-Status" Register von 0 auf 1 wechselt.
Ein "Modul-Status Changed" Interrupt wird erzeugt, wenn eines von "dDCD", "dDSR", "dCTS" und "teRI" im "Modem-Status" Register gesetzt ist.
Der Anwender hat neben diesem "Interrupt Enable" Register natürlich noch das entsprechende Bit in der Interrupt Maske des Interrupt-Controllers zu löschen, und seine Interrupt-Service Routine in die Interrupt Tabelle einzutragen. Außerdem ist unbedingt /OUT2 = IntGate im "Modem Control" Register zu setzen.
15.6 Interrupt Pending 3FAh (Offset 2) READ
Das Interrupt-Pending Register zeigt nur den höchsten pending Interrupt an, auch wenn noch andere Interrupts anstehen. Ein Interrupt muß dazu im "IntEn" Register freigegeben sein. IntPend kann nur gelesen werden.
Bit 7 6 5 4 3 2 1 0
+-----+-----+---+---+-----+-----+-----+-----+
| FEn | FEn | x | x | FTO | iP2 | iP1 | iP0 |
+-----+-----+---+---+-----+-----+-----+-----+
x x 1 ---> kein Interrupt pending
1 1 0 ---> RErr pending
1 0 0 ---> DRi pending
0 1 0 ---> THEi pending
0 0 0 ---> Mod pending
Die Flags FEn und FTO sind nur beim 16550 belegt (beim 16450 und 8250 stehen hier Nullen). Sie haben folgende Bedeutung:
FEn beide 1 --> FIFO ist enabled, FEn beide 0 --> FIFO nicht aktiv
FTO FIFO Time-Out Interrupt
Die Interrupt-Quellen beim SCC besitzen eine Priorität in folgender Reihenfolge:
RErr Receiver Error
DRi Data received
THEi Transmitter-Holding Empty
Mod Modul-Status Changed
Ein pending Interrupt wird zurückgesetzt, wenn die CPU
* das "Line-Status" Register bei einem RErr Interrupt,
* das "Received-Data" Register bei einem DRi Interrupt oder
* das "Modul-Status" Register bei einem Mod Interrupt ausließt.
* bei einem THEi Interrupt wird der Interrupt schon dadurch zurück-
gesetzt, daß das "Interrupt Pending" Register ausgelesen wurde, oder
wenn das "Transmitter-Holding" Register beschrieben wurde.
Anmerkung 1:
Ist THE und es ist nichts zu senden, braucht nicht der TxD Interrupt disabled zu werden. Nach dem Auslesen des Interrupt Pending Registers liegt kein Interrupt mehr an. Es kann sogar zu Problemen führen, wenn andauernd der TxD Interrupt enabled und disabled wird.
Anmerkung 2:
Da der Interrupt-Controller des PC flankengetriggert arbeitet, sollte die Interrupt Service Routine erst wieder verlassen werden, wenn kein Interrupt mehr pending ist. Dann ist der Interrupt-Request Ausgang des SCC erst wieder low. Bei Nichtbeachten bleibt der IntRQ Ausgang high und die CPU erhält keinen Interrupt mehr vomn SCC.
Anmerkung 3:
Wird ein Zeichen empfangen und es liegt ein Receiver-Fehler vor, kommt nach dem RecvErr Interrupt immer auch noch ein Receiv Interrupt. Also bei einem RecvErr Interrupt ist bei einem gesetzten Bit "Zeichen empfangen" mmer auch gleich das Receive Register auszulesen.
Anmerkung 4:
Es gibt Contoller, die folgenden Fehler aufweisen: Wurden der niederprioreste Interrupt abgearbeitet (lag an) und danach wird noch einmal die Schleife angesprungen, die das Interrupt Pending Register ließt, so werden später auftretende IRQ sporadisch nicht mehr pending.
15.7 Line Control 3FBh (Offset 3) READ/WRITE
Mit dem "Line-Control" Register wird die Betriebsart festgelegt. Daneben enthält es noch Steuerbits (DLAB, Brk).
Bit 7 6 5 4 3 2 1 0
+------+-----+----+----+----+---+----+----+
| DLAB | Brk | P2 | P1 | P0 | S | D1 | D0 |
+------+-----+----+----+----+---+----+----+
| | | | | | 0 0 ----> 5 Bits pro Zeichen
| | | | | | 0 1 ----> 6 Bits pro Zeichen
| | | | | | 1 0 ----> 7 Bits pro Zeichen
| | | | | | 1 1 ----> 8 Bits pro Zeichen
| | | | | 0 -----> 1 Stopbit
| | | | | 1 -----> 1,5 Stopbits bei 5 Bit/Zeichen
| | | | | 2 Stopbits bei 6,7,8 Bit/Zeich.
| | x x 0 -----> none Parity
| | 0 0 1 -----> odd Parity (ungerade)
| | 0 1 1 -----> even Parity (gerade)
| | 1 0 1 -----> stick Parity --> Paritätsbit = 1
| | 1 1 1 -----> stick Parity --> Paritätsbit = 0
| +---- Break: wenn 1, dann wird TxD = 0 gesetzt, die Über-
| tragung wird unterbrochen.
+----- Divisor Latch Accsess Bit: wenn 1, dann Zugriff über 3F8h
und 3F9h nicht auf Transmitter-Holding, Received-Data und
Interrupt-Enable Register sondern auf Teiler Register
Bei none Parität enthält der Frame kein Paritätsbit. Beim Empfänger erfolgt keine Paritäts-Prüfung.
Bei stick Parity wird als Paritätsbit eine 0 bzw. eine 1 eingesetzt. Im Empfänger wird die Richtigkeit dieses Bits überprüft.
Bei odd Parity wird das Paritätsbit so gesetzt, daß die Summe über die Datenbits und das Paritätsbit ungerade ist.
Bei even Parity wird das Paritätsbit so gesetzt, daß die Summe über die Datenbits und das Paritätsbit gerade ist.
Stimmen die Baudrate (siehe Teiler Register), Parity, und Bits/Zeichen im Sender und Empfänger nicht überein, so gibt es Fehler beim Empfang: siehe "Line Status" Register.
DLAB (Divisor Latch Access Bit) sollte immer auf 0 gehalten werden, wenn auf das Receive Register, das Transmit-Holding Register und das Interrupt-Enable Register zugegriffen werden soll. Nur für den Zugriff auf das Divisor Latch (Teiler) ist DLAB=1 zu setzen, dann wieder zurück.
15.8 Modem Control 3FCh (Offset 4) READ/WRITE
Hiermit können bestimmte Ausgangsleitungen gesetzt werden:
Bit 7 6 5 4 3 2 1 0
+---+---+---+------+------+------+-----+-----+
| x | x | x | LOOP | OUT2 | OUT1 | RTS | DTR |
+---+---+---+------+------+------+-----+-----+
| | | +- DTR-Leitung der Schnittstelle
| | +---- RTS-Leitung der Schnittstelle
| +-------- !!! Interrupt Gate im PC !!!
+----- wenn 1, dann Loop Mode
DTR und RTS sind ohne Auswirkung auf TxD und RxD. Hiermit können lediglich durch die CPU die entsprechenden Bits auf der Schnittstelle gesetzt werden.
Der Ausgang OUT1 ist im PC ohne Hardwarefunktion (not connected).
Der Ausgang OUT2 ist im PC über ein OR-Gatter mit IntRQ verknüpft. Ist OUT2 = 0 gesetzt (elektischer Ausgang ist dann /OUT2 = 1), so ist der Interrupt gesperrt. Die Interruptleitung zum PC ist dabei aber konstant high. Das heißt eigentlich, daß ein Interrupt anliegt (auch wenn im IntPending Register 0001 steht, also keiner pending ist). Wird die Maske im Interrupt-Controller enabled, so ergibt dies einen Einsprung in die Interrupt-Routine. Aus diesem Grund sollten OUT2 = 1 und die Interrupt-Vektoren gesetzt werden, bevor die Maske freigegeben wird.
Im Loop Mode werden durch den SCC die Eingänge RxD, /DCD, /DSR, /RI und /CTS abgeklemmt. Die ankommenden Signale bleiben ohne Wirkung. Auch die Ausgangspins /DTR, /RTS, /OUT1 und /OUT2 werden abgeklemmt und die entsprechenden Ausgangspins inaktiv (high) gesetzt. Sodann werden die Eingangssignale intern mit folgenden Signalen verbunden:
RxD mit TxD DSR mit DTR
CTS mit RTS DCD mit OUT2
RI mit OUT1.
LOOP Mode ist zum Testen der Übertragung durch die CPU gedacht. Ein gesendetes Zeichen wird im eigenen Received Data Register wieder empfangen. Seltsammerweise wirkt im LOOP Mode weiterhin OUT2 als Interrupt Gate.
15.9 Line Status 3FDh (Offset 5) READ
Das Line-Status Register gibt Auskunft über den Zustand der Line-Ein- und -Ausgänge. Es darf nur gelesen werden! Der Schreibzugriff wurde vom Hersteller für interne Testzwecke reserviert.
Bit 7 6 5 4 3 2 1 0
+---+-----+-----+----+----+----+----+----+
| 0 | TSE | THE | BE | FE | PE | OE | DR |
+---+-----+-----+----+----+----+----+----+
| | | | | | +--- Zeichen empfangen
| | | | | +---- Overrun-Error
| | | | +---- Parity-Error
| | | +---- Frame-Error
| | +---- Break-Error (Empfang unterbrochen)
| +---- Transmitter-Holding Register leer
+----- Transmitter-Shifting Register leer
Wenn ein Zeichen aus dem Receive-Shift Register in das Received-Data Register übertragen wurde, wird DR gesetzt. Zurückgesetzt wird es durch Lesen des Received-Data Registers durch die CPU.
Wenn ein Zeichen aus dem Receive-Shift Register in das Received-Data Register übertragen wurde, und das vorige Zeichen von der CPU noch nicht gelesen wurde, so wird OE gesetzt. OE zeigt an, daß ein oder mehrere Zeichen überschrieben wurden. Zurückgesetzt wird OE, nachdem das Line-Status Register ausgelesen wurde.
PE, FE und BE werden gesetzt, wenn während des Empfangs ein Fehler auftrat. Zurückgesetzt werden sie, nachdem das Line-Status Register ausgelesen wurde.
THS und TSE sind gesetzt, wenn die entsprechenden Register leer sind. Ist das THE Bit gesetzt, so darf die CPU das nächste zu sendende Byte in das Transmitter-Holding Register schreiben. Ist TSE gesetzt, so ist die Datenübertragung an TxD beendet, TxD ist inaktiv (high = -12V an Schnittstelle).
15.10 Modem Status 3FEh (Offset 6) READ
Das Modem-Status Register gibt Auskunft über den Zustand der Handshake-Eingänge.
Bit 7 6 5 4 3 2 1 0
+-----+----+-----+-----+------+------+------+------+
| DCD | RI | DSR | CTS | dDCD | teRI | dDSR | dCTS |
+-----+----+-----+-----+------+------+------+------+
| | | | | | | +-- delta Clear To Send
| | | | | | +---- delta Data Set Ready
| | | | | +---- tralling Edge of Ring Indicator
| | | | +----- delta Data Carrier Detect
| | | +----- Clear To Send
| | +----- Data Set Ready
| +----- Ring Indicator
+----- Data Carrier Detect
DCD, RI, DSR und CTS zeigen an, ob die jeweilige Leitung aktiv ist.
dDCD, dDSR und dCTS zeigen an, das sich der logische Zustand der jeweiligen Leitung seit dem letzten Auslesen des Modem Status geändert hat. Nach dem Auslesen des Modem-Status Registers werden sie zurückgesetzt.
teRI zeigt an, daß eine positive Flanke am Pin /RI des SCC auftrat. Das heißt RI war 1 und ist auf 0 gegangen --> das Klingelzeichen lag an und ist gerade vorrüber. teRi wird zurückgesetzt nach dem Auslesen des Modul-Status Registers.
15.11 Scratch 3FFh (Offset 7) READ/WRITE
Das Scratch Register hat keine Funktion. Hier kann der Anwender Werte zwischenspeichern. Allerdings fehlt dieses Register bei einigen billigen Ausführungen des 8250.
15.12 FIFO Control 3FAh (Offset 2) WRITE
Dieses Register ist nur beim 16550 vorhanden und kann nur beschrieben werden. Der Lesezugriff betrifft das Interrupt-Pending Register. Gleichwohl stehen im Interrupt-Pending Register Intormationen über FIFO enabled/disabled.
Bit 7 6 5 4 3 2 1 0
+---+---+---+---+--------+-------+-------+-----+
| T | T | x | x | pinMod | resTx | resRx | FEn |
+---+---+---+---+--------+-------+-------+-----+
| | | | | +-- FIFO enable, wenn 1
| | | | +------- reset Receive FIFO
| | | +------------ reset Transmit FIFO
| | +----------- RxRdy/TxRdy pin Mode (normal = 0)
0 0 ----- Interrupt, schon wenn 1 Byte im FIFO
0 1 ----- Interrupt, wenn 4 Bytes im FIFO
1 0 ----- Interrupt, wenn 8 Bytes im FIFO
1 1 ----- Interrupt, wenn 14 Bytes im FIFO
Für Receive und Transmit gibt es im 16550 je ein FIFO mit einer Tiefe von 16 Byte. FEn muß auf 1 gesetzt werden, um den FIFO-Mode zu enablen. Ansonsten verhält sich der 16550 wie ein 8250 und 16450. Es können so 16 Zeichen empfangen werden, bevor ein Overrun auftritt. Und es können 16 Zeichen gesendet werden, bevor Transmit-Holding Not Empty angezeigt wird.
resRx = 1 löscht das Receive FIFO.
resTx = 1 löscht das Transmit FIFO.
Für den Betrieb im Interrupt-Mode kann festgelegt werden, ob ein Interrupt schon erfolgen soll, nachdem 1, 4, 8 oder 14 Zeichen empfangen wurden. Die Interrupt-Routine wird dann nicht so oft aufgerufen. Dies spart Rechenzeit.
Bei Setzen von 4, 8 oder 14 Zeichen für die Interrupt-Auslösung wird auch bereits nach Empfang eines Zeichens und Ablauf einer internen Timeout-Zeit ein Interrupt generiert. In diesem Fall ist im Interrupt-Pending Register (3F9h) das Bit FIFO-Timeout gesetzt.
16. 8250 SCC
Ergänzend ist die Pinbelegung des 8250 SCC angegeben:
----------------
D0 -| 1 40|- VCC
D1 -| 2 39|- /RI
D2 -| 3 38|- /DCD
D3 -| 4 37|- /DSR VCC = + 5V
D4 -| 5 36|- /CTS GND = 0V
D5 -| 6 35|- RES
D6 -| 7 34|- /OUT1
D7 -| 8 33|- /DTR
RCLK -| 9 32|- /RTS
RxD -|10 31|- /OUT2
TxD -|11 30|- IntRQ
CS0 -|12 29|-
CS1 -|13 28|- A0
/CS2 -|14 27|- A1
TCLK -|15 26|- A2
CLK -|16 25|- ALE
CLKout -|17 24|- CSout
/IOWR -|18 23|- /RDout
IOWR -|19 22|- IORD
GND -|20 21|- /IORD
----------------
Seriell Communication Controller
NS 8250
(National Semiconductor Corporation)
17. Signale von der/zur CPU
CS0 i Chip Select aktiv high nur wenn CS0 und
CS1 i Chip Select aktiv high CS1 beide 1 und
/CS2 i Chip Select aktiv low CS2 0 sind, dann Chip aktiv
CSout o Chip aktiv wird im PC nicht verwendet
A0..A2 i Adressleitungen zur Auswahl des SCC-Registers
ALE i Adress Latch Enable wenn 0, dann A0..A2 durchver-
bunden, sonst gelatched
/IOWR i Schreibsignal aktiv low das nicht benutzte wird auf
IOWR i Schreibsignal aktiv high einen inaktiven Pegel gelegt
/IORD i Lesesignal aktiv low beim PC: IOWR auf GND und
IORD i Lesesignal aktiv high IORD auf GND
/RDout o Daten lesen (D0..D7 = Ausgang) wird im PC nicht verwendet
D0..D7 i/o Datenleitungen
IntRQ o Interrupt Request aktiv high
i = Eingang, o = Ausgang
18. Weitere Ein-/Ausgänge
/OUT1 o Modem-Ausgang beim PC: keine Hardware-Funktion
/OUT2 o Modem-Ausgang beim PC: dient als Interrupt-Gate
CLK i Takteingang oder XTAL1 beim PC: 1.8432 MHz Oszillator
CLKout o Taktausgang oder XTAL2 alternativ auch Quarz zwischen
XTAL1 und XTAL2
TCLK o Transmitter-Takt beim PC: RCLK mit TCLK ver-
RCLK i Receiver-Takt bunden
19. Signale vom Schnittstellentreiber zum SCC
RxD i Received Data
/RI i Ring Indikator
/DCD i Data Carrier Detect
/DSR i Data Set Ready
/CTS i Clear To Send
20. Signale vom SCC zum Schnittstellentreiber
TxD o Transmit Data
/DTR o Data Terminal Ready
/RTS o Request To Send
Unter Berücksichtigung der invertierenden Steuerausgänge des SCC und der Schnittstellentreiber ergeben sich folgende Verhältnisse:
logischer Wert: SCC-Ausgang: Schnittstellen-Stecker:
TxD = high --> TxD = +5 V --> TxD* = -12 V
DTR = high --> /DTR = 0 V --> DTR* = +12 V
RTS = high --> /RTS = 0 V --> RTS* = +12 V
RxD = high <-- RxD = +5 V <-- RxD* = -12 V
DSR = low <-- /DSR = +5 V <-- DSR* = -12 V
DCD = low <-- /DCD = +5 V <-- DCD* = -12 V
CTS = low <-- /CTS = +5 V <-- CTS* = -12 V
RI = low <-- /RI = +5 V <-- RI* = -12 V
21. Logische Pegel nach dem Einschalten des PC
In Ruhe ist TxD = 1 TxD* = -12 V
Nach dem Einschalten sind die
Steuerausgänge DTR = 0 DTR* = -12 V
RTS = 0 RTS* = -12 V
die Eingänge sind bestimmt durch die Gegenseite.
Ein nicht gesteckten Stecker liefert nach RS232 einen nicht definierten
Pegel, wird im PC aber als
RxD = 1, DSR = 0, DCD = 0, CTS = 0 und RI = 0
gelesen.
22. Weitere Hinweise
Die Ausgangstreiber können keinen allzu großen Strom treiben. Schon bei ca. 2,5 mA bricht die Spannung zusammen. Im allgemeinen sind sie jedoch so ausgelegt, daß sie einen höheren positiven Strom treiben können (bis c. 5 mA), bevor die Spannung merklich einbricht. Der Grund liegt darin, daß die Steuerleitungen DTR und RTS für die Spannungsversorgung von Mäusen verwendet werden.
Maustreiber setzen DTR und RTS auf 1. Somit stehen 2 mal ca. +10..12V für die Stromversorgung der Maus zur Verfügung. Über TxD wird bei einer Maus nicht gesendet. Es liegt also andauernd auf -10V. Diese Hilfsspannung wird zur Datenübertragung über RxD benötigt. Anmerkung: Da nur ca. 2 mA (negative Hilfsspannung) zum Umladen der Kapazitäten an RxD zur Verfügung stehen, kann nur mit einer niederen Baudrate übertragen werden. Bei Mäusen üblich ist 1200 Baud.
| © Frank Steinberg |