Forum: Compiler & IDEs F_CPU keine Wirkung


von Frank S. (spanzo)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Bin Neuling was Atmega AVR-Studio und GCC betrifft.
Habe bisher an C51 Controllern in Assembler programmiert.
Nun habe ich mir aus den lcd-routinen des tutorials und dem code aus 
folgendem Beitrag ein Programm gemacht um die Frequenz messen.

"Beitrag "Input Capture Pin (ICP) auslesen ( Frequenz messen)";

Das Programm funktioniert soweit, bis auf ein Verständnisproblem.
Bei der Berechnung der Frequenz wird im Bsp.

  Erg = F_CPU / Erg;       // f = 1 / t
gerechnet. Ich muss aber mein Ergebnis zusätzlich
noch durch 8 teilen damit sie richtig ist. Hier habe ich nun bemerkt, 
dass es völlig egal ist, welchen Wert ich F_CPU zuweise.
  Erg = F_CPU  Erg  8;    // f = 1 / t  >> richtiges ergebnis



Bitte um Hilfe

von Karl H. (kbuchegg)


Lesenswert?

Wo stellst du den F_CPU ein?

* Im AVR Studio im Dialog 'Project Configuration'
* oder im Code direkt?


Wenn du im Project Configuration Dialog einen Eintrag für die 
Taktfrequenz hast, ist der F_CPU Wert im C Code nur noch Makulatur.

von Frank S. (spanzo)


Lesenswert?

sowohl als auch. Ich hab beides versucht, bzw. in der Configuration 
wieder rausgenommen.
Es wird ja wohl mehrmals im Code definiert.
Einmal in meiner .c datei und dann nochmal in der delay.h
macht das vielleicht Probleme?
Was mir auch noch unklar ist, Ich programmiere direkt aus dem 
AVR-Studio, wenn ich in das standard makefile schaue was beim anlegen 
des Projektes generiert wird, steht dort nirgens was von F_CPU.
Auch wenn ich ein neues makefile erzeue nicht.

von Karl H. (kbuchegg)


Lesenswert?

Frank S. schrieb:
> sowohl als auch.

Dann gilt das vom Dialog

> Es wird ja wohl mehrmals im Code definiert.
> Einmal in meiner .c datei

Nein wird es nicht.
Bzw. nur dann, wenn vom Dialog keine Vorgabe kam.

#ifndef F_CPU
... wenn es noch keine Definition für F_CPU gibt. ifndef ... if not 
defined

> und dann nochmal in der delay.h

Dort ist dasselbe Spielchen. delay.h macht nur ein 'Notprogram' wenn es 
noch kein #define für F_CPU gab

> AVR-Studio, wenn ich in das standard makefile schaue was beim anlegen
> des Projektes generiert wird, steht dort nirgens was von F_CPU.
> Auch wenn ich ein neues makefile erzeue nicht.


Schau dir den Build-Log an, der während des Build ausgegeben wird. Bei 
den Compileraufrufen müsste der F_CPU auftauchen

von Frank S. (spanzo)


Lesenswert?

Wurde nicht im Build-Log angezeigt.



Habe nun aber gesehen, dass "hart" in der der delay.h definert war.
Habe nun Win-avr deinstalliert und neu installiert, um die originale 
Datei wieder zu haben.
Nun kommt aber ein ganz neuer Fehler zutage.

Build started 15.5.2010 at 00:02:26
In file included from ../ATMEGA88_freq.c:30:
d:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h: In function 
'_delay_ms':
d:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:113: error: 
expected expression before '=' token
d:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:123: error: 
expected expression before '=' token
d:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h: In function 
'_delay_us':
d:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:151: error: 
expected expression before '=' token
../ATMEGA88_freq.c: In function 'main':
../ATMEGA88_freq.c:123: error: expected expression before '=' token
make: *** [ATMEGA88_freq.o] Error 1
Build failed with 4 errors and 0 warnings...


dieser Fehler geht weg, wenn ich die Fregeuenz in der Configuration 
eintrage, allerdings ist die Berechnung dann immer noch falsch.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Lass mich raten: du änderst F_CPU und erwartest, dass der Controller
danach mit der richtigen Frequenz arbeitet?

Das funktioniert nicht.  F_CPU ist nur ein Makro, der den Bibliotheks-
routinen rüberreicht, mit welcher Taktfrequenz deine CPU läuft.  Dass
sie mit dieser Frequenz läuft, darum musst du dich aber schon selbst
kümmern, dass kann der Compiler nicht für dich tun.

Dein Problem klingt so, als müsstest du die CKDIV8-Fuse noch abschalten.
Diese Fuse wiederum ist nur eine Vorbelegung für den clock prescaler,
den kannst du auch zur Laufzeit umschalten:
1
#include <avr/power.h>
2
3
...
4
   clock_prescale_set(clock_div_1);

von Frank S. (spanzo)


Lesenswert?

Ok, das mit der Fuse hat geklappt. :-)

Allerdings kann ich jetzt nur noch kompilieren, wenn ich die Frequenz im 
Project Configuration Dialog eintrage, da sonst die Fehlemeldungen 
kommen

von Rolf Magnus (Gast)


Lesenswert?

Frank S. schrieb:
> Allerdings kann ich jetzt nur noch kompilieren, wenn ich die Frequenz im
> Project Configuration Dialog eintrage, da sonst die Fehlemeldungen
> kommen

Die muß überall, wo delay.h inkludiert wird, gesetzt sein, und sie muß 
gesetzt werden, bevor es inkludiert wird.

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.