Forum: Mikrocontroller und Digitale Elektronik UART GCC-AVR ?


von F. H. (at90s1200)


Lesenswert?

Hi

Ich hab nen Problem hab mir das Programm aus dem tut zusammengestellt 
und wollt es testen nun weis ich nicht mehr weiter?
1
/*  UART-Init: 
2
Berechnung des Wertes für das Baudratenregister 
3
aus Taktrate und gewünschter Baudrate
4
*/
5
 
6
#ifndef F_CPU
7
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
8
   F_CPU im Makefile definiert werden, eine nochmalige Definition
9
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
10
   #ifndef/#endif 
11
 
12
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
13
   verwendet wird und dort eine andere, nicht zur Hardware passende 
14
   Taktrate eingestellt ist: Dann wird die folgende Definition 
15
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
16
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
17
   noch nicht definiert: */
18
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
19
#define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
20
                         // Ohne ergeben sich unten Fehler in der Berechnung
21
#endif
22
 
23
#define BAUD 9600UL      // Baudrate
24
 
25
// Berechnungen
26
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
27
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
28
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
29
 
30
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
31
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
32
#endif 
33
34
35
#include <avr/io.h> 
36
37
38
39
40
/* UART-Init Bsp. ATmega16 */
41
 
42
void uart_init(void)
43
{
44
  UCSRB |= (1<<TXEN);  // UART TX einschalten
45
  UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
46
 
47
  UBRRH = UBRR_VAL >> 8;
48
  UBRRL = UBRR_VAL & 0xFF;
49
}
50
51
int main (void) 
52
{
53
54
55
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&nbsp;B. fuer ATmega16:
56
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
57
    {
58
    }
59
 
60
    UDR = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
61
62
63
return 0; // never reached 
64
 
65
}
1
Build started 10.1.2011 at 22:46:23
2
avr-gcc  -mmcu=atmega644 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT test.o -MF dep/test.o.d  -c  ../test.c
3
../test.c:19:2: warning: #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
4
../test.c: In function 'uart_init':
5
../test.c:45: error: 'UCSRB' undeclared (first use in this function)
6
../test.c:45: error: (Each undeclared identifier is reported only once
7
../test.c:45: error: for each function it appears in.)
8
../test.c:45: error: 'TXEN' undeclared (first use in this function)
9
../test.c:46: error: 'UCSRC' undeclared (first use in this function)
10
../test.c:46: error: 'URSEL' undeclared (first use in this function)
11
../test.c:46: error: 'UCSZ1' undeclared (first use in this function)
12
../test.c:46: error: 'UCSZ0' undeclared (first use in this function)
13
../test.c:48: error: 'UBRRH' undeclared (first use in this function)
14
../test.c:49: error: 'UBRRL' undeclared (first use in this function)
15
../test.c: In function 'main':
16
../test.c:57: error: 'UCSRA' undeclared (first use in this function)
17
../test.c:57: error: 'UDRE' undeclared (first use in this function)
18
../test.c:61: error: 'UDR' undeclared (first use in this function)
19
make: *** [test.o] Fehler 1
20
Build failed with 13 errors and 1 warnings...

von Kasperle (Gast)


Lesenswert?

Es fehlt die include Datei für deine CPU.

von F. H. (at90s1200)


Lesenswert?

Steht das nicht schon drin?

#include <avr/io.h>

von Kasperle (Gast)


Lesenswert?

Welche CPU hast du?

von F. H. (at90s1200)


Lesenswert?

ATmega644 8Mhz

von Kasperle (Gast)


Lesenswert?

Was für eine IDE?

von g457 (Gast)


Lesenswert?

UCSR0B, TXEN0, .. Rest steht im Datenplatt :-)

HTH

von F. H. (at90s1200)


Lesenswert?

AVR Studio STK500

im tut http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART 
steht

/* UART-Init Bsp. ATmega48 */

void uart_init(void)
{
  UBRR0 = UBRR_VAL;
  UCSR0B |= (1<<TXEN0);
  // Frame Format: Asynchron 8N1
  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
}

Und da ich den ATmega644 habe nem ich mal an das ich das brauche

/* UART-Init Bsp. ATmega16 */

void uart_init(void)
{
  UCSRB |= (1<<TXEN);  // UART TX einschalten
  UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1

  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;
}

von Oliver J. (skriptkiddy)


Lesenswert?

Avr Atmel schrieb:
> Und da ich den ATmega644 habe nem ich mal an das ich das brauche

Nicht annemen, sondern im Datenblatt nachschlagen. Die Register und 
Bits beziehen sich auf USART0. Weshalb das n der ganzen Bezeichnungen 
durch 0 ersetzt werden muss.

Gruß Skriptkiddy

von g457 (Gast)


