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. 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)
10.01.2011 23:07
Es fehlt die include Datei für deine CPU.
Steht das nicht schon drin?
#include <avr/io.h>
von
Kasperle (Gast)
10.01.2011 23:14
von
Kasperle (Gast)
10.01.2011 23:27
von
g457 (Gast)
10.01.2011 23:28
UCSR0B, TXEN0, .. Rest steht im Datenplatt :-)
HTH
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;
}
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)
10.01.2011 23:45
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
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. 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)
11.01.2011 23:15
UBRRH0 -> UBRR0H
UBRRL0 -> UBRR0L
UDR -> UDR0
Sowas müsste eigentlich auch ein Vollspacke
im Datenblatt finden.
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.
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. 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)
11.01.2011 23:36
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}
von
Spess53 (Gast)
11.01.2011 23:39
Hi
Sortiere deine '{}'.
MfG Spess
Danke das hab ich völlig über Sehen.
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.
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.
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.
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)
16.01.2011 19:27
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.
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. 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.
...
WIE verbunden?
rx/tx zwischen rs232-stiftleiste und port-stiftleiste nicht gekreuzt?
PD0 auf RxD und PD1 auf TxD.
ach... jetzt seh ichs erst...
ist total sinnlos.
den rest überlass ich dir.
genau so, wie ich es geschrieben hab.
Ich muss die Funkzion irgendwie auf Rufen und einen wert übergeben.
von
Floh (Gast)
16.01.2011 22:30
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;
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?
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.
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.
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.
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.
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.