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