Bedinung für F_CPU

OP #1895094
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
#1895111
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
Gast #1895117
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
#1895131
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
Gast #1895141
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.
OP #1895149
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
Gast #1895172
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!
OP #1895184
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
#1895203
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren