Forum: Mikrocontroller und Digitale Elektronik AtmelStudio 7 und #define F_CPU


von Harry (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
nach vielen Jahren µC Programmierung (8085, Z80, 8051 ...) habe ich mich 
jetzt entschlossen ATmega128 mit AtmelStudio 7 zu testen.

Dabei bin ich auf folgendes Problem gestoßen:

Wenn ich im Hauptprogramm mit #define F_CPU in der ersten Programm-Zeile 
die XTAL-Frequenz festlege, erhalte ich beim Compilieren einen Fehler 
(F_CPU nicht definiert) [BILD_1].

Wenn ich die XTAL-Frequenz in der 'Toolchain - AVR/GNU C Compiler - 
Symbols' festlege [BILD_2a] läuft der Compiler ohne Fehlermeldung durch 
[BILD_2b].

Kann man #define F_CPU im main-Programm nicht verwenden?

Danke ...

von Frickelfritze (Gast)


Lesenswert?

Harry schrieb:
> erhalte ich beim Compilieren einen Fehler
> (F_CPU nicht definiert) [BILD_1].

Die inkludierten Header Files brauchen auch das Define F_CPU.

Daher solltest du F_CPU in den Projekt-Defines definieren.

von Christian S. (christian_s593)


Lesenswert?

Ich hab zwar keine direkte Lösung dafür, aber kenne das Problem. Wenn 
inc_UART0.c kompiliert wird, ist F_CPU dem Compiler nicht bekannt.
Ich habe eigentlich immer ein "define.h" Datei, worin F_CPU etc. 
definiert sind, die dann in den jeweiligen *.c Dateien eingebunden wird.

Warum F_CPU nicht im Scope ist, wenn es direkt zu Beginn in main 
definiert wird, kann bestimmt jemand erklären, der sich besser mit dem 
Linker auskennt.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Eigentlich sollte es in einer Header-Datei nicht nötig sein, F_CPU zu 
definieren, wenn es bereits im C-File definiert wurde. #include bindet 
ja lediglich die Header-Datei an diese Stelle ein und das C-File wird 
dann im kompletten übersetzt.

Sollte der Compiler aber auf die Idee kommen, eine Header-Datei zu 
übersetzen, könnte es zu diesem Fehler kommen.

von Harry (Gast)


Lesenswert?

Christian S. schrieb:
> Ich habe eigentlich immer ein "define.h" Datei, worin F_CPU etc.
> definiert sind, die dann in den jeweiligen *.c Dateien eingebunden wird.

Danke, an so eine Lösung habe ich auch schon gedacht aber im Moment 
sträube ich mich noch etwas dagegen.

Mal sehen ...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frickelfritze schrieb:
> Die inkludierten Header Files brauchen auch das Define F_CPU.

Nö, das brauchen sie nicht, wenn es vor dem #include schon definiert 
ist.

Das Problem liegt woanders.

Einen Hinweis gibt möglicherweise die IDE, die aus irgendwelchen Gründen 
im ersten Bild F_CPU kursiv ausgibt, aber nicht das "#define" davor 
und auch nicht den Wert dahinter.

In der nächsten Zeile, in der BAUD_UART0 definiert wird, ist aber trotz 
gleichem Aufbaus nichts kursiv geschrieben.


Am Rande bemerkt:

Unter "MyIncludes" rechts im Projektbaum taucht eine *.c-Datei auf. Das 
ist ein Fehler; *.c-Dateien werden nicht per #include ins Programm 
eingebunden, und sie haben in einer Projektverwaltung auch nichts dort 
verloren, wo Include-Dateien (bzw. Headerdateien) aufgelistet werden.

von guest (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Nö, das brauchen sie nicht, wenn es vor dem #include schon definiert
> ist.

Ist es aber nur beim Übersetzen der main.c nicht aber beim Übersetzen 
der inc_UART0.c

Rufus Τ. F. schrieb:
> Einen Hinweis gibt möglicherweise die IDE, die aus irgendwelchen Gründen
> im ersten Bild F_CPU kursiv ausgibt, aber nicht das "#define" davor
> und auch nicht den Wert dahinter.

Das liegt wohl eher daran, daß dem zur Syntaxhervorhebung verwendeten 
Plugin dieses Makro bekannt ist.

Rufus Τ. F. schrieb:
> Das
> ist ein Fehler; *.c-Dateien werden nicht per #include ins Programm
> eingebunden, ...

Tut er ja auch nicht, auch wenn der Name mit 'inc_' anfängt. Die erste 
Zeile der Fehlerliste zeigt, daß das Ding einzeln compiliert wird. Und 
da F_CPU weder in dieser Datei noch den von ihr includierten Header noch 
global in den Projekteinstellungen definiert ist schmeißt der Comiler 
halt entsprechende Fehlermeldungen.
Ansonsten hast Du natürlich Recht, der Name (mit dem inc_ am Anfag) und 
das Verzeichnis ('MyIncludes') ist einfach nur daneben.

von Harry (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Das Problem liegt woanders.
>
> Einen Hinweis gibt möglicherweise die IDE, die aus irgendwelchen Gründen
> im ersten Bild F_CPU kursiv ausgibt, aber nicht das "#define" davor
> und auch nicht den Wert dahinter.
>
> In der nächsten Zeile, in der BAUD_UART0 definiert wird, ist aber trotz
> gleichem Aufbaus nichts kursiv geschrieben.

Das F_CPU kursiv und andere nicht ist mir auch schon aufgefallen. Ich 
habe aber bisher keine Erklärung dafür gefunden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

guest schrieb:
> Tut er ja auch nicht, auch wenn der Name mit 'inc_' anfängt. Die erste
> Zeile der Fehlerliste zeigt, daß das Ding einzeln compiliert wird.

Das ist gut versteckt, aber von Dir gut entdeckt.

Beitrag #5308500 wurde von einem Moderator gelöscht.
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.