Forum: Mikrocontroller und Digitale Elektronik F_CPU, wo steht die Definition


von Brocken Sei (Gast)


Lesenswert?

da ich bei folgender Zeile:
_delay_ms(10000);
nur 5 Sekunden Wartezeit feststelle, glaube ich dass der CPU Takt einen 
falschen Wert hat.
In welchem Headerfile finde ich die Definition?

Gruß Bro

von Karl H. (kbuchegg)


Lesenswert?

Brocken Sei schrieb:
> da ich bei folgender Zeile:
> _delay_ms(10000);
> nur 5 Sekunden Wartezeit feststelle, glaube ich dass der CPU Takt einen
> falschen Wert hat.
> In welchem Headerfile finde ich die Definition?

in gar keinem.
Die musst du schon selber machen.
Im AVR Studio macht man die sinnvollerweise gleich bei den 
Projekt-Optionen

von Brocken Sei (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> in gar keinem.
> Die musst du schon selber machen.
> Im AVR Studio macht man die sinnvollerweise gleich bei den
> Projekt-Optionen

Aha, ich dachte das ist schon definiert, weil ich in den lcd-routines
folgenden Codeblock als Grau markiert sehe

#ifndef F_CPU
#define F_CPU 8000000
#endif

Und wenn ich vor den Includes es neu definiere dann sagt er redefined. 
Kann es sein dass Eclipse diese irgendwie definiert aufgrund der 
eingestellten Hardware?

Gruß Bro

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Probiers doch mal mit einer Suche über alle (Projekt-)Dateien...
Oder sieh im Makefile nach, ob da im Compileaufruf was definiert wird...

von Simon K. (simon) Benutzerseite


Lesenswert?

Brocken Sei schrieb:
> #ifndef F_CPU
> #define F_CPU 8000000
> #endif

Macht AFAIK einfach keinen Sinn und ist nur fehleranfällig.

Besser ist:
1
#ifndef F_CPU
2
#warning "F_CPU not defined"
3
#endif

von Karl H. (kbuchegg)


Lesenswert?

Brocken Sei schrieb:

> Aha, ich dachte das ist schon definiert, weil ich in den lcd-routines
> folgenden Codeblock als Grau markiert sehe
>
> #ifndef F_CPU
> #define F_CPU 8000000
> #endif

Das findet mal leider an vielen anderen Stellen auch. delay.h hat auch 
so ein Default mit.

> Und wenn ich vor den Includes es neu definiere dann sagt er redefined.

er sagt dir sicher aber auch, wo der redefine stattfindet bzw. wo die 
ursprüngliche Definition war.

> Kann es sein dass Eclipse diese irgendwie definiert aufgrund der
> eingestellten Hardware?

aufgrund der Hardware sicherlich nicht. AVR können mit vielen 
verschiedenen Taktfrequenzen betrieben werden. Woher soll Eclipse das 
wissen?
Aber auch in Eclipse wird es wohl irgendwo einen Options Dialog geben, 
in dem man die Hardware Eigenschaften irgendwo einstellt.

von g457 (Gast)


Lesenswert?

noch besser:
1
#ifndef F_CPU
2
#error "F_CPU not defined"
3
#endif

Das schreckt dann auch die auf, die warnings gewohnheitsmäßig ignorieren 
:-)

von Brocken Sei (Gast)


Lesenswert?

Lothar Miller schrieb:
> Probiers doch mal mit einer Suche über alle (Projekt-)Dateien...

Habe ich, aber nur das eine das in lcd routines definiert war.

Lothar Miller schrieb:
> Oder sieh im Makefile nach, ob da im Compileaufruf was definiert wird...

Habe ich, auch nichts.

Simon K. schrieb:
> Macht AFAIK einfach keinen Sinn und ist nur fehleranfällig.
>
> Besser ist:
> #ifndef F_CPU
> #warning "F_CPU not defined"
> #endif

Habe ich so umgeändert, und scheibar ist es orgendwo definiert, denn 
kompilieren kann ich immer noch.
Ich habs wieder mit neu deklarieren versucht und er sagt wieder 
redefined.

Gruß Bro

von Brocken Sei (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> er sagt dir sicher aber auch, wo der redefine stattfindet bzw. wo die
> ursprüngliche Definition war.

Leider nicht. Er sagt nur das was ich definiert habe wurde bereits 
definiert.

g457 schrieb:
> Das schreckt dann auch die auf, die warnings gewohnheitsmäßig ignorieren
> :-)

Warnung gibt es keine.

Karl heinz Buchegger schrieb:
> Aber auch in Eclipse wird es wohl irgendwo einen Options Dialog geben,
> in dem man die Hardware Eigenschaften irgendwo einstellt.


Ja das meinte ich, weil ich habe in diesem Dialog meine Frequenz 
eingegeben.

