Verständnis frage zum UART

Gast #268537
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
Gast #268538
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?
Gast #268539
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
Gast #268541
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...
#268542
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
#268543
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...
Gast #268544
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

Eine eigene Frage? Dieser Thread ist über 20 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.