Forum: Mikrocontroller und Digitale Elektronik Fehlermeldungen UART


von A. R. (and)


Lesenswert?

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...

von NSA (Gast)


Lesenswert?

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.

von A. R. (and)


Lesenswert?

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
}

von Project HC (Gast)


Lesenswert?

Richtigen Prozessor gewählt?

von m.n. (Gast)


Lesenswert?

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.

von A. R. (and)


Lesenswert?

Habe bei Erstellen des  Programm Atmega 1284P.
Habe es aber jetzt noch nicht drauf geladen. Habe erstmal nur Compile.

von Stefan E. (sternst)


Lesenswert?

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.

von Sebastian V. (sebi_s)


Lesenswert?

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.

von A. R. (and)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

A. R. schrieb:
> Erro´s

Hier ist der Apostel zumindest nicht ganz verkehrt ;-)

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> #define BAUD 9200UL        //Baudrate

meinst du wirklich 9200?
oder doch eher 9600 oder 19200?

von A. R. (and)


Lesenswert?

Nein, sollte eigentlich 9600 sein...

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.