www.mikrocontroller.net

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


Autor: Brocken Sei (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Brocken Sei (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brocken Sei schrieb:
> #ifndef F_CPU
> #define F_CPU 8000000
> #endif

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

Besser ist:
#ifndef F_CPU
#warning "F_CPU not defined"
#endif

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch besser:
#ifndef F_CPU
#error "F_CPU not defined"
#endif

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

Autor: Brocken Sei (Gast)
Datum:

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

Autor: Brocken Sei (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, der Takt stimmt doch, habe vergessen einen Timer vorher 
auszuschalten, sry.

Gruß Bro

Autor: Brocken Sei (Gast)
Datum:

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

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

Gruß Bro

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
#define F_CPU  2000000

#include <avr/io.h>
#include <Hamstibamsti>
#include <was auch immer>


...

int main()
{
  ...
}

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.

Autor: Brocken Sei (Gast)
Datum:

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

Autor: Brocken Sei (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Brocken Sei (Gast)
Datum:

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

Autor: Thomas Holland (innot)
Datum:

Bewertung
0 lesenswert
nicht 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:
Building file: ../src/main.c
Invoking: AVR Compiler
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"
Finished building: ../src/main.c
...

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

Autor: Gregor B. (gregor54321)
Datum:

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

Autor: Carsten (Gast)
Datum:

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

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.