Lesenswert?

So, nochmal ein kleiner Wink mit dem Zahnpfahl: Kuck ins Datenplatt vom 
m644, da steht das drin wie die heissen (nein, ich such Dir die jetzt 
nicht raus, obwohl ichs sogar auswendig wüsste). Die Codestücke im 
Tutorial sind nur Beispiele, im Speziellen genau für die angegebenen 
µCs.

HTH

von F. H. (at90s1200)


Lesenswert?

So habe's mir mal angeschaut.
1
/* 
2
  UART-Init: 
3
Berechnung des Wertes für das Baudratenregister 
4
aus Taktrate und gewünschter Baudrate
5
*/
6
 
7
#ifndef F_CPU
8
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
9
   F_CPU im Makefile definiert werden, eine nochmalige Definition
10
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
11
   #ifndef/#endif 
12
 
13
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
14
   verwendet wird und dort eine andere, nicht zur Hardware passende 
15
   Taktrate eingestellt ist: Dann wird die folgende Definition 
16
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
17
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
18
   noch nicht definiert: */
19
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
20
#define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
21
                         // Ohne ergeben sich unten Fehler in der Berechnung
22
#endif
23
 
24
#define BAUD 9600UL      // Baudrate
25
 
26
// Berechnungen
27
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
28
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
29
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
30
 
31
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
32
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
33
#endif 
34
35
36
#include <avr/io.h> 
37
#include <avr/interrupt.h>
38
39
40
41
42
43
void USART_Init( unsigned int baud )
44
{
45
/* Set baud rate */
46
UBRRH0 = (unsigned char)(baud>>8);
47
UBRRL0 = (unsigned char)baud;
48
/* Enable receiver and transmitter */
49
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
50
/* Set frame format: 8data, 2stop bit */
51
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
52
53
int main (void) 
54
{
55
56
USART_Init( BAUD ) ;
57
58
59
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&nbsp;B. fuer ATmega16:
60
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich                   */
61
    {
62
    }
63
 
64
    UDR = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
65
66
67
return 0; // never reached 
68
 
69
}
1
Build started 11.1.2011 at 22:59:12
2
avr-gcc  -mmcu=atmega644 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT test.o -MF dep/test.o.d  -c  ../test.c
3
../test.c:19:2: warning: #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
4
../test.c: In function 'USART_Init':
5
../test.c:46: error: 'UBRRH0' undeclared (first use in this function)
6
../test.c:46: error: (Each undeclared identifier is reported only once
7
../test.c:46: error: for each function it appears in.)
8
../test.c:47: error: 'UBRRL0' undeclared (first use in this function)
9
../test.c:53: warning: 'main' is normally a non-static function
10
../test.c: In function 'main':
11
../test.c:64: error: 'UDR' undeclared (first use in this function)
12
../test.c: In function 'USART_Init':
13
../test.c:69: error: expected declaration or statement at end of input
14
make: *** [test.o] Fehler 1
15
Build failed with 6 errors and 2 warnings...

Bin jetzt mithilfe des Daten Blatts vor gegangen und kan den Fehler 
nicht, finden 
http://www.atmel.com/dyn/resources/prod_documents/doc2593.pdf
Seite 170

von holger (Gast)


Lesenswert?

UBRRH0 -> UBRR0H
UBRRL0 -> UBRR0L
UDR -> UDR0

Sowas müsste eigentlich auch ein Vollspacke
im Datenblatt finden.

von F. H. (at90s1200)


Lesenswert?

C Code Example(1)
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);
}

Danke für die Beschreibung.

von F. H. (at90s1200)


Lesenswert?

Was ist den nun los?
1
/* 
2
  UART-Init: 
3
Berechnung des Wertes für das Baudratenregister 
4
aus Taktrate und gewünschter Baudrate
5
*/
6
 
7
#ifndef F_CPU
8
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
9
   F_CPU im Makefile definiert werden, eine nochmalige Definition
10
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
11
   #ifndef/#endif 
12
 
13
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
14
   verwendet wird und dort eine andere, nicht zur Hardware passende 
15
   Taktrate eingestellt ist: Dann wird die folgende Definition 
16
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
17
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
18
   noch nicht definiert: */
19
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
20
#define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
21
                         // Ohne ergeben sich unten Fehler in der Berechnung
22
#endif
23
 
24
#define BAUD 9600UL      // Baudrate
25
 
26
// Berechnungen
27
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
28
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
29
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
30
 
