Forum: Mikrocontroller und Digitale Elektronik Verständnisprobleme mit UART und C


von Mäx (Gast)


Lesenswert?

Hey Leute,
ich habe vor kurzem angefangen mich mit microcontrollern zu 
beschäftigen...
nun wollte ich über UART & C mit dem Rechner kommunizieren.
Jedoch habe ich Probleme bei der initialisierung des UART. Auch das 
AVR-GCC-Tut konnte mir nicht weiterhelfen!
Nun versuche ich es also hier ;)
wie kann ich das Format festlegen? also wieviele Daten-,Stop-bits und ob 
ich parity-Bit haben will oder nicht? Über google habe ich folgendes 
gefunden:
1
UCSRnC = (1<<USBSn)|(3<<UCSZn0);
UCSR ist denke ich dabei das Kontrollregister? Und das USBSn hat was mit 
den stop-bits zu tun, das UCsZn0 etwas mit der Anzahl der erwünschten 
Datenbit.
Aber wieso werden die jeweils bitweise verschoben? Und was steht bei der 
initialisierung in den USBSn bzw UCSZn0 drinnen?
Hoffe ihr könnt mir helfen und die Frage ist nicht zu doof ;)
schonmal danke
Määx

von Jan M. (mueschel)


Lesenswert?

Im Datenblatt zu deinem Controller stehen alle Register ausfuehrlich 
erklaert, auch mit den hier verwendeten Namen.

von Johannes M. (johnny-m)


Lesenswert?


von Mäx (Gast)


Lesenswert?

erstmal Danke für die schnellen Antworten... leider verstehe ich das 
ganze immer noch nicht.
Im Datenblatt steht als Erklärung nur:
The frame format used by the USART is set by the UCSZn2:0, UPMn1:0 and 
USBSn bits inUCSRnB and UCSRnC. [...]
The USART Character SiZe (UCSZn2:0) bits select the number of data bits 
in the frame. The selection between one or two stop bits is done by the 
USART Stop Bit Select (USBSn) bit.
Hatte das Anfangs so verstanden, das ich wenn ich Datenbits 0-4 benutzen 
möchte UCSZn2:0 auf 0 setze, wenn ich 0-4 haben will muss UCSZn2:1 auf 0 
und UCSZn0 auf 1 ... und für Datenbits 0-8 muss UCSZn2:0 auf 1 gesetzt 
sein.
Un das das USBSn auf 0 für 1 stop bit und auf 1 für 2 stopbits stehen 
muss.
Aber wieso wird in dem Bsp. das alles in das UCSRnC abgespeichert.
und was steht anfangs in den Registern drinnen? Also um wieviel wird die 
1 bzw. die 3 verschoben?
Dazu kann ich im Datenblatt halt nix finden!
nochmal Danke
  Määx

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Welches Datenblatt bzw. welchen µC benutzt du?

von Mäx (Gast)


Lesenswert?


von Manuel Stahl (Gast)


Lesenswert?

Also erst mal, das kleine n in den Registern ist nur ein Platzhalter für 
die Nummer deiner UART, also vermutlich 0.

UCSZn2:1 bedeutet das Bit 1 im Register UCSZn2. Wenn du das auf 1 setzen 
willst schreibst du

UCSZn2 |= (1 << 1);

Die hintere 1 ist beim GCC schon mit der Bezeichnung des Bits 
vordefiniert.

von Timmo H. (masterfx)


Lesenswert?

Steht da doch perfekt beschrieben:
1
void USART_Init( unsigned int baud )
2
{
3
/* Set baud rate */
4
UBRRHn = (unsigned char)(baud>>8);
5
UBRRLn = (unsigned char)baud;
6
/* Enable receiver and transmitter */
7
UCSRnB = (1<<RXENn)|(1<<TXENn);
8
/* Set frame format: 8data, 2stop bit */
9
UCSRnC = (1<<USBSn)|(3<<UCSZn0);
10
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das Frameformat ist unter 17.4 beschrieben.

Ein Frame besteht aus

1 Startbit
5,6,7,8 oder 9 Datenbits
0 oder 1 Paritätsbit
1 oder 2 Stoppbits

Wichtig ist bei der Anzahl der Datenbits ist die Tabelle 17-7.

Die Tabelle gibt an welche Bits UCSZn0 (in Register UCSRnB), UCSZn1 (in 
Register UCSRnC) und UCSZn2 (in Register UCSRnB) gesetzt werden müssen.

Angenommen du willst die gängigste Variante 8-Bit für UART0 haben, dann 
wäre einzustellen:

UCSR0C = (1<<TXEN0) | (1<<RXEN0);   // Senden und Empfangen erlauben
UCSR0B = (1<<UCSZ01) | (1<<UCSZ00); // Frameformat 8N1

von Mäx (Gast)


Lesenswert?

aber wie könnte ich dem jetzt sagen, dass ich gerne 5oder 9 databits 
hätte und nur 1 stopbit?

von Mäx (Gast)


Lesenswert?

ok, sry hatte stefans post net gesehen... die tabelle 17-7 ist hilfreich 
:)
aber müsste das dann nicht:
UCSR0B = (1<<UCSZ01) | (1<<UCSZ02);
für das Frameformat sein?

von Mäx (Gast)


Lesenswert?

nein ok, schon wieder mein Fehler.... habs jetzt verstanden glaub ich!
Danke an alle ;)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ups da hatte ich einen Fehler oben (2x UCSZ01)

9N1: 9 Datenbits, kein Paritätsbit, 1 Stoppbit

UCSR0B = (1<<TXEN0) | (1<<RXEN0) | (1<<UCSZ02);   // Senden und 
Empfangen erlauben
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00); // Frameformat 9N1

9N2: 9 Datenbits, kein Paritätsbit, 2 Stoppbit

UCSR0B = (1<<TXEN0) | (1<<RXEN0) | (1<<UCSZ02);   // Senden und 
Empfangen erlauben
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00) | (1<<USBS0); // Frameformat 9N2

Und das Senden/Empfangen wird aufwändiger, weil TXB8n in UCSRnB 
geschrieben werden muss und RXB8n in UCSRnB gelesen werden muss.

EDIT: Was schreibe ich denn für'n Mist. Komplett die Register 
verwechselt! Korrigiert mit Abschnitt 17.10.3 und 17.10.4. Jetzt 
reicht's!

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.