Gruß Bro

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Brocken Sei schrieb:
> Ich habs wieder mit neu deklarieren versucht und er sagt wieder
> redefined.
Hast du meinen Post von vorhin schon gelesen?  :-/
Beitrag "Re: F_CPU, wo steht die Definition"

von Brocken Sei (Gast)


Lesenswert?

OK, der Takt stimmt doch, habe vergessen einen Timer vorher 
auszuschalten, sry.

Gruß Bro

von Brocken Sei (Gast)


Lesenswert?

Lothar Miller schrieb:
> Hast du meinen Post von vorhin schon gelesen?  :-/

Ja, habe ich und ich habs so umgeändert, wieso?

Gruß Bro

von Karl H. (kbuchegg)


Lesenswert?

Brocken Sei schrieb:

> Habe ich so umgeändert, und scheibar ist es orgendwo definiert

Das irgendwo wird wohl in <delay.h> sein

Entweder du gibts es
* bei irgendwelchen Projekt-Optionen Dialogen im Eclipse direkt an
* oder du baust ein F_CPU ins Makefile ein, so dass es bei allen
  Compiler Aufrufen mitgegeben wird
* oder du hängst es als allererstes #define in deinen Source Code rein
1
#define F_CPU  2000000
2
3
#include <avr/io.h>
4
#include <Hamstibamsti>
5
#include <was auch immer>
6
7
8
...
9
10
int main()
11
{
12
  ...
13
}

So dass dieses #define vorhanden ist, noch ehe das erste Include File 
inkludiert wird.

Du solltest das definieren von F_CPU in der Reihenfolge der 3 
Möglichkeiten sehen: Options Dialog ist am besten (wenn die IDE das 
Makefile erzeugt), Makefile ist zweite Wahl, direktes Einfügen will man 
vermeiden.

Bei der letzten Möglichkeit besteht sonst die Gefahr, dass 
unterschiedliche *.C Files unterschiedliche Vorstellungen darüber haben, 
wie groß F_CPU ist, weil ja jedes C-File sein eigenes #define hat.
Mit den anderen beiden Möglichkeiten kann das nicht passieren.

von Brocken Sei (Gast)


Lesenswert?

Lothar Miller schrieb:
> Hast du meinen Post von vorhin schon gelesen?  :-/

Ja habe ich und er  hat nichts gefunden, ich habe in meiner ganzen 
Workbench gesucht wo mein Projekt mit allen Datein drinn ist

Gruß Bro

von Brocken Sei (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> bei irgendwelchen Projekt-Optionen Dialogen im Eclipse direkt an

ok das erklärts, auch warum ich mochts gefunden habe, danke!

Gruß Bro

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Brocken Sei schrieb:
> Ja das meinte ich, weil ich habe in diesem Dialog meine Frequenz
> eingegeben.
Dann hast du in dem Projekt (also irgendwo im Makefile) die F_CPU 
definiert. Such mal in allen Dateien in dem Projektverzeichnis nach 
F_CPU, du wirst damit das Makefile finden...

von Brocken Sei (Gast)


Lesenswert?

Lothar Miller schrieb:
> Dann hast du in dem Projekt (also irgendwo im Makefile) die F_CPU
> definiert. Such mal in allen Dateien in dem Projektverzeichnis nach
> F_CPU, du wirst damit das Makefile finden...

Ich habe alle Datein durchsucht, aber ich habe damit nicht  das Make 
File gefunden.

Gruß Bro

von Thomas H. (innot)


Lesenswert?

Brocken Sei schrieb:
> Kann es sein dass Eclipse diese irgendwie definiert aufgrund der
> eingestellten Hardware?

Auch wenn hier anderes Behauptet wurde, ja, Eclipse definiert F_CPU 
selbst anhand der eingestellten Hardware, was man auch gut sieht wenn 
man sich den Output eines Build anschaut:
1
Building file: ../src/main.c
2
Invoking: AVR Compiler
3
avr-gcc -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=1000000UL -MMD -MP -MF"src/main.d" -MT"src/main.d" -c -o"src/main.o" "../src/main.c"
4
Finished building: ../src/main.c
5
...

Und weil Eclipse (manchmal :-)) schlau ist hat es den Block

#ifndef F_CPU
#define F_CPU 8000000
#endif

ausgegraut, da F_CPU ja schon definiert ist.

Thomas

von Gregor B. (gregor54321)


Lesenswert?

Kommentare in delay.h sagen:
The maximal possible delay is 262.14 ms / F_CPU in MHz.
The maximal possible delay is 768 us / F_CPU in MHz.

von Carsten (Gast)


Lesenswert?

Sie sagen aber auch, dass bei einem grösseren Delay (lediglich) die 
Auflösung auf 1/10 ms sinkt. Das Maximum ist dann 6,5xxx Sekunden.


Carsten

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.