> Das erste Hinderniss ist welche Schnittstelle es ist S0 oder S1 und
> welchen Modus sie unterstützt.
Der AT89C5131 ist im Kern ein Standard-8051 und hat (zumindest nach
meinem Datenblatt) nur eine serielle Schnittstelle (UART). Weiterhin
gibt es noch serielle Busse I2C un SPI.
Die Datenübertragung erfolgt Zeichenweise über das Register SBUF. Wenn
ein Zeichen empfangen wurde, setzt der UART das Flag RI (Receive
Interrupt, kann aber auch einfach per Polling jb RI, Zeiche_Abholen
bedient werden)
Das Sende-Flag TI zeigt an, dass das vorige Zeichen vollständig
versendet wurde. Man kann das Flag auf 2 Arten nutzen:
- Zeichen senden, warten bis TI=1, TI löschen
- warten bis TI=1, Zeichen senden, TI löschen
Der Unterschied ist, dass man im 2. Fall weiterarbeiten kann und nicht
auf das Zeichen warten muss (das dauert ja einige ms). Dabei muss aber
bei der Initialisierung darauf geachtet werden, dass man TI auf 1 setzt,
sonst hängt das Programm beim ersten senden.
Fehlt nur noch die Initialisierung im Register SCON und die
Baudratenerzeugung. Serielle Betriebsarten sind eigentlich nur 2
interessant. Mode 1 (8 Bit UART) und Mode 3 (9 Bit UART, nutzbar für
Parity). Die Modi 0 und 2 sind Synchrone Schnittstellen, die (fast)
niemand mehr braucht.
Die Baudrate kann beim 89C5131 der Timer 1, Timer 2 oder der
Baudratengenerator erzeugen. Der BRG kann eh nix anderes, also nimmt man
den, wenn vorhanden.
Initialisierung für 12 MHz-Quarz, 4800 Baud, mit Timer 1:
1 | orl PCON,#10000000b ;Bit SMOD1=1 bei 4800 Baud
|
2 | mov TH1,#243 ;Reloadwert ins Timer-HByte
|
3 | mov TL1,#243 ;Anfangswert Timer
|
4 | anl TMOD,#00001111b ;8-Bit-Timer1 mit Reload
|
5 | orl TMOD,#00100000b ;
|
6 | setb TR1 ;Start Timer1
|
7 | mov SCON,#01010010b ;8-Bit-UART, Empfang zulassen, TI setzen
|
8 | clr ES ;kein serieller Interrupt
|
9 | clr ET1 ;kein Timer-Interupt
|
Initialisierung mit Baudratengenerator für 9600 Baud, 12MHz:
1 | orl PCON,#10000000b ;SMOD1=1 bei 9600 Baud
|
2 | mov BDRCON,#00011111b ;int. Baudraten-Generator für Senden und Empfangen, SPD=1
|
3 | mov BRL,#217 ;Reloadwert für int. Baudratengenerator
|
4 | mov SCON,#01010010b ;8-Bit-UART, Empfang zulassen, TI gesetzt
|
5 | clr ES ;kein serieller Interrupt
|
Programmteil Zeichen_Senden:
1 | jnb TI,weiter ;ist Schnittstelle frei?
|
2 | mov SBUF,#41h ;Ascii „A“ ausgeben
|
3 | ; oder mov SBUF,#'A'
|
4 | clr TI ;Flag löschen, Schnittstelle belegt
|
5 | weiter:
|
Programmteil Zeichen_empfangen:
1 | jnb RI,weiter ;Sprung wenn kein Zeichen empfangen
|
2 | mov a,SBUF ;Zeichen abholen
|
3 | clr RI ;Empfangsflag löschen
|
4 | weiter: ;weiter im Programm
|
Für die Berechnung der Baudrate (Formeln siehe Datenblatt oder Lehrbuch)
muss man beim int.Baudratengenerator beachten, das nicht der
Maschinentakt (FOsz/12 bzw. FOsz/6 bei X2-Mode) sondern der
Peripherietakt FPER= FOsz/2 einzusetzen ist. Mit 12MHz-Quarz ist bei
38400 Baud schluss, mit 11.0592MHz geht es bis 115.200 Baud.
tschuessle
B.