µC80517A - Initialisierung einer seriellen Schnittstelle

Gast #1621574
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?*
#1621716
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
Gast #1621798
> *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.
Gast #1621932
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?
#1621944
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.