Forum: Compiler & IDEs UART Libary. Register sind undeclared


von Sören T. (stimmy)


Lesenswert?

Hallo Forum,

ich habe heute morgen versucht mein Programm zu ordnen.
Ich habe mir einen Artikel über Header durchgelesen und dann die beiden 
Dateien fabriziert. Leider kommen immer die Fehlermeldungen:
1
Error  1  'UBRR0H' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  7  3  test uart
2
Error  2  each undeclared identifier is reported only once for each function it appears in  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  7  3  test uart
3
Error  3  'F_CPU' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  7  13  test uart
4
Error  4  'BAUD' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  7  13  test uart
5
Error  5  'UBRR0L' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  8  3  test uart
6
Error  6  'UCSR0B' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  9  3  test uart
7
Error  7  'TXEN0' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  9  17  test uart
8
Error  8  'RXEN0' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  9  30  test uart
9
Error  9  'UCSR0C' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  11  3  test uart
10
Error  10  'UCSZ01' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  11  16  test uart
11
Error  11  'UCSZ00' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  11  28  test uart
12
Error  12  'UCSR0A' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  17  14  test uart
13
Error  13  'UDRE0' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  17  27  test uart
14
Error  14  'UDR0' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  21  5  test uart
15
Error  15  'UCSR0A' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  38  14  test uart
16
Error  16  'RXC0' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  38  27  test uart
17
Error  17  'UDR0' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  40  12  test uart
18
Warning  18  control reaches end of non-void function  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  41  1  test uart

Leider finde ich den Fehler nicht. Falls einer gerade Zeit hat, könnte 
er sich das ja mal ansehen.

Vielen Dank im voraus!!

Datein:
1
/*
2
 * uart_timmy.h
3
 *
4
 * Created: 10.12.2012 12:03:14
5
 *  Author: Timm
6
 */ 
7
8
9
#ifndef UART_TIMMY_H_
10
11
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
12
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
13
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
14
15
#define UART_TIMMY_H_
16
17
extern void uart_init(void);
18
extern int uart_putc(unsigned char c);
19
extern void uart_puts (char *s);
20
extern char uart_getc(void);
21
extern void uart_gets( char* Buffer, uint8_t MaxLen );
22
23
#endif /* UART_TIMMY_H_ */
1
#include <avr/io.h>
2
#include "uart_timmy.h"
3
4
5
void uart_init(void)
6
{
7
  UBRR0H = (UBRR_VAL>>8);
8
  UBRR0L =  UBRR_VAL;
9
  UCSR0B |= (1<<TXEN0) | (1<<RXEN0);// | (1<<RXCIE0);
10
  // Frame Format: Asynchron 8N1
11
  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
12
}  
13
14
15
int uart_putc(unsigned char c)
16
{
17
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
18
    {
19
    }                             
20
 
21
    UDR0 = c;                      /* sende Zeichen */
22
    return 0;
23
}
24
 
25
 
26
/* puts ist unabhaengig vom Controllertyp */
27
void uart_puts (char *s)
28
{
29
    while (*s)
30
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
31
        uart_putc(*s);
32
        s++;
33
    }
34
}
35
36
char uart_getc(void)
37
{
38
    while (!(UCSR0A & (1<<RXC0)))   // warten bis Zeichen verfuegbar
39
        ;
40
    return UDR0;                   // Zeichen aus UDR an Aufrufer zurueckgeben
41
}
42
43
void uart_gets( char* Buffer, uint8_t MaxLen )
44
{
45
  uint8_t NextChar;
46
  uint8_t StringLen = 0;
47
 
48
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
49
 
50
                                  // Sammle solange Zeichen, bis:
51
                                  // * entweder das String Ende Zeichen kam
52
                                  // * oder das aufnehmende Array voll ist
53
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
54
    *Buffer++ = NextChar;
55
    StringLen++;
56
    NextChar = uart_getc();
57
  }
58
 
59
                                  // Noch ein '\0' anhängen um einen Standard
60
                                  // C-String daraus zu machen
61
  *Buffer = '\0';
62
}
63
  
64
  // Passende Größe des Arrays wählen!
65
  // char Line[40];      // String mit maximal 39 zeichen 
