Parallele Schnittstellen
Beim Informationsaustausch des Controllers mit der "Außenwelt" müssen
spezielle Eigenschaften der Peripheriegeräte berücksichtigt werden. Insbesondere sind die Peripherieeinheiten gegenüber der Prozessorgeschwindigkeitrecht langsam Die Schnittstellen müssen die ein- oder ausgehenden Daten zwischenspeichern. Zum anderen laufen CPU und Peripherie oft zeitlich asynchron. Eine weitere Aufgabe von Schnittstellen ist auch die Parallel-seriell-Wandlung (siehe auf Seite 26.html). Allgemein gilt für alle Schnittstellen: - der Datenverkehr zwischen CPU und Schnittstelle läuft meist programmgesteuert (per Polling oder per Interrupt)
- die "Datenbreite" ist durch den internen Datenbus vorgegeben (8 Bit)
- die Eigenschaften der Schnittstellen lassen sich per Programm einstellen Schnittstelle programmierbar Initialisierung notwendig
- jeder Schnittstelle sind einige der oben aufgeführten Register zugeordnet. Dabei handelt es sich um
- Register zur Einstellung der Eigenschaften
- Register zur Ein- und Ausgabe
Der 68HC11 besitzt fünf parallele Schnittstellen, die Ports A bis E, welche mit unterschiedlichen Hardware-Eigenschaften ausgestattet sind. Im "expanded Mode" stehen die Ports B und C nicht zur Verfügung, weil sie für Adreß- und Datenleitungen verwendet werden. Durch einen Port-Expander-Baustein lassen sie sich aber wieder ergänzen. Eine kurze Übersicht der Ports:
- Port A: besitzt drei Eingänge vier Ausgänge und eine
bidirektionale Leitung. Zusätzlich verarbeitet er die Signale des Timer-Systems
und des Pulse-Akkumulators.
Die Ports B und C werden zusammen mit den Handshakeleitungen
STRA und STRB als Einheit betrachtet.
- Port B: besitzt acht Ausgangsleitungen. Lesen auf Port B liefert die
letzten hineingeschriebenen Daten.
- Port C:hat acht bidirektionale Leitungen. Über ein Datenrichtungsregister
kann für jede Leitung festgelegt werden, ob sie Eingang oder Ausgang sein soll.
Ein zusätzliche Latch speichert den Eingangszustand von Port C bei jeder aktiven
Signalflanke auf dem Anschluß STRA.
- Port D:besitzt sechs bidirektionale Leitungen, die wie bei Port C
per Datenrichtungsregister eingestellt werden können. Die Bits 0 und 1 von
Port D werden auch von der seriellen Schnittstelle verwendet.
- Port E: besitzt acht Eingangsleitungen, die alternativ als analoge
Eingänge des A/D-Wandler-Systems verwendet werden. Beim DIL-Ghäuse
stehen sogar nur vier Leitungen zur Verfügung.
Den fünf Ports sind insgesamt 16 Register zugeordnet (Einstellung und E/A).
Die jeweiligen Register werden bei der Besprechung der einzelnen Ports behandelt.
Port A
Ein- und Ausgabeport mit fester und für ein Bit variabler Datenrichtung.
Der Port kann auf zwei verschiedene Betriebsarten gesetzt werden:
- Steuerbit PEAN = 0: "normale" parallele E/A (Betriebsart 1).
- Steuerbit PEAN = 1: Impuls-Akkumulator (Betriebsart 2). Hier lassen
sich entweder Impulse zählen (PMOD = 0) oder Impulsdauern messen (PMOD = 1).
PAIF set by active edge on PAI, reset by writing a corresponding one to TFLG2
PAOVF set by roll over of PACNT, reset by writing a corresponding one to TFLG2
PAII set and reset by software, generate interrupt, if PAIF is set
PAOVI set and reset by software, generate interrupt, if PAOVF is set
Port B und STRB
Ausgabeport mit fester Datenrichtung
Der Port kann auf zwei verschiedene Betriebsarten gesetzt werden:
- Steuerbit HNDS = 0: "normale" parallele Ausgabe
- Steuerbit HNDS = 1: full handshake mode
Wird im Rahmen dieser Vorlesung nicht besprochen!
Port C und STRA
Ein/Ausgabeport mit bitweise wählbarer Datenrichtung.
Der Port kann auf zwei verschiedene Betriebsarten gesetzt werden:
- Steuerbit HNDS = 0: "normale" parallele Ein- oder Ausgabe
- Steuerbit HNDS = 1: full handshake mode
Wird im Rahmen dieser Vorlesung nicht besprochen!
Port D
Ein/Ausgabeport mit bitweise wählbarer Datenrichtung.
Der Port kann auf zwei verschiedene Betriebsarten gesetzt werden:
- Steuerbits SPE = RE = TE = 0: "normale" parallele Ein- oder Ausgabe
- 2. Betriebsart: SPI = serial peripheral interface (synchronous) wenn SPE=1 ist oder
SCI = serial communications interface (asynchronous) wenn RE=1 und/oder TE=1 sind.
Wird unter 26.html besprochen.
Port E
Eingabeport mit fester Datenrichtung
Der Port kann auf zwei verschiedene Betriebsarten gesetzt werden:
- "normale" parallele Eingabe, kein Schreiben ins ADCTL-Register
- A/D-Wandlung, Schreiben ins ADCTL-Register - siehe später.
Programmbeispiele
Beispiel 1
Lesen 4 Bit linksbündig von Port C
Ausgeben 4 Bit rechtsbündig auf Port C
Ausgeben 4 Bit rechtsbündig auf Port B mit STRB (high pulse)
Vereinbarungen:
pcdr equ $1003
pcdd equ $1007
pbdr equ $1004
pioc equ $1002
Initialisierung
init ldaa #$0F
staa pcdd pc(3:0) = output
ldaa #$01
staa pioc STRB high active
rts
Datenverkehr
main ldaa pcdr
lsra
lsra
lsra
lsra
staa pcdr
staa pbdr
bra main
Beispiel 2
Warten auf steigende Flanke am Eingang STRA
Vereinbarungen:
pioc equ $1002
pcdl equ $1005
Initialisierung
init ldaa #$02
staa pioc STRA rising edge exspected
rts
Daten-Abfrage
.
.
. Alternative
wait ldaa pioc
anda #$02 bita #$02
beq wait beq wait
ldaa pcdl clear STAF-flag
.
.
.
Beispiel 3
Realisieren eines 8-Bit-Zählers auf Port B
(Port B ist zwar ein reiner Ausgabeport, aber mit dem Befehl "inc pcdr"
wird Port B erst gelesen und somit der vorherige Ausgabewert geliefert,
dann der Wert erhöht und zurückgeschrieben).
Vereinbarungen:
pbdr equ $1004
Programm:
init clr pbdr Port B = 0
main inc pbdr Increment Port B
ldx #$4000 Warteschleife
delay dex X = X - 1
bne delay solange X > 0 durchlaufe Schleife
bra main
Beispiel 4
Vereinbarungen:
portc equ $1003
pcdd equ $1007
Programm:
init ldaa #%11111111
staa pcdd Port C auf Ausgabe setzen (0=in, 1=out)
clra
staa portc Port C = 0
main inca
staa portc hochzählen
ldx #$4000 Warteschleife
delay dex
bne delay
bra main
Beispiel 5
Lichtmuster ausgeben auf LEDs, die an Port C angeschlossen sind.
Vereinbarungen:
portc equ $1003
pcdd equ $1007
Programm:
init ldaa #$FF
staa pcdd Port C auf Ausgabe setzen (0=in, 1=out)
top ldx #TABLE X verweist nun auf die Daten in TABLE
loop ldaa 0,X Tabellenelement lesen
beq top ist das Elemnt 0 --> Tabellenende
* wieder zum Tabellenanfang
staa portc Tabellenelement ausgeben
bsr delay Warteschleife aufrufen
inx naechstes Tabellenelement
bra loop usw.
*
delay ldx #$4000 Warteschleife, diesmal als Unterprogramm
dela1 dex
bne dela1
rts
*
TABLE dc.b $01, $02, $04, $08, $10, $20, $40, $80
dc.b $40, $20, $10, $08, $04, $02, $00
Beispiel 6
Lesen Port E, ausgeben auf Port B
Vereinbarungen:
pbdr equ $1004
pedr equ $100A
Programm:
main ldaa pedr
staa pbdr
bra main
|