USART initialisieren

OP #3160079
Lesenswert?
• ▲
▼
Hallo, um USART zu initialisieren verwendet man folgende c-code 
(Datenblatt)
1
#define FOSC 1843200// Clock Speed
2
#define BAUD 9600
3
#define MYUBRR FOSC/16/BAUD-1
4
void main( void )
5
{
6
...
7
USART_Init ( MYUBRR );
8
...
9
}
10
void USART_Init( unsigned int ubrr )
11
{
12
/* Set baud rate */
13
UBRRH = (unsigned char)(ubrr>>8);
14
UBRRL = (unsigned char)ubrr;
15
/* Enable receiver and transmitter */
16
UCSRB = (1<<RXEN)|(1<<TXEN);
17
/* Set frame format: 8data, 2stop bit */
18
UCSRC = (1<<USBS)|(3<<UCSZ0);
19
}

den Ausdruck
/* Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;

kann ich aber nicht komplett nachvollziehen.. was macht man damit, was 
heisst (ubrr>>8)? setzt man die Baud rate eigentlich nicht mit
#define BAUD 9600 ?

Datenblatt und co bringt leider auch nicht viel weiter
Gruß
Gast #3160097
Lesenswert?
• ▲
▼
Alex S. schrieb:

> den Ausdruck
> /* Set baud rate */
> UBRRH = (unsigned char)(ubrr>>8);
> UBRRL = (unsigned char)ubrr;
>
> kann ich aber nicht komplett nachvollziehen.. was macht man damit, was
> heisst (ubrr>>8)?

Wenn du Sprachen wie C benutzt, solltest du sie zuvor einfach mal 
lernen. Siehe beliebiges Buch über die Sprache C -> Operatoren.
Gast #3160111
Lesenswert?
• ▲
▼
>Datenblatt und co bringt leider auch nicht viel weiter
Dann schaue bitte noch einmal und diesmal gründlich nach.
Wie wird die Baudrate gesetzt?

Lies bitte auch ein C-Buch. Das steht was ">>" bedeutet.
(Firma: matzetronics) #3160112
Lesenswert?
• ▲
▼
In der Zeile unter dem Baudrate define wird dann der Wert ausgerechnet, 
den man in die Register des USART schreibt:
1
#define MYUBRR FOSC/16/BAUD-1
Da kommt ein Wert raus, dem man auf 2 Register (UBRRL und UBRRH) 
veteilen muss.
Genau das machen die Zeilen
1
 
2
UBRRH = (unsigned char)(ubrr>>8);
3
UBRRL = (unsigned char)ubrr;
wobei der Ausdruck (ubrr>>8) das obere Byte um 8 bit nach rechts schiebt 
und damit daraus ein Byte erzeugt.
Angenommen ubrr hat den Wert 0x789a, dann wird (ubrr>>8) zu 0x78, die 
unteren 8 bit verschwinden. Das Maskieren auf 8 bit macht der Compiler, 
da der weiss, das UBRRL und UBRRH lediglich Bytes aufnehmen können. 
UBRRL erhält in diesem Beispiel dann die 0x9a.

Antwort schreiben

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.

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.