www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART GCC-AVR ?


Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich hab nen Problem hab mir das Programm aus dem tut zusammengestellt 
und wollt es testen nun weis ich nicht mehr weiter?
/*  UART-Init: 
Berechnung des Wertes für das Baudratenregister 
aus Taktrate und gewünschter Baudrate
*/
 
#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif 
 
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
   verwendet wird und dort eine andere, nicht zur Hardware passende 
   Taktrate eingestellt ist: Dann wird die folgende Definition 
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
#define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                         // Ohne ergeben sich unten Fehler in der Berechnung
#endif
 
#define BAUD 9600UL      // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif 


#include <avr/io.h> 




/* 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;
}

int main (void) 
{


// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&nbsp;B. fuer ATmega16:
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
    {
    }
 
    UDR = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */


return 0; // never reached 
 
}
Build started 10.1.2011 at 22:46:23
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
../test.c:19:2: warning: #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
../test.c: In function 'uart_init':
../test.c:45: error: 'UCSRB' undeclared (first use in this function)
../test.c:45: error: (Each undeclared identifier is reported only once
../test.c:45: error: for each function it appears in.)
../test.c:45: error: 'TXEN' undeclared (first use in this function)
../test.c:46: error: 'UCSRC' undeclared (first use in this function)
../test.c:46: error: 'URSEL' undeclared (first use in this function)
../test.c:46: error: 'UCSZ1' undeclared (first use in this function)
../test.c:46: error: 'UCSZ0' undeclared (first use in this function)
../test.c:48: error: 'UBRRH' undeclared (first use in this function)
../test.c:49: error: 'UBRRL' undeclared (first use in this function)
../test.c: In function 'main':
../test.c:57: error: 'UCSRA' undeclared (first use in this function)
../test.c:57: error: 'UDRE' undeclared (first use in this function)
../test.c:61: error: 'UDR' undeclared (first use in this function)
make: *** [test.o] Fehler 1
Build failed with 13 errors and 1 warnings...

Autor: Kasperle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es fehlt die include Datei für deine CPU.

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht das nicht schon drin?

#include <avr/io.h>

Autor: Kasperle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche CPU hast du?

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ATmega644 8Mhz

Autor: Kasperle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für eine IDE?

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UCSR0B, TXEN0, .. Rest steht im Datenplatt :-)

HTH

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR Studio STK500

im tut http://www.mikrocontroller.net/articles/AVR-GCC-Tu... 
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;
}

Autor: Oliver Ju. (skriptkiddy)
Datum:

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

Autor: g457 (Gast)
Datum:

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

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe's mir mal angeschaut.
/* 
  UART-Init: 
Berechnung des Wertes für das Baudratenregister 
aus Taktrate und gewünschter Baudrate
*/
 
#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif 
 
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
   verwendet wird und dort eine andere, nicht zur Hardware passende 
   Taktrate eingestellt ist: Dann wird die folgende Definition 
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
#define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                         // Ohne ergeben sich unten Fehler in der Berechnung
#endif
 
#define BAUD 9600UL      // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif 


#include <avr/io.h> 
#include <avr/interrupt.h>





void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH0 = (unsigned char)(baud>>8);
UBRRL0 = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);

int main (void) 
{

USART_Init( BAUD ) ;


// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&nbsp;B. fuer ATmega16:
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich                   */
    {
    }
 
    UDR = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */


return 0; // never reached 
 
}
Build started 11.1.2011 at 22:59:12
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
../test.c:19:2: warning: #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
../test.c: In function 'USART_Init':
../test.c:46: error: 'UBRRH0' undeclared (first use in this function)
../test.c:46: error: (Each undeclared identifier is reported only once
../test.c:46: error: for each function it appears in.)
../test.c:47: error: 'UBRRL0' undeclared (first use in this function)
../test.c:53: warning: 'main' is normally a non-static function
../test.c: In function 'main':
../test.c:64: error: 'UDR' undeclared (first use in this function)
../test.c: In function 'USART_Init':
../test.c:69: error: expected declaration or statement at end of input
make: *** [test.o] Fehler 1
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/...
Seite 170

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UBRRH0 -> UBRR0H
UBRRL0 -> UBRR0L
UDR -> UDR0

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

Autor: F. H. (at90s1200)
Datum:

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

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist den nun los?
/* 
  UART-Init: 
Berechnung des Wertes für das Baudratenregister 
aus Taktrate und gewünschter Baudrate
*/
 
#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif 
 
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
   verwendet wird und dort eine andere, nicht zur Hardware passende 
   Taktrate eingestellt ist: Dann wird die folgende Definition 
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
#define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                         // Ohne ergeben sich unten Fehler in der Berechnung
#endif
 
#define BAUD 9600UL      // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif 


#include <avr/io.h> 
#include <avr/interrupt.h>





void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRR0H = (unsigned char)(baud>>8);
UBRR0L = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);

int main (void) {

USART_Init( BAUD ) ;


// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&nbsp;B. fuer ATmega16:
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich                   */
    {
    }
 
    UDR0 = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */

 return 0;                 
}
Build started 11.1.2011 at 23:25:43
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
../test.c:19:2: warning: #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
../test.c: In function 'USART_Init':
../test.c:53: warning: 'main' is normally a non-static function
../test.c:66: error: expected declaration or statement at end of input
make: *** [test.o] Fehler 1
Build failed with 1 errors and 2 warnings...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Sortiere deine '{}'.

MfG Spess

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke das hab ich völlig über Sehen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: F. H. (at90s1200)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: F. H. (at90s1200)
Datum:

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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);

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

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/* 
  UART-Init: 
Berechnung des Wertes für das Baudratenregister 
aus Taktrate und gewünschter Baudrate
*/
 
#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif 
 
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
   verwendet wird und dort eine andere, nicht zur Hardware passende 
   Taktrate eingestellt ist: Dann wird die folgende Definition 
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
#define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                         // Ohne ergeben sich unten Fehler in der Berechnung
#endif
 
#define BAUD 9600UL      // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif 


#include <avr/io.h> 
#include <avr/interrupt.h>





void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRR0H = (unsigned char)(baud>>8);
UBRR0L = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}

int main (void) {

USART_Init( BAUD ) ;


// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&nbsp;B. fuer ATmega16:
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich                   */
    {
    }
 
    UDR0 = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */

 return 0;                 
}


ok mit 2 Stopp Bits eingestellt.

Es geht immer noch nicht.

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pd0/1 verbunden?

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
richtig verbunden?

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jopp

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...
WIE verbunden?

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

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PD0 auf RxD und PD1 auf TxD.

Autor: Michael H. (michael_h45)
Datum:

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

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie meinst du das ?

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau so, wie ich es geschrieben hab.

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss die Funkzion irgendwie auf Rufen und einen wert übergeben.

Autor: Floh (Gast)
Datum:

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

Autor: F. H. (at90s1200)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sam mal was soll das den ich habe das doch aus dem TUT 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Wie soll man den das blicken?

Autor: F. H. (at90s1200)
Datum:

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

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Avr Atmel schrieb:
> Sam mal was soll das den ich habe das doch aus dem TUT
> http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
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.

Autor: F. H. (at90s1200)
Datum:

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

Autor: F. H. (at90s1200)
Datum:

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

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

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.