Serielle Schnittstellen
SCI (serial communication interface asynchronous) Port mit langsamer, asynchroner serieller Datenübertragung (bis etwa 100 kHz) Betriebsart: - Empfang: RE = 1
- Senden: TE = 1
Puffer und Statusbits Statusbits: - RDRF (receive data register full): Wird gesetzt, wenn ein Zeichen vom Empfangsschieberegister ins Register SCDR übertragen wird. Wirdzurückgesetzt durch Lesen von SCSR und SCDR.
- TDRE (transmit data register empty): Wird gesetzt, wenn ein Zeichen vom Register SCDR ins Sendeschieberegister übertragen wird. Wirdzurückgesetzt durch Lesen von SCSR und Schreiben von SCDR.
- TC (transmission complete): Wird gesetzt, wenn ein Zeichen komplett aus dem Sendeschieberegister herausgeschoben wurde. Wird zurückgesetztdurch Lesen von SCSR und Schreiben von SCDR.
Empfangs-Funktion: Die Steuerungslogik erkennt ein seriell ankommendes Zeichen und schiebt es imeingestellten Takt ins Empfangs-Schieberegister (Receive Data Register, RDR).
Sobald das Zeichen vollständig im Schieberegister steht, wird es parallel
ins Empfangsregister kopiert; gleichzeitig wird im Statusregister
(SCSR) das Bit 5 (Receive Data Register Full, RDRF) auf 1 gesetzt.
Falls im Steuerregister (SCCR2) der Empfangsinterrupt zugelassen wurde
(Receive Interrupt Enable, RIE), wird auch noch ein SCI-Interrupt erzeugt.
Das sofortige Kopieren eines Zeichens vom Schieberegister ins Empfangsregister
(SCDR) ist notwendig, damit ein eventuell unmittelbar nachfolgendes serielles
Zeichen nicht das vorherige überschreibt. Allerdings muß das
Empfangsregister bis spätestens unmittelbar vor dem nächsten Kopieren
vom Prozessor gelesen werden, denn sonst geht dieses Zeichen durch
Überschreiben verloren. Die Steuerung erkennt ein solches Überschreiben
und setzt dann das Bit 3 im Statusregister (SCSR): Overrun Error (OR).
Der Zeitabstand, in dem Zeichen eintreffen können, hängt von der Baudrate
ab, z. B. beträgt der Zeichenabstand bei 9600 Baud ca. 1 ms.
Sende-Funktion:
Wird ein Zeichen ins Senderegister geschrieben, so prüft die Steuerlogik, ob
das Sende-Schieberegister frei ist, um es dann dorthin zu kopieren und den
Schiebevorgang zu starten. Damit ist das Senderegister wieder frei und es kann erneut
per Store-Befehl beschrieben werden (nächstes Zeichen). Die Tatsache, daß
dieses Schreiben erlaubt ist, signalisiert das Bit 8 (Transmit Data Register Empty, TDRE)
des Statusregisters (SCSR) mit einer 1. Auch hier kann ein SCI-Interrupt ausgelöst
werden, wenn im Steuerregister der Sende-Interrupt per TIE-Bit = 1 (Transmit Interrupt
Enable) freigegeben ist. In manchen Fällen kann auch noch das tatsächliche
Ende des Schiebevorgängs von Interesse sein (Transmission complete). Für
diesen Zweck gibt es auch noch die Möglichkeit, diese Tatsache sowohl am
entsprechenden Statusbit (TC) zu erkennen bzw. durch einen Interrupt melden zu
lassen.
Serielles Rahmenformat:
Idle: Im Ruhezustand ist die Leitung auf auf 1-Pegel.
Beim Datenformat von 9 Bit (M = 1) ist das neunte Bit im Register SCCR1
zu finden. Beim Wert M = 0 werden 8 Bit empfangen/gesendet (Normalfall).
Setzen der Datenrate
Die Erzeugung der Datenrate erfolgt mehrstufig und ist daher etwas komplex.
Es spielen dabei vier Teiler für die Taktfrequenz (in der Regel 8 MHz)
zusammen (Register BAUD):
Der Takt gelangt erst in einen Prescaler mit vier möglichen Divisionsfaktoren
(1, 3, 4, 13), dessen Output dann nochmals durch acht Divisoren geteilt werden kann.
Bei einer Taktrate von 8 MHz lassen sich folgende Raten wählen (Einstellungen
für das Praktikumssystem farbig hinterlegt):
Neben den beiden schon erwähnten Bits TE und RE sind im Register SCCR2
die Steuerbits für die Interruptfreigabe enthalten.
Das SCI-Statusregister SCSR liefert Informationen über den
Ablauf der Kommunikation. Die Fehlerflags werden zurückgesetzt durch das
Lesen von SCSR und SCDR.
SPI (serial peripherial interface synchronous)
Port mit schneller, synchroner serieller Datenübertragung (bis etwa 2 MHz).
Wird im Rahmen dieser Vorlesung nicht besprochen.
Programmbeispiele
Beispiel 1:
Serielles Senden und Empfangen von Zeichen mit 9600 Bd
Vereinbarungen:
scdr equ $102F
scsr equ $102E
baud equ $102B
sccr1 equ $102C
sccr2 equ $102D
Einstellungen:
init ldaa #$30
staa baud baudrate = 9600 bit/s
ldaa #0
staa sccr1
ldaa #$0C
staa sccr2 enable transmit & receive
rts
Datenverkehr:
* Zeichen in Speichezelle "char" ausgeben
chou ldaa char
ldab scsr Sendereg. leer?
andb #$80
beq chou
staa scdr transmit
rts
* Zeichen nach Speicherzelle "char" einlesen
chin ldaa scdr receive
ldab scsr Empfangsreg. leer?
andb #$20
beq chin
staa char
rts
Sendeschleife:
main bsr init
bsr delay NUR FUER PRAKTIKUMSSYSTEM:
* Wartenzeit fuer Umschalten auf
* Terminalprogramm
loop bsr chin "Schreibmaschine"
bsr chout
bra loop
Beispiel 2:
Serielles Senden von Zeichenketten mit 9600 Bd
Vereinbarungen:
scdr equ $102F
scsr equ $102E
baud equ $102B
sccr1 equ $102C
sccr2 equ $102D
Einstellungen:
init ldaa #$30
staa baud baudrate = 9600 bit/s
ldaa #0
staa sccr1
ldaa #$0C
staa sccr2 enable transmit & receive
rts
Zeichen in Akku A ausgeben:
chou ldab scsr Sendereg. leer?
andb #$80
beq chou
staa scdr transmit
rts
Zeichenkette senden:
Die Adresse der Zeichenkette wird in X übergeben, Ende der Zeichenkette wird
durch ETX markiert definiert durch: ETX EQU 3.
saus ldaa 0,x Zeichen holen
cmpa #ETX ETX (3) ?
beq saus_e dann fertig
inx X inkrementieren
bsr chou Zeichen senden
bra saus und nächstes Zeichen
saus_e rts
Sendeschleife:
main bsr init
bsr delay NUR FUER PRAKTIKUMSSYSTEM:
* Wartenzeit fuer Umschalten auf
* Terminalprogramm
loop ldx #TEXT
bsr saus
bra loop
*
TEXT dc.b 'Hello World' Meldungstext
dc.b $0D,$0A,ETX Zeilenvorschub, ETX
Beispiel 3:
Serielles Senden und Empfangen von Zeichenketten mit 9600 Bd
Vereinbarungen: - siehe oben -
Einstellungen: - siehe oben -
Zeichen in Akku A ausgeben: - siehe oben -
Zeichenkette senden: - siehe oben -
Zeichen nach Akku A einlesen
chin ldaa scdr receive
ldab scsr Empfangsreg. leer?
andb #$20
beq chin
rts
Zeichenkette einlesen:
Die Adresse eines Eingabepuffers wird in X übergeben. Das Eingabeende wird durch
die Taste Carriage-Return (CR, $0D) signalisiert.
sein bsr chin Zeichen einlesen
cmpa #$0D Carriage Return?
beq sein_e ja, Ende
staa 0,x Zeichen im Puffer speichern
inx X inkrementieren
bra sein und nächstes
sein_e ldaa #ETX ETX anhängen (CR wird nicht mit gesp.)
staa 0,x
rts
Sendeschleife:
main bsr init
bsr delay NUR FUER PRAKTIKUMSSYSTEM:
* Wartenzeit fuer Umschalten auf
* Terminalprogramm
loop ldx #PUF
bsr sein
bsr saus
bra loop
Irgendwo im Programm wird ein Puffer definiert, z. B.:
org data
PUF ds.b 80 80 Bytes Puffer reservieren
Anmerkung: "sein" überprüft nicht, ob der maximale Pufferbereich
überschritten wird und so eventuell andere Variablen überschrieben
werden. Versuchen Sie, eine Begrenzung der Eingabe auf z. B. 80 Zeichen zu
programmieren.
|