AT90USB162 hat falsche Delay-Zeiten wenn Frequenz angegeben wird

Gast #3668022
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?
Gast #3668026
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.
Gast #3668045
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...
Gast #3668057
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
Gast #3668058
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.
Gast #3668062
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.
Gast #3668131
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!

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.