| 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 |