Forum: Mikrocontroller und Digitale Elektronik µC80517A - Initialisierung einer seriellen Schnittstelle


von Twilight (Gast)


Lesenswert?

Für das Senden von Text an das Terminalprogramm eines PCs musste ich im 
Mikrocontroller eine serielle Schnittstelle initialisieren.
Der Codeblock dafür wurde netterweise vorgegeben:
1
  S0CON   = 0x40;  // mode 1, 8-bit UART
2
  TMOD   |= 0x20;  // timer 1, mode 2, 8-bit reload
3
  TH1     = 0xFD;  // reload value für 9600
4
  TR1     = 1;     //  timer 1 starten
5
  TI0     = 1;     // TI0 setzen, um erstes Zeichen auszugeben
6
  EAL     = 1;

Die Kommentare sollen eigentlich zum Verständnis beitragen, was aber 
nicht wirklich der Fall ist.
Ich habe ein wenig im Datenblatt eines µC8051A nachgeforscht und bin 
dabei auf auf einiges gestoßen, was mir aber nicht ausreicht, um es zu 
verstehen:

s0con -> SM0=0 und SM1=1 ->Modus 1  Variable Baudrate  8-Bit-UART

*Was bedeutet 8-Bit-UART?*

TMOD  -> M1=1            -> Reloadmodus des Timer 1 (nur 8 Bit möglich)
TH1   -> Der Wert 9600 wird in das Timer-High-Byte geschrieben

*Warum gerade dieser Wert an dieser Stelle? 9600 Bd/s ist auch die 
Baudrate, aber was hat die mit dem Timer-High-Byte zu tun?*

TR1 auf 1 setzen   -> Timer-Run-Bit gesetzt
TI0   -> Request-Flag eines Interrupts
EAL   -> Alle Interrupts nicht mehr gesperrt

*Welche Aufgabe erfüllt ein Interrupt für eine Datenausgabe über die 
serielle Schnittstelle?*

von Yagan Ζ. D. (yagan)


Lesenswert?

Twilight schrieb:
> Für das Senden von Text an das Terminalprogramm eines PCs musste ich im
> Mikrocontroller eine serielle Schnittstelle initialisieren.
> Der Codeblock dafür wurde netterweise vorgegeben:
>
>
1
>   S0CON   = 0x40;  // mode 1, 8-bit UART
2
>   TMOD   |= 0x20;  // timer 1, mode 2, 8-bit reload
3
>   TH1     = 0xFD;  // reload value für 9600
4
>   TR1     = 1;     //  timer 1 starten
5
>   TI0     = 1;     // TI0 setzen, um erstes Zeichen auszugeben
6
>   EAL     = 1;
7
>
>
> Die Kommentare sollen eigentlich zum Verständnis beitragen, was aber
> nicht wirklich der Fall ist.
> Ich habe ein wenig im Datenblatt eines µC8051A nachgeforscht und bin
> dabei auf auf einiges gestoßen, was mir aber nicht ausreicht, um es zu
> verstehen:
>
> s0con -> SM0=0 und SM1=1 ->Modus 1  Variable Baudrate  8-Bit-UART
>
> *Was bedeutet 8-Bit-UART?*


UART = Universal Asynchronous Receiver/Transmitter,
also Sender/Empfänger der seriellen Schnittstelle.
8-Bit werden pro Datenrahmen (frame) übertragen.



>
> TMOD  -> M1=1            -> Reloadmodus des Timer 1 (nur 8 Bit möglich)
> TH1   -> Der Wert 9600 wird in das Timer-High-Byte geschrieben
>
> *Warum gerade dieser Wert an dieser Stelle? 9600 Bd/s ist auch die
> Baudrate, aber was hat die mit dem Timer-High-Byte zu tun?*


Der Timer 1 wird hier als Baudrate-Generator benutzt, erzeugt also den 
Takt für die Schnittstelle. Der Wert, der in TH1 geschrieben wird ist 
abhängig von Prozessortaktfrequenz und Baudrate.


>
> TR1 auf 1 setzen   -> Timer-Run-Bit gesetzt
> TI0   -> Request-Flag eines Interrupts
> EAL   -> Alle Interrupts nicht mehr gesperrt
>
> *Welche Aufgabe erfüllt ein Interrupt für eine Datenausgabe über die
> serielle Schnittstelle?*


TI0 steht hier für den Sendeinterrupt der UART0. Er wird immer 
ausgelöst, wenn der Sendepuffer frei ist und die Software ein neues Byte 
hineinschreiben darf. Um die Sendung zu starten setzt man TI0 oder 
schreibt das erste Byte direkt in den Sendepuffer. Interruptbetrieb hat 
den Vorteil, dass ein Grundprogramm durchgehend arbeiten kann und nur 
gelegentlich zur Bedienung eines Interrupts unterbrochen wird.

Ciao, Yagan

von Hans (Gast)


Lesenswert?

> *Welche Aufgabe erfüllt ein Interrupt für eine Datenausgabe über die
> serielle Schnittstelle?*

Eigentlich gar keine. Um Daten zu senden, schreibt man einfach in SBUF.
Der serielle Interrupt muß nicht einmal aktiviert sein. Wenn Du in die
Initialisierung schaust wird ES auch nicht gesetzt.

Allerdings muß man nach dem Schreiben das TI-Flag abwarten (und wieder
löschen!) bevor man ein neues Byte in den Sendepuffer schreibt.

von Twilight (Gast)


Lesenswert?

Danke für die Antworten!

Nur eins noch:

Yagan z. Dongobar schrieb:
> 8-Bit werden pro Datenrahmen (frame) übertragen.

In diesen 8 Bit sind dann aber Datenbits und Kontrollbits, oder?

von Hans (Gast)


Lesenswert?

>In diesen 8 Bit sind dann aber Datenbits und Kontrollbits, oder?

Nur 8 Datenbits; Start- und StopBit kommen noch dazu.

von Matthias K. (matthiask)


Lesenswert?

Ich empfehle Dir zum Einstieg erstmal die Beschäftigung mit den 
Grundlagen der 8051er-Familie. Die sind soweit verbreitet, dass man hier 
im Forum, im Netz oder Buchhandel jede Menge an Literatur und Beispielen 
findet.

Beispiele:
Beitrag "8051 serielle schnittstelle"
http://www1.tfh-berlin.de/~rozek/pdf/MC65-Teil5.pdf
http://www.imd.uni-rostock.de/ma/gol/lectures/mpu/mpu4.pdf

Einen einfachen Kodegenerator gibts hier:
http://www.ipd.uka.de/~buchmann/microcontroller/generator.htm

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.