Forum: Mikrocontroller und Digitale Elektronik AT90USB162 hat falsche Delay-Zeiten wenn Frequenz angegeben wird


von Daniel (Gast)


Lesenswert?

Ich betreibe meinen AT90USB162 mit einem 8MHz Quarz.
Kann mir jemand erklären, weshalb der Code

 while(1)
 {
   PORTB_INV(0);   // blinke PB.0
   _delay_ms(500);
 }

im Sekundentakt blinkt (wie erwartet), wenn ich F_CPU nicht definiere, 
aber wenn ich

 #ifndef F_CPU
 #define F_CPU 8000000UL     /* Quarz mit 8.0000 Mhz */
 #endif

verwende, blinkt er im 8-Sekundentakt. Wäre umgekehrt nicht logischer?

von Peter II (Gast)


Lesenswert?

Daniel schrieb:
> wenn ich F_CPU nicht definiere,

dann müsstest du eine Fehlermeldung bekommen. Sicher das es nicht 
woanders noch definiert ist?

von g457 (Gast)


Lesenswert?

> wenn ich F_CPU nicht definiere

Das führt zu einer Warnung die Du lesen solltest [0]

> Wäre umgekehrt nicht logischer?

Nein. Dein F_CPU stimmt nicht mit der vermuteten Realität überein -> 
nochmals die Fuses prüfen.

[0] Entgegen landläufiger Meinung sind Warnungen nicht dazu da, um 
ignoriert zu werden.

von Daniel (Gast)


Lesenswert?

Die Warnung ist mir schon bewusst, da es aber nur ohne F_CPU definieren 
korrekt läuft, benutze ich das momentan halt so. Aber weshalb es so ist, 
wäre schon mal interessant ...

Mit Fuses habe ich mich noch nicht befasst, da kenne ich mich noch nicht 
aus.

Bedeutet das nun, dass die angelegte Frequenz nicht der tatsächliche 
Systemtakt ist? So grob über den Daumen gerechnet hiesse das dann, dass 
intern nur ein Takt von 1MHz benutzt wird...

von spess53 (Gast)


Lesenswert?

Hi

>Bedeutet das nun, dass die angelegte Frequenz nicht der tatsächliche
>Systemtakt ist? So grob über den Daumen gerechnet hiesse das dann, dass
>intern nur ein Takt von 1MHz benutzt wird...

Wahrscheinlich. Ist der Auslieferungszustand der meisten AVRs.

Du solltest mal anfangen das Datenblatt zu lesen.

MfG Spess

von Fuse (Gast)


Lesenswert?

mit F_CPU veränderst du nicht, wie schnell die CPU läuft.

du teilst dem Compiler dadurch nur mit, welcher CPU-Takt durch deine 
Hardware, Fuses, Quarz usw. vorgegeben wird.

Per default, solange man nix verstellt sind das ~1MHz aus dem internen 
Oszillator.

also:
#define F_CPU 1000000ul /* Kein Quarz */

einsetzen.

von Fuse (Gast)


Lesenswert?

Daniel schrieb:
> #ifndef F_CPU


Oh, und lass dieses #ifndef  Weg.

Wenn du F-CPU zweimal (ggfs. sogar noch abweichend) definierst ist das 
ein Fehler. Es ist GUT, wenn der Compiler Fehler für dich findet, 
weil du sie dann nicht mehr selber suchen musst.
mit dem #ifndef außenherum kann der Compiler den Fehler nicht mehr 
finden, du stellst dir damit also selber ein Bein.

von Daniel (Gast)


Lesenswert?

Fuse schrieb:
> mit F_CPU veränderst du nicht, wie schnell die CPU läuft.
>
> du teilst dem Compiler dadurch nur mit, welcher CPU-Takt durch deine
> Hardware, Fuses, Quarz usw. vorgegeben wird.

Das war mir soweit bereits klar. Ich wusste nur folgendes nicht:

Fuse schrieb:
> Per default, solange man nix verstellt sind das ~1MHz aus dem internen
> Oszillator.

Danke für den Hinweis!

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.