Hallo, ich habe ein Programm erstellt mit dem ich eine UART Verbindung aufbauen möchte. Jedoch bekomme ich eine ganze Menge an Fehlern wenn ich den auf "Build" gehe. (AVR Studio 4.18) Was habe ich falsch gemacht. Der Quelltext stammt aus einem Tutorial. Sollte also theoretisch funktionieren? ----------------------------------------------- ----------------------------------------------- Hier die Fehler: rm -rf UART.o UART.elf dep/* UART.hex UART.eep UART.lss UART.map Build succeeded with 0 Warnings... avr-gcc -mmcu=atmega1284p -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT UART.o -MF dep/UART.o.d -c ../UART.c ../UART.c: In function 'uart_init': ../UART.c:14: error: 'UCSRB' undeclared (first use in this function) ../UART.c:14: error: (Each undeclared identifier is reported only once ../UART.c:14: error: for each function it appears in.) ../UART.c:14: error: 'RXEN' undeclared (first use in this function) ../UART.c:14: error: 'TXEN' undeclared (first use in this function) ../UART.c:15: error: 'UCSRC' undeclared (first use in this function) ../UART.c:15: error: 'URSEL' undeclared (first use in this function) ../UART.c:15: error: 'UCSZ0' undeclared (first use in this function) ../UART.c:17: error: 'UBRRH' undeclared (first use in this function) ../UART.c:18: error: 'UBRRL' undeclared (first use in this function) ../UART.c: In function 'uart_putc': ../UART.c:25: error: 'UCSRA' undeclared (first use in this function) ../UART.c:25: error: 'UDRE' undeclared (first use in this function) ../UART.c:26: error: 'UDR' undeclared (first use in this function) ../UART.c: In function 'uart_getc': ../UART.c:32: error: 'UCSRA' undeclared (first use in this function) ../UART.c:32: error: 'RXC' undeclared (first use in this function) ../UART.c:33: error: 'UDR' undeclared (first use in this function) ../UART.c: In function 'main': ../UART.c:48: error: 'length' undeclared (first use in this function) ../UART.c:71: warning: implicit declaration of function 'uart_puts' ../UART.c:74: error: 'UCSRA' undeclared (first use in this function) ../UART.c:74: error: 'UDRE' undeclared (first use in this function) ../UART.c:48: warning: unused variable 'string' make: *** [UART.o] Error 1 Build failed with 19 errors and 2 warnings...
Sieht aus als wär der Fehler in Zeile 42. Spaß beiseite, zeig dein Quellcode. Obwohl das anhand der Fehlermeldungen so aussieht, als hättest du vergessen eine bestimmte Headerdatei einzubinden.
1 | #define F_CPU 14745600UL // CPU Taktfrequenz
|
2 | #include <util/delay.h> // |
3 | #include <avr/io.h> // |
4 | |
5 | #define BAUD 9200UL //Baudrate
|
6 | #define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)
|
7 | |
8 | |
9 | //-----------------------
|
10 | //-----------------------
|
11 | |
12 | void uart_init(void) { |
13 | UCSRB = (1<<RXEN)|(1<<TXEN); // UART TX und RX einschalten |
14 | UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N1 |
15 | |
16 | UBRRH = (uint8_t) (UBRR_BAUD>>8); |
17 | UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff); |
18 | }
|
19 | |
20 | //-----------------------
|
21 | //-----------------------
|
22 | |
23 | void uart_putc(unsigned char c) { |
24 | while (!(UCSRA & (1<<UDRE))) {} // warten bis Senden möglich |
25 | UDR = c; // Zeichen senden |
26 | }
|
27 | |
28 | //-----------------------
|
29 | //-----------------------
|
30 | uint8_t uart_getc(void) { |
31 | while (!(UCSRA & (1<<RXC))) {} // warten bis Zeichen verfügbar |
32 | return UDR; // Zeichen aus UDR zurueckgeben |
33 | }
|
34 | |
35 | |
36 | |
37 | |
38 | //-----------------------
|
39 | //MAIN
|
40 | //-----------------------
|
41 | |
42 | |
43 | int main (void) { |
44 | uint8_t i; |
45 | char c; |
46 | char* s; |
47 | char string[length+1]; |
48 | |
49 | uart_init(); |
50 | |
51 | while(1) { |
52 | |
53 | s=string; |
54 | i=0; |
55 | |
56 | do { |
57 | c=uart_getc(); |
58 | if (c!='\r') { |
59 | *s=c; |
60 | uart_putc( c ); |
61 | s++; |
62 | i++; |
63 | }
|
64 | }
|
65 | |
66 | |
67 | while( i!=length && c!='\r'); |
68 | *s=0; |
69 | |
70 | uart_puts( "\r\n" ); |
71 | uart_puts( "eingegebender Text: " ); |
72 | uart_puts( string ); |
73 | while (!(UCSRA & (1<<UDRE))) {} |
74 | uart_puts( "\r\n" ); |
75 | |
76 | }
|
77 | |
78 | return (0); |
79 | }
|
Du hast wohl den falschen Prozessor gewählt, bzw. der Quellcode ist für einen anderen geschrieben. Ansstt UDR könnte auch UDR0 erwartet werden, zum Beispiel.
Habe bei Erstellen des Programm Atmega 1284P. Habe es aber jetzt noch nicht drauf geladen. Habe erstmal nur Compile.
A. R. schrieb: > Was habe ich falsch gemacht. Du hast einen Quelltext genommen, der für einen anderen AVR geschrieben wurde, und hast ihn nicht für deinen AVR angepasst. Ein Mega1284 hat z.B. nun mal kein Register UCSRB, aber ein UCSR0B und ein UCSR1B.
Anhand der Parameter vom Compiler vermute ich, dass du den atmega1284p verwendest. Dort gibt es aber die Register UCSRB usw. gar nicht. Dort gibt es z.B. UCSR0B und UCSR1B. Ähnliche Varianten mit Zahlen gibt es für die anderen Register auch. Da müsstest du selbst nochmal einen Blick ins Datenblatt werfen und zu erfahren welche Register du für welchen UART Port brauchst. Oder du suchst dir passenden Beispielcode für deinen Mikrocontroller.
Danke! Genau da scheint es dran zu liegen. Habe ja zwei UART Register. Da Beispiel war von meinem Atmega nur welcher nr ein UART Register hat. Habe schon einige Erro´s jetzt weniger.
> #define BAUD 9200UL //Baudrate
meinst du wirklich 9200?
oder doch eher 9600 oder 19200?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.