66
  // uart_gets( Line, sizeof( Line ) );

von Ingo (Gast)


Lesenswert?

Dein Header fehlt...


Ingo

von Walter S. (avatar)


Lesenswert?

wie schaut der makefile aus?
Mir scheint du hast den Prozessor nicht definiert

von Sören T. (stimmy)


Lesenswert?

Der Header ist doch die erste datei ;)

Ich arbeite mit AVR Studio 5.0 .
Habe die Dateien in dem selben Projekt drin wie auch die eigentliche C 
Datei.
Wenn ich den selben Code in der C Datei lasse, funktioniert es. Wenn ich 
ihn aber so auslagere wie beschreiben, kommt es zu den Fehlern.

von applefarmer (Gast)


Lesenswert?

Um welchen uC gehts?

von Sören T. (stimmy)


Lesenswert?

Es geht um einen ATMEGA 8

von Marius W. (mw1987)


Lesenswert?

Tja, dann guck mal nach, was der Mega8 so für UART-Register hat und wie 
die heißen...

Gruß
Marius

von Sören T. (stimmy)


Lesenswert?

Okay sind fast alle Fehlermeldungen weg. Danke!!!

Die einzigen beiden die noch sind:
1
Error  1  'F_CPU' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  7  11  test uart
2
Error  2  each undeclared identifier is reported only once for each function it appears in  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  7  11  test uart
3
Error  3  'BAUD' undeclared (first use in this function)  C:\Users\Timm\Documents\AVRStudio\test uart\test uart\uart_timmy.c  7  11  test uart

Dabei hab ich doch in der Datei das stehen:
1
/*
2
 * test_uart.c
3
 *
4
 * Created: 07.12.2012 15:28:36
5
 *  Author: Timm
6
 */ 
7
8
#define F_CPU 16000000UL
9
#define BAUD 9600
10
11
#include <avr/io.h>
12
#include <util/delay.h>
13
#include "uart_timmy.h"
14
15
int main(void)
16
{
17
    uart_init();
18
  uart_putc(0xC);
19
  uart_puts("UART inistalisiert!\r \n");
20
  DDRD = 0b1111111;
21
  
22
  while(1)
23
    {         
24
      uart_puts("So ein Scheiss, dass es an einer null lag!\r\n");
25
    
26
    PORTD = (1<<PD6) | (1<<PD5); // LED auf Pollin-Board
27
    _delay_ms(500);
28
    PORTD = (0<<PD6) | (0<<PD5);
29
    _delay_ms(500);
30
    }
31
}


Korrigiert:
1
#include <avr/io.h>
2
#include "uart_timmy.h"
3
4
5
void uart_init(void)
6
{
7
  UBRRH = UBRR_VAL >> 8;
8
  UBRRL = UBRR_VAL & 0xFF;
9
 
10
  UCSRB |= (1<<TXEN);  // UART TX einschalten
11
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
12
}  
13
14
15
int uart_putc(unsigned char c)
16
{
17
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
18
    {
19
    }                             
20
 
21
    UDR = c;                      /* sende Zeichen */
22
    return 0;
23
}
24
 
25
 
26
/* puts ist unabhaengig vom Controllertyp */
27
void uart_puts (char *s)
28
{
29
    while (*s)
30
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
31
        uart_putc(*s);
32
        s++;
33
    }
34
}
35
36
char uart_getc(void)
37
{
38
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
39
        ;
40
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
41
}
42
43
void uart_gets( char* Buffer, uint8_t MaxLen )
44
{
45
  uint8_t NextChar;
46
  uint8_t StringLen = 0;
47
 
48
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
49
 
50
                                  // Sammle solange Zeichen, bis:
51
                                  // * entweder das String Ende Zeichen kam
52
                                  // * oder das aufnehmende Array voll ist
53
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
54
    *Buffer++ = NextChar;
55
    StringLen++;
56
    NextChar = uart_getc();
57
  }
58
 
59
                                  // Noch ein '\0' anhängen um einen Standard
60
                                  // C-String daraus zu machen
61
  *Buffer = '\0';
62
}
63
  
64
  // Passende Größe des Arrays wählen!