31
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
32
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
33
#endif 
34
35
36
#include <avr/io.h> 
37
#include <avr/interrupt.h>
38
39
40
41
42
43
void USART_Init( unsigned int baud )
44
{
45
/* Set baud rate */
46
UBRR0H = (unsigned char)(baud>>8);
47
UBRR0L = (unsigned char)baud;
48
/* Enable receiver and transmitter */
49
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
50
/* Set frame format: 8data, 2stop bit */
51
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
52
53
int main (void) {
54
55
USART_Init( BAUD ) ;
56
57
58
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&nbsp;B. fuer ATmega16:
59
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich                   */
60
    {
61
    }
62
 
63
    UDR0 = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
64
65
 return 0;                 
66
}
1
Build started 11.1.2011 at 23:25:43
2
avr-gcc  -mmcu=atmega644 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT test.o -MF dep/test.o.d  -c  ../test.c
3
../test.c:19:2: warning: #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
4
../test.c: In function 'USART_Init':
5
../test.c:53: warning: 'main' is normally a non-static function
6
../test.c:66: error: expected declaration or statement at end of input
7
make: *** [test.o] Fehler 1
8
Build failed with 1 errors and 2 warnings...

von holger (Gast)


Lesenswert?

UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}

von Spess53 (Gast)


Lesenswert?

Hi

Sortiere deine '{}'.

MfG Spess

von F. H. (at90s1200)


Lesenswert?

Danke das hab ich völlig über Sehen.

von Karl H. (kbuchegg)


Lesenswert?

Avr Atmel schrieb:
> Danke das hab ich völlig über Sehen.


Woran man erkennt, wie wichtig ein konsistentes Einrückschema ist. Dann 
übersieht man sowas nämlich nicht.

von F. H. (at90s1200)


Lesenswert?

Ok das Programm konnte ich jetzt auf den Kontroller schieben nun habe 
ich es mit meinem AVR STK500 getestet ich habe einen 8Mhz Quarz und eine 
ATmega644 die Jumper und die Pin RxD, TxD Verbindung ist auch gesetzt 
ich habe es auch mal gedreht um Fehler aus zu schissen, ich habe das 
HyperTerminel verwendet mit den üblichen ein Stellungen 9600 baud kein 
stop bit usw...

Nun meine bitte Kent einer ein Test Programm um zu prüfen ob die 
Hardware in tagt ist ich finde im Moment keinen Fehler.

Danke.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Bei deinem Programm kommt maximal ein einziges einsames x auf dem PC 
an. Um UART zu testen, ist es sinnvoll, dass der AVR dauernd also in 
einer Schleife was sendet... Und wenn du Zweifel an der Hardware hast, 
kannst du Angaben zur Hardware machen und andere z.B. den Schaltplan 
prüfen lassen.

von F. H. (at90s1200)


Lesenswert?

Das ist ja das Problem es kommt gar nix an und ich habe ein STK500 von 
ATMEL.
Also was kan da sein das Es nicht lauft??

von Huch (Gast)


Lesenswert?

Stefan meint, das Du den Code so ändern sollst, dass der uC 
hintereinander immer wieder ein Zeichen sendet.
Prüfe bitte auch Deine Einstellungen für das Rahmenformat.
1
/* Set frame format: 8data, 2stop bit */
2
UCSR0C = (1<<USBS0)|(3<<UCSZ00);

2 Stop Bits sind eher ungewöhnlich. Prüfe ob Dein Terminalprogramm auch 
auf 2 Stop Bits eingestellt ist.

von F. H. (at90s1200)


Lesenswert?

1
/* 
2
  UART-Init: 
3
Berechnung des Wertes für das Baudratenregister 
4
aus Taktrate und gewünschter Baudrate
5
*/
6
 
7
#ifndef F_CPU
8
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
9
   F_CPU im Makefile definiert werden, eine nochmalige Definition
10
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
11
   #ifndef/#endif 
12
 
13
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
14
   verwendet wird und dort eine andere, nicht zur Hardware passende 
15
   Taktrate eingestellt ist: Dann wird die folgende Definition 
16
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
17
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
18
   noch nicht definiert: */
19
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
20
#define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
21
                         // Ohne ergeben sich unten Fehler in der Berechnung
22
#endif
23
 
24
#define BAUD 9600UL      // Baudrate
25
 
26
// Berechnungen
27
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
28
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
29
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
30
 
31
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
32
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
33
#endif 
34
35
36
#include <avr/io.h> 
37
#include <avr/interrupt.h>
38
39
40
41
42
43
void USART_Init( unsigned int baud )
44
{
45
/* Set baud rate */
46
UBRR0H = (unsigned char)(baud>>8);
47
UBRR0L = (unsigned char)baud;
48
/* Enable receiver and transmitter */
49
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
50
/* Set frame format: 8data, 2stop bit */
51
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
52
}
53
54
int main (void) {
55
56
USART_Init( BAUD ) ;
57
58
59
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&nbsp;B. fuer ATmega16:
60
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich                   */
61
    {
62
    }
63
 
64
    UDR0 = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
65
66
 return 0;                 
67
}

