mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verständnis frage zum UART


Autor: Friedrich Kemper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich versuche gerade den folgenden Quellcode zu verstehen (bin
Anfänger):

 /* USART-Init 19200 Baud bei 16MHz für Mega32 */
  UCSRB |= ( 1 << TXEN );      // UART TX einschalten
  UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 );          // Asynchron 8N1
  UBRRH  = 0;                                   // Highbyte ist 0
  UBRRL  = 51;                                  // Lowbyte ist 51 (
dezimal )

Im Dateblatt steht ja wenn während eines Schreibvorganges das höchste
bit 1 ist wird in register UCSRC geschrieben wenn 0 dann wird gegister
UBRRH beschrieben.

ein beispiel:

UCSRC = 0b10000000 // wird in UCSRC gescrieben da das höchste bit der
binären zahl eine 1 ist

UBRRH = 0b00001111 wird in UBRRH geschrieben da das höchste bit eine 0
ist

UBRRH = 0b11110000 wird in UCSRC geschrieben da das höchste bit eine 1
ist. (mal abgesehen von der lesbarkeit und gutem progstiel)

Ist das so richtig oder verstehe ich da was falsch?

mfg
Fritz

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider kann ich dir deine Frage auch nicht beantworten aber ich habe zu
deinem Problem auch ne Frage.
In dieser Zeile:

UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 );          // Asynchron 8N1

wird das Frameformat für die Uart-kommunikation festgelegt und ich
verstehe das 3<<UCSZ0 nicht so ganz. In meinem Datenblatt (Atmega32,
Tab. 66) steht, dass man UCSZ0,UCSZ1 und UCSZ2 einzeln definieren muss
um eine bestimmte Datenbitanzahl festzulegen. Wieso genügt es denn in
den Beispielen die ich bis jetzt gefunden habe (komischerweise auch im
Datenblatt des Atmega32),3<<UCSZ0 zu setzen? Was bedeutet das denn
genau?

Autor: Friedrich Kemper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube das ist so:

eine 3 wird ja als als summe aus 2hoch0 und 2hoch1 dargestellt:

2^7| 2^6| 2^5| 2^4| 2^3| 2^2| 2^1| 2^0
--------------------------------------
  0    0    0    0    0    0    1    1

und diese beiden einsen werden dann um 1 stelle nach links verschoben,
da USCZ0=1

ich glaube daß das so ist. aber 100% würde ich mich nicht darauf
verlassen. bin ja selbst noch anfänger.

mfg
fritz

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke

Jetzt wird der "hilferufende" selbst zum "helfenden" :)

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Fritz: ich hab jetzt nicht ins Datenblatt geguckt, aber es ist so.

Übrigens ist (3<<UCZS0) nicht wirklich schön. Da das sowieso der
Präprozessor ausrechnet, wäre die zwar längere Schreibweise (1<<UCSZ1)
| (1<<UCZS0) besser lesbar...

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

>und diese beiden einsen werden dann um 1 stelle nach links
> verschoben, da USCZ0=1

Das ist soweit richtig. Damit wird die 8bit Übertragung eingestellt

> Ist das so richtig oder verstehe ich da was falsch?

Ja. Die beiden Register liegen an der selben Adresse. Das oberste Bit
entscheidet welche Funktion (Baudrate oder Konfiguration) verwendet
werden soll. Wahrscheinlich kannst Du statt

 UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 );

auch

 UBRRH  |= ( 1 << URSEL )|( 3<<UCSZ0 );

schreiben. Sollte den gleichen Effekt haben; mit der Außnahme das dann
niemand den Code mehr versteht ohne das Datenblatt gelesen zu haben;-)

Gruß

      Dirk

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

> Übrigens ist (3<<UCZS0) nicht wirklich schön. Da das sowieso der
> Präprozessor ausrechnet, wäre die zwar längere Schreibweise
> (1<<UCSZ1)| (1<<UCZS0) besser lesbar...

Bessere wäre aber eine (numerische) Konstante z. B.
#define UART_8BIT (3 << UCZS0)
#define USE_UCSRC (1 << URSEL)

odel als enums

und dann

UCSRC |= USE_UCSRC | UART_8BIT;

Aber jeder wie es ihm gefällt...

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich geht es nur darum, dass die "3" gern überlesen wird, da
sich bei solchen Sachen meist ein "1" im linken Teil der Klammer
befindet. Somit würde ein andere USART-Modus eingestellt werden...

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.