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