Forum: Compiler & IDEs 'UBRR0H' was not declared in this scope


von Michael K. (miccha)


Lesenswert?

Hallo Zusammen,

Ich bekomme die für mich unerkläriche Meldung vom Compiler:


  recipe for target 'Uart.o' failed
  'UBRR0H' was not declared in this scope
  'UBRR0L' was not declared in this scope
  'UCSR0B' was not declared in this scope
  'RXEN0' was not declared in this scope
  'TXEN0' was not declared in this scope
  'RXCIE0' was not declared in this scope
  'UCSR0C' was not declared in this scope
  'USBS0' was not declared in this scope
  'UCSZ00' was not declared in this scope


Ich nutze Atmel STudio 7.

Ich habe diese Uart Function in Uart.cpp

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

Im Hauptprogramm habe ich entsprechend Uart.h included:

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "Uart.h"

die Header Datei dazu schaut wie folgt aus:
#ifndef UART_H_
#define UART_H_

#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1

void USART_Init(unsigned int ubrr);


#endif /* UART_H_ */


Warum zu Hölle bringt mir Atmel STudio die Fehlermeldung?
Die Register sollten den Compiler doch beakannt sein, da ich ja avr/io.h 
ziemlich am Anfang include.

Habt ihr ne Idee? Was mach ich falsch?

von g457 (Gast)


Lesenswert?

> Warum [..] bringt mir Atmel STudio die Fehlermeldung?

Weil Du was falsch machst. Was setzt Du denn bei -mmcu?

von Michael K. (miccha)


Lesenswert?

-mmcu=atmega48pa -B 
"$(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega48pa"

von Michael K. (miccha)


Lesenswert?

g457 schrieb:
> Weil Du was falsch machst.

Richtig, deswegen bin ich hier und lasse mich gerne berichtigen. Die 
Frage nochmal: Was mache ich falsch?

von Andreas B. (bitverdreher)


Lesenswert?

Ist das wirklich die erste Fehlermeldung beim compilieren?
Schau auch mal in die iom88pa.h rein. Evtl. ist diese Datei korrupt.

: Bearbeitet durch User
von Michael K. (miccha)


Lesenswert?

Andreas B. schrieb:
> Ist das wirklich die erste Fehlermeldung beim compilieren?

Ja und die einzige...

von Andreas B. (bitverdreher)


Lesenswert?

und auch mal in die io.h reingucken, ob da auch wirklich die iom88pa.h 
includiert wird.

von Michael K. (miccha)


Lesenswert?

Andreas B. schrieb:
> Ist das wirklich die erste Fehlermeldung beim compilieren?
> Schau auch mal in die iom88pa.h rein. Evtl. ist diese Datei korrupt.

Du meinst wohl eher in die iom48pa.h. Das hatte ich schon gemacht. 
Interessanterweise wenn ich die Zuweisung
UBRR0H = (unsigned char)(ubrr>>8);
direkt in Main.ccp lege, dann akzeptiert das der Compiler...

: Bearbeitet durch User
von pegel (Gast)


Lesenswert?

Warum für die paar Zeilen Uart.cpp?

Wie heisst die main mit Nachnamen?

Kann es sein, dass es das beliebte
extern "C"
Problem ist?

Michael K. schrieb:
> Main.ccp

???

von Michael K. (miccha)


Lesenswert?

pegel schrieb:
> Warum für die paar Zeilen Uart.cpp?
Da kommt natürlich noch mehr rein, sollte ein struktiertes Programm 
werden...
>
> Wie heisst die main mit Nachnamen?

main.cpp

>
> Kann es sein, dass es das beliebte
> extern "C"
> Problem ist?
Was ist das beliebte extern "C" Problem...?
>
> Michael K. schrieb:

>> Main.ccp
>
> ???
Sorry, hab mich vertippt sollte main.cpp heißen..

: Bearbeitet durch User
von Andreas B. (bitverdreher)


Lesenswert?

Wenn Du einen C Header in eine C++ einbindest, mußt Du extern "C" 
verwenden.

von Michael K. (miccha)


Lesenswert?

Hab ich probiert, bekomme die gleiche Meldung. Ich habe auch mal die 
*.cpp alle als *.c unbenannt. Keine Besserung. Warum erkennt der 
Compiler die Standard Register nicht...

von Andreas B. (bitverdreher)


Lesenswert?

Hast Du denn mit dieser Umgebung mal etwas anderes erfolgreich 
kompilieren können?
Gleicher oder anderer uC?

von JensMa (Gast)


Lesenswert?

In Uart.cpp muss natürlich auch acr/in.h inkludiert werden.

von Andreas B. (bitverdreher)


Lesenswert?

JensMa schrieb:
> In Uart.cpp muss natürlich auch acr/in.h inkludiert werden.
+1
Wichtiger Hinweis. ;-) (von den typos mal abgesehen, also avr/io.h)

: Bearbeitet durch User
von pegel (Gast)


Lesenswert?

#ifdef __cplusplus
extern "C" {
#endif

// gesamter Inhalt der main.cpp

#ifdef __cplusplus
}
#endif

Übrigens kann man die komplette main.cpp in extern "C" setzen,
dann gilt das für alle benutzten .c Dateien im Projekt.

von Oliver S. (oliverso)


Lesenswert?

Michael K. schrieb:
> Ich habe diese Uart Function in Uart.cpp

Das sieht nach fehlendem
1
 #include <avr/io.h>
in Uart.cpp aus.

Oliver

von Michael K. (miccha)


Lesenswert?

Oliver S. schrieb:
> Michael K. schrieb:
>> Ich habe diese Uart Function in Uart.cpp
>
> Das sieht nach fehlendem
>
1
 #include <avr/io.h>
> in Uart.cpp aus.
>
> Oliver

Oliver, da hast du recht... Jetzt gehts...
Vielen Dank für eure Hilfe!

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.