www.mikrocontroller.net

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


Autor: Mäx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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

Autor: Jan M. (mueschel)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Mäx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welches Datenblatt bzw. welchen µC benutzt du?

Autor: Mäx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Manuel Stahl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timmo H. (masterfx)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mäx (Gast)
Datum:

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

Autor: Mäx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mäx (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

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.