F_CPU keine Wirkung

OP #1711210
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
Angehängte Dateien:
OP #1711231
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.
#1711235
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
OP #1711249
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.
Moderator Persönliche Seite #1711258
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);
Gast #1711316
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.

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