65
  // char Line[40];      // String mit maximal 39 zeichen 
66
  // uart_gets( Line, sizeof( Line ) );

von Karl H. (kbuchegg)


Lesenswert?

Sören Timm schrieb:

> Dabei hab ich doch in der Datei das stehen:

Die, in der main() steht, interessiert nicht.

Deine Fehlermeldungen beziehen sich auf uart_timmy.c


> Korrigiert:
>
1
> #include <avr/io.h>
2
> #include "uart_timmy.h"
3
> 
4
> 
5
> void uart_init(void)
6
> {
7
>   UBRRH = UBRR_VAL >> 8;
8
>   UBRRL = UBRR_VAL & 0xFF;
9
> 
10
>   UCSRB |= (1<<TXEN);  // UART TX einschalten
11
>   UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1
12
> }
13
> ....
14
> ....
15
>

So und jetzt gehst du diese Datei, und zwar nur diese C-Datei von oben 
nach unten durch und stellst dir die Frage.

Wo kommt da F_CPU her?
Wo kommt da BAUD her?

Wie gesagt: Was in main.c steht, interessiert nicht. Das hier ist die 
uart_timmy.c. Und uart_timmy.c wird für sich alleine kompiliert. Wenn 
sich der Compiler uart_timmy.c vornimmt, hat er alles vergessen, was er 
je aus main.c erfahren hat.
In C ist eine C-Datei eine abgeschlossene Einheit. Sie wird für sich 
selbst und ohne Ansehen anderer C-Dateien compiliert. Was du daher in 
anderen C-Dateie stehen hast, mag zwar für die dortige C-Datei super 
sein, ist aber für diese hier uninteressant.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sören Timm schrieb:
> Dabei hab ich doch in der Datei das stehen:

In welcher Datei steht das und für welche Datei wird der Fehler 
ausgegeben? Genau hinsehen.

Diese Definition gehört aus diesem Grund nicht in eine Quelltextdatei, 
sondern als Compileroption ins Makefile.

von Walter S. (avatar)


Lesenswert?

Sören Timm schrieb:
> #define F_CPU 16000000UL
> #define BAUD 9600

hast du das auch in deiner zweiten C Datei?d
Wenn nein dann ist das der Fehler,
wenn ja ist es Käse weil es sinnvollerweise nur an einer Stelle 
definiert wir

von Sören T. (stimmy)


Angehängte Dateien:

Lesenswert?

So es funktioniert!
Senden und empfangen!

Nur wie bekomme ich es jetzt hin, das die Baudrate und die Frequenz nur 
in der test_uart.c angegeben werden muss?

Das es sinnvoll ist ist mir klar.
Bei delay.h geht es ja auch irgendwie...

von Walter S. (avatar)


Lesenswert?

Sören Timm schrieb:
> Nur wie bekomme ich es jetzt hin, das die Baudrate und die Frequenz nur
> in der test_uart.c angegeben werden muss?

indem du sie im makefile definierst,
wenn du keinen hast dann in irgendwelchen Options

von Karl H. (kbuchegg)


Lesenswert?

Sören Timm schrieb:

> Nur wie bekomme ich es jetzt hin, das die Baudrate und die Frequenz nur
> in der test_uart.c angegeben werden muss?

Und wenn du noch mal scharf darüber nachdenkst, dann kommst du zu dem 
Schluss: gar nicht!

> Das es sinnvoll ist ist mir klar.
> Bei delay.h geht es ja auch irgendwie...

Nö.
Auch bei delay.h geht es nicht. Jede C-Datei, die delay.h inkludiert, 
muss für sich selbst wieder dafür sorgen, dass sie irgendwo eine 
Definition für F_CPU herkriegt.

Bei F_CPU ist es sinnvoll, die in die Projektoptionen mit aufzunehmen. 
Denn diese Einstellungen werden dem Compiler bei jegem COmpiliervorgang 
immer mitgegeben.

Es spricht aber auch nichts dagegen, dass man sich ein Header-File 
macht, in dem alle diese Konfigurationssachen gesammelt werden UND man 
die Forderung erhebt, dass jedes C-File genau dieses Header File 
inkludieren MUSS.

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.