Elektronische Grundlagen Versuch E13, Schnittstellen und ihre ...
Elektronische Grundlagen Versuch E13, Schnittstellen und ihre ...
Elektronische Grundlagen Versuch E13, Schnittstellen und ihre ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Elektronische</strong> <strong>Gr<strong>und</strong>lagen</strong><br />
<strong>Versuch</strong> <strong>E13</strong>, <strong>Schnittstellen</strong> <strong>und</strong> <strong>ihre</strong> Programmierung<br />
Praktikumsgruppe IngIF 1, 21. Mai 2003<br />
Stefan Schumacher 1<br />
Sandra Ruske<br />
<br />
Oliver Liebold<br />
<br />
Vorbereitungsfragen<br />
3.1<br />
Zentrale Verarbeitungseinheit (ZVE, CPU)<br />
- Speicher (RAM/ROM)<br />
- I/O-Einheit<br />
- Uhr (Clock)<br />
- D/A-umsetzer<br />
- Counter usw.<br />
Das BUS-System, bestehend aus Adress-, Daten- <strong>und</strong> Systembus, verbindet die Komponenten<br />
miteinander. Der Datenbus überträgt i.d.R. bidirektional Daten, während Steuer<strong>und</strong><br />
Adressbus die Modi der Teilnehmer bzw. anzusprechende Adressen überträgt.<br />
Um mit peripheren Einheiten zu kommunizieren ist eine Umwandlung der Signale des<br />
Systembus notwendig. Dazu werden in der I/O-Einheit<br />
ˆ Interruptanforderungen weitergeleitet<br />
ˆ Daten zwischengepuffert um die Übertragungsgeschwindigkeit anzugleichen <strong>und</strong> zu<br />
synchronisieren<br />
ˆ Datenumwandlung (D/A bzw. A/D <strong>und</strong> parallell / seriell resp. umgekehrt)<br />
Es ist möglich spezielle Bausteine (z.B. DMA 2 -Controller) einzusetzen die die Kontrolle<br />
über den BUS übernehmen <strong>und</strong> so die CPU entlasten.<br />
3.2<br />
Die boolesche Logik der Schaltungen wird über Logikgatter, FlipFlops <strong>und</strong> Busse realisiert,<br />
welche zu Registern zusammengefasst werden.<br />
Der serielle Port benötigt lediglich ein Schieberegister, da er die Daten seriell nach FIFO<br />
Order ausgibt.<br />
Der parallele Port hingegen benötigt mehrere (meist 8) parallele Datenleitungen <strong>und</strong> (2)<br />
Steuerleitungen. Der Timer implementiert einen synchronen Bitzähler.<br />
3.3<br />
Üebertragungsrichtungen (bi-/unidirektional)<br />
Übertragungswege (Kabel, Funk, Infrarot)<br />
Frequenz<br />
Wortbreite<br />
1 PGP Schlüssel 0xB3FBAE33<br />
2 Direct Memory Access<br />
1
Anzahl der Anschließbaren Geräte<br />
2
3.4<br />
Bei der seriellen Datenübertragung werden die Signale nacheinander auf einer Datenleitung<br />
versendet. Um Sender <strong>und</strong> Empfänger synchron zu halten gibt es zwei Möglichkeiten,<br />
die asynchrone <strong>und</strong> die synchrone Datenübertragung<br />
Für den Halbduplex- oder Simplex- Betriebsmodus sind nur zwei Leitungen für die serielle<br />
Datenübertragung notwendig, die Übertragungsleitung <strong>und</strong> eine Masseleitung. Für<br />
den Vollduplex- Modus sind es entsprechend doppelt so viele Leitungen, falls eine gemeinsame<br />
Masseleitung benutzt wird, werden nur drei Leitungen benötigt.<br />
Die Synchronisierung von Programmen <strong>und</strong> Sendedaten erfolgt mittels Pufferung. Die<br />
CPU verschickt <strong>ihre</strong> Daten, die im TDR zwischengespeichert <strong>und</strong> dann an das TSR<br />
geschickt werden. Sind TDR <strong>und</strong> TSR voll, bekommt die CPU das Signal keine weiteren<br />
Daten zu schicken. Sind die Puffer durch eine Datenübertragung geleert worden,<br />
bekommt die CPU wieder die Möglichkeit Daten zu schicken.<br />
3.5<br />
Datenübertragung mittels Stromschleife ist in vielen Umgebungen eine bevorzugte Technik;<br />
meistens wird sie in industriellen Anwendungen eingesetzt. Die meisten Systeme<br />
arbeiten mit der vertrauten, analogen 4-20 mA Stromschleife über Zweidraht. Ein verdrilltes,<br />
zweiadriges Kabel dient sowohl als Spannungsversorgung für das Modul als auch<br />
als Medium für die Übertragung des Ausgangssignals. Weniger populär ist die Dreidraht-<br />
Stromschnittstelle, deren primärer Vorteil die Übertragung von zusätzlicher Leistung für<br />
die Modulelektronik ist.<br />
Stromschleife wird in der Regel über schnelle, Stromgekoppelte Daten-Optokoppler vorgenommen.<br />
Dies gewährleistet in den meisten Applikationen eine galvanische Trennung<br />
zwischen den verb<strong>und</strong>enen Geräten, so dass über TTY- (current-loop- ,20 mA- oder<br />
Linienstrom-) <strong>Schnittstellen</strong> ohne weitere Schutzmaßnahmen in der Regel eine isolierte<br />
Datenübertragung über eine große Distanz möglich ist. Der Vorteil der relativ sicheren<br />
Übertragung wird bei der dieser Schnittstelle jedoch mit vergleichsweise niedrigen Datenraten<br />
erkauft.<br />
Die maximale Datenübertragungsrate beträgt 115 kB, üblich sind jedoch nur 9,6 kB<br />
oder 19,6 kB. Die maximale Entfernung wird mit 1 km bei 2400 B angegeben.<br />
Die 20mA- bzw. Current-Loop-Schnittstelle überträgt die Daten, indem in einer Leitungsschleife<br />
ein 20mA-Strom im Takt der Datenbits ein- <strong>und</strong> ausgeschaltet wird. Im<br />
Ruhezustand bzw. während der Übertragung von ”1Bits fließt ein konstanter Strom von<br />
20 mA, während ”0Bits durch einen unterbrochenen Stromfluss gekennzeichnet sind. Innerhalb<br />
jeder Stromschleife darf lediglich ein angeschlossenes Gerät den erforderlichen<br />
Schleifenstrom von 20 mA liefern. Dieses Gerät bezeichnet man als aktiv, das andere als<br />
passiv. Die Stromschnittstelle, auch unter dem Namen Linienstrom-, 20 mA-, Current-<br />
Loop- oder TTY-Schnittstelle bekannt, ist nicht genormt.<br />
3.6<br />
Die Vielzahl der im PC vorhandenen <strong>Schnittstellen</strong> sind nicht auf das Anbieten sehr<br />
spezialisierter Funktion beschränkt, sondern sie bieten viele Möglichkeiten, um die angebotenen<br />
Funktion komfortabler <strong>und</strong> individueller zu handhaben. Die <strong>Schnittstellen</strong><br />
besitzen aus diesem Gr<strong>und</strong>e ein oder mehrere Register, in denen die aktuelle Betriebsart<br />
gespeichert ist. Werden die Register manipuliert, verändert sich auch das spezifische<br />
3
Verhalten der Schnittstelle zur Peripherie <strong>und</strong> zum System. Im Bereich des PC gibt es<br />
drei Möglichkeiten, die Register <strong>und</strong> damit die Schnittstelle zu konfigurieren:<br />
1. direkte Adressierung<br />
Hierfür sind genaue Kenntnisse über das System <strong>und</strong> die jeweilige Schnittstelle notwendig.<br />
Verschiedene Prozessoren sprechen <strong>ihre</strong> <strong>Schnittstellen</strong> unterschiedlich an (Stichwort:<br />
Speicherbezogene oder isolierte Adressierung). Weiterhin müssen Ein-/Ausgabeadressen<br />
der Schnittstelle, die jeweilige Portinitialisierung, Registerfunktionen der Schnittstelle<br />
<strong>und</strong> Datenformate der <strong>Schnittstellen</strong>bausteine bekannt sein.<br />
2. BIOS-Interrupts benutzen<br />
Das BIOS als unterste Ebene des Betriebssystems bietet Routinen an, über die mittels<br />
dem BIOS zugeordneter Interrupts auch auf die <strong>Schnittstellen</strong> zugegriffen werden kann.<br />
Kenntnisse über die Funktionsweise der Peripheriebausteine sind aber immer noch nötig,<br />
ebenso wie über die Parameter der BIOS- Interrupts.<br />
3. DOS- Interrupts benutzen<br />
Das DOS (disk operating system) stellt ebenso wie das BIOS Routinen zur Verfügung,<br />
über die auf die <strong>Schnittstellen</strong> zugegriffen werden kann. Da das DOS rechnerunabhängig<br />
ist, sind keine Kenntnisse über die Adressen <strong>und</strong> Funktionen der Peripherie nötig.<br />
Unter die Kategorie Softwareinterrupts fallen die Möglichkeit 2 <strong>und</strong> 3. Daraus kann man<br />
ableiten, dass Softwareinterrupts eine große Rolle spielen, wenn es darum geht, <strong>Schnittstellen</strong><br />
möglichst einfach zu konfigurieren, insbesondere sind sie unumgänglich, wenn die<br />
Unabhängigkeit eines Programms vom jeweilig verwendeten PC notwendig ist.<br />
3.7<br />
Das Prinzip des Handshaking soll hier am Beispiel des Intel PPI 8255 gezeigt werden.<br />
Im Modus 1 werden je drei Leitungen des Ports C den Ports A <strong>und</strong> B als Handshake-<br />
Leitungen zugeordnet. Auf ihnen werden die Signale STB (Strobe), ACK (acknowledge)<br />
<strong>und</strong> INT (interrupt) übertragen. Die übrigen beiden Leitungen von Port C sind ebenfalls<br />
zu Port A zugeordnet <strong>und</strong> können fürbeliebige Aufgaben benutzt werden.<br />
Dateneingabe: Das angeschlossene Peripheriegerät legt die Daten auf die Portleitungen<br />
von Port A oder B <strong>und</strong> signalisiert dem PPI 8255 überein kurzes Strobe- Signal am jeweiligem<br />
Port, das Daten anliegen. Die negative Flanke dieses Signals setzt den FlipFlop<br />
FF, so daß dessen Ausgangssignal IBF dem Peripheriegerät anzeigt, das das Eingaberegister<br />
IB noch voll ist. Die positive Flanke von STB realisiert nun die Übernahme der<br />
Daten von den Portleitungen nach IB. Ist IE (interrupt enable) gesetzt (im Statusregister),<br />
so wird im Zusammenspiel mit dem IBF- Signal ein Signal auf dem Ausgang<br />
INT erzeugt, das der CPU anzeigt, das Daten im IB vorliegen. Holt die CPU die Daten<br />
irgendwann ab, sorgt das Lesesignal RD für die Rücknahme von INT <strong>und</strong> löscht IBF,<br />
womit das angeschlossene Peripheriegerät erkennt, das der jeweilige Port wieder frei ist.<br />
Datenausgabe: Der Prozessor legt die Daten auf den Datenbus <strong>und</strong> löst einen Schreibimpuls<br />
WR (negativ) aus. Die Daten werden nun ins Ausgaberegister DR übertragen<br />
<strong>und</strong> erscheinen kurz später auf den Portleitungen von entweder Port A oder B. Ein dem<br />
DR zugeordnetes FlipFlop FF wird zurückgesetzt, dessen Low- Pegel OBF dem angeschlossenem<br />
Peripheriegerät des Vorliegen von Daten anzeigt. Holt das Peripheriegerät<br />
die Daten ab, quittiert es dies mit ACK. Die negative Flanke dieses Signals setzt das<br />
FF zurück <strong>und</strong> damit auch OBF. Ist IE gesetzt, so wird nun ein INT- Signal an den<br />
4
Prozessor geschickt, das ihm den Abschluss der Datenübertragung <strong>und</strong> die Bereitschaft<br />
des Ports für eine neue Übertragung anzeigt.<br />
Die Kontrolle des Datenflusses zwischen Sender <strong>und</strong> Empfänger erfolgt über die 3 Leitungen<br />
des Handshake-Bus. Aufgr<strong>und</strong> der asynchronen Datenübertragung können Geräte<br />
mit verschiedenen Übertragungsgeschwindigkeiten miteinander kommunizieren. Die maximale<br />
Datenübertragungsgeschwindigkeit wird vom langsamsten Gerät bestimmt. Der<br />
IEC-Bus verwendet ein Dreidraht-Handshake, wobei die Leitungen NDAC <strong>und</strong> NRFD<br />
von mehreren Geräten zu unterschiedlichen Zeiten bedient werden. Hier gilt: - jede Datenübertragung<br />
wird erst begonnen, wenn alle Geräte <strong>ihre</strong> Bereitschaft (NRFD = log. 0<br />
gesendet haben - jede Datenübertragung wird erst dann abgeschlossen, wenn alle Geräte<br />
<strong>ihre</strong> Fertigmeldung (NDAC = log. 0) gesendet haben<br />
3.8<br />
Wesentliche Merkmale:<br />
Baustein für parallele Schnittstelllen (u.a. Datenübertragung)<br />
24 programmierbare I/O-Pins<br />
Drei 8-bit-Ports(Port A, B <strong>und</strong> C)<br />
Port C wird in Teilpors (C-Low bzw. C-High) eingeteilt<br />
drei verschiedene Modusarten:<br />
Modus 0:<br />
- Port C wird in zwei Teilports mit jeweils 4 Steuerleitungen unterteilt<br />
- jeder Port(A oder B) kann dabei unabhängig voneinander zur Ein- <strong>und</strong> Ausgabe benutzt<br />
werden<br />
Modus 1:<br />
- I/O-Aufgaben können zu oder von einem Port ermöglicht werden<br />
- je drei Leitungen des Ports C werden den Ports A <strong>und</strong> B als Handshake- Leitungen<br />
zugeordnet(zur Synchronisation der Datenübertragung)<br />
Modus 2:<br />
- nur Port A wird zur Datenübergabe(bidirektional) benutzt<br />
- Port B kann als Ein- oder Ausgang verwendet werden<br />
- Leitungen von Port C können als Handshake-Leitungen(wie im Modus 0)<br />
oder als Ein-/Ausgabeleitung benutzt werden<br />
RD-Leitung:<br />
- Lesesignal<br />
- Zeigt an, das Daten gelesen werden (siehe auch Aufgabe 3.7)<br />
WR-Leitung:<br />
- Schreibsignal<br />
- Übernahme der Daten in den Datenpuffer (siehe auch Aufgabe 3.7)<br />
A0,A1-Leitung:<br />
- zur Programmierung der vier internen Register (Port A, B, C)<br />
- Steuerwortregister)<br />
RESET-Leitung:<br />
- Rücksetzen des Bausteins<br />
CS-Leitung:<br />
- Signalleitung<br />
5
- Baustein angewählt<br />
Datenbus-Puffer:<br />
- speichert Ein- <strong>und</strong> Ausgabedaten<br />
Lese-/Schreibsteuerung:<br />
- interpretiert die Steuersignale von jedem Port<br />
- steuert das Verhalten der Ports (siehe auch 3.7)<br />
3.9<br />
Interruptverarbeitung im IBM-PC:<br />
Um Interrupts zu verarbeiten gibt es für einen Rechner prinzipiell mehrere Organisationsmöglichkeiten.<br />
Beim IBM-PC hat man ich für die Variante mit Interruptcontrollern<br />
entschieden. Dies ist eine Hardware-Lösung, welche zum Vorteil hat, dass man den Prozessor<br />
nicht belastet. Bei der Verarbeitung muß zuerst zwischen Software- <strong>und</strong> Hardware-<br />
Interrupts unterschieden werden. Beim Software-Interrupt wird kein Interruptcontroller<br />
benötigt, da der Prozessor den INT-Befehl als gültigen Opcode(VDI-Funktionsnummer)<br />
erkennt <strong>und</strong> daraus den Interruptvektor berechnet <strong>und</strong> das Interrupt-Handling auslöst.<br />
Hardware-Interrupts dagegen werden an Interruptcontroller gerichtet, welches dan das<br />
Prioritätenhandling abwickelt <strong>und</strong> mit den Prozessor kommuniziert.<br />
Arbeitsweise Interruptcontrollers PIC 8259:<br />
Der Interruptcontroller PIC 8259 (programable interrupt controller) kann acht unterschiedliche<br />
Unterbrechungsleitungen verwalten. Es lassen sich durch Kaskadierung bis<br />
zu 64 unterschiedliche Unterbrechungsleitungen verwalten. Möchte nun ein angeschlossenes<br />
Gerät (am Controller angeschlossen) ein Interrupt auslösen, so wird eine der Leitungen<br />
IR0 bis IR7 gesetzt. Der PIC 8259 bemerkt dieses <strong>und</strong> ermittelt den Zustand<br />
aller acht Eingangsleitungen, welchen er im IRR (interrupt request register) ablegt. Aus<br />
den Zuständen ermittelt er die höchste Priorität, IR0 hat höchste, IR7 hat die niedrigste<br />
Priorität. Dies ist nötig, da auch der Fall eintreten kann, dass mehrere Leitungen gleichseitig<br />
gesetzt waren. Der Interruptcontroller kann anhand der Priorität erkennen, ob der<br />
anliegende Interrupt das Recht hat, den aktuell ausgeführten Interrupt zu unterbrechen.<br />
Daraufhin vergleicht der Controller, ob der nun ermittelte Interrupt mit der höchsten<br />
Priorität maskiert (gesperrt) ist oder nicht. Ist dies nicht der Falls, so wird das höchste<br />
Bit des IRR ins ISR-Register (interrupt service register) übertragen. Mit einem Signal<br />
auf dem INT-Ausgang, welcher direkt mit dem INT-Eingang des jeweiligen Prozessors<br />
verb<strong>und</strong>en ist, wird dem Prozessor mitgeteilt, das ein erlaubter IRQ vorliegt. Ist das<br />
Bit IE (interrupt enable) in der CPU gesetzt, so bestätigt diese mit einem ersten INTA-<br />
Signal. Daraufhin wird das IRR des Interruptcontrollers zurückgesetzt., da der Interrupt<br />
akzeptiert wurde.<br />
Der Prozessor sendet ein zweites INTA-Signal, woraufhin der PIC 8259 den Inhalt des<br />
ISR an die CPU sendet. Bei dem Inhalt dieses Registers handelt es sich um ein Interruptvektor,<br />
den der Prozessor nun verarbeitet (Unterbrechungsroutine wird ausgeführt).<br />
Vektorinterrupt:<br />
Das Verfahren des Vektorinterrupt wird als eines der schnellsten <strong>und</strong> elegantesten beschrieben.<br />
Die Startadressen aller Ausnahmeroutinen sind in einer Interrupt Vector Table(IVT)<br />
zusammengefasst. Jeder Ausnahmeursache wird als Vektor der Index zugeordnet,<br />
unter dem in der Tabelle der Startpunkt <strong>ihre</strong>r Behandlungsroutine steht. Maskier-<br />
6
are Interrupts stehen meist am Ende der Tabelle <strong>und</strong> nicht maskierbare vorn in der<br />
Tabelle. Somit ist für Abarbeitung eines Interrupts die Interrupt Vektor Nummer (IVN)<br />
notwendig, anhand derer die Startadresse der nun auszuführenden Routine ermittelt<br />
werden kann.<br />
<strong>Versuch</strong>saufgaben<br />
2.<br />
Die Initialisierung des PPI erfolgte mit dem Steuerwort [10110100] 2 bzw. B4h welches<br />
an Port 303h mit<br />
-o 303 4b<br />
übergeben wurde. Danach verwendeten wir folgende Assemblerroutinen um die Daten<br />
aus Port A auf Port B zu schreiben:<br />
mov dx, 300 ; setze Register auf 300h (Port A)<br />
in al, dx ; Daten aus DX nach AL (Akkumulator) schieben<br />
inc dx ; dx erhöhen auf 301h (Port B)<br />
out dx, al ; Daten aus AL (Akkumulator) auf DX schieben (jetzt Port B)<br />
danach wurde das Programm mit dem Debugbefehl -g <strong>und</strong> den entsprechenden Adressen<br />
gestartet. Die Werte aus Port A wurden wie gewünscht nach Port B kopiert.<br />
3.<br />
Übergabe der Sprungadresse zur Interrupserviceroutine die mittels IRQ 7 angesprungen<br />
werden soll.<br />
e0:3c 00 01 81 13<br />
3Ch berechnet sich aus 0F h (Der Hexwert für IRQ 7) multipliziert mit 4, 0001 8113 ist<br />
die Adresse mit verdrehtem Segment/Offset <strong>und</strong> Hi/Lo-Byte<br />
push ax ; Register auf Stack retten<br />
push dx ; Register auf Stack retten<br />
mov dx, 300 ; Register auf Port A setzen<br />
in al, dx ; Portinhalt auf Akkumulator schieben<br />
inc dx<br />
; Register auf Port B setzen<br />
out dx, al ; Akkumulator über Register ausgeben<br />
mov al, 20 ;<br />
mov dx, 20 ; PIC zurücksetzen<br />
out dx, al ; Akkumulator auf dx setzen<br />
pop dx<br />
; Register von Stack zurückpushen<br />
pop ax<br />
; Register von Stack zurückpushen<br />
iret<br />
; Rücksprung zu unterbrochenen Programm<br />
anschließend wurde die IRQ Maske im Debugger mit<br />
-i 21<br />
eingelesen <strong>und</strong> der Rücksprung für den Return übergeben mit:<br />
-o 20 20<br />
Abschließend wurden mit rf das ei Flag gesetzt um Interrupts einzuschalten. Durch<br />
7
aktivieren des Interruptschalters wird nun das laufende Programm unterbrochen <strong>und</strong><br />
unsere Routine gestartet.<br />
4.<br />
Die Ansteuerung des Druckers erfolgte mittels BIOS-Interrupt 17h, welcher mit den ersten<br />
3 Befehlen initialisiert wurde.<br />
Anschließend wurde die Funktion “Zeichen parallel ausgeben´´ angesteuert <strong>und</strong> jeweils<br />
der hexadezimale ASCII-Code des zu druckenden Zeichens übergeben. Nach Übergabe<br />
des Line Feed Signals begann der Drucker mit dem Ausdruck der gepufferten Zeichen.<br />
mov ah, 01<br />
mov dx, 0<br />
int 17<br />
mov ah, 0<br />
mov al, 41<br />
mov dx, 0<br />
int 17<br />
mov ah, 0<br />
mov al, 42<br />
mov dx, 0<br />
int 17<br />
mov ah, 0<br />
mov al, a<br />
mov dx, 0<br />
int 17<br />
; Initialisierung des Drucker per BIOS Interrupt<br />
; Zeichen auf Drucker ausgeben<br />
; ASCII Hexcode für A<br />
; erste LPT Schnittstelle<br />
; Zeichen auf Drucker ausgeben<br />
; ASCII Hexcode für B<br />
; erste LPT Schnittstelle<br />
; Zeichen auf Drucker ausgeben<br />
; ASCII Hexcode für LF, Signal für den Drucker zu starten<br />
; erste LPT Schnittstelle<br />
8