www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bedinung für F_CPU


Autor: David B. (dave10)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe folgendes Problem:
#if F_CPU == 16000000
#define    TIMERWERT_1SEC    15625
#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

Autor: sebastians (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du F_CPU definiert? (Code!)

Autor: Benjamin Utz (utzus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

wenn ich folgendes schreibe, funktionierts ohne Fehler:
#define F_CPU 16000000

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


int main()
{  
  return TIMERWERT_1SEC;
}

ändere ich F_CPU gibts den von dir beschrieben Fehler:
#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

Autor: AVerr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist auch kein Wunder ... wenn F_CPU nicht 16000000 ist, wird 
TIMERWERT_1SEC nicht definiert.
#define F_CPU 16000000

#if F_CPU == 16000000
#define    TIMERWERT_1SEC    15625
#else
#define    TIMERWERT_1SEC    0 // irgendein default-wert
#endif

Autor: David B. (dave10)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: David B. (dave10)
Datum:

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

Autor: M. Z. (mafia-gamer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: David B. (dave10)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

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

Autor: David B. (dave10)
Datum:

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: David B. (dave10)
Datum:

Bewertung
0 lesenswert
nicht 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:
  #ifndef F_CPU
    #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 16000000"
    #define F_CPU 16000000UL    // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
  #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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: David B. (dave10)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie find ich das raus?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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
#ifndef F_CPU
#error F_CPU nicht definiert!
#endif

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

Autor: Ralf (Gast)
Datum:
Angehängte Dateien:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: David B. (dave10)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.