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


von Friedrich Kemper (Gast)


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

von Marian (Gast)


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?

von Friedrich Kemper (Gast)


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

von Marian (Gast)


Lesenswert?

Danke

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

von Rahul (Gast)


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...

von Dirk D. (dirkd)


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

von Dirk D. (dirkd)


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...

von Rahul (Gast)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.