www.mikrocontroller.net

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


Autor: Twilight (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  S0CON   = 0x40;  // mode 1, 8-bit UART
  TMOD   |= 0x20;  // timer 1, mode 2, 8-bit reload
  TH1     = 0xFD;  // reload value für 9600
  TR1     = 1;     //  timer 1 starten
  TI0     = 1;     // TI0 setzen, um erstes Zeichen auszugeben
  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?*

Autor: Yagan Ζ. Dongobar (yagan)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
>
>   S0CON   = 0x40;  // mode 1, 8-bit UART
>   TMOD   |= 0x20;  // timer 1, mode 2, 8-bit reload
>   TH1     = 0xFD;  // reload value für 9600
>   TR1     = 1;     //  timer 1 starten
>   TI0     = 1;     // TI0 setzen, um erstes Zeichen auszugeben
>   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?*


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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Twilight (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>In diesen 8 Bit sind dann aber Datenbits und Kontrollbits, oder?

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

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht 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/ge...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.