Forum: Mikrocontroller und Digitale Elektronik Bedinung für F_CPU


von David B. (dave10)


Lesenswert?

Hallo,
ich habe folgendes Problem:
1
#if F_CPU == 16000000
2
#define    TIMERWERT_1SEC    15625
3
#endif
Dabei kommt jedoch immer eine Fehlermeldung:
error: 'TIMERWERT_1SEC' undeclared (first use in this function)
obwohl ich die F_CPU weiter oben definiert habe. Wie muss ich dies 
schreiben?
Vielen Dank für eure Antworten

Grüße
David

von sebastians (Gast)


Lesenswert?

Wie hast du F_CPU definiert? (Code!)

von Benjamin U. (utzus)


Lesenswert?

Hi,

wenn ich folgendes schreibe, funktionierts ohne Fehler:
1
#define F_CPU 16000000
2
3
#if F_CPU == 16000000
4
#define    TIMERWERT_1SEC    15625
5
#endif
6
7
8
int main()
9
{  
10
  return TIMERWERT_1SEC;
11
}

ändere ich F_CPU gibts den von dir beschrieben Fehler:
1
#define F_CPU 14000000

Fehler:
../test.c:11: error: 'TIMERWERT_1SEC' undeclared (first use in this 
function)

Muss was mit dem F_CPU zu tun haben.

Grüße,
Benni

von AVerr (Gast)


Lesenswert?

Das ist auch kein Wunder ... wenn F_CPU nicht 16000000 ist, wird 
TIMERWERT_1SEC nicht definiert.
1
#define F_CPU 16000000
2
3
#if F_CPU == 16000000
4
#define    TIMERWERT_1SEC    15625
5
#else
6
#define    TIMERWERT_1SEC    0 // irgendein default-wert
7
#endif

von David B. (dave10)


Lesenswert?

Ich habs so definiert:
1
#ifndef F_CPU
2
      #warning "Die F_CPU war nicht def"
3
      #define F_CPU 8000000L
4
  #endif //SYSCLK
Aber so wie ihrs beschrieben hat funtzt. Nur warum gehts bei mir nicht 
mit #ifndef?
Grüße David

von David B. (dave10)


Lesenswert?

Danke,
ihr habt Recht. Das Prob sitzt eher davor.
Grüße
David

von M. Z. (mafia-gamer)


Lesenswert?

ist F_CPU nicht als 16000000UL definiert?

solltest vielleicht mal die folgende Zeile versuchen:

#if F_CPU == 16000000UL
#define    TIMERWERT_1SEC    15625
#endif


Da das ganze ja anscheinend dazu dienen soll einen 1s Takt zu generieren 
sollte man den Timerwert vielleicht aus dem F_CPU Wert berechnen.

z.B.

#define TIMERWERT_1SEC (F_CPU / 1024)

würde ich mal vermuten.

Grüße

von Ralf (Gast)


Lesenswert?

David B. schrieb:
> Ich habs so definiert:#ifndef F_CPU
>       #warning "Die F_CPU war nicht def"
>       #define F_CPU 8000000L
>   #endif //SYSCLK
> Aber so wie ihrs beschrieben hat funtzt. Nur warum gehts bei mir nicht
> mit #ifndef?
> Grüße David

> #if F_CPU == 16000000

Wenn du F_CPU mit 8000000 definierst und du auf 16000000 abfragst kann 
das nicht gehen.

von David B. (dave10)


Lesenswert?

Ich hab das mal probiert, aber anscheinend macht der Kompilier nicht die 
Berechnung. Ich habe diese Berechnung in ein Prog mit eingefügt und der 
Mic war viel langsamer, was ich dann daruf geschlossen hab, dass der 
Kompilier die Berechnung dem Atmega überlässt und nicht schon den 
fertigen Wert rübergibt.
Ich hab das ganze für 16 bzw. 8 Mhz gemacht, bin beim zitieren in die 
falsche Zeile gerutscht.
Ich brauch das ganze auch, weil ich vom Timer dann andere Einstellungen 
tätigen muss, steht nur noch nicht.
Grüße David

von Ralf (Gast)


Lesenswert?

Erzeugt der Compiler die Warnung "Die F_CPU war nicht def"?

von David B. (dave10)


Lesenswert?

jap,
in der main hab ich die F_CPU als ersten Code eingefügt:
1
#define F_CPU 8000000UL
Grüße David

von Ralf (Gast)


Lesenswert?

David B. schrieb:
> jap,
> in der main hab ich die F_CPU als ersten Code eingefügt:#define F_CPU 8000000UL
> Grüße David

Jetzt kann ich dir nicht mehr ganz folgen, warum hast du das define in 
der main gemacht?
Am besten du postest mal alle relevanten Sourcen (*.c und *.h) in denen 
du F_CPU definierst!

von David B. (dave10)


Lesenswert?

Ich habs in der main immer definiert.
Dann hab ich gewisse Unterprogrammen, wie z.B. Usart und hier dcf. In 
diesen Unterprogrammen hab ich dann nur zur Sicherheit stehen:
1
  #ifndef F_CPU
2
    #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 16000000"
3
    #define F_CPU 16000000UL    // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
4
  #endif
Deshalb auch die Warnung, damit ich weis das irgendwas nicht richtig 
geht. Aber da die Meldung bei jedem kommt hab ich die bisher immer 
ignoririert.
Grüße
David

von Ralf (Gast)


Lesenswert?

Wird denn deine Datei in der du die main-Funktion hast, zuerst 
kompiliert?

Dein "#define F_CPU 8000000UL" muss sehr früh kompiliert werden, damit 
das funktioniert!

von David B. (dave10)


Lesenswert?

Wie find ich das raus?

von Klaus W. (mfgkw)


Lesenswert?

F_CPU direkt in einem Quelltext zu definieren ist nicht
sehr sinnvoll.
Am besten überall rauswerfen und beim Kompilieren angeben als
Compileroption.
Höchstens darf in den Quelltexten noch stehen
1
#ifndef F_CPU
2
#error F_CPU nicht definiert!
3
#endif

Grund: man läuft sonst Gefahr, in verschiedenen Dateien
unterschiedliche Definitionen zu haben.
Solche Fehler kann man lange suchen...

von Ralf (Gast)


Angehängte Dateien:

Lesenswert?

Schau dir als Beispiel meine Kompilermeldungen an! Hier findest du meine 
main.c ganz oben!

von Klaus W. (mfgkw)


Lesenswert?

Ralf schrieb:
> Wird denn deine Datei in der du die main-Funktion hast, zuerst
> kompiliert?
>
> Dein "#define F_CPU 8000000UL" muss sehr früh kompiliert werden, damit
> das funktioniert!

Meinst du, ein #define in einem Quelltext würde sich auf die nachfolgend 
kompilierten auswirken?
Das ist sicher nicht der Fall!

von David B. (dave10)


Lesenswert?

Danke für eure Tips.
Hab meine F_CPU jetzt als Compilieroption gemacht und auch nur mit 
#ifndef.
Bei mir compilierts die auch als erstes, jetzt bringt er auch keine 
Warnings mehr.
Danke
David

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.