Verständnisprobleme mit UART und C

Gast #1016525
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
Gast #1016556
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
Gast #1016597
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.
#1016603
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
}
Persönliche Seite #1016621
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
Persönliche Seite #1016637
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren