Forum: Compiler & IDEs Seltsamer Wert für "F_CPU"


von Matthias P. (matzee)


Lesenswert?

Hallo,

ich bin relativ neu in der Welt der Mikroprozessoren und habe ein etwas 
kurioses Problem, für das ich momentan keine Lösung gefunden habe und 
das ich mir auch nicht so recht erklären kann.

Folgendes: Ich bin momentan dabei, einige kleine Beispielprogramme für 
meinen ATmega16 zu programmieren. Hierbei greife ich auf die Funktion 
_delay_ms(); zurück, definiert in util/delay.h. Funktioniert soweit auch 
wunderbar. Allerdings "schläft" der Prozessor nicht so lange wie er 
eigentlich sollte, sondern viel länger. Gut, dachte ich mir, wird wohl 
mit der Taktung zusammen hängen.

Als nächstes habe ich die F_CPU-Werte im Makefile und im gesamten Code 
überprüft, sowohl im Makefile als auch im Code habe ich den Wert erneut 
auf 8MHz gesetzt (im Makefile ohne den Suffix "UL", im Code habe ich 
beides getestet). Immer noch das selbe Problem. Testweise habe ich nun 
die Frequenz um den Faktor 10 verkleinert, also auf 0,8MHz - und siehe 
da, nun scheint der Prozessor auch richtig zu zählen (zumindest kam es 
mir subjektiv so vor, ich habe die Zeit nicht exakt gestoppt). Das ganze 
finde ich trotz alledem sehr suspekt, denn der ATmega16 taktet mit 
Sicherheit nicht mit 800KHz. Für Lösungsvorschläge und Tipps wäre ich 
euch sehr dankbar - und habe hoffentlich im Forum kein Topic übersehen, 
dass meine Problematik bereits behandelt hat. Bei Bedarf kann ich auch 
noch gerne mein Makefile und die C-Dateien nachreichen, diese befinden 
sich aber momentan auf einem anderen Computer.

Grüße
matzee

von Alex (Gast)


Lesenswert?

Evtl. mal die Fuse-Bits kontrollieren.

von bloß ein gast... (Gast)


Lesenswert?

Hi!

Scheinbar arbeitet dein MC mit dem internen Quarz (1 MHz) anstatt mit 
deinem externen. Du musst das entsprechende Fusebit für den externen 
Quarz setzen.
Bist nicht der erste dem das passiert :-)
Gruß

von Michael U. (amiga)


Lesenswert?

Hallo,

Du hast nichts zum Takt Deines Mega16 geschrieben und wir können nicht 
hellsehen...

Ausgeliefert wird der Mega16 mit 1MHz intern RC-Oszillator.

PS:
@bloß ein gast...:
Es gibt keinen internen Quarz!
Nicht beim AVR!
Bei KEINEM!

SCNR

Gruß aus Berlin
Michael

von Matthias P. (matzee)


Lesenswert?

Hallo,

vielen Dank schon einmal für die zahlreichen Antworten. Das habe ich 
vergessen, aber du hast recht, 8MHz hätte ich erwartet, an den Fusebits 
ist bisher nichts geändert worden. Die Geschichte mit den Fusebits wird 
wohl des Rätsels Lösung sein, allerdings scheint mir das nicht ganz 
ungefährlich zu sein. Ich werde nochmal mein Datenblatt konsultieren und 
unter Umständen erstmal mit 1MHz arbeiten - reicht momentan eh völlig. 
Aber auf alle Fälle danke noch einmal :)

von Philipp B. (philipp_burch)


Lesenswert?

Hm, verwendest du vielleicht Variablen als Argumente für delay_ms()? Das 
funktioniert nicht wirklich gut, da dann die ganze floating-point-lib 
dazugelinkt und natürlich auch verwendet wird. Und ein paar floats 
berechnet ein AVR nicht mal so nebenbei...

von Michael U. (amiga)


Lesenswert?

Hallo,

naja, gefährlich sind die Fusebits nicht direkt, der AVR explodiert 
zumindest nicht. ;)
Womit programmierst Du?

Ansonsten hat man bei den Preisen eines AVR eigentlich immer einen 
Reserbe in der Schachtel, damit man erstmal weitermachen kann und in 
Ruhe über den falsch gefusten nachdenken kann...

Goldene Regel: wenn die Programmiersoftware es nicht automatish macht 
oder man dem Frieden nicht traut; als erstes immer die Fuses LESEN.
Wenn man noch neu dabei ist: die gelesenen Fuses genau anschauen daraus 
die Einstellungen zusammensuchen und dann mit dem Datenblatt 
vergleichen, ob man die Bedeutung wirklich so verstanden hat, wie sie 
gemeint ist.

Dann nur die ändern, an denen man ändern will.

Dann beten und Write Fuses. ;-)))

PS: ich habe noch keinen verfused, wenn es doch mal passiert: kann man 
alles wieder retten, wenn nicht sofort, dann später, wenn man mehr davon 
versteht, das Ding wird ka nicht schlecht vom Liegen.

Gruß aus Berlin
Michael

von Matthias P. (matzee)


Lesenswert?

Hallo Michael,

ich werde die Tage mein Glück versuchen, ich nutze ein selbstgebautes 
PonyProg-kompatibles Programmiergerät, das setzten ist, soweit ich weiß, 
mit diesem Programm relativ simpel. Danke nochmal für die wertvollen 
Tipps :)

von Ralf S. (spacedog) Benutzerseite


Lesenswert?

Der mega16 wird mit 1 MHz ausgeliefert. Das passt ja auch nicht so 
schlecht zu deinen 0,8 MHz. D. h. wenn du  1 MHz einstellst, passts 
genau. Du kannst aber auch die entsprechenden Fusebits setzen:

  * http://palmavr.sourceforge.net/cgi-bin/fc.cgi

Der interne RC-Oszillator arbeitet mit 8 MHz. Mittels Fusebits kann man 
das dann auf 8, 4, 2 oder 1 MHz teilen. Schneller gehts mit nem externen 
Oszillator oder Quarz.

PS: pass mir bloss auf mit den Fusebits ;-)

von micha (Gast)


Lesenswert?

Bei PonyProg daran denken, dass die Fuse-Bits "umgedreht" werden müssen! 
(welche Bedeutung hat ein gesetzter Hacken? An/Aus? :-)
Ansonsten hat sich bei Vielen (Mir eingeschlossen) ein kleiner separater 
Quartz-Oszillator sehr bewährt (--> 
http://www.mikrocontroller.net/articles/AVR_Fuses und besonders 
http://www.klaus-leidinger.de/mp/Mikrocontroller/meinetools.html#Preserver

von Michael U. (amiga)


Lesenswert?

Hallo,

naja, bei PonyProg eher daran denken, daß er es völlig korrekt macht. 
;-)

Fuse programmiert -> Fuse ist 0 !!!
Fuse unprogrammiert -> Fuse ist 1 !!!

Dazu siehe auch AVR-Datenblätter Anmerkungen.

Haken in Pony gesetzt -> Fuse programmiert -> 0

Liegt einfach daran, daß es EEPROM/Flash-Zellen sind und lassen sich nur 
auf 0 programmieren und sind gelöscht 1. Wie schon die alten EPROMs oder 
der AVR-Flash.

ext. Quarz mit >=8MHz am AVR -> CKSEL0...3 1111 -> dort alle Haken in 
Pony raus.

Unbedingt Fuses zuerst lesen (die aktuelle Version soll es wohl endlich 
automatisch machen).

Ist einfach nur ungewöhnlich, weil man gewohnheitsmäßig eher 1 - 
programmiert denkt...

Gruß aus Berlin
Michael

von Markus (Gast)


Lesenswert?

hallo,

also ich glaube pony ist zum fuse setzen für jemand unerfahrenes nicht 
so der tipp :-/ die foren sind voll mit hilferufen von leuten die sich 
ihre AVRs mit pony-fuses lahm gelegt haben... ich nehm jetzt immer das 
hier:

http://www.myavr.de/download.php?suchwort=ProgTool

gruß M.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Markus wrote:
> hallo,
>
> also ich glaube pony ist zum fuse setzen für jemand unerfahrenes nicht
> so der tipp

Dokumentation oder Datenblätter nicht zu lesen ist nicht ratsam, und 
darauf sind praktisch alle Probleme zurückzuführen nach dem Motto 
"einfach maln büssjen rumclicken was plausibel ist und gucken was 
passiert"

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.