ok mit 2 Stopp Bits eingestellt.

Es geht immer noch nicht.

von Michael H. (michael_h45)


Lesenswert?

pd0/1 verbunden?

von F. H. (at90s1200)


Lesenswert?

ja

von Michael H. (michael_h45)


Lesenswert?

richtig verbunden?

von F. H. (at90s1200)


Lesenswert?

jopp

von Michael H. (michael_h45)


Lesenswert?

...
WIE verbunden?

rx/tx zwischen rs232-stiftleiste und port-stiftleiste nicht gekreuzt?

von F. H. (at90s1200)


Lesenswert?

PD0 auf RxD und PD1 auf TxD.

von Michael H. (michael_h45)


Lesenswert?

ach... jetzt seh ichs erst...
1
USART_Init( BAUD ) ;
ist total sinnlos.
den rest überlass ich dir.

von F. H. (at90s1200)


Lesenswert?

wie meinst du das ?

von Michael H. (michael_h45)


Lesenswert?

genau so, wie ich es geschrieben hab.

von F. H. (at90s1200)


Lesenswert?

Ich muss die Funkzion irgendwie auf Rufen und einen wert übergeben.

von Floh (Gast)


Lesenswert?

Du musst die Baudrate ja fürs Register UBRR umrechnen, daher gibts das 
da:
> #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden

daher ist das falsch:

> /* Set baud rate */
> UBRR0H = (unsigned char)(baud>>8);
> UBRR0L = (unsigned char)baud;

von F. H. (at90s1200)


Lesenswert?

Sam mal was soll das den ich habe das doch aus dem TUT 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART

Wie soll man den das blicken?

von F. H. (at90s1200)


Lesenswert?

Inzwischen gibt es in der avr-libc Makros für obige Berechnung der UBRR 
Registerwerte aus Taktrate F_CPU und Baudrate BAUD in der Includedatei 
<util/setbaud.h> ([3]). Der berechnete Wert kann dann einfach über das 
Makro UBRR_VALUE aufgerufen werden.

von Michael H. (michael_h45)


Lesenswert?

Avr Atmel schrieb:
> Sam mal was soll das den ich habe das doch aus dem TUT
> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART
nö, hast du nicht.
beschwer dich nicht, wenn du nur zu dumm zum abschreiben bist.

kein bitte, kein danke*, motzen übers tutorial und nicht mal das 
datenblatt lesen können.
da muss tacheles mal gestattet sein.

*) ich brauchs nicht, aber wenigstens beim floh hätte er sich für so 
eine kleingekaute antwort bedanken können.

von F. H. (at90s1200)


Lesenswert?

Sorry aber ich blick einfach nicht durch das ist doch nicht eure Schuld. 
(-;

Nun wen ich eine Antwort bekomme und sie nicht verstehe kan ich mich 
nicht bedanken, natürlich ist es echt nett das ihr euere Hilfe leistet 
nur bin ich gerade verwirrt in meinem progam stechen anscheinend zwei 
arten einer initialisierung des UART die ineinander über Gehen.

von F. H. (at90s1200)


Lesenswert?

Avr Atmel schrieb:
> Sam mal was soll das den ich habe das doch aus dem TUT
> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART
>
> Wie soll man den das blicken?

Meine Aussage bezog sich auf das tut und nicht auf den Floh er hat ja 
recht.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Kann passieren.

Das eine Tutorial (das AVR-GCC-Tutorial) benutzt eine uart_init() ohne 
Argumente (void). Dafür wird die gewünschte Baudrate BAUD definiert und 
dann werden die Hardwareregisterwerte für diese Baudrate aus der 
Wunschbaudrate und der Taktfrequenz F_CPU zur Compilezeit über Makros 
berechnet. Den berechneten Wert UBRR_VAL verwendet die uart_init().

Und andere Tutorials haben eine uart_init(), bei der man die gewünschte 
Baudrate BAUD als Funktionsargument übergibt. Innerhalb der Funktion 
werden dann die Hardwareregisterwerte zur Laufzeit berechnet.

Und wieder andere Tutorials haben eine uart_init(), bei der man die 
berechneten Hardwareregisterwerte als Funktionsargument übergibt. Die 
Hardwareregisterwerte  kann man zur Compilezeit berechnet haben oder zur 
Laufzeit. Der Code deiner USART_init() kommt dem am nächsten.

Aber du hast eine "vierte" Möglichkeit erfunden: Du übergibt direkt die 
Wunschbaudrate (BAUD), aber du berechnest nicht die 
Hardwareregisterwerte sondern schreibst die Wunschbaudrate direkt in die 
Hardwareregister. Das kann nicht gehen.

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.